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>
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.
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 <net/mac80211.h>
19 #include "ieee80211_i.h"
20 #include "driver-ops.h"
21 #include "debugfs_key.h"
27 * DOC: Key handling basics
29 * Key handling in mac80211 is done based on per-interface (sub_if_data)
30 * keys and per-station keys. Since each station belongs to an interface,
31 * each station key also belongs to that interface.
33 * Hardware acceleration is done on a best-effort basis, for each key
34 * that is eligible the hardware is asked to enable that key but if
35 * it cannot do that they key is simply kept for software encryption.
36 * There is currently no way of knowing this except by looking into
39 * All key operations are protected internally.
41 * Within mac80211, key references are, just as STA structure references,
42 * protected by RCU. Note, however, that some things are unprotected,
43 * namely the key->sta dereferences within the hardware acceleration
44 * functions. This means that sta_info_destroy() must remove the key
45 * which waits for an RCU grace period.
48 static const u8 bcast_addr
[ETH_ALEN
] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
50 static void assert_key_lock(struct ieee80211_local
*local
)
52 WARN_ON(!mutex_is_locked(&local
->key_mtx
));
55 static struct ieee80211_sta
*get_sta_for_key(struct ieee80211_key
*key
)
58 return &key
->sta
->sta
;
63 static void ieee80211_key_enable_hw_accel(struct ieee80211_key
*key
)
65 struct ieee80211_sub_if_data
*sdata
;
66 struct ieee80211_sta
*sta
;
71 if (!key
->local
->ops
->set_key
)
74 assert_key_lock(key
->local
);
76 sta
= get_sta_for_key(key
);
79 if (sdata
->vif
.type
== NL80211_IFTYPE_AP_VLAN
)
80 sdata
= container_of(sdata
->bss
,
81 struct ieee80211_sub_if_data
,
84 ret
= drv_set_key(key
->local
, SET_KEY
, sdata
, sta
, &key
->conf
);
87 key
->flags
|= KEY_FLAG_UPLOADED_TO_HARDWARE
;
89 if (ret
&& ret
!= -ENOSPC
&& ret
!= -EOPNOTSUPP
)
90 printk(KERN_ERR
"mac80211-%s: failed to set key "
91 "(%d, %pM) to hardware (%d)\n",
92 wiphy_name(key
->local
->hw
.wiphy
),
93 key
->conf
.keyidx
, sta
? sta
->addr
: bcast_addr
, ret
);
96 static void ieee80211_key_disable_hw_accel(struct ieee80211_key
*key
)
98 struct ieee80211_sub_if_data
*sdata
;
99 struct ieee80211_sta
*sta
;
104 if (!key
|| !key
->local
->ops
->set_key
)
107 assert_key_lock(key
->local
);
109 if (!(key
->flags
& KEY_FLAG_UPLOADED_TO_HARDWARE
))
112 sta
= get_sta_for_key(key
);
115 if (sdata
->vif
.type
== NL80211_IFTYPE_AP_VLAN
)
116 sdata
= container_of(sdata
->bss
,
117 struct ieee80211_sub_if_data
,
120 ret
= drv_set_key(key
->local
, DISABLE_KEY
, sdata
,
124 printk(KERN_ERR
"mac80211-%s: failed to remove key "
125 "(%d, %pM) from hardware (%d)\n",
126 wiphy_name(key
->local
->hw
.wiphy
),
127 key
->conf
.keyidx
, sta
? sta
->addr
: bcast_addr
, ret
);
129 key
->flags
&= ~KEY_FLAG_UPLOADED_TO_HARDWARE
;
132 static void __ieee80211_set_default_key(struct ieee80211_sub_if_data
*sdata
,
135 struct ieee80211_key
*key
= NULL
;
137 assert_key_lock(sdata
->local
);
139 if (idx
>= 0 && idx
< NUM_DEFAULT_KEYS
)
140 key
= sdata
->keys
[idx
];
142 rcu_assign_pointer(sdata
->default_key
, key
);
145 ieee80211_debugfs_key_remove_default(key
->sdata
);
146 ieee80211_debugfs_key_add_default(key
->sdata
);
150 void ieee80211_set_default_key(struct ieee80211_sub_if_data
*sdata
, int idx
)
152 mutex_lock(&sdata
->local
->key_mtx
);
153 __ieee80211_set_default_key(sdata
, idx
);
154 mutex_unlock(&sdata
->local
->key_mtx
);
158 __ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data
*sdata
, int idx
)
160 struct ieee80211_key
*key
= NULL
;
162 assert_key_lock(sdata
->local
);
164 if (idx
>= NUM_DEFAULT_KEYS
&&
165 idx
< NUM_DEFAULT_KEYS
+ NUM_DEFAULT_MGMT_KEYS
)
166 key
= sdata
->keys
[idx
];
168 rcu_assign_pointer(sdata
->default_mgmt_key
, key
);
171 ieee80211_debugfs_key_remove_mgmt_default(key
->sdata
);
172 ieee80211_debugfs_key_add_mgmt_default(key
->sdata
);
176 void ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data
*sdata
,
179 mutex_lock(&sdata
->local
->key_mtx
);
180 __ieee80211_set_default_mgmt_key(sdata
, idx
);
181 mutex_unlock(&sdata
->local
->key_mtx
);
185 static void __ieee80211_key_replace(struct ieee80211_sub_if_data
*sdata
,
186 struct sta_info
*sta
,
187 struct ieee80211_key
*old
,
188 struct ieee80211_key
*new)
190 int idx
, defkey
, defmgmtkey
;
193 list_add(&new->list
, &sdata
->key_list
);
196 rcu_assign_pointer(sta
->key
, new);
198 WARN_ON(new && old
&& new->conf
.keyidx
!= old
->conf
.keyidx
);
201 idx
= old
->conf
.keyidx
;
203 idx
= new->conf
.keyidx
;
205 defkey
= old
&& sdata
->default_key
== old
;
206 defmgmtkey
= old
&& sdata
->default_mgmt_key
== old
;
209 __ieee80211_set_default_key(sdata
, -1);
210 if (defmgmtkey
&& !new)
211 __ieee80211_set_default_mgmt_key(sdata
, -1);
213 rcu_assign_pointer(sdata
->keys
[idx
], new);
215 __ieee80211_set_default_key(sdata
, new->conf
.keyidx
);
216 if (defmgmtkey
&& new)
217 __ieee80211_set_default_mgmt_key(sdata
,
223 * We'll use an empty list to indicate that the key
224 * has already been removed.
226 list_del_init(&old
->list
);
230 struct ieee80211_key
*ieee80211_key_alloc(enum ieee80211_key_alg alg
,
234 size_t seq_len
, const u8
*seq
)
236 struct ieee80211_key
*key
;
239 BUG_ON(idx
< 0 || idx
>= NUM_DEFAULT_KEYS
+ NUM_DEFAULT_MGMT_KEYS
);
241 key
= kzalloc(sizeof(struct ieee80211_key
) + key_len
, GFP_KERNEL
);
246 * Default to software encryption; we'll later upload the
247 * key to the hardware if possible.
253 key
->conf
.keyidx
= idx
;
254 key
->conf
.keylen
= key_len
;
257 key
->conf
.iv_len
= WEP_IV_LEN
;
258 key
->conf
.icv_len
= WEP_ICV_LEN
;
261 key
->conf
.iv_len
= TKIP_IV_LEN
;
262 key
->conf
.icv_len
= TKIP_ICV_LEN
;
264 for (i
= 0; i
< NUM_RX_DATA_QUEUES
; i
++) {
265 key
->u
.tkip
.rx
[i
].iv32
=
266 get_unaligned_le32(&seq
[2]);
267 key
->u
.tkip
.rx
[i
].iv16
=
268 get_unaligned_le16(seq
);
273 key
->conf
.iv_len
= CCMP_HDR_LEN
;
274 key
->conf
.icv_len
= CCMP_MIC_LEN
;
276 for (i
= 0; i
< NUM_RX_DATA_QUEUES
+ 1; i
++)
277 for (j
= 0; j
< CCMP_PN_LEN
; j
++)
278 key
->u
.ccmp
.rx_pn
[i
][j
] =
279 seq
[CCMP_PN_LEN
- j
- 1];
283 key
->conf
.iv_len
= 0;
284 key
->conf
.icv_len
= sizeof(struct ieee80211_mmie
);
286 for (j
= 0; j
< 6; j
++)
287 key
->u
.aes_cmac
.rx_pn
[j
] = seq
[6 - j
- 1];
290 memcpy(key
->conf
.key
, key_data
, key_len
);
291 INIT_LIST_HEAD(&key
->list
);
293 if (alg
== ALG_CCMP
) {
295 * Initialize AES key state here as an optimization so that
296 * it does not need to be initialized for every packet.
298 key
->u
.ccmp
.tfm
= ieee80211_aes_key_setup_encrypt(key_data
);
299 if (!key
->u
.ccmp
.tfm
) {
305 if (alg
== ALG_AES_CMAC
) {
307 * Initialize AES key state here as an optimization so that
308 * it does not need to be initialized for every packet.
310 key
->u
.aes_cmac
.tfm
=
311 ieee80211_aes_cmac_key_setup(key_data
);
312 if (!key
->u
.aes_cmac
.tfm
) {
321 static void __ieee80211_key_destroy(struct ieee80211_key
*key
)
327 ieee80211_key_disable_hw_accel(key
);
329 if (key
->conf
.alg
== ALG_CCMP
)
330 ieee80211_aes_key_free(key
->u
.ccmp
.tfm
);
331 if (key
->conf
.alg
== ALG_AES_CMAC
)
332 ieee80211_aes_cmac_key_free(key
->u
.aes_cmac
.tfm
);
334 ieee80211_debugfs_key_remove(key
);
339 void ieee80211_key_link(struct ieee80211_key
*key
,
340 struct ieee80211_sub_if_data
*sdata
,
341 struct sta_info
*sta
)
343 struct ieee80211_key
*old_key
;
349 idx
= key
->conf
.keyidx
;
350 key
->local
= sdata
->local
;
356 * some hardware cannot handle TKIP with QoS, so
357 * we indicate whether QoS could be in use.
359 if (test_sta_flags(sta
, WLAN_STA_WME
))
360 key
->conf
.flags
|= IEEE80211_KEY_FLAG_WMM_STA
;
363 * This key is for a specific sta interface,
364 * inform the driver that it should try to store
365 * this key as pairwise key.
367 key
->conf
.flags
|= IEEE80211_KEY_FLAG_PAIRWISE
;
369 if (sdata
->vif
.type
== NL80211_IFTYPE_STATION
) {
373 * We're getting a sta pointer in,
374 * so must be under RCU read lock.
377 /* same here, the AP could be using QoS */
378 ap
= sta_info_get(key
->sdata
, key
->sdata
->u
.mgd
.bssid
);
380 if (test_sta_flags(ap
, WLAN_STA_WME
))
382 IEEE80211_KEY_FLAG_WMM_STA
;
387 mutex_lock(&sdata
->local
->key_mtx
);
392 old_key
= sdata
->keys
[idx
];
394 __ieee80211_key_replace(sdata
, sta
, old_key
, key
);
395 __ieee80211_key_destroy(old_key
);
397 ieee80211_debugfs_key_add(key
);
399 ieee80211_key_enable_hw_accel(key
);
401 mutex_unlock(&sdata
->local
->key_mtx
);
404 static void __ieee80211_key_free(struct ieee80211_key
*key
)
407 * Replace key with nothingness if it was ever used.
410 __ieee80211_key_replace(key
->sdata
, key
->sta
,
412 __ieee80211_key_destroy(key
);
415 void ieee80211_key_free(struct ieee80211_local
*local
,
416 struct ieee80211_key
*key
)
421 mutex_lock(&local
->key_mtx
);
422 __ieee80211_key_free(key
);
423 mutex_unlock(&local
->key_mtx
);
426 void ieee80211_enable_keys(struct ieee80211_sub_if_data
*sdata
)
428 struct ieee80211_key
*key
;
432 if (WARN_ON(!ieee80211_sdata_running(sdata
)))
435 mutex_lock(&sdata
->local
->key_mtx
);
437 list_for_each_entry(key
, &sdata
->key_list
, list
)
438 ieee80211_key_enable_hw_accel(key
);
440 mutex_unlock(&sdata
->local
->key_mtx
);
443 void ieee80211_disable_keys(struct ieee80211_sub_if_data
*sdata
)
445 struct ieee80211_key
*key
;
449 mutex_lock(&sdata
->local
->key_mtx
);
451 list_for_each_entry(key
, &sdata
->key_list
, list
)
452 ieee80211_key_disable_hw_accel(key
);
454 mutex_unlock(&sdata
->local
->key_mtx
);
457 void ieee80211_free_keys(struct ieee80211_sub_if_data
*sdata
)
459 struct ieee80211_key
*key
, *tmp
;
461 mutex_lock(&sdata
->local
->key_mtx
);
463 ieee80211_debugfs_key_remove_default(sdata
);
464 ieee80211_debugfs_key_remove_mgmt_default(sdata
);
466 list_for_each_entry_safe(key
, tmp
, &sdata
->key_list
, list
)
467 __ieee80211_key_free(key
);
469 mutex_unlock(&sdata
->local
->key_mtx
);