aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2026-02-08 20:11:18 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2026-02-08 20:16:20 +0000
commit7266121ce985a1a895441357c20b0e9d56b4e5f5 (patch)
tree74db02802d3d112b3cd1aef893746addee57d3ed
parent2fe3f16b1c219d2565a60a8bb3142b437f8c683f (diff)
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
-rw-r--r--sys/dev/usb/net/if_ure.c16
1 files 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);