This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
Home Products Support Community News


Re: [Xen-devel] ip/udp checksum offload from minios guest

On Tue, 2011-03-29 at 18:15 +0100, Anil Madhavapeddy wrote:
> On 29 Mar 2011, at 12:37, Ian Campbell wrote:
> > On Tue, 2011-03-29 at 17:17 +0100, Anil Madhavapeddy wrote:
> >> I'm just adding checksum offload support into a custom guest, and wanted 
> >> to clarify a few things.
> >> 
> >> In netfront, I can mark outgoing frames with:
> >> - NETTXF_csum_blank
> >> - NETTXF_data_validated
> >> 
> >> These refer to UDP or TCP checksums, and not the IP checksum, right?
> >> Linux seems to never offload IP header checksumming, so it must be
> >> offloading the UDP/TCP calculation and then adjusting the IPv4
> >> checksum based on that calculation.
> >> 
> >> For outgoing UDP, my guest is setting the checksum to 0 (as it's
> >> optional in the protocol), and calculating the full IPv4 checksum in
> >> software, and all works (slowly).  However, setting NETTXF_csum_blank
> >> in the outgoing frame and leaving the IPv4 checksum at 0 doesn't seem
> >> to result in any adjustment by netback, and the packet gets dropped. 
> > 
> > I think you need to set the checksum to the psuedo-header checksum
> > rather than 0 since that is what csum_blank means (such a well named
> > flag!)...
> > 
> > It's not clear why anything would drop a UDP frame with checksum==0
> > since, as you say, it is optional. My guess is that since the
> > NETTXF_csum_blank and data_validated turn into an skb->ip_summed ==
> > SKB_PARTIAL on the backend side this causes the Linux network stack to
> > drop it because that statement conflicts with the checksum being 0.
> Right, but I'm setting the IPv4 checksum to 0 too, since I want to
> offload the whole lot and never calculate a body checksum in the
> guest.

Maybe I'm getting confused but the IPv4 checksum only covers the
headers, doesn't it? I don't think you can offload those, at least not
using the current PV protocol. So you need to include a valid IP header
checksum but that doesn't require summing over all the data, just the

> But if the UDP checksum is set to 0, then the backend can't just
> adjust it to obtain the IPv4 checksum and has to iterate over the
> packet body at some stage.

I don't think it needs to obtain the IPv4 checksum to do UDP checksum if
the UDP checksum is initially set to the partial(/pseudo header)
checksum -- it's already incorporated as necessary.

> I've tried setting the UDP checksum to 0, the pseudoheader, and the
> full checksum, and the IPv4 checksum is never set by the backend in
> any of these cases.  If I set the IPv4 checksum in software to the
> correct value, then packets go through, but the UDP checksums are
> never altered.
> Guess it's time to start slapping printfs all over the dom0 kernel to
> see what's going on unless you know what I "should" be setting both
> the IPv4/UDP checksums to with NETTXF_csum_blank...

The protocol is unhelpfully "defined" to be basically "what Linux does".
i.e. whatever Linux generates in an SKB with skb->ip_summed ==
CHECKSUM_PARTIAL is what you need to generate.


Xen-devel mailing list