10
10
11
11
#define ETH0 " Ethernet0"
12
12
#define VLAN40 " Vlan40"
13
+ #define VXLAN_REMOTE " Vxlan_1.1.1.1"
13
14
14
15
extern redisReply *mockReply;
15
16
extern CrmOrch* gCrmOrch ;
@@ -19,6 +20,28 @@ Test Fixture
19
20
*/
20
21
namespace fdb_syncd_flush_test
21
22
{
23
+
24
+ sai_fdb_api_t ut_sai_fdb_api;
25
+ sai_fdb_api_t *pold_sai_fdb_api;
26
+
27
+ sai_status_t _ut_stub_sai_create_fdb_entry (
28
+ _In_ const sai_fdb_entry_t *fdb_entry,
29
+ _In_ uint32_t attr_count,
30
+ _In_ const sai_attribute_t *attr_list)
31
+ {
32
+ return SAI_STATUS_SUCCESS;
33
+ }
34
+ void _hook_sai_fdb_api ()
35
+ {
36
+ ut_sai_fdb_api = *sai_fdb_api;
37
+ pold_sai_fdb_api = sai_fdb_api;
38
+ ut_sai_fdb_api.create_fdb_entry = _ut_stub_sai_create_fdb_entry;
39
+ sai_fdb_api = &ut_sai_fdb_api;
40
+ }
41
+ void _unhook_sai_fdb_api ()
42
+ {
43
+ sai_fdb_api = pold_sai_fdb_api;
44
+ }
22
45
struct FdbOrchTest : public ::testing::Test
23
46
{
24
47
std::shared_ptr<swss::DBConnector> m_config_db;
@@ -40,7 +63,7 @@ namespace fdb_syncd_flush_test
40
63
};
41
64
42
65
ut_helper::initSaiApi (profile);
43
-
66
+
44
67
/* Create Switch */
45
68
sai_attribute_t attr;
46
69
attr.id = SAI_SWITCH_ATTR_INIT_SWITCH;
@@ -70,6 +93,8 @@ namespace fdb_syncd_flush_test
70
93
// 2) Crmorch
71
94
ASSERT_EQ (gCrmOrch , nullptr );
72
95
gCrmOrch = new CrmOrch (m_config_db.get (), CFG_CRM_TABLE_NAME);
96
+ VxlanTunnelOrch *vxlan_tunnel_orch_1 = new VxlanTunnelOrch (m_state_db.get (), m_app_db.get (), APP_VXLAN_TUNNEL_TABLE_NAME);
97
+ gDirectory .set (vxlan_tunnel_orch_1);
73
98
74
99
// Construct fdborch
75
100
vector<table_name_with_pri_t > app_fdb_tables = {
@@ -91,7 +116,7 @@ namespace fdb_syncd_flush_test
91
116
virtual void TearDown () override {
92
117
delete gCrmOrch ;
93
118
gCrmOrch = nullptr ;
94
-
119
+ gDirectory . m_values . clear ();
95
120
ut_helper::uninitSaiApi ();
96
121
}
97
122
};
@@ -126,6 +151,17 @@ namespace fdb_syncd_flush_test
126
151
m_portsOrch->saiOidToAlias [oid] = alias;
127
152
}
128
153
154
+ void setUpVxlanPort (PortsOrch* m_portsOrch){
155
+ /* Updates portsOrch internal cache for Ethernet0 */
156
+ std::string alias = VXLAN_REMOTE;
157
+ sai_object_id_t oid = 0x10000000004a5 ;
158
+
159
+ Port port (alias, Port::PHY);
160
+ m_portsOrch->m_portList [alias] = port;
161
+ m_portsOrch->saiOidToAlias [oid] = alias;
162
+ }
163
+
164
+
129
165
void setUpVlanMember (PortsOrch* m_portsOrch){
130
166
/* Updates portsOrch internal cache for adding Ethernet0 into Vlan40 */
131
167
sai_object_id_t bridge_port_id = 0x3a000000002c33 ;
@@ -136,6 +172,16 @@ namespace fdb_syncd_flush_test
136
172
m_portsOrch->m_portList [VLAN40].m_members .insert (ETH0);
137
173
}
138
174
175
+ void setUpVxlanMember (PortsOrch* m_portsOrch){
176
+ /* Updates portsOrch internal cache for adding Ethernet0 into Vlan40 */
177
+ sai_object_id_t bridge_port_id = 0x3a000000002c34 ;
178
+
179
+ /* Add Bridge Port */
180
+ m_portsOrch->m_portList [VXLAN_REMOTE].m_bridge_port_id = bridge_port_id;
181
+ m_portsOrch->saiOidToAlias [bridge_port_id] = VXLAN_REMOTE;
182
+ m_portsOrch->m_portList [VLAN40].m_members .insert (VXLAN_REMOTE);
183
+ }
184
+
139
185
void triggerUpdate (FdbOrch* m_fdborch,
140
186
sai_fdb_event_t type,
141
187
vector<uint8_t > mac_addr,
@@ -146,7 +192,7 @@ namespace fdb_syncd_flush_test
146
192
*(entry.mac_address +i) = mac_addr[i];
147
193
}
148
194
entry.bv_id = bv_id;
149
- m_fdborch->update (type, &entry, bridge_port_id);
195
+ m_fdborch->update (type, &entry, bridge_port_id, SAI_FDB_ENTRY_TYPE_DYNAMIC );
150
196
}
151
197
}
152
198
@@ -445,4 +491,46 @@ namespace fdb_syncd_flush_test
445
491
ASSERT_EQ (m_fdborch->m_fdbStateTable .hget (" Vlan40:7c:fe:90:12:22:ec" , " port" , port), false );
446
492
ASSERT_EQ (m_fdborch->m_fdbStateTable .hget (" Vlan40:7c:fe:90:12:22:ec" , " type" , entry_type), false );
447
493
}
494
+
495
+ /* Test Consolidated Flush with origin VXLAN */
496
+ TEST_F (FdbOrchTest, ConsolidatedFlushAllVxLAN)
497
+ {
498
+ _hook_sai_fdb_api ();
499
+ ASSERT_NE (m_portsOrch, nullptr );
500
+ setUpVlan (m_portsOrch.get ());
501
+ setUpVxlanPort (m_portsOrch.get ());
502
+ ASSERT_NE (m_portsOrch->m_portList .find (VLAN40), m_portsOrch->m_portList .end ());
503
+ ASSERT_NE (m_portsOrch->m_portList .find (VXLAN_REMOTE), m_portsOrch->m_portList .end ());
504
+ setUpVxlanMember (m_portsOrch.get ());
505
+
506
+ FdbData fdbData;
507
+ fdbData.bridge_port_id = SAI_NULL_OBJECT_ID;
508
+ fdbData.type = " dynamic" ;
509
+ fdbData.origin = FDB_ORIGIN_VXLAN_ADVERTIZED;
510
+ fdbData.remote_ip = " 1.1.1.1" ;
511
+ fdbData.esi = " " ;
512
+ fdbData.vni = 100 ;
513
+ FdbEntry entry;
514
+
515
+ MacAddress mac1 = MacAddress (" 52:54:00:ac:3a:99" );
516
+ entry.mac = mac1;
517
+ entry.port_name = VXLAN_REMOTE;
518
+
519
+ entry.bv_id = m_portsOrch->m_portList [VLAN40].m_vlan_info .vlan_oid ;
520
+ m_fdborch->addFdbEntry (entry, VXLAN_REMOTE, fdbData);
521
+
522
+ /* Make sure fdb_count is incremented as expected */
523
+ ASSERT_EQ (m_portsOrch->m_portList [VLAN40].m_fdb_count , 1 );
524
+ ASSERT_EQ (m_portsOrch->m_portList [VXLAN_REMOTE].m_fdb_count , 1 );
525
+
526
+ /* Event2: Send a Consolidated Flush response from syncd */
527
+ vector<uint8_t > flush_mac_addr = {0 , 0 , 0 , 0 , 0 , 0 };
528
+ triggerUpdate (m_fdborch.get (), SAI_FDB_EVENT_FLUSHED, flush_mac_addr, SAI_NULL_OBJECT_ID,
529
+ SAI_NULL_OBJECT_ID);
530
+
531
+ /* make sure fdb_counters are decremented */
532
+ ASSERT_EQ (m_portsOrch->m_portList [VLAN40].m_fdb_count , 1 );
533
+ ASSERT_EQ (m_portsOrch->m_portList [VXLAN_REMOTE].m_fdb_count , 1 );
534
+ _unhook_sai_fdb_api ();
535
+ }
448
536
}
0 commit comments