key.c 30.3 KB
Newer Older
1 2 3 4
/*
 * Copyright 2002-2005, Instant802 Networks, Inc.
 * Copyright 2005-2006, Devicescape Software, Inc.
 * Copyright 2006-2007	Jiri Benc <jbenc@suse.cz>
5
 * Copyright 2007-2008	Johannes Berg <johannes@sipsolutions.net>
6
 * Copyright 2013-2014  Intel Mobile Communications GmbH
7
 * Copyright 2015-2017	Intel Deutschland GmbH
8 9 10 11 12 13
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

J
Johannes Berg 已提交
14 15 16
#include <linux/if_ether.h>
#include <linux/etherdevice.h>
#include <linux/list.h>
17
#include <linux/rcupdate.h>
18
#include <linux/rtnetlink.h>
19
#include <linux/slab.h>
20
#include <linux/export.h>
21
#include <net/mac80211.h>
22
#include <crypto/algapi.h>
23
#include <asm/unaligned.h>
24
#include "ieee80211_i.h"
25
#include "driver-ops.h"
26 27
#include "debugfs_key.h"
#include "aes_ccm.h"
28
#include "aes_cmac.h"
29
#include "aes_gmac.h"
30
#include "aes_gcm.h"
31

J
Johannes Berg 已提交
32

J
Johannes Berg 已提交
33 34
/**
 * DOC: Key handling basics
J
Johannes Berg 已提交
35 36 37 38 39
 *
 * Key handling in mac80211 is done based on per-interface (sub_if_data)
 * keys and per-station keys. Since each station belongs to an interface,
 * each station key also belongs to that interface.
 *
40 41 42 43 44 45 46
 * Hardware acceleration is done on a best-effort basis for algorithms
 * that are implemented in software,  for each key the hardware is asked
 * to enable that key for offloading but if it cannot do that the key is
 * simply kept for software encryption (unless it is for an algorithm
 * that isn't implemented in software).
 * There is currently no way of knowing whether a key is handled in SW
 * or HW except by looking into debugfs.
J
Johannes Berg 已提交
47
 *
48 49 50 51 52 53
 * All key management is internally protected by a mutex. Within all
 * other parts of mac80211, key references are, just as STA structure
 * references, protected by RCU. Note, however, that some things are
 * unprotected, namely the key->sta dereferences within the hardware
 * acceleration functions. This means that sta_info_destroy() must
 * remove the key which waits for an RCU grace period.
J
Johannes Berg 已提交
54 55 56 57
 */

static const u8 bcast_addr[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };

J
Johannes Berg 已提交
58
static void assert_key_lock(struct ieee80211_local *local)
59
{
60
	lockdep_assert_held(&local->key_mtx);
61 62
}

63 64 65 66 67 68 69 70
static void
update_vlan_tailroom_need_count(struct ieee80211_sub_if_data *sdata, int delta)
{
	struct ieee80211_sub_if_data *vlan;

	if (sdata->vif.type != NL80211_IFTYPE_AP)
		return;

71 72
	/* crypto_tx_tailroom_needed_cnt is protected by this */
	assert_key_lock(sdata->local);
73

74 75 76
	rcu_read_lock();

	list_for_each_entry_rcu(vlan, &sdata->u.ap.vlans, u.vlan.list)
77 78
		vlan->crypto_tx_tailroom_needed_cnt += delta;

79
	rcu_read_unlock();
80 81
}

82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
static void increment_tailroom_need_count(struct ieee80211_sub_if_data *sdata)
{
	/*
	 * When this count is zero, SKB resizing for allocating tailroom
	 * for IV or MMIC is skipped. But, this check has created two race
	 * cases in xmit path while transiting from zero count to one:
	 *
	 * 1. SKB resize was skipped because no key was added but just before
	 * the xmit key is added and SW encryption kicks off.
	 *
	 * 2. SKB resize was skipped because all the keys were hw planted but
	 * just before xmit one of the key is deleted and SW encryption kicks
	 * off.
	 *
	 * In both the above case SW encryption will find not enough space for
	 * tailroom and exits with WARN_ON. (See WARN_ONs at wpa.c)
	 *
	 * Solution has been explained at
	 * http://mid.gmane.org/1308590980.4322.19.camel@jlt3.sipsolutions.net
	 */

103 104
	assert_key_lock(sdata->local);

105 106
	update_vlan_tailroom_need_count(sdata, 1);

107 108 109 110 111 112 113 114 115
	if (!sdata->crypto_tx_tailroom_needed_cnt++) {
		/*
		 * Flush all XMIT packets currently using HW encryption or no
		 * encryption at all if the count transition is from 0 -> 1.
		 */
		synchronize_net();
	}
}

116 117 118
static void decrease_tailroom_need_count(struct ieee80211_sub_if_data *sdata,
					 int delta)
{
119 120
	assert_key_lock(sdata->local);

121 122 123 124 125 126
	WARN_ON_ONCE(sdata->crypto_tx_tailroom_needed_cnt < delta);

	update_vlan_tailroom_need_count(sdata, -delta);
	sdata->crypto_tx_tailroom_needed_cnt -= delta;
}

127
static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
J
Johannes Berg 已提交
128
{
129
	struct ieee80211_sub_if_data *sdata;
130
	struct sta_info *sta;
131
	int ret = -EOPNOTSUPP;
J
Johannes Berg 已提交
132

133 134
	might_sleep();

135 136 137 138 139 140 141 142 143
	if (key->flags & KEY_FLAG_TAINTED) {
		/* If we get here, it's during resume and the key is
		 * tainted so shouldn't be used/programmed any more.
		 * However, its flags may still indicate that it was
		 * programmed into the device (since we're in resume)
		 * so clear that flag now to avoid trying to remove
		 * it again later.
		 */
		key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;
144
		return -EINVAL;
145
	}
146

147
	if (!key->local->ops->set_key)
148
		goto out_unsupported;
J
Johannes Berg 已提交
149

J
Johannes Berg 已提交
150 151
	assert_key_lock(key->local);

152
	sta = key->sta;
153

154 155 156 157 158
	/*
	 * If this is a per-STA GTK, check if it
	 * is supported; if not, return.
	 */
	if (sta && !(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE) &&
159
	    !ieee80211_hw_check(&key->local->hw, SUPPORTS_PER_STA_GTK))
160 161
		goto out_unsupported;

162 163 164
	if (sta && !sta->uploaded)
		goto out_unsupported;

165
	sdata = key->sdata;
166 167 168 169 170 171 172 173
	if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
		/*
		 * The driver doesn't know anything about VLAN interfaces.
		 * Hence, don't send GTKs for VLAN interfaces to the driver.
		 */
		if (!(key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE))
			goto out_unsupported;
	}
J
Johannes Berg 已提交
174

175 176
	ret = drv_set_key(key->local, SET_KEY, sdata,
			  sta ? &sta->sta : NULL, &key->conf);
J
Johannes Berg 已提交
177

178
	if (!ret) {
J
Johannes Berg 已提交
179
		key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE;
180

181
		if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) ||
182
		      (key->conf.flags & IEEE80211_KEY_FLAG_RESERVE_TAILROOM)))
183
			decrease_tailroom_need_count(sdata, 1);
184

185 186 187
		WARN_ON((key->conf.flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE) &&
			(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV));

188 189
		return 0;
	}
J
Johannes Berg 已提交
190

191
	if (ret != -ENOSPC && ret != -EOPNOTSUPP && ret != 1)
J
Johannes Berg 已提交
192
		sdata_err(sdata,
J
Joe Perches 已提交
193
			  "failed to set key (%d, %pM) to hardware (%d)\n",
194 195
			  key->conf.keyidx,
			  sta ? sta->sta.addr : bcast_addr, ret);
196

197 198 199 200 201 202
 out_unsupported:
	switch (key->conf.cipher) {
	case WLAN_CIPHER_SUITE_WEP40:
	case WLAN_CIPHER_SUITE_WEP104:
	case WLAN_CIPHER_SUITE_TKIP:
	case WLAN_CIPHER_SUITE_CCMP:
J
Jouni Malinen 已提交
203
	case WLAN_CIPHER_SUITE_CCMP_256:
204
	case WLAN_CIPHER_SUITE_AES_CMAC:
205
	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
206 207
	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
208 209
	case WLAN_CIPHER_SUITE_GCMP:
	case WLAN_CIPHER_SUITE_GCMP_256:
210 211 212
		/* all of these we can do in software - if driver can */
		if (ret == 1)
			return 0;
213
		if (ieee80211_hw_check(&key->local->hw, SW_CRYPTO_CONTROL))
214
			return -EINVAL;
215 216 217
		return 0;
	default:
		return -EINVAL;
218
	}
J
Johannes Berg 已提交
219 220 221 222
}

static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key)
{
223
	struct ieee80211_sub_if_data *sdata;
224
	struct sta_info *sta;
J
Johannes Berg 已提交
225 226
	int ret;

227 228
	might_sleep();

229
	if (!key || !key->local->ops->set_key)
J
Johannes Berg 已提交
230 231
		return;

J
Johannes Berg 已提交
232 233 234
	assert_key_lock(key->local);

	if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
J
Johannes Berg 已提交
235 236
		return;

237
	sta = key->sta;
238 239
	sdata = key->sdata;

240
	if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) ||
241
	      (key->conf.flags & IEEE80211_KEY_FLAG_RESERVE_TAILROOM)))
242 243
		increment_tailroom_need_count(sdata);

J
Johannes Berg 已提交
244
	ret = drv_set_key(key->local, DISABLE_KEY, sdata,
245
			  sta ? &sta->sta : NULL, &key->conf);
J
Johannes Berg 已提交
246 247

	if (ret)
J
Johannes Berg 已提交
248
		sdata_err(sdata,
J
Joe Perches 已提交
249
			  "failed to remove key (%d, %pM) from hardware (%d)\n",
250 251
			  key->conf.keyidx,
			  sta ? sta->sta.addr : bcast_addr, ret);
J
Johannes Berg 已提交
252

253 254 255 256
	key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;
}

static void __ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata,
257
					int idx, bool uni, bool multi)
258 259 260
{
	struct ieee80211_key *key = NULL;

J
Johannes Berg 已提交
261 262
	assert_key_lock(sdata->local);

263
	if (idx >= 0 && idx < NUM_DEFAULT_KEYS)
J
Johannes Berg 已提交
264
		key = key_mtx_dereference(sdata->local, sdata->keys[idx]);
265

266
	if (uni) {
267
		rcu_assign_pointer(sdata->default_unicast_key, key);
J
Johannes Berg 已提交
268
		ieee80211_check_fast_xmit_iface(sdata);
269 270
		if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN)
			drv_set_default_unicast_key(sdata->local, sdata, idx);
271 272
	}

273 274
	if (multi)
		rcu_assign_pointer(sdata->default_multicast_key, key);
275

276
	ieee80211_debugfs_key_update_default(sdata);
277 278
}

279 280
void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx,
			       bool uni, bool multi)
281
{
J
Johannes Berg 已提交
282
	mutex_lock(&sdata->local->key_mtx);
283
	__ieee80211_set_default_key(sdata, idx, uni, multi);
J
Johannes Berg 已提交
284
	mutex_unlock(&sdata->local->key_mtx);
285 286
}

287 288 289 290 291
static void
__ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata, int idx)
{
	struct ieee80211_key *key = NULL;

J
Johannes Berg 已提交
292 293
	assert_key_lock(sdata->local);

294 295
	if (idx >= NUM_DEFAULT_KEYS &&
	    idx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS)
J
Johannes Berg 已提交
296
		key = key_mtx_dereference(sdata->local, sdata->keys[idx]);
297 298 299

	rcu_assign_pointer(sdata->default_mgmt_key, key);

300
	ieee80211_debugfs_key_update_default(sdata);
301 302 303 304 305
}

void ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata,
				    int idx)
{
J
Johannes Berg 已提交
306
	mutex_lock(&sdata->local->key_mtx);
307
	__ieee80211_set_default_mgmt_key(sdata, idx);
J
Johannes Berg 已提交
308
	mutex_unlock(&sdata->local->key_mtx);
309 310
}

311

312 313 314 315 316
static void ieee80211_key_replace(struct ieee80211_sub_if_data *sdata,
				  struct sta_info *sta,
				  bool pairwise,
				  struct ieee80211_key *old,
				  struct ieee80211_key *new)
317
{
318 319
	int idx;
	bool defunikey, defmultikey, defmgmtkey;
320

321 322 323 324
	/* caller must provide at least one old/new */
	if (WARN_ON(!new && !old))
		return;

325
	if (new)
326
		list_add_tail_rcu(&new->list, &sdata->key_list);
327

328
	WARN_ON(new && old && new->conf.keyidx != old->conf.keyidx);
329

330 331 332 333
	if (old)
		idx = old->conf.keyidx;
	else
		idx = new->conf.keyidx;
334

335 336 337 338
	if (sta) {
		if (pairwise) {
			rcu_assign_pointer(sta->ptk[idx], new);
			sta->ptk_idx = idx;
J
Johannes Berg 已提交
339
			ieee80211_check_fast_xmit(sta);
340 341 342
		} else {
			rcu_assign_pointer(sta->gtk[idx], new);
		}
J
Johannes Berg 已提交
343
		ieee80211_check_fast_rx(sta);
344
	} else {
J
Johannes Berg 已提交
345 346 347 348 349 350 351 352 353
		defunikey = old &&
			old == key_mtx_dereference(sdata->local,
						sdata->default_unicast_key);
		defmultikey = old &&
			old == key_mtx_dereference(sdata->local,
						sdata->default_multicast_key);
		defmgmtkey = old &&
			old == key_mtx_dereference(sdata->local,
						sdata->default_mgmt_key);
354

355 356 357 358
		if (defunikey && !new)
			__ieee80211_set_default_key(sdata, -1, true, false);
		if (defmultikey && !new)
			__ieee80211_set_default_key(sdata, -1, false, true);
359 360
		if (defmgmtkey && !new)
			__ieee80211_set_default_mgmt_key(sdata, -1);
361 362

		rcu_assign_pointer(sdata->keys[idx], new);
363 364 365 366 367 368
		if (defunikey && new)
			__ieee80211_set_default_key(sdata, new->conf.keyidx,
						    true, false);
		if (defmultikey && new)
			__ieee80211_set_default_key(sdata, new->conf.keyidx,
						    false, true);
369 370 371
		if (defmgmtkey && new)
			__ieee80211_set_default_mgmt_key(sdata,
							 new->conf.keyidx);
372 373
	}

374
	if (old)
375
		list_del_rcu(&old->list);
J
Johannes Berg 已提交
376 377
}

378 379 380 381 382
struct ieee80211_key *
ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
		    const u8 *key_data,
		    size_t seq_len, const u8 *seq,
		    const struct ieee80211_cipher_scheme *cs)
383 384
{
	struct ieee80211_key *key;
385
	int i, j, err;
386

J
Johannes Berg 已提交
387 388
	if (WARN_ON(idx < 0 || idx >= NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS))
		return ERR_PTR(-EINVAL);
J
Johannes Berg 已提交
389 390

	key = kzalloc(sizeof(struct ieee80211_key) + key_len, GFP_KERNEL);
391
	if (!key)
392
		return ERR_PTR(-ENOMEM);
J
Johannes Berg 已提交
393 394 395 396 397 398 399 400

	/*
	 * Default to software encryption; we'll later upload the
	 * key to the hardware if possible.
	 */
	key->conf.flags = 0;
	key->flags = 0;

401
	key->conf.cipher = cipher;
J
Johannes Berg 已提交
402 403
	key->conf.keyidx = idx;
	key->conf.keylen = key_len;
404 405 406
	switch (cipher) {
	case WLAN_CIPHER_SUITE_WEP40:
	case WLAN_CIPHER_SUITE_WEP104:
407 408
		key->conf.iv_len = IEEE80211_WEP_IV_LEN;
		key->conf.icv_len = IEEE80211_WEP_ICV_LEN;
409
		break;
410
	case WLAN_CIPHER_SUITE_TKIP:
411 412
		key->conf.iv_len = IEEE80211_TKIP_IV_LEN;
		key->conf.icv_len = IEEE80211_TKIP_ICV_LEN;
413
		if (seq) {
414
			for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
415 416 417 418 419 420
				key->u.tkip.rx[i].iv32 =
					get_unaligned_le32(&seq[2]);
				key->u.tkip.rx[i].iv16 =
					get_unaligned_le16(seq);
			}
		}
421
		spin_lock_init(&key->u.tkip.txlock);
422
		break;
423
	case WLAN_CIPHER_SUITE_CCMP:
424 425
		key->conf.iv_len = IEEE80211_CCMP_HDR_LEN;
		key->conf.icv_len = IEEE80211_CCMP_MIC_LEN;
426
		if (seq) {
427
			for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++)
428
				for (j = 0; j < IEEE80211_CCMP_PN_LEN; j++)
429
					key->u.ccmp.rx_pn[i][j] =
430
						seq[IEEE80211_CCMP_PN_LEN - j - 1];
431
		}
J
Johannes Berg 已提交
432 433 434 435
		/*
		 * Initialize AES key state here as an optimization so that
		 * it does not need to be initialized for every packet.
		 */
J
Jouni Malinen 已提交
436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455
		key->u.ccmp.tfm = ieee80211_aes_key_setup_encrypt(
			key_data, key_len, IEEE80211_CCMP_MIC_LEN);
		if (IS_ERR(key->u.ccmp.tfm)) {
			err = PTR_ERR(key->u.ccmp.tfm);
			kfree(key);
			return ERR_PTR(err);
		}
		break;
	case WLAN_CIPHER_SUITE_CCMP_256:
		key->conf.iv_len = IEEE80211_CCMP_256_HDR_LEN;
		key->conf.icv_len = IEEE80211_CCMP_256_MIC_LEN;
		for (i = 0; seq && i < IEEE80211_NUM_TIDS + 1; i++)
			for (j = 0; j < IEEE80211_CCMP_256_PN_LEN; j++)
				key->u.ccmp.rx_pn[i][j] =
					seq[IEEE80211_CCMP_256_PN_LEN - j - 1];
		/* Initialize AES key state here as an optimization so that
		 * it does not need to be initialized for every packet.
		 */
		key->u.ccmp.tfm = ieee80211_aes_key_setup_encrypt(
			key_data, key_len, IEEE80211_CCMP_256_MIC_LEN);
456 457
		if (IS_ERR(key->u.ccmp.tfm)) {
			err = PTR_ERR(key->u.ccmp.tfm);
458
			kfree(key);
459
			return ERR_PTR(err);
J
Johannes Berg 已提交
460
		}
J
Johannes Berg 已提交
461 462
		break;
	case WLAN_CIPHER_SUITE_AES_CMAC:
463
	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
J
Johannes Berg 已提交
464
		key->conf.iv_len = 0;
465 466 467 468
		if (cipher == WLAN_CIPHER_SUITE_AES_CMAC)
			key->conf.icv_len = sizeof(struct ieee80211_mmie);
		else
			key->conf.icv_len = sizeof(struct ieee80211_mmie_16);
J
Johannes Berg 已提交
469
		if (seq)
470
			for (j = 0; j < IEEE80211_CMAC_PN_LEN; j++)
J
Johannes Berg 已提交
471
				key->u.aes_cmac.rx_pn[j] =
472
					seq[IEEE80211_CMAC_PN_LEN - j - 1];
473 474 475 476 477
		/*
		 * Initialize AES key state here as an optimization so that
		 * it does not need to be initialized for every packet.
		 */
		key->u.aes_cmac.tfm =
478
			ieee80211_aes_cmac_key_setup(key_data, key_len);
479 480
		if (IS_ERR(key->u.aes_cmac.tfm)) {
			err = PTR_ERR(key->u.aes_cmac.tfm);
481
			kfree(key);
482
			return ERR_PTR(err);
483
		}
J
Johannes Berg 已提交
484
		break;
485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503
	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
		key->conf.iv_len = 0;
		key->conf.icv_len = sizeof(struct ieee80211_mmie_16);
		if (seq)
			for (j = 0; j < IEEE80211_GMAC_PN_LEN; j++)
				key->u.aes_gmac.rx_pn[j] =
					seq[IEEE80211_GMAC_PN_LEN - j - 1];
		/* Initialize AES key state here as an optimization so that
		 * it does not need to be initialized for every packet.
		 */
		key->u.aes_gmac.tfm =
			ieee80211_aes_gmac_key_setup(key_data, key_len);
		if (IS_ERR(key->u.aes_gmac.tfm)) {
			err = PTR_ERR(key->u.aes_gmac.tfm);
			kfree(key);
			return ERR_PTR(err);
		}
		break;
504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522
	case WLAN_CIPHER_SUITE_GCMP:
	case WLAN_CIPHER_SUITE_GCMP_256:
		key->conf.iv_len = IEEE80211_GCMP_HDR_LEN;
		key->conf.icv_len = IEEE80211_GCMP_MIC_LEN;
		for (i = 0; seq && i < IEEE80211_NUM_TIDS + 1; i++)
			for (j = 0; j < IEEE80211_GCMP_PN_LEN; j++)
				key->u.gcmp.rx_pn[i][j] =
					seq[IEEE80211_GCMP_PN_LEN - j - 1];
		/* Initialize AES key state here as an optimization so that
		 * it does not need to be initialized for every packet.
		 */
		key->u.gcmp.tfm = ieee80211_aes_gcm_key_setup_encrypt(key_data,
								      key_len);
		if (IS_ERR(key->u.gcmp.tfm)) {
			err = PTR_ERR(key->u.gcmp.tfm);
			kfree(key);
			return ERR_PTR(err);
		}
		break;
523 524
	default:
		if (cs) {
525 526 527 528
			if (seq_len && seq_len != cs->pn_len) {
				kfree(key);
				return ERR_PTR(-EINVAL);
			}
529 530 531 532

			key->conf.iv_len = cs->hdr_len;
			key->conf.icv_len = cs->mic_len;
			for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++)
533
				for (j = 0; j < seq_len; j++)
534
					key->u.gen.rx_pn[i][j] =
535
							seq[seq_len - j - 1];
536
			key->flags |= KEY_FLAG_CIPHER_SCHEME;
537
		}
538
	}
J
Johannes Berg 已提交
539 540
	memcpy(key->conf.key, key_data, key_len);
	INIT_LIST_HEAD(&key->list);
541

542 543
	return key;
}
J
Johannes Berg 已提交
544

545 546
static void ieee80211_key_free_common(struct ieee80211_key *key)
{
547 548
	switch (key->conf.cipher) {
	case WLAN_CIPHER_SUITE_CCMP:
J
Jouni Malinen 已提交
549
	case WLAN_CIPHER_SUITE_CCMP_256:
550
		ieee80211_aes_key_free(key->u.ccmp.tfm);
551 552
		break;
	case WLAN_CIPHER_SUITE_AES_CMAC:
553
	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
554
		ieee80211_aes_cmac_key_free(key->u.aes_cmac.tfm);
555
		break;
556 557 558 559
	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
		ieee80211_aes_gmac_key_free(key->u.aes_gmac.tfm);
		break;
560 561 562 563 564
	case WLAN_CIPHER_SUITE_GCMP:
	case WLAN_CIPHER_SUITE_GCMP_256:
		ieee80211_aes_gcm_key_free(key->u.gcmp.tfm);
		break;
	}
565
	kzfree(key);
566 567
}

568 569
static void __ieee80211_key_destroy(struct ieee80211_key *key,
				    bool delay_tailroom)
J
Johannes Berg 已提交
570
{
571 572
	if (key->local)
		ieee80211_key_disable_hw_accel(key);
J
Johannes Berg 已提交
573

574
	if (key->local) {
575 576
		struct ieee80211_sub_if_data *sdata = key->sdata;

577
		ieee80211_debugfs_key_remove(key);
578 579 580 581 582 583 584

		if (delay_tailroom) {
			/* see ieee80211_delayed_tailroom_dec */
			sdata->crypto_tx_tailroom_pending_dec++;
			schedule_delayed_work(&sdata->dec_tailroom_needed_wk,
					      HZ/2);
		} else {
585
			decrease_tailroom_need_count(sdata, 1);
586
		}
587
	}
J
Johannes Berg 已提交
588

589 590 591
	ieee80211_key_free_common(key);
}

592 593 594 595 596 597 598
static void ieee80211_key_destroy(struct ieee80211_key *key,
				  bool delay_tailroom)
{
	if (!key)
		return;

	/*
599 600
	 * Synchronize so the TX path and rcu key iterators
	 * can no longer be using this key before we free/remove it.
601 602 603 604 605 606
	 */
	synchronize_net();

	__ieee80211_key_destroy(key, delay_tailroom);
}

607 608 609 610
void ieee80211_key_free_unused(struct ieee80211_key *key)
{
	WARN_ON(key->sdata || key->local);
	ieee80211_key_free_common(key);
J
Johannes Berg 已提交
611 612
}

613 614 615
int ieee80211_key_link(struct ieee80211_key *key,
		       struct ieee80211_sub_if_data *sdata,
		       struct sta_info *sta)
616
{
617
	struct ieee80211_local *local = sdata->local;
618
	struct ieee80211_key *old_key;
619
	int idx, ret;
620
	bool pairwise;
621

622
	pairwise = key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE;
623 624
	idx = key->conf.keyidx;

J
Johannes Berg 已提交
625
	mutex_lock(&sdata->local->key_mtx);
626

627
	if (sta && pairwise)
628
		old_key = key_mtx_dereference(sdata->local, sta->ptk[idx]);
629
	else if (sta)
J
Johannes Berg 已提交
630
		old_key = key_mtx_dereference(sdata->local, sta->gtk[idx]);
631
	else
J
Johannes Berg 已提交
632
		old_key = key_mtx_dereference(sdata->local, sdata->keys[idx]);
633

634 635 636 637 638
	/*
	 * Silently accept key re-installation without really installing the
	 * new version of the key to avoid nonce reuse or replay issues.
	 */
	if (old_key && key->conf.keylen == old_key->conf.keylen &&
639
	    !crypto_memneq(key->conf.key, old_key->conf.key, key->conf.keylen)) {
640 641 642 643 644 645 646 647 648
		ieee80211_key_free_unused(key);
		ret = 0;
		goto out;
	}

	key->local = sdata->local;
	key->sdata = sdata;
	key->sta = sta;

649 650
	increment_tailroom_need_count(sdata);

651 652
	ieee80211_key_replace(sdata, sta, pairwise, old_key, key);
	ieee80211_key_destroy(old_key, true);
653

J
Johannes Berg 已提交
654
	ieee80211_debugfs_key_add(key);
655

656 657 658 659 660 661 662
	if (!local->wowlan) {
		ret = ieee80211_key_enable_hw_accel(key);
		if (ret)
			ieee80211_key_free(key, true);
	} else {
		ret = 0;
	}
663

664
 out:
J
Johannes Berg 已提交
665
	mutex_unlock(&sdata->local->key_mtx);
666 667

	return ret;
668 669
}

670
void ieee80211_key_free(struct ieee80211_key *key, bool delay_tailroom)
671
{
672 673 674
	if (!key)
		return;

675 676 677
	/*
	 * Replace key with nothingness if it was ever used.
	 */
J
Johannes Berg 已提交
678
	if (key->sdata)
679
		ieee80211_key_replace(key->sdata, key->sta,
680 681
				key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
				key, NULL);
682
	ieee80211_key_destroy(key, delay_tailroom);
683
}
684

J
Johannes Berg 已提交
685
void ieee80211_enable_keys(struct ieee80211_sub_if_data *sdata)
J
Johannes Berg 已提交
686 687
{
	struct ieee80211_key *key;
688
	struct ieee80211_sub_if_data *vlan;
J
Johannes Berg 已提交
689

J
Johannes Berg 已提交
690
	ASSERT_RTNL();
J
Johannes Berg 已提交
691

692
	if (WARN_ON(!ieee80211_sdata_running(sdata)))
J
Johannes Berg 已提交
693
		return;
J
Johannes Berg 已提交
694

J
Johannes Berg 已提交
695
	mutex_lock(&sdata->local->key_mtx);
J
Johannes Berg 已提交
696

697 698 699 700 701 702 703 704
	WARN_ON_ONCE(sdata->crypto_tx_tailroom_needed_cnt ||
		     sdata->crypto_tx_tailroom_pending_dec);

	if (sdata->vif.type == NL80211_IFTYPE_AP) {
		list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
			WARN_ON_ONCE(vlan->crypto_tx_tailroom_needed_cnt ||
				     vlan->crypto_tx_tailroom_pending_dec);
	}
705 706 707

	list_for_each_entry(key, &sdata->key_list, list) {
		increment_tailroom_need_count(sdata);
J
Johannes Berg 已提交
708
		ieee80211_key_enable_hw_accel(key);
709
	}
710

J
Johannes Berg 已提交
711
	mutex_unlock(&sdata->local->key_mtx);
J
Johannes Berg 已提交
712 713
}

714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729
void ieee80211_reset_crypto_tx_tailroom(struct ieee80211_sub_if_data *sdata)
{
	struct ieee80211_sub_if_data *vlan;

	mutex_lock(&sdata->local->key_mtx);

	sdata->crypto_tx_tailroom_needed_cnt = 0;

	if (sdata->vif.type == NL80211_IFTYPE_AP) {
		list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
			vlan->crypto_tx_tailroom_needed_cnt = 0;
	}

	mutex_unlock(&sdata->local->key_mtx);
}

730 731 732 733 734 735 736 737 738 739
void ieee80211_iter_keys(struct ieee80211_hw *hw,
			 struct ieee80211_vif *vif,
			 void (*iter)(struct ieee80211_hw *hw,
				      struct ieee80211_vif *vif,
				      struct ieee80211_sta *sta,
				      struct ieee80211_key_conf *key,
				      void *data),
			 void *iter_data)
{
	struct ieee80211_local *local = hw_to_local(hw);
740
	struct ieee80211_key *key, *tmp;
741 742 743 744 745 746 747
	struct ieee80211_sub_if_data *sdata;

	ASSERT_RTNL();

	mutex_lock(&local->key_mtx);
	if (vif) {
		sdata = vif_to_sdata(vif);
748
		list_for_each_entry_safe(key, tmp, &sdata->key_list, list)
749 750 751 752 753
			iter(hw, &sdata->vif,
			     key->sta ? &key->sta->sta : NULL,
			     &key->conf, iter_data);
	} else {
		list_for_each_entry(sdata, &local->interfaces, list)
754 755
			list_for_each_entry_safe(key, tmp,
						 &sdata->key_list, list)
756 757 758 759 760 761 762 763
				iter(hw, &sdata->vif,
				     key->sta ? &key->sta->sta : NULL,
				     &key->conf, iter_data);
	}
	mutex_unlock(&local->key_mtx);
}
EXPORT_SYMBOL(ieee80211_iter_keys);

764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810
static void
_ieee80211_iter_keys_rcu(struct ieee80211_hw *hw,
			 struct ieee80211_sub_if_data *sdata,
			 void (*iter)(struct ieee80211_hw *hw,
				      struct ieee80211_vif *vif,
				      struct ieee80211_sta *sta,
				      struct ieee80211_key_conf *key,
				      void *data),
			 void *iter_data)
{
	struct ieee80211_key *key;

	list_for_each_entry_rcu(key, &sdata->key_list, list) {
		/* skip keys of station in removal process */
		if (key->sta && key->sta->removed)
			continue;
		if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
			continue;

		iter(hw, &sdata->vif,
		     key->sta ? &key->sta->sta : NULL,
		     &key->conf, iter_data);
	}
}

void ieee80211_iter_keys_rcu(struct ieee80211_hw *hw,
			     struct ieee80211_vif *vif,
			     void (*iter)(struct ieee80211_hw *hw,
					  struct ieee80211_vif *vif,
					  struct ieee80211_sta *sta,
					  struct ieee80211_key_conf *key,
					  void *data),
			     void *iter_data)
{
	struct ieee80211_local *local = hw_to_local(hw);
	struct ieee80211_sub_if_data *sdata;

	if (vif) {
		sdata = vif_to_sdata(vif);
		_ieee80211_iter_keys_rcu(hw, sdata, iter, iter_data);
	} else {
		list_for_each_entry_rcu(sdata, &local->interfaces, list)
			_ieee80211_iter_keys_rcu(hw, sdata, iter, iter_data);
	}
}
EXPORT_SYMBOL(ieee80211_iter_keys_rcu);

811 812
static void ieee80211_free_keys_iface(struct ieee80211_sub_if_data *sdata,
				      struct list_head *keys)
813 814 815
{
	struct ieee80211_key *key, *tmp;

816 817
	decrease_tailroom_need_count(sdata,
				     sdata->crypto_tx_tailroom_pending_dec);
818 819
	sdata->crypto_tx_tailroom_pending_dec = 0;

820
	ieee80211_debugfs_key_remove_mgmt_default(sdata);
821

822 823 824 825
	list_for_each_entry_safe(key, tmp, &sdata->key_list, list) {
		ieee80211_key_replace(key->sdata, key->sta,
				key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
				key, NULL);
826
		list_add_tail(&key->list, keys);
827
	}
828

829
	ieee80211_debugfs_key_update_default(sdata);
830
}
831

832 833 834 835 836
void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata,
			 bool force_synchronize)
{
	struct ieee80211_local *local = sdata->local;
	struct ieee80211_sub_if_data *vlan;
837
	struct ieee80211_sub_if_data *master;
838 839 840 841 842 843 844 845 846 847 848 849
	struct ieee80211_key *key, *tmp;
	LIST_HEAD(keys);

	cancel_delayed_work_sync(&sdata->dec_tailroom_needed_wk);

	mutex_lock(&local->key_mtx);

	ieee80211_free_keys_iface(sdata, &keys);

	if (sdata->vif.type == NL80211_IFTYPE_AP) {
		list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
			ieee80211_free_keys_iface(vlan, &keys);
850 851
	}

852 853 854 855 856
	if (!list_empty(&keys) || force_synchronize)
		synchronize_net();
	list_for_each_entry_safe(key, tmp, &keys, list)
		__ieee80211_key_destroy(key, false);

857 858 859 860 861 862 863 864 865 866 867 868 869 870
	if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
		if (sdata->bss) {
			master = container_of(sdata->bss,
					      struct ieee80211_sub_if_data,
					      u.ap);

			WARN_ON_ONCE(sdata->crypto_tx_tailroom_needed_cnt !=
				     master->crypto_tx_tailroom_needed_cnt);
		}
	} else {
		WARN_ON_ONCE(sdata->crypto_tx_tailroom_needed_cnt ||
			     sdata->crypto_tx_tailroom_pending_dec);
	}

871 872 873 874 875
	if (sdata->vif.type == NL80211_IFTYPE_AP) {
		list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
			WARN_ON_ONCE(vlan->crypto_tx_tailroom_needed_cnt ||
				     vlan->crypto_tx_tailroom_pending_dec);
	}
876

877
	mutex_unlock(&local->key_mtx);
J
Johannes Berg 已提交
878
}
879

880 881 882
void ieee80211_free_sta_keys(struct ieee80211_local *local,
			     struct sta_info *sta)
{
883
	struct ieee80211_key *key;
884 885 886
	int i;

	mutex_lock(&local->key_mtx);
887
	for (i = 0; i < ARRAY_SIZE(sta->gtk); i++) {
888 889 890 891 892 893
		key = key_mtx_dereference(local, sta->gtk[i]);
		if (!key)
			continue;
		ieee80211_key_replace(key->sdata, key->sta,
				key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
				key, NULL);
894
		__ieee80211_key_destroy(key, true);
895 896
	}

897 898 899 900
	for (i = 0; i < NUM_DEFAULT_KEYS; i++) {
		key = key_mtx_dereference(local, sta->ptk[i]);
		if (!key)
			continue;
901 902 903 904
		ieee80211_key_replace(key->sdata, key->sta,
				key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
				key, NULL);
		__ieee80211_key_destroy(key, true);
905
	}
906 907 908 909

	mutex_unlock(&local->key_mtx);
}

910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933
void ieee80211_delayed_tailroom_dec(struct work_struct *wk)
{
	struct ieee80211_sub_if_data *sdata;

	sdata = container_of(wk, struct ieee80211_sub_if_data,
			     dec_tailroom_needed_wk.work);

	/*
	 * The reason for the delayed tailroom needed decrementing is to
	 * make roaming faster: during roaming, all keys are first deleted
	 * and then new keys are installed. The first new key causes the
	 * crypto_tx_tailroom_needed_cnt to go from 0 to 1, which invokes
	 * the cost of synchronize_net() (which can be slow). Avoid this
	 * by deferring the crypto_tx_tailroom_needed_cnt decrementing on
	 * key removal for a while, so if we roam the value is larger than
	 * zero and no 0->1 transition happens.
	 *
	 * The cost is that if the AP switching was from an AP with keys
	 * to one without, we still allocate tailroom while it would no
	 * longer be needed. However, in the typical (fast) roaming case
	 * within an ESS this usually won't happen.
	 */

	mutex_lock(&sdata->local->key_mtx);
934 935
	decrease_tailroom_need_count(sdata,
				     sdata->crypto_tx_tailroom_pending_dec);
936 937 938
	sdata->crypto_tx_tailroom_pending_dec = 0;
	mutex_unlock(&sdata->local->key_mtx);
}
939 940 941 942 943 944 945 946 947 948 949

void ieee80211_gtk_rekey_notify(struct ieee80211_vif *vif, const u8 *bssid,
				const u8 *replay_ctr, gfp_t gfp)
{
	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);

	trace_api_gtk_rekey_notify(sdata, bssid, replay_ctr);

	cfg80211_gtk_rekey_notify(sdata->dev, bssid, replay_ctr, gfp);
}
EXPORT_SYMBOL_GPL(ieee80211_gtk_rekey_notify);
950 951 952 953 954 955 956 957 958 959 960

void ieee80211_get_key_rx_seq(struct ieee80211_key_conf *keyconf,
			      int tid, struct ieee80211_key_seq *seq)
{
	struct ieee80211_key *key;
	const u8 *pn;

	key = container_of(keyconf, struct ieee80211_key, conf);

	switch (key->conf.cipher) {
	case WLAN_CIPHER_SUITE_TKIP:
961
		if (WARN_ON(tid < 0 || tid >= IEEE80211_NUM_TIDS))
962 963 964 965 966
			return;
		seq->tkip.iv32 = key->u.tkip.rx[tid].iv32;
		seq->tkip.iv16 = key->u.tkip.rx[tid].iv16;
		break;
	case WLAN_CIPHER_SUITE_CCMP:
J
Jouni Malinen 已提交
967
	case WLAN_CIPHER_SUITE_CCMP_256:
968
		if (WARN_ON(tid < -1 || tid >= IEEE80211_NUM_TIDS))
969 970
			return;
		if (tid < 0)
971
			pn = key->u.ccmp.rx_pn[IEEE80211_NUM_TIDS];
972 973
		else
			pn = key->u.ccmp.rx_pn[tid];
974
		memcpy(seq->ccmp.pn, pn, IEEE80211_CCMP_PN_LEN);
975 976
		break;
	case WLAN_CIPHER_SUITE_AES_CMAC:
977
	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
978 979 980
		if (WARN_ON(tid != 0))
			return;
		pn = key->u.aes_cmac.rx_pn;
981
		memcpy(seq->aes_cmac.pn, pn, IEEE80211_CMAC_PN_LEN);
982
		break;
983 984 985 986 987 988 989
	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
		if (WARN_ON(tid != 0))
			return;
		pn = key->u.aes_gmac.rx_pn;
		memcpy(seq->aes_gmac.pn, pn, IEEE80211_GMAC_PN_LEN);
		break;
990 991 992 993 994 995 996 997 998 999
	case WLAN_CIPHER_SUITE_GCMP:
	case WLAN_CIPHER_SUITE_GCMP_256:
		if (WARN_ON(tid < -1 || tid >= IEEE80211_NUM_TIDS))
			return;
		if (tid < 0)
			pn = key->u.gcmp.rx_pn[IEEE80211_NUM_TIDS];
		else
			pn = key->u.gcmp.rx_pn[tid];
		memcpy(seq->gcmp.pn, pn, IEEE80211_GCMP_PN_LEN);
		break;
1000 1001 1002
	}
}
EXPORT_SYMBOL(ieee80211_get_key_rx_seq);
1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019

void ieee80211_set_key_rx_seq(struct ieee80211_key_conf *keyconf,
			      int tid, struct ieee80211_key_seq *seq)
{
	struct ieee80211_key *key;
	u8 *pn;

	key = container_of(keyconf, struct ieee80211_key, conf);

	switch (key->conf.cipher) {
	case WLAN_CIPHER_SUITE_TKIP:
		if (WARN_ON(tid < 0 || tid >= IEEE80211_NUM_TIDS))
			return;
		key->u.tkip.rx[tid].iv32 = seq->tkip.iv32;
		key->u.tkip.rx[tid].iv16 = seq->tkip.iv16;
		break;
	case WLAN_CIPHER_SUITE_CCMP:
J
Jouni Malinen 已提交
1020
	case WLAN_CIPHER_SUITE_CCMP_256:
1021 1022 1023 1024 1025 1026 1027 1028 1029
		if (WARN_ON(tid < -1 || tid >= IEEE80211_NUM_TIDS))
			return;
		if (tid < 0)
			pn = key->u.ccmp.rx_pn[IEEE80211_NUM_TIDS];
		else
			pn = key->u.ccmp.rx_pn[tid];
		memcpy(pn, seq->ccmp.pn, IEEE80211_CCMP_PN_LEN);
		break;
	case WLAN_CIPHER_SUITE_AES_CMAC:
1030
	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
1031 1032 1033 1034 1035
		if (WARN_ON(tid != 0))
			return;
		pn = key->u.aes_cmac.rx_pn;
		memcpy(pn, seq->aes_cmac.pn, IEEE80211_CMAC_PN_LEN);
		break;
1036 1037 1038 1039 1040 1041 1042
	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
		if (WARN_ON(tid != 0))
			return;
		pn = key->u.aes_gmac.rx_pn;
		memcpy(pn, seq->aes_gmac.pn, IEEE80211_GMAC_PN_LEN);
		break;
1043 1044 1045 1046 1047 1048 1049 1050 1051 1052
	case WLAN_CIPHER_SUITE_GCMP:
	case WLAN_CIPHER_SUITE_GCMP_256:
		if (WARN_ON(tid < -1 || tid >= IEEE80211_NUM_TIDS))
			return;
		if (tid < 0)
			pn = key->u.gcmp.rx_pn[IEEE80211_NUM_TIDS];
		else
			pn = key->u.gcmp.rx_pn[tid];
		memcpy(pn, seq->gcmp.pn, IEEE80211_GCMP_PN_LEN);
		break;
1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074
	default:
		WARN_ON(1);
		break;
	}
}
EXPORT_SYMBOL_GPL(ieee80211_set_key_rx_seq);

void ieee80211_remove_key(struct ieee80211_key_conf *keyconf)
{
	struct ieee80211_key *key;

	key = container_of(keyconf, struct ieee80211_key, conf);

	assert_key_lock(key->local);

	/*
	 * if key was uploaded, we assume the driver will/has remove(d)
	 * it, so adjust bookkeeping accordingly
	 */
	if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) {
		key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;

1075
		if (!((key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) ||
1076
		      (key->conf.flags & IEEE80211_KEY_FLAG_RESERVE_TAILROOM)))
1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100
			increment_tailroom_need_count(key->sdata);
	}

	ieee80211_key_free(key, false);
}
EXPORT_SYMBOL_GPL(ieee80211_remove_key);

struct ieee80211_key_conf *
ieee80211_gtk_rekey_add(struct ieee80211_vif *vif,
			struct ieee80211_key_conf *keyconf)
{
	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
	struct ieee80211_local *local = sdata->local;
	struct ieee80211_key *key;
	int err;

	if (WARN_ON(!local->wowlan))
		return ERR_PTR(-EINVAL);

	if (WARN_ON(vif->type != NL80211_IFTYPE_STATION))
		return ERR_PTR(-EINVAL);

	key = ieee80211_key_alloc(keyconf->cipher, keyconf->keyidx,
				  keyconf->keylen, keyconf->key,
1101
				  0, NULL, NULL);
1102
	if (IS_ERR(key))
J
Johannes Berg 已提交
1103
		return ERR_CAST(key);
1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114

	if (sdata->u.mgd.mfp != IEEE80211_MFP_DISABLED)
		key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;

	err = ieee80211_key_link(key, sdata, NULL);
	if (err)
		return ERR_PTR(err);

	return &key->conf;
}
EXPORT_SYMBOL_GPL(ieee80211_gtk_rekey_add);