From a9a9d8255b472de760704621468b92a86e308aca Mon Sep 17 00:00:00 2001 From: Mohsin Kazmi Date: Tue, 5 May 2020 14:30:25 +0200 Subject: interface: fix the checksum offload in quad loop 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 --- src/vnet/interface_output.c | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/src/vnet/interface_output.c b/src/vnet/interface_output.c index f289fcc489e..8e3d53ab76f 100644 --- a/src/vnet/interface_output.c +++ b/src/vnet/interface_output.c @@ -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; -- cgit 1.2.3-korg