datapath: Fix up checksum on Xen before forwarding to controller.
authorBen Pfaff <blp@nicira.com>
Mon, 2 Feb 2009 17:55:32 +0000 (09:55 -0800)
committerBen Pfaff <blp@nicira.com>
Mon, 2 Feb 2009 17:55:32 +0000 (09:55 -0800)
commit96660ad113bdd8005facb4ea7c6ebe6c44bd4248
tree51d9906d23ef5f56da97e494cb370b00b77cbfee
parenta28ef86084edba52c5ac7a90a0de3a9f03ef3295
datapath: Fix up checksum on Xen before forwarding to controller.

On Xen, the datapath can receive a packet that lacks a correct checksum
from a VM, because the VMs expect to use the host's hardware TX
checksumming.  Until now, we haven't fixed up the checksum before we sent
the packet to the controller.  The controller doesn't normally verify
the checksum (nor can it in general, since it doesn't necessarily get the
entire packet), so that part isn't a problem.

The problem here is in the buffered packet.  fwd_save_skb() makes a copy
(not a clone) of the packet, but skb_copy() doesn't make a copy of the
skbuff's proto_csum_blank, which is what dev_queue_xmit() uses (via
skb_checksum_setup()) to decide whether checksumming needs to be forced.
Thus, the buffered packet is transmitted with a bad checksum.

A partial solution would be to copy proto_csum_blank from the original
skb into the buffered copy, or to make the buffers use clones instead of
copies (they really should do this anyhow).  But this would still send
a bad checksum to the controller.  So instead we do the full checksum
calculation before we send the packet to the controller.

This change affects only Xen.  This situation cannot occur without Xen,
because any packets that arrive on physical interfaces must already have
correct checksums.
datapath/datapath.c