af_packet: set next0 for AF_PACKET_IF_MODE_ETHERNET mode

Normally af_packet sets next0 = next_index on each cycle. It works for the most cases.
But if vlib_validate_buffer_enqueue_x1() changes the next_index (from NEXT_ETHERNET to NEXT_DROP for example)
then the following next0 will have the wrong value, and the correct packet will be dropped.

AF_PACKET_IF_MODE_IP handles this case, but AF_PACKET_IF_MODE_ETHERNET doesn't.

Type: fix

Signed-off-by: Artem Glazychev <artem.glazychev@xored.com>
Change-Id: Ic742043e8b10a2abe56b314bb584277151a9c5eb
This commit is contained in:
Artem Glazychev
2023-12-19 14:31:48 +07:00
committed by Damjan Marion
parent de04e023cb
commit 8beddaf5b4

View File

@ -472,6 +472,9 @@ af_packet_v3_device_input_fn (vlib_main_t *vm, vlib_node_runtime_t *node,
}
else
{
next0 = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT;
if (PREDICT_FALSE (apif->per_interface_next_index != ~0))
next0 = apif->per_interface_next_index;
/* copy feature arc data from template */
first_b0->current_config_index = bt.current_config_index;
vnet_buffer (first_b0)->feature_arc_index =
@ -733,6 +736,9 @@ af_packet_v2_device_input_fn (vlib_main_t *vm, vlib_node_runtime_t *node,
}
else
{
next0 = VNET_DEVICE_INPUT_NEXT_ETHERNET_INPUT;
if (PREDICT_FALSE (apif->per_interface_next_index != ~0))
next0 = apif->per_interface_next_index;
/* copy feature arc data from template */
first_b0->current_config_index = bt.current_config_index;
vnet_buffer (first_b0)->feature_arc_index =