datapath: Factor out common code from *_build_header() to ovs_tnl_send().
[sliver-openvswitch.git] / datapath / tunnel.c
index 83d2c41..8d5a6d4 100644 (file)
@@ -280,6 +280,15 @@ int ovs_tnl_send(struct vport *vport, struct sk_buff *skb)
                /* Push Tunnel header. */
                tnl_vport->tnl_ops->build_header(vport, skb, tunnel_hlen);
 
+               /*
+                * Allow our local IP stack to fragment the outer packet even
+                * if the 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), skb_dst(skb), 0);
+
                /* Push IP header. */
                iph = ip_hdr(skb);
                iph->version    = 4;