saiasiccmp/SaiSwitchAsic.cpp (191 lines of code) (raw):

#include "SaiSwitchAsic.h" #include "syncd/VidManager.h" #include "meta/sai_serialize.h" #include "swss/logger.h" #pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn" using namespace saiasiccmp; SaiSwitchAsic::SaiSwitchAsic( _In_ sai_object_id_t switchVid, _In_ sai_object_id_t switchRid, _In_ const std::map<sai_object_id_t, sai_object_id_t> vid2rid, _In_ const std::map<sai_object_id_t, sai_object_id_t> rid2vid, _In_ const std::map<std::string, sai_object_id_t>& hidden, _In_ const std::map<sai_object_id_t, sai_object_type_t>& coldVids): SaiSwitchInterface(switchVid, switchRid) { SWSS_LOG_ENTER(); m_vid2rid = vid2rid; m_rid2vid = rid2vid; // set default rid map for (auto it: hidden) { auto meta = sai_metadata_get_attr_metadata_by_attr_id_name(it.first.c_str()); if (meta == nullptr) { SWSS_LOG_THROW("can't find attr metadata for %s", it.first.c_str()); } m_default_rid_map[meta->attrid] = it.second; } // populate cold vids for (auto it: coldVids) { m_coldBootDiscoveredVids.insert(it.first); } } std::unordered_map<sai_object_id_t, sai_object_id_t> SaiSwitchAsic::getVidToRidMap() const { SWSS_LOG_ENTER(); std::unordered_map<sai_object_id_t, sai_object_id_t> filtered; for (auto& v2r: m_vid2rid) { auto switchId = syncd::VidManager::switchIdQuery(v2r.first); if (switchId == m_switch_vid) { filtered[v2r.first] = v2r.second; } } return filtered; } std::unordered_map<sai_object_id_t, sai_object_id_t> SaiSwitchAsic::getRidToVidMap() const { SWSS_LOG_ENTER(); // since maps can contain multiple switches, filter only this switch std::unordered_map<sai_object_id_t, sai_object_id_t> filtered; for (auto& r2v: m_rid2vid) { auto switchId = syncd::VidManager::switchIdQuery(r2v.second); if (switchId == m_switch_vid) { filtered[r2v.first] = r2v.second; } } return filtered; } bool SaiSwitchAsic::isDiscoveredRid( _In_ sai_object_id_t rid) const { SWSS_LOG_ENTER(); SWSS_LOG_WARN("FIXME, VID: %s", sai_serialize_object_id(m_rid2vid.at(rid)).c_str()); return true; } bool SaiSwitchAsic::isColdBootDiscoveredRid( _In_ sai_object_id_t rid) const { SWSS_LOG_ENTER(); auto coldBootDiscoveredVids = getColdBootDiscoveredVids(); /* * If object was discovered in cold boot, it must have valid RID assigned, * except objects that were removed like VLAN_MEMBER. */ auto vid = m_rid2vid.at(rid); return coldBootDiscoveredVids.find(vid) != coldBootDiscoveredVids.end(); } bool SaiSwitchAsic::isSwitchObjectDefaultRid( _In_ sai_object_id_t rid) const { SWSS_LOG_ENTER(); for (const auto &p: m_default_rid_map) { if (p.second == rid) { return true; } } return false; } bool SaiSwitchAsic::isNonRemovableRid( _In_ sai_object_id_t rid) const { SWSS_LOG_ENTER(); if (rid == SAI_NULL_OBJECT_ID) { SWSS_LOG_THROW("NULL rid passed"); } /* * Check for SAI_SWITCH_ATTR_DEFAULT_* oids like cpu, default virtual * router. Those objects can't be removed if user ask for it. */ /* * Here we are checking for isSwitchObjectDefaultRid first then * ColdBootDiscoveredRid as it is possible we can discover switch Internal * OID as part of warm-boot also especially when we are doing SAI upgrade * as part of warm-boot. * */ if (isSwitchObjectDefaultRid(rid)) { return true; } if (!isColdBootDiscoveredRid(rid)) { /* * This object was not discovered on cold boot so it can be removed. */ return false; } auto vid = m_rid2vid.at(rid); auto ot = syncd::VidManager::objectTypeQuery(vid); switch (ot) { case SAI_OBJECT_TYPE_VLAN_MEMBER: case SAI_OBJECT_TYPE_STP_PORT: case SAI_OBJECT_TYPE_BRIDGE_PORT: /* * Those objects were discovered during cold boot, but they can * still be removed since switch allows that. */ return false; case SAI_OBJECT_TYPE_PORT: case SAI_OBJECT_TYPE_QUEUE: case SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP: case SAI_OBJECT_TYPE_SCHEDULER_GROUP: case SAI_OBJECT_TYPE_HASH: /* * TODO: Some vendors support removing of those objects then we * need to came up with different approach. Probably SaiSwitch * will need to decide whether it's possible to remove object. */ return true; default: break; } SWSS_LOG_WARN("can't determine wheter object %s RID %s can be removed, FIXME", sai_serialize_object_type(ot).c_str(), sai_serialize_object_id(rid).c_str()); return true; } std::set<sai_object_id_t> SaiSwitchAsic::getDiscoveredRids() const { SWSS_LOG_ENTER(); SWSS_LOG_WARN("FIXME"); return {}; } void SaiSwitchAsic::removeExistingObject( _In_ sai_object_id_t rid) { SWSS_LOG_ENTER(); SWSS_LOG_THROW("not implemented"); } void SaiSwitchAsic::removeExistingObjectReference( _In_ sai_object_id_t rid) { SWSS_LOG_ENTER(); SWSS_LOG_THROW("not implemented"); } void SaiSwitchAsic::getDefaultMacAddress( _Out_ sai_mac_t& mac) const { SWSS_LOG_ENTER(); SWSS_LOG_THROW("not implemented"); } sai_object_id_t SaiSwitchAsic::getDefaultValueForOidAttr( _In_ sai_object_id_t rid, _In_ sai_attr_id_t attr_id) { SWSS_LOG_ENTER(); SWSS_LOG_THROW("not implemented"); } std::set<sai_object_id_t> SaiSwitchAsic::getColdBootDiscoveredVids() const { SWSS_LOG_ENTER(); if (m_coldBootDiscoveredVids.size() != 0) { return m_coldBootDiscoveredVids; } SWSS_LOG_THROW("cold boot vids empty"); } std::set<sai_object_id_t> SaiSwitchAsic::getWarmBootDiscoveredVids() const { SWSS_LOG_ENTER(); SWSS_LOG_WARN("FIXME"); return {}; } void SaiSwitchAsic::onPostPortCreate( _In_ sai_object_id_t port_rid, _In_ sai_object_id_t port_vid) { SWSS_LOG_ENTER(); SWSS_LOG_THROW("not implemented"); } void SaiSwitchAsic::postPortRemove( _In_ sai_object_id_t portRid) { SWSS_LOG_ENTER(); SWSS_LOG_THROW("not implemented"); } void SaiSwitchAsic::collectPortRelatedObjects( _In_ sai_object_id_t portRid) { SWSS_LOG_ENTER(); SWSS_LOG_THROW("not implemented"); }