Note, this failed github CI with the following error message:

../../tests/testsuite: line 4034: ./atconfig: No such file or directory

This appears to be a false negative.


-M

On Mon, Feb 12, 2024 at 2:50 PM Mike Pattrick <[email protected]> wrote:
>
> Previously if an OVS configuration nested multiple layers of UDP tunnels
> like VXLAN or GENEVE on top of each other through netdev-linux
> interfaces, the vnet header would be incorrectly set to the outermost
> UDP tunnel layer instead of the intermediary tunnel layer.
>
> This resulted in the middle UDP tunnel not checksum offloading properly.
>
> Fixes: 3337e6d91c5b ("userspace: Enable L4 checksum offloading by default.")
> Reported-by: David Marchand <[email protected]>
> Signed-off-by: Mike Pattrick <[email protected]>
> ---
>  lib/netdev-linux.c | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
>
> diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
> index 1b2e5b6c2..7a156cc28 100644
> --- a/lib/netdev-linux.c
> +++ b/lib/netdev-linux.c
> @@ -7239,14 +7239,23 @@ netdev_linux_prepend_vnet_hdr(struct dp_packet *b, 
> int mtu)
>              vnet->csum_offset = (OVS_FORCE __virtio16) __builtin_offsetof(
>                                      struct tcp_header, tcp_csum);
>          } else if (dp_packet_hwol_l4_is_udp(b)) {
> -            struct udp_header *udp_hdr = dp_packet_l4(b);
> +            /* Favour the inner packet when indicating checksum offsets. */
> +            void *l3_off = dp_packet_inner_l3(b);
> +            void *l4_off = dp_packet_inner_l4(b);
> +
> +            if (!l3_off || !l4_off) {
> +                l3_off = dp_packet_l3(b);
> +                l4_off = dp_packet_l4(b);
> +            }
> +            struct udp_header *udp_hdr = l4_off;
> +
>              ovs_be16 csum = 0;
>
>              if (dp_packet_hwol_is_ipv4(b)) {
> -                const struct ip_header *ip_hdr = dp_packet_l3(b);
> +                const struct ip_header *ip_hdr = l3_off;
>                  csum = ~csum_finish(packet_csum_pseudoheader(ip_hdr));
>              } else if (dp_packet_hwol_tx_ipv6(b)) {
> -                const struct ovs_16aligned_ip6_hdr *ip6_hdr = 
> dp_packet_l3(b);
> +                const struct ovs_16aligned_ip6_hdr *ip6_hdr = l4_off;
>                  csum = ~csum_finish(packet_csum_pseudoheader6(ip6_hdr));
>              }
>
> --
> 2.39.3
>

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

Reply via email to