On 12/19/23 15:47, Mike Pattrick wrote:
> When OVS needs to fallback on the software TSO implementation to segment
> a packet, it currently doesn't guarantee that IP and TCP checksum
> offload flags are set. However, it is possible that these is required.
> This is true in the case of dp_netdev_upcall(), which clears these
> flags.
> 
> This patch explicitly sets the appropriate flags when the segmentation
> flag is removed, to guarantee that packets always end up with correct
> checksums.
> 
> Signed-off-by: Mike Pattrick <[email protected]>
> 
> ---
> 
> v3: Moved logic from ofproto-dpif-upcall to dp-packet
> Signed-off-by: Mike Pattrick <[email protected]>
> ---
>  lib/dp-packet.h | 16 ++++++++++++++--
>  1 file changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/dp-packet.h b/lib/dp-packet.h
> index 11aa00723..f91b5e3fb 100644
> --- a/lib/dp-packet.h
> +++ b/lib/dp-packet.h
> @@ -1131,11 +1131,23 @@ dp_packet_hwol_set_tcp_seg(struct dp_packet *b)
>      *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TCP_SEG;
>  }
>  
> -/* Resets TCP Segmentation flag in packet 'p'. */
> +/* Resets TCP Segmentation in packet 'p' and adjust flags to indicate
> + * L3 and L4 checksumming is now required. */
>  static inline void
>  dp_packet_hwol_reset_tcp_seg(struct dp_packet *p)
>  {
> -    *dp_packet_ol_flags_ptr(p) &= ~DP_PACKET_OL_TX_TCP_SEG;
> +    uint64_t ol_flags = *dp_packet_ol_flags_ptr(p)
> +                        | DP_PACKET_OL_TX_TCP_CKSUM;
> +
> +    ol_flags = ol_flags & ~(DP_PACKET_OL_TX_TCP_SEG
> +                            | DP_PACKET_OL_RX_L4_CKSUM_MASK
> +                            | DP_PACKET_OL_RX_IP_CKSUM_GOOD);

This is a little unclear why we clear all L4 checksum flags,
but we do not clear IP_CKSUM_BAD.  Is there a reason for that?
If so, we should have a comment here explaining the situation
as it is not obvious.

> +
> +    if (ol_flags & DP_PACKET_OL_TX_IPV4) {
> +         ol_flags |= DP_PACKET_OL_TX_IP_CKSUM;

Nit: Over-indented.  One space too far.

> +    }
> +
> +    *dp_packet_ol_flags_ptr(p) = ol_flags;
>  }
>  
>  /* Returns 'true' if the IP header has good integrity and the

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to