diff options
author | Artem Glazychev <artem.glazychev@xored.com> | 2023-12-19 14:31:48 +0700 |
---|---|---|
committer | Damjan Marion <dmarion@0xa5.net> | 2024-01-17 14:13:47 +0000 |
commit | 8beddaf5b435a872b844052b506366b7a474004c (patch) | |
tree | c0242bf7d38c16a24eed7248f771568580463335 /src | |
parent | de04e023cbd469b26e80602f8f91934b7e984fb9 (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
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/af_packet/node.c | 6 |
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 = |