From ea7178631ef292530993e0c91bf86f1ca9ae99d4 Mon Sep 17 00:00:00 2001 From: Steven Luong Date: Thu, 30 Jul 2020 07:31:40 -0700 Subject: [PATCH] bonding: add bond_create2 API to include gso option gso option is available for the debug CLI version of bond create. This patch is to create a new API to have the corresponding option in the binary API. The old binary API bond_create is marked deprecated. Type: improvement Signed-off-by: Steven Luong Change-Id: Id9501b8e6d267ae09e2b411957f181343da459c0 --- src/vat/api_format.c | 107 ++++++++++++++++++++++++++++++++++++++++++++ src/vnet/bonding/bond.api | 45 +++++++++++++++++-- src/vnet/bonding/bond_api.c | 34 ++++++++++++++ src/vpp/api/custom_dump.c | 26 +++++++++++ test/test_bond.py | 24 ++++++---- test/vpp_bond_interface.py | 18 +++++--- 6 files changed, 234 insertions(+), 20 deletions(-) diff --git a/src/vat/api_format.c b/src/vat/api_format.c index bbe5a04df33..f1935dee33a 100644 --- a/src/vat/api_format.c +++ b/src/vat/api_format.c @@ -1931,6 +1931,41 @@ static void vl_api_bond_create_reply_t_handler_json vam->result_ready = 1; } +static void +vl_api_bond_create2_reply_t_handler (vl_api_bond_create2_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + i32 retval = ntohl (mp->retval); + + if (vam->async_mode) + { + vam->async_errors += (retval < 0); + } + else + { + vam->retval = retval; + vam->sw_if_index = ntohl (mp->sw_if_index); + vam->result_ready = 1; + } +} + +static void vl_api_bond_create2_reply_t_handler_json + (vl_api_bond_create2_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t node; + + vat_json_init_object (&node); + vat_json_object_add_int (&node, "retval", ntohl (mp->retval)); + vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index)); + + vat_json_print (vam->ofp, &node); + vat_json_free (&node); + + vam->retval = ntohl (mp->retval); + vam->result_ready = 1; +} + static void vl_api_bond_delete_reply_t_handler (vl_api_bond_delete_reply_t * mp) { @@ -5281,6 +5316,7 @@ _(VIRTIO_PCI_CREATE_V2_REPLY, virtio_pci_create_v2_reply) \ _(VIRTIO_PCI_DELETE_REPLY, virtio_pci_delete_reply) \ _(SW_INTERFACE_VIRTIO_PCI_DETAILS, sw_interface_virtio_pci_details) \ _(BOND_CREATE_REPLY, bond_create_reply) \ +_(BOND_CREATE2_REPLY, bond_create2_reply) \ _(BOND_DELETE_REPLY, bond_delete_reply) \ _(BOND_ADD_MEMBER_REPLY, bond_add_member_reply) \ _(BOND_DETACH_MEMBER_REPLY, bond_detach_member_reply) \ @@ -7769,6 +7805,73 @@ api_bond_create (vat_main_t * vam) return ret; } +static int +api_bond_create2 (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_bond_create2_t *mp; + u8 mac_address[6]; + u8 custom_mac = 0; + int ret; + u8 mode; + u8 lb; + u8 mode_is_set = 0; + u32 id = ~0; + u8 numa_only = 0; + u8 gso = 0; + + clib_memset (mac_address, 0, sizeof (mac_address)); + lb = BOND_LB_L2; + + /* Parse args required to build the message */ + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "mode %U", unformat_bond_mode, &mode)) + mode_is_set = 1; + else if (((mode == BOND_MODE_LACP) || (mode == BOND_MODE_XOR)) + && unformat (i, "lb %U", unformat_bond_load_balance, &lb)) + ; + else if (unformat (i, "hw-addr %U", unformat_ethernet_address, + mac_address)) + custom_mac = 1; + else if (unformat (i, "numa-only")) + numa_only = 1; + else if (unformat (i, "gso")) + gso = 1; + else if (unformat (i, "id %u", &id)) + ; + else + break; + } + + if (mode_is_set == 0) + { + errmsg ("Missing bond mode. "); + return -99; + } + + /* Construct the API message */ + M (BOND_CREATE2, mp); + + mp->use_custom_mac = custom_mac; + + mp->mode = htonl (mode); + mp->lb = htonl (lb); + mp->id = htonl (id); + mp->numa_only = numa_only; + mp->enable_gso = gso; + + if (custom_mac) + clib_memcpy (mp->mac_address, mac_address, 6); + + /* send it... */ + S (mp); + + /* Wait for a reply... */ + W (ret); + return ret; +} + static int api_bond_delete (vat_main_t * vam) { @@ -20716,6 +20819,10 @@ _(bond_create, \ "[hw-addr ] {round-robin | active-backup | " \ "broadcast | {lacp | xor} [load-balance { l2 | l23 | l34 }]} " \ "[id ]") \ +_(bond_create2, \ + "[hw-addr ] {mode round-robin | active-backup | " \ + "broadcast | {lacp | xor} [load-balance { l2 | l23 | l34 }]} " \ + "[id ] [gso]") \ _(bond_delete, \ " | sw_if_index ") \ _(bond_add_member, \ diff --git a/src/vnet/bonding/bond.api b/src/vnet/bonding/bond.api index 682298e9084..3a882b4f172 100644 --- a/src/vnet/bonding/bond.api +++ b/src/vnet/bonding/bond.api @@ -55,6 +55,7 @@ enum bond_lb_algo */ define bond_create { + option deprecated; u32 client_index; u32 context; u32 id [default=0xFFFFFFFF]; @@ -77,6 +78,42 @@ define bond_create_reply vl_api_interface_index_t sw_if_index; }; +/** \brief Initialize a new bond interface with the given paramters + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param mode - mode, required (1=round-robin, 2=active-backup, 3=xor, 4=broadcast, 5=lacp) + @param lb - load balance, optional (0=l2, 1=l34, 2=l23) valid for xor and lacp modes. Otherwise ignored (default=l2) + @param numa_only - if numa_only is set, pkts will be transmitted by LAG members on local numa node only if have at least one, otherwise it works as usual. + @param enable_gso - enable gso support (default 0) + @param use_custom_mac - if set, mac_address is valid + @param mac_address - mac addr to assign to the interface if use_custom_mac is set + @param id - if non-~0, specifies a custom interface ID (default=0xFFFFFFFF) +*/ +define bond_create2 +{ + u32 client_index; + u32 context; + vl_api_bond_mode_t mode; + vl_api_bond_lb_algo_t lb; + bool numa_only; + bool enable_gso; + bool use_custom_mac; + vl_api_mac_address_t mac_address; + u32 id [default=0xFFFFFFFF]; +}; + +/** \brief Reply for bond create2 reply + @param context - returned sender context, to match reply w/ request + @param retval - return code + @param sw_if_index - software index allocated for the new tap interface +*/ +define bond_create2_reply +{ + u32 context; + i32 retval; + vl_api_interface_index_t sw_if_index; +}; + /** \brief Delete bond interface @param client_index - opaque cookie to identify the sender @param context - sender context, to match reply w/ request @@ -99,7 +136,7 @@ autoreply define bond_delete */ define bond_enslave { - option deprecated="20.06"; + option deprecated; u32 client_index; u32 context; vl_api_interface_index_t sw_if_index; @@ -153,7 +190,7 @@ define bond_add_member_reply */ autoreply define bond_detach_slave { - option deprecated="20.06"; + option deprecated; u32 client_index; u32 context; vl_api_interface_index_t sw_if_index; @@ -174,7 +211,7 @@ autoreply define bond_detach_member /** \brief Dump bond interfaces request */ define sw_interface_bond_dump { - option deprecated="20.06"; + option deprecated; u32 client_index; u32 context; }; @@ -240,7 +277,7 @@ define sw_bond_interface_details */ define sw_interface_slave_dump { - option deprecated="20.06"; + option deprecated; u32 client_index; u32 context; vl_api_interface_index_t sw_if_index; diff --git a/src/vnet/bonding/bond_api.c b/src/vnet/bonding/bond_api.c index 4306e3cba9f..8b8385d8205 100644 --- a/src/vnet/bonding/bond_api.c +++ b/src/vnet/bonding/bond_api.c @@ -46,6 +46,7 @@ #define foreach_bond_api_msg \ _(BOND_CREATE, bond_create) \ +_(BOND_CREATE2, bond_create2) \ _(BOND_DELETE, bond_delete) \ _(BOND_ENSLAVE, bond_enslave) \ _(BOND_ADD_MEMBER, bond_add_member) \ @@ -102,6 +103,39 @@ vl_api_bond_create_t_handler (vl_api_bond_create_t * mp) /* *INDENT-ON* */ } +static void +vl_api_bond_create2_t_handler (vl_api_bond_create2_t * mp) +{ + vlib_main_t *vm = vlib_get_main (); + vl_api_bond_create2_reply_t *rmp; + bond_create_if_args_t _a, *ap = &_a; + + clib_memset (ap, 0, sizeof (*ap)); + + ap->id = ntohl (mp->id); + + if (mp->use_custom_mac) + { + mac_address_decode (mp->mac_address, (mac_address_t *) ap->hw_addr); + ap->hw_addr_set = 1; + } + + ap->mode = ntohl (mp->mode); + ap->lb = ntohl (mp->lb); + ap->numa_only = mp->numa_only; + ap->gso = mp->enable_gso; + bond_create_if (vm, ap); + + int rv = ap->rv; + + /* *INDENT-OFF* */ + REPLY_MACRO2(VL_API_BOND_CREATE2_REPLY, + ({ + rmp->sw_if_index = ntohl (ap->sw_if_index); + })); + /* *INDENT-ON* */ +} + static void vl_api_bond_add_member_t_handler (vl_api_bond_add_member_t * mp) { diff --git a/src/vpp/api/custom_dump.c b/src/vpp/api/custom_dump.c index 79e5da499f2..8c5e0e52e54 100644 --- a/src/vpp/api/custom_dump.c +++ b/src/vpp/api/custom_dump.c @@ -717,6 +717,31 @@ static void *vl_api_bond_create_t_print FINISH; } +static void *vl_api_bond_create2_t_print + (vl_api_bond_create2_t * mp, void *handle) +{ + u8 *s; + u8 null_mac[6]; + + clib_memset (null_mac, 0, sizeof (null_mac)); + + s = format (0, "SCRIPT: bond_create2 "); + if (memcmp (mp->mac_address, null_mac, 6)) + s = format (s, "mac-address %U ", + format_ethernet_address, mp->mac_address); + if (mp->mode) + s = format (s, "mode %U ", format_bond_mode, ntohl (mp->mode)); + if (mp->lb) + s = format (s, "lb %U ", format_bond_load_balance, ntohl (mp->lb)); + if (mp->numa_only) + s = format (s, "numa-only "); + if (mp->enable_gso) + s = format (s, "gso "); + if (mp->id != ~0) + s = format (s, "id %u ", (mp->id)); + FINISH; +} + static void *vl_api_bond_delete_t_print (vl_api_bond_delete_t * mp, void *handle) { @@ -3592,6 +3617,7 @@ _(SW_INTERFACE_SET_VPATH, sw_interface_set_vpath) \ _(SW_INTERFACE_SET_VXLAN_BYPASS, sw_interface_set_vxlan_bypass) \ _(SW_INTERFACE_SET_GENEVE_BYPASS, sw_interface_set_geneve_bypass) \ _(BOND_CREATE, bond_create) \ +_(BOND_CREATE2, bond_create2) \ _(BOND_DELETE, bond_delete) \ _(BOND_ADD_MEMBER, bond_add_member) \ _(BOND_DETACH_MEMBER, bond_detach_member) \ diff --git a/test/test_bond.py b/test/test_bond.py index c5d786fc526..5df86ae5b0f 100644 --- a/test/test_bond.py +++ b/test/test_bond.py @@ -63,12 +63,13 @@ class TestBondInterface(VppTestCase): # self.logger.info("create bond") bond0_mac = "02:fe:38:30:59:3c" mac = MACAddress(bond0_mac).packed - bond0 = VppBondInterface(self, - mode=3, - lb=1, - numa_only=0, - use_custom_mac=1, - mac_address=mac) + bond0 = VppBondInterface( + self, + mode=VppEnum.vl_api_bond_mode_t.BOND_API_MODE_XOR, + lb=VppEnum.vl_api_bond_lb_algo_t.BOND_API_LB_ALGO_L34, + numa_only=0, + use_custom_mac=1, + mac_address=mac) bond0.add_vpp_config() bond0.admin_up() self.vapi.sw_interface_add_del_address( @@ -169,7 +170,10 @@ class TestBondInterface(VppTestCase): # create interface (BondEthernet0) and set bond mode to LACP self.logger.info("create bond") - bond0 = VppBondInterface(self, mode=5) + bond0 = VppBondInterface( + self, + mode=VppEnum.vl_api_bond_mode_t.BOND_API_MODE_LACP, + enable_gso=0) bond0.add_vpp_config() bond0.admin_up() @@ -222,12 +226,14 @@ class TestBondInterface(VppTestCase): self.logger.info("Bond add interfaces") # create interface 1 (BondEthernet0) - bond0 = VppBondInterface(self, mode=5) + bond0 = VppBondInterface( + self, mode=VppEnum.vl_api_bond_mode_t.BOND_API_MODE_LACP) bond0.add_vpp_config() bond0.admin_up() # create interface 2 (BondEthernet1) - bond1 = VppBondInterface(self, mode=3) + bond1 = VppBondInterface( + self, mode=VppEnum.vl_api_bond_mode_t.BOND_API_MODE_XOR) bond1.add_vpp_config() bond1.admin_up() diff --git a/test/vpp_bond_interface.py b/test/vpp_bond_interface.py index 8ad7bceac70..60c1ac1557b 100644 --- a/test/vpp_bond_interface.py +++ b/test/vpp_bond_interface.py @@ -5,23 +5,27 @@ from vpp_interface import VppInterface class VppBondInterface(VppInterface): """VPP bond interface.""" - def __init__(self, test, mode, lb=0, numa_only=0, - use_custom_mac=0, mac_address=''): + def __init__(self, test, mode, lb=0, numa_only=0, enable_gso=0, + use_custom_mac=0, mac_address='', id=0xFFFFFFFF): """ Create VPP Bond interface """ super(VppBondInterface, self).__init__(test) self.mode = mode self.lb = lb self.numa_only = numa_only + self.enable_gso = enable_gso self.use_custom_mac = use_custom_mac self.mac_address = mac_address + self.id = id def add_vpp_config(self): - r = self.test.vapi.bond_create(self.mode, - self.lb, - self.numa_only, - self.use_custom_mac, - self.mac_address) + r = self.test.vapi.bond_create2(self.mode, + self.lb, + self.numa_only, + self.enable_gso, + self.use_custom_mac, + self.mac_address, + self.id) self.set_sw_if_index(r.sw_if_index) def remove_vpp_config(self): -- 2.16.6