aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/ip
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2017-11-05 16:26:46 -0800
committerFlorin Coras <florin.coras@gmail.com>2017-11-07 16:13:42 +0000
commit810086d8fd08445919ae03bf36161037e53a712a (patch)
tree76a91d3ed49759ef3adae32066f9dcedd75df889 /src/vnet/ip
parent595992c5c3b5abbdb7e90e61acbee212f25ad59f (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.api12
-rw-r--r--src/vnet/ip/ip_api.c13
-rw-r--r--src/vnet/ip/lookup.c9
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))
{