vslib/SwitchBCM81724.cpp (242 lines of code) (raw):

#include "SwitchBCM81724.h" #include "swss/logger.h" #include "meta/sai_serialize.h" using namespace saivs; SwitchBCM81724::SwitchBCM81724( _In_ sai_object_id_t switch_id, _In_ std::shared_ptr<RealObjectIdManager> manager, _In_ std::shared_ptr<SwitchConfig> config): SwitchStateBase(switch_id, manager, config) { SWSS_LOG_ENTER(); // empty } SwitchBCM81724::SwitchBCM81724( _In_ sai_object_id_t switch_id, _In_ std::shared_ptr<RealObjectIdManager> manager, _In_ std::shared_ptr<SwitchConfig> config, _In_ std::shared_ptr<WarmBootState> warmBootState): SwitchStateBase(switch_id, manager, config, warmBootState) { SWSS_LOG_ENTER(); // empty } SwitchBCM81724::~SwitchBCM81724() { SWSS_LOG_ENTER(); // empty } sai_status_t SwitchBCM81724::create_port_dependencies( _In_ sai_object_id_t port_id) { SWSS_LOG_ENTER(); SWSS_LOG_WARN("check attributes and set, FIXME"); // this method is post create action on generic create object sai_attribute_t attr; // default admin state is down as defined in SAI attr.id = SAI_PORT_ATTR_ADMIN_STATE; attr.value.booldata = false; CHECK_STATUS(set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); attr.id = SAI_PORT_ATTR_OPER_STATUS; attr.value.s32 = SAI_PORT_OPER_STATUS_DOWN; CHECK_STATUS(set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); attr.id = SAI_PORT_ATTR_PORT_SERDES_ID; attr.value.oid = SAI_NULL_OBJECT_ID; CHECK_STATUS(set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); return SAI_STATUS_SUCCESS; } sai_status_t SwitchBCM81724::initialize_default_objects( _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list) { SWSS_LOG_ENTER(); CHECK_STATUS(set_switch_default_attributes()); CHECK_STATUS(create_default_trap_group()); CHECK_STATUS(set_acl_entry_min_prio()); return SAI_STATUS_SUCCESS; } sai_status_t SwitchBCM81724::set( _In_ sai_object_type_t objectType, _In_ sai_object_id_t objectId, _In_ const sai_attribute_t* attr) { SWSS_LOG_ENTER(); return SwitchStateBase::set(objectType, objectId, attr); } sai_status_t SwitchBCM81724::create( _In_ sai_object_type_t object_type, _In_ const std::string &serializedObjectId, _In_ sai_object_id_t switch_id, _In_ uint32_t attr_count, _In_ const sai_attribute_t *attr_list) { SWSS_LOG_ENTER(); // Bypass MACsec creating because the existing implementation of MACsec cannot be directly used by Gearbox if (is_macsec_type(object_type)) { SWSS_LOG_INFO("Bypass creating %s", sai_serialize_object_type(object_type).c_str()); return create_internal(object_type, serializedObjectId, switch_id, attr_count, attr_list); } return SwitchStateBase::create(object_type, serializedObjectId, switch_id, attr_count, attr_list); } sai_status_t SwitchBCM81724::remove( _In_ sai_object_type_t object_type, _In_ const std::string &serializedObjectId) { SWSS_LOG_ENTER(); // Bypass MACsec removing because the existing implementation of MACsec cannot be directly used by Gearbox if (is_macsec_type(object_type)) { SWSS_LOG_INFO("Bypass removing %s", sai_serialize_object_type(object_type).c_str()); return remove_internal(object_type, serializedObjectId); } return SwitchStateBase::remove(object_type, serializedObjectId); } sai_status_t SwitchBCM81724::set( _In_ sai_object_type_t objectType, _In_ const std::string &serializedObjectId, _In_ const sai_attribute_t* attr) { SWSS_LOG_ENTER(); // Bypass MACsec setting because the existing implementation of MACsec cannot be directly used by Gearbox if (is_macsec_type(objectType) || (objectType == SAI_OBJECT_TYPE_ACL_ENTRY && attr && attr->id == SAI_ACL_ENTRY_ATTR_ACTION_MACSEC_FLOW)) { SWSS_LOG_INFO("Bypass setting %s", sai_serialize_object_type(objectType).c_str()); return set_internal(objectType, serializedObjectId, attr);; } return SwitchStateBase::set(objectType, serializedObjectId, attr); } sai_status_t SwitchBCM81724::refresh_port_list( _In_ const sai_attr_metadata_t *meta) { SWSS_LOG_ENTER(); // since now port can be added or removed, we need to update port list // dynamically sai_attribute_t attr; m_port_list.clear(); // iterate via ASIC state to find all the ports for (const auto& it: m_objectHash.at(SAI_OBJECT_TYPE_PORT)) { sai_object_id_t port_id; sai_deserialize_object_id(it.first, port_id); m_port_list.push_back(port_id); } uint32_t port_count = (uint32_t)m_port_list.size(); attr.id = SAI_SWITCH_ATTR_PORT_LIST; attr.value.objlist.count = port_count; attr.value.objlist.list = m_port_list.data(); CHECK_STATUS(set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr)); attr.id = SAI_SWITCH_ATTR_PORT_NUMBER; attr.value.u32 = port_count; CHECK_STATUS(set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr)); SWSS_LOG_NOTICE("refreshed port list, current port number: %zu, not counting cpu port", m_port_list.size()); return SAI_STATUS_SUCCESS; } sai_status_t SwitchBCM81724::set_switch_default_attributes() { SWSS_LOG_ENTER(); sai_status_t ret; // Fill this with supported SAI_OBJECT_TYPEs int32_t supported_obj_list[] = { SAI_OBJECT_TYPE_NULL, SAI_OBJECT_TYPE_PORT }; SWSS_LOG_INFO("create switch default attributes"); sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS; attr.value.u32 = 0; CHECK_STATUS(set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr)); attr.id = SAI_SWITCH_ATTR_WARM_RECOVER; attr.value.booldata = false; CHECK_STATUS(set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr)); attr.id = SAI_SWITCH_ATTR_TYPE; attr.value.s32 = SAI_SWITCH_TYPE_PHY; CHECK_STATUS(set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr)); // v0.1 attr.id = SAI_SWITCH_ATTR_FIRMWARE_MAJOR_VERSION; attr.value.u32 = 0; CHECK_STATUS(set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr)); attr.id = SAI_SWITCH_ATTR_FIRMWARE_MINOR_VERSION; attr.value.u32 = 1; CHECK_STATUS(set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr)); attr.id = SAI_SWITCH_ATTR_SUPPORTED_OBJECT_TYPE_LIST; attr.value.s32list.count = sizeof(supported_obj_list) / sizeof(int32_t); attr.value.s32list.list = supported_obj_list; ret = set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr); return ret; } // override of base class but returning failure in most cases. GB phys implement very little sai_status_t SwitchBCM81724::refresh_read_only( _In_ const sai_attr_metadata_t *meta, _In_ sai_object_id_t object_id) { SWSS_LOG_ENTER(); if (meta->objecttype == SAI_OBJECT_TYPE_SWITCH) { switch (meta->attrid) { case SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS: case SAI_SWITCH_ATTR_PORT_LIST: return refresh_port_list(meta); // TODO should implement, override and call on init create_ports case SAI_SWITCH_ATTR_DEFAULT_TRAP_GROUP: case SAI_SWITCH_ATTR_FIRMWARE_MAJOR_VERSION: return SAI_STATUS_SUCCESS; case SAI_SWITCH_ATTR_ACL_ENTRY_MINIMUM_PRIORITY: case SAI_SWITCH_ATTR_ACL_ENTRY_MAXIMUM_PRIORITY: return SAI_STATUS_SUCCESS; } } if (meta->objecttype == SAI_OBJECT_TYPE_PORT) { switch (meta->attrid) { //case SAI_PORT_ATTR_SUPPORTED_FEC_MODE: //case SAI_PORT_ATTR_SUPPORTED_AUTO_NEG_MODE: //case SAI_PORT_ATTR_REMOTE_ADVERTISED_FEC_MODE: //case SAI_PORT_ATTR_ADVERTISED_FEC_MODE: // // TODO where is code that is doing refresh for those? // return SAI_STATUS_SUCCESS; /* * This status is based on hostif vEthernetX status. */ case SAI_PORT_ATTR_OPER_STATUS: case SAI_PORT_ATTR_PORT_SERDES_ID: return SAI_STATUS_SUCCESS; case SAI_PORT_ATTR_OPER_SPEED: return refresh_port_oper_speed(object_id); } } if (meta->objecttype == SAI_OBJECT_TYPE_DEBUG_COUNTER && meta->attrid == SAI_DEBUG_COUNTER_ATTR_INDEX) { return SAI_STATUS_SUCCESS; // XXX not sure for gearbox } if (meta->objecttype == SAI_OBJECT_TYPE_MACSEC && meta->attrid == SAI_MACSEC_ATTR_SCI_IN_INGRESS_MACSEC_ACL) { return refresh_macsec_sci_in_ingress_macsec_acl(object_id); } if (meta->objecttype == SAI_OBJECT_TYPE_MACSEC_SA) { return refresh_macsec_sa_stat(object_id); } auto mmeta = m_meta.lock(); if (mmeta) { if (mmeta->meta_unittests_enabled()) { SWSS_LOG_NOTICE("unittests enabled, SET could be performed on %s, not recalculating", meta->attridname); return SAI_STATUS_SUCCESS; } } else { SWSS_LOG_WARN("meta pointer expired"); } SWSS_LOG_WARN("need to recalculate RO: %s", meta->attridname); return SAI_STATUS_NOT_IMPLEMENTED; } sai_status_t SwitchBCM81724::create_default_trap_group() { SWSS_LOG_ENTER(); SWSS_LOG_INFO("create default trap group"); sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_DEFAULT_TRAP_GROUP; attr.value.oid = SAI_NULL_OBJECT_ID; return set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr); } sai_status_t SwitchBCM81724::warm_boot_initialize_objects() { SWSS_LOG_ENTER(); SWSS_LOG_ERROR("warm boot is not implemented for SwitchBCM81724"); return SAI_STATUS_NOT_IMPLEMENTED; } bool SwitchBCM81724::is_macsec_type(_In_ sai_object_type_t object_type) { SWSS_LOG_ENTER(); switch(object_type) { case SAI_OBJECT_TYPE_MACSEC_PORT: case SAI_OBJECT_TYPE_MACSEC_SC: case SAI_OBJECT_TYPE_MACSEC_SA: return true; default: break; } return false; }