diff options
| -rw-r--r-- | service/include/sc_devmgr.h | 26 | ||||
| -rw-r--r-- | service/include/sc_node_common.h | 9 | ||||
| -rw-r--r-- | service/src/devmgr.c | 134 |
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; |
