summaryrefslogtreecommitdiffstats
path: root/src/vnet
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet')
-rw-r--r--src/vnet/interface.api18
-rw-r--r--src/vnet/interface_api.c41
-rw-r--r--src/vnet/interface_cli.c65
-rw-r--r--src/vnet/interface_funcs.h4
4 files changed, 105 insertions, 23 deletions
diff --git a/src/vnet/interface.api b/src/vnet/interface.api
index b839e898bf2..f91af420f0a 100644
--- a/src/vnet/interface.api
+++ b/src/vnet/interface.api
@@ -432,6 +432,24 @@ autoreply define sw_interface_set_rx_mode
u8 mode;
};
+/** \brief Set an interface's rx-placement
+ @param client_index - opaque cookie to identify the sender
+ @param context - sender context, to match reply w/ request
+ @param sw_if_index - the interface whose rx-placement will be set
+ @param queue_id - the queue number whose rx-placement will be set.
+ @param worker_id - the worker number whom rx-placement will be at.
+ @param is_main - flag to set rx-placement to main thread
+*/
+autoreply define sw_interface_set_rx_placement
+{
+ u32 client_index;
+ u32 context;
+ u32 sw_if_index;
+ u32 queue_id;
+ u32 worker_id;
+ u8 is_main;
+};
+
/* Gross kludge, DGMS */
autoreply define interface_name_renumber
{
diff --git a/src/vnet/interface_api.c b/src/vnet/interface_api.c
index 1d167c680fe..03434eab671 100644
--- a/src/vnet/interface_api.c
+++ b/src/vnet/interface_api.c
@@ -56,6 +56,7 @@ _(WANT_INTERFACE_EVENTS, want_interface_events) \
_(SW_INTERFACE_DUMP, sw_interface_dump) \
_(SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address) \
_(SW_INTERFACE_SET_RX_MODE, sw_interface_set_rx_mode) \
+_(SW_INTERFACE_SET_RX_PLACEMENT, sw_interface_set_rx_placement) \
_(SW_INTERFACE_SET_TABLE, sw_interface_set_table) \
_(SW_INTERFACE_GET_TABLE, sw_interface_get_table) \
_(SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered) \
@@ -936,6 +937,12 @@ static void vl_api_sw_interface_set_rx_mode_t_handler
VALIDATE_SW_IF_INDEX (mp);
si = vnet_get_sw_interface (vnm, sw_if_index);
+ if (si->type != VNET_SW_INTERFACE_TYPE_HARDWARE)
+ {
+ rv = VNET_API_ERROR_INVALID_VALUE;
+ goto bad_sw_if_index;
+ }
+
error = set_hw_interface_change_rx_mode (vnm, si->hw_if_index,
mp->queue_id_valid,
ntohl (mp->queue_id), mp->mode);
@@ -951,6 +958,40 @@ out:
REPLY_MACRO (VL_API_SW_INTERFACE_SET_RX_MODE_REPLY);
}
+static void vl_api_sw_interface_set_rx_placement_t_handler
+ (vl_api_sw_interface_set_rx_placement_t * mp)
+{
+ vl_api_sw_interface_set_rx_placement_reply_t *rmp;
+ vnet_main_t *vnm = vnet_get_main ();
+ u32 sw_if_index = ntohl (mp->sw_if_index);
+ vnet_sw_interface_t *si;
+ clib_error_t *error = 0;
+ int rv = 0;
+
+ VALIDATE_SW_IF_INDEX (mp);
+
+ si = vnet_get_sw_interface (vnm, sw_if_index);
+ if (si->type != VNET_SW_INTERFACE_TYPE_HARDWARE)
+ {
+ rv = VNET_API_ERROR_INVALID_VALUE;
+ goto bad_sw_if_index;
+ }
+
+ error = set_hw_interface_rx_placement (si->hw_if_index,
+ ntohl (mp->queue_id),
+ ntohl (mp->worker_id), mp->is_main);
+ if (error)
+ {
+ rv = VNET_API_ERROR_UNIMPLEMENTED;
+ clib_error_report (error);
+ goto out;
+ }
+
+ BAD_SW_IF_INDEX_LABEL;
+out:
+ REPLY_MACRO (VL_API_SW_INTERFACE_SET_RX_PLACEMENT_REPLY);
+}
+
static void
vl_api_create_vlan_subif_t_handler (vl_api_create_vlan_subif_t * mp)
{
diff --git a/src/vnet/interface_cli.c b/src/vnet/interface_cli.c
index 91725b6a688..9271f5b78c5 100644
--- a/src/vnet/interface_cli.c
+++ b/src/vnet/interface_cli.c
@@ -1565,6 +1565,42 @@ VLIB_CLI_COMMAND (show_interface_rx_placement, static) = {
};
/* *INDENT-ON* */
+clib_error_t *
+set_hw_interface_rx_placement (u32 hw_if_index, u32 queue_id,
+ u32 thread_index, u8 is_main)
+{
+ vnet_main_t *vnm = vnet_get_main ();
+ vnet_device_main_t *vdm = &vnet_device_main;
+ clib_error_t *error = 0;
+ vnet_hw_interface_rx_mode mode = VNET_HW_INTERFACE_RX_MODE_UNKNOWN;
+ int rv;
+
+ if (is_main)
+ thread_index = 0;
+ else
+ thread_index += vdm->first_worker_thread_index;
+
+ if (thread_index > vdm->last_worker_thread_index)
+ return clib_error_return (0,
+ "please specify valid worker thread or main");
+
+ rv = vnet_hw_interface_get_rx_mode (vnm, hw_if_index, queue_id, &mode);
+
+ if (rv)
+ return clib_error_return (0, "not found");
+
+ rv = vnet_hw_interface_unassign_rx_thread (vnm, hw_if_index, queue_id);
+
+ if (rv)
+ return clib_error_return (0, "not found");
+
+ vnet_hw_interface_assign_rx_thread (vnm, hw_if_index, queue_id,
+ thread_index);
+ vnet_hw_interface_set_rx_mode (vnm, hw_if_index, queue_id, mode);
+
+ return (error);
+}
+
static clib_error_t *
set_interface_rx_placement (vlib_main_t * vm, unformat_input_t * input,
vlib_cli_command_t * cmd)
@@ -1572,12 +1608,10 @@ set_interface_rx_placement (vlib_main_t * vm, unformat_input_t * input,
clib_error_t *error = 0;
unformat_input_t _line_input, *line_input = &_line_input;
vnet_main_t *vnm = vnet_get_main ();
- vnet_device_main_t *vdm = &vnet_device_main;
- vnet_hw_interface_rx_mode mode;
u32 hw_if_index = (u32) ~ 0;
u32 queue_id = (u32) 0;
u32 thread_index = (u32) ~ 0;
- int rv;
+ u8 is_main = 0;
if (!unformat_user (input, unformat_line_input, line_input))
return 0;
@@ -1590,9 +1624,9 @@ set_interface_rx_placement (vlib_main_t * vm, unformat_input_t * input,
else if (unformat (line_input, "queue %d", &queue_id))
;
else if (unformat (line_input, "main", &thread_index))
- thread_index = 0;
+ is_main = 1;
else if (unformat (line_input, "worker %d", &thread_index))
- thread_index += vdm->first_worker_thread_index;
+ ;
else
{
error = clib_error_return (0, "parse error: '%U'",
@@ -1607,25 +1641,10 @@ set_interface_rx_placement (vlib_main_t * vm, unformat_input_t * input,
if (hw_if_index == (u32) ~ 0)
return clib_error_return (0, "please specify valid interface name");
- if (thread_index > vdm->last_worker_thread_index)
- return clib_error_return (0,
- "please specify valid worker thread or main");
-
- rv = vnet_hw_interface_get_rx_mode (vnm, hw_if_index, queue_id, &mode);
-
- if (rv)
- return clib_error_return (0, "not found");
-
- rv = vnet_hw_interface_unassign_rx_thread (vnm, hw_if_index, queue_id);
-
- if (rv)
- return clib_error_return (0, "not found");
+ error = set_hw_interface_rx_placement (hw_if_index, queue_id, thread_index,
+ is_main);
- vnet_hw_interface_assign_rx_thread (vnm, hw_if_index, queue_id,
- thread_index);
- vnet_hw_interface_set_rx_mode (vnm, hw_if_index, queue_id, mode);
-
- return 0;
+ return (error);
}
/*?
diff --git a/src/vnet/interface_funcs.h b/src/vnet/interface_funcs.h
index a8a41e364f4..557ed146a3a 100644
--- a/src/vnet/interface_funcs.h
+++ b/src/vnet/interface_funcs.h
@@ -354,6 +354,10 @@ clib_error_t *set_hw_interface_change_rx_mode (vnet_main_t * vnm,
vnet_hw_interface_rx_mode
mode);
+/* Set rx-placement on the interface */
+clib_error_t *set_hw_interface_rx_placement (u32 hw_if_index, u32 queue_id,
+ u32 thread_index, u8 is_main);
+
/* Set the MTU on the HW interface */
void vnet_hw_interface_set_mtu (vnet_main_t * vnm, u32 hw_if_index, u32 mtu);