Simplify API to add LISP adjacencies 28/1928/2
authorFlorin Coras <fcoras@cisco.com>
Sun, 10 Jul 2016 18:09:32 +0000 (20:09 +0200)
committerDamjan Marion <dmarion.lists@gmail.com>
Mon, 11 Jul 2016 23:02:43 +0000 (23:02 +0000)
The API to add an adjacency requires that two things be provided 1) a
local and a remote eid 2) the whole remote mapping for the remote eid.
Since the API to add remote mappings can be used for 2), 1) in
combination with this API are enough to add an adjacency.

Change-Id: Ibe7474924bc3f28b6aed19cefa78fdb812de5eac
Signed-off-by: Florin Coras <fcoras@cisco.com>
vnet/vnet/lisp-cp/control.c
vnet/vnet/lisp-cp/control.h
vpp-api-test/vat/api_format.c
vpp/vpp-api/api.c
vpp/vpp-api/vpe.api

index c4cdaa9..824046c 100644 (file)
@@ -692,14 +692,16 @@ compare_locators (lisp_cp_main_t *lcm, u32 * old_ls_indexes,
 /**
  * Adds/removes/updates mapping. Does not program forwarding.
  *
- * @param deid destination EID
+ * @param eid end-host identifier
  * @param rlocs vector of remote locators
  * @param action action for negative map-reply
  * @param is_add add mapping if non-zero, delete otherwise
+ * @param res_map_index the map-index that was created/updated/removed. It is
+ *                      set to ~0 if no action is taken.
  * @return return code
  */
 int
-vnet_lisp_add_del_mapping (gid_address_t * deid, locator_t * rlocs, u8 action,
+vnet_lisp_add_del_mapping (gid_address_t * eid, locator_t * rlocs, u8 action,
                            u8 authoritative, u32 ttl, u8 is_add,
                            u32 * res_map_index)
 {
@@ -723,14 +725,14 @@ vnet_lisp_add_del_mapping (gid_address_t * deid, locator_t * rlocs, u8 action,
 
   ls_args->locators = rlocs;
 
-  mi = gid_dictionary_lookup (&lcm->mapping_index_by_gid, deid);
+  mi = gid_dictionary_lookup (&lcm->mapping_index_by_gid, eid);
   old_map = ((u32) ~0 != mi) ? pool_elt_at_index(lcm->mapping_pool, mi) : 0;
 
   if (is_add)
     {
       /* overwrite: if mapping already exists, decide if locators should be
        * updated and be done */
-      if (old_map && gid_address_cmp (&old_map->eid, deid) == 0)
+      if (old_map && gid_address_cmp (&old_map->eid, eid) == 0)
         {
           locator_set_t * old_ls;
 
@@ -761,7 +763,7 @@ vnet_lisp_add_del_mapping (gid_address_t * deid, locator_t * rlocs, u8 action,
           vnet_lisp_add_del_locator_set (ls_args, &ls_index);
 
           /* add mapping */
-          gid_address_copy (&m_args->eid, deid);
+          gid_address_copy (&m_args->eid, eid);
           m_args->is_add = 1;
           m_args->action = action;
           m_args->locator_set_index = ls_index;
@@ -773,15 +775,15 @@ vnet_lisp_add_del_mapping (gid_address_t * deid, locator_t * rlocs, u8 action,
     }
   else
     {
-      if (old_map == 0 || gid_address_cmp (&old_map->eid, deid) != 0)
+      if (old_map == 0 || gid_address_cmp (&old_map->eid, eid) != 0)
         {
           clib_warning("cannot delete mapping for eid %U", format_gid_address,
-                       deid);
+                       eid);
           return -1;
         }
 
       m_args->is_add = 0;
-      gid_address_copy (&m_args->eid, deid);
+      gid_address_copy (&m_args->eid, eid);
       m_args->locator_set_index = old_map->locator_set_index;
 
       /* delete mapping associated from map-cache */
@@ -845,15 +847,15 @@ cleanup:
 }
 
 /**
- * Adds remote mapping and sets it as adjacency for local eid or removes
- * forwarding entry associated to remote mapping. Note that adjacencies
- * are not stored, they only result in forwarding entries being created.
+ * Adds adjacency or removes forwarding entry associated to remote mapping.
+ * Note that adjacencies are not stored, they only result in forwarding entries
+ * being created.
  */
 int
-lisp_add_del_adjacency (lisp_cp_main_t * lcm,
-                             vnet_lisp_add_del_adjacency_args_t * a)
+lisp_add_del_adjacency (lisp_cp_main_t * lcm, gid_address_t * local_eid,
+                        gid_address_t * remote_eid, u8 is_add)
 {
-  u32 src_map_index, dst_map_index = ~0;
+  u32 local_mi, remote_mi = ~0;
 
   if (vnet_lisp_enable_disable_status () == 0)
     {
@@ -861,36 +863,39 @@ lisp_add_del_adjacency (lisp_cp_main_t * lcm,
       return VNET_API_ERROR_LISP_DISABLED;
     }
 
-  /* insert/update mappings cache */
-  vnet_lisp_add_del_mapping (&a->deid, a->locators, a->action,
-                             a->authoritative, a->ttl, a->is_add,
-                             &dst_map_index);
+  remote_mi = gid_dictionary_lookup (&lcm->mapping_index_by_gid, remote_eid);
+  if (GID_LOOKUP_MISS == remote_mi)
+    {
+      clib_warning("Remote eid %U not found. Cannot add adjacency!",
+                   format_gid_address, remote_eid);
 
-  if (a->is_add)
+      return -1;
+    }
+
+  if (is_add)
     {
       /* TODO 1) check if src/dst 2) once we have src/dst working, use it in
        * delete*/
 
       /* check if source eid has an associated mapping. If pitr mode is on,
        * just use the pitr's mapping */
-      src_map_index = lcm->lisp_pitr ? lcm->pitr_map_index :
-              gid_dictionary_lookup (&lcm->mapping_index_by_gid, &a->seid);
+      local_mi = lcm->lisp_pitr ? lcm->pitr_map_index :
+              gid_dictionary_lookup (&lcm->mapping_index_by_gid, local_eid);
 
 
-      if (GID_LOOKUP_MISS == src_map_index)
+      if (GID_LOOKUP_MISS == local_mi)
         {
-          clib_warning("seid %U not found. Cannot program forwarding!",
-                       format_gid_address, &a->seid);
+          clib_warning("Local eid %U not found. Cannot add adjacency!",
+                       format_gid_address, local_eid);
 
           return -1;
         }
 
-      /* update forwarding if a destination mapping index was found */
-      if ((u32) ~0 != dst_map_index)
-        dp_add_fwd_entry (lcm, src_map_index, dst_map_index);
+      /* update forwarding */
+      dp_add_fwd_entry (lcm, local_mi, remote_mi);
     }
   else
-    dp_del_fwd_entry (lcm, 0, dst_map_index);
+    dp_del_fwd_entry (lcm, 0, remote_mi);
 
   return 0;
 }
@@ -899,7 +904,7 @@ int
 vnet_lisp_add_del_adjacency (vnet_lisp_add_del_adjacency_args_t * a)
 {
   lisp_cp_main_t * lcm = vnet_lisp_cp_get_main ();
-  return lisp_add_del_adjacency(lcm, a);
+  return lisp_add_del_adjacency(lcm, &a->seid, &a->deid, a->is_add);
 }
 
 /**
@@ -1060,10 +1065,7 @@ lisp_add_del_remote_mapping_command_fn (vlib_main_t * vm,
   if (!is_add)
     {
       lisp_cp_main_t * lcm = vnet_lisp_cp_get_main ();
-      vnet_lisp_add_del_adjacency_args_t _a, * a = &_a;
-      gid_address_copy(&a->deid, &deid);
-      a->is_add = 0;
-      rv = lisp_add_del_adjacency (lcm, a);
+      rv = lisp_add_del_adjacency (lcm, 0, &deid, /* is_add */ 0);
     }
   else
     {
@@ -1158,24 +1160,6 @@ lisp_add_del_adjacency_command_fn (vlib_main_t * vm, unformat_input_t * input,
           gid_address_type (&seid) = GID_ADDR_MAC;
           seid_set = 1;
         }
-      else if (unformat (line_input, "rloc %U", unformat_ip_address, &rloc.address))
-        vec_add1 (rlocs, rloc);
-      else if (unformat (line_input, "action %s", &s))
-        {
-          if (!strcmp ((char *)s, "no-action"))
-            action = ACTION_NONE;
-          if (!strcmp ((char *)s, "natively-forward"))
-            action = ACTION_NATIVELY_FORWARDED;
-          if (!strcmp ((char *)s, "send-map-request"))
-            action = ACTION_SEND_MAP_REQUEST;
-          else if (!strcmp ((char *)s, "drop"))
-            action = ACTION_DROP;
-          else
-            {
-              clib_warning ("invalid action: '%s'", s);
-              goto done;
-            }
-        }
       else
         {
           clib_warning ("parse error");
@@ -1215,14 +1199,10 @@ lisp_add_del_adjacency_command_fn (vlib_main_t * vm, unformat_input_t * input,
     }
 
   memset(a, 0, sizeof(a[0]));
-  a->action = action;
-  a->is_add = is_add;
-
-  /* NOTE: the remote mapping is static, i.e.,  not authoritative and
-   * ttl is infinite. */
-  a->authoritative = 0;
-  a->ttl = ~0;
+  gid_address_copy (&a->seid, &deid);
+  gid_address_copy (&a->deid, &seid);
 
+  a->is_add = is_add;
   rv = vnet_lisp_add_del_adjacency (a);
 
   if (rv)
@@ -2770,7 +2750,7 @@ format_lisp_cp_input_trace (u8 * s, va_list * args)
 void
 process_map_reply (lisp_cp_main_t * lcm, vlib_buffer_t * b)
 {
-  u32 len = 0, i, ttl;
+  u32 len = 0, i, ttl, dst_map_index = 0;
   void * h;
   pending_map_request_t * pmr;
   locator_t probed;
@@ -2780,7 +2760,6 @@ process_map_reply (lisp_cp_main_t * lcm, vlib_buffer_t * b)
   uword * pmr_index;
   u8 authoritative, action;
   locator_t * locators = 0, * loc;
-  vnet_lisp_add_del_adjacency_args_t _a, * a = &_a;
 
   mrep_hdr = vlib_buffer_get_current (b);
 
@@ -2816,16 +2795,13 @@ process_map_reply (lisp_cp_main_t * lcm, vlib_buffer_t * b)
           return;
         }
 
-      memset(a, 0, sizeof(*a));
-      a->action = action;
-      a->authoritative = authoritative;
-      a->ttl = ttl;
-      a->locators = locators;
-      gid_address_copy(&a->seid, &pmr->src);
-      gid_address_copy(&a->deid, &deid);
-      a->is_add = 1;
+      /* insert/update mappings cache */
+      vnet_lisp_add_del_mapping (&deid, locators, action, authoritative, ttl, 1,
+                                 &dst_map_index);
 
-      lisp_add_del_adjacency (lcm, a);
+      /* try to program forwarding only if mapping saved or updated*/
+      if ((u32) ~0 != dst_map_index)
+        lisp_add_del_adjacency (lcm, &pmr->src, &deid, 1);
 
       vec_free(locators);
     }
index 4832f4d..4d5006e 100644 (file)
@@ -180,10 +180,6 @@ typedef struct
 {
   gid_address_t deid;
   gid_address_t seid;
-  locator_t * locators;
-  u8 action;
-  u8 authoritative;
-  u32 ttl;
   u8 is_add;
 } vnet_lisp_add_del_adjacency_args_t;
 
index dd42896..a911e8a 100644 (file)
@@ -10790,15 +10790,13 @@ api_lisp_add_del_adjacency (vat_main_t * vam)
     vl_api_lisp_add_del_adjacency_t *mp;
     f64 timeout = ~0;
     u32 vni = 0;
-    ip4_address_t seid4, deid4, rloc4;
-    ip6_address_t seid6, deid6, rloc6;
+    ip4_address_t seid4, deid4;
+    ip6_address_t seid6, deid6;
     u8 deid_mac[6] = {0};
     u8 seid_mac[6] = {0};
     u8 deid_type, seid_type;
     u32 seid_len = 0, deid_len = 0, len;
     u8 is_add = 1;
-    u32 action = ~0, p, w;
-    rloc_t * rlocs = 0, rloc, * curr_rloc = 0;
 
     seid_type = deid_type =  (u8)~0;
 
@@ -10832,25 +10830,6 @@ api_lisp_add_del_adjacency (vat_main_t * vam)
             seid_type = 2; /* mac */
         } else if (unformat(input, "vni %d", &vni)) {
             ;
-        } else if (unformat(input, "p %d w %d", &p, &w)) {
-            if (!curr_rloc) {
-              errmsg ("No RLOC configured for setting priority/weight!");
-              return -99;
-            }
-            curr_rloc->priority = p;
-            curr_rloc->weight = w;
-        } else if (unformat(input, "rloc %U", unformat_ip4_address, &rloc4)) {
-            rloc.is_ip4 = 1;
-            clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
-            vec_add1 (rlocs, rloc);
-            curr_rloc = &rlocs[vec_len (rlocs) - 1];
-        } else if (unformat(input, "rloc %U", unformat_ip6_address, &rloc6)) {
-            rloc.is_ip4 = 0;
-            clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
-            vec_add1 (rlocs, rloc);
-            curr_rloc = &rlocs[vec_len (rlocs) - 1];
-        } else if (unformat(input, "action %d", &action)) {
-            ;
         } else {
             errmsg ("parse error '%U'", format_unformat_error, input);
             return -99;
@@ -10867,17 +10846,10 @@ api_lisp_add_del_adjacency (vat_main_t * vam)
         return -99;
     }
 
-    if (is_add && (~0 == action)
-        && 0 == vec_len (rlocs)) {
-          errmsg ("no action set for negative map-reply!");
-          return -99;
-    }
-
     M(LISP_ADD_DEL_ADJACENCY, lisp_add_del_adjacency);
     mp->is_add = is_add;
     mp->vni = htonl (vni);
     mp->seid_len = seid_len;
-    mp->action = (u8) action;
     mp->deid_len = deid_len;
     mp->eid_type = deid_type;
 
@@ -10899,10 +10871,6 @@ api_lisp_add_del_adjacency (vat_main_t * vam)
         return 0;
     }
 
-    mp->rloc_num = vec_len (rlocs);
-    clib_memcpy (mp->rlocs, rlocs, (sizeof (rloc_t) * vec_len (rlocs)));
-    vec_free (rlocs);
-
     /* send it... */
     S;
 
index 1f415ce..4d4c71c 100644 (file)
@@ -5097,29 +5097,24 @@ vl_api_lisp_add_del_remote_mapping_t_handler (
         vec_add1 (rlocs, rloc);
     }
 
-    /* TODO Uncomment once https://gerrit.fd.io/r/#/c/1802 is merged and CSIT
-     * is switched to lisp_add_del_adjacency */
-//    if (!mp->is_add) {
-//        vnet_lisp_add_del_adjacency_args_t _a, * a = &_a;
-//        gid_address_copy(&a->deid, deid);
-//        a->is_add = 0;
-//        rv = vnet_lisp_add_del_adjacency (a);
-//    } else {
-//        /* NOTE: for now this works as a static remote mapping, i.e.,
-//         * not authoritative and ttl infinite. */
-//        rv = vnet_lisp_add_del_mapping (deid, rlocs, mp->action, 0, ~0,
-//                                        mp->is_add, 0);
-//    }
-
-    /* TODO: remove once the above is merged */
-    vnet_lisp_add_del_adjacency_args_t _a, * a = &_a;
-    a->is_add = mp->is_add;
-    a->authoritative = 0;
-    a->action = mp->action;
-    a->locators = rlocs;
-    gid_address_copy(&a->seid, seid);
-    gid_address_copy(&a->deid, deid);
-    rv = vnet_lisp_add_del_adjacency (a);
+    if (!mp->is_add) {
+        vnet_lisp_add_del_adjacency_args_t _a, * a = &_a;
+        gid_address_copy(&a->deid, deid);
+        a->is_add = 0;
+        rv = vnet_lisp_add_del_adjacency (a);
+    } else {
+        /* NOTE: for now this works as a static remote mapping, i.e.,
+         * not authoritative and ttl infinite. */
+        rv = vnet_lisp_add_del_mapping (deid, rlocs, mp->action, 0, ~0,
+                                        mp->is_add, 0);
+
+        /* TODO remove once CSIT switched to lisp_add_del_adjacency */
+        vnet_lisp_add_del_adjacency_args_t _a, * a = &_a;
+        gid_address_copy(&a->seid, seid);
+        gid_address_copy(&a->deid, deid);
+        a->is_add = 1;
+        vnet_lisp_add_del_adjacency (a);
+    }
 
     if (mp->del_all)
       vnet_lisp_clear_all_remote_adjacencies ();
@@ -5133,8 +5128,6 @@ static void
 vl_api_lisp_add_del_adjacency_t_handler (
     vl_api_lisp_add_del_adjacency_t *mp)
 {
-    u32 i;
-    locator_t rloc;
     vl_api_lisp_add_del_adjacency_reply_t * rmp;
     vnet_lisp_add_del_adjacency_args_t _a, * a = &_a;
 
@@ -5178,29 +5171,9 @@ vl_api_lisp_add_del_adjacency_t_handler (
         goto send_reply;
       }
 
-    for (i = 0; i < mp->rloc_num; i++) {
-        rloc_t * r = &((rloc_t *) mp->rlocs)[i];
-        memset(&rloc, 0, sizeof(rloc));
-        ip_address_set(&gid_address_ip(&rloc.address), &r->addr,
-                       r->is_ip4 ? IP4 : IP6);
-        gid_address_ippref_len(&rloc.address) = r->is_ip4 ? 32: 128;
-        gid_address_type(&rloc.address) = GID_ADDR_IP_PREFIX;
-        rloc.priority = r->priority;
-        rloc.weight = r->weight;
-        vec_add1 (a->locators, rloc);
-    }
-
-    a->action = mp->action;
     a->is_add = mp->is_add;
-
-    /* NOTE: the remote mapping is static, i.e.,  not authoritative and
-     * ttl is infinite. */
-    a->authoritative = 0;
-    a->ttl = ~0;
-
     rv = vnet_lisp_add_del_adjacency (a);
 
-    vec_free (a->locators);
 send_reply:
     REPLY_MACRO(VL_API_LISP_ADD_DEL_ADJACENCY_REPLY);
 }
index e36240f..63ca847 100644 (file)
@@ -2417,29 +2417,23 @@ define lisp_add_del_remote_mapping_reply {
     @param context - sender context, to match reply w/ request
     @param is_add - add address if non-zero, else delete
     @param vni - virtual network instance
-    @param action - negative mapping action
     @param eid_type -
       0 : ipv4
       1 : ipv6
       2 : mac
     @param deid - destination EID
     @param seid - source EID
-    @param rloc_num - number of remote locators
-    @param rlocs - remote locator data
 */
 define lisp_add_del_adjacency {
     u32 client_index;
     u32 context;
     u8  is_add;
     u32 vni;
-    u8 action;
     u8 eid_type;
     u8 deid[16];
     u8 seid[16];
     u8 deid_len;
     u8 seid_len;
-    u32 rloc_num;
-    u8 rlocs[0];
 };
 
 /** \brief Reply for lisp_add_del_adjacency