Skip to content

Commit 16d5798

Browse files
Support for in-band-mgmt via management VRF (sonic-net#1726)
* Support for in-band-mgmt via management VRF. Signed-off-by: Venkatesan Mahalingam <venkatesan_mahalinga@dell.com>
1 parent d2492c8 commit 16d5798

10 files changed

Lines changed: 281 additions & 6 deletions

File tree

cfgmgr/intfmgr.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ using namespace swss;
1919
#define VNET_PREFIX "Vnet"
2020
#define MTU_INHERITANCE "0"
2121
#define VRF_PREFIX "Vrf"
22+
#define VRF_MGMT "mgmt"
2223

2324
#define LOOPBACK_DEFAULT_MTU_STR "65536"
2425

@@ -399,7 +400,8 @@ bool IntfMgr::isIntfStateOk(const string &alias)
399400
return true;
400401
}
401402
}
402-
else if (!alias.compare(0, strlen(VRF_PREFIX), VRF_PREFIX))
403+
else if ((!alias.compare(0, strlen(VRF_PREFIX), VRF_PREFIX)) ||
404+
(alias == VRF_MGMT))
403405
{
404406
if (m_stateVrfTable.get(alias, temp))
405407
{

cfgmgr/vrfmgr.cpp

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
#define VRF_TABLE_START 1001
1313
#define VRF_TABLE_END 2000
1414
#define TABLE_LOCAL_PREF 1001 // after l3mdev-table
15+
#define MGMT_VRF_TABLE_ID 5000
16+
#define MGMT_VRF "mgmt"
1517

1618
using namespace swss;
1719

@@ -143,6 +145,13 @@ bool VrfMgr::delLink(const string& vrfName)
143145
return false;
144146
}
145147

148+
if (vrfName == MGMT_VRF)
149+
{
150+
recycleTable(m_vrfTableMap[vrfName]);
151+
m_vrfTableMap.erase(vrfName);
152+
return true;
153+
}
154+
146155
cmd << IP_CMD << " link del " << shellquote(vrfName);
147156
EXEC_WITH_ERROR_THROW(cmd.str(), res);
148157

@@ -163,6 +172,15 @@ bool VrfMgr::setLink(const string& vrfName)
163172
{
164173
return true;
165174
}
175+
176+
if (vrfName == MGMT_VRF)
177+
{
178+
// Mgmt VRF is initialised as part of hostcfgd,
179+
// just return the reserved table_id for mgmt VRF from here.
180+
uint32_t table_id = MGMT_VRF_TABLE_ID;
181+
m_vrfTableMap.emplace(vrfName, table_id);
182+
return true;
183+
}
166184

167185
uint32_t table = getFreeTable();
168186
if (table == 0)
@@ -207,6 +225,51 @@ void VrfMgr::doTask(Consumer &consumer)
207225
auto vrfName = kfvKey(t);
208226

209227
string op = kfvOp(t);
228+
// Mgmt VRF table event handling for in-band management
229+
if (consumer.getTableName() == CFG_MGMT_VRF_CONFIG_TABLE_NAME)
230+
{
231+
SWSS_LOG_DEBUG("Event for mgmt VRF op %s", op.c_str());
232+
if (op == SET_COMMAND)
233+
{
234+
bool in_band_mgmt_enabled = false;
235+
bool mgmt_vrf_enabled = false;
236+
for (auto i : kfvFieldsValues(t))
237+
{
238+
if (fvField(i) == "mgmtVrfEnabled")
239+
{
240+
if (fvValue(i) == "true")
241+
{
242+
mgmt_vrf_enabled = true;
243+
}
244+
SWSS_LOG_DEBUG("Event for mgmt VRF table mgmt_vrf_enabled is set val:%s", fvValue(i).c_str());
245+
}
246+
else if (fvField(i) == "in_band_mgmt_enabled")
247+
{
248+
if (fvValue(i) == "true")
249+
{
250+
in_band_mgmt_enabled = true;
251+
}
252+
SWSS_LOG_DEBUG("Event for mgmt VRF table in_band_mgmt_enabled is set val:%s", fvValue(i).c_str());
253+
}
254+
}
255+
// If mgmt VRF is not enabled or in-band-mgmt is not enabled delete the in-band-mgmt
256+
// related VRF table map information
257+
if ((op == SET_COMMAND) && ((mgmt_vrf_enabled == false) || (in_band_mgmt_enabled == false)))
258+
{
259+
op = DEL_COMMAND;
260+
}
261+
}
262+
vrfName = MGMT_VRF;
263+
if (((op == DEL_COMMAND) && (m_vrfTableMap.find(vrfName) == m_vrfTableMap.end())) ||
264+
((op == SET_COMMAND) && (m_vrfTableMap.find(vrfName) != m_vrfTableMap.end())))
265+
{
266+
// If the mgmt VRF is not populated already, return
267+
it = consumer.m_toSync.erase(it);
268+
continue;
269+
}
270+
SWSS_LOG_DEBUG("Event for mgmt VRF op %s", op.c_str());
271+
}
272+
SWSS_LOG_DEBUG("Event for table %s vrf netdev %s id %s", consumer.getTableName().c_str(), vrfName.c_str(), op.c_str());
210273
if (op == SET_COMMAND)
211274
{
212275
if (consumer.getTableName() == CFG_VXLAN_EVPN_NVO_TABLE_NAME)
@@ -226,7 +289,8 @@ void VrfMgr::doTask(Consumer &consumer)
226289
m_stateVrfTable.set(vrfName, fvVector);
227290

228291
SWSS_LOG_NOTICE("Created vrf netdev %s", vrfName.c_str());
229-
if (consumer.getTableName() == CFG_VRF_TABLE_NAME)
292+
if ((consumer.getTableName() == CFG_VRF_TABLE_NAME) ||
293+
(consumer.getTableName() == CFG_MGMT_VRF_CONFIG_TABLE_NAME))
230294
{
231295
status = doVrfVxlanTableCreateTask (t);
232296
if (status == false)
@@ -256,7 +320,8 @@ void VrfMgr::doTask(Consumer &consumer)
256320
{
257321
doVrfEvpnNvoDelTask (t);
258322
}
259-
else if (consumer.getTableName() == CFG_VRF_TABLE_NAME)
323+
else if ((consumer.getTableName() == CFG_VRF_TABLE_NAME) ||
324+
(consumer.getTableName() == CFG_MGMT_VRF_CONFIG_TABLE_NAME))
260325
{
261326
vector<FieldValueTuple> temp;
262327

cfgmgr/vrfmgrd.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ int main(int argc, char **argv)
4646
CFG_VRF_TABLE_NAME,
4747
CFG_VNET_TABLE_NAME,
4848
CFG_VXLAN_EVPN_NVO_TABLE_NAME,
49+
CFG_MGMT_VRF_CONFIG_TABLE_NAME
4950
};
5051

5152
DBConnector cfgDb("CONFIG_DB", 0);

fpmsyncd/routesync.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ using namespace swss;
1919
#define VXLAN_IF_NAME_PREFIX "Brvxlan"
2020
#define VNET_PREFIX "Vnet"
2121
#define VRF_PREFIX "Vrf"
22+
#define MGMT_VRF_PREFIX "mgmt"
2223

2324
#ifndef ETH_ALEN
2425
#define ETH_ALEN 6
@@ -625,7 +626,17 @@ void RouteSync::onRouteMsg(int nlmsg_type, struct nl_object *obj, char *vrf)
625626
*/
626627
if (memcmp(vrf, VRF_PREFIX, strlen(VRF_PREFIX)))
627628
{
628-
SWSS_LOG_ERROR("Invalid VRF name %s (ifindex %u)", vrf, rtnl_route_get_table(route_obj));
629+
if(memcmp(vrf, MGMT_VRF_PREFIX, strlen(MGMT_VRF_PREFIX)))
630+
{
631+
SWSS_LOG_ERROR("Invalid VRF name %s (ifindex %u)", vrf, rtnl_route_get_table(route_obj));
632+
}
633+
else
634+
{
635+
dip = rtnl_route_get_dst(route_obj);
636+
nl_addr2str(dip, destipprefix, MAX_ADDR_SIZE);
637+
SWSS_LOG_INFO("Skip routes for Mgmt VRF name %s (ifindex %u) prefix: %s", vrf,
638+
rtnl_route_get_table(route_obj), destipprefix);
639+
}
629640
return;
630641
}
631642
memcpy(destipprefix, vrf, strlen(vrf));

orchagent/intfsorch.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ const int intfsorch_pri = 35;
4242
#define RIF_FLEX_STAT_COUNTER_POLL_MSECS "1000"
4343
#define UPDATE_MAPS_SEC 1
4444

45+
#define MGMT_VRF "mgmt"
4546

4647
static const vector<sai_router_interface_stat_t> rifStatIds =
4748
{
@@ -159,6 +160,23 @@ string IntfsOrch::getRouterIntfsAlias(const IpAddress &ip, const string &vrf_nam
159160
return string();
160161
}
161162

163+
bool IntfsOrch::isInbandIntfInMgmtVrf(const string& alias)
164+
{
165+
if (m_syncdIntfses.find(alias) == m_syncdIntfses.end())
166+
{
167+
return false;
168+
}
169+
170+
string vrf_name = "";
171+
vrf_name = m_vrfOrch->getVRFname(m_syncdIntfses[alias].vrf_id);
172+
if ((!vrf_name.empty()) && (vrf_name == MGMT_VRF))
173+
{
174+
return true;
175+
}
176+
177+
return false;
178+
}
179+
162180
void IntfsOrch::increaseRouterIntfsRefCount(const string &alias)
163181
{
164182
SWSS_LOG_ENTER();

orchagent/intfsorch.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class IntfsOrch : public Orch
3636

3737
sai_object_id_t getRouterIntfsId(const string&);
3838
bool isPrefixSubnet(const IpPrefix&, const string&);
39+
bool isInbandIntfInMgmtVrf(const string& alias);
3940
string getRouterIntfsAlias(const IpAddress &ip, const string &vrf_name = "");
4041
string getRifRateFlexCounterTableKey(string key);
4142
void increaseRouterIntfsRefCount(const string&);

orchagent/neighorch.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,8 @@ void NeighOrch::doTask(Consumer &consumer)
551551

552552
string alias = key.substr(0, found);
553553

554-
if (alias == "eth0" || alias == "lo" || alias == "docker0")
554+
if (alias == "eth0" || alias == "lo" || alias == "docker0"
555+
|| ((op == SET_COMMAND) && m_intfsOrch->isInbandIntfInMgmtVrf(alias)))
555556
{
556557
it = consumer.m_toSync.erase(it);
557558
continue;

orchagent/vrforch.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ bool VRFOrch::addOperation(const Request& request)
6868
vni = static_cast<uint32_t>(request.getAttrUint(name));
6969
continue;
7070
}
71+
else if ((name == "mgmtVrfEnabled") || (name == "in_band_mgmt_enabled"))
72+
{
73+
SWSS_LOG_INFO("MGMT VRF field: %s ignored", name.c_str());
74+
continue;
75+
}
7176
else
7277
{
7378
SWSS_LOG_ERROR("Logic error: Unknown attribute: %s", name.c_str());

orchagent/vrforch.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ const request_description_t request_description = {
3232
{ "ip_opt_action", REQ_T_PACKET_ACTION },
3333
{ "l3_mc_action", REQ_T_PACKET_ACTION },
3434
{ "fallback", REQ_T_BOOL },
35-
{ "vni", REQ_T_UINT }
35+
{ "vni", REQ_T_UINT },
36+
{ "mgmtVrfEnabled", REQ_T_BOOL },
37+
{ "in_band_mgmt_enabled", REQ_T_BOOL }
3638
},
3739
{ } // no mandatory attributes
3840
};

0 commit comments

Comments
 (0)