-static_always_inline void
-dpdk_set_next_from_etype (vlib_main_t * vm, vlib_node_runtime_t * node,
- dpdk_per_thread_data_t * ptd, uword n_rx_packets)
-{
- vlib_buffer_t *b[4];
- i16 adv[4];
- u16 etype[4];
- struct rte_mbuf **mb = ptd->mbufs;
- u8 *flags = ptd->flags;
- u16 *next = ptd->next;
- u32 n_left = n_rx_packets;
-
- while (n_left >= 12)
- {
- dpdk_prefetch_buffer_data_x4 (mb + 8);
- dpdk_prefetch_buffer_x4 (mb + 8);
-
- b[0] = vlib_buffer_from_rte_mbuf (mb[0]);
- b[1] = vlib_buffer_from_rte_mbuf (mb[1]);
- b[2] = vlib_buffer_from_rte_mbuf (mb[2]);
- b[3] = vlib_buffer_from_rte_mbuf (mb[3]);
- etype[0] = *(u16 *) ((u8 *) mb[0] + next[0] + sizeof (vlib_buffer_t));
- etype[1] = *(u16 *) ((u8 *) mb[1] + next[1] + sizeof (vlib_buffer_t));
- etype[2] = *(u16 *) ((u8 *) mb[2] + next[2] + sizeof (vlib_buffer_t));
- etype[3] = *(u16 *) ((u8 *) mb[3] + next[3] + sizeof (vlib_buffer_t));
- next[0] = dpdk_rx_next (node, etype[0], flags[0]);
- next[1] = dpdk_rx_next (node, etype[1], flags[1]);
- next[2] = dpdk_rx_next (node, etype[2], flags[2]);
- next[3] = dpdk_rx_next (node, etype[3], flags[3]);
- adv[0] = device_input_next_node_advance[next[0]];
- adv[1] = device_input_next_node_advance[next[1]];
- adv[2] = device_input_next_node_advance[next[2]];
- adv[3] = device_input_next_node_advance[next[3]];
- b[0]->current_data += adv[0];
- b[1]->current_data += adv[1];
- b[2]->current_data += adv[2];
- b[3]->current_data += adv[3];
- b[0]->current_length -= adv[0];
- b[1]->current_length -= adv[1];
- b[2]->current_length -= adv[2];
- b[3]->current_length -= adv[3];
-
- /* next */
- next += 4;
- mb += 4;
- n_left -= 4;
- flags += 4;
- }
-
- while (n_left)
- {
- b[0] = vlib_buffer_from_rte_mbuf (mb[0]);
- next[0] = *(u16 *) ((u8 *) mb[0] + next[0] + sizeof (vlib_buffer_t));
- next[0] = dpdk_rx_next (node, next[0], flags[0]);
- adv[0] = device_input_next_node_advance[next[0]];
- b[0]->current_data += adv[0];
- b[0]->current_length -= adv[0];
-
- /* next */
- next += 1;
- mb += 1;
- n_left -= 1;
- flags += 1;
- }
-}
-