aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/mwifiex/sta_cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/mwifiex/sta_cmd.c')
-rw-r--r--drivers/net/wireless/mwifiex/sta_cmd.c55
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