LISP: fix IID in decap
[vpp.git] / src / vnet / lisp-gpe / decap.c
index 5fd449c..d887a95 100644 (file)
@@ -62,10 +62,17 @@ static u32 next_proto_to_next_index[LISP_GPE_NEXT_PROTOS] = {
 always_inline u32
 next_protocol_to_next_index (lisp_gpe_header_t * lgh, u8 * next_header)
 {
+  lisp_gpe_main_t *lgm = vnet_lisp_gpe_get_main ();
+
   /* 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];
+                   || GPE_ENCAP_VXLAN == lgm->encap_mode))
+    {
+      if (PREDICT_FALSE (lgh->next_protocol >= LISP_GPE_NEXT_PROTOS))
+       return LISP_GPE_INPUT_NEXT_DROP;
+
+      return next_proto_to_next_index[lgh->next_protocol];
+    }
   /* legacy lisp router */
   else if ((lgh->flags & LISP_GPE_FLAGS_P) == 0)
     {
@@ -249,9 +256,9 @@ lisp_gpe_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
          /* map iid/vni to lisp-gpe sw_if_index which is used by ipx_input to
           * decide the rx vrf and the input features to be applied */
          si0 = hash_get (tl0->sw_if_index_by_vni,
-                         clib_net_to_host_u32 (lh0->iid));
+                         clib_net_to_host_u32 (lh0->iid << 8));
          si1 = hash_get (tl1->sw_if_index_by_vni,
-                         clib_net_to_host_u32 (lh1->iid));
+                         clib_net_to_host_u32 (lh1->iid << 8));
 
 
          /* Required to make the l2 tag push / pop code work on l2 subifs */