Skip to content

Commit

Permalink
fou: change to use UDP socket GRO
Browse files Browse the repository at this point in the history
Adapt gue_gro_receive, gue_gro_complete to take a socket argument.
Don't set udp_offloads any more.

Signed-off-by: Tom Herbert <tom@herbertland.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
tomratbert authored and davem330 committed Apr 7, 2016
1 parent 5602c48 commit d92283e
Showing 1 changed file with 17 additions and 31 deletions.
48 changes: 17 additions & 31 deletions net/ipv4/fou.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand Down Expand Up @@ -186,13 +185,13 @@ static int gue_udp_recv(struct sock *sk, struct sk_buff *skb)
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
Expand All @@ -217,11 +216,11 @@ static struct sk_buff **fou_gro_receive(struct sk_buff **head,
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;

Expand Down Expand Up @@ -264,9 +263,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;
Expand All @@ -277,7 +276,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);
Expand Down Expand Up @@ -386,8 +385,7 @@ static struct sk_buff **gue_gro_receive(struct sk_buff **head,
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);
Expand Down Expand Up @@ -435,10 +433,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);

Expand All @@ -448,21 +443,18 @@ 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;
}

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;
}
Expand Down Expand Up @@ -521,12 +513,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;
Expand Down

0 comments on commit d92283e

Please sign in to comment.