Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add FlexCounter for MACsec SA #684

Merged
merged 3 commits into from
Nov 2, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions meta/sai_serialize.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,9 @@ std::string sai_serialize_tunnel_stat(
std::string sai_serialize_queue_attr(
_In_ const sai_queue_attr_t attr);

std::string sai_serialize_macsec_sa_attr(
_In_ const sai_macsec_sa_attr_t &attr);

std::string sai_serialize_switch_oper_status(
_In_ sai_object_id_t switch_id,
_In_ sai_switch_oper_status_t status);
Expand Down Expand Up @@ -334,6 +337,10 @@ void sai_deserialize_queue_attr(
_In_ const std::string& s,
_Out_ sai_queue_attr_t& attr);

void sai_deserialize_macsec_sa_attr(
_In_ const std::string& s,
_Out_ sai_macsec_sa_attr_t& attr);

// sairedis

void sai_deserialize(
Expand Down
17 changes: 17 additions & 0 deletions meta/saiserialize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -951,6 +951,14 @@ std::string sai_serialize_queue_attr(
return sai_serialize_enum(attr, &sai_metadata_enum_sai_queue_attr_t);
}

std::string sai_serialize_macsec_sa_attr(
_In_ const sai_macsec_sa_attr_t &attr)
{
SWSS_LOG_ENTER();

return sai_serialize_enum(attr, &sai_metadata_enum_sai_macsec_sa_attr_t);
}

std::string sai_serialize_switch_oper_status(
_In_ sai_object_id_t switch_id,
_In_ sai_switch_oper_status_t status)
Expand Down Expand Up @@ -3513,6 +3521,15 @@ void sai_deserialize_queue_attr(
sai_deserialize_enum(s, &sai_metadata_enum_sai_queue_attr_t, (int32_t&)attr);
}

void sai_deserialize_macsec_sa_attr(
_In_ const std::string& s,
_Out_ sai_macsec_sa_attr_t& attr)
{
SWSS_LOG_ENTER();

sai_deserialize_enum(s, &sai_metadata_enum_sai_macsec_sa_attr_t, (int32_t&)attr);
}

// sairedis

void sai_deserialize(
Expand Down
126 changes: 125 additions & 1 deletion syncd/FlexCounter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,16 @@ FlexCounter::BufferPoolCounterIds::BufferPoolCounterIds(
SWSS_LOG_ENTER();
}

FlexCounter::MACsecSAAttrIds::MACsecSAAttrIds(
_In_ sai_object_id_t macsecSA,
_In_ const std::vector<sai_macsec_sa_attr_t> &macsecSAIds):
m_macsecSAId(macsecSA),
m_macsecSAAttrIds(macsecSAIds)
{
SWSS_LOG_ENTER();
// empty intentionally
}
kcudnik marked this conversation as resolved.
Show resolved Hide resolved

void FlexCounter::setPollInterval(
_In_ uint32_t pollInterval)
{
Expand Down Expand Up @@ -437,6 +447,28 @@ void FlexCounter::setPriorityGroupAttrList(
addCollectCountersHandler(PG_ATTR_ID_LIST, &FlexCounter::collectPriorityGroupAttrs);
}

void FlexCounter::setMACsecSAAttrList(
_In_ sai_object_id_t macsecSAVid,
_In_ sai_object_id_t macsecSARid,
_In_ const std::vector<sai_macsec_sa_attr_t> &attrIds)
{
SWSS_LOG_ENTER();

auto it = m_macsecSAAttrIdsMap.find(macsecSAVid);

if (it != m_macsecSAAttrIdsMap.end())
{
it->second->m_macsecSAAttrIds = attrIds;
return;
}

auto macsecSAAttrIds = std::make_shared<MACsecSAAttrIds>(macsecSARid, attrIds);

m_macsecSAAttrIdsMap.emplace(macsecSAVid, macsecSAAttrIds);

addCollectCountersHandler(MACSEC_SA_ATTR_ID_LIST, &FlexCounter::collectMACsecSAAttrs);
}

void FlexCounter::setRifCounterList(
_In_ sai_object_id_t rifVid,
_In_ sai_object_id_t rifRid,
Expand Down Expand Up @@ -664,6 +696,29 @@ void FlexCounter::removePriorityGroup(
}
}

void FlexCounter::removeMACsecSA(
_In_ sai_object_id_t macsecSAVid)
{
auto itr = m_macsecSAAttrIdsMap.find(macsecSAVid);

if (itr != m_macsecSAAttrIdsMap.end())
kcudnik marked this conversation as resolved.
Show resolved Hide resolved
{
m_macsecSAAttrIdsMap.erase(itr);

if (m_macsecSAAttrIdsMap.empty())
kcudnik marked this conversation as resolved.
Show resolved Hide resolved
{
removeCollectCountersHandler(MACSEC_SA_ATTR_ID_LIST);
}

}
else
{
SWSS_LOG_WARN("Trying to remove nonexisting MACsec SA %s",
sai_serialize_object_id(macsecSAVid).c_str());
}

}

void FlexCounter::removeRif(
_In_ sai_object_id_t rifVid)
{
Expand Down Expand Up @@ -923,7 +978,8 @@ bool FlexCounter::allIdsEmpty() const
m_portDebugCounterIdsMap.empty() &&
m_rifCounterIdsMap.empty() &&
m_bufferPoolCounterIdsMap.empty() &&
m_switchDebugCounterIdsMap.empty();
m_switchDebugCounterIdsMap.empty() &&
m_macsecSAAttrIdsMap.empty();
}

bool FlexCounter::allPluginsEmpty() const
Expand Down Expand Up @@ -1367,6 +1423,57 @@ void FlexCounter::collectPriorityGroupAttrs(
}
}

void FlexCounter::collectMACsecSAAttrs(
_In_ swss::Table &countersTable)
{
SWSS_LOG_ENTER();

// Collect attrs for every registered MACsec SA
for (const auto &kv: m_macsecSAAttrIdsMap)
{
const auto &macsecSAVid = kv.first;
const auto &macsecSARid = kv.second->m_macsecSAId;
const auto &macsecSAAttrIds = kv.second->m_macsecSAAttrIds;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is interesting, so actual id's are here as a numbers ? not as stats name strings ? i dont know how other counters are passed, but i was under impressions that those id's were passed from OA as actual stats strings and not as id number, but i maybe mistaken


std::vector<sai_attribute_t> macsecSAAttrs(macsecSAAttrIds.size());

for (size_t i = 0; i < macsecSAAttrIds.size(); i++)
{
macsecSAAttrs[i].id = macsecSAAttrIds[i];
}

// Get MACsec SA attr
sai_status_t status = m_vendorSai->get(
SAI_OBJECT_TYPE_MACSEC_SA,
macsecSARid,
static_cast<uint32_t>(macsecSAAttrs.size()),
macsecSAAttrs.data());

if (status != SAI_STATUS_SUCCESS)
{
SWSS_LOG_WARN(
"Failed to get attr of MACsec SA %s: %s",
sai_serialize_object_id(macsecSAVid).c_str(),
sai_serialize_status(status).c_str());
continue;
}

// Push all counter values to a single vector
std::vector<swss::FieldValueTuple> values;

for (const auto& macsecSAAttr : macsecSAAttrs)
{
auto meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_MACSEC_SA, macsecSAAttr.id);
values.emplace_back(meta->attridname, sai_serialize_attr_value(*meta, macsecSAAttr));
}

// Write counters to DB
kcudnik marked this conversation as resolved.
Show resolved Hide resolved
std::string macsecSAVidStr = sai_serialize_object_id(macsecSAVid);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just a note, every file uses concept of prefixing "strXXX" instead of "xxxStr", this file is exception since i didn't created this, but in other files please follow strXXX naming


countersTable.set(macsecSAVidStr, values, "");
}
}

void FlexCounter::collectRifCounters(
_In_ swss::Table &countersTable)
{
Expand Down Expand Up @@ -1988,6 +2095,10 @@ void FlexCounter::removeCounter(
{
removeSwitchDebugCounters(vid);
}
else if (objectType == SAI_OBJECT_TYPE_MACSEC_SA)
{
removeMACsecSA(vid);
}
else
{
SWSS_LOG_ERROR("Object type for removal not supported, %s",
Expand Down Expand Up @@ -2122,6 +2233,19 @@ void FlexCounter::addCounter(

setSwitchDebugCounterList(vid, rid, switchCounterIds);
}
else if (objectType == SAI_OBJECT_TYPE_MACSEC_SA && field == MACSEC_SA_ATTR_ID_LIST)
{
std::vector<sai_macsec_sa_attr_t> macsecSAIds;

for (const auto &str : idStrings)
{
sai_macsec_sa_attr_t attr;
sai_deserialize_macsec_sa_attr(str, attr);
macsecSAIds.push_back(attr);
}

setMACsecSAAttrList(vid, rid, macsecSAIds);
}
else if (objectType == SAI_OBJECT_TYPE_BUFFER_POOL && field == BUFFER_POOL_COUNTER_ID_LIST)
{
counterIds = idStrings;
Expand Down
23 changes: 23 additions & 0 deletions syncd/FlexCounter.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,9 @@ namespace syncd
void removeSwitchDebugCounters(
_In_ sai_object_id_t switchVid);

void removeMACsecSA(
_In_ sai_object_id_t macsecSAVid);

private: // set counter list

void setPortCounterList(
Expand Down Expand Up @@ -160,6 +163,11 @@ namespace syncd
_In_ sai_object_id_t priorityGroupRid,
_In_ const std::vector<sai_ingress_priority_group_attr_t> &attrIds);

void setMACsecSAAttrList(
_In_ sai_object_id_t macsecSAVid,
_In_ sai_object_id_t macsecSARid,
_In_ const std::vector<sai_macsec_sa_attr_t> &attrIds);

private: // is counter supported

bool isPortCounterSupported(
Expand Down Expand Up @@ -290,6 +298,16 @@ namespace syncd
std::vector<sai_router_interface_stat_t> rifCounterIds;
};

struct MACsecSAAttrIds
{
MACsecSAAttrIds(
_In_ sai_object_id_t macsecSA,
_In_ const std::vector<sai_macsec_sa_attr_t> &macsecSAIds);

sai_object_id_t m_macsecSAId;
std::vector<sai_macsec_sa_attr_t> m_macsecSAAttrIds;
};

private:

void collectCounters(
Expand Down Expand Up @@ -342,6 +360,9 @@ namespace syncd
void collectPriorityGroupAttrs(
_In_ swss::Table &countersTable);

void collectMACsecSAAttrs(
_In_ swss::Table &countersTable);

private:

void addCollectCountersHandler(
Expand Down Expand Up @@ -380,6 +401,8 @@ namespace syncd
std::map<sai_object_id_t, std::shared_ptr<QueueAttrIds>> m_queueAttrIdsMap;
std::map<sai_object_id_t, std::shared_ptr<IngressPriorityGroupAttrIds>> m_priorityGroupAttrIdsMap;

std::map<sai_object_id_t, std::shared_ptr<MACsecSAAttrIds>> m_macsecSAAttrIdsMap;

private:

bool m_runFlexCounterThread;
Expand Down