Commit 89c91cae authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

mac80211: dont program keys for stations not uploaded

If a station couldn't be uploaded to the driver but
is still kept (only in IBSS mode) we still shouldn't
try to program the keys for it into hardware; fix
this bug by skipping the key upload in this case.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 077f4939
...@@ -54,14 +54,6 @@ static void assert_key_lock(struct ieee80211_local *local) ...@@ -54,14 +54,6 @@ static void assert_key_lock(struct ieee80211_local *local)
lockdep_assert_held(&local->key_mtx); lockdep_assert_held(&local->key_mtx);
} }
static struct ieee80211_sta *get_sta_for_key(struct ieee80211_key *key)
{
if (key->sta)
return &key->sta->sta;
return NULL;
}
static void increment_tailroom_need_count(struct ieee80211_sub_if_data *sdata) static void increment_tailroom_need_count(struct ieee80211_sub_if_data *sdata)
{ {
/* /*
...@@ -95,7 +87,7 @@ static void increment_tailroom_need_count(struct ieee80211_sub_if_data *sdata) ...@@ -95,7 +87,7 @@ static void increment_tailroom_need_count(struct ieee80211_sub_if_data *sdata)
static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key) static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
{ {
struct ieee80211_sub_if_data *sdata; struct ieee80211_sub_if_data *sdata;
struct ieee80211_sta *sta; struct sta_info *sta;
int ret; int ret;
might_sleep(); might_sleep();
...@@ -105,7 +97,7 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key) ...@@ -105,7 +97,7 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
assert_key_lock(key->local); assert_key_lock(key->local);
sta = get_sta_for_key(key); sta = key->sta;
/* /*
* If this is a per-STA GTK, check if it * If this is a per-STA GTK, check if it
...@@ -115,6 +107,9 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key) ...@@ -115,6 +107,9 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
!(key->local->hw.flags & IEEE80211_HW_SUPPORTS_PER_STA_GTK)) !(key->local->hw.flags & IEEE80211_HW_SUPPORTS_PER_STA_GTK))
goto out_unsupported; goto out_unsupported;
if (sta && !sta->uploaded)
goto out_unsupported;
sdata = key->sdata; sdata = key->sdata;
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
/* /*
...@@ -125,7 +120,8 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key) ...@@ -125,7 +120,8 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
goto out_unsupported; goto out_unsupported;
} }
ret = drv_set_key(key->local, SET_KEY, sdata, sta, &key->conf); ret = drv_set_key(key->local, SET_KEY, sdata,
sta ? &sta->sta : NULL, &key->conf);
if (!ret) { if (!ret) {
key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE; key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE;
...@@ -144,7 +140,8 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key) ...@@ -144,7 +140,8 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
if (ret != -ENOSPC && ret != -EOPNOTSUPP) if (ret != -ENOSPC && ret != -EOPNOTSUPP)
wiphy_err(key->local->hw.wiphy, wiphy_err(key->local->hw.wiphy,
"failed to set key (%d, %pM) to hardware (%d)\n", "failed to set key (%d, %pM) to hardware (%d)\n",
key->conf.keyidx, sta ? sta->addr : bcast_addr, ret); key->conf.keyidx,
sta ? sta->sta.addr : bcast_addr, ret);
out_unsupported: out_unsupported:
switch (key->conf.cipher) { switch (key->conf.cipher) {
...@@ -163,7 +160,7 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key) ...@@ -163,7 +160,7 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key) static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key)
{ {
struct ieee80211_sub_if_data *sdata; struct ieee80211_sub_if_data *sdata;
struct ieee80211_sta *sta; struct sta_info *sta;
int ret; int ret;
might_sleep(); might_sleep();
...@@ -176,7 +173,7 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key) ...@@ -176,7 +173,7 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key)
if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
return; return;
sta = get_sta_for_key(key); sta = key->sta;
sdata = key->sdata; sdata = key->sdata;
if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) || if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) ||
...@@ -185,12 +182,13 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key) ...@@ -185,12 +182,13 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key)
increment_tailroom_need_count(sdata); increment_tailroom_need_count(sdata);
ret = drv_set_key(key->local, DISABLE_KEY, sdata, ret = drv_set_key(key->local, DISABLE_KEY, sdata,
sta, &key->conf); sta ? &sta->sta : NULL, &key->conf);
if (ret) if (ret)
wiphy_err(key->local->hw.wiphy, wiphy_err(key->local->hw.wiphy,
"failed to remove key (%d, %pM) from hardware (%d)\n", "failed to remove key (%d, %pM) from hardware (%d)\n",
key->conf.keyidx, sta ? sta->addr : bcast_addr, ret); key->conf.keyidx,
sta ? sta->sta.addr : bcast_addr, ret);
key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE; key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment