Skip to content

Commit a960e2e

Browse files
authored
[Orchagent]: FdbOrch changes for EVPN VXLAN (sonic-net#1275)
* [Orchagent]: FdbOrch changes for EVPN VXLAN * Support for EVPN advertised mac routes
1 parent 097cfda commit a960e2e

11 files changed

+1263
-133
lines changed

orchagent/fdborch.cpp

+676-113
Large diffs are not rendered by default.

orchagent/fdborch.h

+52-7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,14 @@
55
#include "observer.h"
66
#include "portsorch.h"
77

8+
enum FdbOrigin
9+
{
10+
FDB_ORIGIN_INVALID = 0,
11+
FDB_ORIGIN_LEARN = 1,
12+
FDB_ORIGIN_PROVISIONED = 2,
13+
FDB_ORIGIN_VXLAN_ADVERTIZED = 4
14+
};
15+
816
struct FdbEntry
917
{
1018
MacAddress mac;
@@ -15,12 +23,17 @@ struct FdbEntry
1523
{
1624
return tie(mac, bv_id) < tie(other.mac, other.bv_id);
1725
}
26+
bool operator==(const FdbEntry& other) const
27+
{
28+
return tie(mac, bv_id) == tie(other.mac, other.bv_id);
29+
}
1830
};
1931

2032
struct FdbUpdate
2133
{
2234
FdbEntry entry;
2335
Port port;
36+
string type;
2437
bool add;
2538
};
2639

@@ -30,10 +43,35 @@ struct FdbFlushUpdate
3043
Port port;
3144
};
3245

33-
struct SavedFdbEntry
46+
struct FdbData
3447
{
35-
FdbEntry entry;
48+
sai_object_id_t bridge_port_id;
3649
string type;
50+
FdbOrigin origin;
51+
/**
52+
{"dynamic", FDB_ORIGIN_LEARN} => dynamically learnt
53+
{"dynamic", FDB_ORIGIN_PROVISIONED} => provisioned dynamic with swssconfig in APPDB
54+
{"dynamic", FDB_ORIGIN_ADVERTIZED} => synced from remote device e.g. BGP MAC route
55+
{"static", FDB_ORIGIN_LEARN} => Invalid
56+
{"static", FDB_ORIGIN_PROVISIONED} => statically provisioned
57+
{"static", FDB_ORIGIN_ADVERTIZED} => sticky synced from remote device
58+
*/
59+
60+
/* Remote FDB related info */
61+
string remote_ip;
62+
string esi;
63+
unsigned int vni;
64+
};
65+
66+
struct SavedFdbEntry
67+
{
68+
MacAddress mac;
69+
unsigned short vlanId;
70+
FdbData fdbData;
71+
bool operator==(const SavedFdbEntry& other) const
72+
{
73+
return tie(mac, vlanId) == tie(other.mac, other.vlanId);
74+
}
3775
};
3876

3977
typedef unordered_map<string, vector<SavedFdbEntry>> fdb_entries_by_port_t;
@@ -42,7 +80,7 @@ class FdbOrch: public Orch, public Subject, public Observer
4280
{
4381
public:
4482

45-
FdbOrch(TableConnector applDbConnector, TableConnector stateDbConnector, PortsOrch *port);
83+
FdbOrch(DBConnector* applDbConnector, vector<table_name_with_pri_t> appFdbTables, TableConnector stateDbFdbConnector, PortsOrch *port);
4684

4785
~FdbOrch()
4886
{
@@ -53,15 +91,19 @@ class FdbOrch: public Orch, public Subject, public Observer
5391
void update(sai_fdb_event_t, const sai_fdb_entry_t *, sai_object_id_t);
5492
void update(SubjectType type, void *cntx);
5593
bool getPort(const MacAddress&, uint16_t, Port&);
94+
95+
bool removeFdbEntry(const FdbEntry& entry, FdbOrigin origin=FDB_ORIGIN_PROVISIONED);
96+
97+
static const int fdborch_pri;
5698
void flushFDBEntries(sai_object_id_t bridge_port_oid,
5799
sai_object_id_t vlan_oid);
58100
void notifyObserversFDBFlush(Port &p, sai_object_id_t&);
59101

60102
private:
61103
PortsOrch *m_portsOrch;
62-
set<FdbEntry> m_entries;
104+
map<FdbEntry, FdbData> m_entries;
63105
fdb_entries_by_port_t saved_fdb_entries;
64-
Table m_table;
106+
vector<Table*> m_appTables;
65107
Table m_fdbStateTable;
66108
NotificationConsumer* m_flushNotificationsConsumer;
67109
NotificationConsumer* m_fdbNotificationConsumer;
@@ -71,9 +113,12 @@ class FdbOrch: public Orch, public Subject, public Observer
71113

72114
void updateVlanMember(const VlanMemberUpdate&);
73115
void updatePortOperState(const PortOperStateUpdate&);
74-
bool addFdbEntry(const FdbEntry&, const string&);
75-
bool removeFdbEntry(const FdbEntry&);
116+
117+
bool addFdbEntry(const FdbEntry&, const string&, FdbData fdbData);
118+
void deleteFdbEntryFromSavedFDB(const MacAddress &mac, const unsigned short &vlanId, FdbOrigin origin, const string portName="");
119+
76120
bool storeFdbEntryState(const FdbUpdate& update);
121+
void notifyTunnelOrch(Port& port);
77122
};
78123

79124
#endif /* SWSS_FDBORCH_H */

orchagent/orchdaemon.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,15 @@ bool OrchDaemon::init()
9494
{ APP_LAG_MEMBER_TABLE_NAME, portsorch_base_pri }
9595
};
9696

97+
vector<table_name_with_pri_t> app_fdb_tables = {
98+
{ APP_FDB_TABLE_NAME, FdbOrch::fdborch_pri},
99+
{ APP_VXLAN_FDB_TABLE_NAME, FdbOrch::fdborch_pri}
100+
};
101+
97102
gCrmOrch = new CrmOrch(m_configDb, CFG_CRM_TABLE_NAME);
98103
gPortsOrch = new PortsOrch(m_applDb, ports_tables);
99-
TableConnector applDbFdb(m_applDb, APP_FDB_TABLE_NAME);
100104
TableConnector stateDbFdb(m_stateDb, STATE_FDB_TABLE_NAME);
101-
gFdbOrch = new FdbOrch(applDbFdb, stateDbFdb, gPortsOrch);
105+
gFdbOrch = new FdbOrch(m_applDb, app_fdb_tables, stateDbFdb, gPortsOrch);
102106

103107
vector<string> vnet_tables = {
104108
APP_VNET_RT_TABLE_NAME,

orchagent/portsorch.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -229,14 +229,13 @@ PortsOrch::PortsOrch(DBConnector *db, vector<table_name_with_pri_t> &tableNames)
229229
/* Initialize counter table */
230230
m_counter_db = shared_ptr<DBConnector>(new DBConnector("COUNTERS_DB", 0));
231231
m_counterTable = unique_ptr<Table>(new Table(m_counter_db.get(), COUNTERS_PORT_NAME_MAP));
232-
233232
m_counterLagTable = unique_ptr<Table>(new Table(m_counter_db.get(), COUNTERS_LAG_NAME_MAP));
234233
FieldValueTuple tuple("", "");
235234
vector<FieldValueTuple> defaultLagFv;
236235
defaultLagFv.push_back(tuple);
237236
m_counterLagTable->set("", defaultLagFv);
238237

239-
/* Initialize port table */
238+
/* Initialize port and vlan table */
240239
m_portTable = unique_ptr<Table>(new Table(db, APP_PORT_TABLE_NAME));
241240

242241
/* Initialize gearbox */

orchagent/portsorch.h

+1
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ class PortsOrch : public Orch, public Subject
9696

9797
bool setHostIntfsOperStatus(const Port& port, bool up) const;
9898
void updateDbPortOperStatus(const Port& port, sai_port_oper_status_t status) const;
99+
99100
bool createBindAclTableGroup(sai_object_id_t port_oid,
100101
sai_object_id_t acl_table_oid,
101102
sai_object_id_t &group_oid,

tests/conftest.py

+18
Original file line numberDiff line numberDiff line change
@@ -1079,6 +1079,24 @@ def setup_db(self):
10791079
self.cdb = swsscommon.DBConnector(4, self.redis_sock, 0)
10801080
self.sdb = swsscommon.DBConnector(6, self.redis_sock, 0)
10811081

1082+
def getSwitchOid(self):
1083+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_SWITCH")
1084+
keys = tbl.getKeys()
1085+
return str(keys[0])
1086+
1087+
def getVlanOid(self, vlanId):
1088+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_VLAN")
1089+
vlan_oid = None
1090+
keys = tbl.getKeys()
1091+
for k in keys:
1092+
(status, fvs) = tbl.get(k)
1093+
assert status == True, "Could not read vlan from DB"
1094+
for fv in fvs:
1095+
if fv[0] == "SAI_VLAN_ATTR_VLAN_ID" and fv[1] == str(vlanId):
1096+
vlan_oid = str(k)
1097+
break
1098+
return vlan_oid
1099+
10821100
# deps: acl_portchannel, fdb
10831101
def getCrmCounterValue(self, key, counter):
10841102
counters_db = swsscommon.DBConnector(swsscommon.COUNTERS_DB, self.redis_sock, 0)

tests/mock_tests/aclorch_ut.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -324,8 +324,13 @@ namespace aclorch_test
324324
TableConnector applDbFdb(m_app_db.get(), APP_FDB_TABLE_NAME);
325325
TableConnector stateDbFdb(m_state_db.get(), STATE_FDB_TABLE_NAME);
326326

327+
vector<table_name_with_pri_t> app_fdb_tables = {
328+
{ APP_FDB_TABLE_NAME, FdbOrch::fdborch_pri},
329+
{ APP_VXLAN_FDB_TABLE_NAME, FdbOrch::fdborch_pri}
330+
};
331+
327332
ASSERT_EQ(gFdbOrch, nullptr);
328-
gFdbOrch = new FdbOrch(applDbFdb, stateDbFdb, gPortsOrch);
333+
gFdbOrch = new FdbOrch(m_app_db.get(), app_fdb_tables, stateDbFdb, gPortsOrch);
329334

330335
ASSERT_EQ(gNeighOrch, nullptr);
331336
gNeighOrch = new NeighOrch(m_app_db.get(), APP_NEIGH_TABLE_NAME, gIntfsOrch, gFdbOrch, gPortsOrch);

0 commit comments

Comments
 (0)