Re: git: 7266121ce985 - main - ure: improve transmit checksum offloading

From: Ronald Klop <ronald-lists_at_klop.ws>
Date: Mon, 09 Feb 2026 16:16:07 UTC
Thanks,

I noticed this last week and was still investigating when I saw this commit. TCP/IPv6 works fine now.

ure0 on uhub1
ure0: <Realtek USB 10/100/1G/2.5G LAN, class 0/0, rev 3.20/31.04, addr 1> on usbus1
ue0: <USB Ethernet> on ure0

This is plugged into a Raspberry Pi 5.

Thanks.

Ronald.

 
Van: Michael Tuexen <tuexen@FreeBSD.org>
Datum: zondag, 8 februari 2026 21:16
Aan: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Onderwerp: git: 7266121ce985 - main - ure: improve transmit checksum offloading
> 
> The branch main has been updated by tuexen:
> 
> URL: https://cgit.FreeBSD.org/src/commit/?id=7266121ce985a1a895441357c20b0e9d56b4e5f5
> 
> commit 7266121ce985a1a895441357c20b0e9d56b4e5f5
> Author:     Michael Tuexen <tuexen@FreeBSD.org>
> AuthorDate: 2026-02-08 20:11:18 +0000
> Commit:     Michael Tuexen <tuexen@FreeBSD.org>
> CommitDate: 2026-02-08 20:16:20 +0000
> 
>     ure: improve transmit checksum offloading
>     
>     Apparently, the name of the variable l4off was correct. Providing the
>     offset to the TCP or UDP header allows the transmit checksum offload to
>     work for TCP/IPv4, TCP/IPv6, UDP/IPv4, and UDP/IPv6.
>     
>     Reported by:            vishwin
>     Reviewed by:            vishwin
>     MFC after:              1 week
>     Differential Revision:  https://reviews.freebsd.org/D55187
> ---
>  sys/dev/usb/net/if_ure.c | 16 ++++++++++------
>  1 file changed, 10 insertions(+), 6 deletions(-)
> 
> diff --git a/sys/dev/usb/net/if_ure.c b/sys/dev/usb/net/if_ure.c
> index 3dea88eb10f1..92160fe9b1d2 100644
> --- a/sys/dev/usb/net/if_ure.c
> +++ b/sys/dev/usb/net/if_ure.c
> @@ -24,6 +24,8 @@
>   * SUCH DAMAGE.
>   */
>  
> +#include "opt_inet6.h"
> +
>  #include <sys/param.h>
>  #include <sys/systm.h>
>  #include <sys/bus.h>
> @@ -44,6 +46,10 @@
>  /* needed for checksum offload */
>  #include <netinet/in.h>
>  #include <netinet/ip.h>
> +#ifdef INET6
> +#include <netinet/ip6.h>
> +#include <netinet6/ip6_var.h>
> +#endif
>  
>  #include <dev/mii/mii.h>
>  #include <dev/mii/miivar.h>
> @@ -62,8 +68,6 @@
>  
>  #include "miibus_if.h"
>  
> -#include "opt_inet6.h"
> -
>  #ifdef USB_DEBUG
>  static int ure_debug = 0;
>  
> @@ -2179,7 +2183,6 @@ ure_txcsum(struct mbuf *m, int caps, uint32_t *regout)
>     struct ip ip;
>     struct ether_header *eh;
>     int flags;
> -   uint32_t data;
>     uint32_t reg;
>     int l3off, l4off;
>     uint16_t type;
> @@ -2214,10 +2217,9 @@ ure_txcsum(struct mbuf *m, int caps, uint32_t *regout)
>     if (flags & CSUM_IP)
>         reg |= URE_TXPKT_IPV4_CS;
>  
> -   data = m->m_pkthdr.csum_data;
>     if (flags & (CSUM_IP_TCP | CSUM_IP_UDP)) {
>         m_copydata(m, l3off, sizeof ip, (caddr_t)&ip);
> -       l4off = l3off + (ip.ip_hl << 2) + data;
> +       l4off = l3off + (ip.ip_hl << 2);
>         if (__predict_false(l4off > URE_L4_OFFSET_MAX))
>             return (1);
>  
> @@ -2230,7 +2232,9 @@ ure_txcsum(struct mbuf *m, int caps, uint32_t *regout)
>     }
>  #ifdef INET6
>     else if (flags & (CSUM_IP6_TCP | CSUM_IP6_UDP)) {
> -       l4off = l3off + data;
> +       l4off = ip6_lasthdr(m, l3off, IPPROTO_IPV6, NULL);
> +       if (__predict_false(l4off < 0))
> +           return (1);
>         if (__predict_false(l4off > URE_L4_OFFSET_MAX))
>             return (1);
>  
>  
> 
> 
>