tunneling: Force selection of an IP ID with GRE.
authorJesse Gross <jesse@nicira.com>
Thu, 30 Jun 2011 19:49:11 +0000 (12:49 -0700)
committerJesse Gross <jesse@nicira.com>
Thu, 30 Jun 2011 20:30:59 +0000 (13:30 -0700)
By default we set the DF bit on tunneled packets because we want to
get path MTU discovery from the underlying network.  In turn this
causes Linux to leave the IP ID as 0 because it believes that
fragmentation can never occur.  However, with GRE fragmentation is
still possible because we may get a large packet to be encapsulated
and let the local IP stack do fragmentation.  As long as packets are
kept in order fragments are not misassociated and everything works fine.
However, if there is reordering in the underlying network then packets
can become corrupted.  This forces selection of an IP ID for GRE packets
to avoid misassociation.

Bug #6128

Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
datapath/vport-gre.c

index 9c1c1cc825388ed64229f28058f338077c21d20f..46e0be82a0bdf668033b20341473f9ae8023a8b2 100644 (file)
@@ -103,9 +103,12 @@ static struct sk_buff *gre_update_header(const struct vport *vport,
                                                0));
        /*
         * Allow our local IP stack to fragment the outer packet even if the
-        * DF bit is set as a last resort.
+        * DF bit is set as a last resort.  We also need to force selection of
+        * an IP ID here because Linux will otherwise leave it at 0 if the
+        * packet originally had DF set.
         */
        skb->local_df = 1;
+       __ip_select_ident(ip_hdr(skb), dst, 0);
 
        return skb;
 }