Skip to content

Commit bb3ff64

Browse files
marian-pritsaklguohan
authored andcommitted
[meta]: Add support for ip prefix (sonic-net#402)
Signed-off-by: Marian Pritsak <[email protected]>
1 parent 31fd65e commit bb3ff64

File tree

2 files changed

+89
-36
lines changed

2 files changed

+89
-36
lines changed

meta/sai_meta.cpp

+42
Original file line numberDiff line numberDiff line change
@@ -1377,6 +1377,25 @@ sai_status_t meta_generic_validation_create(
13771377

13781378
break;
13791379

1380+
case SAI_ATTR_VALUE_TYPE_IP_PREFIX:
1381+
1382+
{
1383+
switch (value.ipprefix.addr_family)
1384+
{
1385+
case SAI_IP_ADDR_FAMILY_IPV4:
1386+
case SAI_IP_ADDR_FAMILY_IPV6:
1387+
break;
1388+
1389+
default:
1390+
1391+
SWSS_LOG_ERROR("invalid address family: %d", value.ipprefix.addr_family);
1392+
1393+
return SAI_STATUS_INVALID_PARAMETER;
1394+
}
1395+
1396+
break;
1397+
}
1398+
13801399
default:
13811400

13821401
META_LOG_THROW(md, "serialization type is not supported yet FIXME");
@@ -2074,6 +2093,25 @@ sai_status_t meta_generic_validation_set(
20742093

20752094
break;
20762095

2096+
case SAI_ATTR_VALUE_TYPE_IP_PREFIX:
2097+
2098+
{
2099+
switch (value.ipprefix.addr_family)
2100+
{
2101+
case SAI_IP_ADDR_FAMILY_IPV4:
2102+
case SAI_IP_ADDR_FAMILY_IPV6:
2103+
break;
2104+
2105+
default:
2106+
2107+
SWSS_LOG_ERROR("invalid address family: %d", value.ipprefix.addr_family);
2108+
2109+
return SAI_STATUS_INVALID_PARAMETER;
2110+
}
2111+
2112+
break;
2113+
}
2114+
20772115
default:
20782116

20792117
META_LOG_THROW(md, "serialization type is not supported yet FIXME");
@@ -2665,6 +2703,7 @@ void meta_generic_validation_post_create(
26652703
case SAI_ATTR_VALUE_TYPE_IPV4:
26662704
case SAI_ATTR_VALUE_TYPE_IPV6:
26672705
case SAI_ATTR_VALUE_TYPE_IP_ADDRESS:
2706+
case SAI_ATTR_VALUE_TYPE_IP_PREFIX:
26682707
case SAI_ATTR_VALUE_TYPE_POINTER:
26692708
// primitives
26702709
break;
@@ -2817,6 +2856,7 @@ void meta_generic_validation_post_remove(
28172856
case SAI_ATTR_VALUE_TYPE_IPV4:
28182857
case SAI_ATTR_VALUE_TYPE_IPV6:
28192858
case SAI_ATTR_VALUE_TYPE_IP_ADDRESS:
2859+
case SAI_ATTR_VALUE_TYPE_IP_PREFIX:
28202860
case SAI_ATTR_VALUE_TYPE_POINTER:
28212861
// primitives, ok
28222862
break;
@@ -3000,6 +3040,7 @@ void meta_generic_validation_post_set(
30003040
case SAI_ATTR_VALUE_TYPE_IPV6:
30013041
case SAI_ATTR_VALUE_TYPE_POINTER:
30023042
case SAI_ATTR_VALUE_TYPE_IP_ADDRESS:
3043+
case SAI_ATTR_VALUE_TYPE_IP_PREFIX:
30033044
// primitives, ok
30043045
break;
30053046

@@ -3333,6 +3374,7 @@ void meta_generic_validation_post_get(
33333374
case SAI_ATTR_VALUE_TYPE_IPV6:
33343375
case SAI_ATTR_VALUE_TYPE_POINTER:
33353376
case SAI_ATTR_VALUE_TYPE_IP_ADDRESS:
3377+
case SAI_ATTR_VALUE_TYPE_IP_PREFIX:
33363378
// primitives, ok
33373379
break;
33383380

meta/saiserialize.cpp

+47-36
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,10 @@ sai_status_t transfer_attribute(
191191
transfer_primitive(src_attr.value.ipaddr, dst_attr.value.ipaddr);
192192
break;
193193

194+
case SAI_ATTR_VALUE_TYPE_IP_PREFIX:
195+
transfer_primitive(src_attr.value.ipprefix, dst_attr.value.ipprefix);
196+
break;
197+
194198
case SAI_ATTR_VALUE_TYPE_OBJECT_ID:
195199
transfer_primitive(src_attr.value.oid, dst_attr.value.oid);
196200
break;
@@ -1346,6 +1350,9 @@ std::string sai_serialize_attr_value(
13461350
case SAI_ATTR_VALUE_TYPE_IP_ADDRESS:
13471351
return sai_serialize_ip_address(attr.value.ipaddr);
13481352

1353+
case SAI_ATTR_VALUE_TYPE_IP_PREFIX:
1354+
return sai_serialize_ip_prefix(attr.value.ipprefix);
1355+
13491356
case SAI_ATTR_VALUE_TYPE_OBJECT_ID:
13501357
return sai_serialize_object_id(attr.value.oid);
13511358

@@ -2102,6 +2109,42 @@ void sai_deserialize_ip_address(
21022109
SWSS_LOG_THROW("invalid ip address %s", s.c_str());
21032110
}
21042111

2112+
void sai_deserialize_ip_prefix(
2113+
_In_ const std::string &s,
2114+
_Out_ sai_ip_prefix_t &ip_prefix)
2115+
{
2116+
SWSS_LOG_ENTER();
2117+
2118+
auto tokens = swss::tokenize(s, '/');
2119+
2120+
if (tokens.size() != 2)
2121+
{
2122+
SWSS_LOG_THROW("invalid ip prefix %s", s.c_str());
2123+
}
2124+
2125+
uint8_t mask;
2126+
sai_deserialize_number(tokens[1], mask);
2127+
2128+
const std::string &ip = tokens[0];
2129+
2130+
if (inet_pton(AF_INET, ip.c_str(), &ip_prefix.addr.ip4) == 1)
2131+
{
2132+
ip_prefix.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
2133+
2134+
sai_populate_ip_mask(mask, (uint8_t*)&ip_prefix.mask.ip4, false);
2135+
}
2136+
else if (inet_pton(AF_INET6, ip.c_str(), ip_prefix.addr.ip6) == 1)
2137+
{
2138+
ip_prefix.addr_family = SAI_IP_ADDR_FAMILY_IPV6;
2139+
2140+
sai_populate_ip_mask(mask, ip_prefix.mask.ip6, true);
2141+
}
2142+
else
2143+
{
2144+
SWSS_LOG_THROW("invalid ip prefix %s", s.c_str());
2145+
}
2146+
}
2147+
21052148
void sai_deserialize_ip_address_list(
21062149
_In_ const std::string& s,
21072150
_Out_ sai_ip_address_list_t& list,
@@ -2341,6 +2384,9 @@ void sai_deserialize_attr_value(
23412384
case SAI_ATTR_VALUE_TYPE_IP_ADDRESS:
23422385
return sai_deserialize_ip_address(s, attr.value.ipaddr);
23432386

2387+
case SAI_ATTR_VALUE_TYPE_IP_PREFIX:
2388+
return sai_deserialize_ip_prefix(s, attr.value.ipprefix);
2389+
23442390
case SAI_ATTR_VALUE_TYPE_OBJECT_ID:
23452391
return sai_deserialize_object_id(s, attr.value.oid);
23462392

@@ -2421,42 +2467,6 @@ void sai_deserialize_attr_value(
24212467
}
24222468
}
24232469

2424-
void sai_deserialize_ip_prefix(
2425-
_In_ const std::string &s,
2426-
_Out_ sai_ip_prefix_t &ip_prefix)
2427-
{
2428-
SWSS_LOG_ENTER();
2429-
2430-
auto tokens = swss::tokenize(s, '/');
2431-
2432-
if (tokens.size() != 2)
2433-
{
2434-
SWSS_LOG_THROW("invalid ip prefix %s", s.c_str());
2435-
}
2436-
2437-
uint8_t mask;
2438-
sai_deserialize_number(tokens[1], mask);
2439-
2440-
const std::string &ip = tokens[0];
2441-
2442-
if (inet_pton(AF_INET, ip.c_str(), &ip_prefix.addr.ip4) == 1)
2443-
{
2444-
ip_prefix.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
2445-
2446-
sai_populate_ip_mask(mask, (uint8_t*)&ip_prefix.mask.ip4, false);
2447-
}
2448-
else if (inet_pton(AF_INET6, ip.c_str(), ip_prefix.addr.ip6) == 1)
2449-
{
2450-
ip_prefix.addr_family = SAI_IP_ADDR_FAMILY_IPV6;
2451-
2452-
sai_populate_ip_mask(mask, ip_prefix.mask.ip6, true);
2453-
}
2454-
else
2455-
{
2456-
SWSS_LOG_THROW("invalid ip prefix %s", s.c_str());
2457-
}
2458-
}
2459-
24602470
void sai_deserialize_status(
24612471
_In_ const std::string& s,
24622472
_Out_ sai_status_t& status)
@@ -2778,6 +2788,7 @@ void sai_deserialize_free_attribute_value(
27782788
case SAI_ATTR_VALUE_TYPE_IPV6:
27792789
case SAI_ATTR_VALUE_TYPE_POINTER:
27802790
case SAI_ATTR_VALUE_TYPE_IP_ADDRESS:
2791+
case SAI_ATTR_VALUE_TYPE_IP_PREFIX:
27812792
case SAI_ATTR_VALUE_TYPE_OBJECT_ID:
27822793
break;
27832794

0 commit comments

Comments
 (0)