#define foreach_vmxnet3_input_error \
_(BUFFER_ALLOC, "buffer alloc error") \
#define foreach_vmxnet3_input_error \
_(BUFFER_ALLOC, "buffer alloc error") \
uword n_trace = vlib_get_trace_count (vm, node);
u32 n_rx_packets = 0, n_rx_bytes = 0;
vmxnet3_rx_comp *rx_comp;
uword n_trace = vlib_get_trace_count (vm, node);
u32 n_rx_packets = 0, n_rx_bytes = 0;
vmxnet3_rx_comp *rx_comp;
u16 rid;
vlib_buffer_t *prev_b0 = 0, *hb = 0;
u32 next_index = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT;
u16 rid;
vlib_buffer_t *prev_b0 = 0, *hb = 0;
u32 next_index = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT;
rxq = vec_elt_at_index (vd->rxqs, qid);
comp_ring = &rxq->rx_comp_ring;
bi = buffer_indices;
next = nexts;
rxq = vec_elt_at_index (vd->rxqs, qid);
comp_ring = &rxq->rx_comp_ring;
bi = buffer_indices;
next = nexts;
rid = vmxnet3_find_rid (vd, rx_comp);
ring = &rxq->rx_ring[rid];
rid = vmxnet3_find_rid (vd, rx_comp);
ring = &rxq->rx_ring[rid];
{
vlib_error_count (vm, node->node_index,
VMXNET3_INPUT_ERROR_NO_BUFFER, 1);
{
vlib_error_count (vm, node->node_index,
VMXNET3_INPUT_ERROR_NO_BUFFER, 1);
+ if (PREDICT_FALSE ((rx_comp->index & VMXNET3_RXCI_EOP) &&
+ (rx_comp->len & VMXNET3_RXCL_ERROR)))
+ {
+ vlib_buffer_free_one (vm, bi0);
+ vlib_error_count (vm, node->node_index,
+ VMXNET3_INPUT_ERROR_RX_PACKET_EOP, 1);
+ if (hb && vlib_get_buffer_index (vm, hb) != bi0)
+ {
+ vlib_buffer_free_one (vm, vlib_get_buffer_index (vm, hb));
+ hb = 0;
+ }
+ prev_b0 = 0;
+ goto next;
+ }
+
+ vlib_error_count (vm, node->node_index,
+ VMXNET3_INPUT_ERROR_RX_PACKET, 1);
+ vlib_buffer_free_one (vm, bi0);
+ if (hb && vlib_get_buffer_index (vm, hb) != bi0)
+ {
+ vlib_buffer_free_one (vm, vlib_get_buffer_index (vm, hb));
+ hb = 0;
+ }
+ goto next;
vlib_buffer_enqueue_to_next (vm, node, buffer_indices, nexts,
n_rx_packets);
vlib_increment_combined_counter
(vnm->interface_main.combined_sw_if_counters +
VNET_INTERFACE_COUNTER_RX, thread_index,
vd->hw_if_index, n_rx_packets, n_rx_bytes);
vlib_buffer_enqueue_to_next (vm, node, buffer_indices, nexts,
n_rx_packets);
vlib_increment_combined_counter
(vnm->interface_main.combined_sw_if_counters +
VNET_INTERFACE_COUNTER_RX, thread_index,
vd->hw_if_index, n_rx_packets, n_rx_bytes);
- error = vmxnet3_rxq_refill_ring0 (vm, vd, rxq);
- if (PREDICT_FALSE (error != 0))
- {
- vlib_error_count (vm, node->node_index,
- VMXNET3_INPUT_ERROR_BUFFER_ALLOC, 1);
- }
- error = vmxnet3_rxq_refill_ring1 (vm, vd, rxq);
- if (PREDICT_FALSE (error != 0))
- {
- vlib_error_count (vm, node->node_index,
- VMXNET3_INPUT_ERROR_BUFFER_ALLOC, 1);
- }
+ error = vmxnet3_rxq_refill_ring0 (vm, vd, rxq);
+ if (PREDICT_FALSE (error != 0))
+ {
+ vlib_error_count (vm, node->node_index,
+ VMXNET3_INPUT_ERROR_BUFFER_ALLOC, 1);
+ }
+ error = vmxnet3_rxq_refill_ring1 (vm, vd, rxq);
+ if (PREDICT_FALSE (error != 0))
+ {
+ vlib_error_count (vm, node->node_index,
+ VMXNET3_INPUT_ERROR_BUFFER_ALLOC, 1);