Branch data 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 : 1670 : static inline void wpa_sm_set_state(struct wpa_sm *sm, enum wpa_states state)
134 : : {
135 : : WPA_ASSERT(sm->ctx->set_state);
136 : 1670 : sm->ctx->set_state(sm->ctx->ctx, state);
137 : 1670 : }
138 : :
139 : 1248 : static inline enum wpa_states wpa_sm_get_state(struct wpa_sm *sm)
140 : : {
141 : : WPA_ASSERT(sm->ctx->get_state);
142 : 1248 : return sm->ctx->get_state(sm->ctx->ctx);
143 : : }
144 : :
145 : 27 : static inline void wpa_sm_deauthenticate(struct wpa_sm *sm, int reason_code)
146 : : {
147 : : WPA_ASSERT(sm->ctx->deauthenticate);
148 : 27 : sm->ctx->deauthenticate(sm->ctx->ctx, reason_code);
149 : 27 : }
150 : :
151 : 945 : 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 : 945 : return sm->ctx->set_key(sm->ctx->ctx, alg, addr, key_idx, set_tx,
158 : : seq, seq_len, key, key_len);
159 : : }
160 : :
161 : 432 : static inline void * wpa_sm_get_network_ctx(struct wpa_sm *sm)
162 : : {
163 : : WPA_ASSERT(sm->ctx->get_network_ctx);
164 : 432 : return sm->ctx->get_network_ctx(sm->ctx->ctx);
165 : : }
166 : :
167 : 1 : static inline int wpa_sm_get_bssid(struct wpa_sm *sm, u8 *bssid)
168 : : {
169 : : WPA_ASSERT(sm->ctx->get_bssid);
170 : 1 : return sm->ctx->get_bssid(sm->ctx->ctx, bssid);
171 : : }
172 : :
173 : 851 : 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 : 851 : return sm->ctx->ether_send(sm->ctx->ctx, dest, proto, buf, len);
178 : : }
179 : :
180 : 3 : static inline int wpa_sm_get_beacon_ie(struct wpa_sm *sm)
181 : : {
182 : : WPA_ASSERT(sm->ctx->get_beacon_ie);
183 : 3 : return sm->ctx->get_beacon_ie(sm->ctx->ctx);
184 : : }
185 : :
186 : 421 : static inline void wpa_sm_cancel_auth_timeout(struct wpa_sm *sm)
187 : : {
188 : : WPA_ASSERT(sm->ctx->cancel_auth_timeout);
189 : 421 : sm->ctx->cancel_auth_timeout(sm->ctx->ctx);
190 : 421 : }
191 : :
192 : 854 : 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 : 854 : return sm->ctx->alloc_eapol(sm->ctx->ctx, type, data, data_len,
198 : : msg_len, data_pos);
199 : : }
200 : :
201 : 172 : 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 : 172 : return sm->ctx->add_pmkid(sm->ctx->ctx, bssid, pmkid);
206 : : }
207 : :
208 : 172 : 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 : 172 : return sm->ctx->remove_pmkid(sm->ctx->ctx, bssid, pmkid);
213 : : }
214 : :
215 : 816 : 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 : 816 : return sm->ctx->mlme_setprotection(sm->ctx->ctx, addr, protect_type,
220 : : key_type);
221 : : }
222 : :
223 : 76 : 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 [ + - ]: 76 : if (sm->ctx->update_ft_ies)
227 : 76 : return sm->ctx->update_ft_ies(sm->ctx->ctx, md, ies, ies_len);
228 : 76 : return -1;
229 : : }
230 : :
231 : 6 : 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 [ + - ]: 6 : if (sm->ctx->send_ft_action)
236 : 6 : return sm->ctx->send_ft_action(sm->ctx->ctx, action, target_ap,
237 : : ies, ies_len);
238 : 6 : return -1;
239 : : }
240 : :
241 : 16 : static inline int wpa_sm_mark_authenticated(struct wpa_sm *sm,
242 : : const u8 *target_ap)
243 : : {
244 [ + - ]: 16 : if (sm->ctx->mark_authenticated)
245 : 16 : return sm->ctx->mark_authenticated(sm->ctx->ctx, target_ap);
246 : 16 : return -1;
247 : : }
248 : :
249 : 405 : static inline void wpa_sm_set_rekey_offload(struct wpa_sm *sm)
250 : : {
251 [ + + ]: 405 : if (!sm->ctx->set_rekey_offload)
252 : 405 : return;
253 : 403 : sm->ctx->set_rekey_offload(sm->ctx->ctx, sm->ptk.kek,
254 : 403 : sm->ptk.kck, sm->rx_replay_counter);
255 : : }
256 : :
257 : : #ifdef CONFIG_TDLS
258 : 39 : static inline int wpa_sm_tdls_get_capa(struct wpa_sm *sm,
259 : : int *tdls_supported,
260 : : int *tdls_ext_setup)
261 : : {
262 [ + - ]: 39 : if (sm->ctx->tdls_get_capa)
263 : 39 : return sm->ctx->tdls_get_capa(sm->ctx->ctx, tdls_supported,
264 : : tdls_ext_setup);
265 : 39 : return -1;
266 : : }
267 : :
268 : 106 : 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, const u8 *buf,
271 : : size_t len)
272 : : {
273 [ + - ]: 106 : if (sm->ctx->send_tdls_mgmt)
274 : 106 : return sm->ctx->send_tdls_mgmt(sm->ctx->ctx, dst, action_code,
275 : : dialog_token, status_code,
276 : : buf, len);
277 : 106 : return -1;
278 : : }
279 : :
280 : 98 : static inline int wpa_sm_tdls_oper(struct wpa_sm *sm, int oper,
281 : : const u8 *peer)
282 : : {
283 [ + - ]: 98 : if (sm->ctx->tdls_oper)
284 : 98 : return sm->ctx->tdls_oper(sm->ctx->ctx, oper, peer);
285 : 98 : return -1;
286 : : }
287 : :
288 : : static inline int
289 : 81 : 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 [ + - ]: 81 : if (sm->ctx->tdls_peer_addset)
300 : 81 : 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 : 81 : 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 : : const u8 *kde, size_t kde_len,
325 : : struct wpa_ptk *ptk);
326 : :
327 : : int wpa_derive_ptk_ft(struct wpa_sm *sm, const unsigned char *src_addr,
328 : : const struct wpa_eapol_key *key,
329 : : struct wpa_ptk *ptk, size_t ptk_len);
330 : :
331 : : void wpa_tdls_assoc(struct wpa_sm *sm);
332 : : void wpa_tdls_disassoc(struct wpa_sm *sm);
333 : :
334 : : #endif /* WPA_I_H */
|