Commit d92283e3 authored by Tom Herbert's avatar Tom Herbert Committed by David S. Miller

fou: change to use UDP socket GRO

Adapt gue_gro_receive, gue_gro_complete to take a socket argument.
Don't set udp_offloads any more.
Signed-off-by: default avatarTom Herbert <tom@herbertland.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5602c48c
...@@ -22,7 +22,6 @@ struct fou { ...@@ -22,7 +22,6 @@ struct fou {
u8 flags; u8 flags;
__be16 port; __be16 port;
u16 type; u16 type;
struct udp_offload udp_offloads;
struct list_head list; struct list_head list;
struct rcu_head rcu; struct rcu_head rcu;
}; };
...@@ -186,13 +185,13 @@ static int gue_udp_recv(struct sock *sk, struct sk_buff *skb) ...@@ -186,13 +185,13 @@ static int gue_udp_recv(struct sock *sk, struct sk_buff *skb)
return 0; return 0;
} }
static struct sk_buff **fou_gro_receive(struct sk_buff **head, static struct sk_buff **fou_gro_receive(struct sock *sk,
struct sk_buff *skb, struct sk_buff **head,
struct udp_offload *uoff) struct sk_buff *skb)
{ {
const struct net_offload *ops; const struct net_offload *ops;
struct sk_buff **pp = NULL; struct sk_buff **pp = NULL;
u8 proto = NAPI_GRO_CB(skb)->proto; u8 proto = fou_from_sock(sk)->protocol;
const struct net_offload **offloads; const struct net_offload **offloads;
/* We can clear the encap_mark for FOU as we are essentially doing /* We can clear the encap_mark for FOU as we are essentially doing
...@@ -217,11 +216,11 @@ static struct sk_buff **fou_gro_receive(struct sk_buff **head, ...@@ -217,11 +216,11 @@ static struct sk_buff **fou_gro_receive(struct sk_buff **head,
return pp; return pp;
} }
static int fou_gro_complete(struct sk_buff *skb, int nhoff, static int fou_gro_complete(struct sock *sk, struct sk_buff *skb,
struct udp_offload *uoff) int nhoff)
{ {
const struct net_offload *ops; const struct net_offload *ops;
u8 proto = NAPI_GRO_CB(skb)->proto; u8 proto = fou_from_sock(sk)->protocol;
int err = -ENOSYS; int err = -ENOSYS;
const struct net_offload **offloads; const struct net_offload **offloads;
...@@ -264,9 +263,9 @@ static struct guehdr *gue_gro_remcsum(struct sk_buff *skb, unsigned int off, ...@@ -264,9 +263,9 @@ static struct guehdr *gue_gro_remcsum(struct sk_buff *skb, unsigned int off,
return guehdr; return guehdr;
} }
static struct sk_buff **gue_gro_receive(struct sk_buff **head, static struct sk_buff **gue_gro_receive(struct sock *sk,
struct sk_buff *skb, struct sk_buff **head,
struct udp_offload *uoff) struct sk_buff *skb)
{ {
const struct net_offload **offloads; const struct net_offload **offloads;
const struct net_offload *ops; const struct net_offload *ops;
...@@ -277,7 +276,7 @@ static struct sk_buff **gue_gro_receive(struct sk_buff **head, ...@@ -277,7 +276,7 @@ static struct sk_buff **gue_gro_receive(struct sk_buff **head,
void *data; void *data;
u16 doffset = 0; u16 doffset = 0;
int flush = 1; int flush = 1;
struct fou *fou = container_of(uoff, struct fou, udp_offloads); struct fou *fou = fou_from_sock(sk);
struct gro_remcsum grc; struct gro_remcsum grc;
skb_gro_remcsum_init(&grc); skb_gro_remcsum_init(&grc);
...@@ -386,8 +385,7 @@ static struct sk_buff **gue_gro_receive(struct sk_buff **head, ...@@ -386,8 +385,7 @@ static struct sk_buff **gue_gro_receive(struct sk_buff **head,
return pp; return pp;
} }
static int gue_gro_complete(struct sk_buff *skb, int nhoff, static int gue_gro_complete(struct sock *sk, struct sk_buff *skb, int nhoff)
struct udp_offload *uoff)
{ {
const struct net_offload **offloads; const struct net_offload **offloads;
struct guehdr *guehdr = (struct guehdr *)(skb->data + nhoff); struct guehdr *guehdr = (struct guehdr *)(skb->data + nhoff);
...@@ -435,10 +433,7 @@ static int fou_add_to_port_list(struct net *net, struct fou *fou) ...@@ -435,10 +433,7 @@ static int fou_add_to_port_list(struct net *net, struct fou *fou)
static void fou_release(struct fou *fou) static void fou_release(struct fou *fou)
{ {
struct socket *sock = fou->sock; 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); list_del(&fou->list);
udp_tunnel_sock_release(sock); udp_tunnel_sock_release(sock);
...@@ -448,11 +443,9 @@ static void fou_release(struct fou *fou) ...@@ -448,11 +443,9 @@ static void fou_release(struct fou *fou)
static int fou_encap_init(struct sock *sk, struct fou *fou, struct fou_cfg *cfg) static int fou_encap_init(struct sock *sk, struct fou *fou, struct fou_cfg *cfg)
{ {
udp_sk(sk)->encap_rcv = fou_udp_recv; udp_sk(sk)->encap_rcv = fou_udp_recv;
fou->protocol = cfg->protocol; udp_sk(sk)->gro_receive = fou_gro_receive;
fou->udp_offloads.callbacks.gro_receive = fou_gro_receive; udp_sk(sk)->gro_complete = fou_gro_complete;
fou->udp_offloads.callbacks.gro_complete = fou_gro_complete; fou_from_sock(sk)->protocol = cfg->protocol;
fou->udp_offloads.port = cfg->udp_config.local_udp_port;
fou->udp_offloads.ipproto = cfg->protocol;
return 0; return 0;
} }
...@@ -460,9 +453,8 @@ static int fou_encap_init(struct sock *sk, struct fou *fou, struct fou_cfg *cfg) ...@@ -460,9 +453,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) static int gue_encap_init(struct sock *sk, struct fou *fou, struct fou_cfg *cfg)
{ {
udp_sk(sk)->encap_rcv = gue_udp_recv; udp_sk(sk)->encap_rcv = gue_udp_recv;
fou->udp_offloads.callbacks.gro_receive = gue_gro_receive; udp_sk(sk)->gro_receive = gue_gro_receive;
fou->udp_offloads.callbacks.gro_complete = gue_gro_complete; udp_sk(sk)->gro_complete = gue_gro_complete;
fou->udp_offloads.port = cfg->udp_config.local_udp_port;
return 0; return 0;
} }
...@@ -521,12 +513,6 @@ static int fou_create(struct net *net, struct fou_cfg *cfg, ...@@ -521,12 +513,6 @@ static int fou_create(struct net *net, struct fou_cfg *cfg,
sk->sk_allocation = GFP_ATOMIC; 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); err = fou_add_to_port_list(net, fou);
if (err) if (err)
goto error; goto error;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment