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