diff options
Diffstat (limited to 'net/ieee80211/ieee80211_wx.c')
-rw-r--r-- | net/ieee80211/ieee80211_wx.c | 13 |
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) |