datapath: compat: Prepare tnl-segmentation for ipv6.
authorPravin B Shelar <pshelar@ovn.org>
Fri, 8 Jul 2016 04:52:34 +0000 (21:52 -0700)
committerPravin B Shelar <pshelar@ovn.org>
Sat, 9 Jul 2016 02:27:49 +0000 (19:27 -0700)
Current tnl_skb_gso_segment() is written for ipv4 tunnels. Following
patch make it generic so that it can also handle ipv6 tunnels.

Signed-off-by: Pravin B Shelar <pshelar@ovn.org>
Acked-by: Jesse Gross <jesse@kernel.org>
datapath/linux/compat/gso.c

index fb4749a..27834d2 100644 (file)
@@ -181,9 +181,11 @@ static struct sk_buff *tnl_skb_gso_segment(struct sk_buff *skb,
                                           netdev_features_t features,
                                           bool tx_path)
 {
-       struct iphdr *iph = ip_hdr(skb);
+       void *iph = skb_network_header(skb);
        int pkt_hlen = skb_inner_network_offset(skb); /* inner l2 + tunnel hdr. */
        int mac_offset = skb_inner_mac_offset(skb);
+       int outer_l3_offset = skb_network_offset(skb);
+       int outer_l4_offset = skb_transport_offset(skb);
        struct sk_buff *skb1 = skb;
        struct sk_buff *segs;
        __be16 proto = skb->protocol;
@@ -221,11 +223,11 @@ static struct sk_buff *tnl_skb_gso_segment(struct sk_buff *skb,
        while (skb) {
                __skb_push(skb, pkt_hlen);
                skb_reset_mac_header(skb);
-               skb_reset_network_header(skb);
-               skb_set_transport_header(skb, sizeof(struct iphdr));
+               skb_set_network_header(skb, outer_l3_offset);
+               skb_set_transport_header(skb, outer_l4_offset);
                skb->mac_len = 0;
 
-               memcpy(ip_hdr(skb), iph, pkt_hlen);
+               memcpy(skb_network_header(skb), iph, pkt_hlen);
                memcpy(skb->cb, cb, sizeof(cb));
                OVS_GSO_CB(skb)->fix_segment(skb);