interface: fix the checksum offload in quad loop 84/26884/5
authorMohsin Kazmi <sykazmi@cisco.com>
Tue, 5 May 2020 12:30:25 +0000 (14:30 +0200)
committerDamjan Marion <dmarion@me.com>
Wed, 13 May 2020 11:31:11 +0000 (11:31 +0000)
Type: fix

In quad loop, checksum will be calculated for all four packets,
if one packet needs checksum computation, without respecting their
respective flags. This patch fixes it.

Change-Id: I479b420ba0dcbd178ea4180bf05a0e55a6b13843
Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
src/vnet/interface_output.c

index f289fcc..8e3d53a 100644 (file)
@@ -334,27 +334,32 @@ vnet_interface_output_node_inline (vlib_main_t * vm,
 
          if (do_tx_offloads)
            {
-             if (or_flags &
-                 (VNET_BUFFER_F_OFFLOAD_TCP_CKSUM |
-                  VNET_BUFFER_F_OFFLOAD_UDP_CKSUM |
-                  VNET_BUFFER_F_OFFLOAD_IP_CKSUM))
+             u32 vnet_buffer_offload_flags =
+               (VNET_BUFFER_F_OFFLOAD_TCP_CKSUM |
+                VNET_BUFFER_F_OFFLOAD_UDP_CKSUM |
+                VNET_BUFFER_F_OFFLOAD_IP_CKSUM);
+             if (or_flags & vnet_buffer_offload_flags)
                {
-                 vnet_calc_checksums_inline
-                   (vm, b[0],
-                    b[0]->flags & VNET_BUFFER_F_IS_IP4,
-                    b[0]->flags & VNET_BUFFER_F_IS_IP6, 1 /* with gso */ );
-                 vnet_calc_checksums_inline
-                   (vm, b[1],
-                    b[1]->flags & VNET_BUFFER_F_IS_IP4,
-                    b[1]->flags & VNET_BUFFER_F_IS_IP6, 1 /* with gso */ );
-                 vnet_calc_checksums_inline
-                   (vm, b[2],
-                    b[2]->flags & VNET_BUFFER_F_IS_IP4,
-                    b[2]->flags & VNET_BUFFER_F_IS_IP6, 1 /* with gso */ );
-                 vnet_calc_checksums_inline
-                   (vm, b[3],
-                    b[3]->flags & VNET_BUFFER_F_IS_IP4,
-                    b[3]->flags & VNET_BUFFER_F_IS_IP6, 1 /* with gso */ );
+                 if (b[0]->flags & vnet_buffer_offload_flags)
+                   vnet_calc_checksums_inline
+                     (vm, b[0],
+                      b[0]->flags & VNET_BUFFER_F_IS_IP4,
+                      b[0]->flags & VNET_BUFFER_F_IS_IP6, 1 /* with gso */ );
+                 if (b[1]->flags & vnet_buffer_offload_flags)
+                   vnet_calc_checksums_inline
+                     (vm, b[1],
+                      b[1]->flags & VNET_BUFFER_F_IS_IP4,
+                      b[1]->flags & VNET_BUFFER_F_IS_IP6, 1 /* with gso */ );
+                 if (b[2]->flags & vnet_buffer_offload_flags)
+                   vnet_calc_checksums_inline
+                     (vm, b[2],
+                      b[2]->flags & VNET_BUFFER_F_IS_IP4,
+                      b[2]->flags & VNET_BUFFER_F_IS_IP6, 1 /* with gso */ );
+                 if (b[3]->flags & vnet_buffer_offload_flags)
+                   vnet_calc_checksums_inline
+                     (vm, b[3],
+                      b[3]->flags & VNET_BUFFER_F_IS_IP4,
+                      b[3]->flags & VNET_BUFFER_F_IS_IP6, 1 /* with gso */ );
                }
            }
          b += 4;