interface: fix pcap drop trace in case of vlan 58/22258/2
authorBenoît Ganne <bganne@cisco.com>
Tue, 17 Sep 2019 15:30:35 +0000 (17:30 +0200)
committerDamjan Marion <dmarion@me.com>
Wed, 25 Sep 2019 22:19:59 +0000 (22:19 +0000)
Type: fix

Change-Id: If3c4e5c376b51a26143d8922dcacfbda534163bd
Signed-off-by: Benoît Ganne <bganne@cisco.com>
(cherry picked from commit 4e323cbdbd57fcd77db68e295f639288441ef3e3)

src/vnet/interface_output.c

index 250d0db..5d3d53e 100644 (file)
@@ -1207,8 +1207,19 @@ pcap_drop_trace (vlib_main_t * vm,
 
          /*
           * Typically, we'll need to rewind the buffer
+          * if l2_hdr_offset is valid, make sure to rewind to the start of
+          * the L2 header. This may not be the buffer start in case we pop-ed
+          * vlan tags.
+          * Otherwise, rewind to buffer start and hope for the best.
           */
-         if (b0->current_data > 0)
+         if (b0->flags & VNET_BUFFER_F_L2_HDR_OFFSET_VALID)
+           {
+             if (b0->current_data > vnet_buffer (b0)->l2_hdr_offset)
+               vlib_buffer_advance (b0,
+                                    vnet_buffer (b0)->l2_hdr_offset -
+                                    b0->current_data);
+           }
+         else if (b0->current_data > 0)
            vlib_buffer_advance (b0, (word) - b0->current_data);
 
          pcap_add_buffer (&im->pcap_main, vm, bi0, 512);