aboutsummaryrefslogtreecommitdiffstats
path: root/net/ieee80211/ieee80211_wx.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ieee80211/ieee80211_wx.c')
-rw-r--r--net/ieee80211/ieee80211_wx.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/net/ieee80211/ieee80211_wx.c b/net/ieee80211/ieee80211_wx.c
index db66217699d5..d710f47c4bd5 100644
--- a/net/ieee80211/ieee80211_wx.c
+++ b/net/ieee80211/ieee80211_wx.c
@@ -493,6 +493,7 @@ int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee,
493 struct iw_point *encoding = &wrqu->encoding; 493 struct iw_point *encoding = &wrqu->encoding;
494 struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; 494 struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
495 int i, idx, ret = 0; 495 int i, idx, ret = 0;
496 int group_key = 0;
496 const char *alg, *module; 497 const char *alg, *module;
497 struct ieee80211_crypto_ops *ops; 498 struct ieee80211_crypto_ops *ops;
498 struct ieee80211_crypt_data **crypt; 499 struct ieee80211_crypt_data **crypt;
@@ -509,9 +510,10 @@ int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee,
509 } else 510 } else
510 idx = ieee->tx_keyidx; 511 idx = ieee->tx_keyidx;
511 512
512 if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) 513 if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
513 crypt = &ieee->crypt[idx]; 514 crypt = &ieee->crypt[idx];
514 else { 515 group_key = 1;
516 } else {
515 if (idx != 0) 517 if (idx != 0)
516 return -EINVAL; 518 return -EINVAL;
517 if (ieee->iw_mode == IW_MODE_INFRA) 519 if (ieee->iw_mode == IW_MODE_INFRA)
@@ -542,7 +544,9 @@ int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee,
542 sec.enabled = 1; 544 sec.enabled = 1;
543 sec.encrypt = 1; 545 sec.encrypt = 1;
544 546
545 if (!(ieee->host_encrypt || ieee->host_decrypt)) 547 if (group_key ? !ieee->host_mc_decrypt :
548 !(ieee->host_encrypt || ieee->host_decrypt ||
549 ieee->host_encrypt_msdu))
546 goto skip_host_crypt; 550 goto skip_host_crypt;
547 551
548 switch (ext->alg) { 552 switch (ext->alg) {
@@ -632,6 +636,9 @@ int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee,
632 sec.flags |= SEC_LEVEL; 636 sec.flags |= SEC_LEVEL;
633 sec.level = SEC_LEVEL_3; 637 sec.level = SEC_LEVEL_3;
634 } 638 }
639 /* Don't set sec level for group keys. */
640 if (group_key)
641 sec.flags &= ~SEC_LEVEL;
635 } 642 }
636 done: 643 done:
637 if (ieee->set_security) 644 if (ieee->set_security)