datapath: Correct GRE checksum offset.
authorJesse Gross <jesse@nicira.com>
Fri, 20 Jan 2012 23:12:38 +0000 (15:12 -0800)
committerJesse Gross <jesse@nicira.com>
Fri, 20 Jan 2012 23:15:42 +0000 (15:15 -0800)
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 <cargious@netmode.ntua.gr>
Signed-off-by: Jesse Gross <jesse@nicira.com>
datapath/vport-gre.c

index 4411cac93840effa31749ec61e6e0c0b51145568..eb1000910d17e19cc1179cbbde0e5505e22f5210 100644 (file)
@@ -101,10 +101,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,