diff options
-rw-r--r-- | drivers/net/wireless/intel/iwlwifi/dvm/lib.c | 20 | ||||
-rw-r--r-- | drivers/staging/vt6655/rxtx.c | 12 | ||||
-rw-r--r-- | drivers/staging/vt6656/rxtx.c | 12 | ||||
-rw-r--r-- | include/net/mac80211.h | 34 | ||||
-rw-r--r-- | net/mac80211/key.c | 87 |
5 files changed, 24 insertions, 141 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/lib.c b/drivers/net/wireless/intel/iwlwifi/dvm/lib.c index 4841be2aa499..1799469268ea 100644 --- a/drivers/net/wireless/intel/iwlwifi/dvm/lib.c +++ b/drivers/net/wireless/intel/iwlwifi/dvm/lib.c | |||
@@ -943,14 +943,16 @@ static void iwlagn_wowlan_program_keys(struct ieee80211_hw *hw, | |||
943 | switch (key->cipher) { | 943 | switch (key->cipher) { |
944 | case WLAN_CIPHER_SUITE_TKIP: | 944 | case WLAN_CIPHER_SUITE_TKIP: |
945 | if (sta) { | 945 | if (sta) { |
946 | u64 pn64; | ||
947 | |||
946 | tkip_sc = data->rsc_tsc->all_tsc_rsc.tkip.unicast_rsc; | 948 | tkip_sc = data->rsc_tsc->all_tsc_rsc.tkip.unicast_rsc; |
947 | tkip_tx_sc = &data->rsc_tsc->all_tsc_rsc.tkip.tsc; | 949 | tkip_tx_sc = &data->rsc_tsc->all_tsc_rsc.tkip.tsc; |
948 | 950 | ||
949 | rx_p1ks = data->tkip->rx_uni; | 951 | rx_p1ks = data->tkip->rx_uni; |
950 | 952 | ||
951 | ieee80211_get_key_tx_seq(key, &seq); | 953 | pn64 = atomic64_read(&key->tx_pn); |
952 | tkip_tx_sc->iv16 = cpu_to_le16(seq.tkip.iv16); | 954 | tkip_tx_sc->iv16 = cpu_to_le16(TKIP_PN_TO_IV16(pn64)); |
953 | tkip_tx_sc->iv32 = cpu_to_le32(seq.tkip.iv32); | 955 | tkip_tx_sc->iv32 = cpu_to_le32(TKIP_PN_TO_IV32(pn64)); |
954 | 956 | ||
955 | ieee80211_get_tkip_p1k_iv(key, seq.tkip.iv32, p1k); | 957 | ieee80211_get_tkip_p1k_iv(key, seq.tkip.iv32, p1k); |
956 | iwlagn_convert_p1k(p1k, data->tkip->tx.p1k); | 958 | iwlagn_convert_p1k(p1k, data->tkip->tx.p1k); |
@@ -996,19 +998,13 @@ static void iwlagn_wowlan_program_keys(struct ieee80211_hw *hw, | |||
996 | break; | 998 | break; |
997 | case WLAN_CIPHER_SUITE_CCMP: | 999 | case WLAN_CIPHER_SUITE_CCMP: |
998 | if (sta) { | 1000 | if (sta) { |
999 | u8 *pn = seq.ccmp.pn; | 1001 | u64 pn64; |
1000 | 1002 | ||
1001 | aes_sc = data->rsc_tsc->all_tsc_rsc.aes.unicast_rsc; | 1003 | aes_sc = data->rsc_tsc->all_tsc_rsc.aes.unicast_rsc; |
1002 | aes_tx_sc = &data->rsc_tsc->all_tsc_rsc.aes.tsc; | 1004 | aes_tx_sc = &data->rsc_tsc->all_tsc_rsc.aes.tsc; |
1003 | 1005 | ||
1004 | ieee80211_get_key_tx_seq(key, &seq); | 1006 | pn64 = atomic64_read(&key->tx_pn); |
1005 | aes_tx_sc->pn = cpu_to_le64( | 1007 | aes_tx_sc->pn = cpu_to_le64(pn64); |
1006 | (u64)pn[5] | | ||
1007 | ((u64)pn[4] << 8) | | ||
1008 | ((u64)pn[3] << 16) | | ||
1009 | ((u64)pn[2] << 24) | | ||
1010 | ((u64)pn[1] << 32) | | ||
1011 | ((u64)pn[0] << 40)); | ||
1012 | } else | 1008 | } else |
1013 | aes_sc = data->rsc_tsc->all_tsc_rsc.aes.multicast_rsc; | 1009 | aes_sc = data->rsc_tsc->all_tsc_rsc.aes.multicast_rsc; |
1014 | 1010 | ||
diff --git a/drivers/staging/vt6655/rxtx.c b/drivers/staging/vt6655/rxtx.c index b668db6a45fb..1a2dda09b69d 100644 --- a/drivers/staging/vt6655/rxtx.c +++ b/drivers/staging/vt6655/rxtx.c | |||
@@ -1210,7 +1210,7 @@ static void vnt_fill_txkey(struct ieee80211_hdr *hdr, u8 *key_buffer, | |||
1210 | struct sk_buff *skb, u16 payload_len, | 1210 | struct sk_buff *skb, u16 payload_len, |
1211 | struct vnt_mic_hdr *mic_hdr) | 1211 | struct vnt_mic_hdr *mic_hdr) |
1212 | { | 1212 | { |
1213 | struct ieee80211_key_seq seq; | 1213 | u64 pn64; |
1214 | u8 *iv = ((u8 *)hdr + ieee80211_get_hdrlen_from_skb(skb)); | 1214 | u8 *iv = ((u8 *)hdr + ieee80211_get_hdrlen_from_skb(skb)); |
1215 | 1215 | ||
1216 | /* strip header and icv len from payload */ | 1216 | /* strip header and icv len from payload */ |
@@ -1243,9 +1243,13 @@ static void vnt_fill_txkey(struct ieee80211_hdr *hdr, u8 *key_buffer, | |||
1243 | mic_hdr->payload_len = cpu_to_be16(payload_len); | 1243 | mic_hdr->payload_len = cpu_to_be16(payload_len); |
1244 | ether_addr_copy(mic_hdr->mic_addr2, hdr->addr2); | 1244 | ether_addr_copy(mic_hdr->mic_addr2, hdr->addr2); |
1245 | 1245 | ||
1246 | ieee80211_get_key_tx_seq(tx_key, &seq); | 1246 | pn64 = atomic64_read(&tx_key->tx_pn); |
1247 | 1247 | mic_hdr->ccmp_pn[5] = pn64; | |
1248 | memcpy(mic_hdr->ccmp_pn, seq.ccmp.pn, IEEE80211_CCMP_PN_LEN); | 1248 | mic_hdr->ccmp_pn[4] = pn64 >> 8; |
1249 | mic_hdr->ccmp_pn[3] = pn64 >> 16; | ||
1250 | mic_hdr->ccmp_pn[2] = pn64 >> 24; | ||
1251 | mic_hdr->ccmp_pn[1] = pn64 >> 32; | ||
1252 | mic_hdr->ccmp_pn[0] = pn64 >> 40; | ||
1249 | 1253 | ||
1250 | if (ieee80211_has_a4(hdr->frame_control)) | 1254 | if (ieee80211_has_a4(hdr->frame_control)) |
1251 | mic_hdr->hlen = cpu_to_be16(28); | 1255 | mic_hdr->hlen = cpu_to_be16(28); |
diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c index efb54f53b4f9..76378d225b46 100644 --- a/drivers/staging/vt6656/rxtx.c +++ b/drivers/staging/vt6656/rxtx.c | |||
@@ -719,7 +719,7 @@ static void vnt_fill_txkey(struct vnt_usb_send_context *tx_context, | |||
719 | u16 payload_len, struct vnt_mic_hdr *mic_hdr) | 719 | u16 payload_len, struct vnt_mic_hdr *mic_hdr) |
720 | { | 720 | { |
721 | struct ieee80211_hdr *hdr = tx_context->hdr; | 721 | struct ieee80211_hdr *hdr = tx_context->hdr; |
722 | struct ieee80211_key_seq seq; | 722 | u64 pn64; |
723 | u8 *iv = ((u8 *)hdr + ieee80211_get_hdrlen_from_skb(skb)); | 723 | u8 *iv = ((u8 *)hdr + ieee80211_get_hdrlen_from_skb(skb)); |
724 | 724 | ||
725 | /* strip header and icv len from payload */ | 725 | /* strip header and icv len from payload */ |
@@ -752,9 +752,13 @@ static void vnt_fill_txkey(struct vnt_usb_send_context *tx_context, | |||
752 | mic_hdr->payload_len = cpu_to_be16(payload_len); | 752 | mic_hdr->payload_len = cpu_to_be16(payload_len); |
753 | ether_addr_copy(mic_hdr->mic_addr2, hdr->addr2); | 753 | ether_addr_copy(mic_hdr->mic_addr2, hdr->addr2); |
754 | 754 | ||
755 | ieee80211_get_key_tx_seq(tx_key, &seq); | 755 | pn64 = atomic64_read(&tx_key->tx_pn); |
756 | 756 | mic_hdr->ccmp_pn[5] = pn64; | |
757 | memcpy(mic_hdr->ccmp_pn, seq.ccmp.pn, IEEE80211_CCMP_PN_LEN); | 757 | mic_hdr->ccmp_pn[4] = pn64 >> 8; |
758 | mic_hdr->ccmp_pn[3] = pn64 >> 16; | ||
759 | mic_hdr->ccmp_pn[2] = pn64 >> 24; | ||
760 | mic_hdr->ccmp_pn[1] = pn64 >> 32; | ||
761 | mic_hdr->ccmp_pn[0] = pn64 >> 40; | ||
758 | 762 | ||
759 | if (ieee80211_has_a4(hdr->frame_control)) | 763 | if (ieee80211_has_a4(hdr->frame_control)) |
760 | mic_hdr->hlen = cpu_to_be16(28); | 764 | mic_hdr->hlen = cpu_to_be16(28); |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 15879b49baad..66155d3ad7e6 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -4464,23 +4464,6 @@ void ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf, | |||
4464 | u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key_conf *keyconf, u64 pn); | 4464 | u8 *ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key_conf *keyconf, u64 pn); |
4465 | 4465 | ||
4466 | /** | 4466 | /** |
4467 | * ieee80211_get_key_tx_seq - get key TX sequence counter | ||
4468 | * | ||
4469 | * @keyconf: the parameter passed with the set key | ||
4470 | * @seq: buffer to receive the sequence data | ||
4471 | * | ||
4472 | * This function allows a driver to retrieve the current TX IV/PN | ||
4473 | * for the given key. It must not be called if IV generation is | ||
4474 | * offloaded to the device. | ||
4475 | * | ||
4476 | * Note that this function may only be called when no TX processing | ||
4477 | * can be done concurrently, for example when queues are stopped | ||
4478 | * and the stop has been synchronized. | ||
4479 | */ | ||
4480 | void ieee80211_get_key_tx_seq(struct ieee80211_key_conf *keyconf, | ||
4481 | struct ieee80211_key_seq *seq); | ||
4482 | |||
4483 | /** | ||
4484 | * ieee80211_get_key_rx_seq - get key RX sequence counter | 4467 | * ieee80211_get_key_rx_seq - get key RX sequence counter |
4485 | * | 4468 | * |
4486 | * @keyconf: the parameter passed with the set key | 4469 | * @keyconf: the parameter passed with the set key |
@@ -4500,23 +4483,6 @@ void ieee80211_get_key_rx_seq(struct ieee80211_key_conf *keyconf, | |||
4500 | int tid, struct ieee80211_key_seq *seq); | 4483 | int tid, struct ieee80211_key_seq *seq); |
4501 | 4484 | ||
4502 | /** | 4485 | /** |
4503 | * ieee80211_set_key_tx_seq - set key TX sequence counter | ||
4504 | * | ||
4505 | * @keyconf: the parameter passed with the set key | ||
4506 | * @seq: new sequence data | ||
4507 | * | ||
4508 | * This function allows a driver to set the current TX IV/PNs for the | ||
4509 | * given key. This is useful when resuming from WoWLAN sleep and the | ||
4510 | * device may have transmitted frames using the PTK, e.g. replies to | ||
4511 | * ARP requests. | ||
4512 | * | ||
4513 | * Note that this function may only be called when no TX processing | ||
4514 | * can be done concurrently. | ||
4515 | */ | ||
4516 | void ieee80211_set_key_tx_seq(struct ieee80211_key_conf *keyconf, | ||
4517 | struct ieee80211_key_seq *seq); | ||
4518 | |||
4519 | /** | ||
4520 | * ieee80211_set_key_rx_seq - set key RX sequence counter | 4486 | * ieee80211_set_key_rx_seq - set key RX sequence counter |
4521 | * | 4487 | * |
4522 | * @keyconf: the parameter passed with the set key | 4488 | * @keyconf: the parameter passed with the set key |
diff --git a/net/mac80211/key.c b/net/mac80211/key.c index f9c4cb9c6e06..3df7b0392d30 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c | |||
@@ -932,51 +932,6 @@ void ieee80211_gtk_rekey_notify(struct ieee80211_vif *vif, const u8 *bssid, | |||
932 | } | 932 | } |
933 | EXPORT_SYMBOL_GPL(ieee80211_gtk_rekey_notify); | 933 | EXPORT_SYMBOL_GPL(ieee80211_gtk_rekey_notify); |
934 | 934 | ||
935 | void ieee80211_get_key_tx_seq(struct ieee80211_key_conf *keyconf, | ||
936 | struct ieee80211_key_seq *seq) | ||
937 | { | ||
938 | struct ieee80211_key *key; | ||
939 | u64 pn64; | ||
940 | |||
941 | if (WARN_ON(!(keyconf->flags & IEEE80211_KEY_FLAG_GENERATE_IV))) | ||
942 | return; | ||
943 | |||
944 | key = container_of(keyconf, struct ieee80211_key, conf); | ||
945 | |||
946 | switch (key->conf.cipher) { | ||
947 | case WLAN_CIPHER_SUITE_TKIP: | ||
948 | pn64 = atomic64_read(&key->conf.tx_pn); | ||
949 | seq->tkip.iv32 = TKIP_PN_TO_IV32(pn64); | ||
950 | seq->tkip.iv16 = TKIP_PN_TO_IV16(pn64); | ||
951 | break; | ||
952 | case WLAN_CIPHER_SUITE_CCMP: | ||
953 | case WLAN_CIPHER_SUITE_CCMP_256: | ||
954 | case WLAN_CIPHER_SUITE_AES_CMAC: | ||
955 | case WLAN_CIPHER_SUITE_BIP_CMAC_256: | ||
956 | BUILD_BUG_ON(offsetof(typeof(*seq), ccmp) != | ||
957 | offsetof(typeof(*seq), aes_cmac)); | ||
958 | case WLAN_CIPHER_SUITE_BIP_GMAC_128: | ||
959 | case WLAN_CIPHER_SUITE_BIP_GMAC_256: | ||
960 | BUILD_BUG_ON(offsetof(typeof(*seq), ccmp) != | ||
961 | offsetof(typeof(*seq), aes_gmac)); | ||
962 | case WLAN_CIPHER_SUITE_GCMP: | ||
963 | case WLAN_CIPHER_SUITE_GCMP_256: | ||
964 | BUILD_BUG_ON(offsetof(typeof(*seq), ccmp) != | ||
965 | offsetof(typeof(*seq), gcmp)); | ||
966 | pn64 = atomic64_read(&key->conf.tx_pn); | ||
967 | seq->ccmp.pn[5] = pn64; | ||
968 | seq->ccmp.pn[4] = pn64 >> 8; | ||
969 | seq->ccmp.pn[3] = pn64 >> 16; | ||
970 | seq->ccmp.pn[2] = pn64 >> 24; | ||
971 | seq->ccmp.pn[1] = pn64 >> 32; | ||
972 | seq->ccmp.pn[0] = pn64 >> 40; | ||
973 | break; | ||
974 | default: | ||
975 | WARN_ON(1); | ||
976 | } | ||
977 | } | ||
978 | EXPORT_SYMBOL(ieee80211_get_key_tx_seq); | ||
979 | |||
980 | void ieee80211_get_key_rx_seq(struct ieee80211_key_conf *keyconf, | 935 | void ieee80211_get_key_rx_seq(struct ieee80211_key_conf *keyconf, |
981 | int tid, struct ieee80211_key_seq *seq) | 936 | int tid, struct ieee80211_key_seq *seq) |
982 | { | 937 | { |
@@ -1030,48 +985,6 @@ void ieee80211_get_key_rx_seq(struct ieee80211_key_conf *keyconf, | |||
1030 | } | 985 | } |
1031 | EXPORT_SYMBOL(ieee80211_get_key_rx_seq); | 986 | EXPORT_SYMBOL(ieee80211_get_key_rx_seq); |
1032 | 987 | ||
1033 | void ieee80211_set_key_tx_seq(struct ieee80211_key_conf *keyconf, | ||
1034 | struct ieee80211_key_seq *seq) | ||
1035 | { | ||
1036 | struct ieee80211_key *key; | ||
1037 | u64 pn64; | ||
1038 | |||
1039 | key = container_of(keyconf, struct ieee80211_key, conf); | ||
1040 | |||
1041 | switch (key->conf.cipher) { | ||
1042 | case WLAN_CIPHER_SUITE_TKIP: | ||
1043 | pn64 = (u64)seq->tkip.iv16 | ((u64)seq->tkip.iv32 << 16); | ||
1044 | atomic64_set(&key->conf.tx_pn, pn64); | ||
1045 | break; | ||
1046 | case WLAN_CIPHER_SUITE_CCMP: | ||
1047 | case WLAN_CIPHER_SUITE_CCMP_256: | ||
1048 | case WLAN_CIPHER_SUITE_AES_CMAC: | ||
1049 | case WLAN_CIPHER_SUITE_BIP_CMAC_256: | ||
1050 | BUILD_BUG_ON(offsetof(typeof(*seq), ccmp) != | ||
1051 | offsetof(typeof(*seq), aes_cmac)); | ||
1052 | case WLAN_CIPHER_SUITE_BIP_GMAC_128: | ||
1053 | case WLAN_CIPHER_SUITE_BIP_GMAC_256: | ||
1054 | BUILD_BUG_ON(offsetof(typeof(*seq), ccmp) != | ||
1055 | offsetof(typeof(*seq), aes_gmac)); | ||
1056 | case WLAN_CIPHER_SUITE_GCMP: | ||
1057 | case WLAN_CIPHER_SUITE_GCMP_256: | ||
1058 | BUILD_BUG_ON(offsetof(typeof(*seq), ccmp) != | ||
1059 | offsetof(typeof(*seq), gcmp)); | ||
1060 | pn64 = (u64)seq->ccmp.pn[5] | | ||
1061 | ((u64)seq->ccmp.pn[4] << 8) | | ||
1062 | ((u64)seq->ccmp.pn[3] << 16) | | ||
1063 | ((u64)seq->ccmp.pn[2] << 24) | | ||
1064 | ((u64)seq->ccmp.pn[1] << 32) | | ||
1065 | ((u64)seq->ccmp.pn[0] << 40); | ||
1066 | atomic64_set(&key->conf.tx_pn, pn64); | ||
1067 | break; | ||
1068 | default: | ||
1069 | WARN_ON(1); | ||
1070 | break; | ||
1071 | } | ||
1072 | } | ||
1073 | EXPORT_SYMBOL_GPL(ieee80211_set_key_tx_seq); | ||
1074 | |||
1075 | void ieee80211_set_key_rx_seq(struct ieee80211_key_conf *keyconf, | 988 | void ieee80211_set_key_rx_seq(struct ieee80211_key_conf *keyconf, |
1076 | int tid, struct ieee80211_key_seq *seq) | 989 | int tid, struct ieee80211_key_seq *seq) |
1077 | { | 990 | { |