diff --git a/syncd/NotificationProcessor.cpp b/syncd/NotificationProcessor.cpp index 574631aea530..70fee03d3772 100644 --- a/syncd/NotificationProcessor.cpp +++ b/syncd/NotificationProcessor.cpp @@ -387,6 +387,7 @@ void NotificationProcessor::process_on_port_state_change( for (uint32_t i = 0; i < count; i++) { sai_port_oper_status_notification_t *oper_stat = &data[i]; + sai_object_id_t rid = oper_stat->port_id; /* * We are using switch_rid as null, since port should be already @@ -397,7 +398,21 @@ void NotificationProcessor::process_on_port_state_change( * switch vid. */ - oper_stat->port_id = m_translator->translateRidToVid(oper_stat->port_id, SAI_NULL_OBJECT_ID); + SWSS_LOG_INFO("Port RID %s state change notification", + sai_serialize_object_id(rid).c_str()); + + if (false == m_translator->tryTranslateRidToVid(rid, oper_stat->port_id)) + { + SWSS_LOG_WARN("Port RID %s transalted to null VID!!!", sai_serialize_object_id(rid).c_str()); + } + + /* + * Port may be in process of removal. OA may recieve notification for VID either + * SAI_NULL_OBJECT_ID or non exist at time of processing + */ + + SWSS_LOG_INFO("Port VID %s state change notification", + sai_serialize_object_id(oper_stat->port_id).c_str()); } std::string s = sai_serialize_port_oper_status_ntf(count, data); diff --git a/syncd/VirtualOidTranslator.cpp b/syncd/VirtualOidTranslator.cpp index 3b45881ff6be..6b7309eeccf9 100644 --- a/syncd/VirtualOidTranslator.cpp +++ b/syncd/VirtualOidTranslator.cpp @@ -22,6 +22,41 @@ VirtualOidTranslator::VirtualOidTranslator( // empty } +bool VirtualOidTranslator::tryTranslateRidToVid( + _In_ sai_object_id_t rid, + _Out_ sai_object_id_t &vid) +{ + SWSS_LOG_ENTER(); + + std::lock_guard lock(m_mutex); + + if (rid == SAI_NULL_OBJECT_ID) + { + SWSS_LOG_DEBUG("translated RID null to VID null"); + + vid = SAI_NULL_OBJECT_ID; + return true; + } + + auto it = m_rid2vid.find(vid); + + if (it != m_rid2vid.end()) + { + vid = it->second; + return true; + } + + vid = m_client->getVidForRid(rid); + + if (vid == SAI_NULL_OBJECT_ID) + { + SWSS_LOG_DEBUG("translated RID %s to VID null", sai_serialize_object_id(rid).c_str()); + return false; + } + + return true; +} + sai_object_id_t VirtualOidTranslator::translateRidToVid( _In_ sai_object_id_t rid, _In_ sai_object_id_t switchVid) diff --git a/syncd/VirtualOidTranslator.h b/syncd/VirtualOidTranslator.h index b996fc402118..26fe3b94ab84 100644 --- a/syncd/VirtualOidTranslator.h +++ b/syncd/VirtualOidTranslator.h @@ -42,6 +42,16 @@ namespace syncd _In_ sai_object_id_t rid, _In_ sai_object_id_t switchVid); + /* + * This method will try get VID for given RID. + * Returns true if input RID is null object and out VID is null object. + * Returns true if able to find RID and out VID object. + * Returns false if not able to find RID and out VID is null object. + */ + bool tryTranslateRidToVid( + _In_ sai_object_id_t rid, + _Out_ sai_object_id_t &vid); + void translateRidToVid( _Inout_ sai_object_list_t& objectList, _In_ sai_object_id_t switchVid);