diff options
author | Ying Luo <luoy@marvell.com> | 2012-08-03 21:06:14 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-08-06 15:12:59 -0400 |
commit | b877f4cf5af86528e07a0182e2b369ded38ccf38 (patch) | |
tree | 73342f416e69887384bf992bd2962871c333331e /drivers/net/wireless/mwifiex/sta_cmd.c | |
parent | 53b112315c015c50e4c092474adb6729269b0fc4 (diff) |
mwifiex: add AES_CMAC support in key_material cmd
The sequence counter will be sent to firmware via key_material
command.
Signed-off-by: Ying Luo <luoy@marvell.com>
Signed-off-by: Stone Piao <piaoyun@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/mwifiex/sta_cmd.c')
-rw-r--r-- | drivers/net/wireless/mwifiex/sta_cmd.c | 53 |
1 files changed, 43 insertions, 10 deletions
diff --git a/drivers/net/wireless/mwifiex/sta_cmd.c b/drivers/net/wireless/mwifiex/sta_cmd.c index a4a4a19b008a..9af96926093e 100644 --- a/drivers/net/wireless/mwifiex/sta_cmd.c +++ b/drivers/net/wireless/mwifiex/sta_cmd.c | |||
@@ -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 | enc_key->key_len); | ||
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 | ||