On Mon, 2014-12-15 at 19:14 +0100, Ralf Baechle wrote: > On Mon, Dec 01, 2014 at 04:09:36AM +0000, Ben Hutchings wrote: > > > > /* Same as tx - compute csum of pseudo header */ > > > csum = hwsum + > > > - (ih->tot_len - (ih->ihl << 2)) + > > > - htons((uint16_t)ih->protocol) + > > > + (ih->tot_len - (ih->ihl << 2)) + ih->protocol + > > > (ih->saddr >> 16) + (ih->saddr & 0xffff) + > > > (ih->daddr >> 16) + (ih->daddr & 0xffff); > > > > > > > The pseudo-header is specified as: > > > > +--------+--------+--------+--------+ > > | Source Address | > > +--------+--------+--------+--------+ > > | Destination Address | > > +--------+--------+--------+--------+ > > | zero | PTCL | TCP Length | > > +--------+--------+--------+--------+ > > > > The current code zero-extends the protocol number to produce the 5th > > 16-bit word of the pseudo-header, then uses htons() to put it in > > big-endian order, consistent with the other fields. (Yes, it's doing > > addition on big-endian words; this works even on little-endian machines > > due to the way the checksum is specified.) > > > > The driver should not be doing this at all, though. It should set > > skb->csum = hwsum; skb->ip_summed = CHECKSUM_COMPLETE; and let the > > network stack adjust the hardware checksum. > > Really? The IOC3 isn't the exactly the smartest NIC around; it does add up > everything and the kitchen sink, that is ethernet headers, IP headers and > on RX the frame's trailing CRC. That is almost exactly what CHECKSUM_COMPLETE means on receive; only the CRC would need to be subtracted. Then the driver can validate {TCP,UDP}/IPv{4,6} checksums without any header parsing. > All that needs to be subtracted in software > which is what this does. I think others NICs are all smarted and don't > need this particular piece of magic. It may not be smart, but that allows it to cover more cases than most smart network controllers! On transmit, the driver should: - Calculate the partial checksum of data up to offset csum_start - Subtract this from the checksum at offset (csum_start + csum_offset) It should set the NETIF_F_GEN_CSUM feature flag rather than NETIF_F_IP_CSUM. Then it will be able to generate {TCP,UDP}/IPv{4,6} checksums. Ben. > I agree with your other comment wrt. to htons(). -- Ben Hutchings The two most common things in the universe are hydrogen and stupidity.
Attachment:
signature.asc
Description: This is a digitally signed message part