|
@@ -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 @@ drop:
|
|
return 0;
|
|
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;
|
|
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 @@ out_unlock:
|
|
return pp;
|
|
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;
|
|
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,
|
|
return guehdr;
|
|
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 **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,
|
|
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 @@ out:
|
|
return pp;
|
|
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;
|
|
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)
|
|
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)
|
|
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;
|
|
|
|
- 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;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -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;
|
|
|
|
- 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;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -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;
|