diff options
author | Neale Ranns <nranns@cisco.com> | 2016-10-03 09:40:25 +0100 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2016-10-03 11:45:15 +0000 |
commit | 5e575b1d59a5a4c1590ca09d6383a876fb9fdd25 (patch) | |
tree | fcba6d058fe32d9b32fe246577565020d10455ff /vnet/vnet/lisp-gpe/lisp_gpe_adjacency.c | |
parent | 553d808fc44e61846e4cda108083dd88beb338e3 (diff) |
L2 over LISP and GRE (VPP-457)
Change-Id: I0d7f9c7f41a9f9e0acb0950adedb90d45df08c2a
Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'vnet/vnet/lisp-gpe/lisp_gpe_adjacency.c')
-rw-r--r-- | vnet/vnet/lisp-gpe/lisp_gpe_adjacency.c | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/vnet/vnet/lisp-gpe/lisp_gpe_adjacency.c b/vnet/vnet/lisp-gpe/lisp_gpe_adjacency.c index 861f0dd38c0..d042f116dea 100644 --- a/vnet/vnet/lisp-gpe/lisp_gpe_adjacency.c +++ b/vnet/vnet/lisp-gpe/lisp_gpe_adjacency.c @@ -112,7 +112,7 @@ lisp_gpe_adj_get_fib_chain_type (const lisp_gpe_adjacency_t * ladj) static void lisp_gpe_adj_stack (lisp_gpe_adjacency_t * ladj) { - const lisp_gpe_tunnel_2_t *lgt; + const lisp_gpe_tunnel_t *lgt; dpo_id_t tmp = DPO_NULL; fib_link_t linkt; @@ -121,8 +121,10 @@ lisp_gpe_adj_stack (lisp_gpe_adjacency_t * ladj) lisp_gpe_adj_get_fib_chain_type (ladj), &tmp); - FOR_EACH_FIB_IP_LINK (linkt) + FOR_EACH_FIB_LINK (linkt) { + if (FIB_LINK_MPLS == linkt) + continue; adj_nbr_midchain_stack (ladj->adjs[linkt], &tmp); } dpo_reset (&tmp); @@ -134,20 +136,32 @@ lisp_gpe_adj_proto_from_fib_link_type (fib_link_t linkt) switch (linkt) { case FIB_LINK_IP4: - return (LISP_GPE_INPUT_NEXT_IP4_INPUT); + return (LISP_GPE_NEXT_PROTO_IP4); case FIB_LINK_IP6: - return (LISP_GPE_INPUT_NEXT_IP6_INPUT); + return (LISP_GPE_NEXT_PROTO_IP6); + case FIB_LINK_ETHERNET: + return (LISP_GPE_NEXT_PROTO_ETHERNET); default: ASSERT (0); } - return (LISP_GPE_INPUT_NEXT_DROP); + return (LISP_GPE_NEXT_PROTO_IP4); +} + +#define is_v4_packet(_h) ((*(u8*) _h) & 0xF0) == 0x40 + +static void +lisp_gpe_fixup (vlib_main_t * vm, ip_adjacency_t * adj, vlib_buffer_t * b) +{ + /* Fixup the checksum and len fields in the LISP tunnel encap + * that was applied at the midchain node */ + ip_udp_fixup_one (vm, b, is_v4_packet (vlib_buffer_get_current (b))); } index_t lisp_gpe_adjacency_find_or_create_and_lock (const locator_pair_t * pair, u32 overlay_table_id, u32 vni) { - const lisp_gpe_tunnel_2_t *lgt; + const lisp_gpe_tunnel_t *lgt; lisp_gpe_adjacency_t *ladj; index_t lai, l3si; @@ -210,8 +224,11 @@ lisp_gpe_adjacency_find_or_create_and_lock (const locator_pair_t * pair, /* * construct and stack the FIB midchain adjacencies */ - FOR_EACH_FIB_IP_LINK (linkt) + FOR_EACH_FIB_LINK (linkt) { + if (FIB_LINK_MPLS == linkt) + continue; + ladj->adjs[linkt] = adj_nbr_add_or_lock (nh.fp_proto, linkt, &nh.fp_addr, @@ -223,10 +240,10 @@ lisp_gpe_adjacency_find_or_create_and_lock (const locator_pair_t * pair, (linkt)); adj_nbr_midchain_update_rewrite (ladj->adjs[linkt], - vnet_get_sup_hw_interface - (vnet_get_main (), - ladj->sw_if_index)->tx_node_index, - rewrite); + lisp_gpe_fixup, + (FIB_LINK_ETHERNET == linkt ? + ADJ_MIDCHAIN_FLAG_NO_COUNT : + ADJ_MIDCHAIN_FLAG_NONE), rewrite); vec_free (rewrite); } @@ -358,8 +375,9 @@ format_lisp_gpe_adjacency (u8 * s, va_list * args) s = format (s, " %U\n", format_lisp_gpe_tunnel, lisp_gpe_tunnel_get (ladj->tunnel_index)); - s = format (s, " FIB adjacencies: IPV4:%d IPv6:%d\n", - ladj->adjs[FIB_LINK_IP4], ladj->adjs[FIB_LINK_IP6]); + s = format (s, " FIB adjacencies: IPV4:%d IPv6:%d L2:%d\n", + ladj->adjs[FIB_LINK_IP4], + ladj->adjs[FIB_LINK_IP6], ladj->adjs[FIB_LINK_ETHERNET]); } else { |