PUNT socket: External control plane processes connected via UNIX domain sockets.
[vpp.git] / src / vpp / api / api.c
index 16d5122..e8bc22a 100644 (file)
@@ -81,8 +81,6 @@
 #include <vnet/l2/l2_bd.h>
 #include <vpp/api/vpe_msg_enum.h>
 #include <vnet/span/span.h>
-#include <vnet/fib/ip6_fib.h>
-#include <vnet/fib/ip4_fib.h>
 #include <vnet/fib/fib_api.h>
 #include <vnet/dpo/drop_dpo.h>
 #include <vnet/dpo/receive_dpo.h>
 #define foreach_vpe_api_msg                                             \
 _(WANT_OAM_EVENTS, want_oam_events)                                     \
 _(OAM_ADD_DEL, oam_add_del)                                             \
-_(IS_ADDRESS_REACHABLE, is_address_reachable)                           \
 _(SW_INTERFACE_SET_MPLS_ENABLE, sw_interface_set_mpls_enable)           \
 _(SW_INTERFACE_SET_VPATH, sw_interface_set_vpath)                       \
 _(SW_INTERFACE_SET_L2_XCONNECT, sw_interface_set_l2_xconnect)           \
@@ -118,7 +115,7 @@ _(RESET_FIB, reset_fib)                                                     \
 _(CREATE_LOOPBACK, create_loopback)                                    \
 _(CREATE_LOOPBACK_INSTANCE, create_loopback_instance)                  \
 _(CONTROL_PING, control_ping)                                           \
-_(CLI_REQUEST, cli_request)                                             \
+_(CLI, cli)                                                             \
 _(CLI_INBAND, cli_inband)                                              \
 _(SET_ARP_NEIGHBOR_LIMIT, set_arp_neighbor_limit)                      \
 _(L2_PATCH_ADD_DEL, l2_patch_add_del)                                  \
@@ -147,6 +144,8 @@ _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL,                     \
   ip_source_and_port_range_check_interface_add_del)                     \
 _(DELETE_SUBIF, delete_subif)                                           \
 _(PUNT, punt)                                                           \
+_(PUNT_SOCKET_REGISTER, punt_socket_register)                           \
+_(PUNT_SOCKET_DEREGISTER, punt_socket_deregister)                       \
 _(FEATURE_ENABLE_DISABLE, feature_enable_disable)
 
 #define QUOTE_(x) #x
@@ -419,6 +418,7 @@ static void
 
   if (mp->enable)
     {
+      VALIDATE_BD_ID (mp);
       u32 bd_id = ntohl (mp->bd_id);
       u32 bd_index = bd_find_or_add_bd_index (bdm, bd_id);
       u32 bvi = mp->bvi;
@@ -432,6 +432,7 @@ static void
     }
 
   BAD_RX_SW_IF_INDEX_LABEL;
+  BAD_BD_ID_LABEL;
 
   REPLY_MACRO (VL_API_SW_INTERFACE_SET_L2_BRIDGE_REPLY);
 }
@@ -687,86 +688,9 @@ static void
 
   BAD_SW_IF_INDEX_LABEL;
 
-out:
   REPLY_MACRO (VL_API_PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY);
 }
 
-static void
-vl_api_is_address_reachable_t_handler (vl_api_is_address_reachable_t * mp)
-{
-#if 0
-  vpe_main_t *rm = &vpe_main;
-  ip4_main_t *im4 = &ip4_main;
-  ip6_main_t *im6 = &ip6_main;
-  ip_lookup_main_t *lm;
-  union
-  {
-    ip4_address_t ip4;
-    ip6_address_t ip6;
-  } addr;
-  u32 adj_index, sw_if_index;
-  vl_api_is_address_reachable_t *rmp;
-  ip_adjacency_t *adj;
-  unix_shared_memory_queue_t *q;
-
-  q = vl_api_client_index_to_input_queue (mp->client_index);
-  if (!q)
-    {
-      increment_missing_api_client_counter (rm->vlib_main);
-      return;
-    }
-
-  rmp = vl_msg_api_alloc (sizeof (*rmp));
-  clib_memcpy (rmp, mp, sizeof (*rmp));
-
-  sw_if_index = mp->next_hop_sw_if_index;
-  clib_memcpy (&addr, mp->address, sizeof (addr));
-  if (mp->is_ipv6)
-    {
-      lm = &im6->lookup_main;
-      adj_index = ip6_fib_lookup (im6, sw_if_index, &addr.ip6);
-    }
-  else
-    {
-      lm = &im4->lookup_main;
-      // FIXME NOT an ADJ
-      adj_index = ip4_fib_lookup (im4, sw_if_index, &addr.ip4);
-    }
-  if (adj_index == ~0)
-    {
-      rmp->is_error = 1;
-      goto send;
-    }
-  adj = ip_get_adjacency (lm, adj_index);
-
-  if (adj->lookup_next_index == IP_LOOKUP_NEXT_REWRITE
-      && adj->rewrite_header.sw_if_index == sw_if_index)
-    {
-      rmp->is_known = 1;
-    }
-  else
-    {
-      if (adj->lookup_next_index == IP_LOOKUP_NEXT_ARP
-         && adj->rewrite_header.sw_if_index == sw_if_index)
-       {
-         if (mp->is_ipv6)
-           ip6_probe_neighbor (rm->vlib_main, &addr.ip6, sw_if_index);
-         else
-           ip4_probe_neighbor (rm->vlib_main, &addr.ip4, sw_if_index);
-       }
-      else if (adj->lookup_next_index == IP_LOOKUP_NEXT_DROP)
-       {
-         rmp->is_known = 1;
-         goto send;
-       }
-      rmp->is_known = 0;
-    }
-
-send:
-  vl_msg_api_send_shmem (q, (u8 *) & rmp);
-#endif
-}
-
 static void
   vl_api_sw_interface_set_mpls_enable_t_handler
   (vl_api_sw_interface_set_mpls_enable_t * mp)
@@ -826,7 +750,7 @@ vl_api_vnet_get_summary_stats_t_handler (vl_api_vnet_get_summary_stats_t * mp)
 {
   stats_main_t *sm = &stats_main;
   vnet_interface_main_t *im = sm->interface_main;
-  vl_api_vnet_summary_stats_reply_t *rmp;
+  vl_api_vnet_get_summary_stats_reply_t *rmp;
   vlib_combined_counter_main_t *cm;
   vlib_counter_t v;
   int i, which;
@@ -840,7 +764,7 @@ vl_api_vnet_get_summary_stats_t_handler (vl_api_vnet_get_summary_stats_t * mp)
     return;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
-  rmp->_vl_msg_id = ntohs (VL_API_VNET_SUMMARY_STATS_REPLY);
+  rmp->_vl_msg_id = ntohs (VL_API_VNET_GET_SUMMARY_STATS_REPLY);
   rmp->context = mp->context;
   rmp->retval = 0;
 
@@ -1113,7 +1037,7 @@ shmem_cli_output (uword arg, u8 * buffer, uword buffer_bytes)
 
 
 static void
-vl_api_cli_request_t_handler (vl_api_cli_request_t * mp)
+vl_api_cli_t_handler (vl_api_cli_t * mp)
 {
   vl_api_cli_reply_t *rp;
   unix_shared_memory_queue_t *q;
@@ -1597,9 +1521,9 @@ vl_api_want_ip4_arp_events_t_handler (vl_api_want_ip4_arp_events_t * mp)
        }
       memset (event, 0, sizeof (*event));
 
+      /* Python API expects events to have no context */
       event->_vl_msg_id = ntohs (VL_API_IP4_ARP_EVENT);
       event->client_index = mp->client_index;
-      event->context = mp->context;
       event->address = mp->address;
       event->pid = mp->pid;
       if (mp->address == 0)
@@ -1645,7 +1569,6 @@ vl_api_want_ip6_nd_events_t_handler (vl_api_want_ip6_nd_events_t * mp)
 
       event->_vl_msg_id = ntohs (VL_API_IP6_ND_EVENT);
       event->client_index = mp->client_index;
-      event->context = mp->context;
       clib_memcpy (event->address, mp->address, 16);
       event->pid = mp->pid;
       if (ip6_address_is_zero ((ip6_address_t *) mp->address))
@@ -2019,6 +1942,68 @@ vl_api_punt_t_handler (vl_api_punt_t * mp)
   REPLY_MACRO (VL_API_PUNT_REPLY);
 }
 
+static void
+vl_api_punt_socket_register_t_handler (vl_api_punt_socket_register_t * mp)
+{
+  vl_api_punt_socket_register_reply_t *rmp;
+  vlib_main_t *vm = vlib_get_main ();
+  int rv = 0;
+  clib_error_t *error;
+  unix_shared_memory_queue_t *q;
+  u32 handle;
+
+  error = vnet_punt_socket_add (vm, ntohl (mp->header_version),
+                               mp->is_ip4, mp->l4_protocol,
+                               ntohs (mp->l4_port), (char *) mp->pathname);
+  if (error)
+    {
+      rv = -1;
+      clib_error_report (error);
+    }
+
+  q = vl_api_client_index_to_input_queue (mp->client_index);
+  if (!q)
+    return;
+
+  rmp = vl_msg_api_alloc (sizeof (*rmp));
+  rmp->_vl_msg_id = htons (VL_API_PUNT_SOCKET_REGISTER_REPLY);
+  rmp->context = mp->context;
+  rmp->retval = htonl (rv);
+  char *p = vnet_punt_get_server_pathname ();
+  /* Abstract pathnames start with \0 */
+  memcpy ((char *) rmp->pathname, p, sizeof (rmp->pathname));
+  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+}
+
+static void
+vl_api_punt_socket_deregister_t_handler (vl_api_punt_socket_deregister_t * mp)
+{
+  vl_api_punt_socket_deregister_reply_t *rmp;
+  vlib_main_t *vm = vlib_get_main ();
+  int rv = 0;
+  clib_error_t *error;
+  unix_shared_memory_queue_t *q;
+  u32 handle;
+
+  error = vnet_punt_socket_del (vm, mp->is_ip4, mp->l4_protocol,
+                               ntohs (mp->l4_port));
+  if (error)
+    {
+      rv = -1;
+      clib_error_report (error);
+    }
+
+  q = vl_api_client_index_to_input_queue (mp->client_index);
+  if (!q)
+    return;
+
+  rmp = vl_msg_api_alloc (sizeof (*rmp));
+  rmp->_vl_msg_id = htons (VL_API_PUNT_SOCKET_DEREGISTER_REPLY);
+  rmp->context = mp->context;
+  rmp->retval = htonl (rv);
+  vl_msg_api_send_shmem (q, (u8 *) & rmp);
+}
+
 static void
 vl_api_feature_enable_disable_t_handler (vl_api_feature_enable_disable_t * mp)
 {