aboutsummaryrefslogtreecommitdiffstats
path: root/vnet/vnet/lisp-gpe/lisp_gpe_adjacency.c
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2016-10-03 09:40:25 +0100
committerFlorin Coras <florin.coras@gmail.com>2016-10-03 11:45:15 +0000
commit5e575b1d59a5a4c1590ca09d6383a876fb9fdd25 (patch)
treefcba6d058fe32d9b32fe246577565020d10455ff /vnet/vnet/lisp-gpe/lisp_gpe_adjacency.c
parent553d808fc44e61846e4cda108083dd88beb338e3 (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.c44
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
{