From 8e4890790568d330fccfea4ed3aae2da472ebb8c Mon Sep 17 00:00:00 2001 From: Ann Pokora Date: Tue, 20 Apr 2021 15:58:31 -0700 Subject: [PATCH] updates for MPLS --- cfgmgr/intfmgr.cpp | 14 ++++++++++++++ cfgmgr/intfmgr.h | 1 + orchagent/nexthopkey.h | 31 ++++++++++++++++++++++++------- orchagent/routeorch.cpp | 6 +++--- 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/cfgmgr/intfmgr.cpp b/cfgmgr/intfmgr.cpp index 01528d91ba0..bffcd3fc92d 100644 --- a/cfgmgr/intfmgr.cpp +++ b/cfgmgr/intfmgr.cpp @@ -114,6 +114,19 @@ void IntfMgr::setIntfVrf(const string &alias, const string &vrfName) } } +void IntfMgr::setIntfMpls(const string &alias, bool enable) +{ + stringstream cmd; + string res; + + cmd << "sysctl -w net.mpls.conf." << alias << ".input=" << (enable ? "1":"0"); + int ret = swss::exec(cmd.str(), res); + if (ret) + { + SWSS_LOG_ERROR("Command '%s' failed with rc %d", cmd.str().c_str(), ret); + } +} + void IntfMgr::addLoopbackIntf(const string &alias) { stringstream cmd; @@ -524,6 +537,7 @@ bool IntfMgr::doIntfGeneralTask(const vector& keys, data.push_back(fvTuple); } /* Set mpls */ + setIntfMpls(alias, (mpls == "enable")); if (!mpls.empty()) { FieldValueTuple fvTuple("mpls", mpls); diff --git a/cfgmgr/intfmgr.h b/cfgmgr/intfmgr.h index e72a10be969..2d645a7b078 100644 --- a/cfgmgr/intfmgr.h +++ b/cfgmgr/intfmgr.h @@ -27,6 +27,7 @@ class IntfMgr : public Orch std::set m_pendingReplayIntfList; void setIntfIp(const std::string &alias, const std::string &opCmd, const IpPrefix &ipPrefix); + void setIntfMpls(const std::string &alias, bool enable); void setIntfVrf(const std::string &alias, const std::string &vrfName); void setIntfMac(const std::string &alias, const std::string &macAddr); diff --git a/orchagent/nexthopkey.h b/orchagent/nexthopkey.h index 1600161ebe3..2178556abd6 100644 --- a/orchagent/nexthopkey.h +++ b/orchagent/nexthopkey.h @@ -5,6 +5,7 @@ #include "tokenize.h" #include "label.h" +#define LABELSTACK_DELIMITER '+' #define NH_DELIMITER '@' #define NHG_DELIMITER ',' #define VRF_PREFIX "Vrf" @@ -19,7 +20,21 @@ struct NextHopKey LabelStack label_stack; // MPLS label stack NextHopKey() = default; - NextHopKey(const std::string &ipstr, const std::string &alias) : ip_address(ipstr), alias(alias), vni(0), mac_address() {} + NextHopKey(const std::string &str, const std::string &alias) : alias(alias), vni(0), mac_address() + { + std::size_t label_delimiter = str.find(LABELSTACK_DELIMITER); + std::string ip_str; + if (label_delimiter != std::string::npos) + { + label_stack = LabelStack(str.substr(0, label_delimiter)); + ip_str = str.substr(label_delimiter+1); + } + else + { + ip_str = str; + } + ip_address = ip_str; + } NextHopKey(const IpAddress &ip, const std::string &alias) : ip_address(ip), alias(alias), vni(0), mac_address() {} NextHopKey(const std::string &str) { @@ -28,7 +43,7 @@ struct NextHopKey std::string err = "Error converting " + str + " to NextHop"; throw std::invalid_argument(err); } - std::size_t label_delimiter = str.find(LABEL_DELIMITER); + std::size_t label_delimiter = str.find(LABELSTACK_DELIMITER); std::string ip_str; if (label_delimiter != std::string::npos) { @@ -69,7 +84,7 @@ struct NextHopKey std::string err = "Error converting " + str + " to NextHop"; throw std::invalid_argument(err); } - std::size_t label_delimiter = str.find(LABEL_DELIMITER); + std::size_t label_delimiter = str.find(LABELSTACK_DELIMITER); std::string ip_str; if (label_delimiter != std::string::npos) { @@ -98,7 +113,7 @@ struct NextHopKey if (!label_stack.empty()) { str += label_stack.to_string(); - str += LABEL_DELIMITER; + str += LABELSTACK_DELIMITER; } str += ip_address.to_string() + NH_DELIMITER + alias; return str; @@ -110,7 +125,7 @@ struct NextHopKey if (!label_stack.empty()) { str += label_stack.to_string(); - str += LABEL_DELIMITER; + str += LABELSTACK_DELIMITER; } str += (ip_address.to_string() + NH_DELIMITER + alias + NH_DELIMITER + std::to_string(vni) + NH_DELIMITER + mac_address.to_string()); @@ -119,12 +134,14 @@ struct NextHopKey bool operator<(const NextHopKey &o) const { - return tie(ip_address, alias, vni, mac_address) < tie(o.ip_address, o.alias, o.vni, o.mac_address); + return tie(label_stack, ip_address, alias, vni, mac_address) < + tie(o.label_stack, o.ip_address, o.alias, o.vni, o.mac_address); } bool operator==(const NextHopKey &o) const { - return (ip_address == o.ip_address) && (alias == o.alias) && (vni == o.vni) && (mac_address == o.mac_address); + return (label_stack == o.label_stack) && (ip_address == o.ip_address) && + (alias == o.alias) && (vni == o.vni) && (mac_address == o.mac_address); } bool operator!=(const NextHopKey &o) const diff --git a/orchagent/routeorch.cpp b/orchagent/routeorch.cpp index 387e827503f..2742adee496 100644 --- a/orchagent/routeorch.cpp +++ b/orchagent/routeorch.cpp @@ -644,7 +644,7 @@ void RouteOrch::doPrefixTask(Consumer& consumer) nhg = NextHopGroupKey(nhg_str, overlay_nh); } - if (ipv.size() == 1 && IpAddress(ipv[0]).isZero()) + if (ipv.size() == 1 && NextHopKey(ipv[0]).ip_address.isZero()) { /* blackhole to be done */ if (alsv[0] == "unknown") @@ -763,7 +763,7 @@ void RouteOrch::doPrefixTask(Consumer& consumer) const NextHopGroupKey& nhg = ctx.nhg; - if (ipv.size() == 1 && IpAddress(ipv[0]).isZero()) + if (ipv.size() == 1 && NextHopKey(ipv[0]).ip_address.isZero()) { if (addRoutePost(ctx, nhg)) it_prev = consumer.m_toSync.erase(it_prev); @@ -2415,7 +2415,7 @@ void RouteOrch::doLabelTask(Consumer& consumer) const NextHopGroupKey& nhg = ctx.nhg; - if (ipv.size() == 1 && IpAddress(ipv[0]).isZero()) + if (ipv.size() == 1 && NextHopKey(ipv[0]).ip_address.isZero()) { if (addLabelRoutePost(ctx, nhg)) it_prev = consumer.m_toSync.erase(it_prev);