diff options
| author | David S. Miller <davem@davemloft.net> | 2016-10-30 19:42:58 +0300 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2016-10-30 19:42:58 +0300 | 
| commit | 27058af401e49d88a905df000dd26f443fcfa8ce (patch) | |
| tree | 819f32113d3b8374b9fbf72e2202d4c4d4511a60 /net/wireless/util.c | |
| parent | 357f4aae859b5d74554b0ccbb18556f1df4166c3 (diff) | |
| parent | 2a26d99b251b8625d27aed14e97fc10707a3a81f (diff) | |
| download | linux-27058af401e49d88a905df000dd26f443fcfa8ce.tar.xz | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Mostly simple overlapping changes.
For example, David Ahern's adjacency list revamp in 'net-next'
conflicted with an adjacency list traversal bug fix in 'net'.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/wireless/util.c')
| -rw-r--r-- | net/wireless/util.c | 34 | 
1 files changed, 15 insertions, 19 deletions
diff --git a/net/wireless/util.c b/net/wireless/util.c index 32060f81a8e7..88725f8eefad 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -421,8 +421,8 @@ unsigned int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr)  }  EXPORT_SYMBOL(ieee80211_get_mesh_hdrlen); -static int __ieee80211_data_to_8023(struct sk_buff *skb, struct ethhdr *ehdr, -				    const u8 *addr, enum nl80211_iftype iftype) +int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr, +				  const u8 *addr, enum nl80211_iftype iftype)  {  	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;  	struct { @@ -526,13 +526,7 @@ static int __ieee80211_data_to_8023(struct sk_buff *skb, struct ethhdr *ehdr,  	return 0;  } - -int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr, -			   enum nl80211_iftype iftype) -{ -	return __ieee80211_data_to_8023(skb, NULL, addr, iftype); -} -EXPORT_SYMBOL(ieee80211_data_to_8023); +EXPORT_SYMBOL(ieee80211_data_to_8023_exthdr);  int ieee80211_data_from_8023(struct sk_buff *skb, const u8 *addr,  			     enum nl80211_iftype iftype, @@ -747,24 +741,18 @@ __ieee80211_amsdu_copy(struct sk_buff *skb, unsigned int hlen,  void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list,  			      const u8 *addr, enum nl80211_iftype iftype,  			      const unsigned int extra_headroom, -			      bool has_80211_header) +			      const u8 *check_da, const u8 *check_sa)  {  	unsigned int hlen = ALIGN(extra_headroom, 4);  	struct sk_buff *frame = NULL;  	u16 ethertype;  	u8 *payload; -	int offset = 0, remaining, err; +	int offset = 0, remaining;  	struct ethhdr eth;  	bool reuse_frag = skb->head_frag && !skb_has_frag_list(skb);  	bool reuse_skb = false;  	bool last = false; -	if (has_80211_header) { -		err = __ieee80211_data_to_8023(skb, ð, addr, iftype); -		if (err) -			goto out; -	} -  	while (!last) {  		unsigned int subframe_len;  		int len; @@ -781,8 +769,17 @@ void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list,  			goto purge;  		offset += sizeof(struct ethhdr); -		/* reuse skb for the last subframe */  		last = remaining <= subframe_len + padding; + +		/* FIXME: should we really accept multicast DA? */ +		if ((check_da && !is_multicast_ether_addr(eth.h_dest) && +		     !ether_addr_equal(check_da, eth.h_dest)) || +		    (check_sa && !ether_addr_equal(check_sa, eth.h_source))) { +			offset += len + padding; +			continue; +		} + +		/* reuse skb for the last subframe */  		if (!skb_is_nonlinear(skb) && !reuse_frag && last) {  			skb_pull(skb, offset);  			frame = skb; @@ -820,7 +817,6 @@ void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list,   purge:  	__skb_queue_purge(list); - out:  	dev_kfree_skb(skb);  }  EXPORT_SYMBOL(ieee80211_amsdu_to_8023s);  | 
