aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Glazychev <artem.glazychev@xored.com>2023-12-19 14:31:48 +0700
committerDamjan Marion <dmarion@0xa5.net>2024-01-17 14:13:47 +0000
commit8beddaf5b435a872b844052b506366b7a474004c (patch)
treec0242bf7d38c16a24eed7248f771568580463335
parentde04e023cbd469b26e80602f8f91934b7e984fb9 (diff)
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
-rw-r--r--src/plugins/af_packet/node.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/plugins/af_packet/node.c b/src/plugins/af_packet/node.c
index d652a2d61c4..da01492a232 100644
--- a/src/plugins/af_packet/node.c
+++ b/src/plugins/af_packet/node.c
@@ -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 =