forked from mirrors/linux
		
	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: Tom Herbert <tom@herbertland.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									5602c48cf8
								
							
						
					
					
						commit
						d92283e338
					
				
					 1 changed files with 17 additions and 31 deletions
				
			
		|  | @ -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) | ||||||
| 	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, | ||||||
| 	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, | ||||||
| 	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, | ||||||
| 	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, | ||||||
| 	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) | ||||||
| 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; | 	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) | ||||||
| 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, | ||||||
| 
 | 
 | ||||||
| 	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; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Tom Herbert
						Tom Herbert