Home | History | Annotate | Download | only in rsn_supp
      1 /*
      2  * wpa_supplicant - WPA definitions
      3  * Copyright (c) 2003-2007, Jouni Malinen <j (at) 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 #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 
     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 	WPA_PARAM_MFP
     78 };
     79 
     80 struct 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 
     94 struct wpa_sm * wpa_sm_init(struct wpa_sm_ctx *ctx);
     95 void wpa_sm_deinit(struct wpa_sm *sm);
     96 void wpa_sm_notify_assoc(struct wpa_sm *sm, const u8 *bssid);
     97 void wpa_sm_notify_disassoc(struct wpa_sm *sm);
     98 void wpa_sm_set_pmk(struct wpa_sm *sm, const u8 *pmk, size_t pmk_len);
     99 void wpa_sm_set_pmk_from_pmksa(struct wpa_sm *sm);
    100 void wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth);
    101 void wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx);
    102 void wpa_sm_set_config(struct wpa_sm *sm, struct rsn_supp_config *config);
    103 void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr);
    104 void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname,
    105 		       const char *bridge_ifname);
    106 void wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol);
    107 int wpa_sm_set_assoc_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len);
    108 int wpa_sm_set_assoc_wpa_ie_default(struct wpa_sm *sm, u8 *wpa_ie,
    109 				    size_t *wpa_ie_len);
    110 int wpa_sm_set_ap_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len);
    111 int wpa_sm_set_ap_rsn_ie(struct wpa_sm *sm, const u8 *ie, size_t len);
    112 int wpa_sm_get_mib(struct wpa_sm *sm, char *buf, size_t buflen);
    113 
    114 int wpa_sm_set_param(struct wpa_sm *sm, enum wpa_sm_conf_params param,
    115 		     unsigned int value);
    116 unsigned int wpa_sm_get_param(struct wpa_sm *sm,
    117 			      enum wpa_sm_conf_params param);
    118 
    119 int wpa_sm_get_status(struct wpa_sm *sm, char *buf, size_t buflen,
    120 		      int verbose);
    121 
    122 void wpa_sm_key_request(struct wpa_sm *sm, int error, int pairwise);
    123 
    124 int wpa_parse_wpa_ie(const u8 *wpa_ie, size_t wpa_ie_len,
    125 		     struct wpa_ie_data *data);
    126 
    127 void wpa_sm_aborted_cached(struct wpa_sm *sm);
    128 int wpa_sm_rx_eapol(struct wpa_sm *sm, const u8 *src_addr,
    129 		    const u8 *buf, size_t len);
    130 int wpa_sm_parse_own_wpa_ie(struct wpa_sm *sm, struct wpa_ie_data *data);
    131 int wpa_sm_pmksa_cache_list(struct wpa_sm *sm, char *buf, size_t len);
    132 void wpa_sm_drop_sa(struct wpa_sm *sm);
    133 int wpa_sm_has_ptk(struct wpa_sm *sm);
    134 
    135 #else /* CONFIG_NO_WPA */
    136 
    137 static inline struct wpa_sm * wpa_sm_init(struct wpa_sm_ctx *ctx)
    138 {
    139 	return (struct wpa_sm *) 1;
    140 }
    141 
    142 static inline void wpa_sm_deinit(struct wpa_sm *sm)
    143 {
    144 }
    145 
    146 static inline void wpa_sm_notify_assoc(struct wpa_sm *sm, const u8 *bssid)
    147 {
    148 }
    149 
    150 static inline void wpa_sm_notify_disassoc(struct wpa_sm *sm)
    151 {
    152 }
    153 
    154 static inline void wpa_sm_set_pmk(struct wpa_sm *sm, const u8 *pmk,
    155 				  size_t pmk_len)
    156 {
    157 }
    158 
    159 static inline void wpa_sm_set_pmk_from_pmksa(struct wpa_sm *sm)
    160 {
    161 }
    162 
    163 static inline void wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth)
    164 {
    165 }
    166 
    167 static inline void wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx)
    168 {
    169 }
    170 
    171 static inline void wpa_sm_set_config(struct wpa_sm *sm,
    172 				     struct rsn_supp_config *config)
    173 {
    174 }
    175 
    176 static inline void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr)
    177 {
    178 }
    179 
    180 static inline void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname,
    181 				     const char *bridge_ifname)
    182 {
    183 }
    184 
    185 static inline void wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol)
    186 {
    187 }
    188 
    189 static 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 
    195 static 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 
    202 static 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 
    208 static 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 
    214 static inline int wpa_sm_get_mib(struct wpa_sm *sm, char *buf, size_t buflen)
    215 {
    216 	return 0;
    217 }
    218 
    219 static 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 
    226 static inline unsigned int wpa_sm_get_param(struct wpa_sm *sm,
    227 					    enum wpa_sm_conf_params param)
    228 {
    229 	return 0;
    230 }
    231 
    232 static inline int wpa_sm_get_status(struct wpa_sm *sm, char *buf,
    233 				    size_t buflen, int verbose)
    234 {
    235 	return 0;
    236 }
    237 
    238 static inline void wpa_sm_key_request(struct wpa_sm *sm, int error,
    239 				      int pairwise)
    240 {
    241 }
    242 
    243 static 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 
    249 static inline void wpa_sm_aborted_cached(struct wpa_sm *sm)
    250 {
    251 }
    252 
    253 static 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 
    259 static inline int wpa_sm_parse_own_wpa_ie(struct wpa_sm *sm,
    260 					  struct wpa_ie_data *data)
    261 {
    262 	return -1;
    263 }
    264 
    265 static inline int wpa_sm_pmksa_cache_list(struct wpa_sm *sm, char *buf,
    266 					  size_t len)
    267 {
    268 	return -1;
    269 }
    270 
    271 static inline void wpa_sm_drop_sa(struct wpa_sm *sm)
    272 {
    273 }
    274 
    275 static 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
    283 int wpa_sm_stkstart(struct wpa_sm *sm, const u8 *peer);
    284 #else /* CONFIG_PEERKEY */
    285 static 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 
    293 int wpa_sm_set_ft_params(struct wpa_sm *sm, const u8 *ies, size_t ies_len);
    294 int wpa_ft_prepare_auth_request(struct wpa_sm *sm, const u8 *mdie);
    295 int 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);
    298 int wpa_ft_is_completed(struct wpa_sm *sm);
    299 int wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies,
    300 				 size_t ies_len, const u8 *src_addr);
    301 int wpa_ft_start_over_ds(struct wpa_sm *sm, const u8 *target_ap,
    302 			 const u8 *mdie);
    303 
    304 #else /* CONFIG_IEEE80211R */
    305 
    306 static inline int
    307 wpa_sm_set_ft_params(struct wpa_sm *sm, const u8 *ies, size_t ies_len)
    308 {
    309 	return 0;
    310 }
    311 
    312 static inline int wpa_ft_prepare_auth_request(struct wpa_sm *sm,
    313 					      const u8 *mdie)
    314 {
    315 	return 0;
    316 }
    317 
    318 static inline int
    319 wpa_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 
    325 static inline int wpa_ft_is_completed(struct wpa_sm *sm)
    326 {
    327 	return 0;
    328 }
    329 
    330 static inline int
    331 wpa_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 */
    341 void wpa_tdls_ap_ies(struct wpa_sm *sm, const u8 *ies, size_t len);
    342 void wpa_tdls_assoc_resp_ies(struct wpa_sm *sm, const u8 *ies, size_t len);
    343 int wpa_tdls_start(struct wpa_sm *sm, const u8 *addr);
    344 int wpa_tdls_reneg(struct wpa_sm *sm, const u8 *addr);
    345 int wpa_tdls_recv_teardown_notify(struct wpa_sm *sm, const u8 *addr,
    346 				  u16 reason_code);
    347 int wpa_tdls_init(struct wpa_sm *sm);
    348 void wpa_tdls_deinit(struct wpa_sm *sm);
    349 void wpa_tdls_enable(struct wpa_sm *sm, int enabled);
    350 
    351 #endif /* WPA_H */
    352