Fix coverity issue
[vpp.git] / src / vnet / lisp-gpe / lisp_gpe_fwd_entry.c
index 6d400f7..0b7b0fe 100644 (file)
@@ -424,6 +424,9 @@ vnet_lisp_gpe_add_fwd_counters (vnet_lisp_gpe_add_del_fwd_entry_args_t * a,
 
   lfe = find_fwd_entry (lgm, a, &fe_key);
 
+  if (!lfe)
+    return;
+
   if (LISP_GPE_FWD_ENTRY_TYPE_NORMAL != lfe->type)
     return;
 
@@ -478,6 +481,7 @@ add_ip_fwd_entry (lisp_gpe_main_t * lgm,
 
   hash_set_mem (lgm->lisp_gpe_fwd_entries, lfe->key,
                lfe - lgm->lisp_fwd_entry_pool);
+  a->fwd_entry_index = lfe - lgm->lisp_fwd_entry_pool;
 
   fproto = (IP4 == ip_prefix_version (&fid_addr_ippref (&lfe->key->rmt)) ?
            FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6);
@@ -495,6 +499,10 @@ add_ip_fwd_entry (lisp_gpe_main_t * lgm,
     {
       lisp_gpe_fwd_entry_mk_paths (lfe, a);
     }
+  else
+    {
+      lfe->action = a->action;
+    }
 
   create_fib_entries (lfe);
   return (0);
@@ -506,10 +514,13 @@ del_ip_fwd_entry_i (lisp_gpe_main_t * lgm, lisp_gpe_fwd_entry_t * lfe)
   lisp_fwd_path_t *path;
   fib_protocol_t fproto;
 
-  vec_foreach (path, lfe->paths)
-  {
-    lisp_gpe_adjacency_unlock (path->lisp_adj);
-  }
+  if (LISP_GPE_FWD_ENTRY_TYPE_NEGATIVE != lfe->type)
+    {
+      vec_foreach (path, lfe->paths)
+      {
+       lisp_gpe_adjacency_unlock (path->lisp_adj);
+      }
+    }
 
   delete_fib_entries (lfe);
 
@@ -784,6 +795,7 @@ add_l2_fwd_entry (lisp_gpe_main_t * lgm,
 
   hash_set_mem (lgm->lisp_gpe_fwd_entries, lfe->key,
                lfe - lgm->lisp_fwd_entry_pool);
+  a->fwd_entry_index = lfe - lgm->lisp_fwd_entry_pool;
 
   lfe->type = (a->is_negative ?
               LISP_GPE_FWD_ENTRY_TYPE_NEGATIVE :
@@ -1057,6 +1069,7 @@ add_nsh_fwd_entry (lisp_gpe_main_t * lgm,
 
   hash_set_mem (lgm->lisp_gpe_fwd_entries, lfe->key,
                lfe - lgm->lisp_fwd_entry_pool);
+  a->fwd_entry_index = lfe - lgm->lisp_fwd_entry_pool;
 
   lfe->type = (a->is_negative ?
               LISP_GPE_FWD_ENTRY_TYPE_NEGATIVE :
@@ -1438,6 +1451,23 @@ lisp_gpe_fwd_entry_init (vlib_main_t * vm)
   return (error);
 }
 
+u32 *
+vnet_lisp_gpe_get_fwd_entry_vnis (void)
+{
+  lisp_gpe_main_t *lgm = vnet_lisp_gpe_get_main ();
+  lisp_gpe_fwd_entry_t *lfe;
+  u32 *vnis = 0;
+
+  /* *INDENT-OFF* */
+  pool_foreach (lfe, lgm->lisp_fwd_entry_pool,
+  ({
+    hash_set (vnis, lfe->key->vni, 0);
+  }));
+  /* *INDENT-ON* */
+
+  return vnis;
+}
+
 lisp_api_gpe_fwd_entry_t *
 vnet_lisp_gpe_fwd_entries_get_by_vni (u32 vni)
 {
@@ -1453,6 +1483,8 @@ vnet_lisp_gpe_fwd_entries_get_by_vni (u32 vni)
         memset (&e, 0, sizeof (e));
         e.dp_table = lfe->eid_table_id;
         e.vni = lfe->key->vni;
+        if (lfe->type == LISP_GPE_FWD_ENTRY_TYPE_NEGATIVE)
+          e.action = lfe->action;
         e.fwd_entry_index = lfe - lgm->lisp_fwd_entry_pool;
         memcpy (&e.reid, &lfe->key->rmt, sizeof (e.reid));
         memcpy (&e.leid, &lfe->key->lcl, sizeof (e.leid));