VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX);
u32 min_bufs = apif->rx_req->tp_frame_size / n_buffer_bytes;
+ if (apif->per_interface_next_index != ~0)
+ next_index = apif->per_interface_next_index;
+
n_free_bufs = vec_len (apm->rx_buffers);
if (PREDICT_FALSE(n_free_bufs < VLIB_FRAME_SIZE))
{
while ((tph->tp_status & TP_STATUS_USER) && (n_free_bufs > min_bufs))
{
vlib_buffer_t * b0, * first_b0 = 0;
- u32 next0 = AF_PACKET_INPUT_NEXT_ETHERNET_INPUT;
+ u32 next0 = next_index;
u32 n_left_to_next;
vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
{
u32 data_len = tph->tp_snaplen;
u32 offset = 0;
- u32 bi0, first_bi0 = 0, prev_bi0;
+ u32 bi0 = 0, first_bi0 = 0, prev_bi0;
while (data_len)
{
/* copy data */
u32 bytes_to_copy = data_len > n_buffer_bytes ? n_buffer_bytes : data_len;
b0->current_data = 0;
- memcpy (vlib_buffer_get_current (b0), (u8 *) tph + tph->tp_mac + offset, bytes_to_copy);
+ clib_memcpy (vlib_buffer_get_current (b0), (u8 *) tph + tph->tp_mac + offset, bytes_to_copy);
/* fill buffer header */
b0->clone_count = 0;
if (offset == 0)
{
+#if DPDK > 0
+ struct rte_mbuf * mb = rte_mbuf_from_vlib_buffer(b0);
+ rte_pktmbuf_data_len (mb) = b0->current_length;
+ rte_pktmbuf_pkt_len (mb) = b0->current_length;
+#endif
b0->total_length_not_including_first_buffer = 0;
b0->flags = VLIB_BUFFER_TOTAL_LENGTH_VALID;
vnet_buffer(b0)->sw_if_index[VLIB_RX] = apif->sw_if_index;
tr = vlib_add_trace (vm, node, first_b0, sizeof (*tr));
tr->next_index = next0;
tr->hw_if_index = apif->hw_if_index;
- memcpy(&tr->tph, tph, sizeof(struct tpacket2_hdr));
+ clib_memcpy(&tr->tph, tph, sizeof(struct tpacket2_hdr));
}
/* enque and take next packet */
vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
clib_bitmap_foreach (i, apm->pending_input_bitmap,
({
+ clib_bitmap_set (apm->pending_input_bitmap, i, 0);
n_rx_packets += af_packet_device_input_fn(vm, node, frame, i);
}));
return n_rx_packets;
}
-
VLIB_REGISTER_NODE (af_packet_input_node) = {
.function = af_packet_input_fn,
.name = "af-packet-input",
[AF_PACKET_INPUT_NEXT_ETHERNET_INPUT] = "ethernet-input",
},
};
+
+VLIB_NODE_FUNCTION_MULTIARCH (af_packet_input_node, af_packet_input_fn)
+