diff options
Diffstat (limited to 'net/core/netpoll.c')
| -rw-r--r-- | net/core/netpoll.c | 31 | 
1 files changed, 18 insertions, 13 deletions
| diff --git a/net/core/netpoll.c b/net/core/netpoll.c index fc75c9e461b8..8f971990677c 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c @@ -636,8 +636,9 @@ static void netpoll_neigh_reply(struct sk_buff *skb, struct netpoll_info *npinfo  			netpoll_send_skb(np, send_skb); -			/* If there are several rx_hooks for the same address, -			   we're fine by sending a single reply */ +			/* If there are several rx_skb_hooks for the same +			 * address we're fine by sending a single reply +			 */  			break;  		}  		spin_unlock_irqrestore(&npinfo->rx_lock, flags); @@ -719,8 +720,9 @@ static void netpoll_neigh_reply(struct sk_buff *skb, struct netpoll_info *npinfo  			netpoll_send_skb(np, send_skb); -			/* If there are several rx_hooks for the same address, -			   we're fine by sending a single reply */ +			/* If there are several rx_skb_hooks for the same +			 * address, we're fine by sending a single reply +			 */  			break;  		}  		spin_unlock_irqrestore(&npinfo->rx_lock, flags); @@ -756,11 +758,12 @@ static bool pkt_is_ns(struct sk_buff *skb)  int __netpoll_rx(struct sk_buff *skb, struct netpoll_info *npinfo)  { -	int proto, len, ulen; -	int hits = 0; +	int proto, len, ulen, data_len; +	int hits = 0, offset;  	const struct iphdr *iph;  	struct udphdr *uh;  	struct netpoll *np, *tmp; +	uint16_t source;  	if (list_empty(&npinfo->rx_np))  		goto out; @@ -820,7 +823,10 @@ int __netpoll_rx(struct sk_buff *skb, struct netpoll_info *npinfo)  		len -= iph->ihl*4;  		uh = (struct udphdr *)(((char *)iph) + iph->ihl*4); +		offset = (unsigned char *)(uh + 1) - skb->data;  		ulen = ntohs(uh->len); +		data_len = skb->len - offset; +		source = ntohs(uh->source);  		if (ulen != len)  			goto out; @@ -834,9 +840,7 @@ int __netpoll_rx(struct sk_buff *skb, struct netpoll_info *npinfo)  			if (np->local_port && np->local_port != ntohs(uh->dest))  				continue; -			np->rx_hook(np, ntohs(uh->source), -				       (char *)(uh+1), -				       ulen - sizeof(struct udphdr)); +			np->rx_skb_hook(np, source, skb, offset, data_len);  			hits++;  		}  	} else { @@ -859,7 +863,10 @@ int __netpoll_rx(struct sk_buff *skb, struct netpoll_info *npinfo)  		if (!pskb_may_pull(skb, sizeof(struct udphdr)))  			goto out;  		uh = udp_hdr(skb); +		offset = (unsigned char *)(uh + 1) - skb->data;  		ulen = ntohs(uh->len); +		data_len = skb->len - offset; +		source = ntohs(uh->source);  		if (ulen != skb->len)  			goto out;  		if (udp6_csum_init(skb, uh, IPPROTO_UDP)) @@ -872,9 +879,7 @@ int __netpoll_rx(struct sk_buff *skb, struct netpoll_info *npinfo)  			if (np->local_port && np->local_port != ntohs(uh->dest))  				continue; -			np->rx_hook(np, ntohs(uh->source), -				       (char *)(uh+1), -				       ulen - sizeof(struct udphdr)); +			np->rx_skb_hook(np, source, skb, offset, data_len);  			hits++;  		}  #endif @@ -1062,7 +1067,7 @@ int __netpoll_setup(struct netpoll *np, struct net_device *ndev, gfp_t gfp)  	npinfo->netpoll = np; -	if (np->rx_hook) { +	if (np->rx_skb_hook) {  		spin_lock_irqsave(&npinfo->rx_lock, flags);  		npinfo->rx_flags |= NETPOLL_RX_ENABLED;  		list_add_tail(&np->rx, &npinfo->rx_np); |