@@ -201,6 +201,10 @@ void FdbOrch::update(sai_fdb_event_t type,
201
201
update.add = true ;
202
202
update.entry .port_name = update.port .m_alias ;
203
203
update.type = " dynamic" ;
204
+ update.port .m_fdb_count ++;
205
+ m_portsOrch->setPort (update.port .m_alias , update.port );
206
+ vlan.m_fdb_count ++;
207
+ m_portsOrch->setPort (vlan.m_alias , vlan);
204
208
205
209
storeFdbEntryState (update);
206
210
notify (SUBJECT_TYPE_FDB_CHANGE, &update);
@@ -279,7 +283,16 @@ void FdbOrch::update(sai_fdb_event_t type,
279
283
}
280
284
281
285
update.add = false ;
282
-
286
+ if (!update.port .m_alias .empty ())
287
+ {
288
+ update.port .m_fdb_count --;
289
+ m_portsOrch->setPort (update.port .m_alias , update.port );
290
+ }
291
+ if (!vlan.m_alias .empty ())
292
+ {
293
+ vlan.m_fdb_count --;
294
+ m_portsOrch->setPort (vlan.m_alias , vlan);
295
+ }
283
296
storeFdbEntryState (update);
284
297
285
298
notify (SUBJECT_TYPE_FDB_CHANGE, &update);
@@ -313,7 +326,13 @@ void FdbOrch::update(sai_fdb_event_t type,
313
326
}
314
327
315
328
update.add = true ;
316
-
329
+ if (!port_old.m_alias .empty ())
330
+ {
331
+ port_old.m_fdb_count --;
332
+ m_portsOrch->setPort (port_old.m_alias , port_old);
333
+ }
334
+ update.port .m_fdb_count ++;
335
+ m_portsOrch->setPort (update.port .m_alias , update.port );
317
336
storeFdbEntryState (update);
318
337
319
338
notify (SUBJECT_TYPE_FDB_CHANGE, &update);
@@ -1057,6 +1076,13 @@ bool FdbOrch::addFdbEntry(const FdbEntry& entry, const string& port_name,
1057
1076
return false ;
1058
1077
}
1059
1078
}
1079
+ if (oldPort.m_bridge_port_id != port.m_bridge_port_id )
1080
+ {
1081
+ oldPort.m_fdb_count --;
1082
+ m_portsOrch->setPort (oldPort.m_alias , oldPort);
1083
+ port.m_fdb_count ++;
1084
+ m_portsOrch->setPort (port.m_alias , port);
1085
+ }
1060
1086
}
1061
1087
else
1062
1088
{
@@ -1070,6 +1096,10 @@ bool FdbOrch::addFdbEntry(const FdbEntry& entry, const string& port_name,
1070
1096
vlan.m_alias .c_str (), port_name.c_str (), status);
1071
1097
return false ; // FIXME: it should be based on status. Some could be retried, some not
1072
1098
}
1099
+ port.m_fdb_count ++;
1100
+ m_portsOrch->setPort (port.m_alias , port);
1101
+ vlan.m_fdb_count ++;
1102
+ m_portsOrch->setPort (vlan.m_alias , vlan);
1073
1103
}
1074
1104
1075
1105
FdbData storeFdbData = fdbData;
@@ -1185,6 +1215,10 @@ bool FdbOrch::removeFdbEntry(const FdbEntry& entry, FdbOrigin origin)
1185
1215
SWSS_LOG_NOTICE (" Removed mac=%s bv_id=0x%lx port:%s" ,
1186
1216
entry.mac .to_string ().c_str (), entry.bv_id , port.m_alias .c_str ());
1187
1217
1218
+ port.m_fdb_count --;
1219
+ m_portsOrch->setPort (port.m_alias , port);
1220
+ vlan.m_fdb_count --;
1221
+ m_portsOrch->setPort (vlan.m_alias , vlan);
1188
1222
(void )m_entries.erase (entry);
1189
1223
1190
1224
// Remove in StateDb
@@ -1261,7 +1295,8 @@ void FdbOrch::notifyTunnelOrch(Port& port)
1261
1295
{
1262
1296
VxlanTunnelOrch* tunnel_orch = gDirectory .get <VxlanTunnelOrch*>();
1263
1297
1264
- if (port.m_type != Port::TUNNEL)
1298
+ if ((port.m_type != Port::TUNNEL) ||
1299
+ (port.m_fdb_count != 0 ))
1265
1300
return ;
1266
1301
1267
1302
tunnel_orch->deleteTunnelPort (port);
0 commit comments