diff --git a/meta/SaiSerialize.cpp b/meta/SaiSerialize.cpp index a556dc0190..e514e575ab 100644 --- a/meta/SaiSerialize.cpp +++ b/meta/SaiSerialize.cpp @@ -3626,6 +3626,24 @@ std::string sai_serialize_macsec_post_status_ntf( return j.dump(); } +// serialize OTN + +std::string sai_serialize_otn_attenuator_attr( + _In_ const sai_otn_attenuator_attr_t attr) +{ + SWSS_LOG_ENTER(); + + return sai_serialize_enum(attr, &sai_metadata_enum_sai_otn_attenuator_attr_t); +} + +std::string sai_serialize_otn_oa_attr( + _In_ const sai_otn_oa_attr_t attr) +{ + SWSS_LOG_ENTER(); + + return sai_serialize_enum(attr, &sai_metadata_enum_sai_otn_oa_attr_t); +} + // deserialize void sai_deserialize_bool( @@ -7213,3 +7231,23 @@ void sai_deserialize_macsec_post_status_ntf( sai_deserialize_macsec_post_status(j["macsec_post_status"], macsec_post_status); } + +// deserialize OTN + +void sai_deserialize_otn_attenuator_attr( + _In_ const std::string& s, + _Out_ sai_otn_attenuator_attr_t& attr) +{ + SWSS_LOG_ENTER(); + + sai_deserialize_enum(s, &sai_metadata_enum_sai_otn_attenuator_attr_t, (int32_t&)attr); +} + +void sai_deserialize_otn_oa_attr( + _In_ const std::string& s, + _Out_ sai_otn_oa_attr_t& attr) +{ + SWSS_LOG_ENTER(); + + sai_deserialize_enum(s, &sai_metadata_enum_sai_otn_oa_attr_t, (int32_t&)attr); +} diff --git a/meta/sai_serialize.h b/meta/sai_serialize.h index 2a9ec67363..49481bbc07 100644 --- a/meta/sai_serialize.h +++ b/meta/sai_serialize.h @@ -415,6 +415,11 @@ std::string sai_serialize_macsec_post_status_ntf( _In_ sai_object_id_t macsec_id, _In_ const sai_macsec_post_status_t macsec_post_status); +// serialize OTN +std::string sai_serialize_otn_attenuator_attr(_In_ const sai_otn_attenuator_attr_t attr); + +std::string sai_serialize_otn_oa_attr(_In_ const sai_otn_oa_attr_t attr); + // deserialize void sai_deserialize_enum( @@ -820,3 +825,12 @@ void sai_deserialize_macsec_post_status_ntf( _In_ const std::string& s, _Out_ sai_object_id_t& macsec_id, _Out_ sai_macsec_post_status_t& macsec_post_status); + +// deserialize OTN +void sai_deserialize_otn_attenuator_attr( + _In_ const std::string& s, + _Out_ sai_otn_attenuator_attr_t& attr); + +void sai_deserialize_otn_oa_attr( + _In_ const std::string& s, + _Out_ sai_otn_oa_attr_t& attr); diff --git a/syncd/FlexCounter.cpp b/syncd/FlexCounter.cpp index 948c0b2b40..5b03a9a181 100644 --- a/syncd/FlexCounter.cpp +++ b/syncd/FlexCounter.cpp @@ -49,6 +49,8 @@ static const std::string ATTR_TYPE_MACSEC_SA = "MACSEC SA Attribute"; static const std::string ATTR_TYPE_ACL_COUNTER = "ACL Counter Attribute"; static const std::string COUNTER_TYPE_WRED_ECN_QUEUE = "WRED Queue Counter"; static const std::string COUNTER_TYPE_WRED_ECN_PORT = "WRED Port Counter"; +static const std::string ATTR_TYPE_OTN_ATTENUATOR_ATTR = "OTN Attenuator Attributes"; +static const std::string ATTR_TYPE_OTN_OA_ATTR = "OTN OA Attributes"; static const std::unordered_map statusMap = { @@ -71,7 +73,10 @@ const std::map FlexCounter::m_plugIn2CounterType = { {TUNNEL_PLUGIN_FIELD, COUNTER_TYPE_TUNNEL}, {FLOW_COUNTER_PLUGIN_FIELD, COUNTER_TYPE_FLOW}, {WRED_QUEUE_PLUGIN_FIELD, COUNTER_TYPE_WRED_ECN_QUEUE}, - {WRED_PORT_PLUGIN_FIELD, COUNTER_TYPE_WRED_ECN_PORT}}; + {WRED_PORT_PLUGIN_FIELD, COUNTER_TYPE_WRED_ECN_PORT}, + {OTN_ATTENUATOR_PLUGIN_FIELD, ATTR_TYPE_OTN_ATTENUATOR_ATTR}, + {OTN_OA_PLUGIN_FIELD, ATTR_TYPE_OTN_OA_ATTR}, +}; const std::map, std::string> FlexCounter::m_objectTypeField2CounterType = { {{SAI_OBJECT_TYPE_PORT, PORT_COUNTER_ID_LIST}, COUNTER_TYPE_PORT}, @@ -96,6 +101,8 @@ const std::map, std::string> FlexCoun {{(sai_object_type_t)SAI_OBJECT_TYPE_ENI, DASH_METER_COUNTER_ID_LIST}, COUNTER_TYPE_METER_BUCKET}, {{SAI_OBJECT_TYPE_COUNTER, SRV6_COUNTER_ID_LIST}, COUNTER_TYPE_SRV6}, {{SAI_OBJECT_TYPE_SWITCH, SWITCH_COUNTER_ID_LIST}, COUNTER_TYPE_SWITCH}, + {{(sai_object_type_t)SAI_OBJECT_TYPE_OTN_ATTENUATOR, OTN_ATTENUATOR_ATTR_ID_LIST}, ATTR_TYPE_OTN_ATTENUATOR_ATTR}, + {{(sai_object_type_t)SAI_OBJECT_TYPE_OTN_OA, OTN_OA_ATTR_ID_LIST}, ATTR_TYPE_OTN_OA_ATTR}, }; BaseCounterContext::BaseCounterContext(const std::string &name, const std::string &instance): @@ -531,6 +538,24 @@ void deserializeAttr( sai_deserialize_port_attr(name, attr); } +template <> +void deserializeAttr( + _In_ const std::string& name, + _Out_ sai_otn_attenuator_attr_t &attr) +{ + SWSS_LOG_ENTER(); + sai_deserialize_otn_attenuator_attr(name, attr); +} + +template <> +void deserializeAttr( + _In_ const std::string& name, + _Out_ sai_otn_oa_attr_t &attr) +{ + SWSS_LOG_ENTER(); + sai_deserialize_otn_oa_attr(name, attr); +} + template class CounterContext : public BaseCounterContext { @@ -3440,6 +3465,14 @@ std::shared_ptr FlexCounter::createCounterContext( context->use_sai_stats_ext = m_vendorSai->isSwitchStatsExtSupported(); return context; } + else if (context_name == ATTR_TYPE_OTN_ATTENUATOR_ATTR) + { + return std::make_shared>(context_name, instance, (sai_object_type_t)SAI_OBJECT_TYPE_OTN_ATTENUATOR, m_vendorSai.get(), m_statsMode); + } + else if (context_name == ATTR_TYPE_OTN_OA_ATTR) + { + return std::make_shared>(context_name, instance, (sai_object_type_t)SAI_OBJECT_TYPE_OTN_OA, m_vendorSai.get(), m_statsMode); + } SWSS_LOG_THROW("Invalid counter type %s", context_name.c_str()); // GCC 8.3 requires a return value here @@ -3769,6 +3802,20 @@ void FlexCounter::removeCounter( getCounterContext(ATTR_TYPE_PORT_PHY_SERDES_ATTR)->removeObject(vid); } } + else if (objectType == (sai_object_type_t)SAI_OBJECT_TYPE_OTN_ATTENUATOR) + { + if (hasCounterContext(ATTR_TYPE_OTN_ATTENUATOR_ATTR)) + { + getCounterContext(ATTR_TYPE_OTN_ATTENUATOR_ATTR)->removeObject(vid); + } + } + else if (objectType == (sai_object_type_t)SAI_OBJECT_TYPE_OTN_OA) + { + if (hasCounterContext(ATTR_TYPE_OTN_OA_ATTR)) + { + getCounterContext(ATTR_TYPE_OTN_OA_ATTR)->removeObject(vid); + } + } else { SWSS_LOG_ERROR("Object type for removal not supported, %s", diff --git a/syncd/scripts/syncd_init_common.sh b/syncd/scripts/syncd_init_common.sh index ce3ecf6b12..f8ab78a951 100644 --- a/syncd/scripts/syncd_init_common.sh +++ b/syncd/scripts/syncd_init_common.sh @@ -705,6 +705,8 @@ config_syncd() config_syncd_pensando elif [ "$SONIC_ASIC_TYPE" == "clounix" ]; then config_syncd_clounix + elif [ "$SONIC_ASIC_TYPE" == "otn-kvm" ]; then + config_syncd_vs else echo "Unknown ASIC type $SONIC_ASIC_TYPE" exit 1 diff --git a/unittest/meta/TestSaiSerialize.cpp b/unittest/meta/TestSaiSerialize.cpp index 67dd8e61f2..f9435de88e 100644 --- a/unittest/meta/TestSaiSerialize.cpp +++ b/unittest/meta/TestSaiSerialize.cpp @@ -2527,3 +2527,29 @@ TEST(SaiDeserialize, sai_deserialize_enum) sai_deserialize_enum("SAI_STATS_MODE_READ|SAI_STATS_MODE_WRITE", emd, value); EXPECT_EQ(value, SAI_STATS_MODE_READ); } + +TEST(SaiSerialize, sai_serialize_otn_attenuator_attr) +{ + EXPECT_EQ(sai_serialize_otn_attenuator_attr(SAI_OTN_ATTENUATOR_ATTR_ATTENUATION), + "SAI_OTN_ATTENUATOR_ATTR_ATTENUATION"); +} + +TEST(SaiSerialize, sai_serialize_otn_oa_attr) +{ + EXPECT_EQ(sai_serialize_otn_oa_attr(SAI_OTN_OA_ATTR_TARGET_GAIN), + "SAI_OTN_OA_ATTR_TARGET_GAIN"); +} + +TEST(SaiSerialize, sai_deserialize_otn_attenuator_attr) +{ + sai_otn_attenuator_attr_t attr; + sai_deserialize_otn_attenuator_attr("SAI_OTN_ATTENUATOR_ATTR_ATTENUATION", attr); + EXPECT_EQ(attr, SAI_OTN_ATTENUATOR_ATTR_ATTENUATION); +} + +TEST(SaiSerialize, sai_deserialize_otn_oa_attr) +{ + sai_otn_oa_attr_t attr; + sai_deserialize_otn_oa_attr("SAI_OTN_OA_ATTR_TARGET_GAIN", attr); + EXPECT_EQ(attr, SAI_OTN_OA_ATTR_TARGET_GAIN); +} diff --git a/unittest/syncd/TestAttrVersionChecker.cpp b/unittest/syncd/TestAttrVersionChecker.cpp index f1bc91ab94..493b6566de 100644 --- a/unittest/syncd/TestAttrVersionChecker.cpp +++ b/unittest/syncd/TestAttrVersionChecker.cpp @@ -93,6 +93,7 @@ TEST(AttrVersionChecker, reset) .iscustom = false,\ .apiversion = (v),\ .nextrelease = (n),\ + .valueprecision = 0,\ };\