Skip to content

Commit ecb95a8

Browse files
authored
[cbf] Add Class Based Forwarding support (#909)
1 parent 1148d16 commit ecb95a8

File tree

4 files changed

+163
-0
lines changed

4 files changed

+163
-0
lines changed

meta/Meta.cpp

+15
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

+103
Original file line numberDiff line numberDiff line change
@@ -1296,6 +1296,50 @@ std::string sai_serialize_qos_map_list(
12961296
return j.dump();
12971297
}
12981298

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

1751+
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
1752+
return sai_serialize_map_list(attr.value.maplist, countOnly);
1753+
17071754
case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST:
17081755
return sai_serialize_acl_resource_list(attr.value.aclresource, countOnly);
17091756

@@ -2516,6 +2563,16 @@ static void sai_deserialize_qos_map(
25162563
sai_deserialize_qos_map_params(j["value"], qosmap.value);
25172564
}
25182565

2566+
void sai_deserialize_map(
2567+
_In_ const json &j,
2568+
_Out_ sai_map_t &map)
2569+
{
2570+
SWSS_LOG_ENTER();
2571+
2572+
map.key = j["key"];
2573+
map.value = j["value"];
2574+
}
2575+
25192576
void sai_deserialize_qos_map_list(
25202577
_In_ const std::string& s,
25212578
_Out_ sai_qos_map_list_t& qosmap,
@@ -2555,6 +2612,45 @@ void sai_deserialize_qos_map_list(
25552612
}
25562613
}
25572614

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

3285+
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
3286+
return sai_deserialize_map_list(s, attr.value.maplist, countOnly);
3287+
31893288
case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST:
31903289
return sai_deserialize_acl_resource_list(s, attr.value.aclresource, countOnly);
31913290

@@ -3912,6 +4011,10 @@ void sai_deserialize_free_attribute_value(
39124011
sai_free_list(attr.value.qosmap);
39134012
break;
39144013

4014+
case SAI_ATTR_VALUE_TYPE_MAP_LIST:
4015+
sai_free_list(attr.value.maplist);
4016+
break;
4017+
39154018
case SAI_ATTR_VALUE_TYPE_ACL_RESOURCE_LIST:
39164019
sai_free_list(attr.value.aclresource);
39174020
break;

unittest/meta/TestSaiSerialize.cpp

+40
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

+5
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)