diff options
Diffstat (limited to 'net/wireless/util.c')
| -rw-r--r-- | net/wireless/util.c | 14 | 
1 files changed, 8 insertions, 6 deletions
diff --git a/net/wireless/util.c b/net/wireless/util.c index ef35f4ef2aa6..2762e8329986 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -309,23 +309,21 @@ unsigned int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb)  }  EXPORT_SYMBOL(ieee80211_get_hdrlen_from_skb); -static int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr) +unsigned int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr)  {  	int ae = meshhdr->flags & MESH_FLAGS_AE; -	/* 7.1.3.5a.2 */ +	/* 802.11-2012, 8.2.4.7.3 */  	switch (ae) { +	default:  	case 0:  		return 6;  	case MESH_FLAGS_AE_A4:  		return 12;  	case MESH_FLAGS_AE_A5_A6:  		return 18; -	case (MESH_FLAGS_AE_A4 | MESH_FLAGS_AE_A5_A6): -		return 24; -	default: -		return 6;  	}  } +EXPORT_SYMBOL(ieee80211_get_mesh_hdrlen);  int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr,  			   enum nl80211_iftype iftype) @@ -373,6 +371,8 @@ int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr,  			/* make sure meshdr->flags is on the linear part */  			if (!pskb_may_pull(skb, hdrlen + 1))  				return -1; +			if (meshdr->flags & MESH_FLAGS_AE_A4) +				return -1;  			if (meshdr->flags & MESH_FLAGS_AE_A5_A6) {  				skb_copy_bits(skb, hdrlen +  					offsetof(struct ieee80211s_hdr, eaddr1), @@ -397,6 +397,8 @@ int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr,  			/* make sure meshdr->flags is on the linear part */  			if (!pskb_may_pull(skb, hdrlen + 1))  				return -1; +			if (meshdr->flags & MESH_FLAGS_AE_A5_A6) +				return -1;  			if (meshdr->flags & MESH_FLAGS_AE_A4)  				skb_copy_bits(skb, hdrlen +  					offsetof(struct ieee80211s_hdr, eaddr1),  | 
