bonding lacp: replace slave string with member
[vpp.git] / src / vnet / bonding / bond_api.c
index 525f058..2395a47 100644 (file)
 _(BOND_CREATE, bond_create)                      \
 _(BOND_DELETE, bond_delete)                      \
 _(BOND_ENSLAVE, bond_enslave)                    \
+_(BOND_ADD_MEMBER, bond_add_member)                    \
 _(SW_INTERFACE_SET_BOND_WEIGHT, sw_interface_set_bond_weight) \
 _(BOND_DETACH_SLAVE, bond_detach_slave)          \
-_(SW_INTERFACE_BOND_DUMP, sw_interface_bond_dump)\
-_(SW_INTERFACE_SLAVE_DUMP, sw_interface_slave_dump)
+_(BOND_DETACH_MEMBER, bond_detach_member)          \
+_(SW_INTERFACE_BOND_DUMP, sw_interface_bond_dump) \
+_(SW_BOND_INTERFACE_DUMP, sw_bond_interface_dump) \
+_(SW_INTERFACE_SLAVE_DUMP, sw_interface_slave_dump) \
+_(SW_MEMBER_INTERFACE_DUMP, sw_member_interface_dump)
 
 static void
 vl_api_bond_delete_t_handler (vl_api_bond_delete_t * mp)
@@ -98,22 +102,42 @@ vl_api_bond_create_t_handler (vl_api_bond_create_t * mp)
   /* *INDENT-ON* */
 }
 
+static void
+vl_api_bond_add_member_t_handler (vl_api_bond_add_member_t * mp)
+{
+  vlib_main_t *vm = vlib_get_main ();
+  vl_api_bond_add_member_reply_t *rmp;
+  bond_add_member_args_t _a, *ap = &_a;
+  int rv = 0;
+
+  clib_memset (ap, 0, sizeof (*ap));
+
+  ap->group = ntohl (mp->bond_sw_if_index);
+  ap->member = ntohl (mp->sw_if_index);
+  ap->is_passive = mp->is_passive;
+  ap->is_long_timeout = mp->is_long_timeout;
+
+  bond_add_member (vm, ap);
+
+  REPLY_MACRO (VL_API_BOND_ADD_MEMBER_REPLY);
+}
+
 static void
 vl_api_bond_enslave_t_handler (vl_api_bond_enslave_t * mp)
 {
   vlib_main_t *vm = vlib_get_main ();
   vl_api_bond_enslave_reply_t *rmp;
-  bond_enslave_args_t _a, *ap = &_a;
+  bond_add_member_args_t _a, *ap = &_a;
   int rv = 0;
 
   clib_memset (ap, 0, sizeof (*ap));
 
   ap->group = ntohl (mp->bond_sw_if_index);
-  ap->slave = ntohl (mp->sw_if_index);
+  ap->member = ntohl (mp->sw_if_index);
   ap->is_passive = mp->is_passive;
   ap->is_long_timeout = mp->is_long_timeout;
 
-  bond_enslave (vm, ap);
+  bond_add_member (vm, ap);
 
   REPLY_MACRO (VL_API_BOND_ENSLAVE_REPLY);
 }
@@ -142,17 +166,33 @@ vl_api_bond_detach_slave_t_handler (vl_api_bond_detach_slave_t * mp)
 {
   vlib_main_t *vm = vlib_get_main ();
   vl_api_bond_detach_slave_reply_t *rmp;
-  bond_detach_slave_args_t _a, *ap = &_a;
+  bond_detach_member_args_t _a, *ap = &_a;
   int rv = 0;
 
   clib_memset (ap, 0, sizeof (*ap));
 
-  ap->slave = ntohl (mp->sw_if_index);
-  bond_detach_slave (vm, ap);
+  ap->member = ntohl (mp->sw_if_index);
+  bond_detach_member (vm, ap);
 
   REPLY_MACRO (VL_API_BOND_DETACH_SLAVE_REPLY);
 }
 
+static void
+vl_api_bond_detach_member_t_handler (vl_api_bond_detach_member_t * mp)
+{
+  vlib_main_t *vm = vlib_get_main ();
+  vl_api_bond_detach_member_reply_t *rmp;
+  bond_detach_member_args_t _a, *ap = &_a;
+  int rv = 0;
+
+  clib_memset (ap, 0, sizeof (*ap));
+
+  ap->member = ntohl (mp->sw_if_index);
+  bond_detach_member (vm, ap);
+
+  REPLY_MACRO (VL_API_BOND_DETACH_MEMBER_REPLY);
+}
+
 static void
 bond_send_sw_interface_details (vpe_api_main_t * am,
                                vl_api_registration_t * reg,
@@ -172,8 +212,8 @@ bond_send_sw_interface_details (vpe_api_main_t * am,
   mp->mode = htonl (bond_if->mode);
   mp->lb = htonl (bond_if->lb);
   mp->numa_only = bond_if->numa_only;
-  mp->active_slaves = htonl (bond_if->active_slaves);
-  mp->slaves = htonl (bond_if->slaves);
+  mp->active_slaves = htonl (bond_if->active_members);
+  mp->slaves = htonl (bond_if->members);
 
   mp->context = context;
   vl_api_send_msg (reg, (u8 *) mp);
@@ -205,24 +245,83 @@ vl_api_sw_interface_bond_dump_t_handler (vl_api_sw_interface_bond_dump_t * mp)
 }
 
 static void
-bond_send_sw_interface_slave_details (vpe_api_main_t * am,
-                                     vl_api_registration_t * reg,
-                                     slave_interface_details_t * slave_if,
-                                     u32 context)
+bond_send_sw_bond_interface_details (vpe_api_main_t * am,
+                                    vl_api_registration_t * reg,
+                                    bond_interface_details_t * bond_if,
+                                    u32 context)
+{
+  vl_api_sw_bond_interface_details_t *mp;
+
+  mp = vl_msg_api_alloc (sizeof (*mp));
+  clib_memset (mp, 0, sizeof (*mp));
+  mp->_vl_msg_id = htons (VL_API_SW_BOND_INTERFACE_DETAILS);
+  mp->sw_if_index = htonl (bond_if->sw_if_index);
+  mp->id = htonl (bond_if->id);
+  clib_memcpy (mp->interface_name, bond_if->interface_name,
+              MIN (ARRAY_LEN (mp->interface_name) - 1,
+                   strlen ((const char *) bond_if->interface_name)));
+  mp->mode = htonl (bond_if->mode);
+  mp->lb = htonl (bond_if->lb);
+  mp->numa_only = bond_if->numa_only;
+  mp->active_members = htonl (bond_if->active_members);
+  mp->members = htonl (bond_if->members);
+
+  mp->context = context;
+  vl_api_send_msg (reg, (u8 *) mp);
+}
+
+static void
+vl_api_sw_bond_interface_dump_t_handler (vl_api_sw_bond_interface_dump_t * mp)
+{
+  int rv;
+  vpe_api_main_t *am = &vpe_api_main;
+  vl_api_registration_t *reg;
+  bond_interface_details_t *bondifs = NULL;
+  bond_interface_details_t *bond_if = NULL;
+  u32 filter_sw_if_index;
+
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
+
+  filter_sw_if_index = htonl (mp->sw_if_index);
+  if (filter_sw_if_index != ~0)
+    VALIDATE_SW_IF_INDEX (mp);
+
+  rv = bond_dump_ifs (&bondifs);
+  if (rv)
+    return;
+
+  vec_foreach (bond_if, bondifs)
+  {
+    if ((filter_sw_if_index == ~0) ||
+       (bond_if->sw_if_index == filter_sw_if_index))
+      bond_send_sw_bond_interface_details (am, reg, bond_if, mp->context);
+  }
+
+  BAD_SW_IF_INDEX_LABEL;
+  vec_free (bondifs);
+}
+
+static void
+bond_send_sw_member_interface_details (vpe_api_main_t * am,
+                                      vl_api_registration_t * reg,
+                                      member_interface_details_t * member_if,
+                                      u32 context)
 {
   vl_api_sw_interface_slave_details_t *mp;
 
   mp = vl_msg_api_alloc (sizeof (*mp));
   clib_memset (mp, 0, sizeof (*mp));
   mp->_vl_msg_id = htons (VL_API_SW_INTERFACE_SLAVE_DETAILS);
-  mp->sw_if_index = htonl (slave_if->sw_if_index);
-  clib_memcpy (mp->interface_name, slave_if->interface_name,
+  mp->sw_if_index = htonl (member_if->sw_if_index);
+  clib_memcpy (mp->interface_name, member_if->interface_name,
               MIN (ARRAY_LEN (mp->interface_name) - 1,
-                   strlen ((const char *) slave_if->interface_name)));
-  mp->is_passive = slave_if->is_passive;
-  mp->is_long_timeout = slave_if->is_long_timeout;
-  mp->is_local_numa = slave_if->is_local_numa;
-  mp->weight = htonl (slave_if->weight);
+                   strlen ((const char *) member_if->interface_name)));
+  mp->is_passive = member_if->is_passive;
+  mp->is_long_timeout = member_if->is_long_timeout;
+  mp->is_local_numa = member_if->is_local_numa;
+  mp->weight = htonl (member_if->weight);
 
   mp->context = context;
   vl_api_send_msg (reg, (u8 *) mp);
@@ -235,23 +334,73 @@ vl_api_sw_interface_slave_dump_t_handler (vl_api_sw_interface_slave_dump_t *
   int rv;
   vpe_api_main_t *am = &vpe_api_main;
   vl_api_registration_t *reg;
-  slave_interface_details_t *slaveifs = NULL;
-  slave_interface_details_t *slave_if = NULL;
+  member_interface_details_t *memberifs = NULL;
+  member_interface_details_t *member_if = NULL;
+
+  reg = vl_api_client_index_to_registration (mp->client_index);
+  if (!reg)
+    return;
+
+  rv = bond_dump_member_ifs (&memberifs, ntohl (mp->sw_if_index));
+  if (rv)
+    return;
+
+  vec_foreach (member_if, memberifs)
+  {
+    bond_send_sw_member_interface_details (am, reg, member_if, mp->context);
+  }
+
+  vec_free (memberifs);
+}
+
+static void
+bond_send_member_interface_details (vpe_api_main_t * am,
+                                   vl_api_registration_t * reg,
+                                   member_interface_details_t * member_if,
+                                   u32 context)
+{
+  vl_api_sw_member_interface_details_t *mp;
+
+  mp = vl_msg_api_alloc (sizeof (*mp));
+  clib_memset (mp, 0, sizeof (*mp));
+  mp->_vl_msg_id = htons (VL_API_SW_MEMBER_INTERFACE_DETAILS);
+  mp->sw_if_index = htonl (member_if->sw_if_index);
+  clib_memcpy (mp->interface_name, member_if->interface_name,
+              MIN (ARRAY_LEN (mp->interface_name) - 1,
+                   strlen ((const char *) member_if->interface_name)));
+  mp->is_passive = member_if->is_passive;
+  mp->is_long_timeout = member_if->is_long_timeout;
+  mp->is_local_numa = member_if->is_local_numa;
+  mp->weight = htonl (member_if->weight);
+
+  mp->context = context;
+  vl_api_send_msg (reg, (u8 *) mp);
+}
+
+static void
+vl_api_sw_member_interface_dump_t_handler (vl_api_sw_member_interface_dump_t *
+                                          mp)
+{
+  int rv;
+  vpe_api_main_t *am = &vpe_api_main;
+  vl_api_registration_t *reg;
+  member_interface_details_t *memberifs = NULL;
+  member_interface_details_t *member_if = NULL;
 
   reg = vl_api_client_index_to_registration (mp->client_index);
   if (!reg)
     return;
 
-  rv = bond_dump_slave_ifs (&slaveifs, ntohl (mp->sw_if_index));
+  rv = bond_dump_member_ifs (&memberifs, ntohl (mp->sw_if_index));
   if (rv)
     return;
 
-  vec_foreach (slave_if, slaveifs)
+  vec_foreach (member_if, memberifs)
   {
-    bond_send_sw_interface_slave_details (am, reg, slave_if, mp->context);
+    bond_send_member_interface_details (am, reg, member_if, mp->context);
   }
 
-  vec_free (slaveifs);
+  vec_free (memberifs);
 }
 
 #define vl_msg_name_crc_list