linux/net/mac80211/key.c
<<
>>
Prefs
   1/*
   2 * Copyright 2002-2005, Instant802 Networks, Inc.
   3 * Copyright 2005-2006, Devicescape Software, Inc.
   4 * Copyright 2006-2007  Jiri Benc <jbenc@suse.cz>
   5 * Copyright 2007-2008  Johannes Berg <johannes@sipsolutions.net>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 */
  11
  12#include <linux/if_ether.h>
  13#include <linux/etherdevice.h>
  14#include <linux/list.h>
  15#include <linux/rcupdate.h>
  16#include <linux/rtnetlink.h>
  17#include <linux/slab.h>
  18#include <linux/export.h>
  19#include <net/mac80211.h>
  20#include <asm/unaligned.h>
  21#include "ieee80211_i.h"
  22#include "driver-ops.h"
  23#include "debugfs_key.h"
  24#include "aes_ccm.h"
  25#include "aes_cmac.h"
  26
  27
  28/**
  29 * DOC: Key handling basics
  30 *
  31 * Key handling in mac80211 is done based on per-interface (sub_if_data)
  32 * keys and per-station keys. Since each station belongs to an interface,
  33 * each station key also belongs to that interface.
  34 *
  35 * Hardware acceleration is done on a best-effort basis for algorithms
  36 * that are implemented in software,  for each key the hardware is asked
  37 * to enable that key for offloading but if it cannot do that the key is
  38 * simply kept for software encryption (unless it is for an algorithm
  39 * that isn't implemented in software).
  40 * There is currently no way of knowing whether a key is handled in SW
  41 * or HW except by looking into debugfs.
  42 *
  43 * All key management is internally protected by a mutex. Within all
  44 * other parts of mac80211, key references are, just as STA structure
  45 * references, protected by RCU. Note, however, that some things are
  46 * unprotected, namely the key->sta dereferences within the hardware
  47 * acceleration functions. This means that sta_info_destroy() must
  48 * remove the key which waits for an RCU grace period.
  49 */
  50
  51static const u8 bcast_addr[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
  52
  53static void assert_key_lock(struct ieee80211_local *local)
  54{
  55        lockdep_assert_held(&local->key_mtx);
  56}
  57
  58static void increment_tailroom_need_count(struct ieee80211_sub_if_data *sdata)
  59{
  60        /*
  61         * When this count is zero, SKB resizing for allocating tailroom
  62         * for IV or MMIC is skipped. But, this check has created two race
  63         * cases in xmit path while transiting from zero count to one:
  64         *
  65         * 1. SKB resize was skipped because no key was added but just before
  66         * the xmit key is added and SW encryption kicks off.
  67         *
  68         * 2. SKB resize was skipped because all the keys were hw planted but
  69         * just before xmit one of the key is deleted and SW encryption kicks
  70         * off.
  71         *
  72         * In both the above case SW encryption will find not enough space for
  73         * tailroom and exits with WARN_ON. (See WARN_ONs at wpa.c)
  74         *
  75         * Solution has been explained at
  76         * http://mid.gmane.org/1308590980.4322.19.camel@jlt3.sipsolutions.net
  77         */
  78
  79        if (!sdata->crypto_tx_tailroom_needed_cnt++) {
  80                /*
  81                 * Flush all XMIT packets currently using HW encryption or no
  82                 * encryption at all if the count transition is from 0 -> 1.
  83                 */
  84                synchronize_net();
  85        }
  86}
  87
  88static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
  89{
  90        struct ieee80211_sub_if_data *sdata;
  91        struct sta_info *sta;
  92        int ret;
  93
  94        might_sleep();
  95
  96        if (!key->local->ops->set_key)
  97                goto out_unsupported;
  98
  99        assert_key_lock(key->local);
 100
 101        sta = key->sta;
 102
 103        /*
 104         * If this is a per-STA GTK, check if it
 105         * is supported; if not, return.
 106         */
 107        if (sta && !(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE) &&
 108            !(key->local->hw.flags & IEEE80211_HW_SUPPORTS_PER_STA_GTK))
 109                goto out_unsupported;
 110
 111        if (sta && !sta->uploaded)
 112                goto out_unsupported;
 113
 114        sdata = key->sdata;
 115        if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
 116                /*
 117                 * The driver doesn't know anything about VLAN interfaces.
 118                 * Hence, don't send GTKs for VLAN interfaces to the driver.
 119                 */
 120                if (!(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE))
 121                        goto out_unsupported;
 122        }
 123
 124        ret = drv_set_key(key->local, SET_KEY, sdata,
 125                          sta ? &sta->sta : NULL, &key->conf);
 126
 127        if (!ret) {
 128                key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE;
 129
 130                if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) ||
 131                      (key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV) ||
 132                      (key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)))
 133                        sdata->crypto_tx_tailroom_needed_cnt--;
 134
 135                WARN_ON((key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) &&
 136                        (key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV));
 137
 138                return 0;
 139        }
 140
 141        if (ret != -ENOSPC && ret != -EOPNOTSUPP)
 142                sdata_err(sdata,
 143                          "failed to set key (%d, %pM) to hardware (%d)\n",
 144                          key->conf.keyidx,
 145                          sta ? sta->sta.addr : bcast_addr, ret);
 146
 147 out_unsupported:
 148        switch (key->conf.cipher) {
 149        case WLAN_CIPHER_SUITE_WEP40:
 150        case WLAN_CIPHER_SUITE_WEP104:
 151        case WLAN_CIPHER_SUITE_TKIP:
 152        case WLAN_CIPHER_SUITE_CCMP:
 153        case WLAN_CIPHER_SUITE_AES_CMAC:
 154                /* all of these we can do in software */
 155                return 0;
 156        default:
 157                return -EINVAL;
 158        }
 159}
 160
 161static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key)
 162{
 163        struct ieee80211_sub_if_data *sdata;
 164        struct sta_info *sta;
 165        int ret;
 166
 167        might_sleep();
 168
 169        if (!key || !key->local->ops->set_key)
 170                return;
 171
 172        assert_key_lock(key->local);
 173
 174        if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
 175                return;
 176
 177        sta = key->sta;
 178        sdata = key->sdata;
 179
 180        if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) ||
 181              (key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV) ||
 182              (key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)))
 183                increment_tailroom_need_count(sdata);
 184
 185        ret = drv_set_key(key->local, DISABLE_KEY, sdata,
 186                          sta ? &sta->sta : NULL, &key->conf);
 187
 188        if (ret)
 189                sdata_err(sdata,
 190                          "failed to remove key (%d, %pM) from hardware (%d)\n",
 191                          key->conf.keyidx,
 192                          sta ? sta->sta.addr : bcast_addr, ret);
 193
 194        key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;
 195}
 196
 197static void __ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata,
 198                                        int idx, bool uni, bool multi)
 199{
 200        struct ieee80211_key *key = NULL;
 201
 202        assert_key_lock(sdata->local);
 203
 204        if (idx >= 0 && idx < NUM_DEFAULT_KEYS)
 205                key = key_mtx_dereference(sdata->local, sdata->keys[idx]);
 206
 207        if (uni) {
 208                rcu_assign_pointer(sdata->default_unicast_key, key);
 209                drv_set_default_unicast_key(sdata->local, sdata, idx);
 210        }
 211
 212        if (multi)
 213                rcu_assign_pointer(sdata->default_multicast_key, key);
 214
 215        ieee80211_debugfs_key_update_default(sdata);
 216}
 217
 218void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx,
 219                               bool uni, bool multi)
 220{
 221        mutex_lock(&sdata->local->key_mtx);
 222        __ieee80211_set_default_key(sdata, idx, uni, multi);
 223        mutex_unlock(&sdata->local->key_mtx);
 224}
 225
 226static void
 227__ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata, int idx)
 228{
 229        struct ieee80211_key *key = NULL;
 230
 231        assert_key_lock(sdata->local);
 232
 233        if (idx >= NUM_DEFAULT_KEYS &&
 234            idx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS)
 235                key = key_mtx_dereference(sdata->local, sdata->keys[idx]);
 236
 237        rcu_assign_pointer(sdata->default_mgmt_key, key);
 238
 239        ieee80211_debugfs_key_update_default(sdata);
 240}
 241
 242void ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata,
 243                                    int idx)
 244{
 245        mutex_lock(&sdata->local->key_mtx);
 246        __ieee80211_set_default_mgmt_key(sdata, idx);
 247        mutex_unlock(&sdata->local->key_mtx);
 248}
 249
 250
 251static void ieee80211_key_replace(struct ieee80211_sub_if_data *sdata,
 252                                  struct sta_info *sta,
 253                                  bool pairwise,
 254                                  struct ieee80211_key *old,
 255                                  struct ieee80211_key *new)
 256{
 257        int idx;
 258        bool defunikey, defmultikey, defmgmtkey;
 259
 260        if (new)
 261                list_add_tail(&new->list, &sdata->key_list);
 262
 263        if (sta && pairwise) {
 264                rcu_assign_pointer(sta->ptk, new);
 265        } else if (sta) {
 266                if (old)
 267                        idx = old->conf.keyidx;
 268                else
 269                        idx = new->conf.keyidx;
 270                rcu_assign_pointer(sta->gtk[idx], new);
 271        } else {
 272                WARN_ON(new && old && new->conf.keyidx != old->conf.keyidx);
 273
 274                if (old)
 275                        idx = old->conf.keyidx;
 276                else
 277                        idx = new->conf.keyidx;
 278
 279                defunikey = old &&
 280                        old == key_mtx_dereference(sdata->local,
 281                                                sdata->default_unicast_key);
 282                defmultikey = old &&
 283                        old == key_mtx_dereference(sdata->local,
 284                                                sdata->default_multicast_key);
 285                defmgmtkey = old &&
 286                        old == key_mtx_dereference(sdata->local,
 287                                                sdata->default_mgmt_key);
 288
 289                if (defunikey && !new)
 290                        __ieee80211_set_default_key(sdata, -1, true, false);
 291                if (defmultikey && !new)
 292                        __ieee80211_set_default_key(sdata, -1, false, true);
 293                if (defmgmtkey && !new)
 294                        __ieee80211_set_default_mgmt_key(sdata, -1);
 295
 296                rcu_assign_pointer(sdata->keys[idx], new);
 297                if (defunikey && new)
 298                        __ieee80211_set_default_key(sdata, new->conf.keyidx,
 299                                                    true, false);
 300                if (defmultikey && new)
 301                        __ieee80211_set_default_key(sdata, new->conf.keyidx,
 302                                                    false, true);
 303                if (defmgmtkey && new)
 304                        __ieee80211_set_default_mgmt_key(sdata,
 305                                                         new->conf.keyidx);
 306        }
 307
 308        if (old)
 309                list_del(&old->list);
 310}
 311
 312struct ieee80211_key *ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
 313                                          const u8 *key_data,
 314                                          size_t seq_len, const u8 *seq)
 315{
 316        struct ieee80211_key *key;
 317        int i, j, err;
 318
 319        BUG_ON(idx < 0 || idx >= NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS);
 320
 321        key = kzalloc(sizeof(struct ieee80211_key) + key_len, GFP_KERNEL);
 322        if (!key)
 323                return ERR_PTR(-ENOMEM);
 324
 325        /*
 326         * Default to software encryption; we'll later upload the
 327         * key to the hardware if possible.
 328         */
 329        key->conf.flags = 0;
 330        key->flags = 0;
 331
 332        key->conf.cipher = cipher;
 333        key->conf.keyidx = idx;
 334        key->conf.keylen = key_len;
 335        switch (cipher) {
 336        case WLAN_CIPHER_SUITE_WEP40:
 337        case WLAN_CIPHER_SUITE_WEP104:
 338                key->conf.iv_len = IEEE80211_WEP_IV_LEN;
 339                key->conf.icv_len = IEEE80211_WEP_ICV_LEN;
 340                break;
 341        case WLAN_CIPHER_SUITE_TKIP:
 342                key->conf.iv_len = IEEE80211_TKIP_IV_LEN;
 343                key->conf.icv_len = IEEE80211_TKIP_ICV_LEN;
 344                if (seq) {
 345                        for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
 346                                key->u.tkip.rx[i].iv32 =
 347                                        get_unaligned_le32(&seq[2]);
 348                                key->u.tkip.rx[i].iv16 =
 349                                        get_unaligned_le16(seq);
 350                        }
 351                }
 352                spin_lock_init(&key->u.tkip.txlock);
 353                break;
 354        case WLAN_CIPHER_SUITE_CCMP:
 355                key->conf.iv_len = IEEE80211_CCMP_HDR_LEN;
 356                key->conf.icv_len = IEEE80211_CCMP_MIC_LEN;
 357                if (seq) {
 358                        for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++)
 359                                for (j = 0; j < IEEE80211_CCMP_PN_LEN; j++)
 360                                        key->u.ccmp.rx_pn[i][j] =
 361                                                seq[IEEE80211_CCMP_PN_LEN - j - 1];
 362                }
 363                /*
 364                 * Initialize AES key state here as an optimization so that
 365                 * it does not need to be initialized for every packet.
 366                 */
 367                key->u.ccmp.tfm = ieee80211_aes_key_setup_encrypt(key_data);
 368                if (IS_ERR(key->u.ccmp.tfm)) {
 369                        err = PTR_ERR(key->u.ccmp.tfm);
 370                        kfree(key);
 371                        return ERR_PTR(err);
 372                }
 373                break;
 374        case WLAN_CIPHER_SUITE_AES_CMAC:
 375                key->conf.iv_len = 0;
 376                key->conf.icv_len = sizeof(struct ieee80211_mmie);
 377                if (seq)
 378                        for (j = 0; j < IEEE80211_CMAC_PN_LEN; j++)
 379                                key->u.aes_cmac.rx_pn[j] =
 380                                        seq[IEEE80211_CMAC_PN_LEN - j - 1];
 381                /*
 382                 * Initialize AES key state here as an optimization so that
 383                 * it does not need to be initialized for every packet.
 384                 */
 385                key->u.aes_cmac.tfm =
 386                        ieee80211_aes_cmac_key_setup(key_data);
 387                if (IS_ERR(key->u.aes_cmac.tfm)) {
 388                        err = PTR_ERR(key->u.aes_cmac.tfm);
 389                        kfree(key);
 390                        return ERR_PTR(err);
 391                }
 392                break;
 393        }
 394        memcpy(key->conf.key, key_data, key_len);
 395        INIT_LIST_HEAD(&key->list);
 396
 397        return key;
 398}
 399
 400static void ieee80211_key_free_common(struct ieee80211_key *key)
 401{
 402        if (key->conf.cipher == WLAN_CIPHER_SUITE_CCMP)
 403                ieee80211_aes_key_free(key->u.ccmp.tfm);
 404        if (key->conf.cipher == WLAN_CIPHER_SUITE_AES_CMAC)
 405                ieee80211_aes_cmac_key_free(key->u.aes_cmac.tfm);
 406        kfree(key);
 407}
 408
 409static void __ieee80211_key_destroy(struct ieee80211_key *key,
 410                                    bool delay_tailroom)
 411{
 412        if (key->local)
 413                ieee80211_key_disable_hw_accel(key);
 414
 415        if (key->local) {
 416                struct ieee80211_sub_if_data *sdata = key->sdata;
 417
 418                ieee80211_debugfs_key_remove(key);
 419
 420                if (delay_tailroom) {
 421                        /* see ieee80211_delayed_tailroom_dec */
 422                        sdata->crypto_tx_tailroom_pending_dec++;
 423                        schedule_delayed_work(&sdata->dec_tailroom_needed_wk,
 424                                              HZ/2);
 425                } else {
 426                        sdata->crypto_tx_tailroom_needed_cnt--;
 427                }
 428        }
 429
 430        ieee80211_key_free_common(key);
 431}
 432
 433static void ieee80211_key_destroy(struct ieee80211_key *key,
 434                                  bool delay_tailroom)
 435{
 436        if (!key)
 437                return;
 438
 439        /*
 440         * Synchronize so the TX path can no longer be using
 441         * this key before we free/remove it.
 442         */
 443        synchronize_net();
 444
 445        __ieee80211_key_destroy(key, delay_tailroom);
 446}
 447
 448void ieee80211_key_free_unused(struct ieee80211_key *key)
 449{
 450        WARN_ON(key->sdata || key->local);
 451        ieee80211_key_free_common(key);
 452}
 453
 454int ieee80211_key_link(struct ieee80211_key *key,
 455                       struct ieee80211_sub_if_data *sdata,
 456                       struct sta_info *sta)
 457{
 458        struct ieee80211_key *old_key;
 459        int idx, ret;
 460        bool pairwise;
 461
 462        BUG_ON(!sdata);
 463        BUG_ON(!key);
 464
 465        pairwise = key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE;
 466        idx = key->conf.keyidx;
 467        key->local = sdata->local;
 468        key->sdata = sdata;
 469        key->sta = sta;
 470
 471        mutex_lock(&sdata->local->key_mtx);
 472
 473        if (sta && pairwise)
 474                old_key = key_mtx_dereference(sdata->local, sta->ptk);
 475        else if (sta)
 476                old_key = key_mtx_dereference(sdata->local, sta->gtk[idx]);
 477        else
 478                old_key = key_mtx_dereference(sdata->local, sdata->keys[idx]);
 479
 480        increment_tailroom_need_count(sdata);
 481
 482        ieee80211_key_replace(sdata, sta, pairwise, old_key, key);
 483        ieee80211_key_destroy(old_key, true);
 484
 485        ieee80211_debugfs_key_add(key);
 486
 487        ret = ieee80211_key_enable_hw_accel(key);
 488
 489        if (ret)
 490                ieee80211_key_free(key, true);
 491
 492        mutex_unlock(&sdata->local->key_mtx);
 493
 494        return ret;
 495}
 496
 497void ieee80211_key_free(struct ieee80211_key *key, bool delay_tailroom)
 498{
 499        if (!key)
 500                return;
 501
 502        /*
 503         * Replace key with nothingness if it was ever used.
 504         */
 505        if (key->sdata)
 506                ieee80211_key_replace(key->sdata, key->sta,
 507                                key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
 508                                key, NULL);
 509        ieee80211_key_destroy(key, delay_tailroom);
 510}
 511
 512void ieee80211_enable_keys(struct ieee80211_sub_if_data *sdata)
 513{
 514        struct ieee80211_key *key;
 515
 516        ASSERT_RTNL();
 517
 518        if (WARN_ON(!ieee80211_sdata_running(sdata)))
 519                return;
 520
 521        mutex_lock(&sdata->local->key_mtx);
 522
 523        sdata->crypto_tx_tailroom_needed_cnt = 0;
 524
 525        list_for_each_entry(key, &sdata->key_list, list) {
 526                increment_tailroom_need_count(sdata);
 527                ieee80211_key_enable_hw_accel(key);
 528        }
 529
 530        mutex_unlock(&sdata->local->key_mtx);
 531}
 532
 533void ieee80211_iter_keys(struct ieee80211_hw *hw,
 534                         struct ieee80211_vif *vif,
 535                         void (*iter)(struct ieee80211_hw *hw,
 536                                      struct ieee80211_vif *vif,
 537                                      struct ieee80211_sta *sta,
 538                                      struct ieee80211_key_conf *key,
 539                                      void *data),
 540                         void *iter_data)
 541{
 542        struct ieee80211_local *local = hw_to_local(hw);
 543        struct ieee80211_key *key;
 544        struct ieee80211_sub_if_data *sdata;
 545
 546        ASSERT_RTNL();
 547
 548        mutex_lock(&local->key_mtx);
 549        if (vif) {
 550                sdata = vif_to_sdata(vif);
 551                list_for_each_entry(key, &sdata->key_list, list)
 552                        iter(hw, &sdata->vif,
 553                             key->sta ? &key->sta->sta : NULL,
 554                             &key->conf, iter_data);
 555        } else {
 556                list_for_each_entry(sdata, &local->interfaces, list)
 557                        list_for_each_entry(key, &sdata->key_list, list)
 558                                iter(hw, &sdata->vif,
 559                                     key->sta ? &key->sta->sta : NULL,
 560                                     &key->conf, iter_data);
 561        }
 562        mutex_unlock(&local->key_mtx);
 563}
 564EXPORT_SYMBOL(ieee80211_iter_keys);
 565
 566void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata)
 567{
 568        struct ieee80211_key *key, *tmp;
 569        LIST_HEAD(keys);
 570
 571        cancel_delayed_work_sync(&sdata->dec_tailroom_needed_wk);
 572
 573        mutex_lock(&sdata->local->key_mtx);
 574
 575        sdata->crypto_tx_tailroom_needed_cnt -=
 576                sdata->crypto_tx_tailroom_pending_dec;
 577        sdata->crypto_tx_tailroom_pending_dec = 0;
 578
 579        ieee80211_debugfs_key_remove_mgmt_default(sdata);
 580
 581        list_for_each_entry_safe(key, tmp, &sdata->key_list, list) {
 582                ieee80211_key_replace(key->sdata, key->sta,
 583                                key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
 584                                key, NULL);
 585                list_add_tail(&key->list, &keys);
 586        }
 587
 588        ieee80211_debugfs_key_update_default(sdata);
 589
 590        if (!list_empty(&keys)) {
 591                synchronize_net();
 592                list_for_each_entry_safe(key, tmp, &keys, list)
 593                        __ieee80211_key_destroy(key, false);
 594        }
 595
 596        WARN_ON_ONCE(sdata->crypto_tx_tailroom_needed_cnt ||
 597                     sdata->crypto_tx_tailroom_pending_dec);
 598
 599        mutex_unlock(&sdata->local->key_mtx);
 600}
 601
 602void ieee80211_free_sta_keys(struct ieee80211_local *local,
 603                             struct sta_info *sta)
 604{
 605        struct ieee80211_key *key, *tmp;
 606        LIST_HEAD(keys);
 607        int i;
 608
 609        mutex_lock(&local->key_mtx);
 610        for (i = 0; i < NUM_DEFAULT_KEYS; i++) {
 611                key = key_mtx_dereference(local, sta->gtk[i]);
 612                if (!key)
 613                        continue;
 614                ieee80211_key_replace(key->sdata, key->sta,
 615                                key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
 616                                key, NULL);
 617                list_add(&key->list, &keys);
 618        }
 619
 620        key = key_mtx_dereference(local, sta->ptk);
 621        if (key) {
 622                ieee80211_key_replace(key->sdata, key->sta,
 623                                key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
 624                                key, NULL);
 625                list_add(&key->list, &keys);
 626        }
 627
 628        /*
 629         * NB: the station code relies on this being
 630         * done even if there aren't any keys
 631         */
 632        synchronize_net();
 633
 634        list_for_each_entry_safe(key, tmp, &keys, list)
 635                __ieee80211_key_destroy(key, true);
 636
 637        mutex_unlock(&local->key_mtx);
 638}
 639
 640void ieee80211_delayed_tailroom_dec(struct work_struct *wk)
 641{
 642        struct ieee80211_sub_if_data *sdata;
 643
 644        sdata = container_of(wk, struct ieee80211_sub_if_data,
 645                             dec_tailroom_needed_wk.work);
 646
 647        /*
 648         * The reason for the delayed tailroom needed decrementing is to
 649         * make roaming faster: during roaming, all keys are first deleted
 650         * and then new keys are installed. The first new key causes the
 651         * crypto_tx_tailroom_needed_cnt to go from 0 to 1, which invokes
 652         * the cost of synchronize_net() (which can be slow). Avoid this
 653         * by deferring the crypto_tx_tailroom_needed_cnt decrementing on
 654         * key removal for a while, so if we roam the value is larger than
 655         * zero and no 0->1 transition happens.
 656         *
 657         * The cost is that if the AP switching was from an AP with keys
 658         * to one without, we still allocate tailroom while it would no
 659         * longer be needed. However, in the typical (fast) roaming case
 660         * within an ESS this usually won't happen.
 661         */
 662
 663        mutex_lock(&sdata->local->key_mtx);
 664        sdata->crypto_tx_tailroom_needed_cnt -=
 665                sdata->crypto_tx_tailroom_pending_dec;
 666        sdata->crypto_tx_tailroom_pending_dec = 0;
 667        mutex_unlock(&sdata->local->key_mtx);
 668}
 669
 670void ieee80211_gtk_rekey_notify(struct ieee80211_vif *vif, const u8 *bssid,
 671                                const u8 *replay_ctr, gfp_t gfp)
 672{
 673        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
 674
 675        trace_api_gtk_rekey_notify(sdata, bssid, replay_ctr);
 676
 677        cfg80211_gtk_rekey_notify(sdata->dev, bssid, replay_ctr, gfp);
 678}
 679EXPORT_SYMBOL_GPL(ieee80211_gtk_rekey_notify);
 680
 681void ieee80211_get_key_tx_seq(struct ieee80211_key_conf *keyconf,
 682                              struct ieee80211_key_seq *seq)
 683{
 684        struct ieee80211_key *key;
 685        u64 pn64;
 686
 687        if (WARN_ON(!(keyconf->flags & IEEE80211_KEY_FLAG_GENERATE_IV)))
 688                return;
 689
 690        key = container_of(keyconf, struct ieee80211_key, conf);
 691
 692        switch (key->conf.cipher) {
 693        case WLAN_CIPHER_SUITE_TKIP:
 694                seq->tkip.iv32 = key->u.tkip.tx.iv32;
 695                seq->tkip.iv16 = key->u.tkip.tx.iv16;
 696                break;
 697        case WLAN_CIPHER_SUITE_CCMP:
 698                pn64 = atomic64_read(&key->u.ccmp.tx_pn);
 699                seq->ccmp.pn[5] = pn64;
 700                seq->ccmp.pn[4] = pn64 >> 8;
 701                seq->ccmp.pn[3] = pn64 >> 16;
 702                seq->ccmp.pn[2] = pn64 >> 24;
 703                seq->ccmp.pn[1] = pn64 >> 32;
 704                seq->ccmp.pn[0] = pn64 >> 40;
 705                break;
 706        case WLAN_CIPHER_SUITE_AES_CMAC:
 707                pn64 = atomic64_read(&key->u.aes_cmac.tx_pn);
 708                seq->ccmp.pn[5] = pn64;
 709                seq->ccmp.pn[4] = pn64 >> 8;
 710                seq->ccmp.pn[3] = pn64 >> 16;
 711                seq->ccmp.pn[2] = pn64 >> 24;
 712                seq->ccmp.pn[1] = pn64 >> 32;
 713                seq->ccmp.pn[0] = pn64 >> 40;
 714                break;
 715        default:
 716                WARN_ON(1);
 717        }
 718}
 719EXPORT_SYMBOL(ieee80211_get_key_tx_seq);
 720
 721void ieee80211_get_key_rx_seq(struct ieee80211_key_conf *keyconf,
 722                              int tid, struct ieee80211_key_seq *seq)
 723{
 724        struct ieee80211_key *key;
 725        const u8 *pn;
 726
 727        key = container_of(keyconf, struct ieee80211_key, conf);
 728
 729        switch (key->conf.cipher) {
 730        case WLAN_CIPHER_SUITE_TKIP:
 731                if (WARN_ON(tid < 0 || tid >= IEEE80211_NUM_TIDS))
 732                        return;
 733                seq->tkip.iv32 = key->u.tkip.rx[tid].iv32;
 734                seq->tkip.iv16 = key->u.tkip.rx[tid].iv16;
 735                break;
 736        case WLAN_CIPHER_SUITE_CCMP:
 737                if (WARN_ON(tid < -1 || tid >= IEEE80211_NUM_TIDS))
 738                        return;
 739                if (tid < 0)
 740                        pn = key->u.ccmp.rx_pn[IEEE80211_NUM_TIDS];
 741                else
 742                        pn = key->u.ccmp.rx_pn[tid];
 743                memcpy(seq->ccmp.pn, pn, IEEE80211_CCMP_PN_LEN);
 744                break;
 745        case WLAN_CIPHER_SUITE_AES_CMAC:
 746                if (WARN_ON(tid != 0))
 747                        return;
 748                pn = key->u.aes_cmac.rx_pn;
 749                memcpy(seq->aes_cmac.pn, pn, IEEE80211_CMAC_PN_LEN);
 750                break;
 751        }
 752}
 753EXPORT_SYMBOL(ieee80211_get_key_rx_seq);
 754