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