Home | History | Annotate | Download | only in rsn_supp

Lines Matching refs:sm

94  * @sm: Pointer to WPA state machine data from wpa_sm_init()
103 void wpa_eapol_key_send(struct wpa_sm *sm, const u8 *kck,
107 if (is_zero_ether_addr(dest) && is_zero_ether_addr(sm->bssid)) {
112 if (wpa_sm_get_bssid(sm, sm->bssid) < 0) {
116 dest = sm->bssid;
125 wpa_sm_ether_send(sm, dest, proto, msg, msg_len);
126 eapol_sm_notify_tx_eapol_key(sm->eapol);
133 * @sm: Pointer to WPA state machine data from wpa_sm_init()
141 void wpa_sm_key_request(struct wpa_sm *sm, int error, int pairwise)
148 if (wpa_key_mgmt_ft(sm->key_mgmt) || wpa_key_mgmt_sha256(sm->key_mgmt))
150 else if (sm->pairwise_cipher == WPA_CIPHER_CCMP)
155 if (wpa_sm_get_bssid(sm, bssid) < 0) {
161 rbuf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_KEY, NULL,
166 reply->type = sm->proto == WPA_PROTO_RSN ?
169 if (sm->ptk_set)
177 os_memcpy(reply->replay_counter, sm->request_counter,
179 inc_byte_array(sm->request_counter, WPA_REPLAY_COUNTER_LEN);
185 error, pairwise, sm->ptk_set, (unsigned long) rlen);
186 wpa_eapol_key_send(sm, sm->ptk.kck, ver, bssid, ETH_P_EAPOL,
192 static int wpa_supplicant_get_pmk(struct wpa_sm *sm,
198 if (pmkid && !sm->cur_pmksa) {
203 sm->cur_pmksa = pmksa_cache_get(sm->pmksa, src_addr, pmkid);
204 if (sm->cur_pmksa) {
213 if (pmkid && sm->cur_pmksa &&
214 os_memcmp(pmkid, sm->cur_pmksa->pmkid, PMKID_LEN) == 0) {
216 wpa_sm_set_pmk_from_pmksa(sm);
218 sm->pmk, sm->pmk_len);
219 eapol_sm_notify_cached(sm->eapol);
221 sm->xxkey_len = 0;
223 } else if (wpa_key_mgmt_wpa_ieee8021x(sm->key_mgmt) && sm->eapol) {
226 res = eapol_sm_get_key(sm->eapol, sm->pmk, PMK_LEN);
232 res = eapol_sm_get_key(sm->eapol, sm->pmk, 16);
237 if (eapol_sm_get_key(sm->eapol, buf, 2 * PMK_LEN) == 0)
239 os_memcpy(sm->xxkey, buf + PMK_LEN, PMK_LEN);
240 sm->xxkey_len = PMK_LEN;
247 "machines", sm->pmk, pmk_len);
248 sm->pmk_len = pmk_len;
249 pmksa_cache_add(sm->pmksa, sm->pmk, pmk_len, src_addr,
250 sm->own_addr, sm->network_ctx,
251 sm->key_mgmt);
252 if (!sm->cur_pmksa && pmkid &&
253 pmksa_cache_get(sm->pmksa, src_addr, pmkid)) {
259 wpa_msg(sm->ctx->ctx, MSG_WARNING,
262 wpa_msg(sm->ctx->ctx, MSG_WARNING,
264 if (sm->cur_pmksa) {
267 sm->cur_pmksa = NULL;
275 if (abort_cached && wpa_key_mgmt_wpa_ieee8021x(sm->key_mgmt)) {
282 buf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_START,
285 wpa_sm_ether_send(sm, sm->bssid, ETH_P_EAPOL,
300 * @sm: Pointer to WPA state machine data from wpa_sm_init()
310 int wpa_supplicant_send_2_of_4(struct wpa_sm *sm, const unsigned char *dst,
328 rbuf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_KEY,
334 reply->type = sm->proto == WPA_PROTO_RSN ?
338 if (sm->proto == WPA_PROTO_RSN)
351 wpa_eapol_key_send(sm, ptk->kck, ver, dst, ETH_P_EAPOL,
358 static int wpa_derive_ptk(struct wpa_sm *sm, const unsigned char *src_addr,
362 size_t ptk_len = sm->pairwise_cipher == WPA_CIPHER_CCMP ? 48 : 64;
364 if (wpa_key_mgmt_ft(sm->key_mgmt))
365 return wpa_derive_ptk_ft(sm, src_addr, key, ptk, ptk_len);
368 wpa_pmk_to_ptk(sm->pmk, sm->pmk_len, "Pairwise key expansion",
369 sm->own_addr, sm->bssid, sm->snonce, key->key_nonce,
371 wpa_key_mgmt_sha256(sm->key_mgmt));
376 static void wpa_supplicant_process_1_of_4(struct wpa_sm *sm,
386 if (wpa_sm_get_network_ctx(sm) == NULL) {
392 wpa_sm_set_state(sm, WPA_4WAY_HANDSHAKE);
399 if (sm->proto == WPA_PROTO_RSN) {
412 res = wpa_supplicant_get_pmk(sm, src_addr, ie.pmkid);
421 if (sm->renew_snonce) {
422 if (os_get_random(sm->snonce, WPA_NONCE_LEN)) {
423 wpa_msg(sm->ctx->ctx, MSG_WARNING,
427 sm->renew_snonce = 0;
429 sm->snonce, WPA_NONCE_LEN);
434 ptk = &sm->tptk;
435 wpa_derive_ptk(sm, src_addr, key, ptk);
440 sm->tptk_set = 1;
442 if (wpa_supplicant_send_2_of_4(sm, sm->bssid, key, ver, sm->snonce,
443 sm->assoc_wpa_ie, sm->assoc_wpa_ie_len,
447 os_memcpy(sm->anonce, key->key_nonce, WPA_NONCE_LEN);
451 wpa_sm_deauthenticate(sm, WLAN_REASON_UNSPECIFIED);
457 struct wpa_sm *sm = eloop_ctx;
458 rsn_preauth_candidate_process(sm);
462 static void wpa_supplicant_key_neg_complete(struct wpa_sm *sm,
465 wpa_msg(sm->ctx->ctx, MSG_INFO, "WPA: Key negotiation completed with "
467 wpa_cipher_txt(sm->pairwise_cipher),
468 wpa_cipher_txt(sm->group_cipher));
469 wpa_sm_cancel_auth_timeout(sm);
470 wpa_sm_set_state(sm, WPA_COMPLETED);
474 sm, addr, MLME_SETPROTECTION_PROTECT_TYPE_RX_TX,
476 eapol_sm_notify_portValid(sm->eapol, TRUE);
477 if (wpa_key_mgmt_wpa_psk(sm->key_mgmt))
478 eapol_sm_notify_eap_success(sm->eapol, TRUE);
486 eloop_register_timeout(1, 0, wpa_sm_start_preauth, sm, NULL);
489 if (sm->cur_pmksa && sm->cur_pmksa->opportunistic) {
492 sm->cur_pmksa->opportunistic = 0;
496 if (wpa_key_mgmt_ft(sm->key_mgmt)) {
498 wpa_ft_prepare_auth_request(sm);
506 struct wpa_sm *sm = eloop_ctx;
508 wpa_sm_key_request(sm, 0, 1);
512 static int wpa_supplicant_install_ptk(struct wpa_sm *sm,
522 switch (sm->pairwise_cipher) {
539 sm->pairwise_cipher);
543 if (sm->proto == WPA_PROTO_RSN) {
550 if (wpa_sm_set_key(sm, alg, sm->bssid, 0, 1, key_rsc, rsclen,
551 (u8 *) sm->ptk.tk1, keylen) < 0) {
554 alg, keylen, MAC2STR(sm->bssid));
558 if (sm->wpa_ptk_rekey) {
559 eloop_cancel_timeout(wpa_sm_rekey_ptk, sm, NULL);
560 eloop_register_timeout(sm->wpa_ptk_rekey, 0, wpa_sm_rekey_ptk,
561 sm, NULL);
631 static int wpa_supplicant_install_gtk(struct wpa_sm *sm,
643 if (sm->group_cipher == WPA_CIPHER_TKIP) {
650 if (sm->pairwise_cipher == WPA_CIPHER_NONE) {
651 if (wpa_sm_set_key(sm, gd->alg,
659 } else if (wpa_sm_set_key(sm, gd->alg,
673 static int wpa_supplicant_gtk_tx_bit_workaround(const struct wpa_sm *sm,
676 if (tx && sm->pairwise_cipher != WPA_CIPHER_NONE) {
690 static int wpa_supplicant_pairwise_gtk(struct wpa_sm *sm,
714 gd.tx = wpa_supplicant_gtk_tx_bit_workaround(sm,
722 if (wpa_supplicant_check_group_cipher(sm->group_cipher,
725 wpa_supplicant_install_gtk(sm, &gd, key->key_rsc)) {
730 wpa_supplicant_key_neg_complete(sm, sm->bssid,
739 static int ieee80211w_set_keys(struct wpa_sm *sm,
743 if (sm->mgmt_group_cipher != WPA_CIPHER_AES_128_CMAC)
763 if (wpa_sm_set_key(sm, WPA_ALG_IGTK,
780 static void wpa_report_ie_mismatch(struct wpa_sm *sm,
785 wpa_msg(sm->ctx->ctx, MSG_WARNING, "WPA: %s (src=" MACSTR ")",
788 if (sm->ap_wpa_ie) {
790 sm->ap_wpa_ie, sm->ap_wpa_ie_len);
793 if (!sm->ap_wpa_ie) {
801 if (sm->ap_rsn_ie) {
803 sm->ap_rsn_ie, sm->ap_rsn_ie_len);
806 if (!sm->ap_rsn_ie) {
814 wpa_sm_disassociate(sm, WLAN_REASON_IE_IN_4WAY_DIFFERS);
818 static int wpa_supplicant_validate_ie(struct wpa_sm *sm,
822 if (sm->ap_wpa_ie == NULL && sm->ap_rsn_ie == NULL) {
825 if (wpa_sm_get_beacon_ie(sm) < 0) {
835 (sm->ap_wpa_ie || sm->ap_rsn_ie)) {
836 wpa_report_ie_mismatch(sm, "IE in 3/4 msg does not match "
843 if ((ie->wpa_ie && sm->ap_wpa_ie &&
844 (ie->wpa_ie_len != sm->ap_wpa_ie_len ||
845 os_memcmp(ie->wpa_ie, sm->ap_wpa_ie, ie->wpa_ie_len) != 0)) ||
846 (ie->rsn_ie && sm->ap_rsn_ie &&
847 (ie->rsn_ie_len != sm->ap_rsn_ie_len ||
848 os_memcmp(ie->rsn_ie, sm->ap_rsn_ie, ie->rsn_ie_len) != 0))) {
849 wpa_report_ie_mismatch(sm, "IE in 3/4 msg does not match "
856 if (sm->proto == WPA_PROTO_WPA &&
857 ie->rsn_ie && sm->ap_rsn_ie == NULL && sm->rsn_enabled) {
858 wpa_report_ie_mismatch(sm, "Possible downgrade attack "
868 if (wpa_key_mgmt_ft(sm->key_mgmt)) {
874 os_memcmp(mdie->mobility_domain, sm->mobility_domain,
889 * @sm: Pointer to WPA state machine data from wpa_sm_init()
899 int wpa_supplicant_send_4_of_4(struct wpa_sm *sm, const unsigned char *dst,
912 rbuf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_KEY, NULL,
918 reply->type = sm->proto == WPA_PROTO_RSN ?
923 if (sm->proto == WPA_PROTO_RSN)
935 wpa_eapol_key_send(sm, ptk->kck, ver, dst, ETH_P_EAPOL,
942 static void wpa_supplicant_process_3_of_4(struct wpa_sm *sm,
950 wpa_sm_set_state(sm, WPA_4WAY_HANDSHAKE);
952 MACSTR " (ver=%d)", MAC2STR(sm->bssid), ver);
978 if (wpa_supplicant_validate_ie(sm, sm->bssid, &ie) < 0)
981 if (os_memcmp(sm->anonce, key->key_nonce, WPA_NONCE_LEN) != 0) {
984 " packet (src=" MACSTR ")", MAC2STR(sm->bssid));
989 switch (sm->pairwise_cipher) {
994 keylen, MAC2STR(sm->bssid));
1002 keylen, MAC2STR(sm->bssid));
1008 if (wpa_supplicant_send_4_of_4(sm, sm->bssid, key, ver, key_info,
1009 NULL, 0, &sm->ptk)) {
1016 sm->renew_snonce = 1;
1019 if (wpa_supplicant_install_ptk(sm, key))
1025 sm, sm->bssid, MLME_SETPROTECTION_PROTECT_TYPE_RX,
1027 eapol_sm_notify_portValid(sm->eapol, TRUE);
1029 wpa_sm_set_state(sm, WPA_GROUP_HANDSHAKE);
1032 wpa_supplicant_pairwise_gtk(sm, key,
1038 if (ieee80211w_set_keys(sm, &ie) < 0) {
1046 wpa_sm_deauthenticate(sm, WLAN_REASON_UNSPECIFIED);
1050 static int wpa_supplicant_process_1_of_2_rsn(struct wpa_sm *sm,
1071 if (wpa_supplicant_check_group_cipher(sm->group_cipher,
1079 gd->tx = wpa_supplicant_gtk_tx_bit_workaround(sm,
1088 if (ieee80211w_set_keys(sm, &ie) < 0)
1095 static int wpa_supplicant_process_1_of_2_wpa(struct wpa_sm *sm,
1122 if (wpa_supplicant_check_group_cipher(sm->group_cipher,
1131 os_memcpy(ek + 16, sm->ptk.kek, 16);
1153 if (aes_unwrap(sm->ptk.kek, maxkeylen / 8,
1165 sm, !!(key_info & WPA_KEY_INFO_TXRX));
1170 static int wpa_supplicant_send_2_of_2(struct wpa_sm *sm,
1178 rbuf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_KEY, NULL,
1183 reply->type = sm->proto == WPA_PROTO_RSN ?
1188 if (sm->proto == WPA_PROTO_RSN)
1198 wpa_eapol_key_send(sm, sm->ptk.kck, ver, sm->bssid, ETH_P_EAPOL,
1205 static void wpa_supplicant_process_1_of_2(struct wpa_sm *sm,
1216 rekey = wpa_sm_get_state(sm) == WPA_COMPLETED;
1223 if (sm->proto == WPA_PROTO_RSN) {
1224 ret = wpa_supplicant_process_1_of_2_rsn(sm,
1229 ret = wpa_supplicant_process_1_of_2_wpa(sm, key, keydatalen,
1234 wpa_sm_set_state(sm, WPA_GROUP_HANDSHAKE);
1239 if (wpa_supplicant_install_gtk(sm, &gd, key->key_rsc) ||
1240 wpa_supplicant_send_2_of_2(sm, key, ver, key_info))
1244 wpa_msg(sm->ctx->ctx, MSG_INFO, "WPA: Group rekeying "
1246 MAC2STR(sm->bssid), wpa_cipher_txt(sm->group_cipher));
1247 wpa_sm_cancel_auth_timeout(sm);
1248 wpa_sm_set_state(sm, WPA_COMPLETED);
1250 wpa_supplicant_key_neg_complete(sm, sm->bssid,
1257 wpa_sm_deauthenticate(sm, WLAN_REASON_UNSPECIFIED);
1261 static int wpa_supplicant_verify_eapol_key_mic(struct wpa_sm *sm,
1270 if (sm->tptk_set) {
1272 wpa_eapol_key_mic(sm->tptk.kck, ver, buf, len,
1279 sm->tptk_set = 0;
1280 sm->ptk_set = 1;
1281 os_memcpy(&sm->ptk, &sm->tptk, sizeof(sm->ptk));
1285 if (!ok && sm->ptk_set) {
1287 wpa_eapol_key_mic(sm->ptk.kck, ver, buf, len,
1303 os_memcpy(sm->rx_replay_counter, key->replay_counter,
1305 sm->rx_replay_counter_set = 1;
1311 static int wpa_supplicant_decrypt_key_data(struct wpa_sm *sm,
1318 if (!sm->ptk_set) {
1329 os_memcpy(ek + 16, sm->ptk.kek, 16);
1346 if (aes_unwrap(sm->ptk.kek, keydatalen / 8,
1369 * @sm: Pointer to WPA state machine data from wpa_sm_init()
1371 void wpa_sm_aborted_cached(struct wpa_sm *sm)
1373 if (sm && sm->cur_pmksa) {
1375 sm->cur_pmksa = NULL;
1416 * @sm: Pointer to WPA state machine data from wpa_sm_init()
1430 int wpa_sm_rx_eapol(struct wpa_sm *sm, const u8 *src_addr,
1442 sm->ft_completed = 0;
1491 eapol_sm_notify_lower_layer_success(sm->eapol, 0);
1510 if (wpa_key_mgmt_ft(sm->key_mgmt)) {
1520 if (wpa_key_mgmt_sha256(sm->key_mgmt)) {
1528 if (sm->pairwise_cipher == WPA_CIPHER_CCMP &&
1532 if (sm->group_cipher != WPA_CIPHER_CCMP &&
1546 for (peerkey = sm->peerkey; peerkey; peerkey = peerkey->next) {
1580 if (!peerkey && sm->rx_replay_counter_set &&
1581 os_memcmp(key->replay_counter, sm->rx_replay_counter,
1604 wpa_supplicant_verify_eapol_key_mic(sm, key, ver, tmp, data_len))
1609 peerkey_verify_eapol_key_mic(sm, peerkey, key, ver, tmp, data_len))
1616 wpa_msg(sm->ctx->ctx, MSG_INFO, "WPA: Invalid EAPOL-Key "
1624 if (sm->proto == WPA_PROTO_RSN &&
1626 if (wpa_supplicant_decrypt_key_data(sm, key, ver))
1639 peerkey_rx_eapol_4way(sm, peerkey, key, key_info, ver);
1642 wpa_supplicant_process_3_of_4(sm, key, ver);
1645 wpa_supplicant_process_1_of_4(sm, src_addr, key,
1650 peerkey_rx_eapol_smk(sm, src_addr, key, extra_len, key_info,
1655 wpa_supplicant_process_1_of_2(sm, src_addr, key,
1689 static u32 wpa_key_mgmt_suite(struct wpa_sm *sm)
1691 switch (sm->key_mgmt) {
1693 return (sm->proto == WPA_PROTO_RSN ?
1697 return (sm->proto == WPA_PROTO_RSN ?
1720 static u32 wpa_cipher_suite(struct wpa_sm *sm, int cipher)
1724 return (sm->proto == WPA_PROTO_RSN ?
1727 return (sm->proto == WPA_PROTO_RSN ?
1730 return (sm->proto == WPA_PROTO_RSN ?
1733 return (sm->proto == WPA_PROTO_RSN ?
1736 return (sm->proto == WPA_PROTO_RSN ?
1750 * @sm: Pointer to WPA state machine data from wpa_sm_init()
1757 int wpa_sm_get_mib(struct wpa_sm *sm, char *buf, size_t buflen)
1763 if (sm->cur_pmksa) {
1765 sm->cur_pmksa->pmkid, PMKID_LEN);
1769 if ((wpa_key_mgmt_wpa_psk(sm->key_mgmt) ||
1770 wpa_key_mgmt_wpa_ieee8021x(sm->key_mgmt)) &&
1771 sm->proto == WPA_PROTO_RSN)
1791 wpa_cipher_bits(sm->group_cipher),
1792 sm->dot11RSNAConfigPMKLifetime,
1793 sm->dot11RSNAConfigPMKReauthThreshold,
1794 sm->dot11RSNAConfigSATimeout);
1810 RSN_SUITE_ARG(wpa_key_mgmt_suite(sm)),
1811 RSN_SUITE_ARG(wpa_cipher_suite(sm, sm->pairwise_cipher)),
1812 RSN_SUITE_ARG(wpa_cipher_suite(sm, sm->group_cipher)),
1814 RSN_SUITE_ARG(wpa_key_mgmt_suite(sm)),
1815 RSN_SUITE_ARG(wpa_cipher_suite(sm, sm->pairwise_cipher)),
1816 RSN_SUITE_ARG(wpa_cipher_suite(sm, sm->group_cipher)),
1817 sm->dot11RSNA4WayHandshakeFailures);
1829 struct wpa_sm *sm = ctx;
1831 if (sm->cur_pmksa == entry ||
1832 (sm->pmk_len == entry->pmk_len &&
1833 os_memcmp(sm->pmk, entry->pmk, sm->pmk_len) == 0)) {
1835 sm->cur_pmksa = NULL;
1845 os_memset(sm->pmk, 0, sizeof(sm->pmk));
1846 wpa_sm_deauthenticate(sm, WLAN_REASON_UNSPECIFIED);
1861 struct wpa_sm *sm;
1863 sm = os_zalloc(sizeof(*sm));
1864 if (sm == NULL)
1866 sm->renew_snonce = 1;
1867 sm->ctx = ctx;
1869 sm->dot11RSNAConfigPMKLifetime = 43200;
1870 sm->dot11RSNAConfigPMKReauthThreshold = 70;
1871 sm->dot11RSNAConfigSATimeout = 60;
1873 sm->pmksa = pmksa_cache_init(wpa_sm_pmksa_free_cb, sm, sm);
1874 if (sm->pmksa == NULL) {
1877 os_free(sm);
1881 return sm;
1887 * @sm: Pointer to WPA state machine data from wpa_sm_init()
1889 void wpa_sm_deinit(struct wpa_sm *sm)
1891 if (sm == NULL)
1893 pmksa_cache_deinit(sm->pmksa);
1894 eloop_cancel_timeout(wpa_sm_start_preauth, sm, NULL);
1895 eloop_cancel_timeout(wpa_sm_rekey_ptk, sm, NULL);
1896 os_free(sm->assoc_wpa_ie);
1897 os_free(sm->ap_wpa_ie);
1898 os_free(sm->ap_rsn_ie);
1899 os_free(sm->ctx);
1900 peerkey_deinit(sm);
1901 os_free(sm);
1907 * @sm: Pointer to WPA state machine data from wpa_sm_init()
1913 void wpa_sm_notify_assoc(struct wpa_sm *sm, const u8 *bssid)
1917 if (sm == NULL)
1921 os_memcpy(sm->bssid, bssid, ETH_ALEN);
1922 os_memset(sm->rx_replay_counter, 0, WPA_REPLAY_COUNTER_LEN);
1923 sm->rx_replay_counter_set = 0;
1924 sm->renew_snonce = 1;
1925 if (os_memcmp(sm->preauth_bssid, bssid, ETH_ALEN) == 0)
1926 rsn_preauth_deinit(sm);
1929 if (wpa_ft_is_completed(sm)) {
1930 wpa_supplicant_key_neg_complete(sm, sm->bssid, 1);
1933 wpa_ft_prepare_auth_request(sm);
1945 sm->ptk_set = 0;
1946 sm->tptk_set = 0;
1953 * @sm: Pointer to WPA state machine data from wpa_sm_init()
1958 void wpa_sm_notify_disassoc(struct wpa_sm *sm)
1960 rsn_preauth_deinit(sm);
1961 if (wpa_sm_get_state(sm) == WPA_4WAY_HANDSHAKE)
1962 sm->dot11RSNA4WayHandshakeFailures++;
1968 * @sm: Pointer to WPA state machine data from wpa_sm_init()
1974 void wpa_sm_set_pmk(struct wpa_sm *sm, const u8 *pmk, size_t pmk_len)
1976 if (sm == NULL)
1979 sm->pmk_len = pmk_len;
1980 os_memcpy(sm->pmk, pmk, pmk_len);
1984 sm->xxkey_len = pmk_len;
1985 os_memcpy(sm->xxkey, pmk, pmk_len);
1992 * @sm: Pointer to WPA state machine data from wpa_sm_init()
1997 void wpa_sm_set_pmk_from_pmksa(struct wpa_sm *sm)
1999 if (sm == NULL)
2002 if (sm->cur_pmksa) {
2003 sm->pmk_len = sm->cur_pmksa->pmk_len;
2004 os_memcpy(sm->pmk, sm->cur_pmksa->pmk, sm->pmk_len);
2006 sm->pmk_len = PMK_LEN;
2007 os_memset(sm->pmk, 0, PMK_LEN);
2014 * @sm: Pointer to WPA state machine data from wpa_sm_init()
2017 void wpa_sm_set_fast_reauth(struct wpa_sm *sm, int fast_reauth)
2019 if (sm)
2020 sm->fast_reauth = fast_reauth;
2026 * @sm: Pointer to WPA state machine data from wpa_sm_init()
2029 void wpa_sm_set_scard_ctx(struct wpa_sm *sm, void *scard_ctx)
2031 if (sm == NULL)
2033 sm->scard_ctx = scard_ctx;
2034 if (sm->preauth_eapol)
2035 eapol_sm_register_scard_ctx(sm->preauth_eapol, scard_ctx);
2041 * @sm: Pointer to WPA state machine data from wpa_sm_init()
2048 void wpa_sm_set_config(struct wpa_sm *sm, struct rsn_supp_config *config)
2050 if (!sm)
2054 sm->network_ctx = config->network_ctx;
2055 sm->peerkey_enabled = config->peerkey_enabled;
2056 sm->allowed_pairwise_cipher = config->allowed_pairwise_cipher;
2057 sm->proactive_key_caching = config->proactive_key_caching;
2058 sm->eap_workaround = config->eap_workaround;
2059 sm->eap_conf_ctx = config->eap_conf_ctx;
2061 os_memcpy(sm->ssid, config->ssid, config->ssid_len);
2062 sm->ssid_len = config->ssid_len;
2064 sm->ssid_len = 0;
2065 sm->wpa_ptk_rekey = config->wpa_ptk_rekey;
2067 sm->network_ctx = NULL;
2068 sm->peerkey_enabled = 0;
2069 sm->allowed_pairwise_cipher = 0;
2070 sm->proactive_key_caching = 0;
2071 sm->eap_workaround = 0;
2072 sm->eap_conf_ctx = NULL;
2073 sm->ssid_len = 0;
2074 sm->wpa_ptk_rekey = 0;
2076 if (config == NULL || config->network_ctx != sm->network_ctx)
2077 pmksa_cache_notify_reconfig(sm->pmksa);
2083 * @sm: Pointer to WPA state machine data from wpa_sm_init()
2086 void wpa_sm_set_own_addr(struct wpa_sm *sm, const u8 *addr)
2088 if (sm)
2089 os_memcpy(sm->own_addr, addr, ETH_ALEN);
2095 * @sm: Pointer to WPA state machine data from wpa_sm_init()
2099 void wpa_sm_set_ifname(struct wpa_sm *sm, const char *ifname,
2102 if (sm) {
2103 sm->ifname = ifname;
2104 sm->bridge_ifname = bridge_ifname;
2111 * @sm: Pointer to WPA state machine data from wpa_sm_init()
2114 void wpa_sm_set_eapol(struct wpa_sm *sm, struct eapol_sm *eapol)
2116 if (sm)
2117 sm->eapol = eapol;
2123 * @sm: Pointer to WPA state machine data from wpa_sm_init()
2128 int wpa_sm_set_param(struct wpa_sm *sm, enum wpa_sm_conf_params param,
2133 if (sm == NULL)
2139 sm->dot11RSNAConfigPMKLifetime = value;
2145 sm->dot11RSNAConfigPMKReauthThreshold = value;
2151 sm->dot11RSNAConfigSATimeout = value;
2156 sm->proto = value;
2159 sm->pairwise_cipher = value;
2162 sm->group_cipher = value;
2165 sm->key_mgmt = value;
2169 sm->mgmt_group_cipher = value;
2173 sm->rsn_enabled = value;
2185 * @sm: Pointer to WPA state machine data from wpa_sm_init()
2189 unsigned int wpa_sm_get_param(struct wpa_sm *sm, enum wpa_sm_conf_params param)
2191 if (sm == NULL)
2196 return sm->dot11RSNAConfigPMKLifetime;
2198 return sm->dot11RSNAConfigPMKReauthThreshold;
2200 return sm->dot11RSNAConfigSATimeout;
2202 return sm->proto;
2204 return sm->pairwise_cipher;
2206 return sm->group_cipher;
2208 return sm->key_mgmt;
2211 return sm->mgmt_group_cipher;
2214 return sm->rsn_enabled;
2223 * @sm: Pointer to WPA state machine data from wpa_sm_init()
2233 int wpa_sm_get_status(struct wpa_sm *sm, char *buf, size_t buflen,
2243 wpa_cipher_txt(sm->pairwise_cipher),
2244 wpa_cipher_txt(sm->group_cipher),
2245 wpa_key_mgmt_txt(sm->key_mgmt, sm->proto));
2255 * @sm: Pointer to WPA state machine data from wpa_sm_init()
2260 int wpa_sm_set_assoc_wpa_ie_default(struct wpa_sm *sm, u8 *wpa_ie,
2265 if (sm == NULL)
2268 res = wpa_gen_wpa_ie(sm, wpa_ie, *wpa_ie_len);
2276 if (sm->assoc_wpa_ie == NULL) {
2282 sm->assoc_wpa_ie = os_malloc(*wpa_ie_len);
2283 if (sm->assoc_wpa_ie == NULL)
2286 os_memcpy(sm->assoc_wpa_ie, wpa_ie, *wpa_ie_len);
2287 sm->assoc_wpa_ie_len = *wpa_ie_len;
2296 * @sm: Pointer to WPA state machine data from wpa_sm_init()
2305 int wpa_sm_set_assoc_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len)
2307 if (sm == NULL)
2310 os_free(sm->assoc_wpa_ie);
2313 sm->assoc_wpa_ie = NULL;
2314 sm->assoc_wpa_ie_len = 0;
2317 sm->assoc_wpa_ie = os_malloc(len);
2318 if (sm->assoc_wpa_ie == NULL)
2321 os_memcpy(sm->assoc_wpa_ie, ie, len);
2322 sm->assoc_wpa_ie_len = len;
2331 * @sm: Pointer to WPA state machine data from wpa_sm_init()
2339 int wpa_sm_set_ap_wpa_ie(struct wpa_sm *sm, const u8 *ie, size_t len)
2341 if (sm == NULL)
2344 os_free(sm->ap_wpa_ie);
2347 sm->ap_wpa_ie = NULL;
2348 sm->ap_wpa_ie_len = 0;
2351 sm->ap_wpa_ie = os_malloc(len);
2352 if (sm->ap_wpa_ie == NULL)
2355 os_memcpy(sm->ap_wpa_ie, ie, len);
2356 sm->ap_wpa_ie_len = len;
2365 * @sm: Pointer to WPA state machine data from wpa_sm_init()
2373 int wpa_sm_set_ap_rsn_ie(struct wpa_sm *sm, const u8 *ie, size_t len)
2375 if (sm == NULL)
2378 os_free(sm->ap_rsn_ie);
2381 sm->ap_rsn_ie = NULL;
2382 sm->ap_rsn_ie_len = 0;
2385 sm->ap_rsn_ie = os_malloc(len);
2386 if (sm->ap_rsn_ie == NULL)
2389 os_memcpy(sm->ap_rsn_ie, ie, len);
2390 sm->ap_rsn_ie_len = len;
2399 * @sm: Pointer to WPA state machine data from wpa_sm_init()
2406 int wpa_sm_parse_own_wpa_ie(struct wpa_sm *sm, struct wpa_ie_data *data)
2408 if (sm == NULL || sm->assoc_wpa_ie == NULL) {
2413 if (wpa_parse_wpa_ie(sm->assoc_wpa_ie, sm->assoc_wpa_ie_len, data))