bonding: Add GSO support

Add GSO support, configurable from the CLI.

Type: feature
Ticket: VPP-1820

Signed-off-by: Steven Luong <sluong@cisco.com>
Change-Id: I65885a071b24c74437e6cfe5eff237b01bc1744b
This commit is contained in:
Steven Luong
2020-01-06 15:14:46 -08:00
committed by Andrew Yourtchenko
parent 03c0ef95cb
commit a06f68556e
2 changed files with 21 additions and 2 deletions

View File

@ -344,6 +344,7 @@ bond_create_if (vlib_main_t * vm, bond_create_if_args_t * args)
vnet_main_t *vnm = vnet_get_main (); vnet_main_t *vnm = vnet_get_main ();
vnet_sw_interface_t *sw; vnet_sw_interface_t *sw;
bond_if_t *bif; bond_if_t *bif;
vnet_hw_interface_t *hw;
if ((args->mode == BOND_MODE_LACP) && bm->lacp_plugin_loaded == 0) if ((args->mode == BOND_MODE_LACP) && bm->lacp_plugin_loaded == 0)
{ {
@ -369,6 +370,7 @@ bond_create_if (vlib_main_t * vm, bond_create_if_args_t * args)
bif->id = args->id; bif->id = args->id;
bif->lb = args->lb; bif->lb = args->lb;
bif->mode = args->mode; bif->mode = args->mode;
bif->gso = args->gso;
// Adjust requested interface id // Adjust requested interface id
if (bif->id == ~0) if (bif->id == ~0)
@ -419,6 +421,10 @@ bond_create_if (vlib_main_t * vm, bond_create_if_args_t * args)
bif->sw_if_index = sw->sw_if_index; bif->sw_if_index = sw->sw_if_index;
bif->group = bif->sw_if_index; bif->group = bif->sw_if_index;
bif->numa_only = args->numa_only; bif->numa_only = args->numa_only;
hw = vnet_get_hw_interface (vnm, bif->hw_if_index);
hw->flags |= (VNET_HW_INTERFACE_FLAG_SUPPORTS_GSO |
VNET_HW_INTERFACE_FLAG_SUPPORTS_TX_L4_CKSUM_OFFLOAD);
if (vlib_get_thread_main ()->n_vlib_mains > 1) if (vlib_get_thread_main ()->n_vlib_mains > 1)
clib_spinlock_init (&bif->lockp); clib_spinlock_init (&bif->lockp);
@ -461,6 +467,8 @@ bond_create_command_fn (vlib_main_t * vm, unformat_input_t * input,
args.hw_addr_set = 1; args.hw_addr_set = 1;
else if (unformat (line_input, "id %u", &args.id)) else if (unformat (line_input, "id %u", &args.id))
; ;
else if (unformat (line_input, "gso"))
args.gso = 1;
else if (unformat (line_input, "numa-only")) else if (unformat (line_input, "numa-only"))
{ {
if (args.mode == BOND_MODE_LACP) if (args.mode == BOND_MODE_LACP)
@ -491,8 +499,8 @@ bond_create_command_fn (vlib_main_t * vm, unformat_input_t * input,
VLIB_CLI_COMMAND (bond_create_command, static) = { VLIB_CLI_COMMAND (bond_create_command, static) = {
.path = "create bond", .path = "create bond",
.short_help = "create bond mode {round-robin | active-backup | broadcast | " .short_help = "create bond mode {round-robin | active-backup | broadcast | "
"{lacp | xor} [load-balance { l2 | l23 | l34 } [numa-only]]} [hw-addr <mac-address>] " "{lacp | xor} [load-balance { l2 | l23 | l34 } [numa-only]]} "
"[id <if-id>]", "[hw-addr <mac-address>] [id <if-id>] [gso]",
.function = bond_create_command_fn, .function = bond_create_command_fn,
}; };
/* *INDENT-ON* */ /* *INDENT-ON* */
@ -580,6 +588,13 @@ bond_enslave (vlib_main_t * vm, bond_enslave_args_t * args)
clib_error_return (0, "bond interface cannot be enslaved"); clib_error_return (0, "bond interface cannot be enslaved");
return; return;
} }
if (bif->gso && !(sif_hw->flags & VNET_HW_INTERFACE_FLAG_SUPPORTS_GSO))
{
args->rv = VNET_API_ERROR_INVALID_INTERFACE;
args->error =
clib_error_return (0, "slave interface is not gso capable");
return;
}
if (bif->mode == BOND_MODE_LACP) if (bif->mode == BOND_MODE_LACP)
{ {
u8 *name = format (0, "/if/lacp/%u/%u/state%c", bif->sw_if_index, u8 *name = format (0, "/if/lacp/%u/%u/state%c", bif->sw_if_index,
@ -851,6 +866,8 @@ show_bond_details (vlib_main_t * vm)
format_bond_mode, bif->mode); format_bond_mode, bif->mode);
vlib_cli_output (vm, " load balance: %U", vlib_cli_output (vm, " load balance: %U",
format_bond_load_balance, bif->lb); format_bond_load_balance, bif->lb);
if (bif->gso)
vlib_cli_output (vm, " gso enable");
if (bif->mode == BOND_MODE_ROUND_ROBIN) if (bif->mode == BOND_MODE_ROUND_ROBIN)
vlib_cli_output (vm, " last xmit slave index: %u", vlib_cli_output (vm, " last xmit slave index: %u",
bif->lb_rr_last_index); bif->lb_rr_last_index);

View File

@ -83,6 +83,7 @@ typedef struct
u8 mode; u8 mode;
u8 lb; u8 lb;
u8 numa_only; u8 numa_only;
u8 gso;
/* return */ /* return */
u32 sw_if_index; u32 sw_if_index;
int rv; int rv;
@ -193,6 +194,7 @@ typedef struct
on local numa node works for lacp mode if have at least one, on local numa node works for lacp mode if have at least one,
otherwise it works as usual. */ otherwise it works as usual. */
u8 numa_only; u8 numa_only;
u8 gso;
/* How many slaves on local numa node are there in lacp mode? */ /* How many slaves on local numa node are there in lacp mode? */
word n_numa_slaves; word n_numa_slaves;