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
1618using 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
0 commit comments