diff options
-rw-r--r-- | src/vat/api_format.c | 95 | ||||
-rw-r--r-- | src/vnet/vxlan-gpe/vxlan_gpe.api | 38 | ||||
-rw-r--r-- | src/vnet/vxlan-gpe/vxlan_gpe_api.c | 49 | ||||
-rw-r--r-- | src/vpp/api/custom_dump.c | 6 |
4 files changed, 75 insertions, 113 deletions
diff --git a/src/vat/api_format.c b/src/vat/api_format.c index 57211855331..e08e5469e61 100644 --- a/src/vat/api_format.c +++ b/src/vat/api_format.c @@ -12706,10 +12706,8 @@ api_vxlan_gpe_add_del_tunnel (vat_main_t * vam) { unformat_input_t *line_input = vam->input; vl_api_vxlan_gpe_add_del_tunnel_t *mp; - ip4_address_t local4, remote4; - ip6_address_t local6, remote6; + ip46_address_t local, remote; u8 is_add = 1; - u8 ipv4_set = 0, ipv6_set = 0; u8 local_set = 0; u8 remote_set = 0; u8 grp_set = 0; @@ -12721,65 +12719,30 @@ api_vxlan_gpe_add_del_tunnel (vat_main_t * vam) u8 vni_set = 0; int ret; - /* Can't "universally zero init" (={0}) due to GCC bug 53119 */ - clib_memset (&local4, 0, sizeof local4); - clib_memset (&remote4, 0, sizeof remote4); - clib_memset (&local6, 0, sizeof local6); - clib_memset (&remote6, 0, sizeof remote6); - while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { if (unformat (line_input, "del")) is_add = 0; else if (unformat (line_input, "local %U", - unformat_ip4_address, &local4)) - { - local_set = 1; - ipv4_set = 1; - } - else if (unformat (line_input, "remote %U", - unformat_ip4_address, &remote4)) - { - remote_set = 1; - ipv4_set = 1; - } - else if (unformat (line_input, "local %U", - unformat_ip6_address, &local6)) + unformat_ip46_address, &local)) { local_set = 1; - ipv6_set = 1; } else if (unformat (line_input, "remote %U", - unformat_ip6_address, &remote6)) + unformat_ip46_address, &remote)) { remote_set = 1; - ipv6_set = 1; - } - else if (unformat (line_input, "group %U %U", - unformat_ip4_address, &remote4, - api_unformat_sw_if_index, vam, &mcast_sw_if_index)) - { - grp_set = remote_set = 1; - ipv4_set = 1; - } - else if (unformat (line_input, "group %U", - unformat_ip4_address, &remote4)) - { - grp_set = remote_set = 1; - ipv4_set = 1; } else if (unformat (line_input, "group %U %U", - unformat_ip6_address, &remote6, + unformat_ip46_address, &remote, api_unformat_sw_if_index, vam, &mcast_sw_if_index)) { grp_set = remote_set = 1; - ipv6_set = 1; } else if (unformat (line_input, "group %U", - unformat_ip6_address, &remote6)) + unformat_ip46_address, &remote)) { grp_set = remote_set = 1; - ipv6_set = 1; } else if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index)) @@ -12820,7 +12783,7 @@ api_vxlan_gpe_add_del_tunnel (vat_main_t * vam) errmsg ("tunnel nonexistent multicast device"); return -99; } - if (ipv4_set && ipv6_set) + if (ip46_address_is_ip4 (&local) != ip46_address_is_ip4 (&remote)) { errmsg ("both IPv4 and IPv6 addresses specified"); return -99; @@ -12834,17 +12797,12 @@ api_vxlan_gpe_add_del_tunnel (vat_main_t * vam) M (VXLAN_GPE_ADD_DEL_TUNNEL, mp); - - if (ipv6_set) - { - clib_memcpy (&mp->local, &local6, sizeof (local6)); - clib_memcpy (&mp->remote, &remote6, sizeof (remote6)); - } - else - { - clib_memcpy (&mp->local, &local4, sizeof (local4)); - clib_memcpy (&mp->remote, &remote4, sizeof (remote4)); - } + ip_address_encode (&local, + ip46_address_is_ip4 (&local) ? IP46_TYPE_IP4 : + IP46_TYPE_IP6, &mp->local); + ip_address_encode (&remote, + ip46_address_is_ip4 (&remote) ? IP46_TYPE_IP4 : + IP46_TYPE_IP6, &mp->remote); mp->mcast_sw_if_index = ntohl (mcast_sw_if_index); mp->encap_vrf_id = ntohl (encap_vrf_id); @@ -12852,7 +12810,6 @@ api_vxlan_gpe_add_del_tunnel (vat_main_t * vam) mp->protocol = protocol; mp->vni = ntohl (vni); mp->is_add = is_add; - mp->is_ipv6 = ipv6_set; S (mp); W (ret); @@ -12863,8 +12820,10 @@ static void vl_api_vxlan_gpe_tunnel_details_t_handler (vl_api_vxlan_gpe_tunnel_details_t * mp) { vat_main_t *vam = &vat_main; - ip46_address_t local = to_ip46 (mp->is_ipv6, mp->local); - ip46_address_t remote = to_ip46 (mp->is_ipv6, mp->remote); + ip46_address_t local, remote; + + ip_address_decode (&mp->local, &local); + ip_address_decode (&mp->remote, &remote); print (vam->ofp, "%11d%24U%24U%13d%12d%19d%14d%14d", ntohl (mp->sw_if_index), @@ -12883,6 +12842,10 @@ static void vl_api_vxlan_gpe_tunnel_details_t_handler_json vat_json_node_t *node = NULL; struct in_addr ip4; struct in6_addr ip6; + ip46_address_t local, remote; + + ip_address_decode (&mp->local, &local); + ip_address_decode (&mp->remote, &remote); if (VAT_JSON_ARRAY != vam->json_tree.type) { @@ -12893,19 +12856,19 @@ static void vl_api_vxlan_gpe_tunnel_details_t_handler_json vat_json_init_object (node); vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); - if (mp->is_ipv6) + if (ip46_address_is_ip4 (&local)) { - clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6)); - vat_json_object_add_ip6 (node, "local", ip6); - clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6)); - vat_json_object_add_ip6 (node, "remote", ip6); + clib_memcpy (&ip4, &local.ip4, sizeof (ip4)); + vat_json_object_add_ip4 (node, "local", ip4); + clib_memcpy (&ip4, &remote.ip4, sizeof (ip4)); + vat_json_object_add_ip4 (node, "remote", ip4); } else { - clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4)); - vat_json_object_add_ip4 (node, "local", ip4); - clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4)); - vat_json_object_add_ip4 (node, "remote", ip4); + clib_memcpy (&ip6, &local.ip6, sizeof (ip6)); + vat_json_object_add_ip6 (node, "local", ip6); + clib_memcpy (&ip6, &remote.ip6, sizeof (ip6)); + vat_json_object_add_ip6 (node, "remote", ip6); } vat_json_object_add_uint (node, "vni", ntohl (mp->vni)); vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol)); diff --git a/src/vnet/vxlan-gpe/vxlan_gpe.api b/src/vnet/vxlan-gpe/vxlan_gpe.api index 89d37073737..35d8c642192 100644 --- a/src/vnet/vxlan-gpe/vxlan_gpe.api +++ b/src/vnet/vxlan-gpe/vxlan_gpe.api @@ -13,49 +13,51 @@ * limitations under the License. */ -option version = "1.0.0"; +option version = "2.0.0"; + +import "vnet/interface_types.api"; +import "vnet/ip/ip_types.api"; define vxlan_gpe_add_del_tunnel { u32 client_index; u32 context; - u8 is_ipv6; - u8 local[16]; - u8 remote[16]; - u32 mcast_sw_if_index; + vl_api_address_t local; + vl_api_address_t remote; + vl_api_interface_index_t mcast_sw_if_index; u32 encap_vrf_id; u32 decap_vrf_id; - u8 protocol; + vl_api_ip_proto_t protocol; u32 vni; - u8 is_add; + bool is_add [default=true]; }; define vxlan_gpe_add_del_tunnel_reply { u32 context; i32 retval; - u32 sw_if_index; + vl_api_interface_index_t sw_if_index; }; define vxlan_gpe_tunnel_dump { u32 client_index; u32 context; - u32 sw_if_index; + vl_api_interface_index_t sw_if_index; }; define vxlan_gpe_tunnel_details { u32 context; - u32 sw_if_index; - u8 local[16]; - u8 remote[16]; + vl_api_interface_index_t sw_if_index; + vl_api_address_t local; + vl_api_address_t remote; u32 vni; - u8 protocol; - u32 mcast_sw_if_index; + vl_api_ip_proto_t protocol; + vl_api_interface_index_t mcast_sw_if_index; u32 encap_vrf_id; u32 decap_vrf_id; - u8 is_ipv6; + bool is_ipv6; }; /** \brief Interface set vxlan-gpe-bypass request @@ -69,9 +71,9 @@ autoreply define sw_interface_set_vxlan_gpe_bypass { u32 client_index; u32 context; - u32 sw_if_index; - u8 is_ipv6; - u8 enable; + vl_api_interface_index_t sw_if_index; + bool is_ipv6; + bool enable [default=true]; }; /* diff --git a/src/vnet/vxlan-gpe/vxlan_gpe_api.c b/src/vnet/vxlan-gpe/vxlan_gpe_api.c index 480441d15ed..7d484c14114 100644 --- a/src/vnet/vxlan-gpe/vxlan_gpe_api.c +++ b/src/vnet/vxlan-gpe/vxlan_gpe_api.c @@ -26,6 +26,8 @@ #include <vnet/vxlan-gpe/vxlan_gpe.h> #include <vnet/fib/fib_table.h> +#include <vnet/ip/ip_types_api.h> + #include <vnet/vnet_msg_enum.h> #define vl_typedefs /* define message structures */ @@ -78,7 +80,6 @@ static void ip4_main_t *im = &ip4_main; u32 sw_if_index = ~0; - p = hash_get (im->fib_index_by_table_id, ntohl (mp->encap_vrf_id)); if (!p) { @@ -105,28 +106,21 @@ static void decap_fib_index = ntohl (mp->decap_vrf_id); } + + clib_memset (a, 0, sizeof (*a)); + + a->is_add = mp->is_add; + ip_address_decode (&mp->local, &a->local); + ip_address_decode (&mp->remote, &a->remote); + /* Check src & dst are different */ - if ((mp->is_ipv6 && memcmp (mp->local, mp->remote, 16) == 0) || - (!mp->is_ipv6 && memcmp (mp->local, mp->remote, 4) == 0)) + if (ip46_address_is_equal (&a->local, &a->remote)) { rv = VNET_API_ERROR_SAME_SRC_DST; goto out; } - clib_memset (a, 0, sizeof (*a)); - a->is_add = mp->is_add; - a->is_ip6 = mp->is_ipv6; - /* ip addresses sent in network byte order */ - if (a->is_ip6) - { - clib_memcpy (&(a->local.ip6), mp->local, 16); - clib_memcpy (&(a->remote.ip6), mp->remote, 16); - } - else - { - clib_memcpy (&(a->local.ip4), mp->local, 4); - clib_memcpy (&(a->remote.ip4), mp->remote, 4); - } + a->is_ip6 = !ip46_address_is_ip4 (&a->local); a->mcast_sw_if_index = ntohl (mp->mcast_sw_if_index); a->encap_fib_index = encap_fib_index; a->decap_fib_index = decap_fib_index; @@ -154,25 +148,26 @@ static void send_vxlan_gpe_tunnel_details rmp = vl_msg_api_alloc (sizeof (*rmp)); clib_memset (rmp, 0, sizeof (*rmp)); rmp->_vl_msg_id = ntohs (VL_API_VXLAN_GPE_TUNNEL_DETAILS); - if (is_ipv6) + + ip_address_encode (&t->local, is_ipv6 ? IP46_TYPE_IP6 : IP46_TYPE_IP4, + &rmp->local); + ip_address_encode (&t->remote, is_ipv6 ? IP46_TYPE_IP6 : IP46_TYPE_IP4, + &rmp->remote); + + if (ip46_address_is_ip4 (&t->local)) { - memcpy (rmp->local, &(t->local.ip6.as_u8), 16); - memcpy (rmp->remote, &(t->remote.ip6.as_u8), 16); - rmp->encap_vrf_id = htonl (im6->fibs[t->encap_fib_index].ft_table_id); - rmp->decap_vrf_id = htonl (im6->fibs[t->decap_fib_index].ft_table_id); + rmp->encap_vrf_id = htonl (im4->fibs[t->encap_fib_index].ft_table_id); + rmp->decap_vrf_id = htonl (im4->fibs[t->decap_fib_index].ft_table_id); } else { - memcpy (rmp->local, &(t->local.ip4.as_u8), 4); - memcpy (rmp->remote, &(t->remote.ip4.as_u8), 4); - rmp->encap_vrf_id = htonl (im4->fibs[t->encap_fib_index].ft_table_id); - rmp->decap_vrf_id = htonl (im4->fibs[t->decap_fib_index].ft_table_id); + rmp->encap_vrf_id = htonl (im6->fibs[t->encap_fib_index].ft_table_id); + rmp->decap_vrf_id = htonl (im6->fibs[t->decap_fib_index].ft_table_id); } rmp->mcast_sw_if_index = htonl (t->mcast_sw_if_index); rmp->vni = htonl (t->vni); rmp->protocol = t->protocol; rmp->sw_if_index = htonl (t->sw_if_index); - rmp->is_ipv6 = is_ipv6; rmp->context = context; vl_api_send_msg (reg, (u8 *) rmp); diff --git a/src/vpp/api/custom_dump.c b/src/vpp/api/custom_dump.c index 666daac7f1a..a9d85568b33 100644 --- a/src/vpp/api/custom_dump.c +++ b/src/vpp/api/custom_dump.c @@ -1898,8 +1898,10 @@ static void *vl_api_vxlan_gpe_add_del_tunnel_t_print s = format (0, "SCRIPT: vxlan_gpe_add_del_tunnel "); - ip46_address_t local = to_ip46 (mp->is_ipv6, mp->local); - ip46_address_t remote = to_ip46 (mp->is_ipv6, mp->remote); + ip46_address_t local, remote; + + ip_address_decode (&mp->local, &local); + ip_address_decode (&mp->remote, &remote); u8 is_grp = ip46_address_is_multicast (&remote); char *remote_name = is_grp ? "group" : "remote"; |