aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2017-02-22 23:38:08 -0800
committerFlorin Coras <fcoras@cisco.com>2017-02-25 18:36:51 -0800
commit263440e789d29e6e6b0038fcfd4e28e1c7160e83 (patch)
treeddcb71bf853b74881e33b4633063efc31c5ddd00
parent5a72c1c151f843a962cc1247213c063233e8b119 (diff)
Add NSH to GPE decap path
Change-Id: I97681322fa9ca81736100b4d32eab84868886c7b Signed-off-by: Florin Coras <fcoras@cisco.com>
-rw-r--r--src/vnet/lisp-gpe/decap.c48
-rw-r--r--src/vnet/lisp-gpe/interface.c16
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe.c1
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe.h3
-rw-r--r--src/vnet/lisp-gpe/lisp_gpe_fwd_entry.c8
5 files changed, 56 insertions, 20 deletions
diff --git a/src/vnet/lisp-gpe/decap.c b/src/vnet/lisp-gpe/decap.c
index 637d4a740c8..5fd449cee9b 100644
--- a/src/vnet/lisp-gpe/decap.c
+++ b/src/vnet/lisp-gpe/decap.c
@@ -89,6 +89,8 @@ next_index_to_iface (lisp_gpe_main_t * lgm, u32 next_index)
return &lgm->l3_ifaces;
else if (LISP_GPE_INPUT_NEXT_L2_INPUT == next_index)
return &lgm->l2_ifaces;
+ else if (LISP_GPE_INPUT_NEXT_NSH_INPUT == next_index)
+ return &lgm->nsh_ifaces;
clib_warning ("next_index not associated to an interface!");
return 0;
}
@@ -492,6 +494,52 @@ VLIB_REGISTER_NODE (lisp_gpe_ip6_input_node) = {
};
/* *INDENT-ON* */
+/**
+ * Adds arc from lisp-gpe-input to nsh-input if nsh-input is available
+ */
+static void
+gpe_add_arc_from_input_to_nsh ()
+{
+ lisp_gpe_main_t *lgm = vnet_lisp_gpe_get_main ();
+ vlib_main_t *vm = lgm->vlib_main;
+ vlib_node_t *nsh_input;
+
+ /* Arc already exists */
+ if (next_proto_to_next_index[LISP_GPE_NEXT_PROTO_NSH]
+ != LISP_GPE_INPUT_NEXT_DROP)
+ return;
+
+ /* Check if nsh-input is available */
+ if ((nsh_input = vlib_get_node_by_name (vm, (u8 *) "nsh-input")))
+ {
+ u32 slot4, slot6;
+ slot4 = vlib_node_add_next_with_slot (vm, lisp_gpe_ip4_input_node.index,
+ nsh_input->index,
+ LISP_GPE_NEXT_PROTO_NSH);
+ slot6 = vlib_node_add_next_with_slot (vm, lisp_gpe_ip6_input_node.index,
+ nsh_input->index,
+ LISP_GPE_NEXT_PROTO_NSH);
+ ASSERT (slot4 == slot6 && slot4 == LISP_GPE_INPUT_NEXT_NSH_INPUT);
+
+ next_proto_to_next_index[LISP_GPE_NEXT_PROTO_NSH] = slot4;
+ }
+}
+
+/** GPE decap init function. */
+clib_error_t *
+gpe_decap_init (vlib_main_t * vm)
+{
+ clib_error_t *error = 0;
+
+ if ((error = vlib_call_init_function (vm, lisp_gpe_init)))
+ return error;
+
+ gpe_add_arc_from_input_to_nsh ();
+ return 0;
+}
+
+VLIB_INIT_FUNCTION (gpe_decap_init);
+
/*
* fd.io coding-style-patch-verification: ON
*
diff --git a/src/vnet/lisp-gpe/interface.c b/src/vnet/lisp-gpe/interface.c
index 19ac22e7a56..13359277700 100644
--- a/src/vnet/lisp-gpe/interface.c
+++ b/src/vnet/lisp-gpe/interface.c
@@ -899,22 +899,6 @@ lisp_gpe_add_del_iface_command_fn (vlib_main_t * vm, unformat_input_t * input,
lisp_gpe_tenant_l3_iface_unlock (vni);
}
- if (nsh_iface)
- {
- if (is_add)
- {
- if (~0 == lisp_gpe_add_nsh_iface (&lisp_gpe_main))
- {
- error = clib_error_return (0, "NSH interface not created");
- goto done;
- }
- else
- {
- lisp_gpe_del_nsh_iface (&lisp_gpe_main);
- }
- }
- }
-
done:
unformat_free (line_input);
diff --git a/src/vnet/lisp-gpe/lisp_gpe.c b/src/vnet/lisp-gpe/lisp_gpe.c
index f2fbcbd5b2b..479a6260ea3 100644
--- a/src/vnet/lisp-gpe/lisp_gpe.c
+++ b/src/vnet/lisp-gpe/lisp_gpe.c
@@ -326,6 +326,7 @@ lisp_gpe_init (vlib_main_t * vm)
lisp_gpe_ip4_input_node.index, 1 /* is_ip4 */ );
udp_register_dst_port (vm, UDP_DST_PORT_lisp_gpe6,
lisp_gpe_ip6_input_node.index, 0 /* is_ip4 */ );
+
return 0;
}
diff --git a/src/vnet/lisp-gpe/lisp_gpe.h b/src/vnet/lisp-gpe/lisp_gpe.h
index e92df38542c..c498b7c3d99 100644
--- a/src/vnet/lisp-gpe/lisp_gpe.h
+++ b/src/vnet/lisp-gpe/lisp_gpe.h
@@ -65,6 +65,9 @@ typedef enum
LISP_GPE_INPUT_N_NEXT,
} lisp_gpe_input_next_t;
+/* Arc to nsh-input added only if nsh-input exists */
+#define LISP_GPE_INPUT_NEXT_NSH_INPUT 4
+
typedef enum
{
#define lisp_gpe_error(n,s) LISP_GPE_ERROR_##n,
diff --git a/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.c b/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.c
index 46cffdad6cc..2eb5ced60b0 100644
--- a/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.c
+++ b/src/vnet/lisp-gpe/lisp_gpe_fwd_entry.c
@@ -808,13 +808,13 @@ add_l2_fwd_entry (lisp_gpe_main_t * lgm,
* @return next node index.
*/
const dpo_id_t *
-lisp_nsh_fib_lookup (lisp_gpe_main_t * lgm, u32 spi_si)
+lisp_nsh_fib_lookup (lisp_gpe_main_t * lgm, u32 spi_si_net_order)
{
int rv;
BVT (clib_bihash_kv) kv, value;
memset (&kv, 0, sizeof (kv));
- kv.key[0] = spi_si;
+ kv.key[0] = spi_si_net_order;
rv = BV (clib_bihash_search_inline_2) (&lgm->nsh_fib, &kv, &value);
if (rv != 0)
@@ -842,14 +842,14 @@ lisp_nsh_fib_lookup (lisp_gpe_main_t * lgm, u32 spi_si)
* @return ~0 or value of overwritten entry.
*/
static u32
-lisp_nsh_fib_add_del_entry (u32 spi_si, u32 lfei, u8 is_add)
+lisp_nsh_fib_add_del_entry (u32 spi_si_host_order, u32 lfei, u8 is_add)
{
lisp_gpe_main_t *lgm = &lisp_gpe_main;
BVT (clib_bihash_kv) kv, value;
u32 old_val = ~0;
memset (&kv, 0, sizeof (kv));
- kv.key[0] = spi_si;
+ kv.key[0] = clib_host_to_net_u32 (spi_si_host_order);
kv.value = 0ULL;
if (BV (clib_bihash_search) (&lgm->nsh_fib, &kv, &value) == 0)