VPP-198: LISP map-resolver failover algorithm
[vpp.git] / vpp / vpp-api / api.c
index 4c87476..86dd9ac 100644 (file)
@@ -2591,7 +2591,7 @@ vl_api_sw_interface_clear_stats_t_handler (vl_api_sw_interface_clear_stats_t *
   int rv = 0;
 
   if (mp->sw_if_index != ~0)
-    VALIDATE_SW_IF_INDEX(mp);
+    VALIDATE_SW_IF_INDEX (mp);
 
   vec_reset_length (my_vnet_mains);
 
@@ -5668,16 +5668,16 @@ send_lisp_eid_table_details (mapping_t * mapit,
 
   switch (filter)
     {
-    case 0: /* all mappings */
+    case 0:                    /* all mappings */
       break;
 
-    case 1: /* local only */
+    case 1:                    /* local only */
       if (!mapit->local)
-        return;
+       return;
       break;
-    case 2: /* remote only */
+    case 2:                    /* remote only */
       if (mapit->local)
-        return;
+       return;
       break;
     default:
       clib_warning ("Filter error, unknown filter: %d", filter);
@@ -5754,7 +5754,7 @@ vl_api_lisp_eid_table_dump_t_handler (vl_api_lisp_eid_table_dump_t * mp)
 
       mapit = pool_elt_at_index (lcm->mapping_pool, mi);
       send_lisp_eid_table_details (mapit, q, mp->context,
-                                   0 /* ignore filter */);
+                                  0 /* ignore filter */ );
     }
   else
     {
@@ -5861,8 +5861,8 @@ static void
 vl_api_lisp_map_resolver_dump_t_handler (vl_api_lisp_map_resolver_dump_t * mp)
 {
   unix_shared_memory_queue_t *q = NULL;
-  lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
-  ip_address_t *ip = NULL;
+  lisp_cp_main_t * lcm = vnet_lisp_cp_get_main ();
+  map_resolver_t * mr;
 
   q = vl_api_client_index_to_input_queue (mp->client_index);
   if (q == 0)
@@ -5870,11 +5870,10 @@ vl_api_lisp_map_resolver_dump_t_handler (vl_api_lisp_map_resolver_dump_t * mp)
       return;
     }
 
-  vec_foreach (ip, lcm->map_resolvers)
+  vec_foreach(mr, lcm->map_resolvers)
   {
-    send_lisp_map_resolver_details (ip, q, mp->context);
+    send_lisp_map_resolver_details(&mr->address, q, mp->context);
   }
-
 }
 
 static void
@@ -7092,36 +7091,32 @@ send_mpls_gre_tunnel_entry (vpe_api_main_t * am,
                            mpls_gre_tunnel_t * gt, u32 index, u32 context)
 {
   vl_api_mpls_gre_tunnel_details_t *mp;
-
-  mp = vl_msg_api_alloc (sizeof (*mp));
-  memset (mp, 0, sizeof (*mp));
-  mp->_vl_msg_id = ntohs (VL_API_MPLS_GRE_TUNNEL_DETAILS);
-  mp->context = context;
-
-  if (gt != NULL)
-    {
-      mp->tunnel_index = htonl (index);
-      mp->tunnel_src = gt->tunnel_src.as_u32;
-      mp->tunnel_dst = gt->tunnel_dst.as_u32;
-      mp->intfc_address = gt->intfc_address.as_u32;
-      mp->mask_width = htonl (gt->mask_width);
-      mp->inner_fib_index = htonl (gt->inner_fib_index);
-      mp->outer_fib_index = htonl (gt->outer_fib_index);
-      mp->encap_index = htonl (gt->encap_index);
-      mp->hw_if_index = htonl (gt->hw_if_index);
-      mp->l2_only = htonl (gt->l2_only);
-    }
-
   mpls_main_t *mm = &mpls_main;
   mpls_encap_t *e;
   int i;
-  u32 len = 0;
+  u32 nlabels;
 
   e = pool_elt_at_index (mm->encaps, gt->encap_index);
-  len = vec_len (e->labels);
-  mp->nlabels = htonl (len);
+  nlabels = vec_len (e->labels);
+
+  mp = vl_msg_api_alloc (sizeof (*mp) + nlabels * sizeof (u32));
+  memset (mp, 0, sizeof (*mp));
+  mp->_vl_msg_id = ntohs (VL_API_MPLS_GRE_TUNNEL_DETAILS);
+  mp->context = context;
+
+  mp->tunnel_index = htonl (index);
+  mp->tunnel_src = gt->tunnel_src.as_u32;
+  mp->tunnel_dst = gt->tunnel_dst.as_u32;
+  mp->intfc_address = gt->intfc_address.as_u32;
+  mp->mask_width = htonl (gt->mask_width);
+  mp->inner_fib_index = htonl (gt->inner_fib_index);
+  mp->outer_fib_index = htonl (gt->outer_fib_index);
+  mp->encap_index = htonl (gt->encap_index);
+  mp->hw_if_index = htonl (gt->hw_if_index);
+  mp->l2_only = htonl (gt->l2_only);
+  mp->nlabels = htonl (nlabels);
 
-  for (i = 0; i < len; i++)
+  for (i = 0; i < nlabels; i++)
     {
       mp->labels[i] =
        htonl (vnet_mpls_uc_get_label
@@ -7136,7 +7131,6 @@ vl_api_mpls_gre_tunnel_dump_t_handler (vl_api_mpls_gre_tunnel_dump_t * mp)
 {
   vpe_api_main_t *am = &vpe_api_main;
   unix_shared_memory_queue_t *q;
-  vlib_main_t *vm = &vlib_global_main;
   mpls_main_t *mm = &mpls_main;
   mpls_gre_tunnel_t *gt;
   u32 index = ntohl (mp->tunnel_index);
@@ -7145,30 +7139,24 @@ vl_api_mpls_gre_tunnel_dump_t_handler (vl_api_mpls_gre_tunnel_dump_t * mp)
   if (q == 0)
     return;
 
-  if (pool_elts (mm->gre_tunnels))
+  if (index != ~0)
     {
-      if (mp->tunnel_index >= 0)
+      if (!pool_is_free_index (mm->gre_tunnels, index))
        {
-         vlib_cli_output (vm, "MPLS-GRE tunnel %u", index);
          gt = pool_elt_at_index (mm->gre_tunnels, index);
          send_mpls_gre_tunnel_entry (am, q, gt, gt - mm->gre_tunnels,
                                      mp->context);
        }
-      else
-       {
-         vlib_cli_output (vm, "MPLS-GRE tunnels");
-          /* *INDENT-OFF* */
-          pool_foreach (gt, mm->gre_tunnels,
-          ({
-            send_mpls_gre_tunnel_entry (am, q, gt, gt - mm->gre_tunnels,
-                                        mp->context);
-          }));
-          /* *INDENT-ON* */
-       }
     }
   else
     {
-      vlib_cli_output (vm, "No MPLS-GRE tunnels");
+      /* *INDENT-OFF* */
+      pool_foreach (gt, mm->gre_tunnels,
+      ({
+        send_mpls_gre_tunnel_entry (am, q, gt, gt - mm->gre_tunnels,
+                                    mp->context);
+      }));
+      /* *INDENT-ON* */
     }
 }
 
@@ -7184,36 +7172,32 @@ send_mpls_eth_tunnel_entry (vpe_api_main_t * am,
                            unix_shared_memory_queue_t * q,
                            mpls_eth_tunnel_t * et, u32 index, u32 context)
 {
+  mpls_main_t *mm = &mpls_main;
+  mpls_encap_t *e;
+  int i;
+  u32 nlabels;
   vl_api_mpls_eth_tunnel_details_t *mp;
 
-  mp = vl_msg_api_alloc (sizeof (*mp));
+  e = pool_elt_at_index (mm->encaps, et->encap_index);
+  nlabels = vec_len (e->labels);
+
+  mp = vl_msg_api_alloc (sizeof (*mp) + nlabels * sizeof (u32));
   memset (mp, 0, sizeof (*mp));
   mp->_vl_msg_id = ntohs (VL_API_MPLS_ETH_TUNNEL_DETAILS);
   mp->context = context;
 
-  if (et != NULL)
-    {
-      mp->tunnel_index = htonl (index);
-      memcpy (mp->tunnel_dst_mac, et->tunnel_dst, 6);
-      mp->intfc_address = et->intfc_address.as_u32;
-      mp->tx_sw_if_index = htonl (et->tx_sw_if_index);
-      mp->inner_fib_index = htonl (et->inner_fib_index);
-      mp->mask_width = htonl (et->mask_width);
-      mp->encap_index = htonl (et->encap_index);
-      mp->hw_if_index = htonl (et->hw_if_index);
-      mp->l2_only = htonl (et->l2_only);
-    }
+  mp->tunnel_index = htonl (index);
+  memcpy (mp->tunnel_dst_mac, et->tunnel_dst, 6);
+  mp->intfc_address = et->intfc_address.as_u32;
+  mp->tx_sw_if_index = htonl (et->tx_sw_if_index);
+  mp->inner_fib_index = htonl (et->inner_fib_index);
+  mp->mask_width = htonl (et->mask_width);
+  mp->encap_index = htonl (et->encap_index);
+  mp->hw_if_index = htonl (et->hw_if_index);
+  mp->l2_only = htonl (et->l2_only);
+  mp->nlabels = htonl (nlabels);
 
-  mpls_main_t *mm = &mpls_main;
-  mpls_encap_t *e;
-  int i;
-  u32 len = 0;
-
-  e = pool_elt_at_index (mm->encaps, et->encap_index);
-  len = vec_len (e->labels);
-  mp->nlabels = htonl (len);
-
-  for (i = 0; i < len; i++)
+  for (i = 0; i < nlabels; i++)
     {
       mp->labels[i] =
        htonl (vnet_mpls_uc_get_label
@@ -7228,7 +7212,6 @@ vl_api_mpls_eth_tunnel_dump_t_handler (vl_api_mpls_eth_tunnel_dump_t * mp)
 {
   vpe_api_main_t *am = &vpe_api_main;
   unix_shared_memory_queue_t *q;
-  vlib_main_t *vm = &vlib_global_main;
   mpls_main_t *mm = &mpls_main;
   mpls_eth_tunnel_t *et;
   u32 index = ntohl (mp->tunnel_index);
@@ -7237,34 +7220,24 @@ vl_api_mpls_eth_tunnel_dump_t_handler (vl_api_mpls_eth_tunnel_dump_t * mp)
   if (q == 0)
     return;
 
-  clib_warning ("Received mpls_eth_tunnel_dump");
-  clib_warning ("Received tunnel index: %u from client %u", index,
-               mp->client_index);
-
-  if (pool_elts (mm->eth_tunnels))
+  if (index != ~0)
     {
-      if (mp->tunnel_index >= 0)
+      if (!pool_is_free_index (mm->eth_tunnels, index))
        {
-         vlib_cli_output (vm, "MPLS-Ethernet tunnel %u", index);
          et = pool_elt_at_index (mm->eth_tunnels, index);
          send_mpls_eth_tunnel_entry (am, q, et, et - mm->eth_tunnels,
                                      mp->context);
        }
-      else
-       {
-         clib_warning ("MPLS-Ethernet tunnels");
-          /* *INDENT-OFF* */
-          pool_foreach (et, mm->eth_tunnels,
-          ({
-            send_mpls_eth_tunnel_entry (am, q, et, et - mm->eth_tunnels,
-                                        mp->context);
-          }));
-          /* *INDENT-ON* */
-       }
     }
   else
     {
-      clib_warning ("No MPLS-Ethernet tunnels");
+      /* *INDENT-OFF* */
+      pool_foreach (et, mm->eth_tunnels,
+      ({
+        send_mpls_eth_tunnel_entry (am, q, et, et - mm->eth_tunnels,
+                                    mp->context);
+      }));
+      /* *INDENT-ON* */
     }
 }
 
@@ -7280,8 +7253,15 @@ send_mpls_fib_encap_details (vpe_api_main_t * am,
                             show_mpls_fib_t * s, u32 context)
 {
   vl_api_mpls_fib_encap_details_t *mp;
+  mpls_main_t *mm = &mpls_main;
+  mpls_encap_t *e;
+  int i;
+  u32 nlabels;
 
-  mp = vl_msg_api_alloc (sizeof (*mp));
+  e = pool_elt_at_index (mm->encaps, s->entry_index);
+  nlabels = vec_len (e->labels);
+
+  mp = vl_msg_api_alloc (sizeof (*mp) + nlabels * sizeof (u32));
   memset (mp, 0, sizeof (*mp));
   mp->_vl_msg_id = ntohs (VL_API_MPLS_FIB_ENCAP_DETAILS);
   mp->context = context;
@@ -7291,16 +7271,9 @@ send_mpls_fib_encap_details (vpe_api_main_t * am,
   mp->dest = s->dest;
   mp->s_bit = htonl (s->s_bit);
 
-  mpls_main_t *mm = &mpls_main;
-  mpls_encap_t *e;
-  int i;
-  u32 len = 0;
-
-  e = pool_elt_at_index (mm->encaps, s->entry_index);
-  len = vec_len (e->labels);
-  mp->nlabels = htonl (len);
+  mp->nlabels = htonl (nlabels);
 
-  for (i = 0; i < len; i++)
+  for (i = 0; i < nlabels; i++)
     {
       mp->labels[i] =
        htonl (vnet_mpls_uc_get_label
@@ -8138,13 +8111,14 @@ static clib_error_t *
 api_segment_config (vlib_main_t * vm, unformat_input_t * input)
 {
   u8 *chroot_path;
+  u64 baseva, size, pvt_heap_size;
   int uid, gid, rv;
   const int max_buf_size = 4096;
   char *s, *buf;
   struct passwd _pw, *pw;
   struct group _grp, *grp;
   clib_error_t *e;
-  buf = vec_new(char,128);
+  buf = vec_new (char, 128);
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
     {
       if (unformat (input, "prefix %s", &chroot_path))
@@ -8156,14 +8130,40 @@ api_segment_config (vlib_main_t * vm, unformat_input_t * input)
        vl_set_memory_uid (uid);
       else if (unformat (input, "gid %d", &gid))
        vl_set_memory_gid (gid);
+      else if (unformat (input, "baseva %llx", &baseva))
+       vl_set_global_memory_baseva (baseva);
+      else if (unformat (input, "global-size %lldM", &size))
+       vl_set_global_memory_size (size * (1ULL << 20));
+      else if (unformat (input, "global-size %lldG", &size))
+       vl_set_global_memory_size (size * (1ULL << 30));
+      else if (unformat (input, "global-size %lld", &size))
+       vl_set_global_memory_size (size);
+      else if (unformat (input, "global-pvt-heap-size %lldM", &pvt_heap_size))
+       vl_set_global_pvt_heap_size (pvt_heap_size * (1ULL << 20));
+      else if (unformat (input, "global-pvt-heap-size size %lld",
+                        &pvt_heap_size))
+       vl_set_global_pvt_heap_size (pvt_heap_size);
+      else if (unformat (input, "api-pvt-heap-size %lldM", &pvt_heap_size))
+       vl_set_api_pvt_heap_size (pvt_heap_size * (1ULL << 20));
+      else if (unformat (input, "api-pvt-heap-size size %lld",
+                        &pvt_heap_size))
+       vl_set_api_pvt_heap_size (pvt_heap_size);
+      else if (unformat (input, "api-size %lldM", &size))
+       vl_set_api_memory_size (size * (1ULL << 20));
+      else if (unformat (input, "api-size %lldG", &size))
+       vl_set_api_memory_size (size * (1ULL << 30));
+      else if (unformat (input, "api-size %lld", &size))
+       vl_set_api_memory_size (size);
       else if (unformat (input, "uid %s", &s))
        {
          /* lookup the username */
          pw = NULL;
-         while (((rv = getpwnam_r (s, &_pw, buf, sizeof (buf), &pw)) == ERANGE) && ( vec_len(buf) <= max_buf_size ))
-        {
-            vec_resize(buf,vec_len(buf)*2);
-        }
+         while (((rv =
+                  getpwnam_r (s, &_pw, buf, vec_len (buf), &pw)) == ERANGE)
+                && (vec_len (buf) <= max_buf_size))
+           {
+             vec_resize (buf, vec_len (buf) * 2);
+           }
          if (rv < 0)
            {
              e = clib_error_return_code (0, rv,
@@ -8171,7 +8171,7 @@ api_segment_config (vlib_main_t * vm, unformat_input_t * input)
                                          CLIB_ERROR_FATAL,
                                          "cannot fetch username %s", s);
              vec_free (s);
-          vec_free (buf);
+             vec_free (buf);
              return e;
            }
          if (pw == NULL)
@@ -8179,7 +8179,7 @@ api_segment_config (vlib_main_t * vm, unformat_input_t * input)
              e =
                clib_error_return_fatal (0, "username %s does not exist", s);
              vec_free (s);
-          vec_free (buf);
+             vec_free (buf);
              return e;
            }
          vec_free (s);
@@ -8189,10 +8189,12 @@ api_segment_config (vlib_main_t * vm, unformat_input_t * input)
        {
          /* lookup the group name */
          grp = NULL;
-         while ( ( (rv = getgrnam_r (s, &_grp, buf, vec_len(buf), &grp)) == ERANGE ) && ( vec_len(buf) <= max_buf_size ) )
-        {
-            vec_resize(buf,vec_len(buf)*2);
-        }
+         while (((rv =
+                  getgrnam_r (s, &_grp, buf, vec_len (buf), &grp)) == ERANGE)
+                && (vec_len (buf) <= max_buf_size))
+           {
+             vec_resize (buf, vec_len (buf) * 2);
+           }
          if (rv != 0)
            {
              e = clib_error_return_code (0, rv,
@@ -8200,18 +8202,18 @@ api_segment_config (vlib_main_t * vm, unformat_input_t * input)
                                          CLIB_ERROR_FATAL,
                                          "cannot fetch group %s", s);
              vec_free (s);
-          vec_free (buf);
+             vec_free (buf);
              return e;
            }
          if (grp == NULL)
            {
              e = clib_error_return_fatal (0, "group %s does not exist", s);
              vec_free (s);
-          vec_free (buf);
+             vec_free (buf);
              return e;
            }
          vec_free (s);
-      vec_free (buf);
+         vec_free (buf);
          vl_set_memory_gid (grp->gr_gid);
        }
       else