cfg80211: make wdev_list accessible to drivers
[cascardo/linux.git] / net / ipv4 / fou.c
index a39068b..7ac5ec8 100644 (file)
@@ -22,7 +22,6 @@ struct fou {
        u8 flags;
        __be16 port;
        u16 type;
-       struct udp_offload udp_offloads;
        struct list_head list;
        struct rcu_head rcu;
 };
@@ -186,13 +185,13 @@ drop:
        return 0;
 }
 
-static struct sk_buff **fou_gro_receive(struct sk_buff **head,
-                                       struct sk_buff *skb,
-                                       struct udp_offload *uoff)
+static struct sk_buff **fou_gro_receive(struct sock *sk,
+                                       struct sk_buff **head,
+                                       struct sk_buff *skb)
 {
        const struct net_offload *ops;
        struct sk_buff **pp = NULL;
-       u8 proto = NAPI_GRO_CB(skb)->proto;
+       u8 proto = fou_from_sock(sk)->protocol;
        const struct net_offload **offloads;
 
        /* We can clear the encap_mark for FOU as we are essentially doing
@@ -220,11 +219,11 @@ out_unlock:
        return pp;
 }
 
-static int fou_gro_complete(struct sk_buff *skb, int nhoff,
-                           struct udp_offload *uoff)
+static int fou_gro_complete(struct sock *sk, struct sk_buff *skb,
+                           int nhoff)
 {
        const struct net_offload *ops;
-       u8 proto = NAPI_GRO_CB(skb)->proto;
+       u8 proto = fou_from_sock(sk)->protocol;
        int err = -ENOSYS;
        const struct net_offload **offloads;
 
@@ -267,9 +266,9 @@ static struct guehdr *gue_gro_remcsum(struct sk_buff *skb, unsigned int off,
        return guehdr;
 }
 
-static struct sk_buff **gue_gro_receive(struct sk_buff **head,
-                                       struct sk_buff *skb,
-                                       struct udp_offload *uoff)
+static struct sk_buff **gue_gro_receive(struct sock *sk,
+                                       struct sk_buff **head,
+                                       struct sk_buff *skb)
 {
        const struct net_offload **offloads;
        const struct net_offload *ops;
@@ -280,7 +279,7 @@ static struct sk_buff **gue_gro_receive(struct sk_buff **head,
        void *data;
        u16 doffset = 0;
        int flush = 1;
-       struct fou *fou = container_of(uoff, struct fou, udp_offloads);
+       struct fou *fou = fou_from_sock(sk);
        struct gro_remcsum grc;
 
        skb_gro_remcsum_init(&grc);
@@ -392,8 +391,7 @@ out:
        return pp;
 }
 
-static int gue_gro_complete(struct sk_buff *skb, int nhoff,
-                           struct udp_offload *uoff)
+static int gue_gro_complete(struct sock *sk, struct sk_buff *skb, int nhoff)
 {
        const struct net_offload **offloads;
        struct guehdr *guehdr = (struct guehdr *)(skb->data + nhoff);
@@ -441,10 +439,7 @@ static int fou_add_to_port_list(struct net *net, struct fou *fou)
 static void fou_release(struct fou *fou)
 {
        struct socket *sock = fou->sock;
-       struct sock *sk = sock->sk;
 
-       if (sk->sk_family == AF_INET)
-               udp_del_offload(&fou->udp_offloads);
        list_del(&fou->list);
        udp_tunnel_sock_release(sock);
 
@@ -454,11 +449,9 @@ static void fou_release(struct fou *fou)
 static int fou_encap_init(struct sock *sk, struct fou *fou, struct fou_cfg *cfg)
 {
        udp_sk(sk)->encap_rcv = fou_udp_recv;
-       fou->protocol = cfg->protocol;
-       fou->udp_offloads.callbacks.gro_receive = fou_gro_receive;
-       fou->udp_offloads.callbacks.gro_complete = fou_gro_complete;
-       fou->udp_offloads.port = cfg->udp_config.local_udp_port;
-       fou->udp_offloads.ipproto = cfg->protocol;
+       udp_sk(sk)->gro_receive = fou_gro_receive;
+       udp_sk(sk)->gro_complete = fou_gro_complete;
+       fou_from_sock(sk)->protocol = cfg->protocol;
 
        return 0;
 }
@@ -466,9 +459,8 @@ static int fou_encap_init(struct sock *sk, struct fou *fou, struct fou_cfg *cfg)
 static int gue_encap_init(struct sock *sk, struct fou *fou, struct fou_cfg *cfg)
 {
        udp_sk(sk)->encap_rcv = gue_udp_recv;
-       fou->udp_offloads.callbacks.gro_receive = gue_gro_receive;
-       fou->udp_offloads.callbacks.gro_complete = gue_gro_complete;
-       fou->udp_offloads.port = cfg->udp_config.local_udp_port;
+       udp_sk(sk)->gro_receive = gue_gro_receive;
+       udp_sk(sk)->gro_complete = gue_gro_complete;
 
        return 0;
 }
@@ -527,12 +519,6 @@ static int fou_create(struct net *net, struct fou_cfg *cfg,
 
        sk->sk_allocation = GFP_ATOMIC;
 
-       if (cfg->udp_config.family == AF_INET) {
-               err = udp_add_offload(net, &fou->udp_offloads);
-               if (err)
-                       goto error;
-       }
-
        err = fou_add_to_port_list(net, fou);
        if (err)
                goto error;
@@ -816,11 +802,11 @@ int fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
        int type = e->flags & TUNNEL_ENCAP_FLAG_CSUM ? SKB_GSO_UDP_TUNNEL_CSUM :
                                                       SKB_GSO_UDP_TUNNEL;
        __be16 sport;
+       int err;
 
-       skb = iptunnel_handle_offloads(skb, type);
-
-       if (IS_ERR(skb))
-               return PTR_ERR(skb);
+       err = iptunnel_handle_offloads(skb, type);
+       if (err)
+               return err;
 
        sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev),
                                               skb, 0, 0, false);
@@ -840,6 +826,7 @@ int gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
        __be16 sport;
        void *data;
        bool need_priv = false;
+       int err;
 
        if ((e->flags & TUNNEL_ENCAP_FLAG_REMCSUM) &&
            skb->ip_summed == CHECKSUM_PARTIAL) {
@@ -850,10 +837,9 @@ int gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
 
        optlen += need_priv ? GUE_LEN_PRIV : 0;
 
-       skb = iptunnel_handle_offloads(skb, type);
-
-       if (IS_ERR(skb))
-               return PTR_ERR(skb);
+       err = iptunnel_handle_offloads(skb, type);
+       if (err)
+               return err;
 
        /* Get source port (based on flow hash) before skb_push */
        sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev),