@@ -104,6 +104,16 @@ FlexCounter::BufferPoolCounterIds::BufferPoolCounterIds(
104
104
SWSS_LOG_ENTER ();
105
105
}
106
106
107
+ FlexCounter::MACsecSAAttrIds::MACsecSAAttrIds (
108
+ _In_ sai_object_id_t macsecSA,
109
+ _In_ const std::vector<sai_macsec_sa_attr_t > &macsecSAIds):
110
+ m_macsecSAId(macsecSA),
111
+ m_macsecSAAttrIds(macsecSAIds)
112
+ {
113
+ SWSS_LOG_ENTER ();
114
+ // empty intentionally
115
+ }
116
+
107
117
void FlexCounter::setPollInterval (
108
118
_In_ uint32_t pollInterval)
109
119
{
@@ -437,6 +447,28 @@ void FlexCounter::setPriorityGroupAttrList(
437
447
addCollectCountersHandler (PG_ATTR_ID_LIST, &FlexCounter::collectPriorityGroupAttrs);
438
448
}
439
449
450
+ void FlexCounter::setMACsecSAAttrList (
451
+ _In_ sai_object_id_t macsecSAVid,
452
+ _In_ sai_object_id_t macsecSARid,
453
+ _In_ const std::vector<sai_macsec_sa_attr_t > &attrIds)
454
+ {
455
+ SWSS_LOG_ENTER ();
456
+
457
+ auto it = m_macsecSAAttrIdsMap.find (macsecSAVid);
458
+
459
+ if (it != m_macsecSAAttrIdsMap.end ())
460
+ {
461
+ it->second ->m_macsecSAAttrIds = attrIds;
462
+ return ;
463
+ }
464
+
465
+ auto macsecSAAttrIds = std::make_shared<MACsecSAAttrIds>(macsecSARid, attrIds);
466
+
467
+ m_macsecSAAttrIdsMap.emplace (macsecSAVid, macsecSAAttrIds);
468
+
469
+ addCollectCountersHandler (MACSEC_SA_ATTR_ID_LIST, &FlexCounter::collectMACsecSAAttrs);
470
+ }
471
+
440
472
void FlexCounter::setRifCounterList (
441
473
_In_ sai_object_id_t rifVid,
442
474
_In_ sai_object_id_t rifRid,
@@ -664,6 +696,29 @@ void FlexCounter::removePriorityGroup(
664
696
}
665
697
}
666
698
699
+ void FlexCounter::removeMACsecSA (
700
+ _In_ sai_object_id_t macsecSAVid)
701
+ {
702
+ auto itr = m_macsecSAAttrIdsMap.find (macsecSAVid);
703
+
704
+ if (itr != m_macsecSAAttrIdsMap.end ())
705
+ {
706
+ m_macsecSAAttrIdsMap.erase (itr);
707
+
708
+ if (m_macsecSAAttrIdsMap.empty ())
709
+ {
710
+ removeCollectCountersHandler (MACSEC_SA_ATTR_ID_LIST);
711
+ }
712
+
713
+ }
714
+ else
715
+ {
716
+ SWSS_LOG_WARN (" Trying to remove nonexisting MACsec SA %s" ,
717
+ sai_serialize_object_id (macsecSAVid).c_str ());
718
+ }
719
+
720
+ }
721
+
667
722
void FlexCounter::removeRif (
668
723
_In_ sai_object_id_t rifVid)
669
724
{
@@ -923,7 +978,8 @@ bool FlexCounter::allIdsEmpty() const
923
978
m_portDebugCounterIdsMap.empty () &&
924
979
m_rifCounterIdsMap.empty () &&
925
980
m_bufferPoolCounterIdsMap.empty () &&
926
- m_switchDebugCounterIdsMap.empty ();
981
+ m_switchDebugCounterIdsMap.empty () &&
982
+ m_macsecSAAttrIdsMap.empty ();
927
983
}
928
984
929
985
bool FlexCounter::allPluginsEmpty () const
@@ -1367,6 +1423,57 @@ void FlexCounter::collectPriorityGroupAttrs(
1367
1423
}
1368
1424
}
1369
1425
1426
+ void FlexCounter::collectMACsecSAAttrs (
1427
+ _In_ swss::Table &countersTable)
1428
+ {
1429
+ SWSS_LOG_ENTER ();
1430
+
1431
+ // Collect attrs for every registered MACsec SA
1432
+ for (const auto &kv: m_macsecSAAttrIdsMap)
1433
+ {
1434
+ const auto &macsecSAVid = kv.first ;
1435
+ const auto &macsecSARid = kv.second ->m_macsecSAId ;
1436
+ const auto &macsecSAAttrIds = kv.second ->m_macsecSAAttrIds ;
1437
+
1438
+ std::vector<sai_attribute_t > macsecSAAttrs (macsecSAAttrIds.size ());
1439
+
1440
+ for (size_t i = 0 ; i < macsecSAAttrIds.size (); i++)
1441
+ {
1442
+ macsecSAAttrs[i].id = macsecSAAttrIds[i];
1443
+ }
1444
+
1445
+ // Get MACsec SA attr
1446
+ sai_status_t status = m_vendorSai->get (
1447
+ SAI_OBJECT_TYPE_MACSEC_SA,
1448
+ macsecSARid,
1449
+ static_cast <uint32_t >(macsecSAAttrs.size ()),
1450
+ macsecSAAttrs.data ());
1451
+
1452
+ if (status != SAI_STATUS_SUCCESS)
1453
+ {
1454
+ SWSS_LOG_WARN (
1455
+ " Failed to get attr of MACsec SA %s: %s" ,
1456
+ sai_serialize_object_id (macsecSAVid).c_str (),
1457
+ sai_serialize_status (status).c_str ());
1458
+ continue ;
1459
+ }
1460
+
1461
+ // Push all counter values to a single vector
1462
+ std::vector<swss::FieldValueTuple> values;
1463
+
1464
+ for (const auto & macsecSAAttr : macsecSAAttrs)
1465
+ {
1466
+ auto meta = sai_metadata_get_attr_metadata (SAI_OBJECT_TYPE_MACSEC_SA, macsecSAAttr.id );
1467
+ values.emplace_back (meta->attridname , sai_serialize_attr_value (*meta, macsecSAAttr));
1468
+ }
1469
+
1470
+ // Write counters to DB
1471
+ std::string macsecSAVidStr = sai_serialize_object_id (macsecSAVid);
1472
+
1473
+ countersTable.set (macsecSAVidStr, values, " " );
1474
+ }
1475
+ }
1476
+
1370
1477
void FlexCounter::collectRifCounters (
1371
1478
_In_ swss::Table &countersTable)
1372
1479
{
@@ -1988,6 +2095,10 @@ void FlexCounter::removeCounter(
1988
2095
{
1989
2096
removeSwitchDebugCounters (vid);
1990
2097
}
2098
+ else if (objectType == SAI_OBJECT_TYPE_MACSEC_SA)
2099
+ {
2100
+ removeMACsecSA (vid);
2101
+ }
1991
2102
else
1992
2103
{
1993
2104
SWSS_LOG_ERROR (" Object type for removal not supported, %s" ,
@@ -2122,6 +2233,19 @@ void FlexCounter::addCounter(
2122
2233
2123
2234
setSwitchDebugCounterList (vid, rid, switchCounterIds);
2124
2235
}
2236
+ else if (objectType == SAI_OBJECT_TYPE_MACSEC_SA && field == MACSEC_SA_ATTR_ID_LIST)
2237
+ {
2238
+ std::vector<sai_macsec_sa_attr_t > macsecSAIds;
2239
+
2240
+ for (const auto &str : idStrings)
2241
+ {
2242
+ sai_macsec_sa_attr_t attr;
2243
+ sai_deserialize_macsec_sa_attr (str, attr);
2244
+ macsecSAIds.push_back (attr);
2245
+ }
2246
+
2247
+ setMACsecSAAttrList (vid, rid, macsecSAIds);
2248
+ }
2125
2249
else if (objectType == SAI_OBJECT_TYPE_BUFFER_POOL && field == BUFFER_POOL_COUNTER_ID_LIST)
2126
2250
{
2127
2251
counterIds = idStrings;
0 commit comments