Re: git: 7266121ce985 - main - ure: improve transmit checksum offloading
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);
>
>
>
>
>