diff --git a/vslib/inc/sai_vs_switch_BCM56850.h b/vslib/inc/sai_vs_switch_BCM56850.h index 6d63638837..cafa88e70e 100644 --- a/vslib/inc/sai_vs_switch_BCM56850.h +++ b/vslib/inc/sai_vs_switch_BCM56850.h @@ -17,4 +17,8 @@ sai_status_t refresh_read_only_BCM56850( _In_ sai_object_id_t object_id, _In_ sai_object_id_t switch_id); +sai_status_t vs_create_port_BCM56850( + _In_ sai_object_id_t port_id, + _In_ sai_object_id_t switch_id); + #endif // __SAI_VS_SWITCH_BCM56850__ diff --git a/vslib/inc/sai_vs_switch_MLNX2700.h b/vslib/inc/sai_vs_switch_MLNX2700.h index e66d293eab..9c209a9ad5 100644 --- a/vslib/inc/sai_vs_switch_MLNX2700.h +++ b/vslib/inc/sai_vs_switch_MLNX2700.h @@ -17,4 +17,8 @@ sai_status_t refresh_read_only_MLNX2700( _In_ sai_object_id_t object_id, _In_ sai_object_id_t switch_id); +sai_status_t vs_create_port_MLNX2700( + _In_ sai_object_id_t port_id, + _In_ sai_object_id_t switch_id); + #endif // __SAI_VS_SWITCH_MLNX2700__ diff --git a/vslib/src/sai_vs_port.cpp b/vslib/src/sai_vs_port.cpp index d511cb93f1..2c599082de 100644 --- a/vslib/src/sai_vs_port.cpp +++ b/vslib/src/sai_vs_port.cpp @@ -1,5 +1,8 @@ #include "sai_vs.h" #include "sai_vs_internal.h" +#include "sai_vs_state.h" +#include "sai_vs_switch_BCM56850.h" +#include "sai_vs_switch_MLNX2700.h" sai_status_t vs_clear_port_all_stats( _In_ sai_object_id_t port_id) @@ -11,7 +14,34 @@ sai_status_t vs_clear_port_all_stats( return SAI_STATUS_NOT_IMPLEMENTED; } -VS_GENERIC_QUAD(PORT,port); +sai_status_t vs_create_port( + _Out_ sai_object_id_t *port_id, + _In_ sai_object_id_t switch_id, + _In_ uint32_t attr_count, + _In_ const sai_attribute_t *attr_list) +{ + MUTEX(); + SWSS_LOG_ENTER(); + + /* create port */ + CHECK_STATUS(meta_sai_create_oid((sai_object_type_t)SAI_OBJECT_TYPE_PORT, + port_id,switch_id,attr_count,attr_list,&vs_generic_create)); + + if (g_vs_switch_type == SAI_VS_SWITCH_TYPE_BCM56850) + { + vs_create_port_BCM56850(*port_id, switch_id); + } + else if (g_vs_switch_type == SAI_VS_SWITCH_TYPE_MLNX2700) + { + vs_create_port_MLNX2700(*port_id, switch_id); + } + + return SAI_STATUS_SUCCESS; +} + +VS_REMOVE(PORT,port); +VS_SET(PORT,port); +VS_GET(PORT,port); VS_GENERIC_QUAD(PORT_POOL,port_pool); VS_GENERIC_STATS(PORT,port); VS_GENERIC_STATS(PORT_POOL,port_pool); diff --git a/vslib/src/sai_vs_switch_BCM56850.cpp b/vslib/src/sai_vs_switch_BCM56850.cpp index 2be4075056..dbca0b6958 100644 --- a/vslib/src/sai_vs_switch_BCM56850.cpp +++ b/vslib/src/sai_vs_switch_BCM56850.cpp @@ -418,6 +418,42 @@ static sai_status_t create_default_trap_group() return vs_generic_set(SAI_OBJECT_TYPE_SWITCH, switch_object_id, &attr); } +static sai_status_t create_qos_queues_per_port( + _In_ sai_object_id_t switch_object_id, + _In_ sai_object_id_t port_id) +{ + SWSS_LOG_ENTER(); + + // 10 in and 10 out queues per port + const uint32_t port_qos_queues_count = 20; + + std::vector queues; + + for (uint32_t i = 0; i < port_qos_queues_count; ++i) + { + sai_object_id_t queue_id; + + CHECK_STATUS(vs_generic_create(SAI_OBJECT_TYPE_QUEUE, &queue_id, switch_object_id, 0, NULL)); + + queues.push_back(queue_id); + } + + sai_attribute_t attr; + + attr.id = SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES; + attr.value.u32 = port_qos_queues_count; + + CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); + + attr.id = SAI_PORT_ATTR_QOS_QUEUE_LIST; + attr.value.objlist.count = port_qos_queues_count; + attr.value.objlist.list = queues.data(); + + CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); + + return SAI_STATUS_SUCCESS; +} + static sai_status_t create_qos_queues() { SWSS_LOG_ENTER(); @@ -428,36 +464,46 @@ static sai_status_t create_qos_queues() sai_object_id_t switch_object_id = ss->getSwitchId(); - // 10 in and 10 out queues per port - const uint32_t port_qos_queues_count = 20; - for (auto &port_id : port_list) { - std::vector queues; - - for (uint32_t i = 0; i < port_qos_queues_count; ++i) - { - sai_object_id_t queue_id; + create_qos_queues_per_port(switch_object_id, port_id); + } - CHECK_STATUS(vs_generic_create(SAI_OBJECT_TYPE_QUEUE, &queue_id, switch_object_id, 0, NULL)); + return SAI_STATUS_SUCCESS; +} - queues.push_back(queue_id); - } +static sai_status_t create_ingress_priority_groups_per_port( + _In_ sai_object_id_t switch_object_id, + _In_ sai_object_id_t port_id) +{ + SWSS_LOG_ENTER(); - sai_attribute_t attr; + const uint32_t port_pgs_count = 8; - attr.id = SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES; - attr.value.u32 = port_qos_queues_count; + std::vector pgs; - CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); + for (uint32_t i = 0; i < port_pgs_count; ++i) + { + sai_object_id_t pg_id; - attr.id = SAI_PORT_ATTR_QOS_QUEUE_LIST; - attr.value.objlist.count = port_qos_queues_count; - attr.value.objlist.list = queues.data(); + CHECK_STATUS(vs_generic_create(SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, &pg_id, switch_object_id, 0, NULL)); - CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); + pgs.push_back(pg_id); } + sai_attribute_t attr; + + attr.id = SAI_PORT_ATTR_NUMBER_OF_INGRESS_PRIORITY_GROUPS; + attr.value.u32 = port_pgs_count; + + CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); + + attr.id = SAI_PORT_ATTR_INGRESS_PRIORITY_GROUP_LIST; + attr.value.objlist.count = port_pgs_count; + attr.value.objlist.list = pgs.data(); + + CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); + return SAI_STATUS_SUCCESS; } @@ -472,33 +518,9 @@ static sai_status_t create_ingress_priority_groups() sai_object_id_t switch_object_id = ss->getSwitchId(); // - const uint32_t port_pgs_count = 8; - for (auto &port_id : port_list) { - std::vector pgs; - - for (uint32_t i = 0; i < port_pgs_count; ++i) - { - sai_object_id_t pg_id; - - CHECK_STATUS(vs_generic_create(SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, &pg_id, switch_object_id, 0, NULL)); - - pgs.push_back(pg_id); - } - - sai_attribute_t attr; - - attr.id = SAI_PORT_ATTR_NUMBER_OF_INGRESS_PRIORITY_GROUPS; - attr.value.u32 = port_pgs_count; - - CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); - - attr.id = SAI_PORT_ATTR_INGRESS_PRIORITY_GROUP_LIST; - attr.value.objlist.count = port_pgs_count; - attr.value.objlist.list = pgs.data(); - - CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); + create_ingress_priority_groups_per_port(switch_object_id, port_id); } return SAI_STATUS_SUCCESS; @@ -1210,3 +1232,27 @@ sai_status_t refresh_read_only_BCM56850( return SAI_STATUS_NOT_IMPLEMENTED; } + +sai_status_t vs_create_port_BCM56850( + _In_ sai_object_id_t port_id, + _In_ sai_object_id_t switch_id) +{ + SWSS_LOG_ENTER(); + + sai_attribute_t attr; + + attr.id = SAI_PORT_ATTR_ADMIN_STATE; + attr.value.booldata = false; /* default admin state is down as defined in SAI */ + + CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); + + /* create priority groups */ + create_ingress_priority_groups_per_port(switch_id, port_id); + + /* create qos queues */ + create_qos_queues_per_port(switch_id, port_id); + + return SAI_STATUS_SUCCESS; +} + + diff --git a/vslib/src/sai_vs_switch_MLNX2700.cpp b/vslib/src/sai_vs_switch_MLNX2700.cpp index 6f3aef294d..3e65e07da3 100644 --- a/vslib/src/sai_vs_switch_MLNX2700.cpp +++ b/vslib/src/sai_vs_switch_MLNX2700.cpp @@ -350,111 +350,129 @@ static sai_status_t create_default_trap_group() return vs_generic_set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr); } -static sai_status_t create_qos_queues() +static sai_status_t create_qos_queues_per_port( + _In_ sai_object_id_t switch_id, + _In_ sai_object_id_t port_id) { SWSS_LOG_ENTER(); - SWSS_LOG_INFO("create qos queues"); - - sai_object_id_t switch_id = ss->getSwitchId(); - // 8 in and 8 out queues per port const uint32_t port_qos_queues_count = 16; + std::vector queues; - std::vector copy = port_list; + for (uint32_t i = 0; i < port_qos_queues_count; ++i) + { + sai_object_id_t queue_id; - copy.push_back(cpu_port_id); + sai_attribute_t attr[2]; - for (auto &port_id : copy) - { - std::vector queues; + attr[0].id = SAI_QUEUE_ATTR_INDEX; + attr[0].value.u8 = (uint8_t)i; + attr[1].id = SAI_QUEUE_ATTR_PORT; + attr[1].value.oid = port_id; - for (uint32_t i = 0; i < port_qos_queues_count; ++i) - { - sai_object_id_t queue_id; + CHECK_STATUS(vs_generic_create(SAI_OBJECT_TYPE_QUEUE, &queue_id, switch_id, 2, attr)); - sai_attribute_t attr[2]; + queues.push_back(queue_id); + } - attr[0].id = SAI_QUEUE_ATTR_INDEX; - attr[0].value.u8 = (uint8_t)i; + sai_attribute_t attr; - attr[1].id = SAI_QUEUE_ATTR_PORT; - attr[1].value.oid = port_id; + attr.id = SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES; + attr.value.u32 = port_qos_queues_count; - CHECK_STATUS(vs_generic_create(SAI_OBJECT_TYPE_QUEUE, &queue_id, switch_id, 2, attr)); + CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); - queues.push_back(queue_id); - } + attr.id = SAI_PORT_ATTR_QOS_QUEUE_LIST; + attr.value.objlist.count = port_qos_queues_count; + attr.value.objlist.list = queues.data(); - sai_attribute_t attr; + CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); - attr.id = SAI_PORT_ATTR_QOS_NUMBER_OF_QUEUES; - attr.value.u32 = port_qos_queues_count; + return SAI_STATUS_SUCCESS; +} - CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); +static sai_status_t create_qos_queues() +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_INFO("create qos queues"); - attr.id = SAI_PORT_ATTR_QOS_QUEUE_LIST; - attr.value.objlist.count = port_qos_queues_count; - attr.value.objlist.list = queues.data(); + sai_object_id_t switch_id = ss->getSwitchId(); - CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); + std::vector copy = port_list; + + copy.push_back(cpu_port_id); + + for (auto &port_id : copy) + { + create_qos_queues_per_port(switch_id, port_id); } return SAI_STATUS_SUCCESS; } -static sai_status_t create_ingress_priority_groups() +static sai_status_t create_ingress_priority_groups_per_port( + _In_ sai_object_id_t switch_id, + _In_ sai_object_id_t port_id) { SWSS_LOG_ENTER(); - SWSS_LOG_INFO("create ingress priority groups"); - - sai_object_id_t switch_id = ss->getSwitchId(); - const uint32_t port_pgs_count = 8; + std::vector pgs; - for (auto &port_id : port_list) + for (uint32_t i = 0; i < port_pgs_count; ++i) { - std::vector pgs; + sai_object_id_t pg_id; - for (uint32_t i = 0; i < port_pgs_count; ++i) - { - sai_object_id_t pg_id; + sai_attribute_t attr[3]; - sai_attribute_t attr[3]; + attr[0].id = SAI_INGRESS_PRIORITY_GROUP_ATTR_BUFFER_PROFILE; + attr[0].value.oid = SAI_NULL_OBJECT_ID; - attr[0].id = SAI_INGRESS_PRIORITY_GROUP_ATTR_BUFFER_PROFILE; - attr[0].value.oid = SAI_NULL_OBJECT_ID; + /* + * not in headers yet + * + * attr[1].id = SAI_INGRESS_PRIORITY_GROUP_ATTR_PORT; + * attr[1].value.oid = port_id; - /* - * not in headers yet - * - * attr[1].id = SAI_INGRESS_PRIORITY_GROUP_ATTR_PORT; - * attr[1].value.oid = port_id; + * attr[2].id = SAI_INGRESS_PRIORITY_GROUP_ATTR_INDEX; + * attr[2].value.oid = i; - * attr[2].id = SAI_INGRESS_PRIORITY_GROUP_ATTR_INDEX; - * attr[2].value.oid = i; + * fix number of attributes + */ - * fix number of attributes - */ + CHECK_STATUS(vs_generic_create(SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, &pg_id, switch_id, 1, attr)); + pgs.push_back(pg_id); + } - CHECK_STATUS(vs_generic_create(SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, &pg_id, switch_id, 1, attr)); + sai_attribute_t attr; - pgs.push_back(pg_id); - } + attr.id = SAI_PORT_ATTR_NUMBER_OF_INGRESS_PRIORITY_GROUPS; + attr.value.u32 = port_pgs_count; - sai_attribute_t attr; + CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); - attr.id = SAI_PORT_ATTR_NUMBER_OF_INGRESS_PRIORITY_GROUPS; - attr.value.u32 = port_pgs_count; + attr.id = SAI_PORT_ATTR_INGRESS_PRIORITY_GROUP_LIST; + attr.value.objlist.count = port_pgs_count; + attr.value.objlist.list = pgs.data(); - CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); + CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); - attr.id = SAI_PORT_ATTR_INGRESS_PRIORITY_GROUP_LIST; - attr.value.objlist.count = port_pgs_count; - attr.value.objlist.list = pgs.data(); + return SAI_STATUS_SUCCESS; +} - CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); +static sai_status_t create_ingress_priority_groups() +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_INFO("create ingress priority groups"); + + sai_object_id_t switch_id = ss->getSwitchId(); + + for (auto &port_id : port_list) + { + create_ingress_priority_groups_per_port(switch_id, port_id); } return SAI_STATUS_SUCCESS; @@ -1194,3 +1212,26 @@ sai_status_t refresh_read_only_MLNX2700( return SAI_STATUS_NOT_IMPLEMENTED; } + +sai_status_t vs_create_port_MLNX2700( + _In_ sai_object_id_t port_id, + _In_ sai_object_id_t switch_id) +{ + SWSS_LOG_ENTER(); + + sai_attribute_t attr; + + attr.id = SAI_PORT_ATTR_ADMIN_STATE; + attr.value.booldata = false; /* default admin state is down as defined in SAI */ + + CHECK_STATUS(vs_generic_set(SAI_OBJECT_TYPE_PORT, port_id, &attr)); + + /* create priority groups */ + create_ingress_priority_groups_per_port(switch_id, port_id); + + /* create qos queues */ + create_qos_queues_per_port(switch_id, port_id); + + return SAI_STATUS_SUCCESS; +} +