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

udp: pass udp_offload struct to UDP gro callbacks

This patch introduces udp_offload_callbacks which has the same
GRO functions (but not a GSO function) as offload_callbacks,
except there is an argument to a udp_offload struct passed to
gro_receive and gro_complete functions. This additional argument
can be used to retrieve the per port structure of the encapsulation
for use in gro processing (mostly by doing container_of on the
structure).
Signed-off-by: default avatarTom Herbert <therbert@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d823ab68
...@@ -539,7 +539,9 @@ static int vxlan_fdb_append(struct vxlan_fdb *f, ...@@ -539,7 +539,9 @@ static int vxlan_fdb_append(struct vxlan_fdb *f,
return 1; return 1;
} }
static struct sk_buff **vxlan_gro_receive(struct sk_buff **head, struct sk_buff *skb) static struct sk_buff **vxlan_gro_receive(struct sk_buff **head,
struct sk_buff *skb,
struct udp_offload *uoff)
{ {
struct sk_buff *p, **pp = NULL; struct sk_buff *p, **pp = NULL;
struct vxlanhdr *vh, *vh2; struct vxlanhdr *vh, *vh2;
...@@ -578,7 +580,8 @@ static struct sk_buff **vxlan_gro_receive(struct sk_buff **head, struct sk_buff ...@@ -578,7 +580,8 @@ static struct sk_buff **vxlan_gro_receive(struct sk_buff **head, struct sk_buff
return pp; return pp;
} }
static int vxlan_gro_complete(struct sk_buff *skb, int nhoff) static int vxlan_gro_complete(struct sk_buff *skb, int nhoff,
struct udp_offload *uoff)
{ {
udp_tunnel_gro_complete(skb, nhoff); udp_tunnel_gro_complete(skb, nhoff);
......
...@@ -1969,7 +1969,7 @@ struct offload_callbacks { ...@@ -1969,7 +1969,7 @@ struct offload_callbacks {
struct sk_buff *(*gso_segment)(struct sk_buff *skb, struct sk_buff *(*gso_segment)(struct sk_buff *skb,
netdev_features_t features); netdev_features_t features);
struct sk_buff **(*gro_receive)(struct sk_buff **head, struct sk_buff **(*gro_receive)(struct sk_buff **head,
struct sk_buff *skb); struct sk_buff *skb);
int (*gro_complete)(struct sk_buff *skb, int nhoff); int (*gro_complete)(struct sk_buff *skb, int nhoff);
}; };
...@@ -1979,10 +1979,21 @@ struct packet_offload { ...@@ -1979,10 +1979,21 @@ struct packet_offload {
struct list_head list; struct list_head list;
}; };
struct udp_offload;
struct udp_offload_callbacks {
struct sk_buff **(*gro_receive)(struct sk_buff **head,
struct sk_buff *skb,
struct udp_offload *uoff);
int (*gro_complete)(struct sk_buff *skb,
int nhoff,
struct udp_offload *uoff);
};
struct udp_offload { struct udp_offload {
__be16 port; __be16 port;
u8 ipproto; u8 ipproto;
struct offload_callbacks callbacks; struct udp_offload_callbacks callbacks;
}; };
/* often modified stats are per cpu, other are shared (netdev->stats) */ /* often modified stats are per cpu, other are shared (netdev->stats) */
......
...@@ -174,7 +174,8 @@ static int gue_udp_recv(struct sock *sk, struct sk_buff *skb) ...@@ -174,7 +174,8 @@ static int gue_udp_recv(struct sock *sk, struct sk_buff *skb)
} }
static struct sk_buff **fou_gro_receive(struct sk_buff **head, static struct sk_buff **fou_gro_receive(struct sk_buff **head,
struct sk_buff *skb) struct sk_buff *skb,
struct udp_offload *uoff)
{ {
const struct net_offload *ops; const struct net_offload *ops;
struct sk_buff **pp = NULL; struct sk_buff **pp = NULL;
...@@ -195,7 +196,8 @@ static struct sk_buff **fou_gro_receive(struct sk_buff **head, ...@@ -195,7 +196,8 @@ 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 sk_buff *skb, int nhoff,
struct udp_offload *uoff)
{ {
const struct net_offload *ops; const struct net_offload *ops;
u8 proto = NAPI_GRO_CB(skb)->proto; u8 proto = NAPI_GRO_CB(skb)->proto;
...@@ -254,7 +256,8 @@ static struct guehdr *gue_gro_remcsum(struct sk_buff *skb, unsigned int off, ...@@ -254,7 +256,8 @@ static struct guehdr *gue_gro_remcsum(struct sk_buff *skb, unsigned int off,
} }
static struct sk_buff **gue_gro_receive(struct sk_buff **head, static struct sk_buff **gue_gro_receive(struct sk_buff **head,
struct sk_buff *skb) struct sk_buff *skb,
struct udp_offload *uoff)
{ {
const struct net_offload **offloads; const struct net_offload **offloads;
const struct net_offload *ops; const struct net_offload *ops;
...@@ -360,7 +363,8 @@ static struct sk_buff **gue_gro_receive(struct sk_buff **head, ...@@ -360,7 +363,8 @@ 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 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);
......
...@@ -147,7 +147,8 @@ static int geneve_hlen(struct genevehdr *gh) ...@@ -147,7 +147,8 @@ static int geneve_hlen(struct genevehdr *gh)
} }
static struct sk_buff **geneve_gro_receive(struct sk_buff **head, static struct sk_buff **geneve_gro_receive(struct sk_buff **head,
struct sk_buff *skb) struct sk_buff *skb,
struct udp_offload *uoff)
{ {
struct sk_buff *p, **pp = NULL; struct sk_buff *p, **pp = NULL;
struct genevehdr *gh, *gh2; struct genevehdr *gh, *gh2;
...@@ -211,7 +212,8 @@ static struct sk_buff **geneve_gro_receive(struct sk_buff **head, ...@@ -211,7 +212,8 @@ static struct sk_buff **geneve_gro_receive(struct sk_buff **head,
return pp; return pp;
} }
static int geneve_gro_complete(struct sk_buff *skb, int nhoff) static int geneve_gro_complete(struct sk_buff *skb, int nhoff,
struct udp_offload *uoff)
{ {
struct genevehdr *gh; struct genevehdr *gh;
struct packet_offload *ptype; struct packet_offload *ptype;
......
...@@ -339,7 +339,8 @@ struct sk_buff **udp_gro_receive(struct sk_buff **head, struct sk_buff *skb, ...@@ -339,7 +339,8 @@ struct sk_buff **udp_gro_receive(struct sk_buff **head, struct sk_buff *skb,
skb_gro_pull(skb, sizeof(struct udphdr)); /* pull encapsulating udp header */ skb_gro_pull(skb, sizeof(struct udphdr)); /* pull encapsulating udp header */
skb_gro_postpull_rcsum(skb, uh, sizeof(struct udphdr)); skb_gro_postpull_rcsum(skb, uh, sizeof(struct udphdr));
NAPI_GRO_CB(skb)->proto = uo_priv->offload->ipproto; NAPI_GRO_CB(skb)->proto = uo_priv->offload->ipproto;
pp = uo_priv->offload->callbacks.gro_receive(head, skb); pp = uo_priv->offload->callbacks.gro_receive(head, skb,
uo_priv->offload);
out_unlock: out_unlock:
rcu_read_unlock(); rcu_read_unlock();
...@@ -395,7 +396,9 @@ int udp_gro_complete(struct sk_buff *skb, int nhoff) ...@@ -395,7 +396,9 @@ int udp_gro_complete(struct sk_buff *skb, int nhoff)
if (uo_priv != NULL) { if (uo_priv != NULL) {
NAPI_GRO_CB(skb)->proto = uo_priv->offload->ipproto; NAPI_GRO_CB(skb)->proto = uo_priv->offload->ipproto;
err = uo_priv->offload->callbacks.gro_complete(skb, nhoff + sizeof(struct udphdr)); err = uo_priv->offload->callbacks.gro_complete(skb,
nhoff + sizeof(struct udphdr),
uo_priv->offload);
} }
rcu_read_unlock(); rcu_read_unlock();
......
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