]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/ipv6/udp_offload.c
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[linux.git] / net / ipv6 / udp_offload.c
index 2b0fbe6929e84e1bcd9cda057c98a0207a573cab..a2267f80febbb6f31459097f27bd89d51d0f2b11 100644 (file)
@@ -29,6 +29,7 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,
        u8 frag_hdr_sz = sizeof(struct frag_hdr);
        __wsum csum;
        int tnl_hlen;
+       int err;
 
        mss = skb_shinfo(skb)->gso_size;
        if (unlikely(skb->len <= mss))
@@ -36,19 +37,6 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,
 
        if (skb_gso_ok(skb, features | NETIF_F_GSO_ROBUST)) {
                /* Packet is from an untrusted source, reset gso_segs. */
-               int type = skb_shinfo(skb)->gso_type;
-
-               if (unlikely(type & ~(SKB_GSO_UDP |
-                                     SKB_GSO_DODGY |
-                                     SKB_GSO_UDP_TUNNEL |
-                                     SKB_GSO_UDP_TUNNEL_CSUM |
-                                     SKB_GSO_TUNNEL_REMCSUM |
-                                     SKB_GSO_GRE |
-                                     SKB_GSO_GRE_CSUM |
-                                     SKB_GSO_IPIP |
-                                     SKB_GSO_SIT) ||
-                            !(type & (SKB_GSO_UDP))))
-                       goto out;
 
                skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(skb->len, mss);
 
@@ -103,7 +91,10 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,
                /* Find the unfragmentable header and shift it left by frag_hdr_sz
                 * bytes to insert fragment header.
                 */
-               unfrag_ip6hlen = ip6_find_1stfragopt(skb, &prevhdr);
+               err = ip6_find_1stfragopt(skb, &prevhdr);
+               if (err < 0)
+                       return ERR_PTR(err);
+               unfrag_ip6hlen = err;
                nexthdr = *prevhdr;
                *prevhdr = NEXTHDR_FRAGMENT;
                unfrag_len = (skb_network_header(skb) - skb_mac_header(skb)) +
@@ -153,7 +144,7 @@ static struct sk_buff **udp6_gro_receive(struct sk_buff **head,
 
 skip:
        NAPI_GRO_CB(skb)->is_ipv6 = 1;
-       return udp_gro_receive(head, skb, uh);
+       return udp_gro_receive(head, skb, uh, udp6_lib_lookup_skb);
 
 flush:
        NAPI_GRO_CB(skb)->flush = 1;
@@ -173,7 +164,7 @@ static int udp6_gro_complete(struct sk_buff *skb, int nhoff)
                skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL;
        }
 
-       return udp_gro_complete(skb, nhoff);
+       return udp_gro_complete(skb, nhoff, udp6_lib_lookup_skb);
 }
 
 static const struct net_offload udpv6_offload = {
@@ -184,7 +175,12 @@ static const struct net_offload udpv6_offload = {
        },
 };
 
-int __init udp_offload_init(void)
+int udpv6_offload_init(void)
 {
        return inet6_add_offload(&udpv6_offload, IPPROTO_UDP);
 }
+
+int udpv6_offload_exit(void)
+{
+       return inet6_del_offload(&udpv6_offload, IPPROTO_UDP);
+}