diff options
Diffstat (limited to 'src/vnet/bonding/cli.c')
-rw-r--r-- | src/vnet/bonding/cli.c | 108 |
1 files changed, 48 insertions, 60 deletions
diff --git a/src/vnet/bonding/cli.c b/src/vnet/bonding/cli.c index a24d1104486..cdc935ff10f 100644 --- a/src/vnet/bonding/cli.c +++ b/src/vnet/bonding/cli.c @@ -20,7 +20,7 @@ #include <vlib/unix/unix.h> #include <vnet/ethernet/ethernet.h> #include <vnet/bonding/node.h> -#include <vpp/stats/stat_segment.h> +#include <vlib/stats/stats.h> void bond_disable_collecting_distributing (vlib_main_t * vm, member_if_t * mif) @@ -183,7 +183,6 @@ bond_dump_ifs (bond_interface_details_t ** out_bondifs) bond_interface_details_t *r_bondifs = NULL; bond_interface_details_t *bondif = NULL; - /* *INDENT-OFF* */ pool_foreach (bif, bm->interfaces) { vec_add2(r_bondifs, bondif, 1); clib_memset (bondif, 0, sizeof (*bondif)); @@ -201,7 +200,6 @@ bond_dump_ifs (bond_interface_details_t ** out_bondifs) bondif->active_members = vec_len (bif->active_members); bondif->members = vec_len (bif->members); } - /* *INDENT-ON* */ *out_bondifs = r_bondifs; @@ -323,10 +321,10 @@ bond_delete_neighbor (vlib_main_t * vm, bond_if_t * bif, member_if_t * mif) if (bif->mode == BOND_MODE_LACP) { - stat_segment_deregister_state_counter - (bm->stats[bif->sw_if_index][mif->sw_if_index].actor_state); - stat_segment_deregister_state_counter - (bm->stats[bif->sw_if_index][mif->sw_if_index].partner_state); + vlib_stats_remove_entry ( + bm->stats[bif->sw_if_index][mif->sw_if_index].actor_state); + vlib_stats_remove_entry ( + bm->stats[bif->sw_if_index][mif->sw_if_index].partner_state); } pool_put (bm->neighbors, mif); @@ -376,11 +374,11 @@ bond_delete_if (vlib_main_t * vm, u32 sw_if_index) void bond_create_if (vlib_main_t * vm, bond_create_if_args_t * args) { + vnet_eth_interface_registration_t eir = {}; bond_main_t *bm = &bond_main; vnet_main_t *vnm = vnet_get_main (); vnet_sw_interface_t *sw; bond_if_t *bif; - vnet_hw_interface_t *hw; if ((args->mode == BOND_MODE_LACP) && bm->lacp_plugin_loaded == 0) { @@ -408,6 +406,16 @@ bond_create_if (vlib_main_t * vm, bond_create_if_args_t * args) bif->mode = args->mode; bif->gso = args->gso; + if (bif->lb == BOND_LB_L2) + bif->hash_func = + vnet_hash_function_from_name ("hash-eth-l2", VNET_HASH_FN_TYPE_ETHERNET); + else if (bif->lb == BOND_LB_L34) + bif->hash_func = vnet_hash_function_from_name ("hash-eth-l34", + VNET_HASH_FN_TYPE_ETHERNET); + else if (bif->lb == BOND_LB_L23) + bif->hash_func = vnet_hash_function_from_name ("hash-eth-l23", + VNET_HASH_FN_TYPE_ETHERNET); + // Adjust requested interface id if (bif->id == ~0) bif->id = bif->dev_instance; @@ -440,33 +448,26 @@ bond_create_if (vlib_main_t * vm, bond_create_if_args_t * args) args->hw_addr[1] = 0xfe; } memcpy (bif->hw_address, args->hw_addr, 6); - args->error = ethernet_register_interface - (vnm, bond_dev_class.index, bif->dev_instance /* device instance */ , - bif->hw_address /* ethernet address */ , - &bif->hw_if_index, 0 /* flag change */ ); - if (args->error) - { - args->rv = VNET_API_ERROR_INVALID_REGISTRATION; - hash_unset (bm->id_used, bif->id); - pool_put (bm->interfaces, bif); - return; - } + eir.dev_class_index = bond_dev_class.index; + eir.dev_instance = bif->dev_instance; + eir.address = bif->hw_address; + bif->hw_if_index = vnet_eth_register_interface (vnm, &eir); sw = vnet_get_hw_sw_interface (vnm, bif->hw_if_index); bif->sw_if_index = sw->sw_if_index; bif->group = bif->sw_if_index; bif->numa_only = args->numa_only; - hw = vnet_get_hw_interface (vnm, bif->hw_if_index); /* * Add GSO and Checksum offload flags if GSO is enabled on Bond */ if (args->gso) { - hw->caps |= (VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM); + vnet_hw_if_set_caps (vnm, bif->hw_if_index, + VNET_HW_IF_CAP_TCP_GSO | + VNET_HW_IF_CAP_TX_TCP_CKSUM | + VNET_HW_IF_CAP_TX_UDP_CKSUM); } if (vlib_get_thread_main ()->n_vlib_mains > 1) clib_spinlock_init (&bif->lockp); @@ -517,12 +518,18 @@ bond_create_command_fn (vlib_main_t * vm, unformat_input_t * input, if (args.mode == BOND_MODE_LACP) args.numa_only = 1; else - return clib_error_return (0, - "Only lacp mode supports numa-only so far!"); + { + unformat_free (line_input); + return clib_error_return ( + 0, "Only lacp mode supports numa-only so far!"); + } } else - return clib_error_return (0, "unknown input `%U'", - format_unformat_error, input); + { + unformat_free (line_input); + return clib_error_return (0, "unknown input `%U'", + format_unformat_error, input); + } } unformat_free (line_input); @@ -538,7 +545,6 @@ bond_create_command_fn (vlib_main_t * vm, unformat_input_t * input, return args.error; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (bond_create_command, static) = { .path = "create bond", .short_help = "create bond mode {round-robin | active-backup | broadcast | " @@ -546,7 +552,6 @@ VLIB_CLI_COMMAND (bond_create_command, static) = { "[hw-addr <mac-address>] [id <if-id>] [gso]", .function = bond_create_command_fn, }; -/* *INDENT-ON* */ static clib_error_t * bond_delete_command_fn (vlib_main_t * vm, unformat_input_t * input, @@ -587,14 +592,12 @@ bond_delete_command_fn (vlib_main_t * vm, unformat_input_t * input, return 0; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (bond_delete__command, static) = { .path = "delete bond", .short_help = "delete bond {<interface> | sw_if_index <sw_idx>}", .function = bond_delete_command_fn, }; -/* *INDENT-ON* */ void bond_add_member (vlib_main_t * vm, bond_add_member_args_t * args) @@ -632,7 +635,7 @@ bond_add_member (vlib_main_t * vm, bond_add_member_args_t * args) clib_error_return (0, "bond interface cannot be added as member"); return; } - if (bif->gso && !(mif_hw->caps & VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO)) + if (bif->gso && !(mif_hw->caps & VNET_HW_IF_CAP_TCP_GSO)) { args->rv = VNET_API_ERROR_INVALID_INTERFACE; args->error = @@ -641,32 +644,29 @@ bond_add_member (vlib_main_t * vm, bond_add_member_args_t * args) } if (bif->mode == BOND_MODE_LACP) { - u8 *name = format (0, "/if/lacp/%u/%u/state%c", bif->sw_if_index, - args->member, 0); + u32 actor_idx, partner_idx; - vec_validate (bm->stats, bif->sw_if_index); - vec_validate (bm->stats[bif->sw_if_index], args->member); - - args->error = stat_segment_register_state_counter - (name, &bm->stats[bif->sw_if_index][args->member].actor_state); - if (args->error != 0) + actor_idx = vlib_stats_add_gauge ("/if/lacp/%u/%u/state", + bif->sw_if_index, args->member); + if (actor_idx == ~0) { args->rv = VNET_API_ERROR_INVALID_INTERFACE; - vec_free (name); return; } - vec_reset_length (name); - name = format (0, "/if/lacp/%u/%u/partner-state%c", bif->sw_if_index, - args->member, 0); - args->error = stat_segment_register_state_counter - (name, &bm->stats[bif->sw_if_index][args->member].partner_state); - vec_free (name); - if (args->error != 0) + partner_idx = vlib_stats_add_gauge ("/if/lacp/%u/%u/partner-state", + bif->sw_if_index, args->member); + if (partner_idx == ~0) { + vlib_stats_remove_entry (actor_idx); args->rv = VNET_API_ERROR_INVALID_INTERFACE; return; } + + vec_validate (bm->stats, bif->sw_if_index); + vec_validate (bm->stats[bif->sw_if_index], args->member); + bm->stats[bif->sw_if_index][args->member].actor_state = actor_idx; + bm->stats[bif->sw_if_index][args->member].partner_state = partner_idx; } pool_get (bm->neighbors, mif); @@ -817,14 +817,12 @@ add_member_interface_command_fn (vlib_main_t * vm, unformat_input_t * input, return args.error; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (add_member_interface_command, static) = { .path = "bond add", .short_help = "bond add <BondEthernetx> <member-interface> " "[passive] [long-timeout]", .function = add_member_interface_command_fn, }; -/* *INDENT-ON* */ void bond_detach_member (vlib_main_t * vm, bond_detach_member_args_t * args) @@ -881,13 +879,11 @@ detach_interface_command_fn (vlib_main_t * vm, unformat_input_t * input, return args.error; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (detach_interface_command, static) = { .path = "bond del", .short_help = "bond del <member-interface>", .function = detach_interface_command_fn, }; -/* *INDENT-ON* */ static void show_bond (vlib_main_t * vm) @@ -899,7 +895,6 @@ show_bond (vlib_main_t * vm) "interface name", "sw_if_index", "mode", "load balance", "active members", "members"); - /* *INDENT-OFF* */ pool_foreach (bif, bm->interfaces) { vlib_cli_output (vm, "%-16U %-12d %-13U %-13U %-14u %u", @@ -908,7 +903,6 @@ show_bond (vlib_main_t * vm) format_bond_load_balance, bif->lb, vec_len (bif->active_members), vec_len (bif->members)); } - /* *INDENT-ON* */ } static void @@ -918,7 +912,6 @@ show_bond_details (vlib_main_t * vm) bond_if_t *bif; u32 *sw_if_index; - /* *INDENT-OFF* */ pool_foreach (bif, bm->interfaces) { vlib_cli_output (vm, "%U", format_bond_interface_name, bif->dev_instance); @@ -957,7 +950,6 @@ show_bond_details (vlib_main_t * vm) vlib_cli_output (vm, " sw_if_index: %d", bif->sw_if_index); vlib_cli_output (vm, " hw_if_index: %d", bif->hw_if_index); } - /* *INDENT-ON* */ } static clib_error_t * @@ -985,13 +977,11 @@ show_bond_fn (vlib_main_t * vm, unformat_input_t * input, return 0; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_bond_command, static) = { .path = "show bond", .short_help = "show bond [details]", .function = show_bond_fn, }; -/* *INDENT-ON* */ void bond_set_intf_weight (vlib_main_t * vm, bond_set_intf_weight_args_t * args) @@ -1091,14 +1081,12 @@ bond_set_intf_cmd (vlib_main_t * vm, unformat_input_t * input, return args.error; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND(set_interface_bond_cmd, static) = { .path = "set interface bond", .short_help = "set interface bond <interface> | sw_if_index <idx>" " weight <value>", .function = bond_set_intf_cmd, }; -/* *INDENT-ON* */ clib_error_t * bond_cli_init (vlib_main_t * vm) |