Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
aceb9ed
Move time stamp to time stamp table in counter database to avoid freq…
mssonicbld Apr 28, 2025
0209ab8
[FlexCounter] add support for SRv6 MySID counters (#50)
mssonicbld Apr 28, 2025
80c4309
Support auto negotiation on the VS platform to avoid error messages. …
mssonicbld May 1, 2025
87d6f46
[trim]: Add Packet Trimming to VS lib (#55)
mssonicbld May 9, 2025
3c33c26
Update codeql runs-on ubuntu version to 22.04 (#56)
mssonicbld May 9, 2025
e18530c
Update SAI version to 1.16.1 (#54)
mramezani95 May 12, 2025
613654b
[syncd] Move log set function after api initialize
mssonicbld Jun 8, 2025
9d39644
Merge pull request #61 from mssonicbld/cherry/msft-202412/1548
Pterosaur Jun 8, 2025
f21e12c
[trim]: Add Packet Trimming Port/Queue stats to VS lib (#60)
nazariig Jun 11, 2025
6b97f74
[SAI]: Update SAI to support QUERY_STATS_ST_CAPABILITY and TAM (#1573…
Pterosaur Jun 25, 2025
701a114
[TAM]: Fix TAM notification and vslib implementation (#1606) (#62)
Pterosaur Jun 25, 2025
12b21f3
[syncd] Check whether stat_st and tam_telemetry is defined (#1590) (#65)
Pterosaur Jun 25, 2025
0ae8494
[unittest ]Conditionally enable TestServerSaiMockChannel (#67)
mssonicbld Jun 30, 2025
6e75cc6
[TAM]: Add default SAI_TAM_ATTR_TELEMETRY_OBJECTS_LIST of TAM for sai…
Pterosaur Jun 30, 2025
b36d564
[trim]: Add Packet Trimming Asym DSCP to VS lib (#68)
mssonicbld Jul 3, 2025
8f50be7
Merge branch '202412' of https://github.com/Azure/sonic-sairedis.msft…
mssonicbld Jul 7, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ on:
jobs:
analyze:
name: Analyze
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
permissions:
actions: read
contents: read
Expand Down Expand Up @@ -55,11 +55,11 @@ jobs:
libzmq3-dev \
libzmq5 \
swig4.0 \
libpython2.7-dev \
libpython3-dev \
libgtest-dev \
libgmock-dev \
libboost1.71-dev \
libboost-serialization1.71-dev \
libboost-dev \
libboost-serialization-dev \
dh-exec \
doxygen \
cdbs \
Expand All @@ -69,8 +69,7 @@ jobs:
autoconf-archive \
uuid-dev \
libjansson-dev \
nlohmann-json3-dev \
python
nlohmann-json3-dev

- if: matrix.language == 'cpp'
name: Build sonic-swss-common
Expand All @@ -79,7 +78,7 @@ jobs:
git clone https://github.com/sonic-net/sonic-swss-common
pushd sonic-swss-common
./autogen.sh
dpkg-buildpackage -rfakeroot -us -uc -b -j$(nproc)
dpkg-buildpackage -rfakeroot -us -uc -b -Pnoyangmod,nopython2 -j$(nproc)
popd
dpkg-deb -x libswsscommon_${SWSSCOMMON_VER}_amd64.deb $(dirname $GITHUB_WORKSPACE)
dpkg-deb -x libswsscommon-dev_${SWSSCOMMON_VER}_amd64.deb $(dirname $GITHUB_WORKSPACE)
Expand Down
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
path = SAI
url = https://github.com/opencomputeproject/SAI.git
ignore = dirty
branch = v1.3
branch = v1.16
2 changes: 1 addition & 1 deletion SAI
Submodule SAI updated 93 files
+1 −0 .gitignore
+1 −1 Makefile
+7 −0 azure-pipelines.yml
+9 −0 custom/README.md
+85 −0 doc/ECMP/NextHopGroup_with_members.md
+164 −0 doc/Hash/SAI-Proposal-Hashing-Mechanism-for-Efficient-RoCE-Traffic-Distribution.md
+29 −0 doc/IP-Multicast/MulticastWithMembers.md
+88 −0 doc/SAI-Proposal-Global-PTP-Configuration.md
+217 −0 doc/SAI-Proposal-Hash-Algorithm-Round-Robin.md
+241 −0 doc/SAI-Proposal-Mirror-session-encap-type.md
+48 −0 doc/SAI-Proposal-Packet-Trimming.md
+425 −0 doc/SAI-Proposal-Prefix-Compression.md
+53 −0 doc/SAI_1.15.1_ReleaseNotes.md
+320 −0 doc/SyncE/SAI-Proposal-SyncE.md
+ doc/SyncE/SyncE_hardware_diagram.jpg
+391 −0 doc/TAM/SAI-TAM-enhancements.md
+22 −0 doc/custom-headers/README.md
+56 −0 doc/custom-headers/saicustom.h
+136 −0 doc/custom-headers/saicustomone.h
+67 −0 doc/custom-headers/saiportcustom.h
+57 −0 doc/custom-headers/saiswitchcustom.h
+56 −0 doc/custom-headers/saitypescustom.h
+ doc/figures/Hash_based.png
+ doc/figures/Random.png
+ doc/figures/Round_robin.png
+ doc/figures/Round_robin_with_weights.png
+ doc/figures/trim-TC.png
+621 −0 doc/tunnel/SAI-Proposal-EVPN-Multihoming.md
+ doc/tunnel/figures/sai_evpnmh_df.png
+ doc/tunnel/figures/sai_evpnmh_failover.png
+ doc/tunnel/figures/sai_evpnmh_singleactive.png
+ doc/tunnel/figures/sai_evpnmh_splithorizon.png
+ doc/tunnel/figures/sai_evpnmh_unicast.png
+1 −1 experimental/saiexperimentaldashappliance.h
+3 −0 experimental/saiexperimentaldashdirectionlookup.h
+29 −0 experimental/saiexperimentaldasheni.h
+35 −8 experimental/saiexperimentaldashflow.h
+9 −0 experimental/saiexperimentaldashha.h
+12 −0 experimental/saiexperimentaldashoutboundcatopa.h
+352 −0 experimental/saiexperimentaldashoutboundportmap.h
+376 −0 experimental/saiexperimentaldashtrustedvni.h
+217 −8 experimental/saiexperimentaldashtunnel.h
+6 −0 experimental/saiextensions.h
+63 −1 experimental/saitypesextensions.h
+8 −0 inc/sai.h
+124 −3 inc/saiacl.h
+21 −1 inc/saibfd.h
+74 −1 inc/saibridge.h
+6 −0 inc/saihash.h
+10 −3 inc/saihostif.h
+20 −0 inc/saiipmcgroup.h
+19 −0 inc/sailag.h
+11 −0 inc/saimacsec.h
+32 −0 inc/saimirror.h
+5 −2 inc/sainexthop.h
+69 −0 inc/sainexthopgroup.h
+17 −0 inc/saiobject.h
+0 −0 inc/saipoe.h
+9 −0 inc/saipolicer.h
+40 −0 inc/saiport.h
+313 −0 inc/saiprefixcompression.h
+26 −0 inc/sairouterinterface.h
+9 −0 inc/saischeduler.h
+120 −1 inc/saiswitch.h
+187 −0 inc/saisynce.h
+83 −0 inc/saitam.h
+72 −0 inc/saitypes.h
+9 −0 inc/saiudf.h
+2 −2 inc/saiversion.h
+41 −0 inc/saivlan.h
+1 −0 meta/Doxyfile
+1 −0 meta/Doxyfile.compat
+7 −5 meta/Makefile
+4 −0 meta/acronyms.txt
+1 −0 meta/ancestry.1f2bca1.history
+0 −1 meta/ancestry.825c835.history
+5 −0 meta/aspell.en.pws
+48 −0 meta/attrversion.sh
+2 −2 meta/checkancestry.sh
+1 −1 meta/checkheaders.pl
+2 −2 meta/checkstructs.sh
+10 −1 meta/gensairpc.pl
+179 −14 meta/parse.pl
+24 −4 meta/sai_rpc_frontend.cpp
+33 −0 meta/saimetadatatypes.h
+254 −15 meta/saisanitycheck.c
+1 −0 meta/structs.5f75d99.history
+0 −1 meta/structs.825c835.history
+2 −0 meta/style.pm
+2 −2 meta/templates/sai_rpc_server_helper_functions.tt
+52 −9 meta/test.pm
+19 −4 meta/utils.pm
+3 −3 test/saithriftv2/Makefile
19 changes: 14 additions & 5 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -267,11 +267,20 @@ AC_MSG_ERROR("SAI headers API version and library version mismatch")])],
CXXFLAGS="$SAVED_FLAGS"
])])

AM_COND_IF([SYNCD], [
SAVED_FLAGS="$CXXFLAGS"
CXXFLAGS="-Xlinker --no-as-needed -lsai -I$srcdir/SAI/inc -I$srcdir/SAI/experimental -I$srcdir/SAI/meta"
AC_CHECK_FUNCS(sai_bulk_object_clear_stats sai_bulk_object_get_stats)
CXXFLAGS="$SAVED_FLAGS"
AM_COND_IF([SAIVS],
[
AC_DEFINE([HAVE_SAI_BULK_OBJECT_CLEAR_STATS], [1], [])
AC_DEFINE([HAVE_SAI_BULK_OBJECT_GET_STATS], [1], [])
AC_DEFINE([HAVE_SAI_QUERY_STATS_ST_CAPABILITY], [1], [])
AC_DEFINE([HAVE_SAI_TAM_TELEMETRY_GET_DATA], [1], [])
],
[
AM_COND_IF([SYNCD], [
SAVED_FLAGS="$CXXFLAGS"
CXXFLAGS="-Xlinker --no-as-needed -lsai -I$srcdir/SAI/inc -I$srcdir/SAI/experimental -I$srcdir/SAI/meta"
AC_CHECK_FUNCS(sai_bulk_object_clear_stats sai_bulk_object_get_stats sai_query_stats_st_capability sai_tam_telemetry_get_data)
CXXFLAGS="$SAVED_FLAGS"
])
])

AC_DEFINE([SAIREDIS_GIT_REVISION],
Expand Down
104 changes: 92 additions & 12 deletions lib/ClientSai.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1060,6 +1060,58 @@ sai_status_t ClientSai::queryStatsCapability(
return waitForQueryStatsCapabilityResponse(stats_capability);
}

sai_status_t ClientSai::waitForQueryStatsCapabilityResponse(
_Inout_ sai_stat_capability_list_t* stats_capability)
{
SWSS_LOG_ENTER();

swss::KeyOpFieldsValuesTuple kco;

auto status = m_communicationChannel->wait(REDIS_ASIC_STATE_COMMAND_STATS_CAPABILITY_RESPONSE, kco);

if (status == SAI_STATUS_SUCCESS)
{
const std::vector<swss::FieldValueTuple> &values = kfvFieldsValues(kco);

if (values.size() != 3)
{
SWSS_LOG_ERROR("Invalid response from syncd: expected 3 value, received %zu", values.size());

return SAI_STATUS_FAILURE;
}

const std::string &stat_enum_str = fvValue(values[0]);
const std::string &stat_modes_str = fvValue(values[1]);
const uint32_t num_capabilities = std::stoi(fvValue(values[2]));

SWSS_LOG_DEBUG("Received payload: stat_enums = '%s', stat_modes = '%s', count = %d",
stat_enum_str.c_str(), stat_modes_str.c_str(), num_capabilities);

stats_capability->count = num_capabilities;

sai_deserialize_stats_capability_list(stats_capability, stat_enum_str, stat_modes_str);
}
else if (status == SAI_STATUS_BUFFER_OVERFLOW)
{
const std::vector<swss::FieldValueTuple> &values = kfvFieldsValues(kco);

if (values.size() != 1)
{
SWSS_LOG_ERROR("Invalid response from syncd: expected 1 value, received %zu", values.size());

return SAI_STATUS_FAILURE;
}

const uint32_t num_capabilities = std::stoi(fvValue(values[0]));

SWSS_LOG_DEBUG("Received payload: count = %u", num_capabilities);

stats_capability->count = num_capabilities;
}

return status;
}

sai_status_t ClientSai::queryStatsStCapability(
_In_ sai_object_id_t switchId,
_In_ sai_object_type_t objectType,
Expand All @@ -1078,43 +1130,71 @@ sai_status_t ClientSai::queryStatsStCapability(
return SAI_STATUS_INVALID_PARAMETER;
}

// TODO: Fix me
if (stats_capability && stats_capability->list && (stats_capability->count))
{
// clear input list, since we use serialize to transfer values
for (uint32_t idx = 0; idx < stats_capability->count; idx++)
{
stats_capability->list[idx].capability.stat_enum = 0;
stats_capability->list[idx].capability.stat_modes = 0;
stats_capability->list[idx].minimal_polling_interval = 0;
}
}

return SAI_STATUS_NOT_IMPLEMENTED;
const std::string listSize = std::to_string(stats_capability->count);

const std::vector<swss::FieldValueTuple> entry =
{
swss::FieldValueTuple("OBJECT_TYPE", objectTypeStr),
swss::FieldValueTuple("LIST_SIZE", listSize)};

SWSS_LOG_DEBUG(
"Query arguments: switch %s, object type: %s, count: %s",
switchIdStr.c_str(),
objectTypeStr.c_str(),
listSize.c_str());

// This query will not put any data into the ASIC view, just into the
// message queue

m_communicationChannel->set(switchIdStr, entry, REDIS_ASIC_STATE_COMMAND_STATS_ST_CAPABILITY_QUERY);

return waitForQueryStatsStCapabilityResponse(stats_capability);
}

sai_status_t ClientSai::waitForQueryStatsCapabilityResponse(
_Inout_ sai_stat_capability_list_t* stats_capability)
sai_status_t ClientSai::waitForQueryStatsStCapabilityResponse(
_Inout_ sai_stat_st_capability_list_t *stats_capability)
{
SWSS_LOG_ENTER();

swss::KeyOpFieldsValuesTuple kco;

auto status = m_communicationChannel->wait(REDIS_ASIC_STATE_COMMAND_STATS_CAPABILITY_RESPONSE, kco);
auto status = m_communicationChannel->wait(REDIS_ASIC_STATE_COMMAND_STATS_ST_CAPABILITY_RESPONSE, kco);

if (status == SAI_STATUS_SUCCESS)
{
const std::vector<swss::FieldValueTuple> &values = kfvFieldsValues(kco);

if (values.size() != 3)
if (values.size() != 4)
{
SWSS_LOG_ERROR("Invalid response from syncd: expected 3 value, received %zu", values.size());
SWSS_LOG_ERROR("Invalid response from syncd: expected 4 value, received %zu", values.size());

return SAI_STATUS_FAILURE;
}

const std::string &stat_enum_str = fvValue(values[0]);
const std::string &stat_modes_str = fvValue(values[1]);
const uint32_t num_capabilities = std::stoi(fvValue(values[2]));
const std::string &polling_interval_str = fvValue(values[2]);
const uint32_t num_capabilities = std::stoi(fvValue(values[3]));

SWSS_LOG_DEBUG("Received payload: stat_enums = '%s', stat_modes = '%s', count = %d",
stat_enum_str.c_str(), stat_modes_str.c_str(), num_capabilities);
SWSS_LOG_DEBUG("Received payload: stat_enums = '%s', stat_modes = '%s', minimal_polling_intervals = '%s' count = %d",
stat_enum_str.c_str(), stat_modes_str.c_str(), polling_interval_str.c_str(), num_capabilities);

stats_capability->count = num_capabilities;

sai_deserialize_stats_capability_list(stats_capability, stat_enum_str, stat_modes_str);
sai_deserialize_stats_st_capability_list(stats_capability, stat_enum_str, stat_modes_str, polling_interval_str);
}
else if (status == SAI_STATUS_BUFFER_OVERFLOW)
else if (status == SAI_STATUS_BUFFER_OVERFLOW)
{
const std::vector<swss::FieldValueTuple> &values = kfvFieldsValues(kco);

Expand Down
5 changes: 4 additions & 1 deletion lib/ClientSai.h
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,10 @@ namespace sairedis
sai_status_t waitForQueryStatsCapabilityResponse(
_Inout_ sai_stat_capability_list_t* stats_capability);

private:
sai_status_t waitForQueryStatsStCapabilityResponse(
_Inout_ sai_stat_st_capability_list_t *stats_capability);

private:

void handleNotification(
_In_ const std::string &name,
Expand Down
78 changes: 78 additions & 0 deletions lib/Recorder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,24 @@ void Recorder::recordQueryStatsCapabilityResponse(
recordLine("Q|stats_capability|" + sai_serialize_status(status) + "|" + arguments);
}

void Recorder::recordQueryStatsStCapability(
_In_ const std::string &key,
_In_ const std::vector<swss::FieldValueTuple> &arguments)
{
SWSS_LOG_ENTER();

recordLine("q|stats_st_capability|" + key + "|" + Globals::joinFieldValues(arguments));
}

void Recorder::recordQueryStatsStCapabilityResponse(
_In_ sai_status_t status,
_In_ const std::string &arguments)
{
SWSS_LOG_ENTER();

recordLine("Q|stats_st_capability|" + sai_serialize_status(status) + "|" + arguments);
}

void Recorder::recordNotifySyncd(
_In_ const std::string& key)
{
Expand Down Expand Up @@ -1217,6 +1235,66 @@ void Recorder::recordQueryStatsCapabilityResponse(
recordQueryStatsCapabilityResponse(status, str_stats_list);
}

void Recorder::recordQueryStatsStCapability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_Inout_ sai_stat_st_capability_list_t *stats_capability)
{
SWSS_LOG_ENTER();

auto key = sai_serialize_object_type(SAI_OBJECT_TYPE_SWITCH) + ":" + sai_serialize_object_id(switch_id);

auto object_type_str = sai_serialize_object_type(object_type);
const std::string list_size = std::to_string(stats_capability->count);
const std::vector<swss::FieldValueTuple> values =
{
swss::FieldValueTuple("OBJECT_TYPE", object_type_str),
swss::FieldValueTuple("LIST_SIZE", list_size)};

SWSS_LOG_DEBUG("Query arguments: switch %s, object_type: %s, count: %s",
key.c_str(),
object_type_str.c_str(),
list_size.c_str());

recordQueryStatsStCapability(key, values);
}

void Recorder::recordQueryStatsStCapabilityResponse(
_In_ sai_status_t status,
_In_ sai_object_type_t objectType,
_In_ const sai_stat_st_capability_list_t *stats_capability)
{
SWSS_LOG_ENTER();

std::string str_stats_list;

auto meta = sai_metadata_get_object_type_info(objectType);

if (meta == NULL)
{
SWSS_LOG_ERROR("Failed to find object metadata: object type %s",
sai_serialize_object_type(objectType).c_str());

return;
}

if (meta->statenum == NULL)
{
SWSS_LOG_ERROR("%s does not support stats", meta->objecttypename);

return;
}

bool countOnly = (status == SAI_STATUS_BUFFER_OVERFLOW);

if (status == SAI_STATUS_SUCCESS || status == SAI_STATUS_BUFFER_OVERFLOW)
{
str_stats_list = sai_serialize_stats_st_capability_list(*stats_capability, meta->statenum, countOnly);
}

recordQueryStatsStCapabilityResponse(status, str_stats_list);
}

void Recorder::recordNotifySyncd(
_In_ sai_object_id_t switchId,
_In_ sai_redis_notify_syncd_t redisNotifySyncd)
Expand Down
20 changes: 19 additions & 1 deletion lib/Recorder.h
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,16 @@ namespace sairedis
_In_ sai_object_type_t objectType,
_In_ const sai_stat_capability_list_t *stats_capability);

void recordQueryStatsStCapability(
_In_ sai_object_id_t switch_id,
_In_ sai_object_type_t object_type,
_Inout_ sai_stat_st_capability_list_t *stats_capability);

void recordQueryStatsStCapabilityResponse(
_In_ sai_status_t status,
_In_ sai_object_type_t objectType,
_In_ const sai_stat_st_capability_list_t *stats_capability);

// TODO move to private
void recordQueryAttributeCapability(
_In_ const std::string& key,
Expand Down Expand Up @@ -349,7 +359,15 @@ namespace sairedis
_In_ sai_status_t status,
_In_ const std::string& arguments);

public: // SAI notifications
void recordQueryStatsStCapability(
_In_ const std::string &key,
_In_ const std::vector<swss::FieldValueTuple> &arguments);

void recordQueryStatsStCapabilityResponse(
_In_ sai_status_t status,
_In_ const std::string &arguments);

public: // SAI notifications

void recordNotification(
_In_ const std::string &name,
Expand Down
Loading
Loading