vppapigen: enable codegen for stream message types
[vpp.git] / src / plugins / linux-cp / lcp_api.c
index 409aa72..638d9f7 100644 (file)
@@ -41,20 +41,33 @@ api_encode_host_type (lip_host_type_t type)
   return LCP_API_ITF_HOST_TAP;
 }
 
-void
-lcp_set_auto_intf (u8 is_auto)
+static int
+vl_api_lcp_itf_pair_add (u32 phy_sw_if_index, lip_host_type_t lip_host_type,
+                        u8 *mp_host_if_name, size_t sizeof_host_if_name,
+                        u8 *mp_namespace, size_t sizeof_mp_namespace,
+                        u32 *host_sw_if_index_p)
 {
-  lcp_main_t *lcpm = &lcp_main;
+  u8 *host_if_name, *netns;
+  int host_len, netns_len, rv;
 
-  lcpm->auto_intf = (is_auto != 0);
-}
+  host_if_name = netns = 0;
 
-int
-lcp_auto_intf (void)
-{
-  lcp_main_t *lcpm = &lcp_main;
+  /* lcp_itf_pair_create expects vec of u8 */
+  host_len = clib_strnlen ((char *) mp_host_if_name, sizeof_host_if_name - 1);
+  vec_add (host_if_name, mp_host_if_name, host_len);
+  vec_add1 (host_if_name, 0);
+
+  netns_len = clib_strnlen ((char *) mp_namespace, sizeof_mp_namespace - 1);
+  vec_add (netns, mp_namespace, netns_len);
+  vec_add1 (netns, 0);
+
+  rv = lcp_itf_pair_create (phy_sw_if_index, host_if_name, lip_host_type,
+                           netns, host_sw_if_index_p);
 
-  return lcpm->auto_intf;
+  vec_free (host_if_name);
+  vec_free (netns);
+
+  return rv;
 }
 
 static void
@@ -65,37 +78,43 @@ vl_api_lcp_itf_pair_add_del_t_handler (vl_api_lcp_itf_pair_add_del_t *mp)
   lip_host_type_t lip_host_type;
   int rv;
 
-  if (!vnet_sw_if_index_is_api_valid (mp->sw_if_index))
-    {
-      rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;
-      goto bad_sw_if_index;
-    }
+  VALIDATE_SW_IF_INDEX_END (mp);
 
   phy_sw_if_index = mp->sw_if_index;
   lip_host_type = api_decode_host_type (mp->host_if_type);
   if (mp->is_add)
     {
-      u8 *host_if_name, *netns;
-      int host_len, netns_len;
-
-      host_if_name = netns = 0;
+      rv = vl_api_lcp_itf_pair_add (
+       phy_sw_if_index, lip_host_type, mp->host_if_name,
+       sizeof (mp->host_if_name), mp->netns, sizeof (mp->netns), NULL);
+    }
+  else
+    {
+      rv = lcp_itf_pair_delete (phy_sw_if_index);
+    }
 
-      /* lcp_itf_pair_create expects vec of u8 */
-      host_len = clib_strnlen ((char *) mp->host_if_name,
-                              sizeof (mp->host_if_name) - 1);
-      vec_add (host_if_name, mp->host_if_name, host_len);
-      vec_add1 (host_if_name, 0);
+  BAD_SW_IF_INDEX_LABEL;
+  REPLY_MACRO_END (VL_API_LCP_ITF_PAIR_ADD_DEL_REPLY);
+}
 
-      netns_len =
-       clib_strnlen ((char *) mp->namespace, sizeof (mp->namespace) - 1);
-      vec_add (netns, mp->namespace, netns_len);
-      vec_add1 (netns, 0);
+static void
+vl_api_lcp_itf_pair_add_del_v2_t_handler (vl_api_lcp_itf_pair_add_del_v2_t *mp)
+{
+  u32 phy_sw_if_index, host_sw_if_index = ~0;
+  vl_api_lcp_itf_pair_add_del_v2_reply_t *rmp;
+  lip_host_type_t lip_host_type;
+  int rv;
 
-      rv = lcp_itf_pair_create (phy_sw_if_index, host_if_name, lip_host_type,
-                               netns);
+  VALIDATE_SW_IF_INDEX_END (mp);
 
-      vec_free (host_if_name);
-      vec_free (netns);
+  phy_sw_if_index = mp->sw_if_index;
+  lip_host_type = api_decode_host_type (mp->host_if_type);
+  if (mp->is_add)
+    {
+      rv = vl_api_lcp_itf_pair_add (phy_sw_if_index, lip_host_type,
+                                   mp->host_if_name,
+                                   sizeof (mp->host_if_name), mp->netns,
+                                   sizeof (mp->netns), &host_sw_if_index);
     }
   else
     {
@@ -103,7 +122,8 @@ vl_api_lcp_itf_pair_add_del_t_handler (vl_api_lcp_itf_pair_add_del_t *mp)
     }
 
   BAD_SW_IF_INDEX_LABEL;
-  REPLY_MACRO (VL_API_LCP_ITF_PAIR_ADD_DEL_REPLY);
+  REPLY_MACRO2_END (VL_API_LCP_ITF_PAIR_ADD_DEL_V2_REPLY,
+                   { rmp->host_sw_if_index = host_sw_if_index; });
 }
 
 static void
@@ -113,19 +133,20 @@ send_lcp_itf_pair_details (index_t lipi, vl_api_registration_t *rp,
   vl_api_lcp_itf_pair_details_t *rmp;
   lcp_itf_pair_t *lcp_pair = lcp_itf_pair_get (lipi);
 
-  REPLY_MACRO_DETAILS4 (
+  REPLY_MACRO_DETAILS4_END (
     VL_API_LCP_ITF_PAIR_DETAILS, rp, context, ({
       rmp->phy_sw_if_index = lcp_pair->lip_phy_sw_if_index;
       rmp->host_sw_if_index = lcp_pair->lip_host_sw_if_index;
       rmp->vif_index = lcp_pair->lip_vif_index;
       rmp->host_if_type = api_encode_host_type (lcp_pair->lip_host_type);
 
-      clib_strncpy ((char *) rmp->host_if_name,
-                   (char *) lcp_pair->lip_host_name,
-                   vec_len (lcp_pair->lip_host_name) - 1);
+      memcpy_s (rmp->host_if_name, sizeof (rmp->host_if_name),
+               lcp_pair->lip_host_name, vec_len (lcp_pair->lip_host_name));
+      rmp->host_if_name[vec_len (lcp_pair->lip_host_name)] = 0;
 
-      clib_strncpy ((char *) rmp->namespace, (char *) lcp_pair->lip_namespace,
-                   vec_len (lcp_pair->lip_namespace));
+      memcpy_s (rmp->netns, sizeof (rmp->netns), lcp_pair->lip_namespace,
+               vec_len (lcp_pair->lip_namespace));
+      rmp->netns[vec_len (lcp_pair->lip_namespace)] = 0;
     }));
 }
 
@@ -135,7 +156,7 @@ vl_api_lcp_itf_pair_get_t_handler (vl_api_lcp_itf_pair_get_t *mp)
   vl_api_lcp_itf_pair_get_reply_t *rmp;
   i32 rv = 0;
 
-  REPLY_AND_DETAILS_MACRO (
+  REPLY_AND_DETAILS_MACRO_END (
     VL_API_LCP_ITF_PAIR_GET_REPLY, lcp_itf_pair_pool,
     ({ send_lcp_itf_pair_details (cursor, rp, mp->context); }));
 }
@@ -146,8 +167,8 @@ vl_api_lcp_default_ns_set_t_handler (vl_api_lcp_default_ns_set_t *mp)
   vl_api_lcp_default_ns_set_reply_t *rmp;
   int rv;
 
-  mp->namespace[LCP_NS_LEN - 1] = 0;
-  rv = lcp_set_default_ns (mp->namespace);
+  mp->netns[LCP_NS_LEN - 1] = 0;
+  rv = lcp_set_default_ns (mp->netns);
 
   REPLY_MACRO (VL_API_LCP_DEFAULT_NS_SET_REPLY);
 }
@@ -155,7 +176,6 @@ vl_api_lcp_default_ns_set_t_handler (vl_api_lcp_default_ns_set_t *mp)
 static void
 vl_api_lcp_default_ns_get_t_handler (vl_api_lcp_default_ns_get_t *mp)
 {
-  lcp_main_t *lcpm = &lcp_main;
   vl_api_lcp_default_ns_get_reply_t *rmp;
   vl_api_registration_t *reg;
   char *ns;
@@ -164,16 +184,12 @@ vl_api_lcp_default_ns_get_t_handler (vl_api_lcp_default_ns_get_t *mp)
   if (!reg)
     return;
 
-  rmp = vl_msg_api_alloc (sizeof (*rmp));
-  clib_memset (rmp, 0, sizeof (*rmp));
-  rmp->_vl_msg_id = (VL_API_LCP_DEFAULT_NS_GET_REPLY + lcpm->msg_id_base);
-  rmp->context = mp->context;
-
-  ns = (char *) lcp_get_default_ns ();
-  if (ns)
-    clib_strncpy ((char *) rmp->namespace, ns, LCP_NS_LEN - 1);
-
-  vl_api_send_msg (reg, (u8 *) rmp);
+  REPLY_MACRO_DETAILS2_END (VL_API_LCP_DEFAULT_NS_GET_REPLY, ({
+                             ns = (char *) lcp_get_default_ns ();
+                             if (ns)
+                               clib_strncpy ((char *) rmp->netns, ns,
+                                             LCP_NS_LEN - 1);
+                           }));
 }
 
 static void
@@ -206,7 +222,7 @@ vl_api_lcp_itf_pair_replace_end_t_handler (
 #include <linux-cp/lcp.api.c>
 
 static clib_error_t *
-lcp_plugin_api_hookup (vlib_main_t *vm)
+lcp_api_init (vlib_main_t *vm)
 {
   /* Ask for a correctly-sized block of API message decode slots */
   lcp_msg_id_base = setup_message_id_table ();
@@ -214,7 +230,7 @@ lcp_plugin_api_hookup (vlib_main_t *vm)
   return (NULL);
 }
 
-VLIB_INIT_FUNCTION (lcp_plugin_api_hookup);
+VLIB_INIT_FUNCTION (lcp_api_init);
 
 #include <vpp/app/version.h>
 VLIB_PLUGIN_REGISTER () = {