diff options
Diffstat (limited to 'drivers/net/wireless/mwifiex/sta_cmd.c')
-rw-r--r-- | drivers/net/wireless/mwifiex/sta_cmd.c | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/drivers/net/wireless/mwifiex/sta_cmd.c b/drivers/net/wireless/mwifiex/sta_cmd.c index df3a33c530cf..0cc3406050dc 100644 --- a/drivers/net/wireless/mwifiex/sta_cmd.c +++ b/drivers/net/wireless/mwifiex/sta_cmd.c | |||
@@ -610,7 +610,7 @@ mwifiex_cmd_802_11_key_material(struct mwifiex_private *priv, | |||
610 | memcpy(&key_material->key_param_set.key[2], | 610 | memcpy(&key_material->key_param_set.key[2], |
611 | enc_key->key_material, enc_key->key_len); | 611 | enc_key->key_material, enc_key->key_len); |
612 | memcpy(&key_material->key_param_set.key[2 + enc_key->key_len], | 612 | memcpy(&key_material->key_param_set.key[2 + enc_key->key_len], |
613 | enc_key->wapi_rxpn, WAPI_RXPN_LEN); | 613 | enc_key->pn, PN_LEN); |
614 | key_material->key_param_set.length = | 614 | key_material->key_param_set.length = |
615 | cpu_to_le16(WAPI_KEY_LEN + KEYPARAMSET_FIXED_LEN); | 615 | cpu_to_le16(WAPI_KEY_LEN + KEYPARAMSET_FIXED_LEN); |
616 | 616 | ||
@@ -621,23 +621,38 @@ mwifiex_cmd_802_11_key_material(struct mwifiex_private *priv, | |||
621 | return ret; | 621 | return ret; |
622 | } | 622 | } |
623 | if (enc_key->key_len == WLAN_KEY_LEN_CCMP) { | 623 | if (enc_key->key_len == WLAN_KEY_LEN_CCMP) { |
624 | dev_dbg(priv->adapter->dev, "cmd: WPA_AES\n"); | 624 | if (enc_key->is_igtk_key) { |
625 | key_material->key_param_set.key_type_id = | 625 | dev_dbg(priv->adapter->dev, "cmd: CMAC_AES\n"); |
626 | key_material->key_param_set.key_type_id = | ||
627 | cpu_to_le16(KEY_TYPE_ID_AES_CMAC); | ||
628 | if (cmd_oid == KEY_INFO_ENABLED) | ||
629 | key_material->key_param_set.key_info = | ||
630 | cpu_to_le16(KEY_ENABLED); | ||
631 | else | ||
632 | key_material->key_param_set.key_info = | ||
633 | cpu_to_le16(!KEY_ENABLED); | ||
634 | |||
635 | key_material->key_param_set.key_info |= | ||
636 | cpu_to_le16(KEY_IGTK); | ||
637 | } else { | ||
638 | dev_dbg(priv->adapter->dev, "cmd: WPA_AES\n"); | ||
639 | key_material->key_param_set.key_type_id = | ||
626 | cpu_to_le16(KEY_TYPE_ID_AES); | 640 | cpu_to_le16(KEY_TYPE_ID_AES); |
627 | if (cmd_oid == KEY_INFO_ENABLED) | 641 | if (cmd_oid == KEY_INFO_ENABLED) |
628 | key_material->key_param_set.key_info = | 642 | key_material->key_param_set.key_info = |
629 | cpu_to_le16(KEY_ENABLED); | 643 | cpu_to_le16(KEY_ENABLED); |
630 | else | 644 | else |
631 | key_material->key_param_set.key_info = | 645 | key_material->key_param_set.key_info = |
632 | cpu_to_le16(!KEY_ENABLED); | 646 | cpu_to_le16(!KEY_ENABLED); |
633 | 647 | ||
634 | if (enc_key->key_index & MWIFIEX_KEY_INDEX_UNICAST) | 648 | if (enc_key->key_index & MWIFIEX_KEY_INDEX_UNICAST) |
635 | /* AES pairwise key: unicast */ | 649 | /* AES pairwise key: unicast */ |
636 | key_material->key_param_set.key_info |= | 650 | key_material->key_param_set.key_info |= |
637 | cpu_to_le16(KEY_UNICAST); | 651 | cpu_to_le16(KEY_UNICAST); |
638 | else /* AES group key: multicast */ | 652 | else /* AES group key: multicast */ |
639 | key_material->key_param_set.key_info |= | 653 | key_material->key_param_set.key_info |= |
640 | cpu_to_le16(KEY_MCAST); | 654 | cpu_to_le16(KEY_MCAST); |
655 | } | ||
641 | } else if (enc_key->key_len == WLAN_KEY_LEN_TKIP) { | 656 | } else if (enc_key->key_len == WLAN_KEY_LEN_TKIP) { |
642 | dev_dbg(priv->adapter->dev, "cmd: WPA_TKIP\n"); | 657 | dev_dbg(priv->adapter->dev, "cmd: WPA_TKIP\n"); |
643 | key_material->key_param_set.key_type_id = | 658 | key_material->key_param_set.key_type_id = |
@@ -668,6 +683,24 @@ mwifiex_cmd_802_11_key_material(struct mwifiex_private *priv, | |||
668 | key_param_len = (u16)(enc_key->key_len + KEYPARAMSET_FIXED_LEN) | 683 | key_param_len = (u16)(enc_key->key_len + KEYPARAMSET_FIXED_LEN) |
669 | + sizeof(struct mwifiex_ie_types_header); | 684 | + sizeof(struct mwifiex_ie_types_header); |
670 | 685 | ||
686 | if (le16_to_cpu(key_material->key_param_set.key_type_id) == | ||
687 | KEY_TYPE_ID_AES_CMAC) { | ||
688 | struct mwifiex_cmac_param *param = | ||
689 | (void *)key_material->key_param_set.key; | ||
690 | |||
691 | memcpy(param->ipn, enc_key->pn, IGTK_PN_LEN); | ||
692 | memcpy(param->key, enc_key->key_material, | ||
693 | WLAN_KEY_LEN_AES_CMAC); | ||
694 | |||
695 | key_param_len = sizeof(struct mwifiex_cmac_param); | ||
696 | key_material->key_param_set.key_len = | ||
697 | cpu_to_le16(key_param_len); | ||
698 | key_param_len += KEYPARAMSET_FIXED_LEN; | ||
699 | key_material->key_param_set.length = | ||
700 | cpu_to_le16(key_param_len); | ||
701 | key_param_len += sizeof(struct mwifiex_ie_types_header); | ||
702 | } | ||
703 | |||
671 | cmd->size = cpu_to_le16(sizeof(key_material->action) + S_DS_GEN | 704 | cmd->size = cpu_to_le16(sizeof(key_material->action) + S_DS_GEN |
672 | + key_param_len); | 705 | + key_param_len); |
673 | 706 | ||