#include <vnet/vnet.h>
#include <vnet/plugin/plugin.h>
-#include <vnet/fib/ip6_fib.h>
#include <vnet/adj/adj.h>
#include <vnet/adj/adj_mcast.h>
-#include <vnet/l2/l2_input.h>
+#include <vnet/ip/ip.h>
typedef enum vnet_interface_helper_flags_t_
{
pool_foreach (hif, im->hw_interfaces, ({
unserialize_cstring (m, &class_name);
p = hash_get_mem (im->hw_interface_class_by_name, class_name);
- ASSERT (p != 0);
- error = vnet_hw_interface_set_class_helper (vnm, hif->hw_if_index, p[0], /* redistribute */ 0);
+ if (p)
+ {
+ error = vnet_hw_interface_set_class_helper
+ (vnm, hif->hw_if_index, p[0], /* redistribute */ 0);
+ }
+ else
+ error = clib_error_return (0, "hw class %s AWOL?", class_name);
+
if (error)
clib_error_report (error);
vec_free (class_name);
pool_elt_at_index (im->sw_interfaces, sw_if_index);
/* Check if the interface has config and is removed from L2 BD or XConnect */
- vlib_main_t *vm = vlib_get_main ();
- l2_input_config_t *config;
- if (sw_if_index < vec_len (l2input_main.configs))
- {
- config = vec_elt_at_index (l2input_main.configs, sw_if_index);
- if (config->xconnect)
- set_int_l2_mode (vm, vnm, MODE_L3, config->output_sw_if_index, 0,
- L2_BD_PORT_TYPE_NORMAL, 0, 0);
- if (config->xconnect || config->bridge)
- set_int_l2_mode (vm, vnm, MODE_L3, sw_if_index, 0,
- L2_BD_PORT_TYPE_NORMAL, 0, 0);
- }
vnet_clear_sw_interface_tag (vnm, sw_if_index);
/* Bring down interface in case it is up. */
n->function = dev_class->tx_function;
n->format_trace = dev_class->format_tx_trace;
+ /// XXX: Update this to use counter structure
vlib_register_errors (vm, node_index,
dev_class->tx_function_n_errors,
- dev_class->tx_function_error_strings);
+ dev_class->tx_function_error_strings, 0);
}
static void
hw_index = hw - im->hw_interfaces;
hw->hw_if_index = hw_index;
- hw->default_rx_mode = VNET_HW_INTERFACE_RX_MODE_POLLING;
+ hw->default_rx_mode = VNET_HW_IF_RX_MODE_POLLING;
if (dev_class->format_device_name)
hw->name = format (0, "%U", dev_class->format_device_name, dev_instance);
foreach_vlib_main ({
nrt = vlib_node_get_runtime (this_vlib_main, hw->output_node_index);
nrt->function = node->function;
+ vlib_node_runtime_perf_counter (this_vlib_main, nrt, 0, 0, 0,
+ VLIB_NODE_RUNTIME_PERF_RESET);
});
/* *INDENT-ON* */
foreach_vlib_main ({
nrt = vlib_node_get_runtime (this_vlib_main, hw->tx_node_index);
nrt->function = node->function;
+ vlib_node_runtime_perf_counter (this_vlib_main, nrt, 0, 0, 0,
+ VLIB_NODE_RUNTIME_PERF_RESET);
});
/* *INDENT-ON* */
}
}
+clib_error_t *
+vnet_hw_interface_set_rss_queues (vnet_main_t * vnm,
+ vnet_hw_interface_t * hi,
+ clib_bitmap_t * bitmap)
+{
+ clib_error_t *error = 0;
+ vnet_device_class_t *dev_class =
+ vnet_get_device_class (vnm, hi->dev_class_index);
+
+ if (dev_class->set_rss_queues_function)
+ {
+ if (clib_bitmap_count_set_bits (bitmap) == 0)
+ {
+ error = clib_error_return (0,
+ "must assign at least one valid rss queue");
+ goto done;
+ }
+
+ error = dev_class->set_rss_queues_function (vnm, hi, bitmap);
+ }
+ else
+ {
+ error = clib_error_return (0,
+ "setting rss queues is not supported on this interface");
+ }
+
+ if (!error)
+ {
+ clib_bitmap_free (hi->rss_queues);
+ hi->rss_queues = clib_bitmap_dup (bitmap);
+ }
+
+done:
+ return error;
+}
+
int collect_detailed_interface_stats_flag = 0;
void