wpa.h revision 8d520ff1dc2da35cdca849e982051b86468016d8
1/*
2 * wpa_supplicant - WPA definitions
3 * Copyright (c) 2003-2007, Jouni Malinen <j@w1.fi>
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_H
16#define WPA_H
17
18#include "common/defs.h"
19#include "common/eapol_common.h"
20#include "common/wpa_common.h"
21
22struct wpa_sm;
23struct eapol_sm;
24struct wpa_config_blob;
25
26struct wpa_sm_ctx {
27	void *ctx; /* pointer to arbitrary upper level context */
28	void *msg_ctx; /* upper level context for wpa_msg() calls */
29
30	void (*set_state)(void *ctx, enum wpa_states state);
31	enum wpa_states (*get_state)(void *ctx);
32	void (*deauthenticate)(void * ctx, int reason_code);
33	void (*disassociate)(void *ctx, int reason_code);
34	int (*set_key)(void *ctx, enum wpa_alg alg,
35		       const u8 *addr, int key_idx, int set_tx,
36		       const u8 *seq, size_t seq_len,
37		       const u8 *key, size_t key_len);
38	void * (*get_network_ctx)(void *ctx);
39	int (*get_bssid)(void *ctx, u8 *bssid);
40	int (*ether_send)(void *ctx, const u8 *dest, u16 proto, const u8 *buf,
41			  size_t len);
42	int (*get_beacon_ie)(void *ctx);
43	void (*cancel_auth_timeout)(void *ctx);
44	u8 * (*alloc_eapol)(void *ctx, u8 type, const void *data, u16 data_len,
45			    size_t *msg_len, void **data_pos);
46	int (*add_pmkid)(void *ctx, const u8 *bssid, const u8 *pmkid);
47	int (*remove_pmkid)(void *ctx, const u8 *bssid, const u8 *pmkid);
48	void (*set_config_blob)(void *ctx, struct wpa_config_blob *blob);
49	const struct wpa_config_blob * (*get_config_blob)(void *ctx,
50							  const char *name);
51	int (*mlme_setprotection)(void *ctx, const u8 *addr,
52				  int protection_type, int key_type);
53	int (*update_ft_ies)(void *ctx, const u8 *md, const u8 *ies,
54			     size_t ies_len);
55	int (*send_ft_action)(void *ctx, u8 action, const u8 *target_ap,
56			      const u8 *ies, size_t ies_len);
57	int (*mark_authenticated)(void *ctx, const u8 *target_ap);
58#ifdef CONFIG_TDLS
59	int (*send_tdls_mgmt)(void *ctx, const u8 *dst,
60			      u8 action_code, u8 dialog_token,
61			      u16 status_code, const u8 *buf, size_t len);
62	int (*tdls_oper)(void *ctx, int oper, const u8 *peer);
63#endif /* CONFIG_TDLS */
64};
65
66
67enum wpa_sm_conf_params {
68	RSNA_PMK_LIFETIME /* dot11RSNAConfigPMKLifetime */,
69	RSNA_PMK_REAUTH_THRESHOLD /* dot11RSNAConfigPMKReauthThreshold */,
70	RSNA_SA_TIMEOUT /* dot11RSNAConfigSATimeout */,
71	WPA_PARAM_PROTO,
72	WPA_PARAM_PAIRWISE,
73	WPA_PARAM_GROUP,
74	WPA_PARAM_KEY_MGMT,
75	WPA_PARAM_MGMT_GROUP,
76	WPA_PARAM_RSN_ENABLED,
77	WPA_PARAM_MFP
78};
79
80struct rsn_supp_config {
81	void *network_ctx;
82	int peerkey_enabled;
83	int allowed_pairwise_cipher; /* bitfield of WPA_CIPHER_* */
84	int proactive_key_caching;
85	int eap_workaround;
86	void *eap_conf_ctx;
87	const u8 *ssid;
88	size_t ssid_len;
89	int wpa_ptk_rekey;
90};
91
92#ifndef CONFIG_NO_WPA
93
94struct wpa_sm * wpa_sm_init(struct wpa_sm_ctx *ctx);
95void wpa_sm_deinit(struct wpa_sm *sm);
96void wpa_sm_notify_assoc(struct wpa_sm *sm, const u8 *bssid);
97void wpa_sm_notify_disassoc(struct wpa_sm *sm);
98void wpa_sm_set_pmk(struct wpa_sm *sm, const u8 *pmk, size_t pmk_len);
99void wpa_sm_set_pmk_from_pmksa(struct wpa_sm *sm);
100void wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth);
101void wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx);
102void wpa_sm_set_config(struct wpa_sm *sm, struct rsn_supp_config *config);
103void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr);
104void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname,
105		       const char *bridge_ifname);
106void wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol);
107int wpa_sm_set_assoc_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len);
108int wpa_sm_set_assoc_wpa_ie_default(struct wpa_sm *sm, u8 *wpa_ie,
109				    size_t *wpa_ie_len);
110int wpa_sm_set_ap_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len);
111int wpa_sm_set_ap_rsn_ie(struct wpa_sm *sm, const u8 *ie, size_t len);
112int wpa_sm_get_mib(struct wpa_sm *sm, char *buf, size_t buflen);
113
114int wpa_sm_set_param(struct wpa_sm *sm, enum wpa_sm_conf_params param,
115		     unsigned int value);
116unsigned int wpa_sm_get_param(struct wpa_sm *sm,
117			      enum wpa_sm_conf_params param);
118
119int wpa_sm_get_status(struct wpa_sm *sm, char *buf, size_t buflen,
120		      int verbose);
121
122void wpa_sm_key_request(struct wpa_sm *sm, int error, int pairwise);
123
124int wpa_parse_wpa_ie(const u8 *wpa_ie, size_t wpa_ie_len,
125		     struct wpa_ie_data *data);
126
127void wpa_sm_aborted_cached(struct wpa_sm *sm);
128int wpa_sm_rx_eapol(struct wpa_sm *sm, const u8 *src_addr,
129		    const u8 *buf, size_t len);
130int wpa_sm_parse_own_wpa_ie(struct wpa_sm *sm, struct wpa_ie_data *data);
131int wpa_sm_pmksa_cache_list(struct wpa_sm *sm, char *buf, size_t len);
132void wpa_sm_drop_sa(struct wpa_sm *sm);
133int wpa_sm_has_ptk(struct wpa_sm *sm);
134
135#else /* CONFIG_NO_WPA */
136
137static inline struct wpa_sm * wpa_sm_init(struct wpa_sm_ctx *ctx)
138{
139	return (struct wpa_sm *) 1;
140}
141
142static inline void wpa_sm_deinit(struct wpa_sm *sm)
143{
144}
145
146static inline void wpa_sm_notify_assoc(struct wpa_sm *sm, const u8 *bssid)
147{
148}
149
150static inline void wpa_sm_notify_disassoc(struct wpa_sm *sm)
151{
152}
153
154static inline void wpa_sm_set_pmk(struct wpa_sm *sm, const u8 *pmk,
155				  size_t pmk_len)
156{
157}
158
159static inline void wpa_sm_set_pmk_from_pmksa(struct wpa_sm *sm)
160{
161}
162
163static inline void wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth)
164{
165}
166
167static inline void wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx)
168{
169}
170
171static inline void wpa_sm_set_config(struct wpa_sm *sm,
172				     struct rsn_supp_config *config)
173{
174}
175
176static inline void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr)
177{
178}
179
180static inline void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname,
181				     const char *bridge_ifname)
182{
183}
184
185static inline void wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol)
186{
187}
188
189static inline int wpa_sm_set_assoc_wpa_ie(struct wpa_sm *sm, const u8 *ie,
190					  size_t len)
191{
192	return -1;
193}
194
195static inline int wpa_sm_set_assoc_wpa_ie_default(struct wpa_sm *sm,
196						  u8 *wpa_ie,
197						  size_t *wpa_ie_len)
198{
199	return -1;
200}
201
202static inline int wpa_sm_set_ap_wpa_ie(struct wpa_sm *sm, const u8 *ie,
203				       size_t len)
204{
205	return -1;
206}
207
208static inline int wpa_sm_set_ap_rsn_ie(struct wpa_sm *sm, const u8 *ie,
209				       size_t len)
210{
211	return -1;
212}
213
214static inline int wpa_sm_get_mib(struct wpa_sm *sm, char *buf, size_t buflen)
215{
216	return 0;
217}
218
219static inline int wpa_sm_set_param(struct wpa_sm *sm,
220				   enum wpa_sm_conf_params param,
221				   unsigned int value)
222{
223	return -1;
224}
225
226static inline unsigned int wpa_sm_get_param(struct wpa_sm *sm,
227					    enum wpa_sm_conf_params param)
228{
229	return 0;
230}
231
232static inline int wpa_sm_get_status(struct wpa_sm *sm, char *buf,
233				    size_t buflen, int verbose)
234{
235	return 0;
236}
237
238static inline void wpa_sm_key_request(struct wpa_sm *sm, int error,
239				      int pairwise)
240{
241}
242
243static inline int wpa_parse_wpa_ie(const u8 *wpa_ie, size_t wpa_ie_len,
244				   struct wpa_ie_data *data)
245{
246	return -1;
247}
248
249static inline void wpa_sm_aborted_cached(struct wpa_sm *sm)
250{
251}
252
253static inline int wpa_sm_rx_eapol(struct wpa_sm *sm, const u8 *src_addr,
254				  const u8 *buf, size_t len)
255{
256	return -1;
257}
258
259static inline int wpa_sm_parse_own_wpa_ie(struct wpa_sm *sm,
260					  struct wpa_ie_data *data)
261{
262	return -1;
263}
264
265static inline int wpa_sm_pmksa_cache_list(struct wpa_sm *sm, char *buf,
266					  size_t len)
267{
268	return -1;
269}
270
271static inline void wpa_sm_drop_sa(struct wpa_sm *sm)
272{
273}
274
275static inline int wpa_sm_has_ptk(struct wpa_sm *sm)
276{
277	return 0;
278}
279
280#endif /* CONFIG_NO_WPA */
281
282#ifdef CONFIG_PEERKEY
283int wpa_sm_stkstart(struct wpa_sm *sm, const u8 *peer);
284#else /* CONFIG_PEERKEY */
285static inline int wpa_sm_stkstart(struct wpa_sm *sm, const u8 *peer)
286{
287	return -1;
288}
289#endif /* CONFIG_PEERKEY */
290
291#ifdef CONFIG_IEEE80211R
292
293int wpa_sm_set_ft_params(struct wpa_sm *sm, const u8 *ies, size_t ies_len);
294int wpa_ft_prepare_auth_request(struct wpa_sm *sm, const u8 *mdie);
295int wpa_ft_process_response(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
296			    int ft_action, const u8 *target_ap,
297			    const u8 *ric_ies, size_t ric_ies_len);
298int wpa_ft_is_completed(struct wpa_sm *sm);
299int wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies,
300				 size_t ies_len, const u8 *src_addr);
301int wpa_ft_start_over_ds(struct wpa_sm *sm, const u8 *target_ap,
302			 const u8 *mdie);
303
304#else /* CONFIG_IEEE80211R */
305
306static inline int
307wpa_sm_set_ft_params(struct wpa_sm *sm, const u8 *ies, size_t ies_len)
308{
309	return 0;
310}
311
312static inline int wpa_ft_prepare_auth_request(struct wpa_sm *sm,
313					      const u8 *mdie)
314{
315	return 0;
316}
317
318static inline int
319wpa_ft_process_response(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
320			int ft_action, const u8 *target_ap)
321{
322	return 0;
323}
324
325static inline int wpa_ft_is_completed(struct wpa_sm *sm)
326{
327	return 0;
328}
329
330static inline int
331wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
332			     const u8 *src_addr)
333{
334	return -1;
335}
336
337#endif /* CONFIG_IEEE80211R */
338
339
340/* tdls.c */
341void wpa_tdls_ap_ies(struct wpa_sm *sm, const u8 *ies, size_t len);
342void wpa_tdls_assoc_resp_ies(struct wpa_sm *sm, const u8 *ies, size_t len);
343int wpa_tdls_start(struct wpa_sm *sm, const u8 *addr);
344int wpa_tdls_reneg(struct wpa_sm *sm, const u8 *addr);
345int wpa_tdls_recv_teardown_notify(struct wpa_sm *sm, const u8 *addr,
346				  u16 reason_code);
347int wpa_tdls_init(struct wpa_sm *sm);
348void wpa_tdls_deinit(struct wpa_sm *sm);
349void wpa_tdls_enable(struct wpa_sm *sm, int enabled);
350
351#endif /* WPA_H */
352