+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);
+}
+