Re: git: 7b6e84c9ac56 - main - ure: improve checksum offloading

From: Michael Tuexen <tuexen_at_FreeBSD.org>
Date: Sun, 08 Feb 2026 10:20:09 UTC
> On 8. Feb 2026, at 09:45, Michael Tuexen <tuexen@freebsd.org> wrote:
> 
>> On 7. Feb 2026, at 16:34, Charlie Li <vishwin@FreeBSD.org> wrote:
>> 
>> Michael Tuexen wrote:
>>> The branch main has been updated by tuexen:
>>> URL: https://cgit.FreeBSD.org/src/commit/?id=7b6e84c9ac5668134ab2d075019ef0b827d90c84
>>> commit 7b6e84c9ac5668134ab2d075019ef0b827d90c84
>>> Author:     Michael Tuexen <tuexen@FreeBSD.org>
>>> AuthorDate: 2026-01-31 10:42:10 +0000
>>> Commit:     Michael Tuexen <tuexen@FreeBSD.org>
>>> CommitDate: 2026-01-31 10:42:10 +0000
>>>    ure: improve checksum offloading
>>>         This patch fixes three issues:
>>>    (1) Initially, set the hwassist flags correctly when enabling
>>>        transmit checksum offload for TCP/IPv6 and UDP/IPv6.
>>>    (2) Keep the hwassist flags in sync with the capabilities when
>>>        changing txcsum.
>>>    (3) Keep the hwasssit flags in sync with the capabilities when
>>>        changing txcsum6.
>>>    Without this patch, transmit checksum offloading for TCP/IPv6 and
>>>    UDP/IPv6 is never used and transmit checksum offloading for IPv4,
>>>    TCP/IPv4 and UDP/IPv4 is always used, even if disabled via
>>>    ifconfig ue? -txcsum.
>>>         Reviewed by:            Timo Völker
>>>    MFC after:              3 days
>>>    Differential Revision:  https://reviews.freebsd.org/D54974
>>> ---
>>> sys/dev/usb/net/if_ure.c | 3 +++
>>> 1 file changed, 3 insertions(+)
>>> diff --git a/sys/dev/usb/net/if_ure.c b/sys/dev/usb/net/if_ure.c
>>> index c3f7b622d687..3dea88eb10f1 100644
>>> --- a/sys/dev/usb/net/if_ure.c
>>> +++ b/sys/dev/usb/net/if_ure.c
>>> @@ -1015,6 +1015,7 @@ ure_attach_post_sub(struct usb_ether *ue)
>>>  if_sethwassist(ifp, CSUM_IP|CSUM_IP_UDP|CSUM_IP_TCP);
>>> #ifdef INET6
>>>  if_setcapabilitiesbit(ifp, IFCAP_HWCSUM_IPV6, 0);
>>> + if_sethwassistbits(ifp, CSUM_IP6_UDP|CSUM_IP6_TCP, 0);
>>> #endif
>>>  if_setcapenable(ifp, if_getcapabilities(ifp));
>>> @@ -1463,6 +1464,7 @@ ure_ioctl(if_t ifp, u_long cmd, caddr_t data)
>>>  if ((mask & IFCAP_TXCSUM) != 0 &&
>>>     (if_getcapabilities(ifp) & IFCAP_TXCSUM) != 0) {
>>>  if_togglecapenable(ifp, IFCAP_TXCSUM);
>>> + if_togglehwassist(ifp, CSUM_IP|CSUM_IP_UDP|CSUM_IP_TCP);
>>>  }
>>>  if ((mask & IFCAP_RXCSUM) != 0 &&
>>>     (if_getcapabilities(ifp) & IFCAP_RXCSUM) != 0) {
>>> @@ -1471,6 +1473,7 @@ ure_ioctl(if_t ifp, u_long cmd, caddr_t data)
>>>  if ((mask & IFCAP_TXCSUM_IPV6) != 0 &&
>>>     (if_getcapabilities(ifp) & IFCAP_TXCSUM_IPV6) != 0) {
>>>  if_togglecapenable(ifp, IFCAP_TXCSUM_IPV6);
>>> + if_togglehwassist(ifp, CSUM_IP6_UDP|CSUM_IP6_TCP);
>>>  }
>>>  if ((mask & IFCAP_RXCSUM_IPV6) != 0 &&
>>>     (if_getcapabilities(ifp) & IFCAP_RXCSUM_IPV6) != 0) {
>> It seems that with this commit, all network traffic and then some, excluding ICMP{,v6}, time out. Even `route(8) get default` takes forever to query.
> Do you use a GENERIC kernel?
> What is the output of
> ifconfig ue0
> and (if you compiled and installed tools/tools/ifinfo/)
> ifinfo ue0
> 
> What happens if you run as root
> ifconfig ue0 -txcsum
> and/or
> ifconfig ue0 -txcsum6
> Does the problem persist?
> 
> This commit should actually only let the host stack know that TCP/IPv6 and UDP/IPv6
> transmit checksum offload is enabled. It should not affect TCP/IPv4 and UDP/IPv4
> transmit checksum offload (except that you can now disable it).
> Is any other network interface (like epair, bridge, ...) involved?
I did some more testing: It seems that transmit checksum offloading for TCP/IPv6 and
UDP/IPv6 does not work correctly.

So does
ifconfig ue0 -txcsum6
resolve the networking problem for you?

Best regards
Michael
> 
> Best regards
> Michael
>> 
>> -- 
>> Charlie Li
>> ...nope, still don't have an exit line.
>> 
> 
>