From: Jesse Gross Date: Fri, 20 Jan 2012 23:12:38 +0000 (-0800) Subject: datapath: Correct GRE checksum offset. X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=1820db11c2e9160bd95dd1ff9376813836e57cab datapath: Correct GRE checksum offset. If a statically defined GRE key is used with checksums then the checksum will overwrite the key. This is because the key is set at header caching time and the checksum is set at packet processing time and we don't update the offset on packet processing because we don't do anything with the key. Reported-by: Christos Argyropoulos Signed-off-by: Jesse Gross --- diff --git a/datapath/vport-gre.c b/datapath/vport-gre.c index 46e0be82a..acd643775 100644 --- a/datapath/vport-gre.c +++ b/datapath/vport-gre.c @@ -91,10 +91,11 @@ static struct sk_buff *gre_update_header(const struct vport *vport, - GRE_HEADER_SECTION); /* Work backwards over the options so the checksum is last. */ - if (mutable->flags & TNL_F_OUT_KEY_ACTION) { + if (mutable->flags & TNL_F_OUT_KEY_ACTION) *options = be64_get_low32(OVS_CB(skb)->tun_id); + + if (mutable->out_key || mutable->flags & TNL_F_OUT_KEY_ACTION) options--; - } if (mutable->flags & TNL_F_CSUM) *(__sum16 *)options = csum_fold(skb_checksum(skb,