@@ -59,7 +59,8 @@ bool VirtualOidTranslator::tryTranslateRidToVid(
59
59
60
60
sai_object_id_t VirtualOidTranslator::translateRidToVid (
61
61
_In_ sai_object_id_t rid,
62
- _In_ sai_object_id_t switchVid)
62
+ _In_ sai_object_id_t switchVid,
63
+ _In_ bool translateRemoved)
63
64
{
64
65
SWSS_LOG_ENTER ();
65
66
@@ -99,6 +100,20 @@ sai_object_id_t VirtualOidTranslator::translateRidToVid(
99
100
return vid;
100
101
}
101
102
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
+
102
117
SWSS_LOG_DEBUG (" spotted new RID %s" , sai_serialize_object_id (rid).c_str ());
103
118
104
119
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(
133
148
}
134
149
135
150
bool VirtualOidTranslator::checkRidExists (
136
- _In_ sai_object_id_t rid)
151
+ _In_ sai_object_id_t rid,
152
+ _In_ bool checkRemoved)
137
153
{
138
154
SWSS_LOG_ENTER ();
139
155
@@ -147,26 +163,37 @@ bool VirtualOidTranslator::checkRidExists(
147
163
148
164
auto vid = m_client->getVidForRid (rid);
149
165
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 ;
151
176
}
152
177
153
178
void VirtualOidTranslator::translateRidToVid (
154
179
_Inout_ sai_object_list_t &element,
155
- _In_ sai_object_id_t switchVid)
180
+ _In_ sai_object_id_t switchVid,
181
+ _In_ bool translateRemoved)
156
182
{
157
183
SWSS_LOG_ENTER ();
158
184
159
185
for (uint32_t i = 0 ; i < element.count ; i++)
160
186
{
161
- element.list [i] = translateRidToVid (element.list [i], switchVid);
187
+ element.list [i] = translateRidToVid (element.list [i], switchVid, translateRemoved );
162
188
}
163
189
}
164
190
165
191
void VirtualOidTranslator::translateRidToVid (
166
192
_In_ sai_object_type_t objectType,
167
193
_In_ sai_object_id_t switchVid,
168
194
_In_ uint32_t attr_count,
169
- _Inout_ sai_attribute_t *attrList)
195
+ _Inout_ sai_attribute_t *attrList,
196
+ _In_ bool translateRemoved)
170
197
{
171
198
SWSS_LOG_ENTER ();
172
199
@@ -197,31 +224,31 @@ void VirtualOidTranslator::translateRidToVid(
197
224
switch (meta->attrvaluetype )
198
225
{
199
226
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 );
201
228
break ;
202
229
203
230
case SAI_ATTR_VALUE_TYPE_OBJECT_LIST:
204
- translateRidToVid (attr.value .objlist , switchVid);
231
+ translateRidToVid (attr.value .objlist , switchVid, translateRemoved );
205
232
break ;
206
233
207
234
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_ID:
208
235
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 );
210
237
break ;
211
238
212
239
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_LIST:
213
240
if (attr.value .aclfield .enable )
214
- translateRidToVid (attr.value .aclfield .data .objlist , switchVid);
241
+ translateRidToVid (attr.value .aclfield .data .objlist , switchVid, translateRemoved );
215
242
break ;
216
243
217
244
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_ID:
218
245
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 );
220
247
break ;
221
248
222
249
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_LIST:
223
250
if (attr.value .aclaction .enable )
224
- translateRidToVid (attr.value .aclaction .parameter .objlist , switchVid);
251
+ translateRidToVid (attr.value .aclaction .parameter .objlist , switchVid, translateRemoved );
225
252
break ;
226
253
227
254
default :
@@ -481,6 +508,8 @@ void VirtualOidTranslator::eraseRidAndVid(
481
508
482
509
m_rid2vid.erase (rid);
483
510
m_vid2rid.erase (vid);
511
+
512
+ m_removedRid2vid[rid] = vid;
484
513
}
485
514
486
515
void VirtualOidTranslator::clearLocalCache ()
@@ -491,4 +520,6 @@ void VirtualOidTranslator::clearLocalCache()
491
520
492
521
m_rid2vid.clear ();
493
522
m_vid2rid.clear ();
523
+
524
+ m_removedRid2vid.clear ();
494
525
}
0 commit comments