Fix use of vni throughout lisp code 40/940/2
authorFlorin Coras <[email protected]>
Fri, 29 Apr 2016 13:36:29 +0000 (15:36 +0200)
committerDamjan Marion <[email protected]>
Fri, 29 Apr 2016 21:29:27 +0000 (21:29 +0000)
This leverages the vni LCAF support introduced in a previous patch.

Change-Id: I0a1b6b9dfc8095d62ad3f4e800b9f2d04c475521
Signed-off-by: Florin Coras <[email protected]>
vnet/vnet/lisp-cp/control.c
vnet/vnet/lisp-cp/gid_dictionary.c

index 9a88402..1822c45 100644 (file)
@@ -122,24 +122,26 @@ vnet_lisp_add_del_local_mapping (vnet_lisp_add_del_mapping_args_t * a,
                                  u32 * map_index_result)
 {
   uword * table_id, * refc;
-  u32 rv;
+  u32 rv, vni;
   vnet_lisp_gpe_add_del_iface_args_t _ai, *ai = &_ai;
   lisp_cp_main_t * lcm = vnet_lisp_cp_get_main ();
 
+  vni = gid_address_vni(&a->deid);
+
   /* store/remove mapping from map-cache */
   rv = vnet_lisp_add_del_mapping (a, map_index_result);
   if (rv)
     return rv;
 
-  table_id = hash_get(lcm->table_id_by_vni, /* default for now */ 0);
+  table_id = hash_get(lcm->table_id_by_vni, vni);
 
   if (!table_id)
     {
-      clib_warning ("vni %d not associated to a vrf!", 0);
+      clib_warning ("vni %d not associated to a vrf!", vni);
       return VNET_API_ERROR_INVALID_VALUE;
     }
 
-  refc = hash_get(lcm->dp_if_refcount_by_vni, 0);
+  refc = hash_get(lcm->dp_if_refcount_by_vni, vni);
 
   /* enable/disable data-plane interface */
   if (a->is_add)
@@ -148,11 +150,12 @@ vnet_lisp_add_del_local_mapping (vnet_lisp_add_del_mapping_args_t * a,
       if (!refc)
         {
           ai->is_add = 1;
-          ai->vni = 0; /* default for now, pass vni as parameter */
+          ai->vni = vni;
           ai->table_id = table_id[0];
           vnet_lisp_gpe_add_del_iface (ai, 0);
 
-          hash_set(lcm->dp_if_refcount_by_vni, 0 /* table_id */, 1);
+          /* counts the number of eids in a vni that use the interface */
+          hash_set(lcm->dp_if_refcount_by_vni, vni, 1);
         }
       else
         {
@@ -169,7 +172,7 @@ vnet_lisp_add_del_local_mapping (vnet_lisp_add_del_mapping_args_t * a,
       if (refc[0] == 0)
         {
           ai->is_add = 0;
-          ai->vni = 0; /* default for now, pass vni as parameter */
+          ai->vni = vni;
           ai->table_id = table_id[0];
           vnet_lisp_gpe_add_del_iface (ai, 0);
         }
@@ -1321,7 +1324,7 @@ del_fwd_entry (lisp_cp_main_t * lcm, u32 src_map_index,
   a->is_add = 0;
   a->dlocator = fe->dst_loc;
   a->slocator = fe->src_loc;
-  a->vni = 0; // XXX should be part of mapping/eid
+  a->vni = gid_address_vni(&a->deid);
   gid_address_copy(&a->deid, &fe->deid);
 
   vnet_lisp_gpe_add_del_fwd_entry (a, &sw_if_index);
@@ -1336,7 +1339,7 @@ add_fwd_entry (lisp_cp_main_t* lcm, u32 src_map_index, u32 dst_map_index)
 {
   mapping_t * src_map, * dst_map;
   locator_set_t * dst_ls, * src_ls;
-  u32 i, minp = ~0;
+  u32 i, minp = ~0, sw_if_index;
   locator_t * dl = 0;
   uword * feip = 0, * tidp;
   fwd_entry_t* fe;
@@ -1352,6 +1355,17 @@ add_fwd_entry (lisp_cp_main_t* lcm, u32 src_map_index, u32 dst_map_index)
   src_map = pool_elt_at_index (lcm->mapping_pool, src_map_index);
   dst_map = pool_elt_at_index (lcm->mapping_pool, dst_map_index);
 
+  gid_address_copy (&a->deid, &dst_map->eid);
+  a->vni = gid_address_vni(&a->deid);
+
+  tidp = hash_get(lcm->table_id_by_vni, a->vni);
+  if (!tidp)
+    {
+      clib_warning("vni %d not associated to a vrf!", a->vni);
+      return;
+    }
+  a->table_id = tidp[0];
+
   /* XXX simple forwarding policy: first lowest (value) priority locator */
   dst_ls = pool_elt_at_index (lcm->locator_set_pool,
                               dst_map->locator_set_index);
@@ -1368,9 +1382,9 @@ add_fwd_entry (lisp_cp_main_t* lcm, u32 src_map_index, u32 dst_map_index)
     }
   if (dl)
     {
-      src_ls = pool_elt_at_index (lcm->locator_set_pool,
-                                  src_map->locator_set_index);
-      for (i = 0; i < vec_len (src_ls->locator_indices); i++)
+      src_ls = pool_elt_at_index(lcm->locator_set_pool,
+                                 src_map->locator_set_index);
+      for (i = 0; i < vec_len(src_ls->locator_indices); i++)
         {
           u32 li = vec_elt (src_ls->locator_indices, i);
           locator_t * sl = pool_elt_at_index (lcm->locator_pool, li);
@@ -1395,8 +1409,8 @@ add_fwd_entry (lisp_cp_main_t* lcm, u32 src_map_index, u32 dst_map_index)
             }
         }
     }
+
   /* insert data plane forwarding entry */
-  u32 sw_if_index;
   a->is_add = 1;
   if (dl)
     a->dlocator = gid_address_ip(&dl->address);
@@ -1406,17 +1420,6 @@ add_fwd_entry (lisp_cp_main_t* lcm, u32 src_map_index, u32 dst_map_index)
       a->action = dst_map->action;
     }
 
-  gid_address_copy (&a->deid, &dst_map->eid);
-  a->vni = 0; // XXX should be part of mapping/eid
-
-  tidp = hash_get(lcm->table_id_by_vni, a->vni);
-  if (!tidp)
-    {
-      clib_warning("vni %d not associated to a vrf!", a->vni);
-      return;
-    }
-  a->table_id = tidp[0];
-
   /* TODO remove */
   u8 ipver = ip_prefix_version(&gid_address_ippref(&a->deid));
   a->decap_next_index = (ipver == IP4) ?
index 8dc3fd4..3805d5a 100644 (file)
@@ -101,7 +101,7 @@ gid_dictionary_lookup (gid_dictionary_t * db, gid_address_t * key)
   switch (gid_address_type (key))
     {
     case GID_ADDR_IP_PREFIX:
-      return ip_lookup (db, 0, &gid_address_ippref(key));
+      return ip_lookup (db, gid_address_vni(key), &gid_address_ippref(key));
       break;
     default:
       clib_warning ("address type %d not supported!", gid_address_type(key));
@@ -239,16 +239,16 @@ add_del_ip6_key (gid_dictionary_t *db, u32 vni, ip_prefix_t *pref, u32 val,
 }
 
 static u32
-gid_dictionary_add_del_ip (gid_dictionary_t *db, u32 iid, ip_prefix_t *key,
-                           u32 value, u8 is_add)
+add_del_ip (gid_dictionary_t *db, u32 vni, ip_prefix_t *key, u32 value,
+            u8 is_add)
 {
-  switch (ip_prefix_version (key))
+  switch (ip_prefix_version(key))
     {
     case IP4:
-      return add_del_ip4_key (db, iid, key, value, is_add);
+      return add_del_ip4_key (db, vni, key, value, is_add);
       break;
     case IP6:
-      return add_del_ip6_key (db, iid, key, value, is_add);
+      return add_del_ip6_key (db, vni, key, value, is_add);
       break;
     default:
       clib_warning("address type %d not supported!", ip_prefix_version (key));
@@ -265,8 +265,8 @@ gid_dictionary_add_del (gid_dictionary_t *db, gid_address_t *key, u32 value,
   switch (gid_address_type (key))
     {
     case GID_ADDR_IP_PREFIX:
-      return gid_dictionary_add_del_ip (db, 0, &gid_address_ippref(key), value,
-                                        is_add);
+      return add_del_ip (db, gid_address_vni(key), &gid_address_ippref(key),
+                         value, is_add);
       break;
     default:
       clib_warning ("address type %d not supported!", gid_address_type (key));