1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer/* 263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman * Internal WPA/RSN supplicant state machine definitions 36c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke * Copyright (c) 2004-2010, Jouni Malinen <j@w1.fi> 46c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke * 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner * This software may be distributed under the terms of the BSD license. 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner * See README for more details. 763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman */ 86c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 96c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#ifndef WPA_I_H 106c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#define WPA_I_H 116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 1263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman#include "utils/list.h" 139a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson 149a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilsonstruct wpa_peerkey; 159a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilsonstruct wpa_tdls_peer; 169a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilsonstruct wpa_eapol_key; 176c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 186c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke/** 196c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke * struct wpa_sm - Internal WPA state machine data 20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer */ 21551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencerstruct wpa_sm { 22551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer u8 pmk[PMK_LEN]; 231f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer size_t pmk_len; 246c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke struct wpa_ptk ptk, tptk; 256c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke int ptk_set, tptk_set; 266c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke u8 snonce[WPA_NONCE_LEN]; 276c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke u8 anonce[WPA_NONCE_LEN]; /* ANonce from the last 1/4 msg */ 286c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke int renew_snonce; 296c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke u8 rx_replay_counter[WPA_REPLAY_COUNTER_LEN]; 306c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke int rx_replay_counter_set; 316c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke u8 request_counter[WPA_REPLAY_COUNTER_LEN]; 32c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer 336c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke struct eapol_sm *eapol; /* EAPOL state machine from upper level code */ 34c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer 356c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke struct rsn_pmksa_cache *pmksa; /* PMKSA cache */ 36620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke struct rsn_pmksa_cache_entry *cur_pmksa; /* current PMKSA entry */ 37620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke struct dl_list pmksa_candidates; 38c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer 39620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke struct l2_packet_data *l2_preauth; 40c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer struct l2_packet_data *l2_preauth_br; 41620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke struct l2_packet_data *l2_tdls; 42c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer u8 preauth_bssid[ETH_ALEN]; /* current RSN pre-auth peer or 43620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke * 00:00:00:00:00:00 if no pre-auth is 446c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke * in progress */ 45757c1f9d87b516a1e3bc4cd678245b207ae9c559Brian Gaeke struct eapol_sm *preauth_eapol; 466c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 479a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson struct wpa_sm_ctx *ctx; 489a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson 499a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson void *scard_ctx; /* context for smartcard callbacks */ 509a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson int fast_reauth; /* whether EAP fast re-authentication is enabled */ 519a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson 529a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson void *network_ctx; 539a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson int peerkey_enabled; 549a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson int allowed_pairwise_cipher; /* bitfield of WPA_CIPHER_* */ 559a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson int proactive_key_caching; 569a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson int eap_workaround; 579a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson void *eap_conf_ctx; 589a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson u8 ssid[32]; 599a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson size_t ssid_len; 609a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson int wpa_ptk_rekey; 619a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson int p2p; 626c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 639a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson u8 own_addr[ETH_ALEN]; 646c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke const char *ifname; 656c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke const char *bridge_ifname; 666c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke u8 bssid[ETH_ALEN]; 676c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 686c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned int dot11RSNAConfigPMKLifetime; 696c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned int dot11RSNAConfigPMKReauthThreshold; 706c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned int dot11RSNAConfigSATimeout; 716c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 726c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned int dot11RSNA4WayHandshakeFailures; 736c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 746c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke /* Selected configuration (based on Beacon/ProbeResp WPA IE) */ 756c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned int proto; 766c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned int pairwise_cipher; 77fe4591bfc2b147c10d6a7b1a5af56454fb78daceStephen Wilson unsigned int group_cipher; 78314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson unsigned int key_mgmt; 796c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned int mgmt_group_cipher; 809a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson 819a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson int rsn_enabled; /* Whether RSN is enabled in configuration */ 826c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke int mfp; /* 0 = disabled, 1 = optional, 2 = mandatory */ 836c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 84620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke u8 *assoc_wpa_ie; /* Own WPA/RSN IE from (Re)AssocReq */ 85620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke size_t assoc_wpa_ie_len; 86e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke u8 *ap_wpa_ie, *ap_rsn_ie; 879a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson size_t ap_wpa_ie_len, ap_rsn_ie_len; 88c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer 89c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer#ifdef CONFIG_PEERKEY 90c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer struct wpa_peerkey *peerkey; 91620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke#endif /* CONFIG_PEERKEY */ 92620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke#ifdef CONFIG_TDLS 93620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke struct wpa_tdls_peer *tdls; 94c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer int tdls_prohibited; 95c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer int tdls_disabled; 96c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer 97c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer /* The driver supports TDLS */ 98c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer int tdls_supported; 99c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer 100c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer /* 1019a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson * The driver requires explicit discovery/setup/teardown frames sent 1029a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson * to it via tdls_mgmt. 1039a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson */ 1049a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson int tdls_external_setup; 1059a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson#endif /* CONFIG_TDLS */ 106e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke 107620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke#ifdef CONFIG_IEEE80211R 1086c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke u8 xxkey[PMK_LEN]; /* PSK or the second 256 bits of MSK */ 1096c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke size_t xxkey_len; 1106c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke u8 pmk_r0[PMK_LEN]; 1116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke u8 pmk_r0_name[WPA_PMK_NAME_LEN]; 1126c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke u8 pmk_r1[PMK_LEN]; 1136c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke u8 pmk_r1_name[WPA_PMK_NAME_LEN]; 1146c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke u8 mobility_domain[MOBILITY_DOMAIN_ID_LEN]; 1156c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke u8 r0kh_id[FT_R0KH_ID_MAX_LEN]; 1166c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke size_t r0kh_id_len; 1176c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke u8 r1kh_id[FT_R1KH_ID_LEN]; 1186c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke int ft_completed; 1195af8f421b6412e52530608097e39d2602195629fDan Gohman int over_the_ds_in_progress; 1205af8f421b6412e52530608097e39d2602195629fDan Gohman u8 target_ap[ETH_ALEN]; /* over-the-DS target AP */ 1215af8f421b6412e52530608097e39d2602195629fDan Gohman int set_ptk_after_assoc; 1225af8f421b6412e52530608097e39d2602195629fDan Gohman u8 mdie_ft_capab; /* FT Capability and Policy from target AP MDIE */ 1235af8f421b6412e52530608097e39d2602195629fDan Gohman u8 *assoc_resp_ies; /* MDIE and FTIE from (Re)Association Response */ 1245af8f421b6412e52530608097e39d2602195629fDan Gohman size_t assoc_resp_ies_len; 1256c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#endif /* CONFIG_IEEE80211R */ 1266c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 127fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer#ifdef CONFIG_P2P 128fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer u8 p2p_ip_addr[3 * 4]; 129fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer#endif /* CONFIG_P2P */ 130fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer}; 131fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 132fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 133fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline void wpa_sm_set_state(struct wpa_sm *sm, enum wpa_states state) 134fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 135fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer WPA_ASSERT(sm->ctx->set_state); 136fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer sm->ctx->set_state(sm->ctx->ctx, state); 137fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 138fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 139fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline enum wpa_states wpa_sm_get_state(struct wpa_sm *sm) 140fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 141fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer WPA_ASSERT(sm->ctx->get_state); 142fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->get_state(sm->ctx->ctx); 143fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 144fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 145fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline void wpa_sm_deauthenticate(struct wpa_sm *sm, int reason_code) 146fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 147fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer WPA_ASSERT(sm->ctx->deauthenticate); 148fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer sm->ctx->deauthenticate(sm->ctx->ctx, reason_code); 149fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 150fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 151fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline int wpa_sm_set_key(struct wpa_sm *sm, enum wpa_alg alg, 152fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer const u8 *addr, int key_idx, int set_tx, 153fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer const u8 *seq, size_t seq_len, 154fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer const u8 *key, size_t key_len) 155fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 156fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer WPA_ASSERT(sm->ctx->set_key); 157fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->set_key(sm->ctx->ctx, alg, addr, key_idx, set_tx, 158fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer seq, seq_len, key, key_len); 159fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 160fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 161fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline void * wpa_sm_get_network_ctx(struct wpa_sm *sm) 162fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 163fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer WPA_ASSERT(sm->ctx->get_network_ctx); 164fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->get_network_ctx(sm->ctx->ctx); 165fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 166fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 167fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline int wpa_sm_get_bssid(struct wpa_sm *sm, u8 *bssid) 168fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 169fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer WPA_ASSERT(sm->ctx->get_bssid); 170fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->get_bssid(sm->ctx->ctx, bssid); 171fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 172fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 173fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline int wpa_sm_ether_send(struct wpa_sm *sm, const u8 *dest, 174fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer u16 proto, const u8 *buf, size_t len) 175fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 176fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer WPA_ASSERT(sm->ctx->ether_send); 177fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->ether_send(sm->ctx->ctx, dest, proto, buf, len); 178fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 179fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 180fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline int wpa_sm_get_beacon_ie(struct wpa_sm *sm) 181fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 182fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer WPA_ASSERT(sm->ctx->get_beacon_ie); 183fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->get_beacon_ie(sm->ctx->ctx); 184fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 185fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 186fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline void wpa_sm_cancel_auth_timeout(struct wpa_sm *sm) 187fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 188fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer WPA_ASSERT(sm->ctx->cancel_auth_timeout); 189fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer sm->ctx->cancel_auth_timeout(sm->ctx->ctx); 190fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 191fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 192fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline u8 * wpa_sm_alloc_eapol(struct wpa_sm *sm, u8 type, 193fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer const void *data, u16 data_len, 194fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer size_t *msg_len, void **data_pos) 195fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 196fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer WPA_ASSERT(sm->ctx->alloc_eapol); 197fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->alloc_eapol(sm->ctx->ctx, type, data, data_len, 198fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer msg_len, data_pos); 199fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 200fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 201fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline int wpa_sm_add_pmkid(struct wpa_sm *sm, const u8 *bssid, 202fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer const u8 *pmkid) 203fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 204fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer WPA_ASSERT(sm->ctx->add_pmkid); 205fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->add_pmkid(sm->ctx->ctx, bssid, pmkid); 206fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 207fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 208fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline int wpa_sm_remove_pmkid(struct wpa_sm *sm, const u8 *bssid, 209fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer const u8 *pmkid) 210fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 211fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer WPA_ASSERT(sm->ctx->remove_pmkid); 212fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->remove_pmkid(sm->ctx->ctx, bssid, pmkid); 213fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 214fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 215fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline int wpa_sm_mlme_setprotection(struct wpa_sm *sm, const u8 *addr, 216fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer int protect_type, int key_type) 217fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 218fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer WPA_ASSERT(sm->ctx->mlme_setprotection); 219fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->mlme_setprotection(sm->ctx->ctx, addr, protect_type, 220fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer key_type); 221fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 222fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 223fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline int wpa_sm_update_ft_ies(struct wpa_sm *sm, const u8 *md, 224fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer const u8 *ies, size_t ies_len) 225fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 226fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer if (sm->ctx->update_ft_ies) 227fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->update_ft_ies(sm->ctx->ctx, md, ies, ies_len); 228fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return -1; 229fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 230fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 231fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline int wpa_sm_send_ft_action(struct wpa_sm *sm, u8 action, 232fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer const u8 *target_ap, 233fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer const u8 *ies, size_t ies_len) 234fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 235fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer if (sm->ctx->send_ft_action) 236fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->send_ft_action(sm->ctx->ctx, action, target_ap, 237fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer ies, ies_len); 238fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return -1; 239fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 240fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 241fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline int wpa_sm_mark_authenticated(struct wpa_sm *sm, 242fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer const u8 *target_ap) 243fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 244fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer if (sm->ctx->mark_authenticated) 245fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->mark_authenticated(sm->ctx->ctx, target_ap); 246fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return -1; 247fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 248fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 249fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline void wpa_sm_set_rekey_offload(struct wpa_sm *sm) 250fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 25168ef0382e4efe4a4c06e47a53a275b873ba0cff4Evandro Menezes if (!sm->ctx->set_rekey_offload) 252fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return; 253fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer sm->ctx->set_rekey_offload(sm->ctx->ctx, sm->ptk.kek, 254fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer sm->ptk.kck, sm->rx_replay_counter); 255fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 256fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 257fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer#ifdef CONFIG_TDLS 258fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline int wpa_sm_tdls_get_capa(struct wpa_sm *sm, 259fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer int *tdls_supported, 260fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer int *tdls_ext_setup) 261fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 262fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer if (sm->ctx->tdls_get_capa) 263fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->tdls_get_capa(sm->ctx->ctx, tdls_supported, 264fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer tdls_ext_setup); 265fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return -1; 266fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 267fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 268fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline int wpa_sm_send_tdls_mgmt(struct wpa_sm *sm, const u8 *dst, 269fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer u8 action_code, u8 dialog_token, 270fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer u16 status_code, u32 peer_capab, 271fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer int initiator, const u8 *buf, 272fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer size_t len) 273fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 27472062f5744557e270a38192554c3126ea5f97434Tim Northover if (sm->ctx->send_tdls_mgmt) 275fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->send_tdls_mgmt(sm->ctx->ctx, dst, action_code, 276fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer dialog_token, status_code, 277fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer peer_capab, initiator, buf, 278fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer len); 279fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return -1; 280fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 281fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 282fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline int wpa_sm_tdls_oper(struct wpa_sm *sm, int oper, 283fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer const u8 *peer) 284fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer{ 285fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer if (sm->ctx->tdls_oper) 286fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return sm->ctx->tdls_oper(sm->ctx->ctx, oper, peer); 287fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer return -1; 288fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer} 289fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencer 290fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerstatic inline int 291fc61a23506fdad8f38e3437d741a4108339abcfeMichael J. Spencerwpa_sm_tdls_peer_addset(struct wpa_sm *sm, const u8 *addr, int add, 2926c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke u16 aid, u16 capability, const u8 *supp_rates, 2936c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke size_t supp_rates_len, 2946c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke const struct ieee80211_ht_capabilities *ht_capab, 2956c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke const struct ieee80211_vht_capabilities *vht_capab, 296b84551a14f1c96942eb82408652e633543b0961eMichael J. Spencer u8 qosinfo, int wmm, const u8 *ext_capab, 2976c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke size_t ext_capab_len, const u8 *supp_channels, 2986c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke size_t supp_channels_len, const u8 *supp_oper_classes, 2996c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke size_t supp_oper_classes_len) 3006c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke{ 3016c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke if (sm->ctx->tdls_peer_addset) 3026c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke return sm->ctx->tdls_peer_addset(sm->ctx->ctx, addr, add, 3039a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson aid, capability, supp_rates, 3046c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke supp_rates_len, ht_capab, 3056c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke vht_capab, qosinfo, wmm, 3066c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ext_capab, ext_capab_len, 3076c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke supp_channels, 308e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming supp_channels_len, 3095af8f421b6412e52530608097e39d2602195629fDan Gohman supp_oper_classes, 310e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming supp_oper_classes_len); 311e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming return -1; 312e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming} 313e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming#endif /* CONFIG_TDLS */ 314e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming 315e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Flemingvoid wpa_eapol_key_send(struct wpa_sm *sm, const u8 *kck, 316e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming int ver, const u8 *dest, u16 proto, 317e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming u8 *msg, size_t msg_len, u8 *key_mic); 318e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Flemingint wpa_supplicant_send_2_of_4(struct wpa_sm *sm, const unsigned char *dst, 319e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming const struct wpa_eapol_key *key, 320e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming int ver, const u8 *nonce, 321e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming const u8 *wpa_ie, size_t wpa_ie_len, 322e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming struct wpa_ptk *ptk); 323e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Flemingint wpa_supplicant_send_4_of_4(struct wpa_sm *sm, const unsigned char *dst, 324e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming const struct wpa_eapol_key *key, 325e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming u16 ver, u16 key_info, 326e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming struct wpa_ptk *ptk); 327e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming 328e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Flemingint wpa_derive_ptk_ft(struct wpa_sm *sm, const unsigned char *src_addr, 329e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming const struct wpa_eapol_key *key, 3305af8f421b6412e52530608097e39d2602195629fDan Gohman struct wpa_ptk *ptk, size_t ptk_len); 3315af8f421b6412e52530608097e39d2602195629fDan Gohman 332004c82ad7c0d2da761726f063373c28ffd18e66dMatt Flemingvoid wpa_tdls_assoc(struct wpa_sm *sm); 333004c82ad7c0d2da761726f063373c28ffd18e66dMatt Flemingvoid wpa_tdls_disassoc(struct wpa_sm *sm); 334004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming 335004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming#endif /* WPA_I_H */ 336004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming