diff options
author | Neale Ranns <nranns@cisco.com> | 2018-08-08 01:06:40 -0700 |
---|---|---|
committer | Ole Trøan <otroan@employees.org> | 2018-08-10 08:26:00 +0000 |
commit | d0df49f26eabf2f534b567f3370e50c4e804aeea (patch) | |
tree | eea014e723f00b4e00e57937fc5f6e043e2162f9 /src/vnet/udp | |
parent | 404d88edce63a635b58ba54d21d91735ff933584 (diff) |
Use IP address types on UDP encap API
Change-Id: I3c714c519b6d0009329b50947ce250c18ee2a85a
Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'src/vnet/udp')
-rw-r--r-- | src/vnet/udp/udp.api | 83 | ||||
-rw-r--r-- | src/vnet/udp/udp_api.c | 101 |
2 files changed, 111 insertions, 73 deletions
diff --git a/src/vnet/udp/udp.api b/src/vnet/udp/udp.api index 9f5e2ece6ba..8788fba162d 100644 --- a/src/vnet/udp/udp.api +++ b/src/vnet/udp/udp.api @@ -1,5 +1,6 @@ +/* Hey Emacs use -*- mode: C -*- */ /* - * Copyright (c) 2016 Cisco and/or its affiliates. + * Copyright (c) 2018 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: @@ -13,51 +14,79 @@ * limitations under the License. */ -/** \file +/** + * @file + * + * This file defines vpp UDP control-plane API messages which are generally + * called through a shared memory interface. + */ - This file defines vpp UDP control-plane API messages which are generally - called through a shared memory interface. -*/ +option version = "1.1.0"; -option version = "1.0.0"; +import "vnet/ip/ip_types.api"; -/** \brief Add / del table request - A table can be added multiple times, but need be deleted only once. - @param client_index - opaque cookie to identify the sender - @param context - sender context, to match reply w/ request - @param is_ipv6 - V4 or V6 table - @param table_id - table ID associated with the encap destination -*/ -autoreply define udp_encap_add_del + +/** + * @brief UDP Encap object + * @param table_id - table ID associated with the encap destination + * @param dst_ip - Encap destination address + * @param src_ip - Encap source address + * @param dst_port - Encap destination port + * @param src_port - Encap source port + * @param id - The ID assigned to this encap object by the caller + */ +typedef udp_encap { - u32 client_index; - u32 context; u32 id; u32 table_id; - u8 is_ip6; - u8 is_add; u16 src_port; u16 dst_port; - u8 src_ip[16]; - u8 dst_ip[16]; + vl_api_address_t src_ip; + vl_api_address_t dst_ip; +}; + +/** + * @brief Add UDP encap + * @param client_index - opaque cookie to identify the sender + * @param context - sender context, to match reply w/ request + * @param udp_encap - UDP encap description + */ +autoreply define udp_encap_add +{ + u32 client_index; + u32 context; + vl_api_udp_encap_t udp_encap; }; +/** + * @brief Del UDP encap + * @param client_index - opaque cookie to identify the sender + * @param context - sender context, to match reply w/ request + * @param id - ID of the encap object the client chose during the add +*/ +autoreply define udp_encap_del +{ + u32 client_index; + u32 context; + u32 id; +}; + +/** + * @brief dump UDP encaps + */ define udp_encap_dump { u32 client_index; u32 context; }; +/** + * @brief UDP encap details during dump + */ define udp_encap_details { u32 context; - u32 id; - u32 table_id; - u8 is_ip6; - u16 src_port; - u16 dst_port; - u8 src_ip[16]; - u8 dst_ip[16]; + vl_api_udp_encap_t udp_encap; }; /* diff --git a/src/vnet/udp/udp_api.c b/src/vnet/udp/udp_api.c index d643f682a30..43a39b82ef0 100644 --- a/src/vnet/udp/udp_api.c +++ b/src/vnet/udp/udp_api.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Cisco and/or its affiliates. + * Copyright (c) 2018 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: @@ -18,6 +18,7 @@ #include <vnet/udp/udp_encap.h> #include <vnet/fib/fib_table.h> +#include <vnet/ip/ip_types_api.h> #include <vnet/vnet_msg_enum.h> @@ -38,8 +39,9 @@ #include <vlibapi/api_helper_macros.h> -#define foreach_udp_api_msg \ - _(UDP_ENCAP_ADD_DEL, udp_encap_add_del) \ +#define foreach_udp_api_msg \ +_(UDP_ENCAP_DEL, udp_encap_del) \ +_(UDP_ENCAP_ADD, udp_encap_add) \ _(UDP_ENCAP_DUMP, udp_encap_dump) static void @@ -47,33 +49,44 @@ send_udp_encap_details (const udp_encap_t * ue, vl_api_registration_t * reg, u32 context) { vl_api_udp_encap_details_t *mp; - fib_table_t *fib_table; mp = vl_msg_api_alloc (sizeof (*mp)); memset (mp, 0, sizeof (*mp)); mp->_vl_msg_id = ntohs (VL_API_UDP_ENCAP_DETAILS); mp->context = context; - mp->is_ip6 = (ue->ue_ip_proto == FIB_PROTOCOL_IP6); - if (FIB_PROTOCOL_IP4 == ue->ue_ip_proto) { - clib_memcpy (mp->src_ip, &ue->ue_hdrs.ip4.ue_ip4.src_address, 4); - clib_memcpy (mp->dst_ip, &ue->ue_hdrs.ip4.ue_ip4.dst_address, 4); - mp->src_port = htons (ue->ue_hdrs.ip4.ue_udp.src_port); - mp->dst_port = htons (ue->ue_hdrs.ip4.ue_udp.dst_port); + clib_memcpy (&mp->udp_encap.src_ip.un.ip4, + &ue->ue_hdrs.ip4.ue_ip4.src_address, 4); + clib_memcpy (&mp->udp_encap.dst_ip.un.ip4, + &ue->ue_hdrs.ip4.ue_ip4.dst_address, 4); + mp->udp_encap.dst_ip.af = clib_host_to_net_u32 (ADDRESS_IP4); + mp->udp_encap.src_ip.af = clib_host_to_net_u32 (ADDRESS_IP4); + + /* ports aren't byte swapped because they are stored in network + * byte order */ + mp->udp_encap.src_port = ue->ue_hdrs.ip4.ue_udp.src_port; + mp->udp_encap.dst_port = ue->ue_hdrs.ip4.ue_udp.dst_port; } else { - clib_memcpy (mp->src_ip, &ue->ue_hdrs.ip6.ue_ip6.src_address, 16); - clib_memcpy (mp->dst_ip, &ue->ue_hdrs.ip6.ue_ip6.dst_address, 16); - mp->src_port = htons (ue->ue_hdrs.ip6.ue_udp.src_port); - mp->dst_port = htons (ue->ue_hdrs.ip6.ue_udp.dst_port); + clib_memcpy (&mp->udp_encap.src_ip.un.ip6, + &ue->ue_hdrs.ip6.ue_ip6.src_address, 16); + clib_memcpy (&mp->udp_encap.dst_ip.un.ip6, + &ue->ue_hdrs.ip6.ue_ip6.dst_address, 16); + mp->udp_encap.dst_ip.af = clib_host_to_net_u32 (ADDRESS_IP6); + mp->udp_encap.src_ip.af = clib_host_to_net_u32 (ADDRESS_IP6); + + /* ports aren't byte swapped because they are stored in network + * byte order */ + mp->udp_encap.src_port = ue->ue_hdrs.ip6.ue_udp.src_port; + mp->udp_encap.dst_port = ue->ue_hdrs.ip6.ue_udp.dst_port; } - fib_table = fib_table_get (ue->ue_fib_index, ue->ue_ip_proto); - mp->table_id = htonl (fib_table->ft_table_id); - mp->id = htonl (ue->ue_id); + mp->udp_encap.table_id = + htonl (fib_table_get_table_id (ue->ue_fib_index, ue->ue_ip_proto)); + mp->udp_encap.id = htonl (ue->ue_id); vl_api_send_msg (reg, (u8 *) mp); } @@ -98,19 +111,21 @@ vl_api_udp_encap_dump_t_handler (vl_api_udp_encap_dump_t * mp, } static void -vl_api_udp_encap_add_del_t_handler (vl_api_udp_encap_add_del_t * mp, - vlib_main_t * vm) +vl_api_udp_encap_add_t_handler (vl_api_udp_encap_add_t * mp, vlib_main_t * vm) { - vl_api_udp_encap_add_del_reply_t *rmp; + vl_api_udp_encap_add_reply_t *rmp; ip46_address_t src_ip, dst_ip; u32 fib_index, table_id, ue_id; fib_protocol_t fproto; + ip46_type_t itype; int rv = 0; - ue_id = ntohl (mp->id); - table_id = ntohl (mp->table_id); - fproto = (mp->is_ip6 ? FIB_PROTOCOL_IP6 : FIB_PROTOCOL_IP4); + ue_id = ntohl (mp->udp_encap.id); + table_id = ntohl (mp->udp_encap.table_id); + itype = ip_address_decode (&mp->udp_encap.src_ip, &src_ip); + itype = ip_address_decode (&mp->udp_encap.dst_ip, &dst_ip); + fproto = fib_proto_from_ip46 (itype); fib_index = fib_table_find (fproto, table_id); if (~0 == fib_index) @@ -119,31 +134,25 @@ vl_api_udp_encap_add_del_t_handler (vl_api_udp_encap_add_del_t * mp, goto done; } - if (FIB_PROTOCOL_IP4 == fproto) - { - clib_memcpy (&src_ip.ip4, mp->src_ip, 4); - clib_memcpy (&dst_ip.ip4, mp->dst_ip, 4); - } - else - { - clib_memcpy (&src_ip.ip6, mp->src_ip, 16); - clib_memcpy (&dst_ip.ip6, mp->dst_ip, 16); - } - - if (mp->is_add) - { - udp_encap_add_and_lock (ue_id, fproto, fib_index, - &src_ip, &dst_ip, - ntohs (mp->src_port), - ntohs (mp->dst_port), UDP_ENCAP_FIXUP_NONE); - } - else - { - udp_encap_unlock (ue_id); - } + udp_encap_add_and_lock (ue_id, fproto, fib_index, + &src_ip, &dst_ip, + ntohs (mp->udp_encap.src_port), + ntohs (mp->udp_encap.dst_port), + UDP_ENCAP_FIXUP_NONE); done: - REPLY_MACRO (VL_API_UDP_ENCAP_ADD_DEL_REPLY); + REPLY_MACRO (VL_API_UDP_ENCAP_ADD_REPLY); +} + +static void +vl_api_udp_encap_del_t_handler (vl_api_udp_encap_del_t * mp, vlib_main_t * vm) +{ + vl_api_udp_encap_del_reply_t *rmp; + int rv = 0; + + udp_encap_unlock (ntohl (mp->id)); + + REPLY_MACRO (VL_API_UDP_ENCAP_DEL_REPLY); } #define vl_msg_name_crc_list |