diff options
author | Neale Ranns <nranns@cisco.com> | 2017-11-05 16:26:46 -0800 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2017-11-07 16:13:42 +0000 |
commit | 810086d8fd08445919ae03bf36161037e53a712a (patch) | |
tree | 76a91d3ed49759ef3adae32066f9dcedd75df889 /src/vnet/ip | |
parent | 595992c5c3b5abbdb7e90e61acbee212f25ad59f (diff) |
UDP Encapsulation.
A UDP-encap object that particiapates in the FIB graph and contributes
DPO to teh output chain. It thereofre resembles a tunnel but without the
interface. FIB paths (and henace routes) can then be created to egress
through the UDP-encap. Said routes can have MPLS labels, hence this also
allows MPLSoUPD.
Encap is uni-directional. For decap, one still registers with the UDP port
dispatcher.
Change-Id: I23bd345523b20789a1de1b02022ea1148ca50797
Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'src/vnet/ip')
-rw-r--r-- | src/vnet/ip/ip.api | 12 | ||||
-rw-r--r-- | src/vnet/ip/ip_api.c | 13 | ||||
-rw-r--r-- | src/vnet/ip/lookup.c | 9 |
3 files changed, 30 insertions, 4 deletions
diff --git a/src/vnet/ip/ip.api b/src/vnet/ip/ip.api index df3ae9646c4..85e4b8e04c3 100644 --- a/src/vnet/ip/ip.api +++ b/src/vnet/ip/ip.api @@ -368,13 +368,18 @@ autoreply define sw_interface_ip6_set_link_local_address @param is_unreach - Drop the packet and rate limit send ICMP unreachable @param is_prohibit - Drop the packet and rate limit send ICMP prohibited @param is_ipv6 - 0 if an ip4 route, else ip6 - @param is_local - + @param is_local - The route will result in packets sent to VPP IP stack + @param is_udp_encap - The path describes a UDP-o-IP encapsulation. @param is_classify - @param is_multipath - Set to 1 if this is a multipath route, else 0 @param is_source_lookup - The the path is a deaggregate path (i.e. a lookup in another table) is the lookup on the packet's source address or destination. - @param next_hop_weight - + @param next_hop_weight - Weight for Unequal cost multi-path + @param next_hop_preference - Path that are up that have the best preference are + are used for forwarding. lower value is better. + @param next_hop_id - Used when the path resolves via an object that has a unique + identifier. @param dst_address_length - @param dst_address[16] - @param next_hop_address[16] - @@ -390,6 +395,7 @@ autoreply define ip_add_del_route u32 table_id; u32 classify_table_index; u32 next_hop_table_id; + u32 next_hop_id; u8 create_vrf_if_needed; u8 is_add; u8 is_drop; @@ -403,8 +409,10 @@ autoreply define ip_add_del_route u8 is_resolve_attached; u8 is_l2_bridged; u8 is_source_lookup; + u8 is_udp_encap; u8 next_hop_weight; u8 next_hop_preference; + u8 next_hop_proto; u8 dst_address_length; u8 dst_address[16]; u8 next_hop_address[16]; diff --git a/src/vnet/ip/ip_api.c b/src/vnet/ip/ip_api.c index fad518f18a5..20e19205756 100644 --- a/src/vnet/ip/ip_api.c +++ b/src/vnet/ip/ip_api.c @@ -832,10 +832,12 @@ add_del_route_t_handler (u8 is_multipath, u8 is_rpf_id, u8 is_l2_bridged, u8 is_source_lookup, + u8 is_udp_encap, u32 fib_index, const fib_prefix_t * prefix, dpo_proto_t next_hop_proto, const ip46_address_t * next_hop, + u32 next_hop_id, u32 next_hop_sw_if_index, u8 next_hop_fib_index, u16 next_hop_weight, @@ -883,6 +885,11 @@ add_del_route_t_handler (u8 is_multipath, path_flags |= FIB_ROUTE_PATH_SOURCE_LOOKUP; if (is_multicast) entry_flags |= FIB_ENTRY_FLAG_MULTICAST; + if (is_udp_encap) + { + path_flags |= FIB_ROUTE_PATH_UDP_ENCAP; + path.frp_udp_encap_id = next_hop_id; + } path.frp_flags = path_flags; @@ -1112,8 +1119,10 @@ ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp) mp->is_resolve_attached, 0, 0, mp->is_l2_bridged, mp->is_source_lookup, + mp->is_udp_encap, fib_index, &pfx, DPO_PROTO_IP4, &nh, + ntohl (mp->next_hop_id), ntohl (mp->next_hop_sw_if_index), next_hop_fib_index, mp->next_hop_weight, @@ -1173,8 +1182,10 @@ ip6_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp) mp->is_resolve_attached, 0, 0, mp->is_l2_bridged, mp->is_source_lookup, + mp->is_udp_encap, fib_index, &pfx, DPO_PROTO_IP6, - &nh, ntohl (mp->next_hop_sw_if_index), + &nh, ntohl (mp->next_hop_id), + ntohl (mp->next_hop_sw_if_index), next_hop_fib_index, mp->next_hop_weight, mp->next_hop_preference, diff --git a/src/vnet/ip/lookup.c b/src/vnet/ip/lookup.c index 3d5dc36c9a0..a376e51d789 100644 --- a/src/vnet/ip/lookup.c +++ b/src/vnet/ip/lookup.c @@ -368,11 +368,11 @@ vnet_ip_route_cmd (vlib_main_t * vm, unformat_input_t _line_input, *line_input = &_line_input; fib_route_path_t *rpaths = NULL, rpath; dpo_id_t dpo = DPO_INVALID, *dpos = NULL; + u32 table_id, is_del, udp_encap_id; fib_prefix_t *prefixs = NULL, pfx; mpls_label_t out_label, via_label; clib_error_t *error = NULL; u32 weight, preference; - u32 table_id, is_del; vnet_main_t *vnm; u32 fib_index; f64 count; @@ -527,6 +527,13 @@ vnet_ip_route_cmd (vlib_main_t * vm, rpath.frp_proto = DPO_PROTO_IP6; vec_add1 (rpaths, rpath); } + else if (unformat (line_input, "via udp-encap %d", &udp_encap_id)) + { + rpath.frp_udp_encap_id = udp_encap_id; + rpath.frp_flags |= FIB_ROUTE_PATH_UDP_ENCAP; + rpath.frp_proto = fib_proto_to_dpo (pfx.fp_proto); + vec_add1 (rpaths, rpath); + } else if (unformat (line_input, "lookup in table %d", &rpath.frp_fib_index)) { |