Skip to content

Commit 6f1925e

Browse files
abanu-msTACappleman
authored andcommitted
[cbf] Add Class Based Forwarding support
* Added support for MAP_LIST serialization and deserialization * Added a UT to validate the changes * Add NHG map API implementation * Add VS object availability for NHG maps Signed-off-by: Alexandru Banu <[email protected]>
1 parent 1148d16 commit 6f1925e

File tree

4 files changed

+167
-0
lines changed

4 files changed

+167
-0
lines changed

meta/Meta.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3417,6 +3417,7 @@ void Meta::meta_generic_validation_post_remove(
34173417
case SAI_ATTR_VALUE_TYPE_UINT32_LIST:
34183418
case SAI_ATTR_VALUE_TYPE_INT32_LIST:
34193419
case SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST:
3420+
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
34203421
case SAI_ATTR_VALUE_TYPE_IP_ADDRESS_LIST:
34213422
case SAI_ATTR_VALUE_TYPE_UINT32_RANGE:
34223423
case SAI_ATTR_VALUE_TYPE_INT32_RANGE:
@@ -4657,6 +4658,9 @@ sai_status_t Meta::meta_generic_validation_create(
46574658
case SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST:
46584659
VALIDATION_LIST(md, value.qosmap);
46594660
break;
4661+
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
4662+
VALIDATION_LIST(md, value.maplist);
4663+
break;
46604664
case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST:
46614665
VALIDATION_LIST(md, value.aclresource);
46624666
break;
@@ -5307,6 +5311,9 @@ sai_status_t Meta::meta_generic_validation_set(
53075311
case SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST:
53085312
VALIDATION_LIST(md, value.qosmap);
53095313
break;
5314+
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
5315+
VALIDATION_LIST(md, value.maplist);
5316+
break;
53105317
case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST:
53115318
VALIDATION_LIST(md, value.aclresource);
53125319
break;
@@ -5715,6 +5722,9 @@ sai_status_t Meta::meta_generic_validation_get(
57155722
case SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST:
57165723
VALIDATION_LIST(md, value.qosmap);
57175724
break;
5725+
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
5726+
VALIDATION_LIST(md, value.maplist);
5727+
break;
57185728
case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST:
57195729
VALIDATION_LIST(md, value.aclresource);
57205730
break;
@@ -5958,6 +5968,9 @@ void Meta::meta_generic_validation_post_get(
59585968
case SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST:
59595969
VALIDATION_LIST_GET(md, value.qosmap);
59605970
break;
5971+
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
5972+
VALIDATION_LIST_GET(md, value.maplist);
5973+
break;
59615974
case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST:
59625975
VALIDATION_LIST_GET(md, value.aclresource);
59635976
break;
@@ -6861,6 +6874,7 @@ void Meta::meta_generic_validation_post_create(
68616874
case SAI_ATTR_VALUE_TYPE_UINT32_LIST:
68626875
case SAI_ATTR_VALUE_TYPE_INT32_LIST:
68636876
case SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST:
6877+
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
68646878
case SAI_ATTR_VALUE_TYPE_IP_ADDRESS_LIST:
68656879
case SAI_ATTR_VALUE_TYPE_UINT32_RANGE:
68666880
case SAI_ATTR_VALUE_TYPE_INT32_RANGE:
@@ -7099,6 +7113,7 @@ void Meta::meta_generic_validation_post_set(
70997113
case SAI_ATTR_VALUE_TYPE_UINT32_LIST:
71007114
case SAI_ATTR_VALUE_TYPE_INT32_LIST:
71017115
case SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST:
7116+
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
71027117
case SAI_ATTR_VALUE_TYPE_IP_ADDRESS_LIST:
71037118
case SAI_ATTR_VALUE_TYPE_UINT32_RANGE:
71047119
case SAI_ATTR_VALUE_TYPE_INT32_RANGE:

meta/SaiSerialize.cpp

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,10 @@ sai_status_t transfer_attribute(
253253
RETURN_ON_ERROR(transfer_list(src_attr.value.qosmap, dst_attr.value.qosmap, countOnly));
254254
break;
255255

256+
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
257+
RETURN_ON_ERROR(transfer_list(src_attr.value.maplist, dst_attr.value.maplist, countOnly));
258+
break;
259+
256260
case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST:
257261
RETURN_ON_ERROR(transfer_list(src_attr.value.aclresource, dst_attr.value.aclresource, countOnly));
258262
break;
@@ -1296,6 +1300,50 @@ std::string sai_serialize_qos_map_list(
12961300
return j.dump();
12971301
}
12981302

1303+
json sai_serialize_map(
1304+
_In_ const sai_map_t &map)
1305+
{
1306+
SWSS_LOG_ENTER();
1307+
1308+
json j;
1309+
1310+
j["key"] = map.key;
1311+
j["value"] = map.value;
1312+
1313+
return j;
1314+
}
1315+
1316+
std::string sai_serialize_map_list(
1317+
_In_ const sai_map_list_t &maplist,
1318+
_In_ bool countOnly)
1319+
{
1320+
SWSS_LOG_ENTER();
1321+
1322+
json j;
1323+
1324+
j["count"] = maplist.count;
1325+
1326+
if (maplist.list == NULL || countOnly)
1327+
{
1328+
j["list"] = nullptr;
1329+
1330+
return j.dump();
1331+
}
1332+
1333+
json arr = json::array();
1334+
1335+
for (uint32_t i = 0; i < maplist.count; ++i)
1336+
{
1337+
json item = sai_serialize_map(maplist.list[i]);
1338+
1339+
arr.push_back(item);
1340+
}
1341+
1342+
j["list"] = arr;
1343+
1344+
return j.dump();
1345+
}
1346+
12991347
json sai_serialize_acl_resource(
13001348
_In_ const sai_acl_resource_t& aclresource)
13011349
{
@@ -1704,6 +1752,9 @@ std::string sai_serialize_attr_value(
17041752
case SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST:
17051753
return sai_serialize_qos_map_list(attr.value.qosmap, countOnly);
17061754

1755+
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
1756+
return sai_serialize_map_list(attr.value.maplist, countOnly);
1757+
17071758
case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST:
17081759
return sai_serialize_acl_resource_list(attr.value.aclresource, countOnly);
17091760

@@ -2516,6 +2567,16 @@ static void sai_deserialize_qos_map(
25162567
sai_deserialize_qos_map_params(j["value"], qosmap.value);
25172568
}
25182569

2570+
void sai_deserialize_map(
2571+
_In_ const json &j,
2572+
_Out_ sai_map_t &map)
2573+
{
2574+
SWSS_LOG_ENTER();
2575+
2576+
map.key = j["key"];
2577+
map.value = j["value"];
2578+
}
2579+
25192580
void sai_deserialize_qos_map_list(
25202581
_In_ const std::string& s,
25212582
_Out_ sai_qos_map_list_t& qosmap,
@@ -2555,6 +2616,45 @@ void sai_deserialize_qos_map_list(
25552616
}
25562617
}
25572618

2619+
void sai_deserialize_map_list(
2620+
_In_ const std::string &s,
2621+
_Out_ sai_map_list_t &maplist,
2622+
_In_ bool countOnly)
2623+
{
2624+
SWSS_LOG_ENTER();
2625+
2626+
json j = json::parse(s);
2627+
2628+
maplist.count = j["count"];
2629+
2630+
if (countOnly)
2631+
{
2632+
return;
2633+
}
2634+
2635+
if (j["list"] == nullptr)
2636+
{
2637+
maplist.list = NULL;
2638+
return;
2639+
}
2640+
2641+
json arr = j["list"];
2642+
2643+
if (arr.size() != (size_t)maplist.count)
2644+
{
2645+
SWSS_LOG_THROW("map list count mismatch %lu vs %u", arr.size(), maplist.count);
2646+
}
2647+
2648+
maplist.list = sai_alloc_n_of_ptr_type(maplist.count, maplist.list);
2649+
2650+
for (uint32_t i = 0; i < maplist.count; ++i)
2651+
{
2652+
const json &item = arr[i];
2653+
2654+
sai_deserialize_map(item, maplist.list[i]);
2655+
}
2656+
}
2657+
25582658
void sai_deserialize_acl_stage(
25592659
_In_ const std::string& s,
25602660
_Out_ sai_acl_stage_t& stage)
@@ -3186,6 +3286,9 @@ void sai_deserialize_attr_value(
31863286
case SAI_ATTR_VALUE_TYPE_QOS_MAP_LIST:
31873287
return sai_deserialize_qos_map_list(s, attr.value.qosmap, countOnly);
31883288

3289+
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
3290+
return sai_deserialize_map_list(s, attr.value.maplist, countOnly);
3291+
31893292
case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST:
31903293
return sai_deserialize_acl_resource_list(s, attr.value.aclresource, countOnly);
31913294

@@ -3912,6 +4015,10 @@ void sai_deserialize_free_attribute_value(
39124015
sai_free_list(attr.value.qosmap);
39134016
break;
39144017

4018+
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
4019+
sai_free_list(attr.value.maplist);
4020+
break;
4021+
39154022
case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST:
39164023
sai_free_list(attr.value.aclresource);
39174024
break;

unittest/meta/TestSaiSerialize.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,6 +1076,46 @@ TEST(SaiSerialize, serialize_qos_map)
10761076
EXPECT_EQ(l.value.fc, 2);
10771077
}
10781078

1079+
TEST(SaiSerialize, serialize_map)
1080+
{
1081+
sai_attribute_t attr;
1082+
const sai_attr_metadata_t* meta;
1083+
std::string s;
1084+
1085+
attr.id = SAI_NEXT_HOP_GROUP_MAP_ATTR_MAP_TO_VALUE_LIST;
1086+
1087+
sai_map_t map = { .key = 1, .value = 11 };
1088+
1089+
attr.value.maplist.count = 1;
1090+
attr.value.maplist.list = &map;
1091+
1092+
meta = sai_metadata_get_attr_metadata(SAI_OBJECT_TYPE_NEXT_HOP_GROUP_MAP, attr.id);
1093+
1094+
s = sai_serialize_attr_value(*meta, attr);
1095+
1096+
std::string ret = "{\"count\":1,\"list\":[{\"key\":1,\"value\":11}]}";
1097+
1098+
EXPECT_EQ(s, ret);
1099+
1100+
s = sai_serialize_attr_value(*meta, attr, true);
1101+
1102+
std::string ret2 = "{\"count\":1,\"list\":null}";
1103+
EXPECT_EQ(s, ret2);
1104+
1105+
// deserialize
1106+
1107+
memset(&attr, 0, sizeof(attr));
1108+
1109+
sai_deserialize_attr_value(ret, *meta, attr);
1110+
1111+
EXPECT_EQ(attr.value.maplist.count, 1);
1112+
1113+
auto &l = attr.value.maplist.list[0];
1114+
EXPECT_EQ(l.key, 1);
1115+
1116+
EXPECT_EQ(l.value, 11);
1117+
}
1118+
10791119
template<typename T>
10801120
static void deserialize_number(
10811121
_In_ const std::string& s,

vslib/VirtualSwitchSaiInterface.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,11 @@ sai_status_t VirtualSwitchSaiInterface::objectTypeGetAvailability(
754754
}
755755
return SAI_STATUS_SUCCESS;
756756
}
757+
else if (objectType == SAI_OBJECT_TYPE_NEXT_HOP_GROUP_MAP)
758+
{
759+
*count = 512;
760+
return SAI_STATUS_SUCCESS;
761+
}
757762

758763
return SAI_STATUS_NOT_SUPPORTED;
759764
}

0 commit comments

Comments
 (0)