Home | History | Annotate | Line # | Download | only in rsn_supp
      1 /*
      2  * Internal WPA/RSN supplicant state machine definitions
      3  * Copyright (c) 2004-2018, Jouni Malinen <j (at) w1.fi>
      4  *
      5  * This software may be distributed under the terms of the BSD license.
      6  * See README for more details.
      7  */
      8 
      9 #ifndef WPA_I_H
     10 #define WPA_I_H
     11 
     12 #include "utils/list.h"
     13 
     14 struct wpa_tdls_peer;
     15 struct wpa_eapol_key;
     16 
     17 struct pasn_ft_r1kh {
     18 	u8 bssid[ETH_ALEN];
     19 	u8 r1kh_id[FT_R1KH_ID_LEN];
     20 };
     21 
     22 /**
     23  * struct wpa_sm - Internal WPA state machine data
     24  */
     25 struct wpa_sm {
     26 	u8 pmk[PMK_LEN_MAX];
     27 	size_t pmk_len;
     28 	struct wpa_ptk ptk, tptk;
     29 	int ptk_set, tptk_set;
     30 	bool tk_set; /* Whether any TK is configured to the driver */
     31 	unsigned int msg_3_of_4_ok:1;
     32 	u8 snonce[WPA_NONCE_LEN];
     33 	u8 anonce[WPA_NONCE_LEN]; /* ANonce from the last 1/4 msg */
     34 	int renew_snonce;
     35 	u8 rx_replay_counter[WPA_REPLAY_COUNTER_LEN];
     36 	int rx_replay_counter_set;
     37 	u8 request_counter[WPA_REPLAY_COUNTER_LEN];
     38 	struct wpa_gtk gtk;
     39 	struct wpa_gtk gtk_wnm_sleep;
     40 	struct wpa_igtk igtk;
     41 	struct wpa_igtk igtk_wnm_sleep;
     42 	struct wpa_bigtk bigtk;
     43 	struct wpa_bigtk bigtk_wnm_sleep;
     44 
     45 	struct eapol_sm *eapol; /* EAPOL state machine from upper level code */
     46 
     47 	struct rsn_pmksa_cache *pmksa; /* PMKSA cache */
     48 	struct rsn_pmksa_cache_entry *cur_pmksa; /* current PMKSA entry */
     49 	struct dl_list pmksa_candidates;
     50 
     51 	struct l2_packet_data *l2_preauth;
     52 	struct l2_packet_data *l2_preauth_br;
     53 	struct l2_packet_data *l2_tdls;
     54 	u8 preauth_bssid[ETH_ALEN]; /* current RSN pre-auth peer or
     55 				     * 00:00:00:00:00:00 if no pre-auth is
     56 				     * in progress */
     57 	struct eapol_sm *preauth_eapol;
     58 
     59 	struct wpa_sm_ctx *ctx;
     60 
     61 	void *scard_ctx; /* context for smartcard callbacks */
     62 	int fast_reauth; /* whether EAP fast re-authentication is enabled */
     63 
     64 	void *network_ctx;
     65 	int allowed_pairwise_cipher; /* bitfield of WPA_CIPHER_* */
     66 	int proactive_key_caching;
     67 	int eap_workaround;
     68 	void *eap_conf_ctx;
     69 	u8 ssid[32];
     70 	size_t ssid_len;
     71 	int wpa_ptk_rekey;
     72 	int wpa_deny_ptk0_rekey:1;
     73 	int p2p;
     74 	int wpa_rsc_relaxation;
     75 	int owe_ptk_workaround;
     76 	int beacon_prot;
     77 	int ext_key_id; /* whether Extended Key ID is enabled */
     78 	int use_ext_key_id; /* whether Extended Key ID has been detected
     79 			     * to be used */
     80 	int keyidx_active; /* Key ID for the active TK */
     81 
     82 	/*
     83 	 * If set Key Derivation Key should be derived as part of PMK to
     84 	 * PTK derivation regardless of advertised capabilities.
     85 	 */
     86 	bool force_kdk_derivation;
     87 
     88 	u8 own_addr[ETH_ALEN];
     89 	const char *ifname;
     90 	const char *bridge_ifname;
     91 	u8 bssid[ETH_ALEN];
     92 
     93 	unsigned int dot11RSNAConfigPMKLifetime;
     94 	unsigned int dot11RSNAConfigPMKReauthThreshold;
     95 	unsigned int dot11RSNAConfigSATimeout;
     96 
     97 	unsigned int dot11RSNA4WayHandshakeFailures;
     98 
     99 	/* Selected configuration (based on Beacon/ProbeResp WPA IE) */
    100 	unsigned int proto;
    101 	unsigned int pairwise_cipher;
    102 	unsigned int group_cipher;
    103 	unsigned int key_mgmt;
    104 	unsigned int mgmt_group_cipher;
    105 
    106 	int rsn_enabled; /* Whether RSN is enabled in configuration */
    107 	int mfp; /* 0 = disabled, 1 = optional, 2 = mandatory */
    108 	int ocv; /* Operating Channel Validation */
    109 	enum sae_pwe sae_pwe; /* SAE PWE generation options */
    110 
    111 	unsigned int sae_pk:1; /* whether SAE-PK is used */
    112 	unsigned int secure_ltf:1;
    113 	unsigned int secure_rtt:1;
    114 	unsigned int prot_range_neg:1;
    115 	unsigned int ssid_protection:1;
    116 
    117 	u8 *assoc_wpa_ie; /* Own WPA/RSN IE from (Re)AssocReq */
    118 	size_t assoc_wpa_ie_len;
    119 	u8 *assoc_rsnxe; /* Own RSNXE from (Re)AssocReq */
    120 	size_t assoc_rsnxe_len;
    121 	u8 *ap_wpa_ie, *ap_rsn_ie, *ap_rsnxe;
    122 	size_t ap_wpa_ie_len, ap_rsn_ie_len, ap_rsnxe_len;
    123 
    124 #ifdef CONFIG_TDLS
    125 	struct wpa_tdls_peer *tdls;
    126 	int tdls_prohibited;
    127 	int tdls_chan_switch_prohibited;
    128 	int tdls_disabled;
    129 
    130 	/* The driver supports TDLS */
    131 	int tdls_supported;
    132 
    133 	/*
    134 	 * The driver requires explicit discovery/setup/teardown frames sent
    135 	 * to it via tdls_mgmt.
    136 	 */
    137 	int tdls_external_setup;
    138 
    139 	/* The driver supports TDLS channel switching */
    140 	int tdls_chan_switch;
    141 #endif /* CONFIG_TDLS */
    142 
    143 #ifdef CONFIG_IEEE80211R
    144 	u8 xxkey[PMK_LEN_MAX]; /* PSK or the second 256 bits of MSK, or the
    145 				* first 384 bits of MSK */
    146 	size_t xxkey_len;
    147 	u8 pmk_r0[PMK_LEN_MAX];
    148 	size_t pmk_r0_len;
    149 	u8 pmk_r0_name[WPA_PMK_NAME_LEN];
    150 	u8 pmk_r1[PMK_LEN_MAX];
    151 	size_t pmk_r1_len;
    152 	u8 pmk_r1_name[WPA_PMK_NAME_LEN];
    153 	u8 mobility_domain[MOBILITY_DOMAIN_ID_LEN];
    154 	u8 key_mobility_domain[MOBILITY_DOMAIN_ID_LEN];
    155 	u8 r0kh_id[FT_R0KH_ID_MAX_LEN];
    156 	size_t r0kh_id_len;
    157 	u8 r1kh_id[FT_R1KH_ID_LEN];
    158 	unsigned int ft_completed:1;
    159 	unsigned int ft_reassoc_completed:1;
    160 	unsigned int ft_protocol:1;
    161 	int over_the_ds_in_progress;
    162 	u8 target_ap[ETH_ALEN]; /* over-the-DS target AP */
    163 	int set_ptk_after_assoc;
    164 	u8 mdie_ft_capab; /* FT Capability and Policy from target AP MDIE */
    165 	u8 *assoc_resp_ies; /* MDIE and FTIE from (Re)Association Response */
    166 	size_t assoc_resp_ies_len;
    167 #ifdef CONFIG_PASN
    168 	/*
    169 	 * Currently, the WPA state machine stores the PMK-R1, PMK-R1-Name and
    170 	 * R1KH-ID only for the current association. As PMK-R1 is required to
    171 	 * perform PASN authentication with FT, store the R1KH-ID for previous
    172 	 * associations, which would later be used to derive the PMK-R1 as part
    173 	 * of the PASN authentication flow.
    174 	 */
    175 	struct pasn_ft_r1kh *pasn_r1kh;
    176 	unsigned int n_pasn_r1kh;
    177 #endif /* CONFIG_PASN */
    178 #endif /* CONFIG_IEEE80211R */
    179 
    180 #ifdef CONFIG_P2P
    181 	u8 p2p_ip_addr[3 * 4];
    182 #endif /* CONFIG_P2P */
    183 
    184 #ifdef CONFIG_TESTING_OPTIONS
    185 	struct wpabuf *test_assoc_ie;
    186 	struct wpabuf *test_eapol_m2_elems;
    187 	struct wpabuf *test_eapol_m4_elems;
    188 	int ft_rsnxe_used;
    189 	unsigned int oci_freq_override_eapol;
    190 	unsigned int oci_freq_override_eapol_g2;
    191 	unsigned int oci_freq_override_ft_assoc;
    192 	unsigned int oci_freq_override_fils_assoc;
    193 	unsigned int disable_eapol_g2_tx;
    194 	bool encrypt_eapol_m2;
    195 	bool encrypt_eapol_m4;
    196 #endif /* CONFIG_TESTING_OPTIONS */
    197 
    198 #ifdef CONFIG_FILS
    199 	u8 fils_nonce[FILS_NONCE_LEN];
    200 	u8 fils_session[FILS_SESSION_LEN];
    201 	u8 fils_anonce[FILS_NONCE_LEN];
    202 	u8 fils_key_auth_ap[FILS_MAX_KEY_AUTH_LEN];
    203 	u8 fils_key_auth_sta[FILS_MAX_KEY_AUTH_LEN];
    204 	size_t fils_key_auth_len;
    205 	unsigned int fils_completed:1;
    206 	unsigned int fils_erp_pmkid_set:1;
    207 	unsigned int fils_cache_id_set:1;
    208 	u8 fils_erp_pmkid[PMKID_LEN];
    209 	u8 fils_cache_id[FILS_CACHE_ID_LEN];
    210 	struct crypto_ecdh *fils_ecdh;
    211 	int fils_dh_group;
    212 	size_t fils_dh_elem_len;
    213 	struct wpabuf *fils_ft_ies;
    214 	u8 fils_ft[FILS_FT_MAX_LEN];
    215 	size_t fils_ft_len;
    216 #endif /* CONFIG_FILS */
    217 
    218 #ifdef CONFIG_OWE
    219 	struct crypto_ecdh *owe_ecdh;
    220 	u16 owe_group;
    221 #endif /* CONFIG_OWE */
    222 
    223 #ifdef CONFIG_DPP2
    224 	struct wpabuf *dpp_z;
    225 	int dpp_pfs;
    226 #endif /* CONFIG_DPP2 */
    227 	struct wpa_sm_mlo mlo;
    228 
    229 	bool wmm_enabled;
    230 	bool driver_bss_selection;
    231 	bool ft_prepend_pmkid;
    232 };
    233 
    234 
    235 static inline void wpa_sm_set_state(struct wpa_sm *sm, enum wpa_states state)
    236 {
    237 	WPA_ASSERT(sm->ctx->set_state);
    238 	sm->ctx->set_state(sm->ctx->ctx, state);
    239 }
    240 
    241 static inline enum wpa_states wpa_sm_get_state(struct wpa_sm *sm)
    242 {
    243 	WPA_ASSERT(sm->ctx->get_state);
    244 	return sm->ctx->get_state(sm->ctx->ctx);
    245 }
    246 
    247 static inline void wpa_sm_deauthenticate(struct wpa_sm *sm, u16 reason_code)
    248 {
    249 	WPA_ASSERT(sm->ctx->deauthenticate);
    250 	sm->ctx->deauthenticate(sm->ctx->ctx, reason_code);
    251 }
    252 
    253 static inline int wpa_sm_set_key(struct wpa_sm *sm, int link_id,
    254 				 enum wpa_alg alg, const u8 *addr, int key_idx,
    255 				 int set_tx, const u8 *seq, size_t seq_len,
    256 				 const u8 *key, size_t key_len,
    257 				 enum key_flag key_flag)
    258 {
    259 	WPA_ASSERT(sm->ctx->set_key);
    260 	return sm->ctx->set_key(sm->ctx->ctx, link_id, alg, addr, key_idx,
    261 				set_tx, seq, seq_len, key, key_len, key_flag);
    262 }
    263 
    264 static inline void wpa_sm_reconnect(struct wpa_sm *sm)
    265 {
    266 	WPA_ASSERT(sm->ctx->reconnect);
    267 	sm->ctx->reconnect(sm->ctx->ctx);
    268 }
    269 
    270 static inline void * wpa_sm_get_network_ctx(struct wpa_sm *sm)
    271 {
    272 	WPA_ASSERT(sm->ctx->get_network_ctx);
    273 	return sm->ctx->get_network_ctx(sm->ctx->ctx);
    274 }
    275 
    276 static inline int wpa_sm_get_bssid(struct wpa_sm *sm, u8 *bssid)
    277 {
    278 	WPA_ASSERT(sm->ctx->get_bssid);
    279 	return sm->ctx->get_bssid(sm->ctx->ctx, bssid);
    280 }
    281 
    282 static inline int wpa_sm_ether_send(struct wpa_sm *sm, const u8 *dest,
    283 				    u16 proto, const u8 *buf, size_t len)
    284 {
    285 	WPA_ASSERT(sm->ctx->ether_send);
    286 	return sm->ctx->ether_send(sm->ctx->ctx, dest, proto, buf, len);
    287 }
    288 
    289 static inline int wpa_sm_get_beacon_ie(struct wpa_sm *sm)
    290 {
    291 	WPA_ASSERT(sm->ctx->get_beacon_ie);
    292 	return sm->ctx->get_beacon_ie(sm->ctx->ctx);
    293 }
    294 
    295 static inline void wpa_sm_cancel_auth_timeout(struct wpa_sm *sm)
    296 {
    297 	WPA_ASSERT(sm->ctx->cancel_auth_timeout);
    298 	sm->ctx->cancel_auth_timeout(sm->ctx->ctx);
    299 }
    300 
    301 static inline u8 * wpa_sm_alloc_eapol(struct wpa_sm *sm, u8 type,
    302 				      const void *data, u16 data_len,
    303 				      size_t *msg_len, void **data_pos)
    304 {
    305 	WPA_ASSERT(sm->ctx->alloc_eapol);
    306 	return sm->ctx->alloc_eapol(sm->ctx->ctx, type, data, data_len,
    307 				    msg_len, data_pos);
    308 }
    309 
    310 static inline int wpa_sm_add_pmkid(struct wpa_sm *sm, void *network_ctx,
    311 				   const u8 *bssid, const u8 *pmkid,
    312 				   const u8 *cache_id, const u8 *pmk,
    313 				   size_t pmk_len, u32 pmk_lifetime,
    314 				   u8 pmk_reauth_threshold, int akmp)
    315 {
    316 	WPA_ASSERT(sm->ctx->add_pmkid);
    317 	return sm->ctx->add_pmkid(sm->ctx->ctx, network_ctx, bssid, pmkid,
    318 				  cache_id, pmk, pmk_len, pmk_lifetime,
    319 				  pmk_reauth_threshold, akmp);
    320 }
    321 
    322 static inline int wpa_sm_remove_pmkid(struct wpa_sm *sm, void *network_ctx,
    323 				      const u8 *bssid, const u8 *pmkid,
    324 				      const u8 *cache_id)
    325 {
    326 	WPA_ASSERT(sm->ctx->remove_pmkid);
    327 	return sm->ctx->remove_pmkid(sm->ctx->ctx, network_ctx, bssid, pmkid,
    328 				     cache_id);
    329 }
    330 
    331 static inline int wpa_sm_mlme_setprotection(struct wpa_sm *sm, const u8 *addr,
    332 					    int protect_type, int key_type)
    333 {
    334 	WPA_ASSERT(sm->ctx->mlme_setprotection);
    335 	return sm->ctx->mlme_setprotection(sm->ctx->ctx, addr, protect_type,
    336 					   key_type);
    337 }
    338 
    339 static inline int wpa_sm_update_ft_ies(struct wpa_sm *sm, const u8 *md,
    340 				       const u8 *ies, size_t ies_len)
    341 {
    342 	if (sm->ctx->update_ft_ies)
    343 		return sm->ctx->update_ft_ies(sm->ctx->ctx, md, ies, ies_len);
    344 	return -1;
    345 }
    346 
    347 static inline int wpa_sm_send_ft_action(struct wpa_sm *sm, u8 action,
    348 					const u8 *target_ap,
    349 					const u8 *ies, size_t ies_len)
    350 {
    351 	if (sm->ctx->send_ft_action)
    352 		return sm->ctx->send_ft_action(sm->ctx->ctx, action, target_ap,
    353 					       ies, ies_len);
    354 	return -1;
    355 }
    356 
    357 static inline int wpa_sm_mark_authenticated(struct wpa_sm *sm,
    358 					    const u8 *target_ap)
    359 {
    360 	if (sm->ctx->mark_authenticated)
    361 		return sm->ctx->mark_authenticated(sm->ctx->ctx, target_ap);
    362 	return -1;
    363 }
    364 
    365 static inline void wpa_sm_set_rekey_offload(struct wpa_sm *sm)
    366 {
    367 	if (!sm->ctx->set_rekey_offload)
    368 		return;
    369 	sm->ctx->set_rekey_offload(sm->ctx->ctx, sm->ptk.kek, sm->ptk.kek_len,
    370 				   sm->ptk.kck, sm->ptk.kck_len,
    371 				   sm->rx_replay_counter);
    372 }
    373 
    374 #ifdef CONFIG_TDLS
    375 static inline int wpa_sm_tdls_get_capa(struct wpa_sm *sm,
    376 				       int *tdls_supported,
    377 				       int *tdls_ext_setup,
    378 				       int *tdls_chan_switch)
    379 {
    380 	if (sm->ctx->tdls_get_capa)
    381 		return sm->ctx->tdls_get_capa(sm->ctx->ctx, tdls_supported,
    382 					      tdls_ext_setup, tdls_chan_switch);
    383 	return -1;
    384 }
    385 
    386 static inline int wpa_sm_send_tdls_mgmt(struct wpa_sm *sm, const u8 *dst,
    387 					u8 action_code, u8 dialog_token,
    388 					u16 status_code, u32 peer_capab,
    389 					int initiator, const u8 *buf,
    390 					size_t len, int link_id)
    391 {
    392 	if (sm->ctx->send_tdls_mgmt)
    393 		return sm->ctx->send_tdls_mgmt(sm->ctx->ctx, dst, action_code,
    394 					       dialog_token, status_code,
    395 					       peer_capab, initiator, buf,
    396 					       len, link_id);
    397 	return -1;
    398 }
    399 
    400 static inline int wpa_sm_tdls_oper(struct wpa_sm *sm, int oper,
    401 				   const u8 *peer)
    402 {
    403 	if (sm->ctx->tdls_oper)
    404 		return sm->ctx->tdls_oper(sm->ctx->ctx, oper, peer);
    405 	return -1;
    406 }
    407 
    408 static inline int
    409 wpa_sm_tdls_peer_addset(struct wpa_sm *sm, const u8 *addr, int add,
    410 			u16 aid, u16 capability, const u8 *supp_rates,
    411 			size_t supp_rates_len,
    412 			const struct ieee80211_ht_capabilities *ht_capab,
    413 			const struct ieee80211_vht_capabilities *vht_capab,
    414 			const struct ieee80211_he_capabilities *he_capab,
    415 			size_t he_capab_len,
    416 			const struct ieee80211_he_6ghz_band_cap *he_6ghz_capab,
    417 			u8 qosinfo, int wmm, const u8 *ext_capab,
    418 			size_t ext_capab_len, const u8 *supp_channels,
    419 			size_t supp_channels_len, const u8 *supp_oper_classes,
    420 			size_t supp_oper_classes_len,
    421 			const struct ieee80211_eht_capabilities *eht_capab,
    422 			size_t eht_capab_len, int mld_link_id)
    423 {
    424 	if (sm->ctx->tdls_peer_addset)
    425 		return sm->ctx->tdls_peer_addset(sm->ctx->ctx, addr, add,
    426 						 aid, capability, supp_rates,
    427 						 supp_rates_len, ht_capab,
    428 						 vht_capab,
    429 						 he_capab, he_capab_len,
    430 						 he_6ghz_capab, qosinfo, wmm,
    431 						 ext_capab, ext_capab_len,
    432 						 supp_channels,
    433 						 supp_channels_len,
    434 						 supp_oper_classes,
    435 						 supp_oper_classes_len,
    436 						 eht_capab, eht_capab_len,
    437 						 mld_link_id);
    438 	return -1;
    439 }
    440 
    441 static inline int
    442 wpa_sm_tdls_enable_channel_switch(struct wpa_sm *sm, const u8 *addr,
    443 				  u8 oper_class,
    444 				  const struct hostapd_freq_params *freq_params)
    445 {
    446 	if (sm->ctx->tdls_enable_channel_switch)
    447 		return sm->ctx->tdls_enable_channel_switch(sm->ctx->ctx, addr,
    448 							   oper_class,
    449 							   freq_params);
    450 	return -1;
    451 }
    452 
    453 static inline int
    454 wpa_sm_tdls_disable_channel_switch(struct wpa_sm *sm, const u8 *addr)
    455 {
    456 	if (sm->ctx->tdls_disable_channel_switch)
    457 		return sm->ctx->tdls_disable_channel_switch(sm->ctx->ctx, addr);
    458 	return -1;
    459 }
    460 #endif /* CONFIG_TDLS */
    461 
    462 static inline int wpa_sm_key_mgmt_set_pmk(struct wpa_sm *sm,
    463 					  const u8 *pmk, size_t pmk_len)
    464 {
    465 	if (!sm->ctx->key_mgmt_set_pmk)
    466 		return -1;
    467 	return sm->ctx->key_mgmt_set_pmk(sm->ctx->ctx, pmk, pmk_len);
    468 }
    469 
    470 static inline void wpa_sm_fils_hlp_rx(struct wpa_sm *sm,
    471 				      const u8 *dst, const u8 *src,
    472 				      const u8 *pkt, size_t pkt_len)
    473 {
    474 	if (sm->ctx->fils_hlp_rx)
    475 		sm->ctx->fils_hlp_rx(sm->ctx->ctx, dst, src, pkt, pkt_len);
    476 }
    477 
    478 static inline int wpa_sm_channel_info(struct wpa_sm *sm,
    479 				      struct wpa_channel_info *ci)
    480 {
    481 	if (!sm->ctx->channel_info)
    482 		return -1;
    483 	return sm->ctx->channel_info(sm->ctx->ctx, ci);
    484 }
    485 
    486 static inline void wpa_sm_transition_disable(struct wpa_sm *sm, u8 bitmap)
    487 {
    488 	if (sm->ctx->transition_disable)
    489 		sm->ctx->transition_disable(sm->ctx->ctx, bitmap);
    490 }
    491 
    492 static inline void wpa_sm_store_ptk(struct wpa_sm *sm,
    493 				    const u8 *addr, int cipher,
    494 				    u32 life_time, struct wpa_ptk *ptk)
    495 {
    496 	if (sm->ctx->store_ptk)
    497 		sm->ctx->store_ptk(sm->ctx->ctx, addr, cipher, life_time,
    498 				   ptk);
    499 }
    500 
    501 #ifdef CONFIG_PASN
    502 static inline int wpa_sm_set_ltf_keyseed(struct wpa_sm *sm, const u8 *own_addr,
    503 					 const u8 *peer_addr,
    504 					 size_t ltf_keyseed_len,
    505 					 const u8 *ltf_keyseed)
    506 {
    507 	WPA_ASSERT(sm->ctx->set_ltf_keyseed);
    508 	return sm->ctx->set_ltf_keyseed(sm->ctx->ctx, own_addr, peer_addr,
    509 					ltf_keyseed_len, ltf_keyseed);
    510 }
    511 #endif /* CONFIG_PASN */
    512 
    513 static inline void
    514 wpa_sm_notify_pmksa_cache_entry(struct wpa_sm *sm,
    515 				struct rsn_pmksa_cache_entry *entry)
    516 {
    517 	if (sm->ctx->notify_pmksa_cache_entry)
    518 		sm->ctx->notify_pmksa_cache_entry(sm->ctx->ctx, entry);
    519 }
    520 
    521 static inline void wpa_sm_ssid_verified(struct wpa_sm *sm)
    522 {
    523 	if (sm->ctx->ssid_verified)
    524 		sm->ctx->ssid_verified(sm->ctx->ctx);
    525 }
    526 
    527 int wpa_eapol_key_send(struct wpa_sm *sm, struct wpa_ptk *ptk,
    528 		       int ver, const u8 *dest, u16 proto,
    529 		       u8 *msg, size_t msg_len, u8 *key_mic);
    530 int wpa_supplicant_send_2_of_4(struct wpa_sm *sm, const unsigned char *dst,
    531 			       const struct wpa_eapol_key *key,
    532 			       int ver, const u8 *nonce,
    533 			       const u8 *wpa_ie, size_t wpa_ie_len,
    534 			       struct wpa_ptk *ptk);
    535 int wpa_supplicant_send_4_of_4(struct wpa_sm *sm, const unsigned char *dst,
    536 			       const struct wpa_eapol_key *key,
    537 			       u16 ver, u16 key_info,
    538 			       struct wpa_ptk *ptk);
    539 
    540 int wpa_derive_ptk_ft(struct wpa_sm *sm, const unsigned char *src_addr,
    541 		      const struct wpa_eapol_key *key, struct wpa_ptk *ptk);
    542 
    543 void wpa_tdls_assoc(struct wpa_sm *sm);
    544 void wpa_tdls_disassoc(struct wpa_sm *sm);
    545 
    546 #endif /* WPA_I_H */
    547