diff --git a/lib/src/context_config.json b/lib/src/context_config.json index 992b5a6bbe3c..21a013dba123 100644 --- a/lib/src/context_config.json +++ b/lib/src/context_config.json @@ -21,10 +21,10 @@ { "guid" : 1, "name" : "syncd1", - "dbAsic" : "ASIC_DB2", - "dbCounters" : "COUNTERS_DB2", - "dbFlex": "FLEX_COUNTER_DB2", - "dbState" : "STATE_DB2", + "dbAsic" : "GB_ASIC_DB", + "dbCounters" : "GB_COUNTERS_DB", + "dbFlex": "GB_FLEX_COUNTER_DB", + "dbState" : "STATE_DB", "switches": [ { "index" : 0, diff --git a/lib/src/sai_redis_switch.cpp b/lib/src/sai_redis_switch.cpp index 3cafc6dc8223..35f74e626ca0 100644 --- a/lib/src/sai_redis_switch.cpp +++ b/lib/src/sai_redis_switch.cpp @@ -1,5 +1,29 @@ #include "sai_redis.h" +sai_status_t redis_switch_mdio_read( + _In_ sai_object_id_t switch_id, + _In_ uint32_t device_addr, + _In_ uint32_t start_reg_addr, + _In_ uint32_t number_of_registers, + _Out_ uint32_t *reg_val) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t redis_switch_mdio_write( + _In_ sai_object_id_t switch_id, + _In_ uint32_t device_addr, + _In_ uint32_t start_reg_addr, + _In_ uint32_t number_of_registers, + _In_ const uint32_t *reg_val) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + REDIS_GENERIC_QUAD(SWITCH,switch); REDIS_GENERIC_STATS(SWITCH,switch); diff --git a/syncd/SaiSwitch.cpp b/syncd/SaiSwitch.cpp index 46d57c8f34ba..74638f4a6dce 100644 --- a/syncd/SaiSwitch.cpp +++ b/syncd/SaiSwitch.cpp @@ -59,13 +59,19 @@ SaiSwitch::SaiSwitch( helperInternalOids(); - helperCheckLaneMap(); + if (getSwitchType() == SAI_SWITCH_TYPE_NPU) + { + helperCheckLaneMap(); + } helperLoadColdVids(); helperPopulateWarmBootVids(); - saiGetMacAddress(m_default_mac_address); + if (getSwitchType() == SAI_SWITCH_TYPE_NPU) + { + saiGetMacAddress(m_default_mac_address); + } if (warmBoot) { @@ -131,6 +137,26 @@ void SaiSwitch::getDefaultMacAddress( memcpy(mac, m_default_mac_address, sizeof(sai_mac_t)); } +sai_switch_type_t SaiSwitch::getSwitchType() const +{ + SWSS_LOG_ENTER(); + + sai_attribute_t attr; + + attr.id = SAI_SWITCH_ATTR_TYPE; + + sai_status_t status = m_vendorSai->get(SAI_OBJECT_TYPE_SWITCH, m_switch_rid, 1, &attr); + + if (status != SAI_STATUS_SUCCESS) + { + SWSS_LOG_THROW("failed to get switch type"); + } + + SWSS_LOG_ERROR("switch type: '%s'", (attr.value.s32 == SAI_SWITCH_TYPE_NPU ? "SAI_SWITCH_TYPE_NPU" : "SAI_SWITCH_TYPE_PHY")); + + return (sai_switch_type_t) attr.value.s32; +} + #define MAX_HARDWARE_INFO_LENGTH 0x1000 std::string SaiSwitch::saiGetHardwareInfo() const @@ -885,7 +911,7 @@ void SaiSwitch::helperPopulateWarmBootVids() { sai_object_id_t vid = m_translator->translateRidToVid(rid, m_switch_vid); - m_warmBootDiscoveredVids.insert(vid); + m_warmBootDiscoveredVids.insert(vid); } } diff --git a/syncd/SaiSwitch.h b/syncd/SaiSwitch.h index a3c60c9c8289..db4f7cc1c919 100644 --- a/syncd/SaiSwitch.h +++ b/syncd/SaiSwitch.h @@ -41,6 +41,7 @@ namespace syncd sai_object_id_t getVid() const; sai_object_id_t getRid() const; + sai_switch_type_t getSwitchType() const; std::string getHardwareInfo() const; std::unordered_map getVidToRidMap() const; diff --git a/syncd/scripts/physyncd_start.sh b/syncd/scripts/physyncd_start.sh new file mode 100644 index 000000000000..32655f37ab0d --- /dev/null +++ b/syncd/scripts/physyncd_start.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# +# Script to start syncd using supervisord +# + +exec "/usr/bin/physyncd_startup.py" + diff --git a/syncd/scripts/physyncd_startup.py b/syncd/scripts/physyncd_startup.py new file mode 100644 index 000000000000..61a4f337a552 --- /dev/null +++ b/syncd/scripts/physyncd_startup.py @@ -0,0 +1,48 @@ +#!/usr/bin/python + +''' +Copyright 2019 Broadcom. The term "Broadcom" refers to Broadcom Inc. +and/or its subsidiaries. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ''' +import os +import json +import subprocess + + +def physyncd_enable(gearbox_config): + i = 1 + for phy in gearbox_config['phys']: + subprocess.Popen(["/bin/bash", "-c", "/bin/bash -c {}".format('"exec /usr/bin/syncd -p /etc/sai.d/pai.profile -x /usr/share/sonic/hwsku/context_config.json -g {}"'.format(i))], close_fds=True) + i += 1 + +def main(): + + # Only privileged users can execute this command + if os.geteuid() != 0: + sys.exit("Root privileges required for this operation") + + """ Loads json file """ + try: + with open('/usr/share/sonic/hwsku/gearbox_config.json') as file_object: + gearbox_config=json.load(file_object) + except: + sys.exit("No external PHY / gearbox supported on this platform, existing physycd application") + + physyncd_enable(gearbox_config) + + +if __name__== "__main__": + main() + diff --git a/tests/brcm.pl b/tests/BCM56850.pl similarity index 100% rename from tests/brcm.pl rename to tests/BCM56850.pl diff --git a/tests/brcm/acl_counter.rec b/tests/BCM56850/acl_counter.rec similarity index 100% rename from tests/brcm/acl_counter.rec rename to tests/BCM56850/acl_counter.rec diff --git a/tests/brcm/acl_counter2.rec b/tests/BCM56850/acl_counter2.rec similarity index 100% rename from tests/brcm/acl_counter2.rec rename to tests/BCM56850/acl_counter2.rec diff --git a/tests/brcm/acl_mask.rec b/tests/BCM56850/acl_mask.rec similarity index 100% rename from tests/brcm/acl_mask.rec rename to tests/BCM56850/acl_mask.rec diff --git a/tests/brcm/acl_tables.rec b/tests/BCM56850/acl_tables.rec similarity index 100% rename from tests/brcm/acl_tables.rec rename to tests/BCM56850/acl_tables.rec diff --git a/tests/brcm/bridge_create_1.rec b/tests/BCM56850/bridge_create_1.rec similarity index 100% rename from tests/brcm/bridge_create_1.rec rename to tests/BCM56850/bridge_create_1.rec diff --git a/tests/brcm/bridge_create_2.rec b/tests/BCM56850/bridge_create_2.rec similarity index 100% rename from tests/brcm/bridge_create_2.rec rename to tests/BCM56850/bridge_create_2.rec diff --git a/tests/brcm/config_acl.rec b/tests/BCM56850/config_acl.rec similarity index 100% rename from tests/brcm/config_acl.rec rename to tests/BCM56850/config_acl.rec diff --git a/tests/brcm/config_acl2.rec b/tests/BCM56850/config_acl2.rec similarity index 100% rename from tests/brcm/config_acl2.rec rename to tests/BCM56850/config_acl2.rec diff --git a/tests/brcm/empty_lag_buffer_acl.rec b/tests/BCM56850/empty_lag_buffer_acl.rec similarity index 100% rename from tests/brcm/empty_lag_buffer_acl.rec rename to tests/BCM56850/empty_lag_buffer_acl.rec diff --git a/tests/brcm/empty_sw.rec b/tests/BCM56850/empty_sw.rec similarity index 100% rename from tests/brcm/empty_sw.rec rename to tests/BCM56850/empty_sw.rec diff --git a/tests/brcm/full.rec b/tests/BCM56850/full.rec similarity index 100% rename from tests/brcm/full.rec rename to tests/BCM56850/full.rec diff --git a/tests/brcm/full_buffer.rec b/tests/BCM56850/full_buffer.rec similarity index 100% rename from tests/brcm/full_buffer.rec rename to tests/BCM56850/full_buffer.rec diff --git a/tests/brcm/full_buffer_second.rec b/tests/BCM56850/full_buffer_second.rec similarity index 100% rename from tests/brcm/full_buffer_second.rec rename to tests/BCM56850/full_buffer_second.rec diff --git a/tests/brcm/full_hostif_remove_segfault.rec b/tests/BCM56850/full_hostif_remove_segfault.rec similarity index 100% rename from tests/brcm/full_hostif_remove_segfault.rec rename to tests/BCM56850/full_hostif_remove_segfault.rec diff --git a/tests/brcm/full_nhg_bug.rec b/tests/BCM56850/full_nhg_bug.rec similarity index 100% rename from tests/brcm/full_nhg_bug.rec rename to tests/BCM56850/full_nhg_bug.rec diff --git a/tests/brcm/full_nhg_bug_prio_flow_bug.rec b/tests/BCM56850/full_nhg_bug_prio_flow_bug.rec similarity index 100% rename from tests/brcm/full_nhg_bug_prio_flow_bug.rec rename to tests/BCM56850/full_nhg_bug_prio_flow_bug.rec diff --git a/tests/brcm/full_nhg_bug_trap_group_create_fail.rec b/tests/BCM56850/full_nhg_bug_trap_group_create_fail.rec similarity index 100% rename from tests/brcm/full_nhg_bug_trap_group_create_fail.rec rename to tests/BCM56850/full_nhg_bug_trap_group_create_fail.rec diff --git a/tests/brcm/full_no_queue.rec b/tests/BCM56850/full_no_queue.rec similarity index 100% rename from tests/brcm/full_no_queue.rec rename to tests/BCM56850/full_no_queue.rec diff --git a/tests/brcm/full_no_queue_no_ipg.rec b/tests/BCM56850/full_no_queue_no_ipg.rec similarity index 100% rename from tests/brcm/full_no_queue_no_ipg.rec rename to tests/BCM56850/full_no_queue_no_ipg.rec diff --git a/tests/brcm/full_no_queue_no_ipg_no_buffer_pfofile.rec b/tests/BCM56850/full_no_queue_no_ipg_no_buffer_pfofile.rec similarity index 100% rename from tests/brcm/full_no_queue_no_ipg_no_buffer_pfofile.rec rename to tests/BCM56850/full_no_queue_no_ipg_no_buffer_pfofile.rec diff --git a/tests/brcm/full_queue_bug_null_buffer_profile.rec b/tests/BCM56850/full_queue_bug_null_buffer_profile.rec similarity index 100% rename from tests/brcm/full_queue_bug_null_buffer_profile.rec rename to tests/BCM56850/full_queue_bug_null_buffer_profile.rec diff --git a/tests/brcm/full_second.rec b/tests/BCM56850/full_second.rec similarity index 100% rename from tests/brcm/full_second.rec rename to tests/BCM56850/full_second.rec diff --git a/tests/brcm/full_second_no_bridge.rec b/tests/BCM56850/full_second_no_bridge.rec similarity index 100% rename from tests/brcm/full_second_no_bridge.rec rename to tests/BCM56850/full_second_no_bridge.rec diff --git a/tests/brcm/full_testbed_config.rec b/tests/BCM56850/full_testbed_config.rec similarity index 100% rename from tests/brcm/full_testbed_config.rec rename to tests/BCM56850/full_testbed_config.rec diff --git a/tests/brcm/hostif.rec b/tests/BCM56850/hostif.rec similarity index 100% rename from tests/brcm/hostif.rec rename to tests/BCM56850/hostif.rec diff --git a/tests/brcm/lag_comparison_logic.rec b/tests/BCM56850/lag_comparison_logic.rec similarity index 100% rename from tests/brcm/lag_comparison_logic.rec rename to tests/BCM56850/lag_comparison_logic.rec diff --git a/tests/brcm/lag_no_members.rec b/tests/BCM56850/lag_no_members.rec similarity index 100% rename from tests/brcm/lag_no_members.rec rename to tests/BCM56850/lag_no_members.rec diff --git a/tests/brcm/lanemap.ini b/tests/BCM56850/lanemap.ini similarity index 100% rename from tests/brcm/lanemap.ini rename to tests/BCM56850/lanemap.ini diff --git a/tests/brcm/nhg_comparison_logic.rec b/tests/BCM56850/nhg_comparison_logic.rec similarity index 100% rename from tests/brcm/nhg_comparison_logic.rec rename to tests/BCM56850/nhg_comparison_logic.rec diff --git a/tests/brcm/ntf1.rec b/tests/BCM56850/ntf1.rec similarity index 100% rename from tests/brcm/ntf1.rec rename to tests/BCM56850/ntf1.rec diff --git a/tests/brcm/ntf2.rec b/tests/BCM56850/ntf2.rec similarity index 100% rename from tests/brcm/ntf2.rec rename to tests/BCM56850/ntf2.rec diff --git a/tests/brcm/qos_map_order.rec b/tests/BCM56850/qos_map_order.rec similarity index 100% rename from tests/brcm/qos_map_order.rec rename to tests/BCM56850/qos_map_order.rec diff --git a/tests/brcm/query_attr_enum_values_capability.rec b/tests/BCM56850/query_attr_enum_values_capability.rec similarity index 100% rename from tests/brcm/query_attr_enum_values_capability.rec rename to tests/BCM56850/query_attr_enum_values_capability.rec diff --git a/tests/brcm/query_object_type_get_availability.rec b/tests/BCM56850/query_object_type_get_availability.rec similarity index 100% rename from tests/brcm/query_object_type_get_availability.rec rename to tests/BCM56850/query_object_type_get_availability.rec diff --git a/tests/brcm/remove_create_port.rec b/tests/BCM56850/remove_create_port.rec similarity index 100% rename from tests/brcm/remove_create_port.rec rename to tests/BCM56850/remove_create_port.rec diff --git a/tests/brcm/remove_next_hop.rec b/tests/BCM56850/remove_next_hop.rec similarity index 100% rename from tests/brcm/remove_next_hop.rec rename to tests/BCM56850/remove_next_hop.rec diff --git a/tests/brcm/remove_port.rec b/tests/BCM56850/remove_port.rec similarity index 100% rename from tests/brcm/remove_port.rec rename to tests/BCM56850/remove_port.rec diff --git a/tests/brcm/rif_loopback.rec b/tests/BCM56850/rif_loopback.rec similarity index 100% rename from tests/brcm/rif_loopback.rec rename to tests/BCM56850/rif_loopback.rec diff --git a/tests/brcm/small_buffer.rec b/tests/BCM56850/small_buffer.rec similarity index 100% rename from tests/brcm/small_buffer.rec rename to tests/BCM56850/small_buffer.rec diff --git a/tests/brcm/speed_apply.rec b/tests/BCM56850/speed_apply.rec similarity index 100% rename from tests/brcm/speed_apply.rec rename to tests/BCM56850/speed_apply.rec diff --git a/tests/brcm/speed_init.rec b/tests/BCM56850/speed_init.rec similarity index 100% rename from tests/brcm/speed_init.rec rename to tests/BCM56850/speed_init.rec diff --git a/tests/brcm/tunnel_map.rec b/tests/BCM56850/tunnel_map.rec similarity index 100% rename from tests/brcm/tunnel_map.rec rename to tests/BCM56850/tunnel_map.rec diff --git a/tests/brcm/vsprofile.ini b/tests/BCM56850/vsprofile.ini similarity index 100% rename from tests/brcm/vsprofile.ini rename to tests/BCM56850/vsprofile.ini diff --git a/tests/brcm/wb_port_create_a.rec b/tests/BCM56850/wb_port_create_a.rec similarity index 100% rename from tests/brcm/wb_port_create_a.rec rename to tests/BCM56850/wb_port_create_a.rec diff --git a/tests/brcm/wb_port_create_b.rec b/tests/BCM56850/wb_port_create_b.rec similarity index 100% rename from tests/brcm/wb_port_create_b.rec rename to tests/BCM56850/wb_port_create_b.rec diff --git a/tests/brcm/wb_port_remove_a.rec b/tests/BCM56850/wb_port_remove_a.rec similarity index 100% rename from tests/brcm/wb_port_remove_a.rec rename to tests/BCM56850/wb_port_remove_a.rec diff --git a/tests/brcm/wb_port_remove_b.rec b/tests/BCM56850/wb_port_remove_b.rec similarity index 100% rename from tests/brcm/wb_port_remove_b.rec rename to tests/BCM56850/wb_port_remove_b.rec diff --git a/tests/brcm/wred_queue.rec b/tests/BCM56850/wred_queue.rec similarity index 100% rename from tests/brcm/wred_queue.rec rename to tests/BCM56850/wred_queue.rec diff --git a/tests/mlnx.pl b/tests/MLNX2700.pl similarity index 100% rename from tests/mlnx.pl rename to tests/MLNX2700.pl diff --git a/tests/mlnx/empty.rec b/tests/MLNX2700/empty.rec similarity index 100% rename from tests/mlnx/empty.rec rename to tests/MLNX2700/empty.rec diff --git a/tests/mlnx/empty_sw.rec b/tests/MLNX2700/empty_sw.rec similarity index 100% rename from tests/mlnx/empty_sw.rec rename to tests/MLNX2700/empty_sw.rec diff --git a/tests/mlnx/full.rec b/tests/MLNX2700/full.rec similarity index 100% rename from tests/mlnx/full.rec rename to tests/MLNX2700/full.rec diff --git a/tests/mlnx/full_nhg_member.rec b/tests/MLNX2700/full_nhg_member.rec similarity index 100% rename from tests/mlnx/full_nhg_member.rec rename to tests/MLNX2700/full_nhg_member.rec diff --git a/tests/mlnx/full_no_hostif_entry.rec b/tests/MLNX2700/full_no_hostif_entry.rec similarity index 100% rename from tests/mlnx/full_no_hostif_entry.rec rename to tests/MLNX2700/full_no_hostif_entry.rec diff --git a/tests/mlnx/full_no_hostif_entry_second.rec b/tests/MLNX2700/full_no_hostif_entry_second.rec similarity index 100% rename from tests/mlnx/full_no_hostif_entry_second.rec rename to tests/MLNX2700/full_no_hostif_entry_second.rec diff --git a/tests/mlnx/full_syncd_dies.rec b/tests/MLNX2700/full_syncd_dies.rec similarity index 100% rename from tests/mlnx/full_syncd_dies.rec rename to tests/MLNX2700/full_syncd_dies.rec diff --git a/tests/mlnx/full_to_crash.rec b/tests/MLNX2700/full_to_crash.rec similarity index 100% rename from tests/mlnx/full_to_crash.rec rename to tests/MLNX2700/full_to_crash.rec diff --git a/tests/mlnx/vsprofile.ini b/tests/MLNX2700/vsprofile.ini similarity index 100% rename from tests/mlnx/vsprofile.ini rename to tests/MLNX2700/vsprofile.ini diff --git a/tests/Makefile.am b/tests/Makefile.am index 1f69c510b8e0..76248af0fcbb 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -19,4 +19,4 @@ if SAITHRIFT vssyncd_LDADD += -lrpcserver -lthrift endif -TESTS = aspellcheck.pl conflictnames.pl swsslogentercheck.sh brcm.pl mlnx.pl +TESTS = aspellcheck.pl conflictnames.pl swsslogentercheck.sh BCM56850.pl MLNX2700.pl diff --git a/vslib/inc/SwitchBCM81724.h b/vslib/inc/SwitchBCM81724.h new file mode 100644 index 000000000000..d622dcf73d62 --- /dev/null +++ b/vslib/inc/SwitchBCM81724.h @@ -0,0 +1,104 @@ +/* + + Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or + its subsidiaries. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + +#pragma once + +#include "SwitchStateBase.h" + +namespace saivs +{ + class SwitchBCM81724: + public SwitchStateBase + { + public: + + SwitchBCM81724( + _In_ sai_object_id_t switch_id, + _In_ std::shared_ptr manager, + _In_ std::shared_ptr config); + + SwitchBCM81724( + _In_ sai_object_id_t switch_id, + _In_ std::shared_ptr manager, + _In_ std::shared_ptr config, + _In_ std::shared_ptr warmBootState); + + virtual ~SwitchBCM81724(); + + protected: + + virtual sai_status_t create_port_dependencies(_In_ sai_object_id_t port_id) override; + + virtual sai_status_t create_qos_queues_per_port(_In_ sai_object_id_t port_id) override; + + virtual sai_status_t create_qos_queues() override; + + virtual sai_status_t set_switch_mac_address() override; + + virtual sai_status_t create_default_vlan() override; + + virtual sai_status_t create_default_1q_bridge() override; + + virtual sai_status_t create_default_virtual_router() override; + + virtual sai_status_t create_default_stp_instance() override; + + virtual sai_status_t create_default_trap_group() override; + + virtual sai_status_t create_ingress_priority_groups_per_port( + _In_ sai_object_id_t port_id) override; + + virtual sai_status_t create_ingress_priority_groups() override; + + virtual sai_status_t create_vlan_members() override; + + virtual sai_status_t create_bridge_ports() override; + + virtual sai_status_t set_acl_entry_min_prio() override; + + virtual sai_status_t set_acl_capabilities() override; + + virtual sai_status_t set_maximum_number_of_childs_per_scheduler_group() override; + + virtual sai_status_t set_number_of_ecmp_groups() override; + + virtual sai_status_t create_cpu_port(); + + virtual sai_status_t create_ports(); + + protected : // refresh + + virtual sai_status_t refresh_port_list( + _In_ const sai_attr_metadata_t *meta) override; + + virtual sai_status_t refresh_bridge_port_list( + _In_ const sai_attr_metadata_t *meta, + _In_ sai_object_id_t bridge_id) override; + + virtual sai_status_t refresh_vlan_member_list( + _In_ const sai_attr_metadata_t *meta, + _In_ sai_object_id_t vlan_id) override; + + protected: + + virtual sai_status_t refresh_read_only( _In_ const sai_attr_metadata_t *meta, _In_ sai_object_id_t object_id) override; + virtual sai_status_t set_switch_default_attributes(); + virtual sai_status_t initialize_default_objects() override; + }; +} diff --git a/vslib/inc/SwitchConfig.h b/vslib/inc/SwitchConfig.h index bd4bf139d22e..bec0541a9c41 100644 --- a/vslib/inc/SwitchConfig.h +++ b/vslib/inc/SwitchConfig.h @@ -6,6 +6,10 @@ #include #include +extern "C" { +#include "sai.h" // for sai_switch_type_t +} + namespace saivs { typedef enum _sai_vs_switch_type_t @@ -14,6 +18,8 @@ namespace saivs SAI_VS_SWITCH_TYPE_BCM56850, + SAI_VS_SWITCH_TYPE_BCM81724, + SAI_VS_SWITCH_TYPE_MLNX2700, } sai_vs_switch_type_t; @@ -38,6 +44,10 @@ namespace saivs public: + static bool parseSaiSwitchType( + _In_ const char* saiSwitchTypeStr, + _Out_ sai_switch_type_t& saiSwitchType); + static bool parseSwitchType( _In_ const char* switchTypeStr, _Out_ sai_vs_switch_type_t& switchType); @@ -51,6 +61,8 @@ namespace saivs public: + sai_switch_type_t m_saiSwitchType; + sai_vs_switch_type_t m_switchType; sai_vs_boot_type_t m_bootType; diff --git a/vslib/inc/saivs.h b/vslib/inc/saivs.h index 15e4abaa5a1b..8c5be3dac6be 100644 --- a/vslib/inc/saivs.h +++ b/vslib/inc/saivs.h @@ -5,6 +5,10 @@ extern "C" { } #define SAI_KEY_VS_SWITCH_TYPE "SAI_VS_SWITCH_TYPE" +#define SAI_KEY_VS_SAI_SWITCH_TYPE "SAI_VS_SAI_SWITCH_TYPE" + +#define SAI_VALUE_SAI_SWITCH_TYPE_NPU "SAI_SWITCH_TYPE_NPU" +#define SAI_VALUE_SAI_SWITCH_TYPE_PHY "SAI_SWITCH_TYPE_PHY" /** * @def SAI_KEY_VS_INTERFACE_LANE_MAP_FILE @@ -31,6 +35,7 @@ extern "C" { #define SAI_KEY_VS_HOSTIF_USE_TAP_DEVICE "SAI_VS_HOSTIF_USE_TAP_DEVICE" #define SAI_VALUE_VS_SWITCH_TYPE_BCM56850 "SAI_VS_SWITCH_TYPE_BCM56850" +#define SAI_VALUE_VS_SWITCH_TYPE_BCM81724 "SAI_VS_SWITCH_TYPE_BCM81724" #define SAI_VALUE_VS_SWITCH_TYPE_MLNX2700 "SAI_VS_SWITCH_TYPE_MLNX2700" /* diff --git a/vslib/src/Makefile.am b/vslib/src/Makefile.am index b30ec668abed..8f220824704c 100644 --- a/vslib/src/Makefile.am +++ b/vslib/src/Makefile.am @@ -45,6 +45,7 @@ libSaiVS_a_SOURCES = \ SelectableFd.cpp \ SwitchState.cpp \ SwitchBCM56850.cpp \ + SwitchBCM81724.cpp \ SwitchMLNX2700.cpp libsaivs_la_SOURCES = \ diff --git a/vslib/src/Sai.cpp b/vslib/src/Sai.cpp index f5fb0472a82a..d2a0b1287e98 100644 --- a/vslib/src/Sai.cpp +++ b/vslib/src/Sai.cpp @@ -94,6 +94,19 @@ sai_status_t Sai::initialize( return SAI_STATUS_FAILURE; } + auto sai_switch_type = service_method_table->profile_get_value(0, SAI_KEY_VS_SAI_SWITCH_TYPE); + sai_switch_type_t saiSwitchType; + + if (sai_switch_type == NULL) + { + SWSS_LOG_NOTICE("failed to obtain service method table value: %s", SAI_KEY_VS_SAI_SWITCH_TYPE); + saiSwitchType = SAI_SWITCH_TYPE_NPU; + } + else if (!SwitchConfig::parseSaiSwitchType(sai_switch_type, saiSwitchType)) + { + return SAI_STATUS_FAILURE; + } + auto *laneMapFile = service_method_table->profile_get_value(0, SAI_KEY_VS_INTERFACE_LANE_MAP_FILE); m_laneMapContainer = LaneMapFileParser::parseLaneMapFile(laneMapFile); @@ -128,6 +141,7 @@ sai_status_t Sai::initialize( auto sc = std::make_shared(); + sc->m_saiSwitchType = saiSwitchType; sc->m_switchType = switchType; sc->m_bootType = bootType; sc->m_switchIndex = 0; @@ -161,7 +175,10 @@ sai_status_t Sai::initialize( startUnittestThread(); - startFdbAgingThread(); + if (saiSwitchType == SAI_SWITCH_TYPE_NPU) + { + startFdbAgingThread(); + } m_apiInitialized = true; diff --git a/vslib/src/SwitchBCM81724.cpp b/vslib/src/SwitchBCM81724.cpp new file mode 100644 index 000000000000..326b19abf0da --- /dev/null +++ b/vslib/src/SwitchBCM81724.cpp @@ -0,0 +1,445 @@ +/* + + Copyright 2019 Broadcom. The term Broadcom refers to Broadcom Inc. and/or + its subsidiaries. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + + +#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 manager, + _In_ std::shared_ptr config): + SwitchStateBase(switch_id, manager, config) +{ + SWSS_LOG_ENTER(); + + // empty +} + +SwitchBCM81724::~SwitchBCM81724() +{ + SWSS_LOG_ENTER(); +} + +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)); + + return SAI_STATUS_SUCCESS; +} + +sai_status_t SwitchBCM81724::initialize_default_objects() +{ + SWSS_LOG_ENTER(); + + CHECK_STATUS(set_switch_default_attributes()); + CHECK_STATUS(create_default_trap_group()); + + return SAI_STATUS_SUCCESS; +} + + +sai_status_t SwitchBCM81724::create_qos_queues_per_port( + _In_ sai_object_id_t port_id) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::create_qos_queues() +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::set_switch_mac_address() +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +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)); + + attr.id = SAI_SWITCH_ATTR_FIRMWARE_MAJOR_VERSION; + strncpy((char *)&attr.value.chardata, "v0.1", sizeof(attr.value.chardata)); + + 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); + attr.value.s32list.list = supported_obj_list; + + ret = set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr); + + return ret; +} + +SwitchBCM81724::SwitchBCM81724( + _In_ sai_object_id_t switch_id, + _In_ std::shared_ptr manager, + _In_ std::shared_ptr config, + _In_ std::shared_ptr warmBootState): + SwitchStateBase(switch_id, manager, config, warmBootState) +{ + SWSS_LOG_ENTER(); + + // empty +} + +// 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_CPU_PORT: + case SAI_SWITCH_ATTR_DEFAULT_VIRTUAL_ROUTER_ID: + case SAI_SWITCH_ATTR_DEFAULT_VLAN_ID: + case SAI_SWITCH_ATTR_DEFAULT_STP_INST_ID: + case SAI_SWITCH_ATTR_DEFAULT_1Q_BRIDGE_ID: + return SAI_STATUS_NOT_IMPLEMENTED; + + case SAI_SWITCH_ATTR_ACL_ENTRY_MINIMUM_PRIORITY: + case SAI_SWITCH_ATTR_ACL_ENTRY_MAXIMUM_PRIORITY: + return SAI_STATUS_NOT_IMPLEMENTED; + + case SAI_SWITCH_ATTR_MAX_ACL_ACTION_COUNT: + case SAI_SWITCH_ATTR_ACL_STAGE_INGRESS: + case SAI_SWITCH_ATTR_ACL_STAGE_EGRESS: + return SAI_STATUS_NOT_IMPLEMENTED; + + case SAI_SWITCH_ATTR_NUMBER_OF_ECMP_GROUPS: + return SAI_STATUS_NOT_IMPLEMENTED; + + case SAI_SWITCH_ATTR_NUMBER_OF_ACTIVE_PORTS: + case SAI_SWITCH_ATTR_PORT_LIST: + return refresh_port_list(meta); + + case SAI_SWITCH_ATTR_QOS_MAX_NUMBER_OF_CHILDS_PER_SCHEDULER_GROUP: + return SAI_STATUS_NOT_IMPLEMENTED; + + case SAI_SWITCH_ATTR_AVAILABLE_SNAT_ENTRY: + case SAI_SWITCH_ATTR_AVAILABLE_DNAT_ENTRY: + case SAI_SWITCH_ATTR_AVAILABLE_DOUBLE_NAT_ENTRY: + return SAI_STATUS_NOT_IMPLEMENTED; + + case SAI_SWITCH_ATTR_DEFAULT_TRAP_GROUP: + case SAI_SWITCH_ATTR_FIRMWARE_MAJOR_VERSION: + return SAI_STATUS_SUCCESS; + } + } + + if (meta->objecttype == SAI_OBJECT_TYPE_PORT) + { + switch (meta->attrid) + { + case SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES: + case SAI_PORT_ATTR_QOS_QUEUE_LIST: + return SAI_STATUS_NOT_IMPLEMENTED; + + case SAI_PORT_ATTR_NUMBER_OF_INGRESS_PRIORITY_GROUPS: + case SAI_PORT_ATTR_INGRESS_PRIORITY_GROUP_LIST: + return SAI_STATUS_NOT_IMPLEMENTED; + + case SAI_PORT_ATTR_QOS_NUMBER_OF_SCHEDULER_GROUPS: + case SAI_PORT_ATTR_QOS_SCHEDULER_GROUP_LIST: + return SAI_STATUS_NOT_IMPLEMENTED; + + 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: + return SAI_STATUS_SUCCESS; + + /* + * This status is based on hostif vEthernetX status. + */ + + case SAI_PORT_ATTR_OPER_STATUS: + return SAI_STATUS_SUCCESS; + } + } + + if (meta->objecttype == SAI_OBJECT_TYPE_SCHEDULER_GROUP) + { + return SAI_STATUS_NOT_IMPLEMENTED; + } + + if (meta->objecttype == SAI_OBJECT_TYPE_BRIDGE && meta->attrid == SAI_BRIDGE_ATTR_PORT_LIST) + { + return SAI_STATUS_NOT_IMPLEMENTED; + } + + if (meta->objecttype == SAI_OBJECT_TYPE_VLAN && meta->attrid == SAI_VLAN_ATTR_MEMBER_LIST) + { + return SAI_STATUS_NOT_IMPLEMENTED; + } + + if (meta->objecttype == SAI_OBJECT_TYPE_DEBUG_COUNTER && meta->attrid == SAI_DEBUG_COUNTER_ATTR_INDEX) + { + return SAI_STATUS_SUCCESS; // XXX not sure for gearbox + } + + 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_vlan() +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::create_cpu_port() +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::create_default_1q_bridge() +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::create_ports() +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::create_default_virtual_router() +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::create_default_stp_instance() +{ + SWSS_LOG_ENTER(); + + 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::create_ingress_priority_groups_per_port( + _In_ sai_object_id_t port_id) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::create_ingress_priority_groups() +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::create_vlan_members() +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::create_bridge_ports() +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::set_acl_entry_min_prio() +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::set_acl_capabilities() +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::set_maximum_number_of_childs_per_scheduler_group() +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::set_number_of_ecmp_groups() +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::refresh_bridge_port_list( + _In_ const sai_attr_metadata_t *meta, + _In_ sai_object_id_t bridge_id) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + +sai_status_t SwitchBCM81724::refresh_vlan_member_list( + _In_ const sai_attr_metadata_t *meta, + _In_ sai_object_id_t vlan_id) +{ + SWSS_LOG_ENTER(); + + return SAI_STATUS_NOT_IMPLEMENTED; +} + diff --git a/vslib/src/SwitchConfig.cpp b/vslib/src/SwitchConfig.cpp index c7c7649f1b8d..7738eae0dcd3 100644 --- a/vslib/src/SwitchConfig.cpp +++ b/vslib/src/SwitchConfig.cpp @@ -6,6 +6,7 @@ using namespace saivs; SwitchConfig::SwitchConfig(): + m_saiSwitchType(SAI_SWITCH_TYPE_NPU), m_switchType(SAI_VS_SWITCH_TYPE_NONE), m_bootType(SAI_VS_BOOT_TYPE_COLD), m_switchIndex(0), @@ -18,6 +19,35 @@ SwitchConfig::SwitchConfig(): } +bool SwitchConfig::parseSaiSwitchType( + _In_ const char* saiSwitchTypeStr, + _Out_ sai_switch_type_t& saiSwitchType) +{ + SWSS_LOG_ENTER(); + + std::string st = (saiSwitchTypeStr == NULL) ? "unknown" : saiSwitchTypeStr; + + if (st == SAI_VALUE_SAI_SWITCH_TYPE_NPU) + { + saiSwitchType = SAI_SWITCH_TYPE_NPU; + } + else if (st == SAI_VALUE_SAI_SWITCH_TYPE_PHY) + { + saiSwitchType = SAI_SWITCH_TYPE_PHY; + } + else + { + SWSS_LOG_ERROR("unknown SAI switch type: '%s', expected (%s|%s)", + saiSwitchTypeStr, + SAI_VALUE_SAI_SWITCH_TYPE_NPU, + SAI_VALUE_SAI_SWITCH_TYPE_PHY); + + return false; + } + + return true; +} + bool SwitchConfig::parseSwitchType( _In_ const char* switchTypeStr, _Out_ sai_vs_switch_type_t& switchType) @@ -30,14 +60,19 @@ bool SwitchConfig::parseSwitchType( { switchType = SAI_VS_SWITCH_TYPE_BCM56850; } + else if (st == SAI_VALUE_VS_SWITCH_TYPE_BCM81724) + { + switchType = SAI_VS_SWITCH_TYPE_BCM81724; + } else if (st == SAI_VALUE_VS_SWITCH_TYPE_MLNX2700) { switchType = SAI_VS_SWITCH_TYPE_MLNX2700; } else { - SWSS_LOG_ERROR("unknown switch type: '%s', expected (%s|%s)", + SWSS_LOG_ERROR("unknown switch type: '%s', expected (%s|%s|%s)", switchTypeStr, + SAI_VALUE_VS_SWITCH_TYPE_BCM81724, SAI_VALUE_VS_SWITCH_TYPE_BCM56850, SAI_VALUE_VS_SWITCH_TYPE_MLNX2700); diff --git a/vslib/src/SwitchStateBase.cpp b/vslib/src/SwitchStateBase.cpp index 91679d10094e..94e050d63f59 100644 --- a/vslib/src/SwitchStateBase.cpp +++ b/vslib/src/SwitchStateBase.cpp @@ -409,7 +409,6 @@ sai_status_t SwitchStateBase::setPort( { SWSS_LOG_ERROR("failed to set MTU on portId %s", sai_serialize_object_id(portId).c_str()); - return SAI_STATUS_FAILURE; } } @@ -722,6 +721,11 @@ sai_status_t SwitchStateBase::set_switch_default_attributes() CHECK_STATUS(set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr)); + attr.id = SAI_SWITCH_ATTR_TYPE; + attr.value.s32 = SAI_SWITCH_TYPE_NPU; + + CHECK_STATUS(set(SAI_OBJECT_TYPE_SWITCH, m_switch_id, &attr)); + attr.id = SAI_SWITCH_ATTR_WARM_RECOVER; attr.value.booldata = false; @@ -820,7 +824,6 @@ sai_status_t SwitchStateBase::create_ports() sai_object_id_t port_id; CHECK_STATUS(create(SAI_OBJECT_TYPE_PORT, &port_id, m_switch_id, 0, NULL)); - m_port_list.push_back(port_id); sai_attribute_t attr; diff --git a/vslib/src/VirtualSwitchSaiInterface.cpp b/vslib/src/VirtualSwitchSaiInterface.cpp index a53f56a329f1..e35a90547afd 100644 --- a/vslib/src/VirtualSwitchSaiInterface.cpp +++ b/vslib/src/VirtualSwitchSaiInterface.cpp @@ -10,6 +10,7 @@ #include "meta/sai_serialize.h" #include "SwitchStateBase.h" +#include "SwitchBCM81724.h" #include "SwitchBCM56850.h" #include "SwitchMLNX2700.h" @@ -534,6 +535,11 @@ std::shared_ptr VirtualSwitchSaiInterface::init_switch( m_switchStateMap[switch_id] = std::make_shared(switch_id, m_realObjectIdManager, config, warmBootState); break; + case SAI_VS_SWITCH_TYPE_BCM81724: + + m_switchStateMap[switch_id] = std::make_shared(switch_id, m_realObjectIdManager, config, warmBootState); + break; + case SAI_VS_SWITCH_TYPE_MLNX2700: m_switchStateMap[switch_id] = std::make_shared(switch_id, m_realObjectIdManager, config, warmBootState); diff --git a/vslib/src/sai_vs_switch.cpp b/vslib/src/sai_vs_switch.cpp index 619d2532442e..67cdecb0bbbb 100644 --- a/vslib/src/sai_vs_switch.cpp +++ b/vslib/src/sai_vs_switch.cpp @@ -51,5 +51,5 @@ const sai_switch_api_t vs_switch_api = { VS_GENERIC_STATS_API(switch) vs_mdio_read, - vs_mdio_write, + vs_mdio_write };