1
2
3
4
5
6
7
8
9
10#ifndef IEEE80211_KEY_H
11#define IEEE80211_KEY_H
12
13#include <linux/types.h>
14#include <linux/list.h>
15#include <linux/crypto.h>
16#include <linux/rcupdate.h>
17#include <net/mac80211.h>
18
19#define NUM_DEFAULT_KEYS 4
20#define NUM_DEFAULT_MGMT_KEYS 2
21
22struct ieee80211_local;
23struct ieee80211_sub_if_data;
24struct sta_info;
25
26
27
28
29
30
31
32
33enum ieee80211_internal_key_flags {
34 KEY_FLAG_UPLOADED_TO_HARDWARE = BIT(0),
35 KEY_FLAG_TAINTED = BIT(1),
36};
37
38enum ieee80211_internal_tkip_state {
39 TKIP_STATE_NOT_INIT,
40 TKIP_STATE_PHASE1_DONE,
41 TKIP_STATE_PHASE1_HW_UPLOADED,
42};
43
44struct tkip_ctx {
45 u32 iv32;
46 u16 iv16;
47 u16 p1k[5];
48 u32 p1k_iv32;
49 enum ieee80211_internal_tkip_state state;
50};
51
52struct ieee80211_key {
53 struct ieee80211_local *local;
54 struct ieee80211_sub_if_data *sdata;
55 struct sta_info *sta;
56
57
58 struct list_head list;
59
60
61 unsigned int flags;
62
63 union {
64 struct {
65
66 spinlock_t txlock;
67
68
69 struct tkip_ctx tx;
70
71
72 struct tkip_ctx rx[IEEE80211_NUM_TIDS];
73
74
75 u32 mic_failures;
76 } tkip;
77 struct {
78 atomic64_t tx_pn;
79
80
81
82
83
84
85 u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_CCMP_PN_LEN];
86 struct crypto_cipher *tfm;
87 u32 replays;
88 } ccmp;
89 struct {
90 atomic64_t tx_pn;
91 u8 rx_pn[IEEE80211_CMAC_PN_LEN];
92 struct crypto_cipher *tfm;
93 u32 replays;
94 u32 icverrors;
95 } aes_cmac;
96 } u;
97
98
99 int tx_rx_count;
100
101#ifdef CONFIG_MAC80211_DEBUGFS
102 struct {
103 struct dentry *stalink;
104 struct dentry *dir;
105 int cnt;
106 } debugfs;
107#endif
108
109
110
111
112
113 struct ieee80211_key_conf conf;
114};
115
116struct ieee80211_key *ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
117 const u8 *key_data,
118 size_t seq_len, const u8 *seq);
119
120
121
122
123int ieee80211_key_link(struct ieee80211_key *key,
124 struct ieee80211_sub_if_data *sdata,
125 struct sta_info *sta);
126void ieee80211_key_free(struct ieee80211_key *key, bool delay_tailroom);
127void ieee80211_key_free_unused(struct ieee80211_key *key);
128void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx,
129 bool uni, bool multi);
130void ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata,
131 int idx);
132void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata);
133void ieee80211_free_sta_keys(struct ieee80211_local *local,
134 struct sta_info *sta);
135void ieee80211_enable_keys(struct ieee80211_sub_if_data *sdata);
136
137#define key_mtx_dereference(local, ref) \
138 rcu_dereference_protected(ref, lockdep_is_held(&((local)->key_mtx)))
139
140void ieee80211_delayed_tailroom_dec(struct work_struct *wk);
141
142#endif
143