diff options
-rw-r--r-- | drivers/net/wireless/ath/ath5k/mac80211-ops.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800lib.c | 16 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800lib.h | 5 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800pci.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800soc.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800usb.c | 2 | ||||
-rw-r--r-- | include/net/mac80211.h | 79 | ||||
-rw-r--r-- | net/mac80211/cfg.c | 91 | ||||
-rw-r--r-- | net/mac80211/driver-ops.h | 11 | ||||
-rw-r--r-- | net/mac80211/trace.h | 42 |
10 files changed, 143 insertions, 108 deletions
diff --git a/drivers/net/wireless/ath/ath5k/mac80211-ops.c b/drivers/net/wireless/ath/ath5k/mac80211-ops.c index 0210630972d6..dc44cfef7517 100644 --- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c +++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c | |||
@@ -798,7 +798,6 @@ const struct ieee80211_ops ath5k_hw_ops = { | |||
798 | .sw_scan_start = ath5k_sw_scan_start, | 798 | .sw_scan_start = ath5k_sw_scan_start, |
799 | .sw_scan_complete = ath5k_sw_scan_complete, | 799 | .sw_scan_complete = ath5k_sw_scan_complete, |
800 | .get_stats = ath5k_get_stats, | 800 | .get_stats = ath5k_get_stats, |
801 | /* .get_tkip_seq = not implemented */ | ||
802 | /* .set_frag_threshold = not implemented */ | 801 | /* .set_frag_threshold = not implemented */ |
803 | /* .set_rts_threshold = not implemented */ | 802 | /* .set_rts_threshold = not implemented */ |
804 | /* .sta_add = not implemented */ | 803 | /* .sta_add = not implemented */ |
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index 09135192c516..dfeca8355b22 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
@@ -7817,21 +7817,25 @@ EXPORT_SYMBOL_GPL(rt2800_probe_hw); | |||
7817 | /* | 7817 | /* |
7818 | * IEEE80211 stack callback functions. | 7818 | * IEEE80211 stack callback functions. |
7819 | */ | 7819 | */ |
7820 | void rt2800_get_tkip_seq(struct ieee80211_hw *hw, u8 hw_key_idx, u32 *iv32, | 7820 | void rt2800_get_key_seq(struct ieee80211_hw *hw, |
7821 | u16 *iv16) | 7821 | struct ieee80211_key_conf *key, |
7822 | struct ieee80211_key_seq *seq) | ||
7822 | { | 7823 | { |
7823 | struct rt2x00_dev *rt2x00dev = hw->priv; | 7824 | struct rt2x00_dev *rt2x00dev = hw->priv; |
7824 | struct mac_iveiv_entry iveiv_entry; | 7825 | struct mac_iveiv_entry iveiv_entry; |
7825 | u32 offset; | 7826 | u32 offset; |
7826 | 7827 | ||
7827 | offset = MAC_IVEIV_ENTRY(hw_key_idx); | 7828 | if (key->cipher != WLAN_CIPHER_SUITE_TKIP) |
7829 | return; | ||
7830 | |||
7831 | offset = MAC_IVEIV_ENTRY(key->hw_key_idx); | ||
7828 | rt2800_register_multiread(rt2x00dev, offset, | 7832 | rt2800_register_multiread(rt2x00dev, offset, |
7829 | &iveiv_entry, sizeof(iveiv_entry)); | 7833 | &iveiv_entry, sizeof(iveiv_entry)); |
7830 | 7834 | ||
7831 | memcpy(iv16, &iveiv_entry.iv[0], sizeof(*iv16)); | 7835 | memcpy(&seq->tkip.iv16, &iveiv_entry.iv[0], 2); |
7832 | memcpy(iv32, &iveiv_entry.iv[4], sizeof(*iv32)); | 7836 | memcpy(&seq->tkip.iv32, &iveiv_entry.iv[4], 4); |
7833 | } | 7837 | } |
7834 | EXPORT_SYMBOL_GPL(rt2800_get_tkip_seq); | 7838 | EXPORT_SYMBOL_GPL(rt2800_get_key_seq); |
7835 | 7839 | ||
7836 | int rt2800_set_rts_threshold(struct ieee80211_hw *hw, u32 value) | 7840 | int rt2800_set_rts_threshold(struct ieee80211_hw *hw, u32 value) |
7837 | { | 7841 | { |
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.h b/drivers/net/wireless/rt2x00/rt2800lib.h index 3019db637a4b..1609b8a7f7eb 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.h +++ b/drivers/net/wireless/rt2x00/rt2800lib.h | |||
@@ -209,8 +209,9 @@ int rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev); | |||
209 | 209 | ||
210 | int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev); | 210 | int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev); |
211 | 211 | ||
212 | void rt2800_get_tkip_seq(struct ieee80211_hw *hw, u8 hw_key_idx, u32 *iv32, | 212 | void rt2800_get_key_seq(struct ieee80211_hw *hw, |
213 | u16 *iv16); | 213 | struct ieee80211_key_conf *key, |
214 | struct ieee80211_key_seq *seq); | ||
214 | int rt2800_set_rts_threshold(struct ieee80211_hw *hw, u32 value); | 215 | int rt2800_set_rts_threshold(struct ieee80211_hw *hw, u32 value); |
215 | int rt2800_conf_tx(struct ieee80211_hw *hw, | 216 | int rt2800_conf_tx(struct ieee80211_hw *hw, |
216 | struct ieee80211_vif *vif, u16 queue_idx, | 217 | struct ieee80211_vif *vif, u16 queue_idx, |
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c index cc1b3cc73c5a..0af22573a2eb 100644 --- a/drivers/net/wireless/rt2x00/rt2800pci.c +++ b/drivers/net/wireless/rt2x00/rt2800pci.c | |||
@@ -309,7 +309,7 @@ static const struct ieee80211_ops rt2800pci_mac80211_ops = { | |||
309 | .sw_scan_start = rt2x00mac_sw_scan_start, | 309 | .sw_scan_start = rt2x00mac_sw_scan_start, |
310 | .sw_scan_complete = rt2x00mac_sw_scan_complete, | 310 | .sw_scan_complete = rt2x00mac_sw_scan_complete, |
311 | .get_stats = rt2x00mac_get_stats, | 311 | .get_stats = rt2x00mac_get_stats, |
312 | .get_tkip_seq = rt2800_get_tkip_seq, | 312 | .get_key_seq = rt2800_get_key_seq, |
313 | .set_rts_threshold = rt2800_set_rts_threshold, | 313 | .set_rts_threshold = rt2800_set_rts_threshold, |
314 | .sta_add = rt2x00mac_sta_add, | 314 | .sta_add = rt2x00mac_sta_add, |
315 | .sta_remove = rt2x00mac_sta_remove, | 315 | .sta_remove = rt2x00mac_sta_remove, |
diff --git a/drivers/net/wireless/rt2x00/rt2800soc.c b/drivers/net/wireless/rt2x00/rt2800soc.c index aaa7aa4cad9d..a985a5a7945e 100644 --- a/drivers/net/wireless/rt2x00/rt2800soc.c +++ b/drivers/net/wireless/rt2x00/rt2800soc.c | |||
@@ -148,7 +148,7 @@ static const struct ieee80211_ops rt2800soc_mac80211_ops = { | |||
148 | .sw_scan_start = rt2x00mac_sw_scan_start, | 148 | .sw_scan_start = rt2x00mac_sw_scan_start, |
149 | .sw_scan_complete = rt2x00mac_sw_scan_complete, | 149 | .sw_scan_complete = rt2x00mac_sw_scan_complete, |
150 | .get_stats = rt2x00mac_get_stats, | 150 | .get_stats = rt2x00mac_get_stats, |
151 | .get_tkip_seq = rt2800_get_tkip_seq, | 151 | .get_key_seq = rt2800_get_key_seq, |
152 | .set_rts_threshold = rt2800_set_rts_threshold, | 152 | .set_rts_threshold = rt2800_set_rts_threshold, |
153 | .sta_add = rt2x00mac_sta_add, | 153 | .sta_add = rt2x00mac_sta_add, |
154 | .sta_remove = rt2x00mac_sta_remove, | 154 | .sta_remove = rt2x00mac_sta_remove, |
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index 6ec2466b52b6..5932306084fd 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | |||
@@ -835,7 +835,7 @@ static const struct ieee80211_ops rt2800usb_mac80211_ops = { | |||
835 | .sw_scan_start = rt2x00mac_sw_scan_start, | 835 | .sw_scan_start = rt2x00mac_sw_scan_start, |
836 | .sw_scan_complete = rt2x00mac_sw_scan_complete, | 836 | .sw_scan_complete = rt2x00mac_sw_scan_complete, |
837 | .get_stats = rt2x00mac_get_stats, | 837 | .get_stats = rt2x00mac_get_stats, |
838 | .get_tkip_seq = rt2800_get_tkip_seq, | 838 | .get_key_seq = rt2800_get_key_seq, |
839 | .set_rts_threshold = rt2800_set_rts_threshold, | 839 | .set_rts_threshold = rt2800_set_rts_threshold, |
840 | .sta_add = rt2x00mac_sta_add, | 840 | .sta_add = rt2x00mac_sta_add, |
841 | .sta_remove = rt2x00mac_sta_remove, | 841 | .sta_remove = rt2x00mac_sta_remove, |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 8a3a7d7cda26..47b39c26fc05 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -1502,6 +1502,40 @@ struct ieee80211_key_conf { | |||
1502 | }; | 1502 | }; |
1503 | 1503 | ||
1504 | /** | 1504 | /** |
1505 | * struct ieee80211_key_seq - key sequence counter | ||
1506 | * | ||
1507 | * @tkip: TKIP data, containing IV32 and IV16 in host byte order | ||
1508 | * @ccmp: PN data, most significant byte first (big endian, | ||
1509 | * reverse order than in packet) | ||
1510 | * @aes_cmac: PN data, most significant byte first (big endian, | ||
1511 | * reverse order than in packet) | ||
1512 | * @aes_gmac: PN data, most significant byte first (big endian, | ||
1513 | * reverse order than in packet) | ||
1514 | * @gcmp: PN data, most significant byte first (big endian, | ||
1515 | * reverse order than in packet) | ||
1516 | */ | ||
1517 | struct ieee80211_key_seq { | ||
1518 | union { | ||
1519 | struct { | ||
1520 | u32 iv32; | ||
1521 | u16 iv16; | ||
1522 | } tkip; | ||
1523 | struct { | ||
1524 | u8 pn[6]; | ||
1525 | } ccmp; | ||
1526 | struct { | ||
1527 | u8 pn[6]; | ||
1528 | } aes_cmac; | ||
1529 | struct { | ||
1530 | u8 pn[6]; | ||
1531 | } aes_gmac; | ||
1532 | struct { | ||
1533 | u8 pn[6]; | ||
1534 | } gcmp; | ||
1535 | }; | ||
1536 | }; | ||
1537 | |||
1538 | /** | ||
1505 | * struct ieee80211_cipher_scheme - cipher scheme | 1539 | * struct ieee80211_cipher_scheme - cipher scheme |
1506 | * | 1540 | * |
1507 | * This structure contains a cipher scheme information defining | 1541 | * This structure contains a cipher scheme information defining |
@@ -2836,9 +2870,9 @@ enum ieee80211_reconfig_type { | |||
2836 | * Returns zero if statistics are available. | 2870 | * Returns zero if statistics are available. |
2837 | * The callback can sleep. | 2871 | * The callback can sleep. |
2838 | * | 2872 | * |
2839 | * @get_tkip_seq: If your device implements TKIP encryption in hardware this | 2873 | * @get_key_seq: If your device implements encryption in hardware and does |
2840 | * callback should be provided to read the TKIP transmit IVs (both IV32 | 2874 | * IV/PN assignment then this callback should be provided to read the |
2841 | * and IV16) for the given key from hardware. | 2875 | * IV/PN for the given key from hardware. |
2842 | * The callback must be atomic. | 2876 | * The callback must be atomic. |
2843 | * | 2877 | * |
2844 | * @set_frag_threshold: Configuration of fragmentation threshold. Assign this | 2878 | * @set_frag_threshold: Configuration of fragmentation threshold. Assign this |
@@ -3237,8 +3271,9 @@ struct ieee80211_ops { | |||
3237 | struct ieee80211_vif *vif); | 3271 | struct ieee80211_vif *vif); |
3238 | int (*get_stats)(struct ieee80211_hw *hw, | 3272 | int (*get_stats)(struct ieee80211_hw *hw, |
3239 | struct ieee80211_low_level_stats *stats); | 3273 | struct ieee80211_low_level_stats *stats); |
3240 | void (*get_tkip_seq)(struct ieee80211_hw *hw, u8 hw_key_idx, | 3274 | void (*get_key_seq)(struct ieee80211_hw *hw, |
3241 | u32 *iv32, u16 *iv16); | 3275 | struct ieee80211_key_conf *key, |
3276 | struct ieee80211_key_seq *seq); | ||
3242 | int (*set_frag_threshold)(struct ieee80211_hw *hw, u32 value); | 3277 | int (*set_frag_threshold)(struct ieee80211_hw *hw, u32 value); |
3243 | int (*set_rts_threshold)(struct ieee80211_hw *hw, u32 value); | 3278 | int (*set_rts_threshold)(struct ieee80211_hw *hw, u32 value); |
3244 | int (*sta_add)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | 3279 | int (*sta_add)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
@@ -4273,40 +4308,6 @@ void ieee80211_aes_cmac_calculate_k1_k2(struct ieee80211_key_conf *keyconf, | |||
4273 | u8 *k1, u8 *k2); | 4308 | u8 *k1, u8 *k2); |
4274 | 4309 | ||
4275 | /** | 4310 | /** |
4276 | * struct ieee80211_key_seq - key sequence counter | ||
4277 | * | ||
4278 | * @tkip: TKIP data, containing IV32 and IV16 in host byte order | ||
4279 | * @ccmp: PN data, most significant byte first (big endian, | ||
4280 | * reverse order than in packet) | ||
4281 | * @aes_cmac: PN data, most significant byte first (big endian, | ||
4282 | * reverse order than in packet) | ||
4283 | * @aes_gmac: PN data, most significant byte first (big endian, | ||
4284 | * reverse order than in packet) | ||
4285 | * @gcmp: PN data, most significant byte first (big endian, | ||
4286 | * reverse order than in packet) | ||
4287 | */ | ||
4288 | struct ieee80211_key_seq { | ||
4289 | union { | ||
4290 | struct { | ||
4291 | u32 iv32; | ||
4292 | u16 iv16; | ||
4293 | } tkip; | ||
4294 | struct { | ||
4295 | u8 pn[6]; | ||
4296 | } ccmp; | ||
4297 | struct { | ||
4298 | u8 pn[6]; | ||
4299 | } aes_cmac; | ||
4300 | struct { | ||
4301 | u8 pn[6]; | ||
4302 | } aes_gmac; | ||
4303 | struct { | ||
4304 | u8 pn[6]; | ||
4305 | } gcmp; | ||
4306 | }; | ||
4307 | }; | ||
4308 | |||
4309 | /** | ||
4310 | * ieee80211_get_key_tx_seq - get key TX sequence counter | 4311 | * ieee80211_get_key_tx_seq - get key TX sequence counter |
4311 | * | 4312 | * |
4312 | * @keyconf: the parameter passed with the set key | 4313 | * @keyconf: the parameter passed with the set key |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 72a0178af737..dd7014b09396 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -312,6 +312,7 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev, | |||
312 | u32 iv32; | 312 | u32 iv32; |
313 | u16 iv16; | 313 | u16 iv16; |
314 | int err = -ENOENT; | 314 | int err = -ENOENT; |
315 | struct ieee80211_key_seq kseq = {}; | ||
315 | 316 | ||
316 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 317 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
317 | 318 | ||
@@ -342,10 +343,12 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev, | |||
342 | iv32 = key->u.tkip.tx.iv32; | 343 | iv32 = key->u.tkip.tx.iv32; |
343 | iv16 = key->u.tkip.tx.iv16; | 344 | iv16 = key->u.tkip.tx.iv16; |
344 | 345 | ||
345 | if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) | 346 | if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE && |
346 | drv_get_tkip_seq(sdata->local, | 347 | !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { |
347 | key->conf.hw_key_idx, | 348 | drv_get_key_seq(sdata->local, key, &kseq); |
348 | &iv32, &iv16); | 349 | iv32 = kseq.tkip.iv32; |
350 | iv16 = kseq.tkip.iv16; | ||
351 | } | ||
349 | 352 | ||
350 | seq[0] = iv16 & 0xff; | 353 | seq[0] = iv16 & 0xff; |
351 | seq[1] = (iv16 >> 8) & 0xff; | 354 | seq[1] = (iv16 >> 8) & 0xff; |
@@ -358,49 +361,73 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev, | |||
358 | break; | 361 | break; |
359 | case WLAN_CIPHER_SUITE_CCMP: | 362 | case WLAN_CIPHER_SUITE_CCMP: |
360 | case WLAN_CIPHER_SUITE_CCMP_256: | 363 | case WLAN_CIPHER_SUITE_CCMP_256: |
361 | pn64 = atomic64_read(&key->u.ccmp.tx_pn); | 364 | if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE && |
362 | seq[0] = pn64; | 365 | !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { |
363 | seq[1] = pn64 >> 8; | 366 | drv_get_key_seq(sdata->local, key, &kseq); |
364 | seq[2] = pn64 >> 16; | 367 | memcpy(seq, kseq.ccmp.pn, 6); |
365 | seq[3] = pn64 >> 24; | 368 | } else { |
366 | seq[4] = pn64 >> 32; | 369 | pn64 = atomic64_read(&key->u.ccmp.tx_pn); |
367 | seq[5] = pn64 >> 40; | 370 | seq[0] = pn64; |
371 | seq[1] = pn64 >> 8; | ||
372 | seq[2] = pn64 >> 16; | ||
373 | seq[3] = pn64 >> 24; | ||
374 | seq[4] = pn64 >> 32; | ||
375 | seq[5] = pn64 >> 40; | ||
376 | } | ||
368 | params.seq = seq; | 377 | params.seq = seq; |
369 | params.seq_len = 6; | 378 | params.seq_len = 6; |
370 | break; | 379 | break; |
371 | case WLAN_CIPHER_SUITE_AES_CMAC: | 380 | case WLAN_CIPHER_SUITE_AES_CMAC: |
372 | case WLAN_CIPHER_SUITE_BIP_CMAC_256: | 381 | case WLAN_CIPHER_SUITE_BIP_CMAC_256: |
373 | pn64 = atomic64_read(&key->u.aes_cmac.tx_pn); | 382 | if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE && |
374 | seq[0] = pn64; | 383 | !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { |
375 | seq[1] = pn64 >> 8; | 384 | drv_get_key_seq(sdata->local, key, &kseq); |
376 | seq[2] = pn64 >> 16; | 385 | memcpy(seq, kseq.aes_cmac.pn, 6); |
377 | seq[3] = pn64 >> 24; | 386 | } else { |
378 | seq[4] = pn64 >> 32; | 387 | pn64 = atomic64_read(&key->u.aes_cmac.tx_pn); |
379 | seq[5] = pn64 >> 40; | 388 | seq[0] = pn64; |
389 | seq[1] = pn64 >> 8; | ||
390 | seq[2] = pn64 >> 16; | ||
391 | seq[3] = pn64 >> 24; | ||
392 | seq[4] = pn64 >> 32; | ||
393 | seq[5] = pn64 >> 40; | ||
394 | } | ||
380 | params.seq = seq; | 395 | params.seq = seq; |
381 | params.seq_len = 6; | 396 | params.seq_len = 6; |
382 | break; | 397 | break; |
383 | case WLAN_CIPHER_SUITE_BIP_GMAC_128: | 398 | case WLAN_CIPHER_SUITE_BIP_GMAC_128: |
384 | case WLAN_CIPHER_SUITE_BIP_GMAC_256: | 399 | case WLAN_CIPHER_SUITE_BIP_GMAC_256: |
385 | pn64 = atomic64_read(&key->u.aes_gmac.tx_pn); | 400 | if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE && |
386 | seq[0] = pn64; | 401 | !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { |
387 | seq[1] = pn64 >> 8; | 402 | drv_get_key_seq(sdata->local, key, &kseq); |
388 | seq[2] = pn64 >> 16; | 403 | memcpy(seq, kseq.aes_gmac.pn, 6); |
389 | seq[3] = pn64 >> 24; | 404 | } else { |
390 | seq[4] = pn64 >> 32; | 405 | pn64 = atomic64_read(&key->u.aes_gmac.tx_pn); |
391 | seq[5] = pn64 >> 40; | 406 | seq[0] = pn64; |
407 | seq[1] = pn64 >> 8; | ||
408 | seq[2] = pn64 >> 16; | ||
409 | seq[3] = pn64 >> 24; | ||
410 | seq[4] = pn64 >> 32; | ||
411 | seq[5] = pn64 >> 40; | ||
412 | } | ||
392 | params.seq = seq; | 413 | params.seq = seq; |
393 | params.seq_len = 6; | 414 | params.seq_len = 6; |
394 | break; | 415 | break; |
395 | case WLAN_CIPHER_SUITE_GCMP: | 416 | case WLAN_CIPHER_SUITE_GCMP: |
396 | case WLAN_CIPHER_SUITE_GCMP_256: | 417 | case WLAN_CIPHER_SUITE_GCMP_256: |
397 | pn64 = atomic64_read(&key->u.gcmp.tx_pn); | 418 | if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE && |
398 | seq[0] = pn64; | 419 | !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { |
399 | seq[1] = pn64 >> 8; | 420 | drv_get_key_seq(sdata->local, key, &kseq); |
400 | seq[2] = pn64 >> 16; | 421 | memcpy(seq, kseq.gcmp.pn, 6); |
401 | seq[3] = pn64 >> 24; | 422 | } else { |
402 | seq[4] = pn64 >> 32; | 423 | pn64 = atomic64_read(&key->u.gcmp.tx_pn); |
403 | seq[5] = pn64 >> 40; | 424 | seq[0] = pn64; |
425 | seq[1] = pn64 >> 8; | ||
426 | seq[2] = pn64 >> 16; | ||
427 | seq[3] = pn64 >> 24; | ||
428 | seq[4] = pn64 >> 32; | ||
429 | seq[5] = pn64 >> 40; | ||
430 | } | ||
404 | params.seq = seq; | 431 | params.seq = seq; |
405 | params.seq_len = 6; | 432 | params.seq_len = 6; |
406 | break; | 433 | break; |
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h index 26e1ca8a474a..c01e681b90fb 100644 --- a/net/mac80211/driver-ops.h +++ b/net/mac80211/driver-ops.h | |||
@@ -417,12 +417,13 @@ static inline int drv_get_stats(struct ieee80211_local *local, | |||
417 | return ret; | 417 | return ret; |
418 | } | 418 | } |
419 | 419 | ||
420 | static inline void drv_get_tkip_seq(struct ieee80211_local *local, | 420 | static inline void drv_get_key_seq(struct ieee80211_local *local, |
421 | u8 hw_key_idx, u32 *iv32, u16 *iv16) | 421 | struct ieee80211_key *key, |
422 | struct ieee80211_key_seq *seq) | ||
422 | { | 423 | { |
423 | if (local->ops->get_tkip_seq) | 424 | if (local->ops->get_key_seq) |
424 | local->ops->get_tkip_seq(&local->hw, hw_key_idx, iv32, iv16); | 425 | local->ops->get_key_seq(&local->hw, &key->conf, seq); |
425 | trace_drv_get_tkip_seq(local, hw_key_idx, iv32, iv16); | 426 | trace_drv_get_key_seq(local, &key->conf); |
426 | } | 427 | } |
427 | 428 | ||
428 | static inline int drv_set_frag_threshold(struct ieee80211_local *local, | 429 | static inline int drv_set_frag_threshold(struct ieee80211_local *local, |
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h index 4c2e7690226a..6f14591d8ca9 100644 --- a/net/mac80211/trace.h +++ b/net/mac80211/trace.h | |||
@@ -69,6 +69,17 @@ | |||
69 | #define CHANCTX_PR_ARG CHANDEF_PR_ARG, MIN_CHANDEF_PR_ARG, \ | 69 | #define CHANCTX_PR_ARG CHANDEF_PR_ARG, MIN_CHANDEF_PR_ARG, \ |
70 | __entry->rx_chains_static, __entry->rx_chains_dynamic | 70 | __entry->rx_chains_static, __entry->rx_chains_dynamic |
71 | 71 | ||
72 | #define KEY_ENTRY __field(u32, cipher) \ | ||
73 | __field(u8, hw_key_idx) \ | ||
74 | __field(u8, flags) \ | ||
75 | __field(s8, keyidx) | ||
76 | #define KEY_ASSIGN(k) __entry->cipher = (k)->cipher; \ | ||
77 | __entry->flags = (k)->flags; \ | ||
78 | __entry->keyidx = (k)->keyidx; \ | ||
79 | __entry->hw_key_idx = (k)->hw_key_idx; | ||
80 | #define KEY_PR_FMT " cipher:0x%x, flags=%#x, keyidx=%d, hw_key_idx=%d" | ||
81 | #define KEY_PR_ARG __entry->cipher, __entry->flags, __entry->keyidx, __entry->hw_key_idx | ||
82 | |||
72 | 83 | ||
73 | 84 | ||
74 | /* | 85 | /* |
@@ -522,25 +533,19 @@ TRACE_EVENT(drv_set_key, | |||
522 | LOCAL_ENTRY | 533 | LOCAL_ENTRY |
523 | VIF_ENTRY | 534 | VIF_ENTRY |
524 | STA_ENTRY | 535 | STA_ENTRY |
525 | __field(u32, cipher) | 536 | KEY_ENTRY |
526 | __field(u8, hw_key_idx) | ||
527 | __field(u8, flags) | ||
528 | __field(s8, keyidx) | ||
529 | ), | 537 | ), |
530 | 538 | ||
531 | TP_fast_assign( | 539 | TP_fast_assign( |
532 | LOCAL_ASSIGN; | 540 | LOCAL_ASSIGN; |
533 | VIF_ASSIGN; | 541 | VIF_ASSIGN; |
534 | STA_ASSIGN; | 542 | STA_ASSIGN; |
535 | __entry->cipher = key->cipher; | 543 | KEY_ASSIGN(key); |
536 | __entry->flags = key->flags; | ||
537 | __entry->keyidx = key->keyidx; | ||
538 | __entry->hw_key_idx = key->hw_key_idx; | ||
539 | ), | 544 | ), |
540 | 545 | ||
541 | TP_printk( | 546 | TP_printk( |
542 | LOCAL_PR_FMT VIF_PR_FMT STA_PR_FMT, | 547 | LOCAL_PR_FMT VIF_PR_FMT STA_PR_FMT KEY_PR_FMT, |
543 | LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG | 548 | LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, KEY_PR_ARG |
544 | ) | 549 | ) |
545 | ); | 550 | ); |
546 | 551 | ||
@@ -656,28 +661,25 @@ TRACE_EVENT(drv_get_stats, | |||
656 | ) | 661 | ) |
657 | ); | 662 | ); |
658 | 663 | ||
659 | TRACE_EVENT(drv_get_tkip_seq, | 664 | TRACE_EVENT(drv_get_key_seq, |
660 | TP_PROTO(struct ieee80211_local *local, | 665 | TP_PROTO(struct ieee80211_local *local, |
661 | u8 hw_key_idx, u32 *iv32, u16 *iv16), | 666 | struct ieee80211_key_conf *key), |
662 | 667 | ||
663 | TP_ARGS(local, hw_key_idx, iv32, iv16), | 668 | TP_ARGS(local, key), |
664 | 669 | ||
665 | TP_STRUCT__entry( | 670 | TP_STRUCT__entry( |
666 | LOCAL_ENTRY | 671 | LOCAL_ENTRY |
667 | __field(u8, hw_key_idx) | 672 | KEY_ENTRY |
668 | __field(u32, iv32) | ||
669 | __field(u16, iv16) | ||
670 | ), | 673 | ), |
671 | 674 | ||
672 | TP_fast_assign( | 675 | TP_fast_assign( |
673 | LOCAL_ASSIGN; | 676 | LOCAL_ASSIGN; |
674 | __entry->hw_key_idx = hw_key_idx; | 677 | KEY_ASSIGN(key); |
675 | __entry->iv32 = *iv32; | ||
676 | __entry->iv16 = *iv16; | ||
677 | ), | 678 | ), |
678 | 679 | ||
679 | TP_printk( | 680 | TP_printk( |
680 | LOCAL_PR_FMT, LOCAL_PR_ARG | 681 | LOCAL_PR_FMT KEY_PR_FMT, |
682 | LOCAL_PR_ARG, KEY_PR_ARG | ||
681 | ) | 683 | ) |
682 | ); | 684 | ); |
683 | 685 | ||