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 <[email protected]>
Datum: zondag, 8 februari 2026 21:16
Aan: [email protected], [email protected],
[email protected]
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 <[email protected]>
AuthorDate: 2026-02-08 20:11:18 +0000
Commit: Michael Tuexen <[email protected]>
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);