From 112c5ba512ec34b1c9794d512c021c3e92e5064d Mon Sep 17 00:00:00 2001 From: link_chiang Date: Thu, 4 Aug 2022 08:02:04 +0000 Subject: [PATCH] [orchagent, SRv6]: create seglist support to set sid list type If user doesn't set the sid list type, type will be ENCAPS_RED What I did create seglist support to set sid list type Why I did it could not set different sidlist type under local testing How I verified it set different sidlist type of seg list and confirm it works under local testing Signed-off-by: link_chiang --- orchagent/srv6orch.cpp | 29 +++++++++++++++++++++++++---- orchagent/srv6orch.h | 2 +- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/orchagent/srv6orch.cpp b/orchagent/srv6orch.cpp index 3d81163b2a..7aced45d27 100644 --- a/orchagent/srv6orch.cpp +++ b/orchagent/srv6orch.cpp @@ -52,6 +52,14 @@ const map end_flavor_map = {"ua", SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_FLAVOR_PSP_AND_USD} }; +const map sidlist_type_map = +{ + {"insert", SAI_SRV6_SIDLIST_TYPE_INSERT}, + {"insert.red", SAI_SRV6_SIDLIST_TYPE_INSERT_RED}, + {"encaps", SAI_SRV6_SIDLIST_TYPE_ENCAPS}, + {"encaps.red", SAI_SRV6_SIDLIST_TYPE_ENCAPS_RED} +}; + void Srv6Orch::srv6TunnelUpdateNexthops(const string srv6_source, const NextHopKey nhkey, bool insert) { if (insert) @@ -267,7 +275,7 @@ bool Srv6Orch::srv6Nexthops(const NextHopGroupKey &nhgKey, sai_object_id_t &next return true; } -bool Srv6Orch::createUpdateSidList(const string sid_name, const string sid_list) +bool Srv6Orch::createUpdateSidList(const string sid_name, const string sid_list, const string sidlist_type) { SWSS_LOG_ENTER(); bool exists = (sid_table_.find(sid_name) != sid_table_.end()); @@ -303,7 +311,16 @@ bool Srv6Orch::createUpdateSidList(const string sid_name, const string sid_list) attributes.push_back(attr); attr.id = SAI_SRV6_SIDLIST_ATTR_TYPE; - attr.value.s32 = SAI_SRV6_SIDLIST_TYPE_ENCAPS_RED; + if (sidlist_type_map.find(sidlist_type) == sidlist_type_map.end()) + { + SWSS_LOG_INFO("Use default sidlist type: ENCAPS_RED"); + attr.value.s32 = SAI_SRV6_SIDLIST_TYPE_ENCAPS_RED; + } + else + { + SWSS_LOG_INFO("sidlist type: %s", sidlist_type.c_str()); + attr.value.s32 = sidlist_type_map.at(sidlist_type); + } attributes.push_back(attr); status = sai_srv6_api->create_srv6_sidlist(&segment_oid, gSwitchId, (uint32_t) attributes.size(), attributes.data()); if (status != SAI_STATUS_SUCCESS) @@ -365,7 +382,7 @@ void Srv6Orch::doTaskSidTable(const KeyOpFieldsValuesTuple & tuple) SWSS_LOG_ENTER(); string sid_name = kfvKey(tuple); string op = kfvOp(tuple); - string sid_list; + string sid_list, sidlist_type; for (auto i : kfvFieldsValues(tuple)) { @@ -373,10 +390,14 @@ void Srv6Orch::doTaskSidTable(const KeyOpFieldsValuesTuple & tuple) { sid_list = fvValue(i); } + if (fvField(i) == "type") + { + sidlist_type = fvValue(i); + } } if (op == SET_COMMAND) { - if (!createUpdateSidList(sid_name, sid_list)) + if (!createUpdateSidList(sid_name, sid_list, sidlist_type)) { SWSS_LOG_ERROR("Failed to process sid %s", sid_name.c_str()); } diff --git a/orchagent/srv6orch.h b/orchagent/srv6orch.h index 989737a998..e24f5e00f5 100644 --- a/orchagent/srv6orch.h +++ b/orchagent/srv6orch.h @@ -76,7 +76,7 @@ class Srv6Orch : public Orch void doTask(Consumer &consumer); void doTaskSidTable(const KeyOpFieldsValuesTuple &tuple); void doTaskMySidTable(const KeyOpFieldsValuesTuple &tuple); - bool createUpdateSidList(const string seg_name, const string ips); + bool createUpdateSidList(const string seg_name, const string ips, const string sidlist_type); bool deleteSidList(const string seg_name); bool createSrv6Tunnel(const string srv6_source); bool createSrv6Nexthop(const NextHopKey &nh);