Skip to content

Commit 6f1a0ea

Browse files
[FlexCounter] Add support for ACL counters (#953)
Added support for ACL counters to Flex Counter Infrastructure.
1 parent 67b3136 commit 6f1a0ea

File tree

4 files changed

+171
-2
lines changed

4 files changed

+171
-2
lines changed

meta/SaiSerialize.cpp

+17
Original file line numberDiff line numberDiff line change
@@ -1023,6 +1023,14 @@ std::string sai_serialize_macsec_sa_attr(
10231023
return sai_serialize_enum(attr, &sai_metadata_enum_sai_macsec_sa_attr_t);
10241024
}
10251025

1026+
std::string sai_serialize_acl_counter_attr(
1027+
_In_ const sai_acl_counter_attr_t &attr)
1028+
{
1029+
SWSS_LOG_ENTER();
1030+
1031+
return sai_serialize_enum(attr, &sai_metadata_enum_sai_acl_counter_attr_t);
1032+
}
1033+
10261034
std::string sai_serialize_switch_oper_status(
10271035
_In_ sai_object_id_t switch_id,
10281036
_In_ sai_switch_oper_status_t status)
@@ -4192,6 +4200,15 @@ void sai_deserialize_macsec_sa_attr(
41924200
sai_deserialize_enum(s, &sai_metadata_enum_sai_macsec_sa_attr_t, (int32_t&)attr);
41934201
}
41944202

4203+
void sai_deserialize_acl_counter_attr(
4204+
_In_ const std::string& s,
4205+
_Out_ sai_acl_counter_attr_t& attr)
4206+
{
4207+
SWSS_LOG_ENTER();
4208+
4209+
sai_deserialize_enum(s, &sai_metadata_enum_sai_acl_counter_attr_t, (int32_t&)attr);
4210+
}
4211+
41954212
// sairedis
41964213

41974214
void sai_deserialize(

meta/sai_serialize.h

+7
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,9 @@ std::string sai_serialize_hex_binary(
164164
std::string sai_serialize_macsec_sa_attr(
165165
_In_ const sai_macsec_sa_attr_t &attr);
166166

167+
std::string sai_serialize_acl_counter_attr(
168+
_In_ const sai_acl_counter_attr_t &attr);
169+
167170
std::string sai_serialize_switch_oper_status(
168171
_In_ sai_object_id_t switch_id,
169172
_In_ sai_switch_oper_status_t status);
@@ -433,6 +436,10 @@ void sai_deserialize_macsec_sa_attr(
433436
_In_ const std::string& s,
434437
_Out_ sai_macsec_sa_attr_t& attr);
435438

439+
void sai_deserialize_acl_counter_attr(
440+
_In_ const std::string& s,
441+
_Out_ sai_acl_counter_attr_t& attr);
442+
436443
// sairedis
437444

438445
void sai_deserialize(

syncd/FlexCounter.cpp

+124
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,15 @@ FlexCounter::MACsecSAAttrIds::MACsecSAAttrIds(
114114
// empty intentionally
115115
}
116116

117+
FlexCounter::AclCounterAttrIds::AclCounterAttrIds(
118+
_In_ sai_object_id_t aclCounter,
119+
_In_ const std::vector<sai_acl_counter_attr_t> &aclCounterIds):
120+
m_aclCounterId(aclCounter),
121+
m_aclCounterAttrIds(aclCounterIds)
122+
{
123+
SWSS_LOG_ENTER();
124+
}
125+
117126
FlexCounter::TunnelCounterIds::TunnelCounterIds(
118127
_In_ sai_object_id_t tunnelRid,
119128
_In_ const std::vector<sai_tunnel_stat_t> &tunnelIds):
@@ -479,6 +488,28 @@ void FlexCounter::setMACsecSAAttrList(
479488
addCollectCountersHandler(MACSEC_SA_ATTR_ID_LIST, &FlexCounter::collectMACsecSAAttrs);
480489
}
481490

491+
void FlexCounter::setAclCounterAttrList(
492+
_In_ sai_object_id_t aclCounterVid,
493+
_In_ sai_object_id_t aclCounterRid,
494+
_In_ const std::vector<sai_acl_counter_attr_t> &attrIds)
495+
{
496+
SWSS_LOG_ENTER();
497+
498+
auto it = m_aclCounterAttrIdsMap.find(aclCounterVid);
499+
500+
if (it != m_aclCounterAttrIdsMap.end())
501+
{
502+
it->second->m_aclCounterAttrIds = attrIds;
503+
return;
504+
}
505+
506+
auto aclCounterAttrIds = std::make_shared<AclCounterAttrIds>(aclCounterRid, attrIds);
507+
508+
m_aclCounterAttrIdsMap.emplace(aclCounterVid, aclCounterAttrIds);
509+
510+
addCollectCountersHandler(ACL_COUNTER_ATTR_ID_LIST, &FlexCounter::collectAclCounterAttrs);
511+
}
512+
482513
void FlexCounter::setRifCounterList(
483514
_In_ sai_object_id_t rifVid,
484515
_In_ sai_object_id_t rifRid,
@@ -770,6 +801,29 @@ void FlexCounter::removeMACsecSA(
770801
}
771802
}
772803

804+
void FlexCounter::removeAclCounter(
805+
_In_ sai_object_id_t aclCounterVid)
806+
{
807+
SWSS_LOG_ENTER();
808+
809+
auto itr = m_aclCounterAttrIdsMap.find(aclCounterVid);
810+
811+
if (itr != m_aclCounterAttrIdsMap.end())
812+
{
813+
m_aclCounterAttrIdsMap.erase(itr);
814+
815+
if (m_aclCounterAttrIdsMap.empty())
816+
{
817+
removeCollectCountersHandler(ACL_COUNTER_ATTR_ID_LIST);
818+
}
819+
}
820+
else
821+
{
822+
SWSS_LOG_WARN("Trying to remove nonexisting ACL counter %s",
823+
sai_serialize_object_id(aclCounterVid).c_str());
824+
}
825+
}
826+
773827
void FlexCounter::removeRif(
774828
_In_ sai_object_id_t rifVid)
775829
{
@@ -1075,6 +1129,7 @@ bool FlexCounter::allIdsEmpty() const
10751129
m_bufferPoolCounterIdsMap.empty() &&
10761130
m_switchDebugCounterIdsMap.empty() &&
10771131
m_macsecSAAttrIdsMap.empty() &&
1132+
m_aclCounterAttrIdsMap.empty() &&
10781133
m_tunnelCounterIdsMap.empty();
10791134
}
10801135

@@ -1588,6 +1643,58 @@ void FlexCounter::collectMACsecSAAttrs(
15881643
}
15891644
}
15901645

1646+
void FlexCounter::collectAclCounterAttrs(
1647+
_In_ swss::Table &countersTable)
1648+
{
1649+
SWSS_LOG_ENTER();
1650+
1651+
for (const auto &kv: m_aclCounterAttrIdsMap)
1652+
{
1653+
const auto &aclCounterVid = kv.first;
1654+
const auto &aclCounterRid = kv.second->m_aclCounterId;
1655+
const auto &aclCounterAttrIds = kv.second->m_aclCounterAttrIds;
1656+
1657+
std::vector<sai_attribute_t> aclCounterAttrs(aclCounterAttrIds.size());
1658+
1659+
for (size_t i = 0; i < aclCounterAttrIds.size(); i++)
1660+
{
1661+
aclCounterAttrs[i].id = aclCounterAttrIds[i];
1662+
}
1663+
1664+
sai_status_t status = m_vendorSai->get(
1665+
SAI_OBJECT_TYPE_ACL_COUNTER,
1666+
aclCounterRid,
1667+
static_cast<uint32_t>(aclCounterAttrs.size()),
1668+
aclCounterAttrs.data());
1669+
1670+
if (status != SAI_STATUS_SUCCESS)
1671+
{
1672+
SWSS_LOG_WARN(
1673+
"Failed to get attr of ACL counter %s: %s",
1674+
sai_serialize_object_id(aclCounterVid).c_str(),
1675+
sai_serialize_status(status).c_str());
1676+
continue;
1677+
}
1678+
1679+
std::vector<swss::FieldValueTuple> values;
1680+
1681+
for (const auto& aclCounterAttr : aclCounterAttrs)
1682+
{
1683+
auto meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_ACL_COUNTER, aclCounterAttr.id);
1684+
if (!meta)
1685+
{
1686+
SWSS_LOG_THROW("Failed to get metadata for SAI_OBJECT_TYPE_ACL_COUNTER");
1687+
}
1688+
values.emplace_back(meta->attridname, sai_serialize_attr_value(*meta, aclCounterAttr));
1689+
}
1690+
1691+
// Write counters to DB
1692+
auto aclCounterVidStr = sai_serialize_object_id(aclCounterVid);
1693+
1694+
countersTable.set(aclCounterVidStr, values);
1695+
}
1696+
}
1697+
15911698
void FlexCounter::collectRifCounters(
15921699
_In_ swss::Table &countersTable)
15931700
{
@@ -2607,6 +2714,10 @@ void FlexCounter::removeCounter(
26072714
{
26082715
removeMACsecSA(vid);
26092716
}
2717+
else if (objectType == SAI_OBJECT_TYPE_ACL_COUNTER)
2718+
{
2719+
removeAclCounter(vid);
2720+
}
26102721
else if (objectType == SAI_OBJECT_TYPE_TUNNEL)
26112722
{
26122723
removeTunnel(vid);
@@ -2758,6 +2869,19 @@ void FlexCounter::addCounter(
27582869

27592870
setMACsecSAAttrList(vid, rid, macsecSAIds);
27602871
}
2872+
else if (objectType == SAI_OBJECT_TYPE_ACL_COUNTER && field == ACL_COUNTER_ATTR_ID_LIST)
2873+
{
2874+
std::vector<sai_acl_counter_attr_t> aclCounterIds;
2875+
2876+
for (const auto &str : idStrings)
2877+
{
2878+
sai_acl_counter_attr_t attr{};
2879+
sai_deserialize_acl_counter_attr(str, attr);
2880+
aclCounterIds.push_back(attr);
2881+
}
2882+
2883+
setAclCounterAttrList(vid, rid, aclCounterIds);
2884+
}
27612885
else if (objectType == SAI_OBJECT_TYPE_BUFFER_POOL && field == BUFFER_POOL_COUNTER_ID_LIST)
27622886
{
27632887
counterIds = idStrings;

syncd/FlexCounter.h

+23-2
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ namespace syncd
115115
void removeMACsecSA(
116116
_In_ sai_object_id_t macsecSAVid);
117117

118+
void removeAclCounter(
119+
_In_ sai_object_id_t aclCounterVid);
120+
118121
void removeTunnel(
119122
_In_ sai_object_id_t tunnelVid);
120123

@@ -178,6 +181,11 @@ namespace syncd
178181
_In_ sai_object_id_t macsecSARid,
179182
_In_ const std::vector<sai_macsec_sa_attr_t> &attrIds);
180183

184+
void setAclCounterAttrList(
185+
_In_ sai_object_id_t aclCounterVid,
186+
_In_ sai_object_id_t aclCounterRid,
187+
_In_ const std::vector<sai_acl_counter_attr_t> &attrIds);
188+
181189
private: // is counter supported
182190

183191
bool isPortCounterSupported(
@@ -362,6 +370,16 @@ namespace syncd
362370
std::vector<sai_macsec_sa_attr_t> m_macsecSAAttrIds;
363371
};
364372

373+
struct AclCounterAttrIds
374+
{
375+
AclCounterAttrIds(
376+
_In_ sai_object_id_t aclCounter,
377+
_In_ const std::vector<sai_acl_counter_attr_t> &aclCounterIds);
378+
379+
sai_object_id_t m_aclCounterId;
380+
std::vector<sai_acl_counter_attr_t> m_aclCounterAttrIds;
381+
};
382+
365383
struct TunnelCounterIds
366384
{
367385
TunnelCounterIds(
@@ -371,6 +389,7 @@ namespace syncd
371389
sai_object_id_t m_tunnelId;
372390
std::vector<sai_tunnel_stat_t> m_tunnelCounterIds;
373391
};
392+
374393
private:
375394

376395
void collectCounters(
@@ -429,6 +448,9 @@ namespace syncd
429448
void collectMACsecSAAttrs(
430449
_In_ swss::Table &countersTable);
431450

451+
void collectAclCounterAttrs(
452+
_In_ swss::Table &countersTable);
453+
432454
private:
433455

434456
void addCollectCountersHandler(
@@ -466,11 +488,10 @@ namespace syncd
466488
std::map<sai_object_id_t, std::shared_ptr<BufferPoolCounterIds>> m_bufferPoolCounterIdsMap;
467489
std::map<sai_object_id_t, std::shared_ptr<SwitchCounterIds>> m_switchDebugCounterIdsMap;
468490
std::map<sai_object_id_t, std::shared_ptr<TunnelCounterIds>> m_tunnelCounterIdsMap;
469-
470491
std::map<sai_object_id_t, std::shared_ptr<QueueAttrIds>> m_queueAttrIdsMap;
471492
std::map<sai_object_id_t, std::shared_ptr<IngressPriorityGroupAttrIds>> m_priorityGroupAttrIdsMap;
472-
473493
std::map<sai_object_id_t, std::shared_ptr<MACsecSAAttrIds>> m_macsecSAAttrIdsMap;
494+
std::map<sai_object_id_t, std::shared_ptr<AclCounterAttrIds>> m_aclCounterAttrIdsMap;
474495

475496
private:
476497

0 commit comments

Comments
 (0)