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