Skip to content

Commit

Permalink
Merge branch '202411' of https://github.com/sonic-net/sonic-sairedis
Browse files Browse the repository at this point in the history
…into 202412
  • Loading branch information
mssonicbld committed Feb 8, 2025
2 parents d3fa0a3 + f35e743 commit 6188358
Show file tree
Hide file tree
Showing 5 changed files with 341 additions and 2 deletions.
2 changes: 1 addition & 1 deletion .azure-pipelines/test-docker-sonic-vs-template.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
displayName: vstest
timeoutInMinutes: ${{ parameters.timeout }}

pool: sonic-common
pool: sonictest

steps:
- script: |
Expand Down
4 changes: 4 additions & 0 deletions syncd/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,10 @@ if SONIC_ASIC_PLATFORM_BROADCOM
libSyncd_a_CXXFLAGS += -DMDIO_ACCESS_USE_NPU
endif

if SONIC_ASIC_PLATFORM_MELLANOX
libSyncd_a_CPPFLAGS += -DSKIP_SAI_PORT_DISCOVERY
endif

libSyncdRequestShutdown_a_SOURCES = \
RequestShutdown.cpp \
RequestShutdownCommandLineOptions.cpp \
Expand Down
7 changes: 7 additions & 0 deletions syncd/SaiDiscovery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,13 @@ void SaiDiscovery::discover(
discovered.insert(rid);
}

#ifdef SKIP_SAI_PORT_DISCOVERY
if (ot == SAI_OBJECT_TYPE_PORT)
{
return;
}
#endif

const sai_object_type_info_t *info = sai_metadata_get_object_type_info(ot);

/*
Expand Down
26 changes: 25 additions & 1 deletion syncd/Syncd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,10 @@ Syncd::Syncd(

m_breakConfig = BreakConfigParser::parseBreakConfig(m_commandLineOptions->m_breakConfig);

#ifdef SKIP_SAI_PORT_DISCOVERY
SWSS_LOG_WARN("SAI discovery is skipped on ports");
#endif

SWSS_LOG_NOTICE("syncd started");
}

Expand Down Expand Up @@ -921,7 +925,6 @@ sai_status_t Syncd::processBulkQuadEventInInitViewMode(
{
case SAI_COMMON_API_BULK_CREATE:
case SAI_COMMON_API_BULK_REMOVE:
case SAI_COMMON_API_BULK_SET:

if (info->isnonobjectid)
{
Expand Down Expand Up @@ -961,6 +964,27 @@ sai_status_t Syncd::processBulkQuadEventInInitViewMode(
return SAI_STATUS_SUCCESS;
}

case SAI_COMMON_API_BULK_SET:

switch (objectType)
{
case SAI_OBJECT_TYPE_SWITCH:
case SAI_OBJECT_TYPE_SCHEDULER_GROUP:

SWSS_LOG_THROW("%s is not supported in init view mode",
sai_serialize_object_type(objectType).c_str());

default:

break;
}

sendApiResponse(api, SAI_STATUS_SUCCESS, (uint32_t)statuses.size(), statuses.data());

syncUpdateRedisBulkQuadEvent(api, statuses, objectType, objectIds, strAttributes);

return SAI_STATUS_SUCCESS;

case SAI_COMMON_API_BULK_GET:
SWSS_LOG_THROW("GET bulk api is not implemented in init view mode, FIXME");

Expand Down
304 changes: 304 additions & 0 deletions syncd/tests/TestSyncdBrcm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -683,4 +683,308 @@ TEST_F(SyncdBrcmTest, portBufferBulkSet)

status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
}

TEST_F(SyncdBrcmTest, portBulkSetInInitView)
{
sai_object_id_t switchId;
sai_attribute_t attrs[1];

struct
{
std::vector<sai_object_id_t> oids;
std::vector<sai_attribute_t> attrs;
std::vector<sai_status_t> statuses;

void resize(size_t size)
{
SWSS_LOG_ENTER();

oids.resize(size);
attrs.resize(size);
statuses.resize(size, SAI_STATUS_NOT_EXECUTED);
}
} ports;

// init view

attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;

auto status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// create switch

attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH;
attrs[0].value.booldata = true;

status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// apply view

attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_APPLY_VIEW;

status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// init view

attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;

status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// create switch

attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH;
attrs[0].value.booldata = true;

status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

attrs[0].id = SAI_SWITCH_ATTR_PORT_NUMBER;
status = m_sairedis->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

ports.resize(attrs[0].value.u32);

ASSERT_TRUE(ports.oids.size() > 1);

attrs[0].id = SAI_SWITCH_ATTR_PORT_LIST;
attrs[0].value.objlist.count = static_cast<uint32_t>(ports.oids.size());
attrs[0].value.objlist.list = ports.oids.data();
status = m_sairedis->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// Set port admin status in bulk

for (size_t i = 0; i < ports.oids.size(); i++)
{
ports.attrs[i].id = SAI_PORT_ATTR_ADMIN_STATE;
ports.attrs[i].value.booldata = true;
}

status = m_sairedis->bulkSet(SAI_OBJECT_TYPE_PORT, static_cast<uint32_t>(ports.oids.size()), ports.oids.data(),
ports.attrs.data(), SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, ports.statuses.data());
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

for (size_t i = 0; i < ports.oids.size(); i++)
{
ASSERT_EQ(ports.statuses[i], SAI_STATUS_SUCCESS);
}
}

TEST_F(SyncdBrcmTest, pgBulkSetInInitView)
{
sai_object_id_t switchId;
sai_attribute_t attrs[1];

std::vector<sai_object_id_t> portOids;

struct
{
std::vector<sai_object_id_t> oids;
std::vector<sai_attribute_t> attrs;
std::vector<sai_status_t> statuses;

void resize(size_t size)
{
SWSS_LOG_ENTER();

oids.resize(size);
attrs.resize(size);
statuses.resize(size, SAI_STATUS_NOT_EXECUTED);
}
} pgs;

// init view

attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;

auto status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// create switch

attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH;
attrs[0].value.booldata = true;

status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// apply view

attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_APPLY_VIEW;

status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// init view

attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;

status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// create switch

attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH;
attrs[0].value.booldata = true;

status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

attrs[0].id = SAI_SWITCH_ATTR_PORT_NUMBER;
status = m_sairedis->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

portOids.resize(attrs[0].value.u32);

ASSERT_TRUE(portOids.size() > 1);

attrs[0].id = SAI_SWITCH_ATTR_PORT_LIST;
attrs[0].value.objlist.count = static_cast<uint32_t>(portOids.size());
attrs[0].value.objlist.list = portOids.data();
status = m_sairedis->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

attrs[0].id = SAI_SWITCH_ATTR_PORT_LIST;
attrs[0].value.objlist.count = static_cast<uint32_t>(portOids.size());
attrs[0].value.objlist.list = portOids.data();
status = m_sairedis->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// Create buffer pool

std::array<sai_attribute_t, 4> buffer_pool_attrs;
sai_object_id_t buffer_pool;

buffer_pool_attrs[0].id = SAI_BUFFER_POOL_ATTR_THRESHOLD_MODE;
buffer_pool_attrs[0].value.u32 = SAI_BUFFER_POOL_THRESHOLD_MODE_DYNAMIC;

buffer_pool_attrs[1].id = SAI_BUFFER_POOL_ATTR_SIZE;
buffer_pool_attrs[1].value.u32 = 47218432;

buffer_pool_attrs[2].id = SAI_BUFFER_POOL_ATTR_TYPE;
buffer_pool_attrs[2].value.u32 = SAI_BUFFER_POOL_TYPE_INGRESS;

buffer_pool_attrs[3].id = SAI_BUFFER_POOL_ATTR_XOFF_SIZE;
buffer_pool_attrs[3].value.u32 = 17708800;

status = m_sairedis->create(SAI_OBJECT_TYPE_BUFFER_POOL, &buffer_pool, switchId,
static_cast<uint32_t>(buffer_pool_attrs.size()), buffer_pool_attrs.data());
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// Create buffer profile

std::array<sai_attribute_t, 4> buffer_profile_attrs;
sai_object_id_t buffer_profile;

buffer_profile_attrs[0].id = SAI_BUFFER_PROFILE_ATTR_POOL_ID;
buffer_profile_attrs[0].value.oid = buffer_pool;

buffer_profile_attrs[1].id = SAI_BUFFER_PROFILE_ATTR_THRESHOLD_MODE;
buffer_profile_attrs[1].value.u32 = SAI_BUFFER_PROFILE_THRESHOLD_MODE_DYNAMIC;

buffer_profile_attrs[2].id = SAI_BUFFER_PROFILE_ATTR_SHARED_DYNAMIC_TH;
buffer_profile_attrs[2].value.s8 = -8;

buffer_profile_attrs[3].id = SAI_BUFFER_PROFILE_ATTR_RESERVED_BUFFER_SIZE;
buffer_profile_attrs[3].value.u64 = 6755399441055744;

status = m_sairedis->create(SAI_OBJECT_TYPE_BUFFER_PROFILE, &buffer_profile, switchId,
static_cast<uint32_t>(buffer_profile_attrs.size()), buffer_profile_attrs.data());
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// Priority group configuration

attrs[0].id = SAI_PORT_ATTR_NUMBER_OF_INGRESS_PRIORITY_GROUPS;
status = m_sairedis->get(SAI_OBJECT_TYPE_PORT, portOids[0], 1, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

pgs.resize(attrs[0].value.u32);

attrs[0].id = SAI_PORT_ATTR_INGRESS_PRIORITY_GROUP_LIST;
attrs[0].value.objlist.count = static_cast<uint32_t>(pgs.oids.size());
attrs[0].value.objlist.list = pgs.oids.data();

status = m_sairedis->get(SAI_OBJECT_TYPE_PORT, portOids[0], 1, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

for (size_t i = 0; i < pgs.oids.size(); i++)
{
pgs.attrs[i].id = SAI_INGRESS_PRIORITY_GROUP_ATTR_BUFFER_PROFILE;
pgs.attrs[i].value.oid = buffer_profile;
}

status = m_sairedis->bulkSet(SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, static_cast<uint32_t>(pgs.oids.size()), pgs.oids.data(),
pgs.attrs.data(), SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, pgs.statuses.data());
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

for (size_t i = 0; i < pgs.oids.size(); i++)
{
ASSERT_EQ(pgs.statuses[i], SAI_STATUS_SUCCESS);
}
}

TEST_F(SyncdBrcmTest, bulkSetInInitViewForUnsupportedObjects)
{
sai_object_id_t switchId;
sai_attribute_t attrs[1];

// init view

attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;

auto status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// create switch

attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH;
attrs[0].value.booldata = true;

status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// apply view

attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_APPLY_VIEW;

status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// init view

attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;

status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

// create switch

attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH;
attrs[0].value.booldata = true;

status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs);
ASSERT_EQ(status, SAI_STATUS_SUCCESS);

attrs[0].id = SAI_SWITCH_ATTR_UNINIT_DATA_PLANE_ON_REMOVAL;
attrs[0].value.booldata = true;

sai_object_id_t oids[1] = {switchId};
sai_status_t statuses[1] = {SAI_STATUS_NOT_EXECUTED};

ASSERT_THROW(m_sairedis->bulkSet(SAI_OBJECT_TYPE_SWITCH, 1, oids, attrs,
SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses), std::runtime_error);
}

0 comments on commit 6188358

Please sign in to comment.