af_packet: set next0 for AF_PACKET_IF_MODE_ETHERNET mode 19/40119/2
authorArtem Glazychev <artem.glazychev@xored.com>
Tue, 19 Dec 2023 07:31:48 +0000 (14:31 +0700)
committerDamjan Marion <dmarion@0xa5.net>
Wed, 17 Jan 2024 14:13:47 +0000 (14:13 +0000)
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

src/plugins/af_packet/node.c

index d652a2d..da01492 100644 (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 =