LISP: fix crash when sending NSH map-request message, ONE-32
[vpp.git] / src / vnet / lisp-cp / control.c
index 0d6d453..aeea72c 100644 (file)
@@ -1344,6 +1344,8 @@ vnet_lisp_add_mapping (vnet_lisp_add_del_mapping_args_t * a,
   /* new mapping */
   else
     {
+      if (is_updated)
+       is_updated[0] = 1;
       remove_overlapping_sub_prefixes (lcm, &a->eid, 0 == ls_args->locators);
 
       ls_args->is_add = 1;
@@ -1380,6 +1382,7 @@ vnet_lisp_del_mapping (gid_address_t * eid, u32 * res_map_index)
   mapping_t *old_map;
   u32 mi;
 
+  memset (ls_args, 0, sizeof (ls_args[0]));
   memset (m_args, 0, sizeof (m_args[0]));
   if (res_map_index)
     res_map_index[0] = ~0;
@@ -1784,6 +1787,7 @@ get_locator_set_index (vnet_lisp_add_del_locator_set_args_t * a, uword * p)
   /* find locator-set */
   if (a->local)
     {
+      ASSERT (a->name);
       p = hash_get_mem (lcm->locator_set_index_by_name, a->name);
     }
   else
@@ -2700,6 +2704,7 @@ foreach_msmr
 /* CP output statistics */
 #define foreach_lisp_cp_output_error                  \
 _(MAP_REGISTERS_SENT, "map-registers sent")           \
+_(MAP_REQUESTS_SENT, "map-requests sent")             \
 _(RLOC_PROBES_SENT, "rloc-probes sent")
 static char *lisp_cp_output_error_strings[] = {
 #define _(sym,string) string,
@@ -3025,6 +3030,9 @@ _send_encapsulated_map_request (lisp_cp_main_t * lcm,
   f->n_vectors = 1;
   vlib_put_frame_to_node (lcm->vlib_main, next_index, f);
 
+  vlib_node_increment_counter (vlib_get_main (), lisp_cp_output_node.index,
+                              LISP_CP_OUTPUT_ERROR_MAP_REQUESTS_SENT, 1);
+
   if (duplicate_pmr)
     /* if there is a pending request already update it */
     {
@@ -3240,6 +3248,7 @@ get_src_and_dst_eids_from_buffer (lisp_cp_main_t * lcm, vlib_buffer_t * b,
          gid_address_nsh_si (dst) = si;
 
          gid_address_type (dst) = GID_ADDR_NSH;
+         gid_address_type (src) = GID_ADDR_NSH;
        }
     }
 }
@@ -3252,7 +3261,7 @@ lisp_cp_lookup_inline (vlib_main_t * vm,
   icmp6_neighbor_discovery_ethernet_link_layer_address_option_t *opt;
   u32 *from, *to_next, di, si;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
-  u32 pkts_mapped = 0, next_index;
+  u32 next_index;
   uword n_left_from, n_left_to_next;
   vnet_main_t *vnm = vnet_get_main ();
 
@@ -3372,7 +3381,6 @@ lisp_cp_lookup_inline (vlib_main_t * vm,
                  /* send map-request */
                  queue_map_request (&src, &dst, 0 /* smr_invoked */ ,
                                     0 /* is_resend */ );
-                 pkts_mapped++;
                }
              else
                {
@@ -3395,7 +3403,6 @@ lisp_cp_lookup_inline (vlib_main_t * vm,
              /* send map-request */
              queue_map_request (&src, &dst, 0 /* smr_invoked */ ,
                                 0 /* is_resend */ );
-             pkts_mapped++;
            }
 
        drop:
@@ -3421,9 +3428,6 @@ lisp_cp_lookup_inline (vlib_main_t * vm,
 
       vlib_put_next_frame (vm, node, next_index, n_left_to_next);
     }
-  vlib_node_increment_counter (vm, node->node_index,
-                              LISP_CP_LOOKUP_ERROR_MAP_REQUESTS_SENT,
-                              pkts_mapped);
   return from_frame->n_vectors;
 }