summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Gross <jesse@nicira.com>2011-06-30 12:49:11 -0700
committerBen Pfaff <blp@nicira.com>2011-07-28 11:21:59 -0700
commitf3399cd5be32fb67364959d75b973a4c23f2b19a (patch)
treef5ed5514145f19e8bf55389991c30edd0a62324a
parent465b509c7ce1023af9665ec2553c1c7baee5963e (diff)
downloadopenvswitch-f3399cd5be32fb67364959d75b973a4c23f2b19a.tar.gz
tunneling: Force selection of an IP ID with GRE.
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>
-rw-r--r--datapath/vport-gre.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/datapath/vport-gre.c b/datapath/vport-gre.c
index 9c1c1cc82..46e0be82a 100644
--- a/datapath/vport-gre.c
+++ b/datapath/vport-gre.c
@@ -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;
}