35 str, xd->
port_id, rv, rte_strerror (rv));
46 struct rte_eth_dev_info dev_info;
56 if (xd->
flags & DPDK_DEVICE_FLAG_ADMIN_UP)
63 if (xd->
pmd == VNET_DPDK_PMD_I40E)
65 if ((xd->
flags & DPDK_DEVICE_FLAG_RX_FLOW_OFFLOAD) != 0)
66 xd->
port_conf.fdir_conf.mode = RTE_FDIR_MODE_PERFECT;
68 xd->
port_conf.fdir_conf.mode = RTE_FDIR_MODE_NONE;
71 rte_eth_dev_info_get (xd->
port_id, &dev_info);
73 bitmap = xd->
port_conf.txmode.offloads & ~dev_info.tx_offload_capa;
76 dpdk_log_warn (
"unsupported tx offloads requested on port %u: %U",
81 bitmap = xd->
port_conf.rxmode.offloads & ~dev_info.rx_offload_capa;
84 dpdk_log_warn (
"unsupported rx offloads requested on port %u: %U",
108 rte_eth_tx_queue_setup (xd->
port_id, j,
122 u16 socket_id = rte_lcore_to_socket_id (lcore);
133 SOCKET_ID_ANY, 0, mp);
146 if (xd->
flags & DPDK_DEVICE_FLAG_ADMIN_UP)
155 xd->
flags |= DPDK_DEVICE_FLAG_PMD_INIT_FAIL;
164 if (xd->
flags & DPDK_DEVICE_FLAG_PMD_INIT_FAIL)
167 rv = rte_eth_dev_start (xd->
port_id);
176 rv = rte_eth_dev_default_mac_addr_set (xd->
port_id,
182 if (xd->
flags & DPDK_DEVICE_FLAG_PROMISC)
183 rte_eth_promiscuous_enable (xd->
port_id);
185 rte_eth_promiscuous_disable (xd->
port_id);
187 rte_eth_allmulticast_enable (xd->
port_id);
196 if (xd->
flags & DPDK_DEVICE_FLAG_PMD_INIT_FAIL)
199 rte_eth_allmulticast_disable (xd->
port_id);
200 rte_eth_dev_stop (xd->
port_id);
211 enum rte_eth_event_type type,
void *param)
213 struct rte_eth_link link;
215 RTE_SET_USED (param);
216 if (type != RTE_ETH_EVENT_INTR_LSC)
218 dpdk_log_info (
"Unknown event %d received for port %d", type, port_id);
222 rte_eth_link_get_nowait (port_id, &link);
223 u8 link_up = link.link_status;
226 port_id, (
unsigned) link.link_speed,
227 (link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
228 "full-duplex" :
"half-duplex");
237 enum rte_eth_event_type type,
239 void *ret_param __attribute__ ((unused)))
245 struct rte_pci_device *
248 const struct rte_bus *
bus;
250 bus = rte_bus_find_by_device (info->device);
251 if (bus && !strcmp (bus->name,
"pci"))
252 return RTE_DEV_TO_PCI (info->device);
format_function_t format_dpdk_tx_offload_caps
void vl_api_force_rpc_call_main_thread(void *fp, u8 *data, u32 data_length)
vnet_main_t * vnet_get_main(void)
static_always_inline vlib_buffer_pool_t * vlib_get_buffer_pool(vlib_main_t *vm, u8 buffer_pool_index)
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
struct rte_pci_device * dpdk_get_pci_device(const struct rte_eth_dev_info *info)
static vnet_hw_interface_t * vnet_get_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
static vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
int dpdk_port_state_callback(dpdk_portid_t port_id, enum rte_eth_event_type type, void *param, void *ret_param)
#define vec_validate_aligned(V, I, A)
Make sure vector is long enough for given index (no header, specified alignment)
#define dpdk_log_warn(...)
#define clib_error_return(e, args...)
void dpdk_device_setup(dpdk_device_t *xd)
struct rte_eth_conf port_conf
struct rte_eth_txconf tx_conf
vlib_worker_thread_t * vlib_worker_threads
void dpdk_device_start(dpdk_device_t *xd)
static_always_inline uword vnet_get_device_input_thread_index(vnet_main_t *vnm, u32 hw_if_index, u16 queue_id)
vnet_sw_interface_flags_t flags
#define dpdk_log_info(...)
static_always_inline uword vlib_get_thread_index(void)
#define dpdk_log_err(...)
static int dpdk_port_state_callback_inline(dpdk_portid_t port_id, enum rte_eth_event_type type, void *param)
void dpdk_device_stop(dpdk_device_t *xd)
void dpdk_device_error(dpdk_device_t *xd, char *str, int rv)
format_function_t format_dpdk_device_name
static vlib_main_t * vlib_get_main(void)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
clib_error_t * vnet_hw_interface_set_flags(vnet_main_t *vnm, u32 hw_if_index, vnet_hw_interface_flags_t flags)
format_function_t format_dpdk_rx_offload_caps
#define clib_error_free(e)
struct rte_mempool ** dpdk_mempool_by_buffer_pool_index
#define CLIB_CACHE_LINE_BYTES
static u8 vlib_buffer_pool_get_default_for_numa(vlib_main_t *vm, u32 numa_node)
u8 * buffer_pool_for_queue
CLIB vectors are ubiquitous dynamically resized arrays with by user defined "headers".