@@ -106,6 +106,24 @@ FlexCounter::BufferPoolCounterIds::BufferPoolCounterIds(
106
106
SWSS_LOG_ENTER ();
107
107
}
108
108
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
+
109
127
FlexCounter::MACsecSAAttrIds::MACsecSAAttrIds (
110
128
_In_ sai_object_id_t macsecSA,
111
129
_In_ const std::vector<sai_macsec_sa_attr_t > &macsecSAIds):
@@ -456,6 +474,50 @@ void FlexCounter::setSwitchDebugCounterList(
456
474
addCollectCountersHandler (SWITCH_DEBUG_COUNTER_ID_LIST, &FlexCounter::collectSwitchDebugCounters);
457
475
}
458
476
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
+
459
521
void FlexCounter::setPriorityGroupAttrList (
460
522
_In_ sai_object_id_t priorityGroupVid,
461
523
_In_ sai_object_id_t priorityGroupRid,
@@ -828,23 +890,70 @@ void FlexCounter::removePriorityGroup(
828
890
}
829
891
}
830
892
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
+
831
921
void FlexCounter::removeMACsecSA (
832
922
_In_ sai_object_id_t macsecSAVid)
833
923
{
834
924
SWSS_LOG_ENTER ();
835
925
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);
837
943
838
- if (itr != m_macsecSAAttrIdsMap.end ())
944
+ if (attrIter != m_macsecSAAttrIdsMap.end ())
839
945
{
840
- m_macsecSAAttrIdsMap.erase (itr );
946
+ m_macsecSAAttrIdsMap.erase (attrIter );
841
947
842
948
if (m_macsecSAAttrIdsMap.empty ())
843
949
{
844
950
removeCollectCountersHandler (MACSEC_SA_ATTR_ID_LIST);
845
951
}
952
+
953
+ found = true ;
846
954
}
847
- else
955
+
956
+ if (!found)
848
957
{
849
958
SWSS_LOG_WARN (" Trying to remove nonexisting MACsec SA %s" ,
850
959
sai_serialize_object_id (macsecSAVid).c_str ());
@@ -1231,10 +1340,12 @@ bool FlexCounter::allIdsEmpty() const
1231
1340
m_rifCounterIdsMap.empty () &&
1232
1341
m_bufferPoolCounterIdsMap.empty () &&
1233
1342
m_switchDebugCounterIdsMap.empty () &&
1234
- m_macsecSAAttrIdsMap.empty () &&
1235
1343
m_aclCounterAttrIdsMap.empty () &&
1236
1344
m_tunnelCounterIdsMap.empty () &&
1237
- m_flowCounterIdsMap.empty ();
1345
+ m_flowCounterIdsMap.empty () &&
1346
+ m_macsecFlowCounterIdsMap.empty () &&
1347
+ m_macsecSACounterIdsMap.empty () &&
1348
+ m_macsecSAAttrIdsMap.empty ();
1238
1349
}
1239
1350
1240
1351
bool FlexCounter::allPluginsEmpty () const
@@ -1741,6 +1852,138 @@ void FlexCounter::collectPriorityGroupAttrs(
1741
1852
}
1742
1853
}
1743
1854
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
+
1744
1987
void FlexCounter::collectMACsecSAAttrs (
1745
1988
_In_ swss::Table &countersTable)
1746
1989
{
@@ -2907,6 +3150,10 @@ void FlexCounter::removeCounter(
2907
3150
{
2908
3151
removeSwitchDebugCounters (vid);
2909
3152
}
3153
+ else if (objectType == SAI_OBJECT_TYPE_MACSEC_FLOW)
3154
+ {
3155
+ removeMACsecFlow (vid);
3156
+ }
2910
3157
else if (objectType == SAI_OBJECT_TYPE_MACSEC_SA)
2911
3158
{
2912
3159
removeMACsecSA (vid);
@@ -3057,18 +3304,44 @@ void FlexCounter::addCounter(
3057
3304
3058
3305
setSwitchDebugCounterList (vid, rid, switchCounterIds);
3059
3306
}
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
+ }
3060
3333
else if (objectType == SAI_OBJECT_TYPE_MACSEC_SA && field == MACSEC_SA_ATTR_ID_LIST)
3061
3334
{
3062
- std::vector<sai_macsec_sa_attr_t > macsecSAIds ;
3335
+ std::vector<sai_macsec_sa_attr_t > macsecSAAttrIds ;
3063
3336
3064
3337
for (const auto &str : idStrings)
3065
3338
{
3066
3339
sai_macsec_sa_attr_t attr;
3067
3340
sai_deserialize_macsec_sa_attr (str, attr);
3068
- macsecSAIds .push_back (attr);
3341
+ macsecSAAttrIds .push_back (attr);
3069
3342
}
3070
3343
3071
- setMACsecSAAttrList (vid, rid, macsecSAIds );
3344
+ setMACsecSAAttrList (vid, rid, macsecSAAttrIds );
3072
3345
}
3073
3346
else if (objectType == SAI_OBJECT_TYPE_ACL_COUNTER && field == ACL_COUNTER_ATTR_ID_LIST)
3074
3347
{
0 commit comments