@@ -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+
109127FlexCounter::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+
459521void 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+
831921void 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
12401351bool 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+
17441987void 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