Line data Source code
1 : /*
2 : * Internal WPA/RSN supplicant state machine definitions
3 : * Copyright (c) 2004-2010, Jouni Malinen <j@w1.fi>
4 : *
5 : * This software may be distributed under the terms of the BSD license.
6 : * See README for more details.
7 : */
8 :
9 : #ifndef WPA_I_H
10 : #define WPA_I_H
11 :
12 : #include "utils/list.h"
13 :
14 : struct wpa_peerkey;
15 : struct wpa_tdls_peer;
16 : struct wpa_eapol_key;
17 :
18 : /**
19 : * struct wpa_sm - Internal WPA state machine data
20 : */
21 : struct wpa_sm {
22 : u8 pmk[PMK_LEN];
23 : size_t pmk_len;
24 : struct wpa_ptk ptk, tptk;
25 : int ptk_set, tptk_set;
26 : u8 snonce[WPA_NONCE_LEN];
27 : u8 anonce[WPA_NONCE_LEN]; /* ANonce from the last 1/4 msg */
28 : int renew_snonce;
29 : u8 rx_replay_counter[WPA_REPLAY_COUNTER_LEN];
30 : int rx_replay_counter_set;
31 : u8 request_counter[WPA_REPLAY_COUNTER_LEN];
32 :
33 : struct eapol_sm *eapol; /* EAPOL state machine from upper level code */
34 :
35 : struct rsn_pmksa_cache *pmksa; /* PMKSA cache */
36 : struct rsn_pmksa_cache_entry *cur_pmksa; /* current PMKSA entry */
37 : struct dl_list pmksa_candidates;
38 :
39 : struct l2_packet_data *l2_preauth;
40 : struct l2_packet_data *l2_preauth_br;
41 : struct l2_packet_data *l2_tdls;
42 : u8 preauth_bssid[ETH_ALEN]; /* current RSN pre-auth peer or
43 : * 00:00:00:00:00:00 if no pre-auth is
44 : * in progress */
45 : struct eapol_sm *preauth_eapol;
46 :
47 : struct wpa_sm_ctx *ctx;
48 :
49 : void *scard_ctx; /* context for smartcard callbacks */
50 : int fast_reauth; /* whether EAP fast re-authentication is enabled */
51 :
52 : void *network_ctx;
53 : int peerkey_enabled;
54 : int allowed_pairwise_cipher; /* bitfield of WPA_CIPHER_* */
55 : int proactive_key_caching;
56 : int eap_workaround;
57 : void *eap_conf_ctx;
58 : u8 ssid[32];
59 : size_t ssid_len;
60 : int wpa_ptk_rekey;
61 : int p2p;
62 :
63 : u8 own_addr[ETH_ALEN];
64 : const char *ifname;
65 : const char *bridge_ifname;
66 : u8 bssid[ETH_ALEN];
67 :
68 : unsigned int dot11RSNAConfigPMKLifetime;
69 : unsigned int dot11RSNAConfigPMKReauthThreshold;
70 : unsigned int dot11RSNAConfigSATimeout;
71 :
72 : unsigned int dot11RSNA4WayHandshakeFailures;
73 :
74 : /* Selected configuration (based on Beacon/ProbeResp WPA IE) */
75 : unsigned int proto;
76 : unsigned int pairwise_cipher;
77 : unsigned int group_cipher;
78 : unsigned int key_mgmt;
79 : unsigned int mgmt_group_cipher;
80 :
81 : int rsn_enabled; /* Whether RSN is enabled in configuration */
82 : int mfp; /* 0 = disabled, 1 = optional, 2 = mandatory */
83 :
84 : u8 *assoc_wpa_ie; /* Own WPA/RSN IE from (Re)AssocReq */
85 : size_t assoc_wpa_ie_len;
86 : u8 *ap_wpa_ie, *ap_rsn_ie;
87 : size_t ap_wpa_ie_len, ap_rsn_ie_len;
88 :
89 : #ifdef CONFIG_PEERKEY
90 : struct wpa_peerkey *peerkey;
91 : #endif /* CONFIG_PEERKEY */
92 : #ifdef CONFIG_TDLS
93 : struct wpa_tdls_peer *tdls;
94 : int tdls_prohibited;
95 : int tdls_disabled;
96 :
97 : /* The driver supports TDLS */
98 : int tdls_supported;
99 :
100 : /*
101 : * The driver requires explicit discovery/setup/teardown frames sent
102 : * to it via tdls_mgmt.
103 : */
104 : int tdls_external_setup;
105 : #endif /* CONFIG_TDLS */
106 :
107 : #ifdef CONFIG_IEEE80211R
108 : u8 xxkey[PMK_LEN]; /* PSK or the second 256 bits of MSK */
109 : size_t xxkey_len;
110 : u8 pmk_r0[PMK_LEN];
111 : u8 pmk_r0_name[WPA_PMK_NAME_LEN];
112 : u8 pmk_r1[PMK_LEN];
113 : u8 pmk_r1_name[WPA_PMK_NAME_LEN];
114 : u8 mobility_domain[MOBILITY_DOMAIN_ID_LEN];
115 : u8 r0kh_id[FT_R0KH_ID_MAX_LEN];
116 : size_t r0kh_id_len;
117 : u8 r1kh_id[FT_R1KH_ID_LEN];
118 : int ft_completed;
119 : int over_the_ds_in_progress;
120 : u8 target_ap[ETH_ALEN]; /* over-the-DS target AP */
121 : int set_ptk_after_assoc;
122 : u8 mdie_ft_capab; /* FT Capability and Policy from target AP MDIE */
123 : u8 *assoc_resp_ies; /* MDIE and FTIE from (Re)Association Response */
124 : size_t assoc_resp_ies_len;
125 : #endif /* CONFIG_IEEE80211R */
126 :
127 : #ifdef CONFIG_P2P
128 : u8 p2p_ip_addr[3 * 4];
129 : #endif /* CONFIG_P2P */
130 : };
131 :
132 :
133 2571 : static inline void wpa_sm_set_state(struct wpa_sm *sm, enum wpa_states state)
134 : {
135 : WPA_ASSERT(sm->ctx->set_state);
136 2571 : sm->ctx->set_state(sm->ctx->ctx, state);
137 2571 : }
138 :
139 1098 : static inline enum wpa_states wpa_sm_get_state(struct wpa_sm *sm)
140 : {
141 : WPA_ASSERT(sm->ctx->get_state);
142 1098 : return sm->ctx->get_state(sm->ctx->ctx);
143 : }
144 :
145 28 : static inline void wpa_sm_deauthenticate(struct wpa_sm *sm, int reason_code)
146 : {
147 : WPA_ASSERT(sm->ctx->deauthenticate);
148 28 : sm->ctx->deauthenticate(sm->ctx->ctx, reason_code);
149 28 : }
150 :
151 1421 : static inline int wpa_sm_set_key(struct wpa_sm *sm, enum wpa_alg alg,
152 : const u8 *addr, int key_idx, int set_tx,
153 : const u8 *seq, size_t seq_len,
154 : const u8 *key, size_t key_len)
155 : {
156 : WPA_ASSERT(sm->ctx->set_key);
157 1421 : return sm->ctx->set_key(sm->ctx->ctx, alg, addr, key_idx, set_tx,
158 : seq, seq_len, key, key_len);
159 : }
160 :
161 654 : static inline void * wpa_sm_get_network_ctx(struct wpa_sm *sm)
162 : {
163 : WPA_ASSERT(sm->ctx->get_network_ctx);
164 654 : return sm->ctx->get_network_ctx(sm->ctx->ctx);
165 : }
166 :
167 12 : static inline int wpa_sm_get_bssid(struct wpa_sm *sm, u8 *bssid)
168 : {
169 : WPA_ASSERT(sm->ctx->get_bssid);
170 12 : return sm->ctx->get_bssid(sm->ctx->ctx, bssid);
171 : }
172 :
173 1312 : static inline int wpa_sm_ether_send(struct wpa_sm *sm, const u8 *dest,
174 : u16 proto, const u8 *buf, size_t len)
175 : {
176 : WPA_ASSERT(sm->ctx->ether_send);
177 1312 : return sm->ctx->ether_send(sm->ctx->ctx, dest, proto, buf, len);
178 : }
179 :
180 14 : static inline int wpa_sm_get_beacon_ie(struct wpa_sm *sm)
181 : {
182 : WPA_ASSERT(sm->ctx->get_beacon_ie);
183 14 : return sm->ctx->get_beacon_ie(sm->ctx->ctx);
184 : }
185 :
186 648 : static inline void wpa_sm_cancel_auth_timeout(struct wpa_sm *sm)
187 : {
188 : WPA_ASSERT(sm->ctx->cancel_auth_timeout);
189 648 : sm->ctx->cancel_auth_timeout(sm->ctx->ctx);
190 648 : }
191 :
192 1316 : static inline u8 * wpa_sm_alloc_eapol(struct wpa_sm *sm, u8 type,
193 : const void *data, u16 data_len,
194 : size_t *msg_len, void **data_pos)
195 : {
196 : WPA_ASSERT(sm->ctx->alloc_eapol);
197 1316 : return sm->ctx->alloc_eapol(sm->ctx->ctx, type, data, data_len,
198 : msg_len, data_pos);
199 : }
200 :
201 274 : static inline int wpa_sm_add_pmkid(struct wpa_sm *sm, const u8 *bssid,
202 : const u8 *pmkid)
203 : {
204 : WPA_ASSERT(sm->ctx->add_pmkid);
205 274 : return sm->ctx->add_pmkid(sm->ctx->ctx, bssid, pmkid);
206 : }
207 :
208 274 : static inline int wpa_sm_remove_pmkid(struct wpa_sm *sm, const u8 *bssid,
209 : const u8 *pmkid)
210 : {
211 : WPA_ASSERT(sm->ctx->remove_pmkid);
212 274 : return sm->ctx->remove_pmkid(sm->ctx->ctx, bssid, pmkid);
213 : }
214 :
215 1260 : static inline int wpa_sm_mlme_setprotection(struct wpa_sm *sm, const u8 *addr,
216 : int protect_type, int key_type)
217 : {
218 : WPA_ASSERT(sm->ctx->mlme_setprotection);
219 1260 : return sm->ctx->mlme_setprotection(sm->ctx->ctx, addr, protect_type,
220 : key_type);
221 : }
222 :
223 106 : static inline int wpa_sm_update_ft_ies(struct wpa_sm *sm, const u8 *md,
224 : const u8 *ies, size_t ies_len)
225 : {
226 106 : if (sm->ctx->update_ft_ies)
227 106 : return sm->ctx->update_ft_ies(sm->ctx->ctx, md, ies, ies_len);
228 0 : return -1;
229 : }
230 :
231 13 : static inline int wpa_sm_send_ft_action(struct wpa_sm *sm, u8 action,
232 : const u8 *target_ap,
233 : const u8 *ies, size_t ies_len)
234 : {
235 13 : if (sm->ctx->send_ft_action)
236 13 : return sm->ctx->send_ft_action(sm->ctx->ctx, action, target_ap,
237 : ies, ies_len);
238 0 : return -1;
239 : }
240 :
241 20 : static inline int wpa_sm_mark_authenticated(struct wpa_sm *sm,
242 : const u8 *target_ap)
243 : {
244 20 : if (sm->ctx->mark_authenticated)
245 20 : return sm->ctx->mark_authenticated(sm->ctx->ctx, target_ap);
246 0 : return -1;
247 : }
248 :
249 628 : static inline void wpa_sm_set_rekey_offload(struct wpa_sm *sm)
250 : {
251 628 : if (!sm->ctx->set_rekey_offload)
252 638 : return;
253 1236 : sm->ctx->set_rekey_offload(sm->ctx->ctx, sm->ptk.kek,
254 618 : sm->ptk.kck, sm->rx_replay_counter);
255 : }
256 :
257 : #ifdef CONFIG_TDLS
258 69 : static inline int wpa_sm_tdls_get_capa(struct wpa_sm *sm,
259 : int *tdls_supported,
260 : int *tdls_ext_setup)
261 : {
262 69 : if (sm->ctx->tdls_get_capa)
263 69 : return sm->ctx->tdls_get_capa(sm->ctx->ctx, tdls_supported,
264 : tdls_ext_setup);
265 0 : return -1;
266 : }
267 :
268 127 : static inline int wpa_sm_send_tdls_mgmt(struct wpa_sm *sm, const u8 *dst,
269 : u8 action_code, u8 dialog_token,
270 : u16 status_code, u32 peer_capab,
271 : const u8 *buf, size_t len)
272 : {
273 127 : if (sm->ctx->send_tdls_mgmt)
274 127 : return sm->ctx->send_tdls_mgmt(sm->ctx->ctx, dst, action_code,
275 : dialog_token, status_code,
276 : peer_capab, buf, len);
277 0 : return -1;
278 : }
279 :
280 145 : static inline int wpa_sm_tdls_oper(struct wpa_sm *sm, int oper,
281 : const u8 *peer)
282 : {
283 145 : if (sm->ctx->tdls_oper)
284 145 : return sm->ctx->tdls_oper(sm->ctx->ctx, oper, peer);
285 0 : return -1;
286 : }
287 :
288 : static inline int
289 87 : wpa_sm_tdls_peer_addset(struct wpa_sm *sm, const u8 *addr, int add,
290 : u16 aid, u16 capability, const u8 *supp_rates,
291 : size_t supp_rates_len,
292 : const struct ieee80211_ht_capabilities *ht_capab,
293 : const struct ieee80211_vht_capabilities *vht_capab,
294 : u8 qosinfo, const u8 *ext_capab, size_t ext_capab_len,
295 : const u8 *supp_channels, size_t supp_channels_len,
296 : const u8 *supp_oper_classes,
297 : size_t supp_oper_classes_len)
298 : {
299 87 : if (sm->ctx->tdls_peer_addset)
300 87 : return sm->ctx->tdls_peer_addset(sm->ctx->ctx, addr, add,
301 : aid, capability, supp_rates,
302 : supp_rates_len, ht_capab,
303 : vht_capab, qosinfo,
304 : ext_capab, ext_capab_len,
305 : supp_channels,
306 : supp_channels_len,
307 : supp_oper_classes,
308 : supp_oper_classes_len);
309 0 : return -1;
310 : }
311 : #endif /* CONFIG_TDLS */
312 :
313 : void wpa_eapol_key_send(struct wpa_sm *sm, const u8 *kck,
314 : int ver, const u8 *dest, u16 proto,
315 : u8 *msg, size_t msg_len, u8 *key_mic);
316 : int wpa_supplicant_send_2_of_4(struct wpa_sm *sm, const unsigned char *dst,
317 : const struct wpa_eapol_key *key,
318 : int ver, const u8 *nonce,
319 : const u8 *wpa_ie, size_t wpa_ie_len,
320 : struct wpa_ptk *ptk);
321 : int wpa_supplicant_send_4_of_4(struct wpa_sm *sm, const unsigned char *dst,
322 : const struct wpa_eapol_key *key,
323 : u16 ver, u16 key_info,
324 : struct wpa_ptk *ptk);
325 :
326 : int wpa_derive_ptk_ft(struct wpa_sm *sm, const unsigned char *src_addr,
327 : const struct wpa_eapol_key *key,
328 : struct wpa_ptk *ptk, size_t ptk_len);
329 :
330 : void wpa_tdls_assoc(struct wpa_sm *sm);
331 : void wpa_tdls_disassoc(struct wpa_sm *sm);
332 :
333 : #endif /* WPA_I_H */
|