Skip to content

Commit 0b08f52

Browse files
authored
Add FlexCounter for MACsec SA (sonic-net#684)
Add FlexCounter for MACsec SA
1 parent b458e6f commit 0b08f52

File tree

4 files changed

+172
-1
lines changed

4 files changed

+172
-1
lines changed

meta/sai_serialize.h

+7
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ std::string sai_serialize_tunnel_stat(
126126
std::string sai_serialize_queue_attr(
127127
_In_ const sai_queue_attr_t attr);
128128

129+
std::string sai_serialize_macsec_sa_attr(
130+
_In_ const sai_macsec_sa_attr_t &attr);
131+
129132
std::string sai_serialize_switch_oper_status(
130133
_In_ sai_object_id_t switch_id,
131134
_In_ sai_switch_oper_status_t status);
@@ -334,6 +337,10 @@ void sai_deserialize_queue_attr(
334337
_In_ const std::string& s,
335338
_Out_ sai_queue_attr_t& attr);
336339

340+
void sai_deserialize_macsec_sa_attr(
341+
_In_ const std::string& s,
342+
_Out_ sai_macsec_sa_attr_t& attr);
343+
337344
// sairedis
338345

339346
void sai_deserialize(

meta/saiserialize.cpp

+17
Original file line numberDiff line numberDiff line change
@@ -951,6 +951,14 @@ std::string sai_serialize_queue_attr(
951951
return sai_serialize_enum(attr, &sai_metadata_enum_sai_queue_attr_t);
952952
}
953953

954+
std::string sai_serialize_macsec_sa_attr(
955+
_In_ const sai_macsec_sa_attr_t &attr)
956+
{
957+
SWSS_LOG_ENTER();
958+
959+
return sai_serialize_enum(attr, &sai_metadata_enum_sai_macsec_sa_attr_t);
960+
}
961+
954962
std::string sai_serialize_switch_oper_status(
955963
_In_ sai_object_id_t switch_id,
956964
_In_ sai_switch_oper_status_t status)
@@ -3513,6 +3521,15 @@ void sai_deserialize_queue_attr(
35133521
sai_deserialize_enum(s, &sai_metadata_enum_sai_queue_attr_t, (int32_t&)attr);
35143522
}
35153523

3524+
void sai_deserialize_macsec_sa_attr(
3525+
_In_ const std::string& s,
3526+
_Out_ sai_macsec_sa_attr_t& attr)
3527+
{
3528+
SWSS_LOG_ENTER();
3529+
3530+
sai_deserialize_enum(s, &sai_metadata_enum_sai_macsec_sa_attr_t, (int32_t&)attr);
3531+
}
3532+
35163533
// sairedis
35173534

35183535
void sai_deserialize(

syncd/FlexCounter.cpp

+125-1
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,16 @@ FlexCounter::BufferPoolCounterIds::BufferPoolCounterIds(
104104
SWSS_LOG_ENTER();
105105
}
106106

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+
107117
void FlexCounter::setPollInterval(
108118
_In_ uint32_t pollInterval)
109119
{
@@ -437,6 +447,28 @@ void FlexCounter::setPriorityGroupAttrList(
437447
addCollectCountersHandler(PG_ATTR_ID_LIST, &FlexCounter::collectPriorityGroupAttrs);
438448
}
439449

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+
440472
void FlexCounter::setRifCounterList(
441473
_In_ sai_object_id_t rifVid,
442474
_In_ sai_object_id_t rifRid,
@@ -664,6 +696,29 @@ void FlexCounter::removePriorityGroup(
664696
}
665697
}
666698

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+
667722
void FlexCounter::removeRif(
668723
_In_ sai_object_id_t rifVid)
669724
{
@@ -923,7 +978,8 @@ bool FlexCounter::allIdsEmpty() const
923978
m_portDebugCounterIdsMap.empty() &&
924979
m_rifCounterIdsMap.empty() &&
925980
m_bufferPoolCounterIdsMap.empty() &&
926-
m_switchDebugCounterIdsMap.empty();
981+
m_switchDebugCounterIdsMap.empty() &&
982+
m_macsecSAAttrIdsMap.empty();
927983
}
928984

929985
bool FlexCounter::allPluginsEmpty() const
@@ -1367,6 +1423,57 @@ void FlexCounter::collectPriorityGroupAttrs(
13671423
}
13681424
}
13691425

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+
13701477
void FlexCounter::collectRifCounters(
13711478
_In_ swss::Table &countersTable)
13721479
{
@@ -1988,6 +2095,10 @@ void FlexCounter::removeCounter(
19882095
{
19892096
removeSwitchDebugCounters(vid);
19902097
}
2098+
else if (objectType == SAI_OBJECT_TYPE_MACSEC_SA)
2099+
{
2100+
removeMACsecSA(vid);
2101+
}
19912102
else
19922103
{
19932104
SWSS_LOG_ERROR("Object type for removal not supported, %s",
@@ -2122,6 +2233,19 @@ void FlexCounter::addCounter(
21222233

21232234
setSwitchDebugCounterList(vid, rid, switchCounterIds);
21242235
}
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+
}
21252249
else if (objectType == SAI_OBJECT_TYPE_BUFFER_POOL && field == BUFFER_POOL_COUNTER_ID_LIST)
21262250
{
21272251
counterIds = idStrings;

syncd/FlexCounter.h

+23
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,9 @@ namespace syncd
110110
void removeSwitchDebugCounters(
111111
_In_ sai_object_id_t switchVid);
112112

113+
void removeMACsecSA(
114+
_In_ sai_object_id_t macsecSAVid);
115+
113116
private: // set counter list
114117

115118
void setPortCounterList(
@@ -160,6 +163,11 @@ namespace syncd
160163
_In_ sai_object_id_t priorityGroupRid,
161164
_In_ const std::vector<sai_ingress_priority_group_attr_t> &attrIds);
162165

166+
void setMACsecSAAttrList(
167+
_In_ sai_object_id_t macsecSAVid,
168+
_In_ sai_object_id_t macsecSARid,
169+
_In_ const std::vector<sai_macsec_sa_attr_t> &attrIds);
170+
163171
private: // is counter supported
164172

165173
bool isPortCounterSupported(
@@ -290,6 +298,16 @@ namespace syncd
290298
std::vector<sai_router_interface_stat_t> rifCounterIds;
291299
};
292300

301+
struct MACsecSAAttrIds
302+
{
303+
MACsecSAAttrIds(
304+
_In_ sai_object_id_t macsecSA,
305+
_In_ const std::vector<sai_macsec_sa_attr_t> &macsecSAIds);
306+
307+
sai_object_id_t m_macsecSAId;
308+
std::vector<sai_macsec_sa_attr_t> m_macsecSAAttrIds;
309+
};
310+
293311
private:
294312

295313
void collectCounters(
@@ -342,6 +360,9 @@ namespace syncd
342360
void collectPriorityGroupAttrs(
343361
_In_ swss::Table &countersTable);
344362

363+
void collectMACsecSAAttrs(
364+
_In_ swss::Table &countersTable);
365+
345366
private:
346367

347368
void addCollectCountersHandler(
@@ -380,6 +401,8 @@ namespace syncd
380401
std::map<sai_object_id_t, std::shared_ptr<QueueAttrIds>> m_queueAttrIdsMap;
381402
std::map<sai_object_id_t, std::shared_ptr<IngressPriorityGroupAttrIds>> m_priorityGroupAttrIdsMap;
382403

404+
std::map<sai_object_id_t, std::shared_ptr<MACsecSAAttrIds>> m_macsecSAAttrIdsMap;
405+
383406
private:
384407

385408
bool m_runFlexCounterThread;

0 commit comments

Comments
 (0)