From 8f265f7951d1aa1746aaf26f3a439fc3ab9fd4c7 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Thu, 29 Oct 2020 23:56:24 +0800 Subject: [PATCH 1/3] Add FlexCounter for MACsec SA Signed-off-by: Ze Gan --- syncd/FlexCounter.cpp | 117 +++++++++++++++++++++++++++++++++++++++++- syncd/FlexCounter.h | 23 +++++++++ 2 files changed, 139 insertions(+), 1 deletion(-) diff --git a/syncd/FlexCounter.cpp b/syncd/FlexCounter.cpp index 313fd0468..93390e285 100644 --- a/syncd/FlexCounter.cpp +++ b/syncd/FlexCounter.cpp @@ -104,6 +104,14 @@ FlexCounter::BufferPoolCounterIds::BufferPoolCounterIds( SWSS_LOG_ENTER(); } +FlexCounter::MACsecSAAttrIds::MACsecSAAttrIds( + _In_ sai_object_id_t macsecSA, + _In_ const std::vector &macsecSAIds): + m_macsecSAId(macsecSA), m_macsecSAAttrIds(macsecSAIds) +{ + SWSS_LOG_ENTER(); +} + void FlexCounter::setPollInterval( _In_ uint32_t pollInterval) { @@ -437,6 +445,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 &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(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, @@ -664,6 +694,25 @@ void FlexCounter::removePriorityGroup( } } +void FlexCounter::removeMACsecSA( + _In_ sai_object_id_t macsecSAVid) +{ + auto itr = m_macsecSAAttrIdsMap.find(macsecSAVid); + if (itr != m_macsecSAAttrIdsMap.end()) + { + m_macsecSAAttrIdsMap.erase(itr); + if (m_macsecSAAttrIdsMap.empty()) + { + 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) { @@ -923,7 +972,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 @@ -1367,6 +1417,54 @@ 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; + + std::vector macsecSAAttr(macsecSAAttrIds.size()); + + for (size_t i = 0; i < macsecSAAttrIds.size(); i++) + { + macsecSAAttr[i].id = macsecSAAttrIds[i]; + } + + // Get MACsec SA attr + sai_status_t status = m_vendorSai->get( + SAI_OBJECT_TYPE_MACSEC_SA, + macsecSARid, + static_cast(macsecSAAttr.size()), + macsecSAAttr.data()); + + if (status != SAI_STATUS_SUCCESS) + { + SWSS_LOG_WARN("Failed to get attr of MACsec SA 0x%" PRIx64 ": %d", macsecSAVid, status); + continue; + } + + // Push all counter values to a single vector + std::vector values; + + for (size_t i = 0; i != macsecSAAttrIds.size(); i++) + { + const std::string &attrName = sai_serialize_enum(macsecSAAttrIds[i], &sai_metadata_enum_sai_macsec_sa_attr_t); + auto meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_MACSEC_SA, macsecSAAttr[i].id); + values.emplace_back(attrName, sai_serialize_attr_value(*meta, macsecSAAttr[i])); + } + // Write counters to DB + std::string macsecSAVidStr = sai_serialize_object_id(macsecSAVid); + + countersTable.set(macsecSAVidStr, values, ""); + } +} + void FlexCounter::collectRifCounters( _In_ swss::Table &countersTable) { @@ -1988,6 +2086,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", @@ -2122,6 +2224,19 @@ void FlexCounter::addCounter( setSwitchDebugCounterList(vid, rid, switchCounterIds); } + else if (objectType == SAI_OBJECT_TYPE_MACSEC_SA && field == MACSEC_SA_ATTR_ID_LIST) + { + std::vector MACsecSAIds; + + for (const auto &str : idStrings) + { + int32_t attr; + sai_deserialize_enum(str, &sai_metadata_enum_sai_macsec_sa_attr_t, attr); + MACsecSAIds.push_back(static_cast(attr)); + } + + setMACsecSAAttrList(vid, rid, MACsecSAIds); + } else if (objectType == SAI_OBJECT_TYPE_BUFFER_POOL && field == BUFFER_POOL_COUNTER_ID_LIST) { counterIds = idStrings; diff --git a/syncd/FlexCounter.h b/syncd/FlexCounter.h index 3134b19a1..9123e5cee 100644 --- a/syncd/FlexCounter.h +++ b/syncd/FlexCounter.h @@ -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( @@ -160,6 +163,11 @@ namespace syncd _In_ sai_object_id_t priorityGroupRid, _In_ const std::vector &attrIds); + void setMACsecSAAttrList( + _In_ sai_object_id_t macsecSAVid, + _In_ sai_object_id_t macsecSARid, + _In_ const std::vector &attrIds); + private: // is counter supported bool isPortCounterSupported( @@ -290,6 +298,16 @@ namespace syncd std::vector rifCounterIds; }; + struct MACsecSAAttrIds + { + MACsecSAAttrIds( + _In_ sai_object_id_t macsecSA, + _In_ const std::vector &macsecSAIds); + + sai_object_id_t m_macsecSAId; + std::vector m_macsecSAAttrIds; + }; + private: void collectCounters( @@ -342,6 +360,9 @@ namespace syncd void collectPriorityGroupAttrs( _In_ swss::Table &countersTable); + void collectMACsecSAAttrs( + _In_ swss::Table &countersTable); + private: void addCollectCountersHandler( @@ -380,6 +401,8 @@ namespace syncd std::map> m_queueAttrIdsMap; std::map> m_priorityGroupAttrIdsMap; + std::map> m_macsecSAAttrIdsMap; + private: bool m_runFlexCounterThread; From 59e22b71fdea938d7923658857083ad959f0d8d3 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Sun, 1 Nov 2020 22:10:39 +0800 Subject: [PATCH 2/3] Polish code Signed-off-by: Ze Gan --- meta/sai_serialize.h | 7 +++++++ meta/saiserialize.cpp | 17 +++++++++++++++++ syncd/FlexCounter.cpp | 39 ++++++++++++++++++++++++--------------- 3 files changed, 48 insertions(+), 15 deletions(-) diff --git a/meta/sai_serialize.h b/meta/sai_serialize.h index d0dc19be4..add0f4fb0 100644 --- a/meta/sai_serialize.h +++ b/meta/sai_serialize.h @@ -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); @@ -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( diff --git a/meta/saiserialize.cpp b/meta/saiserialize.cpp index c1b6a7f8d..78238b24a 100644 --- a/meta/saiserialize.cpp +++ b/meta/saiserialize.cpp @@ -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) @@ -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( diff --git a/syncd/FlexCounter.cpp b/syncd/FlexCounter.cpp index 93390e285..4fc86b77f 100644 --- a/syncd/FlexCounter.cpp +++ b/syncd/FlexCounter.cpp @@ -107,9 +107,11 @@ FlexCounter::BufferPoolCounterIds::BufferPoolCounterIds( FlexCounter::MACsecSAAttrIds::MACsecSAAttrIds( _In_ sai_object_id_t macsecSA, _In_ const std::vector &macsecSAIds): - m_macsecSAId(macsecSA), m_macsecSAAttrIds(macsecSAIds) + m_macsecSAId(macsecSA), + m_macsecSAAttrIds(macsecSAIds) { SWSS_LOG_ENTER(); + // empty intentionally } void FlexCounter::setPollInterval( @@ -698,19 +700,23 @@ void FlexCounter::removeMACsecSA( _In_ sai_object_id_t macsecSAVid) { auto itr = m_macsecSAAttrIdsMap.find(macsecSAVid); + if (itr != m_macsecSAAttrIdsMap.end()) { m_macsecSAAttrIdsMap.erase(itr); + if (m_macsecSAAttrIdsMap.empty()) { 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( @@ -1429,35 +1435,38 @@ void FlexCounter::collectMACsecSAAttrs( const auto &macsecSARid = kv.second->m_macsecSAId; const auto &macsecSAAttrIds = kv.second->m_macsecSAAttrIds; - std::vector macsecSAAttr(macsecSAAttrIds.size()); + std::vector macsecSAAttrs(macsecSAAttrIds.size()); for (size_t i = 0; i < macsecSAAttrIds.size(); i++) { - macsecSAAttr[i].id = macsecSAAttrIds[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(macsecSAAttr.size()), - macsecSAAttr.data()); + static_cast(macsecSAAttrs.size()), + macsecSAAttrs.data()); if (status != SAI_STATUS_SUCCESS) { - SWSS_LOG_WARN("Failed to get attr of MACsec SA 0x%" PRIx64 ": %d", macsecSAVid, status); + 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 values; - for (size_t i = 0; i != macsecSAAttrIds.size(); i++) + for (const auto& macsecSAAttr : macsecSAAttrs) { - const std::string &attrName = sai_serialize_enum(macsecSAAttrIds[i], &sai_metadata_enum_sai_macsec_sa_attr_t); - auto meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_MACSEC_SA, macsecSAAttr[i].id); - values.emplace_back(attrName, sai_serialize_attr_value(*meta, macsecSAAttr[i])); + 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 std::string macsecSAVidStr = sai_serialize_object_id(macsecSAVid); @@ -2226,16 +2235,16 @@ void FlexCounter::addCounter( } else if (objectType == SAI_OBJECT_TYPE_MACSEC_SA && field == MACSEC_SA_ATTR_ID_LIST) { - std::vector MACsecSAIds; + std::vector macsecSAIds; for (const auto &str : idStrings) { - int32_t attr; - sai_deserialize_enum(str, &sai_metadata_enum_sai_macsec_sa_attr_t, attr); - MACsecSAIds.push_back(static_cast(attr)); + sai_macsec_sa_attr_t attr; + sai_deserialize_macsec_sa_attr(str.c_str(), attr); + macsecSAIds.push_back(attr); } - setMACsecSAAttrList(vid, rid, MACsecSAIds); + setMACsecSAAttrList(vid, rid, macsecSAIds); } else if (objectType == SAI_OBJECT_TYPE_BUFFER_POOL && field == BUFFER_POOL_COUNTER_ID_LIST) { From b2edbe046f940f48965e27ce29649cca8caedc4a Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Mon, 2 Nov 2020 13:11:40 +0800 Subject: [PATCH 3/3] simplify code Signed-off-by: Ze Gan --- syncd/FlexCounter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syncd/FlexCounter.cpp b/syncd/FlexCounter.cpp index 4fc86b77f..ef413bad9 100644 --- a/syncd/FlexCounter.cpp +++ b/syncd/FlexCounter.cpp @@ -2240,7 +2240,7 @@ void FlexCounter::addCounter( for (const auto &str : idStrings) { sai_macsec_sa_attr_t attr; - sai_deserialize_macsec_sa_attr(str.c_str(), attr); + sai_deserialize_macsec_sa_attr(str, attr); macsecSAIds.push_back(attr); }