- while (n_rxv >= 12 && n_left_to_next >= 4)
- {
- vlib_buffer_t *p;
- p = vlib_get_buffer (vm, rxve[8].bi);
- vlib_prefetch_buffer_header (p, LOAD);
- CLIB_PREFETCH (p->data, CLIB_CACHE_LINE_BYTES, LOAD);
-
- p = vlib_get_buffer (vm, rxve[9].bi);
- vlib_prefetch_buffer_header (p, LOAD);
- CLIB_PREFETCH (p->data, CLIB_CACHE_LINE_BYTES, LOAD);
-
- p = vlib_get_buffer (vm, rxve[10].bi);
- vlib_prefetch_buffer_header (p, LOAD);
- CLIB_PREFETCH (p->data, CLIB_CACHE_LINE_BYTES, LOAD);
-
- p = vlib_get_buffer (vm, rxve[11].bi);
- vlib_prefetch_buffer_header (p, LOAD);
- CLIB_PREFETCH (p->data, CLIB_CACHE_LINE_BYTES, LOAD);
-
- to_next[0] = bi0 = rxve[0].bi;
- to_next[1] = bi1 = rxve[1].bi;
- to_next[2] = bi2 = rxve[2].bi;
- to_next[3] = bi3 = rxve[3].bi;
-
- b0 = vlib_get_buffer (vm, bi0);
- b1 = vlib_get_buffer (vm, bi1);
- b2 = vlib_get_buffer (vm, bi2);
- b3 = vlib_get_buffer (vm, bi3);
-
- b0->current_length = rxve[0].length;
- b1->current_length = rxve[1].length;
- b2->current_length = rxve[2].length;
- b3->current_length = rxve[3].length;
-
- n_rx_bytes += b0->current_length;
- n_rx_bytes += b1->current_length;
- n_rx_bytes += b2->current_length;
- n_rx_bytes += b3->current_length;
-
- if (PREDICT_TRUE (ad->per_interface_next_index == ~0))
- {
- ethernet_header_t *e0, *e1, *e2, *e3;
-
- e0 = (ethernet_header_t *) b0->data;
- e1 = (ethernet_header_t *) b1->data;
- e2 = (ethernet_header_t *) b2->data;
- e3 = (ethernet_header_t *) b3->data;
-
- if (ethernet_frame_is_any_tagged_x4 (e0->type, e1->type,
- e2->type, e3->type))
- {
- next0 = avf_find_next (rxve, b0, 1);
- next1 = avf_find_next (rxve + 1, b1, 1);
- next2 = avf_find_next (rxve + 2, b2, 1);
- next3 = avf_find_next (rxve + 3, b3, 1);
- }
- else
- {
- next0 = avf_find_next (rxve, b0, 0);
- next1 = avf_find_next (rxve + 1, b1, 0);
- next2 = avf_find_next (rxve + 2, b2, 0);
- next3 = avf_find_next (rxve + 3, b3, 0);
- }
-
- if (with_features_or_tracing)
- vnet_feature_start_device_input_x4 (ad->sw_if_index, &next0,
- &next1, &next2, &next3,
- b0, b1, b2, b3);
-
- if (PREDICT_FALSE (maybe_error))
- {
- avf_check_for_error (node, rxve + 0, b0, &next0);
- avf_check_for_error (node, rxve + 1, b1, &next1);
- avf_check_for_error (node, rxve + 2, b2, &next2);
- avf_check_for_error (node, rxve + 3, b3, &next3);
- }
- }
- else
- next0 = next1 = next2 = next3 = ad->per_interface_next_index;
-
- clib_memcpy (vnet_buffer (b0)->sw_if_index, sw_if_idx,
- sizeof (sw_if_idx));
- clib_memcpy (vnet_buffer (b1)->sw_if_index, sw_if_idx,
- sizeof (sw_if_idx));
- clib_memcpy (vnet_buffer (b2)->sw_if_index, sw_if_idx,
- sizeof (sw_if_idx));
- clib_memcpy (vnet_buffer (b3)->sw_if_index, sw_if_idx,
- sizeof (sw_if_idx));
-
- VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
- VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b1);
- VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b2);
- VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b3);
-
- if (with_features_or_tracing && PREDICT_FALSE (n_trace))
- {
- avf_input_trace (vm, node, next0, b0, &n_trace, ad, rxve);
- if (n_trace)
- avf_input_trace (vm, node, next1, b1, &n_trace, ad, rxve + 1);
- if (n_trace)
- avf_input_trace (vm, node, next2, b2, &n_trace, ad, rxve + 2);
- if (n_trace)
- avf_input_trace (vm, node, next3, b3, &n_trace, ad, rxve + 3);
- }