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 int wpa_ptk_rekey; 89 }; 90 91 #ifndef CONFIG_NO_WPA 92 93 struct wpa_sm * wpa_sm_init(struct wpa_sm_ctx *ctx); 94 void wpa_sm_deinit(struct wpa_sm *sm); 95 void wpa_sm_notify_assoc(struct wpa_sm *sm, const u8 *bssid); 96 void wpa_sm_notify_disassoc(struct wpa_sm *sm); 97 void wpa_sm_set_pmk(struct wpa_sm *sm, const u8 *pmk, size_t pmk_len); 98 void wpa_sm_set_pmk_from_pmksa(struct wpa_sm *sm); 99 void wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth); 100 void wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx); 101 void wpa_sm_set_config(struct wpa_sm *sm, struct rsn_supp_config *config); 102 void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr); 103 void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname, 104 const char *bridge_ifname); 105 void wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol); 106 int wpa_sm_set_assoc_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len); 107 int wpa_sm_set_assoc_wpa_ie_default(struct wpa_sm *sm, u8 *wpa_ie, 108 size_t *wpa_ie_len); 109 int wpa_sm_set_ap_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len); 110 int wpa_sm_set_ap_rsn_ie(struct wpa_sm *sm, const u8 *ie, size_t len); 111 int wpa_sm_get_mib(struct wpa_sm *sm, char *buf, size_t buflen); 112 113 int wpa_sm_set_param(struct wpa_sm *sm, enum wpa_sm_conf_params param, 114 unsigned int value); 115 unsigned int wpa_sm_get_param(struct wpa_sm *sm, 116 enum wpa_sm_conf_params param); 117 118 int wpa_sm_get_status(struct wpa_sm *sm, char *buf, size_t buflen, 119 int verbose); 120 121 void wpa_sm_key_request(struct wpa_sm *sm, int error, int pairwise); 122 123 int wpa_parse_wpa_ie(const u8 *wpa_ie, size_t wpa_ie_len, 124 struct wpa_ie_data *data); 125 126 void wpa_sm_aborted_cached(struct wpa_sm *sm); 127 int wpa_sm_rx_eapol(struct wpa_sm *sm, const u8 *src_addr, 128 const u8 *buf, size_t len); 129 int wpa_sm_parse_own_wpa_ie(struct wpa_sm *sm, struct wpa_ie_data *data); 130 131 #else /* CONFIG_NO_WPA */ 132 133 static inline struct wpa_sm * wpa_sm_init(struct wpa_sm_ctx *ctx) 134 { 135 return (struct wpa_sm *) 1; 136 } 137 138 static inline void wpa_sm_deinit(struct wpa_sm *sm) 139 { 140 } 141 142 static inline void wpa_sm_notify_assoc(struct wpa_sm *sm, const u8 *bssid) 143 { 144 } 145 146 static inline void wpa_sm_notify_disassoc(struct wpa_sm *sm) 147 { 148 } 149 150 static inline void wpa_sm_set_pmk(struct wpa_sm *sm, const u8 *pmk, 151 size_t pmk_len) 152 { 153 } 154 155 static inline void wpa_sm_set_pmk_from_pmksa(struct wpa_sm *sm) 156 { 157 } 158 159 static inline void wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth) 160 { 161 } 162 163 static inline void wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx) 164 { 165 } 166 167 static inline void wpa_sm_set_config(struct wpa_sm *sm, 168 struct rsn_supp_config *config) 169 { 170 } 171 172 static inline void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr) 173 { 174 } 175 176 static inline void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname, 177 const char *bridge_ifname) 178 { 179 } 180 181 static inline void wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol) 182 { 183 } 184 185 static inline int wpa_sm_set_assoc_wpa_ie(struct wpa_sm *sm, const u8 *ie, 186 size_t len) 187 { 188 return -1; 189 } 190 191 static inline int wpa_sm_set_assoc_wpa_ie_default(struct wpa_sm *sm, 192 u8 *wpa_ie, 193 size_t *wpa_ie_len) 194 { 195 return -1; 196 } 197 198 static inline int wpa_sm_set_ap_wpa_ie(struct wpa_sm *sm, const u8 *ie, 199 size_t len) 200 { 201 return -1; 202 } 203 204 static inline int wpa_sm_set_ap_rsn_ie(struct wpa_sm *sm, const u8 *ie, 205 size_t len) 206 { 207 return -1; 208 } 209 210 static inline int wpa_sm_get_mib(struct wpa_sm *sm, char *buf, size_t buflen) 211 { 212 return 0; 213 } 214 215 static inline int wpa_sm_set_param(struct wpa_sm *sm, 216 enum wpa_sm_conf_params param, 217 unsigned int value) 218 { 219 return -1; 220 } 221 222 static inline unsigned int wpa_sm_get_param(struct wpa_sm *sm, 223 enum wpa_sm_conf_params param) 224 { 225 return 0; 226 } 227 228 static inline int wpa_sm_get_status(struct wpa_sm *sm, char *buf, 229 size_t buflen, int verbose) 230 { 231 return 0; 232 } 233 234 static inline void wpa_sm_key_request(struct wpa_sm *sm, int error, 235 int pairwise) 236 { 237 } 238 239 static inline int wpa_parse_wpa_ie(const u8 *wpa_ie, size_t wpa_ie_len, 240 struct wpa_ie_data *data) 241 { 242 return -1; 243 } 244 245 static inline void wpa_sm_aborted_cached(struct wpa_sm *sm) 246 { 247 } 248 249 static inline int wpa_sm_rx_eapol(struct wpa_sm *sm, const u8 *src_addr, 250 const u8 *buf, size_t len) 251 { 252 return -1; 253 } 254 255 static inline int wpa_sm_parse_own_wpa_ie(struct wpa_sm *sm, 256 struct wpa_ie_data *data) 257 { 258 return -1; 259 } 260 261 #endif /* CONFIG_NO_WPA */ 262 263 #ifdef CONFIG_PEERKEY 264 int wpa_sm_stkstart(struct wpa_sm *sm, const u8 *peer); 265 #else /* CONFIG_PEERKEY */ 266 static inline int wpa_sm_stkstart(struct wpa_sm *sm, const u8 *peer) 267 { 268 return -1; 269 } 270 #endif /* CONFIG_PEERKEY */ 271 272 #ifdef CONFIG_IEEE80211R 273 274 int wpa_sm_set_ft_params(struct wpa_sm *sm, const u8 *mobility_domain, 275 const u8 *r0kh_id, size_t r0kh_id_len, 276 const u8 *r1kh_id); 277 int wpa_ft_prepare_auth_request(struct wpa_sm *sm); 278 int wpa_ft_process_response(struct wpa_sm *sm, const u8 *ies, size_t ies_len, 279 int ft_action, const u8 *target_ap); 280 int wpa_ft_is_completed(struct wpa_sm *sm); 281 int wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies, 282 size_t ies_len, const u8 *src_addr); 283 int wpa_ft_start_over_ds(struct wpa_sm *sm, const u8 *target_ap); 284 285 #else /* CONFIG_IEEE80211R */ 286 287 static inline int 288 wpa_sm_set_ft_params(struct wpa_sm *sm, const u8 *mobility_domain, 289 const u8 *r0kh_id, const u8 *r1kh_id) 290 { 291 return 0; 292 } 293 294 static inline int wpa_ft_prepare_auth_request(struct wpa_sm *sm) 295 { 296 return 0; 297 } 298 299 static inline int 300 wpa_ft_process_response(struct wpa_sm *sm, const u8 *ies, size_t ies_len, 301 int ft_action, const u8 *target_ap) 302 { 303 return 0; 304 } 305 306 static inline int wpa_ft_is_completed(struct wpa_sm *sm) 307 { 308 return 0; 309 } 310 311 static inline int 312 wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies, size_t ies_len, 313 const u8 *src_addr) 314 { 315 return -1; 316 } 317 318 #endif /* CONFIG_IEEE80211R */ 319 320 #endif /* WPA_H */ 321