Skip to content

Commit 1bd090c

Browse files
authored
Add MACsec meta methods (sonic-net#704)
Add MACsec meta methods
1 parent 3778673 commit 1bd090c

3 files changed

Lines changed: 153 additions & 0 deletions

File tree

meta/Meta.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3286,6 +3286,7 @@ void Meta::meta_generic_validation_post_remove(
32863286
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT16:
32873287
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT32:
32883288
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT32:
3289+
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT64:
32893290
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_MAC:
32903291
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV4:
32913292
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV6:
@@ -3351,6 +3352,13 @@ void Meta::meta_generic_validation_post_remove(
33513352
// no special action required
33523353
break;
33533354

3355+
case SAI_ATTR_VALUE_TYPE_MACSEC_SAK:
3356+
case SAI_ATTR_VALUE_TYPE_MACSEC_AUTH_KEY:
3357+
case SAI_ATTR_VALUE_TYPE_MACSEC_SALT:
3358+
case SAI_ATTR_VALUE_TYPE_MACSEC_SCI:
3359+
case SAI_ATTR_VALUE_TYPE_MACSEC_SSCI:
3360+
break;
3361+
33543362
case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG:
33553363
case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG_LIST:
33563364
// no special action required
@@ -4404,6 +4412,7 @@ sai_status_t Meta::meta_generic_validation_create(
44044412
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT16:
44054413
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT32:
44064414
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT32:
4415+
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT64:
44074416
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_MAC:
44084417
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV4:
44094418
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV6:
@@ -4570,6 +4579,13 @@ sai_status_t Meta::meta_generic_validation_create(
45704579
break;
45714580
}
45724581

4582+
case SAI_ATTR_VALUE_TYPE_MACSEC_SAK:
4583+
case SAI_ATTR_VALUE_TYPE_MACSEC_AUTH_KEY:
4584+
case SAI_ATTR_VALUE_TYPE_MACSEC_SALT:
4585+
case SAI_ATTR_VALUE_TYPE_MACSEC_SCI:
4586+
case SAI_ATTR_VALUE_TYPE_MACSEC_SSCI:
4587+
break;
4588+
45734589
case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG_LIST:
45744590
VALIDATION_LIST(md, value.sysportconfiglist);
45754591
break;
@@ -6645,6 +6661,7 @@ void Meta::meta_generic_validation_post_create(
66456661
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT16:
66466662
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT32:
66476663
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT32:
6664+
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT64:
66486665
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_MAC:
66496666
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV4:
66506667
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV6:
@@ -6712,6 +6729,13 @@ void Meta::meta_generic_validation_post_create(
67126729
// no special action required
67136730
break;
67146731

6732+
case SAI_ATTR_VALUE_TYPE_MACSEC_SAK:
6733+
case SAI_ATTR_VALUE_TYPE_MACSEC_AUTH_KEY:
6734+
case SAI_ATTR_VALUE_TYPE_MACSEC_SALT:
6735+
case SAI_ATTR_VALUE_TYPE_MACSEC_SCI:
6736+
case SAI_ATTR_VALUE_TYPE_MACSEC_SSCI:
6737+
break;
6738+
67156739
case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG:
67166740
case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG_LIST:
67176741
// no special action required

meta/sai_serialize.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,19 @@ std::string sai_serialize_tunnel_stat(
126126
std::string sai_serialize_queue_attr(
127127
_In_ const sai_queue_attr_t attr);
128128

129+
std::string sai_serialize_hex_binary(
130+
_In_ const void *buffer,
131+
_In_ size_t length);
132+
133+
template <typename T>
134+
std::string sai_serialize_hex_binary(
135+
_In_ const T &value)
136+
{
137+
SWSS_LOG_ENTER();
138+
139+
return sai_serialize_hex_binary(&value, sizeof(T));
140+
}
141+
129142
std::string sai_serialize_macsec_sa_attr(
130143
_In_ const sai_macsec_sa_attr_t &attr);
131144

meta/saiserialize.cpp

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,12 @@ sai_status_t transfer_attribute(
298298
transfer_primitive(src_attr.value.aclfield.data.s32, dst_attr.value.aclfield.data.s32);
299299
break;
300300

301+
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT64:
302+
transfer_primitive(src_attr.value.aclfield.enable, dst_attr.value.aclfield.enable);
303+
transfer_primitive(src_attr.value.aclfield.mask.u64, dst_attr.value.aclfield.mask.u64);
304+
transfer_primitive(src_attr.value.aclfield.data.u64, dst_attr.value.aclfield.data.u64);
305+
break;
306+
301307
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_MAC:
302308
transfer_primitive(src_attr.value.aclfield.enable, dst_attr.value.aclfield.enable);
303309
transfer_primitive(src_attr.value.aclfield.mask.mac, dst_attr.value.aclfield.mask.mac);
@@ -1377,6 +1383,9 @@ std::string sai_serialize_acl_field(
13771383
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT32:
13781384
return sai_serialize_enum(field.data.s32, meta.enummetadata) + "&mask:" + sai_serialize_number(field.mask.s32, true);
13791385

1386+
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT64:
1387+
return sai_serialize_number(field.data.u64) + "&mask:" + sai_serialize_number(field.mask.u64, true);
1388+
13801389
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_MAC:
13811390
return sai_serialize_mac(field.data.mac) +"&mask:" + sai_serialize_mac(field.mask.mac);
13821391

@@ -1414,6 +1423,31 @@ std::string sai_serialize_acl_capability(
14141423
return mandatory + ":" + list;
14151424
}
14161425

1426+
std::string sai_serialize_hex_binary(
1427+
_In_ const void *buffer,
1428+
_In_ size_t length)
1429+
{
1430+
SWSS_LOG_ENTER();
1431+
1432+
std::string s;
1433+
1434+
if (buffer == NULL || length == 0)
1435+
{
1436+
return s;
1437+
}
1438+
1439+
s.resize(2 * length, '0');
1440+
const unsigned char *input = static_cast<const unsigned char *>(buffer);
1441+
char *output = &s[0];
1442+
1443+
for (size_t i = 0; i < length; i++)
1444+
{
1445+
snprintf(&output[i * 2], 3, "%02X", input[i]);
1446+
}
1447+
1448+
return s;
1449+
}
1450+
14171451
std::string sai_serialize_system_port_config(
14181452
_In_ const sai_attr_metadata_t &meta,
14191453
_In_ const sai_system_port_config_t &sysportconfig)
@@ -1589,6 +1623,7 @@ std::string sai_serialize_attr_value(
15891623
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT16:
15901624
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT32:
15911625
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT32:
1626+
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT64:
15921627
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_MAC:
15931628
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV4:
15941629
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV6:
@@ -1616,6 +1651,17 @@ std::string sai_serialize_attr_value(
16161651
case SAI_ATTR_VALUE_TYPE_ACL_CAPABILITY:
16171652
return sai_serialize_acl_capability(meta, attr.value.aclcapability, countOnly);
16181653

1654+
// MACsec Attributions
1655+
1656+
case SAI_ATTR_VALUE_TYPE_MACSEC_SAK:
1657+
return sai_serialize_hex_binary(attr.value.macsecsak);
1658+
1659+
case SAI_ATTR_VALUE_TYPE_MACSEC_AUTH_KEY:
1660+
return sai_serialize_hex_binary(attr.value.macsecauthkey);
1661+
1662+
case SAI_ATTR_VALUE_TYPE_MACSEC_SALT:
1663+
return sai_serialize_hex_binary(attr.value.macsecsalt);
1664+
16191665
case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG:
16201666
return sai_serialize_system_port_config(meta, attr.value.sysportconfig);
16211667

@@ -2547,6 +2593,11 @@ void sai_deserialize_acl_field(
25472593
sai_deserialize_number(smask, field.mask.s32, true);
25482594
return;
25492595

2596+
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT64:
2597+
sai_deserialize_number(sfield, field.data.u64);
2598+
sai_deserialize_number(smask, field.mask.u64, true);
2599+
return;
2600+
25502601
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_MAC:
25512602
sai_deserialize_mac(sfield, field.data.mac);
25522603
sai_deserialize_mac(smask, field.mask.mac);
@@ -2655,6 +2706,53 @@ void sai_deserialize_acl_capability(
26552706
sai_deserialize_enum_list(list, &sai_metadata_enum_sai_acl_action_type_t, cap.action_list, false);
26562707
}
26572708

2709+
void sai_deserialize_hex_binary(
2710+
_In_ const std::string &s,
2711+
_Out_ void *buffer,
2712+
_In_ size_t length)
2713+
{
2714+
SWSS_LOG_ENTER();
2715+
2716+
if (s.length() % 2 != 0)
2717+
{
2718+
SWSS_LOG_THROW("Invalid hex string %s", s.c_str());
2719+
}
2720+
2721+
if (s.length() > (length * 2))
2722+
{
2723+
SWSS_LOG_THROW("Buffer length isn't sufficient.");
2724+
}
2725+
2726+
size_t buffer_cur = 0;
2727+
size_t hex_cur = 0;
2728+
unsigned char *output = static_cast<unsigned char *>(buffer);
2729+
2730+
while (hex_cur < s.length())
2731+
{
2732+
const char temp_buffer[] = {s[hex_cur], s[hex_cur + 1], 0};
2733+
unsigned int value = -1;
2734+
2735+
if (sscanf(temp_buffer, "%X", &value) <= 0 || value > 0xff)
2736+
{
2737+
SWSS_LOG_THROW("Invalid hex string %s", temp_buffer);
2738+
}
2739+
2740+
output[buffer_cur] = static_cast<unsigned char>(value);
2741+
hex_cur += 2;
2742+
buffer_cur += 1;
2743+
}
2744+
}
2745+
2746+
template<typename T>
2747+
void sai_deserialize_hex_binary(
2748+
_In_ const std::string &s,
2749+
_Out_ T &value)
2750+
{
2751+
SWSS_LOG_ENTER();
2752+
2753+
return sai_deserialize_hex_binary(s, &value, sizeof(T));
2754+
}
2755+
26582756
void sai_deserialize_system_port_config(
26592757
_In_ const std::string& s,
26602758
_Out_ sai_system_port_config_t& sysportconfig)
@@ -2837,6 +2935,7 @@ void sai_deserialize_attr_value(
28372935
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT16:
28382936
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT32:
28392937
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT32:
2938+
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT64:
28402939
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_MAC:
28412940
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV4:
28422941
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV6:
@@ -2864,6 +2963,15 @@ void sai_deserialize_attr_value(
28642963
case SAI_ATTR_VALUE_TYPE_ACL_CAPABILITY:
28652964
return sai_deserialize_acl_capability(s, attr.value.aclcapability);
28662965

2966+
case SAI_ATTR_VALUE_TYPE_MACSEC_SAK:
2967+
return sai_deserialize_hex_binary(s, attr.value.macsecsak);
2968+
2969+
case SAI_ATTR_VALUE_TYPE_MACSEC_AUTH_KEY:
2970+
return sai_deserialize_hex_binary(s, attr.value.macsecauthkey);
2971+
2972+
case SAI_ATTR_VALUE_TYPE_MACSEC_SALT:
2973+
return sai_deserialize_hex_binary(s, attr.value.macsecsalt);
2974+
28672975
case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG:
28682976
return sai_deserialize_system_port_config(s, attr.value.sysportconfig);
28692977

@@ -3398,6 +3506,7 @@ void sai_deserialize_free_attribute_value(
33983506
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT16:
33993507
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT32:
34003508
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_INT32:
3509+
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_UINT64:
34013510
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_MAC:
34023511
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV4:
34033512
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_IPV6:
@@ -3435,6 +3544,13 @@ void sai_deserialize_free_attribute_value(
34353544
sai_free_list(attr.value.aclcapability.action_list);
34363545
break;
34373546

3547+
case SAI_ATTR_VALUE_TYPE_MACSEC_SAK:
3548+
case SAI_ATTR_VALUE_TYPE_MACSEC_AUTH_KEY:
3549+
case SAI_ATTR_VALUE_TYPE_MACSEC_SALT:
3550+
case SAI_ATTR_VALUE_TYPE_MACSEC_SCI:
3551+
case SAI_ATTR_VALUE_TYPE_MACSEC_SSCI:
3552+
break;
3553+
34383554
case SAI_ATTR_VALUE_TYPE_SYSTEM_PORT_CONFIG:
34393555
break;
34403556

0 commit comments

Comments
 (0)