[HICN-109] Added missing parameter to the face ip add binary api. 24/18224/1
authorAlberto Compagno <acompagn+fdio@cisco.com>
Tue, 12 Mar 2019 22:02:45 +0000 (23:02 +0100)
committerAlberto Compagno <acompagn+fdio@cisco.com>
Tue, 12 Mar 2019 22:02:45 +0000 (23:02 +0100)
Added check if the swif exists on the face ip binary api, before calling the internal api to add the face.

Change-Id: I6e23d20290755707194bc86c93baee8932a03c40
Signed-off-by: Alberto Compagno <acompagn+fdio@cisco.com>
hicn-plugin/src/faces/face.h
hicn-plugin/src/faces/ip/face_ip.c
hicn-plugin/src/hicn.api
hicn-plugin/src/hicn_api.c
hicn-plugin/src/hicn_api_test.c

index b24fe86..313f8ec 100644 (file)
@@ -67,7 +67,7 @@ typedef struct __attribute__ ((packed)) hicn_face_shared_s
   union
   {
     hicn_face_type_t face_type;
-    u32 int_face_type;         //To forse the face_type_t to be 4B
+    u32 int_face_type;         //To force the face_type_t to be 4B
   };
 
 } hicn_face_shared_t;
index c1e264e..a70cb10 100644 (file)
@@ -40,17 +40,21 @@ hicn_face_ip_init (vlib_main_t * vm)
   /* Default Strategy has index 0 and it always exists */
   strategy_face_ip4_vlib_edge = vlib_node_add_next (vm,
                                                    hicn_dpo_get_strategy_vft
-                                                   (default_dpo.hicn_dpo_get_type
-                                                    ())->get_strategy_node_index
+                                                   (default_dpo.
+                                                    hicn_dpo_get_type ())->
+                                                   get_strategy_node_index
                                                    (),
-                                                   hicn_face_ip4_output_node.index);
+                                                   hicn_face_ip4_output_node.
+                                                   index);
 
   strategy_face_ip6_vlib_edge = vlib_node_add_next (vm,
                                                    hicn_dpo_get_strategy_vft
-                                                   (default_dpo.hicn_dpo_get_type
-                                                    ())->get_strategy_node_index
+                                                   (default_dpo.
+                                                    hicn_dpo_get_type ())->
+                                                   get_strategy_node_index
                                                    (),
-                                                   hicn_face_ip6_output_node.index);
+                                                   hicn_face_ip6_output_node.
+                                                   index);
   /*
    * Create and edge between al the other strategy nodes
    * and the ip_encap nodes.
@@ -144,7 +148,6 @@ hicn_face_ip_add (const ip46_address_t * local_addr,
       fib_type = FIB_PROTOCOL_IP6;
     }
 
-
   adj = adj_nbr_add_or_lock (fib_type, link_type, remote_addr, sw_if);
 
   hicn_face_flags_t flags = (hicn_face_flags_t) 0;
@@ -231,7 +234,8 @@ hicn_face_ip_add (const ip46_address_t * local_addr,
     }
 
   retx_t *retx = vlib_process_signal_event_data (vlib_get_main (),
-                                                hicn_mapme_eventmgr_process_node.index,
+                                                hicn_mapme_eventmgr_process_node.
+                                                index,
                                                 HICN_MAPME_EVENT_FACE_ADD, 1,
                                                 sizeof (retx_t));
   *retx = (retx_t)
index a6be15a..46ce177 100644 (file)
@@ -169,7 +169,10 @@ define hicn_api_face_ip_add
   u32 context;
 
   /* IP local address */
-  u64 nh_addr[2];
+  u64 local_addr[2];
+
+  /* IP remote address */
+  u64 remote_addr[2];
 
   /* IPv4 local port number */
   u32 swif;
@@ -229,7 +232,10 @@ define hicn_api_face_ip_params_get_reply
   i32 retval;
 
   /* IP local address */
-  u64 nh_addr[2];
+  u64 local_addr[2];
+
+  /* IP remote address */
+  u64 remote_addr[2];
 
   /* VPP interface (index) associated with the face */
   u32 swif;
index f063509..c532118 100644 (file)
@@ -106,19 +106,26 @@ vl_api_hicn_api_node_params_set_t_handler (vl_api_hicn_api_node_params_set_t *
   hicn_main_t *sm = &hicn_main;
 
   int pit_max_size = clib_net_to_host_i32 (mp->pit_max_size);
-  pit_max_size = pit_max_size == -1? HICN_PARAM_PIT_ENTRIES_DFLT : pit_max_size;
+  pit_max_size =
+    pit_max_size == -1 ? HICN_PARAM_PIT_ENTRIES_DFLT : pit_max_size;
 
   f64 pit_dflt_lifetime_sec = mp->pit_dflt_lifetime_sec;
-  pit_dflt_lifetime_sec = pit_dflt_lifetime_sec == -1? HICN_PARAM_PIT_LIFETIME_DFLT_DFLT_MS : pit_dflt_lifetime_sec;
+  pit_dflt_lifetime_sec =
+    pit_dflt_lifetime_sec ==
+    -1 ? HICN_PARAM_PIT_LIFETIME_DFLT_DFLT_MS : pit_dflt_lifetime_sec;
 
   f64 pit_min_lifetime_sec = mp->pit_min_lifetime_sec;
-  pit_min_lifetime_sec = pit_min_lifetime_sec == -1? HICN_PARAM_PIT_LIFETIME_DFLT_MIN_MS : pit_min_lifetime_sec;
+  pit_min_lifetime_sec =
+    pit_min_lifetime_sec ==
+    -1 ? HICN_PARAM_PIT_LIFETIME_DFLT_MIN_MS : pit_min_lifetime_sec;
 
   f64 pit_max_lifetime_sec = mp->pit_max_lifetime_sec;
-  pit_max_lifetime_sec = pit_max_lifetime_sec == -1? HICN_PARAM_PIT_LIFETIME_DFLT_MAX_MS : pit_max_lifetime_sec;
+  pit_max_lifetime_sec =
+    pit_max_lifetime_sec ==
+    -1 ? HICN_PARAM_PIT_LIFETIME_DFLT_MAX_MS : pit_max_lifetime_sec;
 
   int cs_max_size = clib_net_to_host_i32 (mp->cs_max_size);
-  cs_max_size = cs_max_size == -1? HICN_PARAM_CS_ENTRIES_DFLT : cs_max_size;
+  cs_max_size = cs_max_size == -1 ? HICN_PARAM_CS_ENTRIES_DFLT : cs_max_size;
 
   int cs_reserved_app = clib_net_to_host_i32 (mp->cs_reserved_app);
   cs_reserved_app = cs_reserved_app >= 0
@@ -183,17 +190,27 @@ static void
 vl_api_hicn_api_face_ip_add_t_handler (vl_api_hicn_api_face_ip_add_t * mp)
 {
   vl_api_hicn_api_face_ip_add_reply_t *rmp;
-  int rv;
+  int rv = HICN_ERROR_UNSPECIFIED;
 
   hicn_main_t *sm = &hicn_main;
+  vnet_main_t *vnm = vnet_get_main ();
 
   hicn_face_id_t faceid = HICN_FACE_NULL;
-  ip46_address_t nh_addr;
-  nh_addr.as_u64[0] = clib_net_to_host_u64 (((u64 *) (&mp->nh_addr))[0]);
-  nh_addr.as_u64[1] = clib_net_to_host_u64 (((u64 *) (&mp->nh_addr))[1]);
+  ip46_address_t local_addr;
+  ip46_address_t remote_addr;
+  local_addr.as_u64[0] =
+    clib_net_to_host_u64 (((u64 *) (&mp->local_addr))[0]);
+  local_addr.as_u64[1] =
+    clib_net_to_host_u64 (((u64 *) (&mp->local_addr))[1]);
+  remote_addr.as_u64[0] =
+    clib_net_to_host_u64 (((u64 *) (&mp->remote_addr))[0]);
+  remote_addr.as_u64[1] =
+    clib_net_to_host_u64 (((u64 *) (&mp->remote_addr))[1]);
 
   u32 swif = clib_net_to_host_u32 (mp->swif);
-  rv = hicn_face_ip_add (&nh_addr, NULL, swif, &faceid);
+
+  if (vnet_get_sw_interface_safe (vnm, swif) != NULL)
+    rv = hicn_face_ip_add (&local_addr, &remote_addr, swif, &faceid);
 
   /* *INDENT-OFF* */
   REPLY_MACRO2 (VL_API_HICN_API_FACE_IP_ADD_REPLY /* , rmp, mp, rv */ ,(
@@ -570,14 +587,17 @@ hicn_face_api_entry_params_serialize (hicn_face_id_t faceid,
     }
   hicn_face_t *face = hicn_dpoi_get_from_idx (faceid);
 
-  ip_adjacency_t *ip_adj = adj_get (face->shared.adj);
-
-  if (ip_adj != NULL)
+  if (face != NULL && face->shared.face_type == hicn_face_ip_type)
     {
-      reply->nh_addr[0] =
-       clib_host_to_net_u64 (ip_adj->sub_type.nbr.next_hop.as_u64[0]);
-      reply->nh_addr[1] =
-       clib_host_to_net_u64 (ip_adj->sub_type.nbr.next_hop.as_u64[1]);
+      hicn_face_ip_t *face_ip = (hicn_face_ip_t *) face->data;
+      reply->local_addr[0] =
+       clib_host_to_net_u64 (face_ip->local_addr.as_u64[0]);
+      reply->local_addr[1] =
+       clib_host_to_net_u64 (face_ip->local_addr.as_u64[1]);
+      reply->remote_addr[0] =
+       clib_host_to_net_u64 (face_ip->remote_addr.as_u64[0]);
+      reply->remote_addr[1] =
+       clib_host_to_net_u64 (face_ip->remote_addr.as_u64[1]);
       reply->swif = clib_host_to_net_u32 (face->shared.sw_if);
       reply->flags = clib_host_to_net_u32 (face->shared.flags);
     }
index 9d4519b..2619803 100644 (file)
@@ -322,17 +322,27 @@ static int
 api_hicn_api_face_ip_add (vat_main_t * vam)
 {
   unformat_input_t *input = vam->input;
-  ip46_address_t nh_addr;
+  ip46_address_t local_addr = { 0 };
+  ip46_address_t remote_addr = { 0 };
+  int ret = HICN_ERROR_NONE;
+  int sw_if = 0;
   vl_api_hicn_api_face_ip_add_t *mp;
-  int swif, ret;
 
   /* Parse args required to build the message */
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
-      if (unformat (input, "add %d %U",
-                   &swif, unformat_ip46_address, &nh_addr))
-       {;
-       }
+      if (unformat
+         (input, "local %U", unformat_ip4_address, &local_addr.ip4));
+      else
+       if (unformat
+           (input, "local %U", unformat_ip6_address, &local_addr.ip6));
+      else
+       if (unformat
+           (input, "remote %U", unformat_ip4_address, &remote_addr.ip4));
+      else
+       if (unformat
+           (input, "remote %U", unformat_ip6_address, &remote_addr.ip6));
+      else if (unformat (input, "intfc %d", &sw_if));
       else
        {
          break;
@@ -340,16 +350,20 @@ api_hicn_api_face_ip_add (vat_main_t * vam)
     }
 
   /* Check for presence of both addresses */
-  if ((nh_addr.as_u64[0] == (u64) 0) && (nh_addr.as_u64[1] == (u64) 0))
+  if ((!ip46_address_is_zero (&local_addr)
+       && ! !ip46_address_is_zero (&remote_addr)))
     {
-      clib_warning ("Next hop address not specified");
+      clib_warning
+       ("Incomplete IP face. Please specify local and remote address");
       return (1);
     }
   /* Construct the API message */
   M (HICN_API_FACE_IP_ADD, mp);
-  mp->nh_addr[0] = clib_host_to_net_u64 (nh_addr.as_u64[0]);
-  mp->nh_addr[1] = clib_host_to_net_u64 (nh_addr.as_u64[0]);
-  mp->swif = clib_host_to_net_u32 (swif);
+  mp->local_addr[0] = clib_host_to_net_u64 (local_addr.as_u64[0]);
+  mp->local_addr[1] = clib_host_to_net_u64 (local_addr.as_u64[1]);
+  mp->remote_addr[0] = clib_host_to_net_u64 (remote_addr.as_u64[0]);
+  mp->remote_addr[1] = clib_host_to_net_u64 (remote_addr.as_u64[1]);
+  mp->swif = clib_host_to_net_u32 (sw_if);
 
   /* send it... */
   S (mp);
@@ -465,7 +479,8 @@ static void
   vat_main_t *vam = hicn_test_main.vat_main;
   i32 retval = ntohl (rmp->retval);
   u8 *sbuf = 0;
-  u64 nh_addr[2];
+  ip46_address_t remote_addr;
+  ip46_address_t local_addr;
 
   if (vam->async_mode)
     {
@@ -482,13 +497,16 @@ static void
       return;
     }
   vec_reset_length (sbuf);
-  nh_addr[0] = clib_net_to_host_u64 (rmp->nh_addr[0]);
-  nh_addr[1] = clib_net_to_host_u64 (rmp->nh_addr[1]);
+  local_addr.as_u64[0] = clib_net_to_host_u64 (rmp->local_addr[0]);
+  local_addr.as_u64[1] = clib_net_to_host_u64 (rmp->local_addr[1]);
+  remote_addr.as_u64[0] = clib_net_to_host_u64 (rmp->remote_addr[0]);
+  remote_addr.as_u64[1] = clib_net_to_host_u64 (rmp->remote_addr[1]);
   sbuf =
-    format (sbuf, "%U", format_ip46_address, &nh_addr,
-           0 /* IP46_ANY_TYPE */ );
+    format (0, "local_addr %U remote_addr %U", format_ip46_address,
+           &local_addr, 0 /*IP46_ANY_TYPE */ , format_ip46_address,
+           &remote_addr, 0 /*IP46_ANY_TYPE */ );
 
-  fformat (vam->ofp, "nh_addr %s swif %d flags %d\n",
+  fformat (vam->ofp, "%s swif %d flags %d\n",
           sbuf,
           clib_net_to_host_u16 (rmp->swif),
           clib_net_to_host_i32 (rmp->flags));