Skip to content

Commit 451caf5

Browse files
authored
[syncd] Translate removed RIDs in fdb notification (sonic-net#734)
1 parent 48815df commit 451caf5

5 files changed

+129
-30
lines changed

syncd/NotificationProcessor.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ void NotificationProcessor::redisPutFdbEntryToAsicView(
140140
sai_object_id_t bv_id = fdb->fdb_entry.bv_id;
141141
sai_object_id_t port_oid = 0;
142142

143-
sai_fdb_flush_entry_type_t type = SAI_FDB_FLUSH_ENTRY_TYPE_ALL;
143+
sai_fdb_flush_entry_type_t type = SAI_FDB_FLUSH_ENTRY_TYPE_DYNAMIC;
144144

145145
for (uint32_t i = 0; i < fdb->attr_count; i++)
146146
{
@@ -236,7 +236,7 @@ bool NotificationProcessor::check_fdb_event_notification_data(
236236

237237
bool result = true;
238238

239-
if (!m_translator->checkRidExists(data.fdb_entry.bv_id))
239+
if (!m_translator->checkRidExists(data.fdb_entry.bv_id, true))
240240
{
241241
SWSS_LOG_ERROR("bv_id RID 0x%" PRIx64 " is not present on local ASIC DB: %s", data.fdb_entry.bv_id,
242242
sai_serialize_fdb_entry(data.fdb_entry).c_str());
@@ -268,7 +268,7 @@ bool NotificationProcessor::check_fdb_event_notification_data(
268268
if (meta->attrvaluetype != SAI_ATTR_VALUE_TYPE_OBJECT_ID)
269269
continue;
270270

271-
if (!m_translator->checkRidExists(attr.value.oid))
271+
if (!m_translator->checkRidExists(attr.value.oid, true))
272272
{
273273
SWSS_LOG_WARN("RID 0x%" PRIx64 " on %s is not present on local ASIC DB", attr.value.oid, meta->attridname);
274274

@@ -322,9 +322,9 @@ void NotificationProcessor::process_on_fdb_event(
322322

323323
fdb->fdb_entry.switch_id = m_translator->translateRidToVid(fdb->fdb_entry.switch_id, SAI_NULL_OBJECT_ID);
324324

325-
fdb->fdb_entry.bv_id = m_translator->translateRidToVid(fdb->fdb_entry.bv_id, fdb->fdb_entry.switch_id);
325+
fdb->fdb_entry.bv_id = m_translator->translateRidToVid(fdb->fdb_entry.bv_id, fdb->fdb_entry.switch_id, true);
326326

327-
m_translator->translateRidToVid(SAI_OBJECT_TYPE_FDB_ENTRY, fdb->fdb_entry.switch_id, fdb->attr_count, fdb->attr);
327+
m_translator->translateRidToVid(SAI_OBJECT_TYPE_FDB_ENTRY, fdb->fdb_entry.switch_id, fdb->attr_count, fdb->attr, true);
328328

329329
/*
330330
* Currently because of brcm bug, we need to install fdb entries in

syncd/RedisClient.cpp

+31-9
Original file line numberDiff line numberDiff line change
@@ -865,16 +865,38 @@ void RedisClient::processFlushEvent(
865865

866866
SWSS_LOG_NOTICE("pattern %s, portStr %s", pattern.c_str(), portStr.c_str());
867867

868-
swss::RedisCommand command;
868+
std::vector<int> vals; // 0 - flush dynamic, 1 - flush static
869869

870-
int flush_static = (type == SAI_FDB_FLUSH_ENTRY_TYPE_STATIC) ? 1 : 0;
870+
switch (type)
871+
{
872+
case SAI_FDB_FLUSH_ENTRY_TYPE_DYNAMIC:
873+
vals.push_back(0);
874+
break;
875+
876+
case SAI_FDB_FLUSH_ENTRY_TYPE_STATIC:
877+
vals.push_back(1);
878+
break;
879+
880+
case SAI_FDB_FLUSH_ENTRY_TYPE_ALL:
881+
vals.push_back(0);
882+
vals.push_back(1);
883+
break;
884+
885+
default:
886+
SWSS_LOG_THROW("unknow fdb flush entry type: %d", type);
887+
}
888+
889+
for (int flush_static: vals)
890+
{
891+
swss::RedisCommand command;
871892

872-
command.format(
873-
"EVALSHA %s 3 %s %s %s",
874-
m_fdbFlushSha.c_str(),
875-
pattern.c_str(),
876-
portStr.c_str(),
877-
std::to_string(flush_static).c_str());
893+
command.format(
894+
"EVALSHA %s 3 %s %s %s",
895+
m_fdbFlushSha.c_str(),
896+
pattern.c_str(),
897+
portStr.c_str(),
898+
std::to_string(flush_static).c_str());
878899

879-
swss::RedisReply r(m_dbAsic.get(), command);
900+
swss::RedisReply r(m_dbAsic.get(), command);
901+
}
880902
}

syncd/Syncd.cpp

+41
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,7 @@ sai_status_t Syncd::processFdbFlush(
553553
}
554554

555555
SaiAttributeList list(SAI_OBJECT_TYPE_FDB_FLUSH, values, false);
556+
SaiAttributeList vidlist(SAI_OBJECT_TYPE_FDB_FLUSH, values, false);
556557

557558
/*
558559
* Attribute list can't be const since we will use it to translate VID to
@@ -568,6 +569,46 @@ sai_status_t Syncd::processFdbFlush(
568569

569570
m_selectableChannel->set(sai_serialize_status(status), {} , REDIS_ASIC_STATE_COMMAND_FLUSHRESPONSE);
570571

572+
if (status == SAI_STATUS_SUCCESS)
573+
{
574+
SWSS_LOG_NOTICE("fdb flush succeeded, updating redis database");
575+
576+
// update database right after fdb flush success (not in notification)
577+
// build artificial notification here to reuse code
578+
579+
sai_fdb_flush_entry_type_t type = SAI_FDB_FLUSH_ENTRY_TYPE_DYNAMIC;
580+
581+
sai_object_id_t bvId = SAI_NULL_OBJECT_ID;
582+
sai_object_id_t bridgePortId = SAI_NULL_OBJECT_ID;
583+
584+
attr_list = vidlist.get_attr_list();
585+
attr_count = vidlist.get_attr_count();
586+
587+
for (uint32_t i = 0; i < attr_count; i++)
588+
{
589+
switch (attr_list[i].id)
590+
{
591+
case SAI_FDB_FLUSH_ATTR_BRIDGE_PORT_ID:
592+
bridgePortId = attr_list[i].value.oid;
593+
break;
594+
595+
case SAI_FDB_FLUSH_ATTR_BV_ID:
596+
bvId = attr_list[i].value.oid;
597+
break;
598+
599+
case SAI_FDB_FLUSH_ATTR_ENTRY_TYPE:
600+
type = (sai_fdb_flush_entry_type_t)attr_list[i].value.s32;
601+
break;
602+
603+
default:
604+
SWSS_LOG_ERROR("unsupported attribute: %d, skipping", attr_list[i].id);
605+
break;
606+
}
607+
}
608+
609+
m_client->processFlushEvent(switchVid, bridgePortId, bvId, type);
610+
}
611+
571612
return status;
572613
}
573614

syncd/VirtualOidTranslator.cpp

+43-12
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ bool VirtualOidTranslator::tryTranslateRidToVid(
5959

6060
sai_object_id_t VirtualOidTranslator::translateRidToVid(
6161
_In_ sai_object_id_t rid,
62-
_In_ sai_object_id_t switchVid)
62+
_In_ sai_object_id_t switchVid,
63+
_In_ bool translateRemoved)
6364
{
6465
SWSS_LOG_ENTER();
6566

@@ -99,6 +100,20 @@ sai_object_id_t VirtualOidTranslator::translateRidToVid(
99100
return vid;
100101
}
101102

103+
if (translateRemoved)
104+
{
105+
auto itr = m_removedRid2vid.find(rid);
106+
107+
if (itr != m_removedRid2vid.end())
108+
{
109+
SWSS_LOG_WARN("translating removed RID %s, to VID %s",
110+
sai_serialize_object_id(rid).c_str(),
111+
sai_serialize_object_id(itr->second).c_str());
112+
113+
return itr->second;
114+
}
115+
}
116+
102117
SWSS_LOG_DEBUG("spotted new RID %s", sai_serialize_object_id(rid).c_str());
103118

104119
sai_object_type_t object_type = m_vendorSai->objectTypeQuery(rid); // TODO move to std::function or wrapper class
@@ -133,7 +148,8 @@ sai_object_id_t VirtualOidTranslator::translateRidToVid(
133148
}
134149

135150
bool VirtualOidTranslator::checkRidExists(
136-
_In_ sai_object_id_t rid)
151+
_In_ sai_object_id_t rid,
152+
_In_ bool checkRemoved)
137153
{
138154
SWSS_LOG_ENTER();
139155

@@ -147,26 +163,37 @@ bool VirtualOidTranslator::checkRidExists(
147163

148164
auto vid = m_client->getVidForRid(rid);
149165

150-
return vid != SAI_NULL_OBJECT_ID;
166+
if (vid != SAI_NULL_OBJECT_ID)
167+
return true;
168+
169+
if (checkRemoved && (m_removedRid2vid.find(rid) != m_removedRid2vid.end()))
170+
{
171+
SWSS_LOG_WARN("removed RID %s exists", sai_serialize_object_id(rid).c_str());
172+
return true;
173+
}
174+
175+
return false;
151176
}
152177

153178
void VirtualOidTranslator::translateRidToVid(
154179
_Inout_ sai_object_list_t &element,
155-
_In_ sai_object_id_t switchVid)
180+
_In_ sai_object_id_t switchVid,
181+
_In_ bool translateRemoved)
156182
{
157183
SWSS_LOG_ENTER();
158184

159185
for (uint32_t i = 0; i < element.count; i++)
160186
{
161-
element.list[i] = translateRidToVid(element.list[i], switchVid);
187+
element.list[i] = translateRidToVid(element.list[i], switchVid, translateRemoved);
162188
}
163189
}
164190

165191
void VirtualOidTranslator::translateRidToVid(
166192
_In_ sai_object_type_t objectType,
167193
_In_ sai_object_id_t switchVid,
168194
_In_ uint32_t attr_count,
169-
_Inout_ sai_attribute_t *attrList)
195+
_Inout_ sai_attribute_t *attrList,
196+
_In_ bool translateRemoved)
170197
{
171198
SWSS_LOG_ENTER();
172199

@@ -197,31 +224,31 @@ void VirtualOidTranslator::translateRidToVid(
197224
switch (meta->attrvaluetype)
198225
{
199226
case SAI_ATTR_VALUE_TYPE_OBJECT_ID:
200-
attr.value.oid = translateRidToVid(attr.value.oid, switchVid);
227+
attr.value.oid = translateRidToVid(attr.value.oid, switchVid, translateRemoved);
201228
break;
202229

203230
case SAI_ATTR_VALUE_TYPE_OBJECT_LIST:
204-
translateRidToVid(attr.value.objlist, switchVid);
231+
translateRidToVid(attr.value.objlist, switchVid, translateRemoved);
205232
break;
206233

207234
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_ID:
208235
if (attr.value.aclfield.enable)
209-
attr.value.aclfield.data.oid = translateRidToVid(attr.value.aclfield.data.oid, switchVid);
236+
attr.value.aclfield.data.oid = translateRidToVid(attr.value.aclfield.data.oid, switchVid, translateRemoved);
210237
break;
211238

212239
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_LIST:
213240
if (attr.value.aclfield.enable)
214-
translateRidToVid(attr.value.aclfield.data.objlist, switchVid);
241+
translateRidToVid(attr.value.aclfield.data.objlist, switchVid, translateRemoved);
215242
break;
216243

217244
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_ID:
218245
if (attr.value.aclaction.enable)
219-
attr.value.aclaction.parameter.oid = translateRidToVid(attr.value.aclaction.parameter.oid, switchVid);
246+
attr.value.aclaction.parameter.oid = translateRidToVid(attr.value.aclaction.parameter.oid, switchVid, translateRemoved);
220247
break;
221248

222249
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_LIST:
223250
if (attr.value.aclaction.enable)
224-
translateRidToVid(attr.value.aclaction.parameter.objlist, switchVid);
251+
translateRidToVid(attr.value.aclaction.parameter.objlist, switchVid, translateRemoved);
225252
break;
226253

227254
default:
@@ -481,6 +508,8 @@ void VirtualOidTranslator::eraseRidAndVid(
481508

482509
m_rid2vid.erase(rid);
483510
m_vid2rid.erase(vid);
511+
512+
m_removedRid2vid[rid] = vid;
484513
}
485514

486515
void VirtualOidTranslator::clearLocalCache()
@@ -491,4 +520,6 @@ void VirtualOidTranslator::clearLocalCache()
491520

492521
m_rid2vid.clear();
493522
m_vid2rid.clear();
523+
524+
m_removedRid2vid.clear();
494525
}

syncd/VirtualOidTranslator.h

+9-4
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ namespace syncd
4040
*/
4141
sai_object_id_t translateRidToVid(
4242
_In_ sai_object_id_t rid,
43-
_In_ sai_object_id_t switchVid);
43+
_In_ sai_object_id_t switchVid,
44+
_In_ bool translateRemoved = false);
4445

4546
/*
4647
* This method will try get VID for given RID.
@@ -54,7 +55,8 @@ namespace syncd
5455

5556
void translateRidToVid(
5657
_Inout_ sai_object_list_t& objectList,
57-
_In_ sai_object_id_t switchVid);
58+
_In_ sai_object_id_t switchVid,
59+
_In_ bool translateRemoved = false);
5860

5961
/*
6062
* This method is required to translate RID to VIDs when we are doing
@@ -66,7 +68,8 @@ namespace syncd
6668
_In_ sai_object_type_t objectType,
6769
_In_ sai_object_id_t switchVid,
6870
_In_ uint32_t attrCount,
69-
_Inout_ sai_attribute_t *attrList);
71+
_Inout_ sai_attribute_t *attrList,
72+
_In_ bool translateRemoved = false);
7073

7174
/**
7275
* @brief Check if RID exists on the ASIC DB.
@@ -76,7 +79,8 @@ namespace syncd
7679
* @return True if exists or SAI_NULL_OBJECT_ID, otherwise false.
7780
*/
7881
bool checkRidExists(
79-
_In_ sai_object_id_t rid);
82+
_In_ sai_object_id_t rid,
83+
_In_ bool checkRemoved = false);
8084

8185
sai_object_id_t translateVidToRid(
8286
_In_ sai_object_id_t vid);
@@ -121,6 +125,7 @@ namespace syncd
121125

122126
std::unordered_map<sai_object_id_t, sai_object_id_t> m_rid2vid;
123127
std::unordered_map<sai_object_id_t, sai_object_id_t> m_vid2rid;
128+
std::unordered_map<sai_object_id_t, sai_object_id_t> m_removedRid2vid;
124129

125130
std::shared_ptr<RedisClient> m_client;
126131
};

0 commit comments

Comments
 (0)