Skip to contentSkip to conversation

Rx checksum offload for fragments

DISCUSSION Dimitris Michailidis 1 participant 1 message Jul 27, 2010

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

I am looking at a problem with the cxgb4 driver related to Rx checksum offload and IPv6 fragments. For IP/IPv6 fragments the device provides the L4 checksum without the pseudo-header, which the driver passes in skb->csum and sets CHECKSUM_COMPLETE. This works for IP fragments but triggers errors
from netdev_rx_csum_fault for IPv6. The errors are because of this code
in ip6_frag_queue:

	if (skb->ip_summed == CHECKSUM_COMPLETE) {
		const unsigned char *nh = skb_network_header(skb);
		skb->csum = csum_sub(skb->csum,
			             csum_partial(nh, (u8 *)(fhdr + 1) - nh,
                                                  0));
	}

which subtracts the checksum for the L3 headers (that HW does not include in the first place). AFAICS IPv4 does not make a similar adjustment to skb->csum for its header. Am I missing something here or do IP and IPv6 interpret CHECKSUM_COMPLETE differently? And what should the driver do?