RX checksum offloading problem
Michael Tuexen
Michael.Tuexen at lurchi.franken.de
Sat May 3 08:30:29 UTC 2014
On 02 May 2014, at 16:02, Bjoern A. Zeeb <bz at FreeBSD.org> wrote:
>
> On 02 May 2014, at 10:22 , Michael Tuexen <Michael.Tuexen at lurchi.franken.de> wrote:
>
>> Dear all,
>>
>> during testing I found that FreeBSD head (on a raspberry pi) accepts SCTP packet
>> with bad checksums. After debugging this I figured out that this is a problem with
>> the csum_flags defined in mbuf.h.
>>
>> The SCTP code on its input path checks for CSUM_SCTP_VALID, which is defined in mbuf.h:
>> #define CSUM_SCTP_VALID CSUM_L4_VALID
>> This makes sense: If CSUM_SCTP_VALID is set in csum_flags, the packet is considered
>> to have a correct checksum.
>>
>> For UDP and TCP some drivers calculate the UDP/TCP checksum and set CSUM_DATA_VALID in
>> csum_flags to indicate that the UDP/TCP should consider csum_data to figure out if
>> the packet has a correct checksum. The problem is that CSUM_DATA_VALID is defined as
>> #define CSUM_DATA_VALID CSUM_L4_VALID
>> In this case the semantic is not that the packet has a valid checksum, but the csum_data
>> field contains information.
>>
>> Now the following happens (on the raspberry pi the driver used is
>> dev/usb/net/if_smsc.c
>>
>> 1. A packet is received and if it is not too short, the checksum computed
>> is stored in csum_data and the flag CSUM_DATA_VALID is set. This happens
>> for all IP packets, not only for UDP and TCP packets.
>> 2. In case of SCTP packets, the SCTP interprets CSUM_DATA_VALID as CSUM_SCTP_VALID
>> and accepts the packet. So no SCTP checksum check ever happened.
>>
>> Alternatives to fix this:
>>
>> 1. Change all drivers to set CSUM_DATA_VALID only in case of UDP or TCP packets, since
>> it only makes sense in these cases.
>
> Wait, or for SCTP in cad the crc32 (I think it was) was actually checked but not otherwise. This is how it should be imho. It seems like a driver bug.
I'm not sure what you want to say with the first sentence.
However, SCTP uses a CRC32C and most of the NICs don't support it (some do and they
do it right, as far as I know). I can go through the drivers listed in
http://fxr.watson.org/fxr/ident?i=CSUM_DATA_VALID
and make sure they only set CSUM_DATA_VALID for UDP and TCP packets...
Best regards
Michael
>
>
> —
> Bjoern A. Zeeb "Come on. Learn, goddamn it.", WarGames, 1983
>
>
More information about the freebsd-net
mailing list