Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mac80211: clean up RX key checks

Using the default key for "any key set" isn't
quite what we should do. It works, but with the
upcoming changes it makes life unnecessarily
complex, so do something better here and really
check for "any key".

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Johannes Berg and committed by
John W. Linville
897bed8b f33fdcf1

+21 -2
+21 -2
net/mac80211/rx.c
··· 955 955 * have been expected. 956 956 */ 957 957 struct ieee80211_key *key = NULL; 958 + struct ieee80211_sub_if_data *sdata = rx->sdata; 959 + int i; 960 + 958 961 if (ieee80211_is_mgmt(fc) && 959 962 is_multicast_ether_addr(hdr->addr1) && 960 963 (key = rcu_dereference(rx->sdata->default_mgmt_key))) 961 964 rx->key = key; 962 - else if ((key = rcu_dereference(rx->sdata->default_key))) 963 - rx->key = key; 965 + else { 966 + if (rx->sta) { 967 + for (i = 0; i < NUM_DEFAULT_KEYS; i++) { 968 + key = rcu_dereference(rx->sta->gtk[i]); 969 + if (key) 970 + break; 971 + } 972 + } 973 + if (!key) { 974 + for (i = 0; i < NUM_DEFAULT_KEYS; i++) { 975 + key = rcu_dereference(sdata->keys[i]); 976 + if (key) 977 + break; 978 + } 979 + } 980 + if (key) 981 + rx->key = key; 982 + } 964 983 return RX_CONTINUE; 965 984 } else { 966 985 u8 keyid;