]> git.ipfire.org Git - thirdparty/hostap.git/blame - src/rsn_supp/wpa_i.h
TDLS: Get TDLS related capabilities from driver
[thirdparty/hostap.git] / src / rsn_supp / wpa_i.h
CommitLineData
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 20struct wpa_peerkey;
281ff0aa 21struct wpa_tdls_peer;
6fc6879b
JM
22struct wpa_eapol_key;
23
24/**
25 * struct wpa_sm - Internal WPA state machine data
26 */
27struct 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 134static 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 140static 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
146static 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
152static 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 158static 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
168static 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
174static 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
180static 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
187static 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
193static 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
199static 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
208static 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
215static 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
222static 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
230static 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
238static 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
248static 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
256static 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
265static 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
275static 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
287static 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
296void 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);
299int 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);
304int 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
310int 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
314void wpa_tdls_assoc(struct wpa_sm *sm);
315void wpa_tdls_disassoc(struct wpa_sm *sm);
316
6fc6879b 317#endif /* WPA_I_H */