datapath: Factor out common code from *_build_header() to ovs_tnl_send().
authorJarno Rajahalme <jarno.rajahalme@nsn.com>
Mon, 25 Mar 2013 19:03:37 +0000 (21:03 +0200)
committerJesse Gross <jesse@nicira.com>
Wed, 27 Mar 2013 00:21:12 +0000 (17:21 -0700)
Signed-off-by: Jarno Rajahalme <jarno.rajahalme@nsn.com>
Signed-off-by: Jesse Gross <jesse@nicira.com>
datapath/tunnel.c
datapath/vport-gre.c
datapath/vport-lisp.c
datapath/vport-vxlan.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;
index c252dcf..40b96cf 100644 (file)
@@ -95,8 +95,6 @@ static void __gre_build_header(struct sk_buff *skb,
        __be32 *options = (__be32 *)(skb_network_header(skb) + tunnel_hlen
                        - GRE_HEADER_SECTION);
        struct gre_base_hdr *greh = (struct gre_base_hdr *) skb_transport_header(skb);
-       struct dst_entry *dst = skb_dst(skb);
-
        greh->protocol = htons(ETH_P_TEB);
        greh->flags = 0;
 
@@ -121,14 +119,6 @@ static void __gre_build_header(struct sk_buff *skb,
                                                skb->len - skb_transport_offset(skb),
                                                0));
        }
-       /*
-        * 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), dst, 0);
 }
 
 static void gre_build_header(const struct vport *vport,
index ad37c54..1fff5ae 100644 (file)
@@ -207,15 +207,6 @@ static void lisp_build_header(const struct vport *vport,
 
        tunnel_id_to_instance_id(tun_key->tun_id, &lisph->u2.word2.instance_id[0]);
        lisph->u2.word2.locator_status_bits = 1;
-
-       /*
-        * 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);
 }
 
 /* Called with rcu_read_lock and BH disabled. */
index 9f8874a..1850fc2 100644 (file)
@@ -106,15 +106,6 @@ static void vxlan_build_header(const struct vport *vport,
 
        vxh->vx_flags = htonl(VXLAN_FLAGS);
        vxh->vx_vni = htonl(be64_to_cpu(tun_key->tun_id) << 8);
-
-       /*
-        * 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);
 }
 
 /* Called with rcu_read_lock and BH disabled. */