From c7e91e44518e708ea70b37f11d65428b38640edf Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Mon, 2 May 2016 18:26:26 +0200 Subject: Small fixes to lisp-gpe header and decap - enforce lisp-gpe router mode (set P bit) - fix selection of ip6 decap node - fix dual-dual lool error index init Change-Id: I1a9623c0eb7e81a2cfb60efaa88dc44ee65e664d Signed-off-by: Florin Coras --- vnet/vnet/lisp-gpe/decap.c | 17 ++++++++++------- vnet/vnet/lisp-gpe/lisp_gpe.c | 15 ++++++++++----- 2 files changed, 20 insertions(+), 12 deletions(-) (limited to 'vnet') diff --git a/vnet/vnet/lisp-gpe/decap.c b/vnet/vnet/lisp-gpe/decap.c index fc5f72f4..a583666f 100644 --- a/vnet/vnet/lisp-gpe/decap.c +++ b/vnet/vnet/lisp-gpe/decap.c @@ -58,8 +58,12 @@ next_proto_to_next_index[LISP_GPE_NEXT_PROTOS] = { static u32 next_protocol_to_next_index (lisp_gpe_header_t * lgh, u8 * next_header) { + /* lisp-gpe router */ + if (PREDICT_TRUE((lgh->flags & LISP_GPE_FLAGS_P) + && lgh->next_protocol < LISP_GPE_NEXT_PROTOS)) + return next_proto_to_next_index[lgh->next_protocol]; /* legay lisp router */ - if (PREDICT_FALSE((lgh->flags & LISP_GPE_FLAGS_P) == 0)) + else if ((lgh->flags & LISP_GPE_FLAGS_P) == 0) { ip4_header_t * iph = (ip4_header_t *) next_header; if ((iph->ip_version_and_header_length & 0xF0) == 0x40) @@ -69,10 +73,6 @@ next_protocol_to_next_index (lisp_gpe_header_t * lgh, u8 * next_header) else return LISP_GPE_INPUT_NEXT_DROP; } - /* lisp-gpe router */ - else if ((lgh->flags & LISP_GPE_FLAGS_P) - && lgh->next_protocol < LISP_GPE_NEXT_PROTOS) - return next_proto_to_next_index[lgh->next_protocol]; else return LISP_GPE_INPUT_NEXT_DROP; } @@ -199,7 +199,7 @@ lisp_gpe_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node, { vnet_buffer(b1)->sw_if_index[VLIB_RX] = si1[0]; pkts_decapsulated++; - error0 = 0; + error1 = 0; } else { @@ -253,7 +253,10 @@ lisp_gpe_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node, b0 = vlib_get_buffer (vm, bi0); - /* udp leaves current_data pointing at the lisp header */ + /* udp leaves current_data pointing at the lisp header + * TODO: there's no difference in processing between v4 and v6 + * encapsulated packets so the code should be simplified if ip header + * info is not going to be used for dp smrs/dpsec */ if (is_v4) { vlib_buffer_advance ( diff --git a/vnet/vnet/lisp-gpe/lisp_gpe.c b/vnet/vnet/lisp-gpe/lisp_gpe.c index 76a7fa25..6ccc5f0d 100644 --- a/vnet/vnet/lisp-gpe/lisp_gpe.c +++ b/vnet/vnet/lisp-gpe/lisp_gpe.c @@ -227,19 +227,24 @@ vnet_lisp_gpe_add_del_fwd_entry (vnet_lisp_gpe_add_del_fwd_entry_args_t * a, ip_prefix_t * dpref, * spref; uword * lookup_next_index, * lgpe_sw_if_index, * lnip; u8 ip_ver; + /* treat negative fwd entries separately */ if (a->is_negative) return add_del_negative_fwd_entry (lgm, a); + dpref = &gid_address_ippref(&a->deid); + spref = &gid_address_ippref(&a->seid); + ip_ver = ip_prefix_version(dpref); + + a->next_protocol = ip_ver == IP4 ? + LISP_GPE_NEXT_PROTO_IP4 : LISP_GPE_NEXT_PROTO_IP6; + a->flags |= LISP_GPE_FLAGS_P; + /* add/del tunnel to tunnels pool and prepares rewrite */ rv = add_del_tunnel (a, &tun_index); if (rv) return rv; - dpref = &gid_address_ippref(&a->deid); - spref = &gid_address_ippref(&a->seid); - ip_ver = ip_prefix_version(dpref); - /* setup adjacency for eid */ memset (&adj, 0, sizeof(adj)); adj.n_adj = 1; @@ -570,7 +575,7 @@ lisp_gpe_init (vlib_main_t *vm) udp_register_dst_port (vm, UDP_DST_PORT_lisp_gpe, lisp_gpe_ip4_input_node.index, 1 /* is_ip4 */); udp_register_dst_port (vm, UDP_DST_PORT_lisp_gpe6, - lisp_gpe_ip4_input_node.index, 0 /* is_ip4 */); + lisp_gpe_ip6_input_node.index, 0 /* is_ip4 */); return 0; } -- cgit 1.2.3-korg