summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsongyanchao <[email protected]>2024-01-09 02:53:49 +0000
committersongyanchao <[email protected]>2024-01-09 02:53:49 +0000
commit1e6ebaefdb3c874b2ac35ad97c795688a366ecc2 (patch)
tree0ccc3f5941a8819e3d8ed1c3bd5dd9e0945f62d3
parent5e99a82cecb2f1f370c797aa2c391eb7c8a3cfb4 (diff)
✨ feat(TSG-18251): Enable Dual-Stack Support for Dev Trunk Mode.
Enable Dual-Stack Support for Dev Trunk Mode.
-rw-r--r--service/include/sc_devmgr.h26
-rw-r--r--service/include/sc_node_common.h9
-rw-r--r--service/src/devmgr.c134
3 files changed, 92 insertions, 77 deletions
diff --git a/service/include/sc_devmgr.h b/service/include/sc_devmgr.h
index bbb0b5c..5ba205b 100644
--- a/service/include/sc_devmgr.h
+++ b/service/include/sc_devmgr.h
@@ -71,23 +71,19 @@ enum mr_dev_mode
struct vlan_member
{
- int sa_family;
uint16_t vlan_id;
- union {
- struct in_addr in_addr;
- struct in6_addr in6_addr;
- };
-
- union {
- struct in_addr in_mask;
- struct in6_addr in6_mask;
- };
-
- union {
- struct in_addr in_gateway;
- struct in6_addr in6_gateway;
- };
+ /* AF_INET */
+ int sa_family_v4;
+ struct in_addr in_addr;
+ struct in_addr in_mask;
+ struct in_addr in_gateway;
+
+ /* AF_INET6 */
+ int sa_family_v6;
+ struct in6_addr in6_addr;
+ struct in6_addr in6_mask;
+ struct in6_addr in6_gateway;
};
struct representor_config
diff --git a/service/include/sc_node_common.h b/service/include/sc_node_common.h
index c494110..5014cb0 100644
--- a/service/include/sc_node_common.h
+++ b/service/include/sc_node_common.h
@@ -100,24 +100,19 @@ static inline int mr_is_local_addr_for_trunk(struct mr_dev_desc * dev_desc, uint
for (int i = 0; i < dev_desc->nr_vlan_members; i++)
{
struct vlan_member * vlan_member = &dev_desc->vlan_members[i];
- if (vlan_member->sa_family != ip_hdr->sa_family)
- {
- continue;
- }
-
if (vlan_member->vlan_id != vlan_id)
{
continue;
}
- if (ip_hdr->sa_family == AF_INET)
+ if (ip_hdr->sa_family == vlan_member->sa_family_v4)
{
if (vlan_member->in_addr.s_addr == ip_hdr->ipv4_hdr->dst_addr)
{
return RT_SUCCESS;
}
}
- else if (ip_hdr->sa_family == AF_INET6)
+ else if (ip_hdr->sa_family == vlan_member->sa_family_v6)
{
if (memcmp(&vlan_member->in6_addr, &ip_hdr->ipv6_hdr->dst_addr, sizeof(struct in6_addr)) == 0)
{
diff --git a/service/src/devmgr.c b/service/src/devmgr.c
index c01d7f0..173e6de 100644
--- a/service/src/devmgr.c
+++ b/service/src/devmgr.c
@@ -163,29 +163,37 @@ static int mr_dev_desc_ip_addr_print(struct mr_dev_desc * dev_desc)
{
for (int i = 0; i < dev_desc->nr_vlan_members; i++)
{
- char str_in_addr[INET6_ADDRSTRLEN];
- char str_in_mask[INET6_ADDRSTRLEN];
- char str_gateway[INET6_ADDRSTRLEN];
struct vlan_member * vlan_member = &dev_desc->vlan_members[i];
- if (vlan_member->sa_family == AF_INET)
+ MR_INFO(" VLAN Member : %d", i);
+ MR_INFO(" VLAN ID : %d", rte_be_to_cpu_16(vlan_member->vlan_id));
+
+ if (vlan_member->sa_family_v4 == AF_INET)
{
- inet_ntop(AF_INET, &vlan_member->in_addr, str_in_addr, sizeof(str_in_addr));
- inet_ntop(AF_INET, &vlan_member->in_mask, str_in_mask, sizeof(str_in_mask));
- inet_ntop(AF_INET, &vlan_member->in_gateway, str_gateway, sizeof(str_gateway));
+ char str_in_addr_v4[INET_ADDRSTRLEN];
+ char str_in_mask_v4[INET_ADDRSTRLEN];
+ char str_gateway_v4[INET_ADDRSTRLEN];
+ inet_ntop(AF_INET, &vlan_member->in_addr, str_in_addr_v4, sizeof(str_in_addr_v4));
+ inet_ntop(AF_INET, &vlan_member->in_mask, str_in_mask_v4, sizeof(str_in_mask_v4));
+ inet_ntop(AF_INET, &vlan_member->in_gateway, str_gateway_v4, sizeof(str_gateway_v4));
+
+ MR_INFO(" IPv4 Address : %s", str_in_addr_v4);
+ MR_INFO(" IPv4 Mask : %s", str_in_mask_v4);
+ MR_INFO(" IPv4 Gateway : %s", str_gateway_v4);
}
- else if (vlan_member->sa_family == AF_INET6)
+
+ if (vlan_member->sa_family_v6 == AF_INET6)
{
- inet_ntop(AF_INET6, &vlan_member->in6_addr, str_in_addr, sizeof(str_in_addr));
- inet_ntop(AF_INET6, &vlan_member->in6_mask, str_in_mask, sizeof(str_in_mask));
- inet_ntop(AF_INET6, &vlan_member->in6_gateway, str_gateway, sizeof(str_gateway));
+ char str_in_addr_v6[INET6_ADDRSTRLEN];
+ char str_in_mask_v6[INET6_ADDRSTRLEN];
+ char str_gateway_v6[INET6_ADDRSTRLEN];
+ inet_ntop(AF_INET6, &vlan_member->in6_addr, str_in_addr_v6, sizeof(str_in_addr_v6));
+ inet_ntop(AF_INET6, &vlan_member->in6_mask, str_in_mask_v6, sizeof(str_in_mask_v6));
+ inet_ntop(AF_INET6, &vlan_member->in6_gateway, str_gateway_v6, sizeof(str_gateway_v6));
+ MR_INFO(" IPv6 Address : %s", str_in_addr_v6);
+ MR_INFO(" IPv6 Mask : %s", str_in_mask_v6);
+ MR_INFO(" IPv6 Gateway : %s", str_gateway_v6);
}
-
- MR_INFO(" VLAN Member : %d", i);
- MR_INFO(" VLAN ID : %d", rte_be_to_cpu_16(vlan_member->vlan_id));
- MR_INFO(" IP Address : %s", str_in_addr);
- MR_INFO(" IP Mask : %s", str_in_mask);
- MR_INFO(" Gateway : %s", str_gateway);
}
}
return 0;
@@ -376,85 +384,101 @@ int mr_dev_desc_config_load(struct devmgr_main * devmgr_main, struct mr_dev_desc
char str_vlan_member_cfg[MR_STRING_MAX] = {};
snprintf(str_vlan_member_cfg, sizeof(str_vlan_member_cfg) - 1, "%s:vlan:%d", str_section, vlan_ids[i]);
- char str_in_addr[INET6_ADDRSTRLEN];
- struct vlan_member * vlan_member = &dev_desc->vlan_members[i];
- vlan_member->vlan_id = rte_cpu_to_be_16(vlan_ids[i]);
- if (MESA_load_profile_string_nodef(cfgfile, str_vlan_member_cfg, "in_addr_v4", str_in_addr,
- sizeof(str_in_addr)) >= 0)
+ int sa_family_v4 = AF_UNSPEC;
+ struct in_addr in_addr = {};
+ struct in_addr in_mask = {};
+ struct in_addr in_gateway = {};
+ char str_in_addr_v4[INET_ADDRSTRLEN];
+ if (MESA_load_profile_string_nodef(cfgfile, str_vlan_member_cfg, "in_addr_v4", str_in_addr_v4,
+ sizeof(str_in_addr_v4)) >= 0)
{
- vlan_member->sa_family = AF_INET;
- if (inet_pton(AF_INET, str_in_addr, &vlan_member->in_addr) <= 0)
+ sa_family_v4 = AF_INET;
+ if (inet_pton(AF_INET, str_in_addr_v4, &in_addr) <= 0)
{
MR_CFGERR_INVALID_FORMAT(cfgfile, str_vlan_member_cfg, "in_addr_v4");
return RT_ERR;
}
- char str_in_mask[INET_ADDRSTRLEN];
- if (MESA_load_profile_string_nodef(cfgfile, str_vlan_member_cfg, "in_mask", str_in_mask,
- sizeof(str_in_mask)) < 0)
+ char str_in_mask_v4[INET_ADDRSTRLEN];
+ if (MESA_load_profile_string_nodef(cfgfile, str_vlan_member_cfg, "in_mask_v4", str_in_mask_v4,
+ sizeof(str_in_mask_v4)) < 0)
{
MR_CFGERR_INVALID_VALUE(cfgfile, str_vlan_member_cfg, "in_mask", "must be configured.");
return RT_ERR;
}
- if (inet_pton(AF_INET, str_in_mask, &vlan_member->in_mask) <= 0)
+ if (inet_pton(AF_INET, str_in_mask_v4, &in_mask) <= 0)
{
- MR_CFGERR_INVALID_FORMAT(cfgfile, str_vlan_member_cfg, "in_mask");
+ MR_CFGERR_INVALID_FORMAT(cfgfile, str_vlan_member_cfg, "in_mask_v4");
return RT_ERR;
}
- char str_gateway[INET_ADDRSTRLEN];
- if (MESA_load_profile_string_nodef(cfgfile, str_vlan_member_cfg, "gateway", str_gateway,
- sizeof(str_gateway)) >= 0)
+ char str_gateway_v4[INET_ADDRSTRLEN];
+ if (MESA_load_profile_string_nodef(cfgfile, str_vlan_member_cfg, "gateway_v4", str_gateway_v4,
+ sizeof(str_gateway_v4)) >= 0)
{
- if (inet_pton(AF_INET, str_gateway, &vlan_member->in_gateway) <= 0)
+ if (inet_pton(AF_INET, str_gateway_v4, &in_gateway) <= 0)
{
- MR_CFGERR_INVALID_FORMAT(cfgfile, str_vlan_member_cfg, "gateway");
+ MR_CFGERR_INVALID_FORMAT(cfgfile, str_vlan_member_cfg, "gateway_v4");
return RT_ERR;
}
}
}
- else if (MESA_load_profile_string_nodef(cfgfile, str_vlan_member_cfg, "in_addr_v6", str_in_addr,
- sizeof(str_in_addr)) >= 0)
+
+ int sa_family_v6 = AF_UNSPEC;
+ struct in6_addr in6_addr = {};
+ struct in6_addr in6_mask = {};
+ struct in6_addr in6_gateway = {};
+ char str_in_addr_v6[INET6_ADDRSTRLEN];
+ if (MESA_load_profile_string_nodef(cfgfile, str_vlan_member_cfg, "in_addr_v6", str_in_addr_v6,
+ sizeof(str_in_addr_v6)) >= 0)
{
- vlan_member->sa_family = AF_INET6;
- if (inet_pton(AF_INET6, str_in_addr, &vlan_member->in6_addr) <= 0)
+ sa_family_v6 = AF_INET6;
+
+ if (inet_pton(AF_INET6, str_in_addr_v6, &in6_addr) <= 0)
{
MR_CFGERR_INVALID_FORMAT(cfgfile, str_vlan_member_cfg, "in_addr_v6");
return RT_ERR;
}
- char str_in_mask[INET6_ADDRSTRLEN];
- if (MESA_load_profile_string_nodef(cfgfile, str_vlan_member_cfg, "in_mask", str_in_mask,
- sizeof(str_in_mask)) < 0)
+ char str_in_mask_v6[INET6_ADDRSTRLEN];
+ if (MESA_load_profile_string_nodef(cfgfile, str_vlan_member_cfg, "in_mask_v6", str_in_mask_v6,
+ sizeof(str_in_mask_v6)) < 0)
{
- MR_CFGERR_INVALID_VALUE(cfgfile, str_vlan_member_cfg, "in_mask", "must be configured.");
+ MR_CFGERR_INVALID_VALUE(cfgfile, str_vlan_member_cfg, "in_mask_v6", "must be configured.");
return RT_ERR;
}
- if (inet_pton(AF_INET6, str_in_mask, &vlan_member->in6_mask) <= 0)
+ if (inet_pton(AF_INET6, str_in_mask_v6, &in6_mask) <= 0)
{
- MR_CFGERR_INVALID_FORMAT(cfgfile, str_vlan_member_cfg, "in_mask");
+ MR_CFGERR_INVALID_FORMAT(cfgfile, str_vlan_member_cfg, "in_mask_v6");
return RT_ERR;
}
- char str_gateway[INET6_ADDRSTRLEN];
- if (MESA_load_profile_string_nodef(cfgfile, str_vlan_member_cfg, "gateway", str_gateway,
- sizeof(str_gateway)) >= 0)
+ char str_gateway_v6[INET6_ADDRSTRLEN];
+ if (MESA_load_profile_string_nodef(cfgfile, str_vlan_member_cfg, "gateway_v6", str_gateway_v6,
+ sizeof(str_gateway_v6)) >= 0)
{
- if (inet_pton(AF_INET6, str_gateway, &vlan_member->in6_gateway) <= 0)
+ if (inet_pton(AF_INET6, str_gateway_v6, &in6_gateway) <= 0)
{
- MR_CFGERR_INVALID_FORMAT(cfgfile, str_vlan_member_cfg, "gateway");
+ MR_CFGERR_INVALID_FORMAT(cfgfile, str_vlan_member_cfg, "gateway_v6");
return RT_ERR;
}
}
}
- else
- {
- MR_CFGERR_INVALID_VALUE(cfgfile, str_vlan_member_cfg, "in_addr_v4 or in_addr_v6",
- "must be configured at least one.");
- return RT_ERR;
- }
+
+ struct vlan_member * vlan_member = &dev_desc->vlan_members[i];
+ vlan_member->vlan_id = rte_cpu_to_be_16(vlan_ids[i]);
+
+ vlan_member->sa_family_v4 = sa_family_v4;
+ vlan_member->in_addr = in_addr;
+ vlan_member->in_mask = in_mask;
+ vlan_member->in_gateway = in_gateway;
+
+ vlan_member->sa_family_v6 = sa_family_v6;
+ rte_memcpy(&vlan_member->in6_addr, &in6_addr, sizeof(in6_addr));
+ rte_memcpy(&vlan_member->in6_mask, &in6_mask, sizeof(in6_mask));
+ rte_memcpy(&vlan_member->in6_gateway, &in6_gateway, sizeof(in6_gateway));
}
dev_desc->dev_mode = MR_DEV_MODE_TRUNK;