650e75f2c68bf0f1d3be496454be318fc677c585
[libeap.git] / src / rsn_supp / wpa.h
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 "defs.h"
19 #include "eapol_common.h"
20 #include "wpa_common.h"
21
22 #ifndef ETH_P_EAPOL
23 #define ETH_P_EAPOL 0x888e
24 #endif
25
26 #ifndef ETH_P_RSN_PREAUTH
27 #define ETH_P_RSN_PREAUTH 0x88c7
28 #endif
29
30 struct wpa_sm;
31 struct eapol_sm;
32 struct wpa_config_blob;
33
34 struct wpa_sm_ctx {
35         void *ctx; /* pointer to arbitrary upper level context */
36
37         void (*set_state)(void *ctx, wpa_states state);
38         wpa_states (*get_state)(void *ctx);
39         void (*deauthenticate)(void * ctx, int reason_code); 
40         void (*disassociate)(void *ctx, int reason_code);
41         int (*set_key)(void *ctx, wpa_alg alg,
42                        const u8 *addr, int key_idx, int set_tx,
43                        const u8 *seq, size_t seq_len,
44                        const u8 *key, size_t key_len);
45         void * (*get_network_ctx)(void *ctx);
46         int (*get_bssid)(void *ctx, u8 *bssid);
47         int (*ether_send)(void *ctx, const u8 *dest, u16 proto, const u8 *buf,
48                           size_t len);
49         int (*get_beacon_ie)(void *ctx);
50         void (*cancel_auth_timeout)(void *ctx);
51         u8 * (*alloc_eapol)(void *ctx, u8 type, const void *data, u16 data_len,
52                             size_t *msg_len, void **data_pos);
53         int (*add_pmkid)(void *ctx, const u8 *bssid, const u8 *pmkid);
54         int (*remove_pmkid)(void *ctx, const u8 *bssid, const u8 *pmkid);
55         void (*set_config_blob)(void *ctx, struct wpa_config_blob *blob);
56         const struct wpa_config_blob * (*get_config_blob)(void *ctx,
57                                                           const char *name);
58         int (*mlme_setprotection)(void *ctx, const u8 *addr,
59                                   int protection_type, int key_type);
60         int (*update_ft_ies)(void *ctx, const u8 *md, const u8 *ies,
61                              size_t ies_len);
62         int (*send_ft_action)(void *ctx, u8 action, const u8 *target_ap,
63                               const u8 *ies, size_t ies_len);
64 };
65
66
67 enum 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 };
78
79 struct rsn_supp_config {
80         void *network_ctx;
81         int peerkey_enabled;
82         int allowed_pairwise_cipher; /* bitfield of WPA_CIPHER_* */
83         int proactive_key_caching;
84         int eap_workaround;
85         void *eap_conf_ctx;
86         const u8 *ssid;
87         size_t ssid_len;
88 };
89
90 #ifndef CONFIG_NO_WPA
91
92 struct wpa_sm * wpa_sm_init(struct wpa_sm_ctx *ctx);
93 void wpa_sm_deinit(struct wpa_sm *sm);
94 void wpa_sm_notify_assoc(struct wpa_sm *sm, const u8 *bssid);
95 void wpa_sm_notify_disassoc(struct wpa_sm *sm);
96 void wpa_sm_set_pmk(struct wpa_sm *sm, const u8 *pmk, size_t pmk_len);
97 void wpa_sm_set_pmk_from_pmksa(struct wpa_sm *sm);
98 void wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth);
99 void wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx);
100 void wpa_sm_set_config(struct wpa_sm *sm, struct rsn_supp_config *config);
101 void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr);
102 void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname,
103                        const char *bridge_ifname);
104 void wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol);
105 int wpa_sm_set_assoc_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len);
106 int wpa_sm_set_assoc_wpa_ie_default(struct wpa_sm *sm, u8 *wpa_ie,
107                                     size_t *wpa_ie_len);
108 int wpa_sm_set_ap_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len);
109 int wpa_sm_set_ap_rsn_ie(struct wpa_sm *sm, const u8 *ie, size_t len);
110 int wpa_sm_get_mib(struct wpa_sm *sm, char *buf, size_t buflen);
111
112 int wpa_sm_set_param(struct wpa_sm *sm, enum wpa_sm_conf_params param,
113                      unsigned int value);
114 unsigned int wpa_sm_get_param(struct wpa_sm *sm,
115                               enum wpa_sm_conf_params param);
116
117 int wpa_sm_get_status(struct wpa_sm *sm, char *buf, size_t buflen,
118                       int verbose);
119
120 void wpa_sm_key_request(struct wpa_sm *sm, int error, int pairwise);
121
122 int wpa_parse_wpa_ie(const u8 *wpa_ie, size_t wpa_ie_len,
123                      struct wpa_ie_data *data);
124
125 void wpa_sm_aborted_cached(struct wpa_sm *sm);
126 int wpa_sm_rx_eapol(struct wpa_sm *sm, const u8 *src_addr,
127                     const u8 *buf, size_t len);
128 int wpa_sm_parse_own_wpa_ie(struct wpa_sm *sm, struct wpa_ie_data *data);
129
130 #else /* CONFIG_NO_WPA */
131
132 static inline struct wpa_sm * wpa_sm_init(struct wpa_sm_ctx *ctx)
133 {
134         return (struct wpa_sm *) 1;
135 }
136
137 static inline void wpa_sm_deinit(struct wpa_sm *sm)
138 {
139 }
140
141 static inline void wpa_sm_notify_assoc(struct wpa_sm *sm, const u8 *bssid)
142 {
143 }
144
145 static inline void wpa_sm_notify_disassoc(struct wpa_sm *sm)
146 {
147 }
148
149 static inline void wpa_sm_set_pmk(struct wpa_sm *sm, const u8 *pmk,
150                                   size_t pmk_len)
151 {
152 }
153
154 static inline void wpa_sm_set_pmk_from_pmksa(struct wpa_sm *sm)
155 {
156 }
157
158 static inline void wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth)
159 {
160 }
161
162 static inline void wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx)
163 {
164 }
165
166 static inline void wpa_sm_set_config(struct wpa_sm *sm,
167                                      struct rsn_supp_config *config)
168 {
169 }
170
171 static inline void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr)
172 {
173 }
174
175 static inline void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname,
176                                      const char *bridge_ifname)
177 {
178 }
179
180 static inline void wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol)
181 {
182 }
183
184 static inline int wpa_sm_set_assoc_wpa_ie(struct wpa_sm *sm, const u8 *ie,
185                                           size_t len)
186 {
187         return -1;
188 }
189
190 static inline int wpa_sm_set_assoc_wpa_ie_default(struct wpa_sm *sm,
191                                                   u8 *wpa_ie,
192                                                   size_t *wpa_ie_len)
193 {
194         return -1;
195 }
196
197 static inline int wpa_sm_set_ap_wpa_ie(struct wpa_sm *sm, const u8 *ie,
198                                        size_t len)
199 {
200         return -1;
201 }
202
203 static inline int wpa_sm_set_ap_rsn_ie(struct wpa_sm *sm, const u8 *ie,
204                                        size_t len)
205 {
206         return -1;
207 }
208
209 static inline int wpa_sm_get_mib(struct wpa_sm *sm, char *buf, size_t buflen)
210 {
211         return 0;
212 }
213
214 static inline int wpa_sm_set_param(struct wpa_sm *sm,
215                                    enum wpa_sm_conf_params param,
216                                    unsigned int value)
217 {
218         return -1;
219 }
220
221 static inline unsigned int wpa_sm_get_param(struct wpa_sm *sm,
222                                             enum wpa_sm_conf_params param)
223 {
224         return 0;
225 }
226
227 static inline int wpa_sm_get_status(struct wpa_sm *sm, char *buf,
228                                     size_t buflen, int verbose)
229 {
230         return 0;
231 }
232
233 static inline void wpa_sm_key_request(struct wpa_sm *sm, int error,
234                                       int pairwise)
235 {
236 }
237
238 static inline int wpa_parse_wpa_ie(const u8 *wpa_ie, size_t wpa_ie_len,
239                                    struct wpa_ie_data *data)
240 {
241         return -1;
242 }
243
244 static inline void wpa_sm_aborted_cached(struct wpa_sm *sm)
245 {
246 }
247
248 static inline int wpa_sm_rx_eapol(struct wpa_sm *sm, const u8 *src_addr,
249                                   const u8 *buf, size_t len)
250 {
251         return -1;
252 }
253
254 static inline int wpa_sm_parse_own_wpa_ie(struct wpa_sm *sm,
255                                           struct wpa_ie_data *data)
256 {
257         return -1;
258 }
259
260 #endif /* CONFIG_NO_WPA */
261
262 #ifdef CONFIG_PEERKEY
263 int wpa_sm_stkstart(struct wpa_sm *sm, const u8 *peer);
264 #else /* CONFIG_PEERKEY */
265 static inline int wpa_sm_stkstart(struct wpa_sm *sm, const u8 *peer)
266 {
267         return -1;
268 }
269 #endif /* CONFIG_PEERKEY */
270
271 #ifdef CONFIG_IEEE80211R
272
273 int wpa_sm_set_ft_params(struct wpa_sm *sm, const u8 *mobility_domain,
274                          const u8 *r0kh_id, size_t r0kh_id_len,
275                          const u8 *r1kh_id);
276 int wpa_ft_prepare_auth_request(struct wpa_sm *sm);
277 int wpa_ft_process_response(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
278                             int ft_action, const u8 *target_ap);
279 int wpa_ft_is_completed(struct wpa_sm *sm);
280 int wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies,
281                                  size_t ies_len, const u8 *src_addr);
282 int wpa_ft_start_over_ds(struct wpa_sm *sm, const u8 *target_ap);
283
284 #else /* CONFIG_IEEE80211R */
285
286 static inline int
287 wpa_sm_set_ft_params(struct wpa_sm *sm, const u8 *mobility_domain,
288                      const u8 *r0kh_id, const u8 *r1kh_id)
289 {
290         return 0;
291 }
292
293 static inline int wpa_ft_prepare_auth_request(struct wpa_sm *sm)
294 {
295         return 0;
296 }
297
298 static inline int
299 wpa_ft_process_response(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
300                         int ft_action, const u8 *target_ap)
301 {
302         return 0;
303 }
304
305 static inline int wpa_ft_is_completed(struct wpa_sm *sm)
306 {
307         return 0;
308 }
309
310 static inline int
311 wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
312                              const u8 *src_addr)
313 {
314         return -1;
315 }
316
317 #endif /* CONFIG_IEEE80211R */
318
319 #endif /* WPA_H */