From 449a09268474acfed9c2f6e7f793b5fd5caf32f7 Mon Sep 17 00:00:00 2001 From: Syd Logan Date: Mon, 29 Jun 2020 14:24:05 -0700 Subject: [PATCH] sonic-sairedis: Add support to sonic-sairedis for gearbox phys (#632) * builds on support for multiple switches in sonic-sairedis * new vslib switch BCM81724 implements a virtual gearbox phy. * support for launching second (BCM81724 is supported by its own syncd) * simple refactoring of tests to support switches by part number, still working with sairedis to support multiple switch in tests so BCM81724 will be a separate pull request) * changed example context_config.json to reflect renaming of phy REDIS tables (see sonic-swss-common commit 292b08a3a80b24b23663020b37e6260039a311c0) Note that a future commit to sonic-buildimage will be required to trigger launch of physyncd (launching is based on device config files which are currently not present in sonic-buildimage). Testing done in multiple environments (broadcom fork and pure upstream). Example CLI output based on changes pushed to sonic-utilities (commit a6c4456f6965b79bf9d02ff1962070a5eae6ea55) running in VS switch supporting BCM81724: root@sonic:/home/admin# show gearbox interfaces status PHY Id Interface MAC Lanes MAC Lane Speed PHY Lanes PHY Lane Speed Line Lanes Line Lane Speed Oper Admin -------- ----------- ----------- ---------------- ----------- ---------------- ------------ ----------------- ------ ------- 1 Ethernet0 25,26,27,28 10G 200,201 20G 206 40G up up 1 Ethernet4 29,30,31,32 10G 202,203 20G 207 40G up up 1 Ethernet8 33,34,35,36 10G 204,205 20G 208 40G up up HLD is located at https://github.com/Azure/SONiC/blob/master/doc/gearbox/gearbox_mgr_design.md Signed-off-by: syd.logan@broadcom.com --- lib/src/context_config.json | 8 +- lib/src/sai_redis_switch.cpp | 24 + syncd/SaiSwitch.cpp | 32 +- syncd/SaiSwitch.h | 1 + syncd/scripts/physyncd_start.sh | 7 + syncd/scripts/physyncd_startup.py | 48 ++ tests/{brcm.pl => BCM56850.pl} | 0 tests/{brcm => BCM56850}/acl_counter.rec | 0 tests/{brcm => BCM56850}/acl_counter2.rec | 0 tests/{brcm => BCM56850}/acl_mask.rec | 0 tests/{brcm => BCM56850}/acl_tables.rec | 0 tests/{brcm => BCM56850}/bridge_create_1.rec | 0 tests/{brcm => BCM56850}/bridge_create_2.rec | 0 tests/{brcm => BCM56850}/config_acl.rec | 0 tests/{brcm => BCM56850}/config_acl2.rec | 0 .../empty_lag_buffer_acl.rec | 0 tests/{brcm => BCM56850}/empty_sw.rec | 0 tests/{brcm => BCM56850}/full.rec | 0 tests/{brcm => BCM56850}/full_buffer.rec | 0 .../{brcm => BCM56850}/full_buffer_second.rec | 0 .../full_hostif_remove_segfault.rec | 0 tests/{brcm => BCM56850}/full_nhg_bug.rec | 0 .../full_nhg_bug_prio_flow_bug.rec | 0 .../full_nhg_bug_trap_group_create_fail.rec | 0 tests/{brcm => BCM56850}/full_no_queue.rec | 0 .../full_no_queue_no_ipg.rec | 0 ...full_no_queue_no_ipg_no_buffer_pfofile.rec | 0 .../full_queue_bug_null_buffer_profile.rec | 0 tests/{brcm => BCM56850}/full_second.rec | 0 .../full_second_no_bridge.rec | 0 .../full_testbed_config.rec | 0 tests/{brcm => BCM56850}/hostif.rec | 0 .../lag_comparison_logic.rec | 0 tests/{brcm => BCM56850}/lag_no_members.rec | 0 tests/{brcm => BCM56850}/lanemap.ini | 0 .../nhg_comparison_logic.rec | 0 tests/{brcm => BCM56850}/ntf1.rec | 0 tests/{brcm => BCM56850}/ntf2.rec | 0 tests/{brcm => BCM56850}/qos_map_order.rec | 0 .../query_attr_enum_values_capability.rec | 0 .../query_object_type_get_availability.rec | 0 .../{brcm => BCM56850}/remove_create_port.rec | 0 tests/{brcm => BCM56850}/remove_next_hop.rec | 0 tests/{brcm => BCM56850}/remove_port.rec | 0 tests/{brcm => BCM56850}/rif_loopback.rec | 0 tests/{brcm => BCM56850}/small_buffer.rec | 0 tests/{brcm => BCM56850}/speed_apply.rec | 0 tests/{brcm => BCM56850}/speed_init.rec | 0 tests/{brcm => BCM56850}/tunnel_map.rec | 0 tests/{brcm => BCM56850}/vsprofile.ini | 0 tests/{brcm => BCM56850}/wb_port_create_a.rec | 0 tests/{brcm => BCM56850}/wb_port_create_b.rec | 0 tests/{brcm => BCM56850}/wb_port_remove_a.rec | 0 tests/{brcm => BCM56850}/wb_port_remove_b.rec | 0 tests/{brcm => BCM56850}/wred_queue.rec | 0 tests/{mlnx.pl => MLNX2700.pl} | 0 tests/{mlnx => MLNX2700}/empty.rec | 0 tests/{mlnx => MLNX2700}/empty_sw.rec | 0 tests/{mlnx => MLNX2700}/full.rec | 0 tests/{mlnx => MLNX2700}/full_nhg_member.rec | 0 .../full_no_hostif_entry.rec | 0 .../full_no_hostif_entry_second.rec | 0 tests/{mlnx => MLNX2700}/full_syncd_dies.rec | 0 tests/{mlnx => MLNX2700}/full_to_crash.rec | 0 tests/{mlnx => MLNX2700}/vsprofile.ini | 0 tests/Makefile.am | 2 +- vslib/inc/SwitchBCM81724.h | 104 ++++ vslib/inc/SwitchConfig.h | 12 + vslib/inc/saivs.h | 5 + vslib/src/Makefile.am | 1 + vslib/src/Sai.cpp | 19 +- vslib/src/SwitchBCM81724.cpp | 445 ++++++++++++++++++ vslib/src/SwitchConfig.cpp | 37 +- vslib/src/SwitchStateBase.cpp | 7 +- vslib/src/VirtualSwitchSaiInterface.cpp | 6 + vslib/src/sai_vs_switch.cpp | 2 +- 76 files changed, 747 insertions(+), 13 deletions(-) create mode 100644 syncd/scripts/physyncd_start.sh create mode 100644 syncd/scripts/physyncd_startup.py rename tests/{brcm.pl => BCM56850.pl} (100%) rename tests/{brcm => BCM56850}/acl_counter.rec (100%) rename tests/{brcm => BCM56850}/acl_counter2.rec (100%) rename tests/{brcm => BCM56850}/acl_mask.rec (100%) rename tests/{brcm => BCM56850}/acl_tables.rec (100%) rename tests/{brcm => BCM56850}/bridge_create_1.rec (100%) rename tests/{brcm => BCM56850}/bridge_create_2.rec (100%) rename tests/{brcm => BCM56850}/config_acl.rec (100%) rename tests/{brcm => BCM56850}/config_acl2.rec (100%) rename tests/{brcm => BCM56850}/empty_lag_buffer_acl.rec (100%) rename tests/{brcm => BCM56850}/empty_sw.rec (100%) rename tests/{brcm => BCM56850}/full.rec (100%) rename tests/{brcm => BCM56850}/full_buffer.rec (100%) rename tests/{brcm => BCM56850}/full_buffer_second.rec (100%) rename tests/{brcm => BCM56850}/full_hostif_remove_segfault.rec (100%) rename tests/{brcm => BCM56850}/full_nhg_bug.rec (100%) rename tests/{brcm => BCM56850}/full_nhg_bug_prio_flow_bug.rec (100%) rename tests/{brcm => BCM56850}/full_nhg_bug_trap_group_create_fail.rec (100%) rename tests/{brcm => BCM56850}/full_no_queue.rec (100%) rename tests/{brcm => BCM56850}/full_no_queue_no_ipg.rec (100%) rename tests/{brcm => BCM56850}/full_no_queue_no_ipg_no_buffer_pfofile.rec (100%) rename tests/{brcm => BCM56850}/full_queue_bug_null_buffer_profile.rec (100%) rename tests/{brcm => BCM56850}/full_second.rec (100%) rename tests/{brcm => BCM56850}/full_second_no_bridge.rec (100%) rename tests/{brcm => BCM56850}/full_testbed_config.rec (100%) rename tests/{brcm => BCM56850}/hostif.rec (100%) rename tests/{brcm => BCM56850}/lag_comparison_logic.rec (100%) rename tests/{brcm => BCM56850}/lag_no_members.rec (100%) rename tests/{brcm => BCM56850}/lanemap.ini (100%) rename tests/{brcm => BCM56850}/nhg_comparison_logic.rec (100%) rename tests/{brcm => BCM56850}/ntf1.rec (100%) rename tests/{brcm => BCM56850}/ntf2.rec (100%) rename tests/{brcm => BCM56850}/qos_map_order.rec (100%) rename tests/{brcm => BCM56850}/query_attr_enum_values_capability.rec (100%) rename tests/{brcm => BCM56850}/query_object_type_get_availability.rec (100%) rename tests/{brcm => BCM56850}/remove_create_port.rec (100%) rename tests/{brcm => BCM56850}/remove_next_hop.rec (100%) rename tests/{brcm => BCM56850}/remove_port.rec (100%) rename tests/{brcm => BCM56850}/rif_loopback.rec (100%) rename tests/{brcm => BCM56850}/small_buffer.rec (100%) rename tests/{brcm => BCM56850}/speed_apply.rec (100%) rename tests/{brcm => BCM56850}/speed_init.rec (100%) rename tests/{brcm => BCM56850}/tunnel_map.rec (100%) rename tests/{brcm => BCM56850}/vsprofile.ini (100%) rename tests/{brcm => BCM56850}/wb_port_create_a.rec (100%) rename tests/{brcm => BCM56850}/wb_port_create_b.rec (100%) rename tests/{brcm => BCM56850}/wb_port_remove_a.rec (100%) rename tests/{brcm => BCM56850}/wb_port_remove_b.rec (100%) rename tests/{brcm => BCM56850}/wred_queue.rec (100%) rename tests/{mlnx.pl => MLNX2700.pl} (100%) rename tests/{mlnx => MLNX2700}/empty.rec (100%) rename tests/{mlnx => MLNX2700}/empty_sw.rec (100%) rename tests/{mlnx => MLNX2700}/full.rec (100%) rename tests/{mlnx => MLNX2700}/full_nhg_member.rec (100%) rename tests/{mlnx => MLNX2700}/full_no_hostif_entry.rec (100%) rename tests/{mlnx => MLNX2700}/full_no_hostif_entry_second.rec (100%) rename tests/{mlnx => MLNX2700}/full_syncd_dies.rec (100%) rename tests/{mlnx => MLNX2700}/full_to_crash.rec (100%) rename tests/{mlnx => MLNX2700}/vsprofile.ini (100%) create mode 100644 vslib/inc/SwitchBCM81724.h create mode 100644 vslib/src/SwitchBCM81724.cpp 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 };