Skip to content

Commit 323b89b

Browse files
authored
Support for MACsec statistics (sonic-net#892)
1 parent 26a8a12 commit 323b89b

File tree

7 files changed

+492
-9
lines changed

7 files changed

+492
-9
lines changed

meta/SaiSerialize.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,6 +1023,22 @@ std::string sai_serialize_queue_attr(
10231023
return sai_serialize_enum(attr, &sai_metadata_enum_sai_queue_attr_t);
10241024
}
10251025

1026+
std::string sai_serialize_macsec_flow_stat(
1027+
_In_ const sai_macsec_flow_stat_t counter)
1028+
{
1029+
SWSS_LOG_ENTER();
1030+
1031+
return sai_serialize_enum(counter, &sai_metadata_enum_sai_macsec_flow_stat_t);
1032+
}
1033+
1034+
std::string sai_serialize_macsec_sa_stat(
1035+
_In_ const sai_macsec_sa_stat_t counter)
1036+
{
1037+
SWSS_LOG_ENTER();
1038+
1039+
return sai_serialize_enum(counter, &sai_metadata_enum_sai_macsec_sa_stat_t);
1040+
}
1041+
10261042
std::string sai_serialize_macsec_sa_attr(
10271043
_In_ const sai_macsec_sa_attr_t &attr)
10281044
{

meta/sai_serialize.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,12 @@ std::string sai_serialize_hex_binary(
164164
return sai_serialize_hex_binary(&value, sizeof(T));
165165
}
166166

167+
std::string sai_serialize_macsec_flow_stat(
168+
_In_ const sai_macsec_flow_stat_t counter);
169+
170+
std::string sai_serialize_macsec_sa_stat(
171+
_In_ const sai_macsec_sa_stat_t counter);
172+
167173
std::string sai_serialize_macsec_sa_attr(
168174
_In_ const sai_macsec_sa_attr_t &attr);
169175

syncd/FlexCounter.cpp

Lines changed: 282 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,24 @@ FlexCounter::BufferPoolCounterIds::BufferPoolCounterIds(
106106
SWSS_LOG_ENTER();
107107
}
108108

109+
FlexCounter::MACsecFlowCounterIds::MACsecFlowCounterIds(
110+
_In_ sai_object_id_t macsecFlow,
111+
_In_ const std::vector<sai_macsec_flow_stat_t> &macsecFlowIds):
112+
m_macsecFlowId(macsecFlow),
113+
m_macsecFlowCounterIds(macsecFlowIds)
114+
{
115+
SWSS_LOG_ENTER();
116+
}
117+
118+
FlexCounter::MACsecSACounterIds::MACsecSACounterIds(
119+
_In_ sai_object_id_t macsecSA,
120+
_In_ const std::vector<sai_macsec_sa_stat_t> &macsecSAIds):
121+
m_macsecSAId(macsecSA),
122+
m_macsecSACounterIds(macsecSAIds)
123+
{
124+
SWSS_LOG_ENTER();
125+
}
126+
109127
FlexCounter::MACsecSAAttrIds::MACsecSAAttrIds(
110128
_In_ sai_object_id_t macsecSA,
111129
_In_ const std::vector<sai_macsec_sa_attr_t> &macsecSAIds):
@@ -456,6 +474,50 @@ void FlexCounter::setSwitchDebugCounterList(
456474
addCollectCountersHandler(SWITCH_DEBUG_COUNTER_ID_LIST, &FlexCounter::collectSwitchDebugCounters);
457475
}
458476

477+
void FlexCounter::setMACsecFlowCounterList(
478+
_In_ sai_object_id_t macsecFlowVid,
479+
_In_ sai_object_id_t macsecFlowRid,
480+
_In_ const std::vector<sai_macsec_flow_stat_t> &counterIds)
481+
{
482+
SWSS_LOG_ENTER();
483+
484+
auto it = m_macsecFlowCounterIdsMap.find(macsecFlowVid);
485+
486+
if (it != m_macsecFlowCounterIdsMap.end())
487+
{
488+
it->second->m_macsecFlowCounterIds = counterIds;
489+
return;
490+
}
491+
492+
auto macsecFlowCounterIds = std::make_shared<MACsecFlowCounterIds>(macsecFlowRid, counterIds);
493+
494+
m_macsecFlowCounterIdsMap.emplace(macsecFlowVid, macsecFlowCounterIds);
495+
496+
addCollectCountersHandler(MACSEC_FLOW_COUNTER_ID_LIST, &FlexCounter::collectMACsecFlowCounters);
497+
}
498+
499+
void FlexCounter::setMACsecSACounterList(
500+
_In_ sai_object_id_t macsecSAVid,
501+
_In_ sai_object_id_t macsecSARid,
502+
_In_ const std::vector<sai_macsec_sa_stat_t> &counterIds)
503+
{
504+
SWSS_LOG_ENTER();
505+
506+
auto it = m_macsecSACounterIdsMap.find(macsecSAVid);
507+
508+
if (it != m_macsecSACounterIdsMap.end())
509+
{
510+
it->second->m_macsecSACounterIds = counterIds;
511+
return;
512+
}
513+
514+
auto macsecSACounterIds = std::make_shared<MACsecSACounterIds>(macsecSARid, counterIds);
515+
516+
m_macsecSACounterIdsMap.emplace(macsecSAVid, macsecSACounterIds);
517+
518+
addCollectCountersHandler(MACSEC_SA_COUNTER_ID_LIST, &FlexCounter::collectMACsecSACounters);
519+
}
520+
459521
void FlexCounter::setPriorityGroupAttrList(
460522
_In_ sai_object_id_t priorityGroupVid,
461523
_In_ sai_object_id_t priorityGroupRid,
@@ -828,23 +890,70 @@ void FlexCounter::removePriorityGroup(
828890
}
829891
}
830892

893+
void FlexCounter::removeMACsecFlow(
894+
_In_ sai_object_id_t macsecFlowVid)
895+
{
896+
SWSS_LOG_ENTER();
897+
898+
bool found = false;
899+
900+
auto counterIter = m_macsecFlowCounterIdsMap.find(macsecFlowVid);
901+
902+
if (counterIter != m_macsecFlowCounterIdsMap.end())
903+
{
904+
m_macsecFlowCounterIdsMap.erase(counterIter);
905+
906+
if (m_macsecFlowCounterIdsMap.empty())
907+
{
908+
removeCollectCountersHandler(MACSEC_FLOW_COUNTER_ID_LIST);
909+
}
910+
911+
found = true;
912+
}
913+
914+
if (!found)
915+
{
916+
SWSS_LOG_WARN("Trying to remove nonexisting MACsec Flow %s",
917+
sai_serialize_object_id(macsecFlowVid).c_str());
918+
}
919+
}
920+
831921
void FlexCounter::removeMACsecSA(
832922
_In_ sai_object_id_t macsecSAVid)
833923
{
834924
SWSS_LOG_ENTER();
835925

836-
auto itr = m_macsecSAAttrIdsMap.find(macsecSAVid);
926+
bool found = false;
927+
928+
auto counterIter = m_macsecSACounterIdsMap.find(macsecSAVid);
929+
930+
if (counterIter != m_macsecSACounterIdsMap.end())
931+
{
932+
m_macsecSACounterIdsMap.erase(counterIter);
933+
934+
if (m_macsecSACounterIdsMap.empty())
935+
{
936+
removeCollectCountersHandler(MACSEC_SA_COUNTER_ID_LIST);
937+
}
938+
939+
found = true;
940+
}
941+
942+
auto attrIter = m_macsecSAAttrIdsMap.find(macsecSAVid);
837943

838-
if (itr != m_macsecSAAttrIdsMap.end())
944+
if (attrIter != m_macsecSAAttrIdsMap.end())
839945
{
840-
m_macsecSAAttrIdsMap.erase(itr);
946+
m_macsecSAAttrIdsMap.erase(attrIter);
841947

842948
if (m_macsecSAAttrIdsMap.empty())
843949
{
844950
removeCollectCountersHandler(MACSEC_SA_ATTR_ID_LIST);
845951
}
952+
953+
found = true;
846954
}
847-
else
955+
956+
if (!found)
848957
{
849958
SWSS_LOG_WARN("Trying to remove nonexisting MACsec SA %s",
850959
sai_serialize_object_id(macsecSAVid).c_str());
@@ -1231,10 +1340,12 @@ bool FlexCounter::allIdsEmpty() const
12311340
m_rifCounterIdsMap.empty() &&
12321341
m_bufferPoolCounterIdsMap.empty() &&
12331342
m_switchDebugCounterIdsMap.empty() &&
1234-
m_macsecSAAttrIdsMap.empty() &&
12351343
m_aclCounterAttrIdsMap.empty() &&
12361344
m_tunnelCounterIdsMap.empty() &&
1237-
m_flowCounterIdsMap.empty();
1345+
m_flowCounterIdsMap.empty() &&
1346+
m_macsecFlowCounterIdsMap.empty() &&
1347+
m_macsecSACounterIdsMap.empty() &&
1348+
m_macsecSAAttrIdsMap.empty();
12381349
}
12391350

12401351
bool FlexCounter::allPluginsEmpty() const
@@ -1741,6 +1852,138 @@ void FlexCounter::collectPriorityGroupAttrs(
17411852
}
17421853
}
17431854

1855+
void FlexCounter::collectMACsecFlowCounters(
1856+
_In_ swss::Table &countersTable)
1857+
{
1858+
SWSS_LOG_ENTER();
1859+
1860+
// Collect stats for every registered MACsec Flow
1861+
for (const auto &kv: m_macsecFlowCounterIdsMap)
1862+
{
1863+
const auto &macsecFlowVid = kv.first;
1864+
const auto &macsecFlowRid = kv.second->m_macsecFlowId;
1865+
const auto &macsecFlowCounterIds = kv.second->m_macsecFlowCounterIds;
1866+
1867+
std::vector<uint64_t> macsecFlowStats(macsecFlowCounterIds.size());
1868+
1869+
// Get MACsec Flow stats
1870+
sai_status_t status = m_vendorSai->getStats(
1871+
SAI_OBJECT_TYPE_MACSEC_FLOW,
1872+
macsecFlowRid,
1873+
static_cast<uint32_t>(macsecFlowCounterIds.size()),
1874+
(const sai_stat_id_t *)macsecFlowCounterIds.data(),
1875+
macsecFlowStats.data());
1876+
1877+
if (status != SAI_STATUS_SUCCESS)
1878+
{
1879+
SWSS_LOG_ERROR(
1880+
"Failed to get stats of MACsec Flow %s: %s",
1881+
sai_serialize_object_id(macsecFlowVid).c_str(),
1882+
sai_serialize_status(status).c_str());
1883+
continue;
1884+
}
1885+
1886+
if (m_statsMode == SAI_STATS_MODE_READ_AND_CLEAR)
1887+
{
1888+
status = m_vendorSai->clearStats(
1889+
SAI_OBJECT_TYPE_MACSEC_FLOW,
1890+
macsecFlowRid,
1891+
static_cast<uint32_t>(macsecFlowCounterIds.size()),
1892+
(const sai_stat_id_t *)macsecFlowCounterIds.data());
1893+
1894+
if (status != SAI_STATUS_SUCCESS)
1895+
{
1896+
SWSS_LOG_ERROR(
1897+
"Failed to clear stats of MACsec Flow %s: %s",
1898+
sai_serialize_object_id(macsecFlowVid).c_str(),
1899+
sai_serialize_status(status).c_str());
1900+
continue;
1901+
}
1902+
}
1903+
1904+
// Push all counter values to a single vector
1905+
std::vector<swss::FieldValueTuple> values;
1906+
1907+
for (size_t i = 0; i != macsecFlowCounterIds.size(); i++)
1908+
{
1909+
const std::string &counterName = sai_serialize_macsec_flow_stat(macsecFlowCounterIds[i]);
1910+
1911+
values.emplace_back(counterName, std::to_string(macsecFlowStats[i]));
1912+
}
1913+
1914+
// Write counters to DB
1915+
std::string macsecFlowVidStr = sai_serialize_object_id(macsecFlowVid);
1916+
1917+
countersTable.set(macsecFlowVidStr, values, "");
1918+
}
1919+
}
1920+
1921+
void FlexCounter::collectMACsecSACounters(
1922+
_In_ swss::Table &countersTable)
1923+
{
1924+
SWSS_LOG_ENTER();
1925+
1926+
// Collect stats for every registered MACsec SA
1927+
for (const auto &kv: m_macsecSACounterIdsMap)
1928+
{
1929+
const auto &macsecSAVid = kv.first;
1930+
const auto &macsecSARid = kv.second->m_macsecSAId;
1931+
const auto &macsecSACounterIds = kv.second->m_macsecSACounterIds;
1932+
1933+
std::vector<uint64_t> macsecSAStats(macsecSACounterIds.size());
1934+
1935+
// Get MACsec SA stats
1936+
sai_status_t status = m_vendorSai->getStats(
1937+
SAI_OBJECT_TYPE_MACSEC_SA,
1938+
macsecSARid,
1939+
static_cast<uint32_t>(macsecSACounterIds.size()),
1940+
(const sai_stat_id_t *)macsecSACounterIds.data(),
1941+
macsecSAStats.data());
1942+
1943+
if (status != SAI_STATUS_SUCCESS)
1944+
{
1945+
SWSS_LOG_ERROR(
1946+
"Failed to get stats of MACsec SA %s: %s",
1947+
sai_serialize_object_id(macsecSAVid).c_str(),
1948+
sai_serialize_status(status).c_str());
1949+
continue;
1950+
}
1951+
1952+
if (m_statsMode == SAI_STATS_MODE_READ_AND_CLEAR)
1953+
{
1954+
status = m_vendorSai->clearStats(
1955+
SAI_OBJECT_TYPE_MACSEC_SA,
1956+
macsecSARid,
1957+
static_cast<uint32_t>(macsecSACounterIds.size()),
1958+
(const sai_stat_id_t *)macsecSACounterIds.data());
1959+
1960+
if (status != SAI_STATUS_SUCCESS)
1961+
{
1962+
SWSS_LOG_ERROR(
1963+
"Failed to clear stats of MACsec SA %s: %s",
1964+
sai_serialize_object_id(macsecSAVid).c_str(),
1965+
sai_serialize_status(status).c_str());
1966+
continue;
1967+
}
1968+
}
1969+
1970+
// Push all counter values to a single vector
1971+
std::vector<swss::FieldValueTuple> values;
1972+
1973+
for (size_t i = 0; i != macsecSACounterIds.size(); i++)
1974+
{
1975+
const std::string &counterName = sai_serialize_macsec_sa_stat(macsecSACounterIds[i]);
1976+
1977+
values.emplace_back(counterName, std::to_string(macsecSAStats[i]));
1978+
}
1979+
1980+
// Write counters to DB
1981+
std::string macsecSAVidStr = sai_serialize_object_id(macsecSAVid);
1982+
1983+
countersTable.set(macsecSAVidStr, values, "");
1984+
}
1985+
}
1986+
17441987
void FlexCounter::collectMACsecSAAttrs(
17451988
_In_ swss::Table &countersTable)
17461989
{
@@ -2907,6 +3150,10 @@ void FlexCounter::removeCounter(
29073150
{
29083151
removeSwitchDebugCounters(vid);
29093152
}
3153+
else if (objectType == SAI_OBJECT_TYPE_MACSEC_FLOW)
3154+
{
3155+
removeMACsecFlow(vid);
3156+
}
29103157
else if (objectType == SAI_OBJECT_TYPE_MACSEC_SA)
29113158
{
29123159
removeMACsecSA(vid);
@@ -3057,18 +3304,44 @@ void FlexCounter::addCounter(
30573304

30583305
setSwitchDebugCounterList(vid, rid, switchCounterIds);
30593306
}
3307+
else if (objectType == SAI_OBJECT_TYPE_MACSEC_FLOW && field == MACSEC_FLOW_COUNTER_ID_LIST)
3308+
{
3309+
std::vector<sai_macsec_flow_stat_t> macsecFlowCounterIds;
3310+
3311+
for (const auto &str : idStrings)
3312+
{
3313+
sai_macsec_flow_stat_t stat;
3314+
sai_deserialize_macsec_flow_stat(str.c_str(), &stat);
3315+
macsecFlowCounterIds.push_back(stat);
3316+
}
3317+
3318+
setMACsecFlowCounterList(vid, rid, macsecFlowCounterIds);
3319+
}
3320+
else if (objectType == SAI_OBJECT_TYPE_MACSEC_SA && field == MACSEC_SA_COUNTER_ID_LIST)
3321+
{
3322+
std::vector<sai_macsec_sa_stat_t> macsecSACounterIds;
3323+
3324+
for (const auto &str : idStrings)
3325+
{
3326+
sai_macsec_sa_stat_t stat;
3327+
sai_deserialize_macsec_sa_stat(str.c_str(), &stat);
3328+
macsecSACounterIds.push_back(stat);
3329+
}
3330+
3331+
setMACsecSACounterList(vid, rid, macsecSACounterIds);
3332+
}
30603333
else if (objectType == SAI_OBJECT_TYPE_MACSEC_SA && field == MACSEC_SA_ATTR_ID_LIST)
30613334
{
3062-
std::vector<sai_macsec_sa_attr_t> macsecSAIds;
3335+
std::vector<sai_macsec_sa_attr_t> macsecSAAttrIds;
30633336

30643337
for (const auto &str : idStrings)
30653338
{
30663339
sai_macsec_sa_attr_t attr;
30673340
sai_deserialize_macsec_sa_attr(str, attr);
3068-
macsecSAIds.push_back(attr);
3341+
macsecSAAttrIds.push_back(attr);
30693342
}
30703343

3071-
setMACsecSAAttrList(vid, rid, macsecSAIds);
3344+
setMACsecSAAttrList(vid, rid, macsecSAAttrIds);
30723345
}
30733346
else if (objectType == SAI_OBJECT_TYPE_ACL_COUNTER && field == ACL_COUNTER_ATTR_ID_LIST)
30743347
{

0 commit comments

Comments
 (0)