39 256,
"dpdk flags not un lower byte, fix needed");
46 struct rte_mbuf *mb_seg = 0;
54 b->
flags |= VLIB_BUFFER_TOTAL_LENGTH_VALID;
57 while (nb_seg < mb->nb_segs)
64 ASSERT ((b_seg->
flags & VLIB_BUFFER_NEXT_PRESENT) == 0);
72 (mb_seg->buf_addr + mb_seg->data_off) - (
void *) b_seg->
data;
77 b_chain->
flags |= VLIB_BUFFER_NEXT_PRESENT;
81 mb_seg = mb_seg->next;
154 for (i = 0; i <
count; i++)
158 flags[
i] = (
u8) mb[i]->ol_flags;
166 uword n_rx_packets,
int maybe_multiseg,
u8 * or_flagsp)
168 u32 n_left = n_rx_packets;
171 struct rte_mbuf **mb = ptd->
mbufs;
197 b[0]->
current_data = mb[0]->data_off - RTE_PKTMBUF_HEADROOM;
200 b[1]->
current_data = mb[1]->data_off - RTE_PKTMBUF_HEADROOM;
203 b[2]->
current_data = mb[2]->data_off - RTE_PKTMBUF_HEADROOM;
206 b[3]->
current_data = mb[3]->data_off - RTE_PKTMBUF_HEADROOM;
234 b[0]->
current_data = mb[0]->data_off - RTE_PKTMBUF_HEADROOM;
246 *or_flagsp = or_flags;
259 for (n = 0; n < n_rx_packets; n++)
261 if ((ptd->
flags[n] & (1 << PKT_RX_FDIR)) == 0)
265 ptd->
mbufs[n]->hash.fdir.hi);
288 uword n_rx_packets = 0, n_rx_bytes;
292 struct rte_mbuf **mb;
303 if ((xd->
flags & DPDK_DEVICE_FLAG_ADMIN_UP) == 0)
309 n = rte_eth_rx_burst (xd->
port_id, queue_id,
310 ptd->
mbufs + n_rx_packets,
318 if (n_rx_packets == 0)
339 if (xd->
flags & DPDK_DEVICE_FLAG_MAYBE_MULTISEG)
347 for (n = 0; n < n_rx_packets; n++)
348 ptd->
next[n] = next_index;
353 (or_flags & PKT_RX_FDIR)))
359 sizeof (
struct rte_mbuf));
366 u32 *to_next, n_left_to_next;
371 sizeof (
struct rte_mbuf));
389 if (xd->
flags & DPDK_DEVICE_FLAG_RX_IP4_CKSUM &&
390 (or_flags & PKT_RX_IP_CKSUM_BAD) == 0)
394 n_left_to_next -= n_rx_packets;
405 sizeof (
struct rte_mbuf));
407 n_left = n_rx_packets;
412 while (n_trace && n_left)
415 if (single_next == 0)
416 next_index = next[0];
426 sizeof b0[0] -
sizeof b0->
pre_data);
444 n_left = n_rx_packets;
469 data_start = (mb->buf_addr + mb->data_off) - (
void *) b0->
data;
485 n_rx_packets, n_rx_bytes);
497 uword n_rx_packets = 0;
500 u32 thread_index = node->thread_index;
521 .name =
"dpdk-input",
522 .sibling_of =
"device-input",
525 .state = VLIB_NODE_STATE_DISABLED,
static void vnet_device_increment_rx_packets(u32 thread_index, u64 count)
#define vlib_buffer_from_rte_mbuf(x)
static u32 vlib_get_trace_count(vlib_main_t *vm, vlib_node_runtime_t *rt)
static void vlib_increment_combined_counter(vlib_combined_counter_main_t *cm, u32 thread_index, u32 index, u64 n_packets, u64 n_bytes)
Increment a combined counter.
u32 current_config_index
Used by feature subgraph arcs to visit enabled feature nodes.
vnet_main_t * vnet_get_main(void)
u8 flags[DPDK_RX_BURST_SZ]
#define foreach_dpdk_error
#define clib_memcpy_fast(a, b, c)
static vlib_frame_t * vlib_get_frame(vlib_main_t *vm, vlib_frame_t *f)
u8 buffer_pool_index
index of buffer pool this buffer belongs.
u32 per_interface_next_index
#define VLIB_NODE_FN(node)
vlib_error_t * errors
Vector of errors for this node.
static void vlib_trace_buffer(vlib_main_t *vm, vlib_node_runtime_t *r, u32 next_index, vlib_buffer_t *b, int follow_chain)
i16 current_data
signed offset in data[], pre_data[] that we are currently processing.
#define static_always_inline
#define ETH_INPUT_FRAME_F_SINGLE_SW_IF_IDX
static_always_inline int vnet_device_input_have_features(u32 sw_if_index)
static_always_inline void dpdk_prefetch_buffer_x4(struct rte_mbuf *mb[])
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
#define vlib_get_new_next_frame(vm, node, next_index, vectors, n_vectors_left)
u8 pre_data[VLIB_BUFFER_PRE_DATA_SIZE]
Space for inserting data before buffer start.
static vlib_next_frame_t * vlib_node_runtime_get_next_frame(vlib_main_t *vm, vlib_node_runtime_t *n, u32 next_index)
static_always_inline void dpdk_prefetch_mbuf_x4(struct rte_mbuf *mb[])
static u32 vlib_get_buffer_index(vlib_main_t *vm, void *p)
Translate buffer pointer into buffer index.
#define rte_mbuf_from_vlib_buffer(x)
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
u16 current_length
Nbytes between current data and the end of this buffer.
static_always_inline void dpdk_process_flow_offload(dpdk_device_t *xd, dpdk_per_thread_data_t *ptd, uword n_rx_packets)
dpdk_per_thread_data_t * per_thread_data
#define ETH_INPUT_FRAME_F_IP4_CKSUM_OK
vlib_buffer_t buffer_template
#define VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX
static_always_inline void vlib_get_buffer_indices_with_offset(vlib_main_t *vm, void **b, u32 *bi, uword count, i32 offset)
Translate array of buffer pointers into buffer indices with offset.
vlib_error_t error
Error code for buffers to be enqueued to error handler.
static char * dpdk_error_strings[]
u8 * format_ethernet_header_with_length(u8 *s, va_list *args)
static_always_inline u8 dpdk_ol_flags_extract(struct rte_mbuf **mb, u8 *flags, int count)
Main DPDK input node.
#define VLIB_REGISTER_NODE(x,...)
u32 flow_id
Generic flow identifier.
#define CLIB_PREFETCH(addr, size, type)
dpdk_flow_lookup_entry_t * flow_lookup_entries
static_always_inline void vlib_buffer_enqueue_to_next(vlib_main_t *vm, vlib_node_runtime_t *node, u32 *buffers, u16 *nexts, uword count)
static_always_inline void clib_memcpy64_x4(void *d0, void *d1, void *d2, void *d3, void *s)
vlib_node_registration_t dpdk_input_node
(constructor) VLIB_REGISTER_NODE (dpdk_input_node)
static void * vlib_frame_scalar_args(vlib_frame_t *f)
Get pointer to frame scalar data.
void vlib_put_next_frame(vlib_main_t *vm, vlib_node_runtime_t *r, u32 next_index, u32 n_vectors_left)
Release pointer to next frame vector data.
u32 buffers[DPDK_RX_BURST_SZ]
u16 next[DPDK_RX_BURST_SZ]
static_always_inline u32 dpdk_device_input(vlib_main_t *vm, dpdk_main_t *dm, dpdk_device_t *xd, vlib_node_runtime_t *node, u32 thread_index, u16 queue_id)
u32 next_buffer
Next buffer for this linked-list of buffers.
static_always_inline uword dpdk_process_rx_burst(vlib_main_t *vm, dpdk_per_thread_data_t *ptd, uword n_rx_packets, int maybe_multiseg, u8 *or_flagsp)
static void vlib_buffer_advance(vlib_buffer_t *b, word l)
Advance current data pointer by the supplied (signed!) amount.
STATIC_ASSERT(STRUCT_OFFSET_OF(vnet_buffer_opaque_t, l2_hdr_offset)==STRUCT_OFFSET_OF(vnet_buffer_opaque_t, l3_hdr_offset) - 2, "l3_hdr_offset must follow l2_hdr_offset")
dpdk_portid_t device_index
format_function_t format_dpdk_rx_trace
static void * vlib_add_trace(vlib_main_t *vm, vlib_node_runtime_t *r, vlib_buffer_t *b, u32 n_data_bytes)
u32 total_length_not_including_first_buffer
Only valid for first buffer in chain.
struct rte_mbuf * mbufs[DPDK_RX_BURST_SZ]
#define foreach_device_and_queue(var, vec)
#define VLIB_BUFFER_TRACE_TRAJECTORY_INIT(b)
dpdk_pcap_t pcap[VLIB_N_RX_TX]
static void vlib_buffer_init_for_free_list(vlib_buffer_t *dst, vlib_buffer_free_list_t *fl)
static_always_inline void vnet_feature_start_device_input_x1(u32 sw_if_index, u32 *next0, vlib_buffer_t *b0)
static void vlib_frame_no_append(vlib_frame_t *f)
static vlib_buffer_free_list_t * vlib_buffer_get_free_list(vlib_main_t *vm, vlib_buffer_free_list_index_t free_list_index)
static void vlib_set_trace_count(vlib_main_t *vm, vlib_node_runtime_t *rt, u32 count)
#define CLIB_CACHE_LINE_BYTES
u32 flags
buffer flags: VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index, VLIB_BUFFER_IS_TRACED: trace this buffer.
static void pcap_add_buffer(pcap_main_t *pm, struct vlib_main_t *vm, u32 buffer_index, u32 n_bytes_in_trace)
Add buffer (vlib_buffer_t) to the trace.
static_always_inline uword dpdk_process_subseq_segs(vlib_main_t *vm, vlib_buffer_t *b, struct rte_mbuf *mb, vlib_buffer_free_list_t *fl)
static vlib_buffer_t * vlib_get_buffer(vlib_main_t *vm, u32 buffer_index)
Translate buffer index into buffer pointer.
u8 * buffer_pool_for_queue
CLIB vectors are ubiquitous dynamically resized arrays with by user defined "headers".