linux-cp: add add_del_v3 and get_v2 methods 77/40277/2
authorAnton Nikolaev <anikolaev@netgate.com>
Tue, 30 Jan 2024 11:54:00 +0000 (11:54 +0000)
committerAnton Nikolaev <anikolaev@netgate.com>
Tue, 30 Jan 2024 12:07:12 +0000 (12:07 +0000)
Added vl_api_lcp_itf_pair_add_del_v3_t_handler method, it can return
vif_index in reply. Also added vl_api_lcp_itf_pair_get_v2_t_handler
methods, this method is able to dump only one lcp pair or dump all
lcp pairs via stream_msg.

Type: improvement
Change-Id: I1d25344ee57f8fac8b857bb3a9a03116230b4d2c
Signed-off-by: Anton Nikolaev <anikolaev@netgate.com>
src/plugins/linux-cp/lcp.api
src/plugins/linux-cp/lcp_api.c

index adef1b8..e7eaa5a 100644 (file)
@@ -103,6 +103,27 @@ define lcp_itf_pair_add_del_v2_reply
   i32 retval;
   vl_api_interface_index_t host_sw_if_index;
 };
+autoendian define lcp_itf_pair_add_del_v3
+{
+  option in_progress;
+
+  u32 client_index;
+  u32 context;
+  bool is_add;
+  vl_api_interface_index_t sw_if_index;
+  string host_if_name[16];             /* IFNAMSIZ */
+  vl_api_lcp_itf_host_type_t host_if_type;
+  string netns[32];                    /* LCP_NS_LEN */
+};
+define lcp_itf_pair_add_del_v3_reply
+{
+  option in_progress;
+
+  u32 context;
+  i32 retval;
+  u32 vif_index;
+  vl_api_interface_index_t host_sw_if_index;
+};
 
 /** \brief Dump Linux Control Plane interface pair data
     @param client_index - opaque cookie to identify the sender
@@ -121,6 +142,19 @@ autoendian define lcp_itf_pair_get_reply
   i32 retval;
   u32 cursor;
 };
+autoendian define lcp_itf_pair_get_v2
+{
+  u32 client_index;
+  u32 context;
+  u32 cursor;
+  vl_api_interface_index_t sw_if_index;
+};
+autoendian define lcp_itf_pair_get_v2_reply
+{
+  u32 context;
+  i32 retval;
+  u32 cursor;
+};
 
 /** \brief Linux Control Plane interface pair dump response
     @param context - sender context which was passed in the request
@@ -148,6 +182,11 @@ service {
     stream lcp_itf_pair_details;
 };
 
+service {
+  rpc lcp_itf_pair_get_v2 returns lcp_itf_pair_get_v2_reply
+    stream lcp_itf_pair_details;
+};
+
 /** \brief Replace end/begin
  */
 autoreply define lcp_itf_pair_replace_begin
index a217aa7..991516a 100644 (file)
@@ -45,7 +45,7 @@ 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)
+                        u32 *host_sw_if_index_p, u32 *vif_index_p)
 {
   u8 *host_if_name, *netns;
   int host_len, netns_len, rv;
@@ -64,6 +64,13 @@ vl_api_lcp_itf_pair_add (u32 phy_sw_if_index, lip_host_type_t lip_host_type,
   rv = lcp_itf_pair_create (phy_sw_if_index, host_if_name, lip_host_type,
                            netns, host_sw_if_index_p);
 
+  if (!rv && (vif_index_p != NULL))
+    {
+      lcp_itf_pair_t *pair =
+       lcp_itf_pair_get (lcp_itf_pair_find_by_phy (phy_sw_if_index));
+      *vif_index_p = pair->lip_vif_index;
+    }
+
   vec_free (host_if_name);
   vec_free (netns);
 
@@ -86,7 +93,7 @@ vl_api_lcp_itf_pair_add_del_t_handler (vl_api_lcp_itf_pair_add_del_t *mp)
     {
       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);
+       sizeof (mp->host_if_name), mp->netns, sizeof (mp->netns), NULL, NULL);
     }
   else
     {
@@ -111,10 +118,10 @@ vl_api_lcp_itf_pair_add_del_v2_t_handler (vl_api_lcp_itf_pair_add_del_v2_t *mp)
   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);
+      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, NULL);
     }
   else
     {
@@ -126,6 +133,37 @@ vl_api_lcp_itf_pair_add_del_v2_t_handler (vl_api_lcp_itf_pair_add_del_v2_t *mp)
                    { rmp->host_sw_if_index = host_sw_if_index; });
 }
 
+static void
+vl_api_lcp_itf_pair_add_del_v3_t_handler (vl_api_lcp_itf_pair_add_del_v3_t *mp)
+{
+  u32 phy_sw_if_index, host_sw_if_index = ~0, vif_index = ~0;
+  vl_api_lcp_itf_pair_add_del_v3_reply_t *rmp;
+  lip_host_type_t lip_host_type;
+  int rv;
+
+  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)
+    {
+      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, &vif_index);
+    }
+  else
+    {
+      rv = lcp_itf_pair_delete (phy_sw_if_index);
+    }
+
+  BAD_SW_IF_INDEX_LABEL;
+  REPLY_MACRO2_END (VL_API_LCP_ITF_PAIR_ADD_DEL_V3_REPLY, ({
+                     rmp->host_sw_if_index = host_sw_if_index;
+                     rmp->vif_index = vif_index;
+                   }));
+}
+
 static void
 send_lcp_itf_pair_details (index_t lipi, vl_api_registration_t *rp,
                           u32 context)
@@ -161,6 +199,31 @@ vl_api_lcp_itf_pair_get_t_handler (vl_api_lcp_itf_pair_get_t *mp)
     ({ send_lcp_itf_pair_details (cursor, rp, mp->context); }));
 }
 
+static void
+vl_api_lcp_itf_pair_get_v2_t_handler (vl_api_lcp_itf_pair_get_v2_t *mp)
+{
+  vl_api_lcp_itf_pair_get_v2_reply_t *rmp;
+  i32 rv = 0;
+
+  if (mp->sw_if_index == ~0)
+    {
+      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); }));
+    }
+  else
+    {
+      VALIDATE_SW_IF_INDEX_END (mp);
+      send_lcp_itf_pair_details (
+       lcp_itf_pair_find_by_phy (mp->sw_if_index),
+       vl_api_client_index_to_registration (mp->client_index), mp->context);
+
+      BAD_SW_IF_INDEX_LABEL;
+      REPLY_MACRO2_END (VL_API_LCP_ITF_PAIR_GET_V2_REPLY,
+                       ({ rmp->cursor = ~0; }));
+    }
+}
+
 static void
 vl_api_lcp_default_ns_set_t_handler (vl_api_lcp_default_ns_set_t *mp)
 {