Lines Matching refs:sm

152 static void eapol_sm_txLogoff(struct eapol_sm *sm);
153 static void eapol_sm_txStart(struct eapol_sm *sm);
154 static void eapol_sm_processKey(struct eapol_sm *sm);
155 static void eapol_sm_getSuppRsp(struct eapol_sm *sm);
156 static void eapol_sm_txSuppRsp(struct eapol_sm *sm);
157 static void eapol_sm_abortSupp(struct eapol_sm *sm);
158 static void eapol_sm_abort_cached(struct eapol_sm *sm);
160 static void eapol_sm_set_port_authorized(struct eapol_sm *sm);
161 static void eapol_sm_set_port_unauthorized(struct eapol_sm *sm);
168 struct eapol_sm *sm = timeout_ctx; in eapol_port_timers_tick() local
170 if (sm->authWhile > 0) { in eapol_port_timers_tick()
171 sm->authWhile--; in eapol_port_timers_tick()
172 if (sm->authWhile == 0) in eapol_port_timers_tick()
175 if (sm->heldWhile > 0) { in eapol_port_timers_tick()
176 sm->heldWhile--; in eapol_port_timers_tick()
177 if (sm->heldWhile == 0) in eapol_port_timers_tick()
180 if (sm->startWhen > 0) { in eapol_port_timers_tick()
181 sm->startWhen--; in eapol_port_timers_tick()
182 if (sm->startWhen == 0) in eapol_port_timers_tick()
185 if (sm->idleWhile > 0) { in eapol_port_timers_tick()
186 sm->idleWhile--; in eapol_port_timers_tick()
187 if (sm->idleWhile == 0) in eapol_port_timers_tick()
191 if (sm->authWhile | sm->heldWhile | sm->startWhen | sm->idleWhile) { in eapol_port_timers_tick()
193 eloop_ctx, sm) < 0) in eapol_port_timers_tick()
194 sm->timer_tick_enabled = 0; in eapol_port_timers_tick()
197 sm->timer_tick_enabled = 0; in eapol_port_timers_tick()
199 eapol_sm_step(sm); in eapol_port_timers_tick()
203 static int eapol_sm_confirm_auth(struct eapol_sm *sm) in eapol_sm_confirm_auth() argument
205 if (!sm->ctx->confirm_auth_cb) in eapol_sm_confirm_auth()
208 return sm->ctx->confirm_auth_cb(sm->ctx->ctx); in eapol_sm_confirm_auth()
212 static void eapol_enable_timer_tick(struct eapol_sm *sm) in eapol_enable_timer_tick() argument
214 if (sm->timer_tick_enabled) in eapol_enable_timer_tick()
217 eloop_cancel_timeout(eapol_port_timers_tick, NULL, sm); in eapol_enable_timer_tick()
218 if (eloop_register_timeout(1, 0, eapol_port_timers_tick, NULL, sm) == 0) in eapol_enable_timer_tick()
219 sm->timer_tick_enabled = 1; in eapol_enable_timer_tick()
226 eapol_sm_txLogoff(sm); in SM_STATE()
227 sm->logoffSent = true; in SM_STATE()
228 eapol_sm_set_port_unauthorized(sm); in SM_STATE()
235 sm->sPortMode = Auto; in SM_STATE()
236 sm->startCount = 0; in SM_STATE()
237 sm->eapTriggerStart = false; in SM_STATE()
238 sm->logoffSent = false; in SM_STATE()
239 eapol_sm_set_port_unauthorized(sm); in SM_STATE()
240 sm->suppAbort = true; in SM_STATE()
242 sm->unicast_key_received = false; in SM_STATE()
243 sm->broadcast_key_received = false; in SM_STATE()
252 sm->heldWhile = 0; in SM_STATE()
258 int send_start = sm->SUPP_PAE_state == SUPP_PAE_CONNECTING || in SM_STATE()
259 sm->SUPP_PAE_state == SUPP_PAE_HELD; in SM_STATE()
262 if (sm->eapTriggerStart) in SM_STATE()
264 if (sm->ctx->preauth) in SM_STATE()
266 sm->eapTriggerStart = false; in SM_STATE()
269 sm->startWhen = sm->startPeriod; in SM_STATE()
270 sm->startCount++; in SM_STATE()
279 if (sm->conf.wps && !(sm->conf.wps & EAPOL_PEER_IS_WPS20_AP)) { in SM_STATE()
283 sm->startWhen = 1; in SM_STATE()
285 sm->startWhen = 2; in SM_STATE()
288 eapol_enable_timer_tick(sm); in SM_STATE()
289 sm->eapolEap = false; in SM_STATE()
291 eapol_sm_txStart(sm); in SM_STATE()
298 sm->startCount = 0; in SM_STATE()
299 sm->suppSuccess = false; in SM_STATE()
300 sm->suppFail = false; in SM_STATE()
301 sm->suppTimeout = false; in SM_STATE()
302 sm->keyRun = false; in SM_STATE()
303 sm->keyDone = false; in SM_STATE()
304 sm->suppStart = true; in SM_STATE()
311 sm->heldWhile = sm->heldPeriod; in SM_STATE()
312 eapol_enable_timer_tick(sm); in SM_STATE()
313 eapol_sm_set_port_unauthorized(sm); in SM_STATE()
314 sm->cb_status = EAPOL_CB_FAILURE; in SM_STATE()
321 eapol_sm_set_port_authorized(sm); in SM_STATE()
322 sm->cb_status = EAPOL_CB_SUCCESS; in SM_STATE()
328 if (eapol_sm_confirm_auth(sm)) { in SM_STATE()
334 sm->eapRestart = true; in SM_STATE()
335 if (sm->altAccept) { in SM_STATE()
342 sm->eapSuccess = false; in SM_STATE()
343 sm->altAccept = false; in SM_STATE()
351 eapol_sm_set_port_authorized(sm); in SM_STATE()
352 sm->sPortMode = ForceAuthorized; in SM_STATE()
359 eapol_sm_set_port_unauthorized(sm); in SM_STATE()
360 sm->sPortMode = ForceUnauthorized; in SM_STATE()
361 eapol_sm_txLogoff(sm); in SM_STATE()
367 if ((sm->userLogoff && !sm->logoffSent) && in SM_STEP()
368 !(sm->initialize || !sm->portEnabled)) in SM_STEP()
370 else if (((sm->portControl == Auto) && in SM_STEP()
371 (sm->sPortMode != sm->portControl)) || in SM_STEP()
372 sm->initialize || !sm->portEnabled) in SM_STEP()
374 else if ((sm->portControl == ForceAuthorized) && in SM_STEP()
375 (sm->sPortMode != sm->portControl) && in SM_STEP()
376 !(sm->initialize || !sm->portEnabled)) in SM_STEP()
378 else if ((sm->portControl == ForceUnauthorized) && in SM_STEP()
379 (sm->sPortMode != sm->portControl) && in SM_STEP()
380 !(sm->initialize || !sm->portEnabled)) in SM_STEP()
382 else switch (sm->SUPP_PAE_state) { in SM_STEP()
386 if (!sm->userLogoff) in SM_STEP()
393 if (sm->startWhen == 0 && sm->startCount < sm->maxStart) in SM_STEP()
395 else if (sm->startWhen == 0 && in SM_STEP()
396 sm->startCount >= sm->maxStart && in SM_STEP()
397 sm->portValid) in SM_STEP()
399 else if (sm->eapSuccess || sm->eapFail) in SM_STEP()
401 else if (sm->eapolEap) in SM_STEP()
403 else if (sm->startWhen == 0 && in SM_STEP()
404 sm->startCount >= sm->maxStart && in SM_STEP()
405 !sm->portValid) in SM_STEP()
409 if (sm->eapSuccess && !sm->portValid && in SM_STEP()
410 sm->conf.accept_802_1x_keys && in SM_STEP()
411 sm->conf.required_keys == 0) { in SM_STEP()
415 sm->portValid = true; in SM_STEP()
416 if (sm->ctx->eapol_done_cb) in SM_STEP()
417 sm->ctx->eapol_done_cb(sm->ctx->ctx); in SM_STEP()
419 if (sm->eapSuccess && sm->portValid) in SM_STEP()
421 else if (sm->eapFail || (sm->keyDone && !sm->portValid)) in SM_STEP()
423 else if (sm->suppTimeout) in SM_STEP()
425 else if (sm->eapTriggerStart) in SM_STEP()
429 if (sm->heldWhile == 0) in SM_STEP()
431 else if (sm->eapolEap) in SM_STEP()
435 if (sm->eapolEap && sm->portValid) in SM_STEP()
437 else if (!sm->portValid) in SM_STEP()
441 if (!sm->eapRestart) in SM_STEP()
461 eapol_sm_processKey(sm); in SM_STATE()
462 sm->rxKey = false; in SM_STATE()
468 if (sm->initialize || !sm->portEnabled) in SM_STEP()
470 switch (sm->KEY_RX_state) { in SM_STEP()
474 if (sm->rxKey) in SM_STEP()
478 if (sm->rxKey) in SM_STEP()
488 sm->authWhile = 0; in SM_STATE()
489 sm->eapReq = true; in SM_STATE()
490 eapol_sm_getSuppRsp(sm); in SM_STATE()
497 eapol_sm_txSuppRsp(sm); in SM_STATE()
498 sm->eapResp = false; in SM_STATE()
505 sm->keyRun = true; in SM_STATE()
506 sm->suppSuccess = true; in SM_STATE()
509 if (sm->use_eap_proxy) { in SM_STATE()
510 if (eap_proxy_key_available(sm->eap_proxy)) { in SM_STATE()
516 sm->replay_counter_valid = false; in SM_STATE()
519 sm->eap_proxy, &session_id_len); in SM_STATE()
520 emsk = eap_proxy_get_emsk(sm->eap_proxy, &emsk_len); in SM_STATE()
521 if (sm->config->erp && session_id && emsk) { in SM_STATE()
522 eap_peer_erp_init(sm->eap, session_id, in SM_STATE()
534 if (eap_key_available(sm->eap)) { in SM_STATE()
537 sm->replay_counter_valid = false; in SM_STATE()
545 sm->suppFail = true; in SM_STATE()
552 sm->suppTimeout = true; in SM_STATE()
559 sm->suppStart = false; in SM_STATE()
560 sm->initial_req = true; in SM_STATE()
567 eapol_sm_abortSupp(sm); in SM_STATE()
568 sm->suppAbort = false; in SM_STATE()
577 sm->authWhile = 0; in SM_STATE()
584 sm->authWhile = sm->authPeriod; in SM_STATE()
585 eapol_enable_timer_tick(sm); in SM_STATE()
586 sm->eapolEap = false; in SM_STATE()
587 sm->eapNoResp = false; in SM_STATE()
588 sm->initial_req = false; in SM_STATE()
594 if (sm->initialize || sm->suppAbort) in SM_STEP()
596 else switch (sm->SUPP_BE_state) { in SM_STEP()
614 if (sm->eapResp && sm->eapNoResp) { in SM_STEP()
618 if (sm->eapResp) in SM_STEP()
620 else if (sm->eapNoResp) in SM_STEP()
622 else if (sm->eapFail) in SM_STEP()
624 else if (sm->eapSuccess) in SM_STEP()
640 if (sm->eapFail && sm->suppStart) in SM_STEP()
642 else if (sm->eapolEap && sm->suppStart) in SM_STEP()
644 else if (sm->eapSuccess && sm->suppStart) in SM_STEP()
651 if (sm->eapolEap) in SM_STEP()
653 else if (sm->eapFail) in SM_STEP()
655 else if (sm->authWhile == 0) in SM_STEP()
657 else if (sm->eapSuccess) in SM_STEP()
664 static void eapol_sm_txLogoff(struct eapol_sm *sm) in eapol_sm_txLogoff() argument
667 sm->ctx->eapol_send(sm->ctx->eapol_send_ctx, in eapol_sm_txLogoff()
669 sm->dot1xSuppEapolLogoffFramesTx++; in eapol_sm_txLogoff()
670 sm->dot1xSuppEapolFramesTx++; in eapol_sm_txLogoff()
674 static void eapol_sm_txStart(struct eapol_sm *sm) in eapol_sm_txStart() argument
677 sm->ctx->eapol_send(sm->ctx->eapol_send_ctx, in eapol_sm_txStart()
679 sm->dot1xSuppEapolStartFramesTx++; in eapol_sm_txStart()
680 sm->dot1xSuppEapolFramesTx++; in eapol_sm_txStart()
693 static void eapol_sm_processKey(struct eapol_sm *sm) in eapol_sm_processKey() argument
709 if (sm->last_rx_key == NULL) in eapol_sm_processKey()
712 if (!sm->conf.accept_802_1x_keys) { in eapol_sm_processKey()
719 if (sm->last_rx_key_len < sizeof(*hdr) + sizeof(*key)) in eapol_sm_processKey()
721 hdr = (struct ieee802_1x_hdr *) sm->last_rx_key; in eapol_sm_processKey()
724 if (sizeof(*hdr) + plen > sm->last_rx_key_len || plen < sizeof(*key)) { in eapol_sm_processKey()
734 eapol_sm_notify_lower_layer_success(sm, 1); in eapol_sm_processKey()
737 res = eapol_sm_get_key(sm, (u8 *) &keydata, sizeof(keydata)); in eapol_sm_processKey()
745 res = eapol_sm_get_key(sm, (u8 *) &keydata, 16); in eapol_sm_processKey()
761 if (sm->replay_counter_valid && in eapol_sm_processKey()
762 os_memcmp(sm->last_replay_counter, key->replay_counter, in eapol_sm_processKey()
767 sm->last_replay_counter, in eapol_sm_processKey()
778 sm->last_rx_key, sizeof(*hdr) + be_to_host16(hdr->length), in eapol_sm_processKey()
834 sm->replay_counter_valid = true; in eapol_sm_processKey()
835 os_memcpy(sm->last_replay_counter, key->replay_counter, in eapol_sm_processKey()
844 if (sm->ctx->set_wep_key && in eapol_sm_processKey()
845 sm->ctx->set_wep_key(sm->ctx->ctx, in eapol_sm_processKey()
853 sm->unicast_key_received = true; in eapol_sm_processKey()
855 sm->broadcast_key_received = true; in eapol_sm_processKey()
857 if ((sm->unicast_key_received || in eapol_sm_processKey()
858 !(sm->conf.required_keys & EAPOL_REQUIRE_KEY_UNICAST)) && in eapol_sm_processKey()
859 (sm->broadcast_key_received || in eapol_sm_processKey()
860 !(sm->conf.required_keys & EAPOL_REQUIRE_KEY_BROADCAST))) in eapol_sm_processKey()
864 sm->portValid = true; in eapol_sm_processKey()
865 if (sm->ctx->eapol_done_cb) in eapol_sm_processKey()
866 sm->ctx->eapol_done_cb(sm->ctx->ctx); in eapol_sm_processKey()
874 static void eapol_sm_getSuppRsp(struct eapol_sm *sm) in eapol_sm_getSuppRsp() argument
884 static void eapol_sm_txSuppRsp(struct eapol_sm *sm) in eapol_sm_txSuppRsp() argument
891 if (sm->use_eap_proxy) { in eapol_sm_txSuppRsp()
893 resp = eap_proxy_get_eapRespData(sm->eap_proxy); in eapol_sm_txSuppRsp()
902 resp = eap_get_eapRespData(sm->eap); in eapol_sm_txSuppRsp()
910 sm->ctx->eapol_send(sm->ctx->eapol_send_ctx, in eapol_sm_txSuppRsp()
917 if (sm->initial_req) in eapol_sm_txSuppRsp()
918 sm->dot1xSuppEapolReqIdFramesRx++; in eapol_sm_txSuppRsp()
920 sm->dot1xSuppEapolReqFramesRx++; in eapol_sm_txSuppRsp()
921 sm->dot1xSuppEapolRespFramesTx++; in eapol_sm_txSuppRsp()
922 sm->dot1xSuppEapolFramesTx++; in eapol_sm_txSuppRsp()
926 static void eapol_sm_abortSupp(struct eapol_sm *sm) in eapol_sm_abortSupp() argument
930 os_free(sm->last_rx_key); in eapol_sm_abortSupp()
931 sm->last_rx_key = NULL; in eapol_sm_abortSupp()
932 wpabuf_free(sm->eapReqData); in eapol_sm_abortSupp()
933 sm->eapReqData = NULL; in eapol_sm_abortSupp()
934 eap_sm_abort(sm->eap); in eapol_sm_abortSupp()
936 eap_proxy_sm_abort(sm->eap_proxy); in eapol_sm_abortSupp()
947 static void eapol_sm_set_port_authorized(struct eapol_sm *sm) in eapol_sm_set_port_authorized() argument
951 cb = sm->suppPortStatus != Authorized || sm->force_authorized_update; in eapol_sm_set_port_authorized()
952 sm->force_authorized_update = false; in eapol_sm_set_port_authorized()
953 sm->suppPortStatus = Authorized; in eapol_sm_set_port_authorized()
954 if (cb && sm->ctx->port_cb) in eapol_sm_set_port_authorized()
955 sm->ctx->port_cb(sm->ctx->ctx, 1); in eapol_sm_set_port_authorized()
959 static void eapol_sm_set_port_unauthorized(struct eapol_sm *sm) in eapol_sm_set_port_unauthorized() argument
963 cb = sm->suppPortStatus != Unauthorized || sm->force_authorized_update; in eapol_sm_set_port_unauthorized()
964 sm->force_authorized_update = false; in eapol_sm_set_port_unauthorized()
965 sm->suppPortStatus = Unauthorized; in eapol_sm_set_port_unauthorized()
966 if (cb && sm->ctx->port_cb) in eapol_sm_set_port_unauthorized()
967 sm->ctx->port_cb(sm->ctx->ctx, 0); in eapol_sm_set_port_unauthorized()
979 void eapol_sm_step(struct eapol_sm *sm) in eapol_sm_step() argument
988 sm->changed = false; in eapol_sm_step()
993 if (sm->use_eap_proxy) { in eapol_sm_step()
995 if (eap_proxy_sm_step(sm->eap_proxy, sm->eap)) in eapol_sm_step()
996 sm->changed = true; in eapol_sm_step()
999 if (eap_peer_sm_step(sm->eap)) in eapol_sm_step()
1000 sm->changed = true; in eapol_sm_step()
1001 if (!sm->changed) in eapol_sm_step()
1005 if (sm->changed) { in eapol_sm_step()
1008 eloop_cancel_timeout(eapol_sm_step_timeout, NULL, sm); in eapol_sm_step()
1009 eloop_register_timeout(0, 0, eapol_sm_step_timeout, NULL, sm); in eapol_sm_step()
1012 if (sm->ctx->cb && sm->cb_status != EAPOL_CB_IN_PROGRESS) { in eapol_sm_step()
1014 if (sm->cb_status == EAPOL_CB_SUCCESS) in eapol_sm_step()
1016 else if (eap_peer_was_failure_expected(sm->eap)) in eapol_sm_step()
1020 sm->cb_status = EAPOL_CB_IN_PROGRESS; in eapol_sm_step()
1021 sm->ctx->cb(sm, result, sm->ctx->cb_ctx); in eapol_sm_step()
1113 void eapol_sm_configure(struct eapol_sm *sm, int heldPeriod, int authPeriod, in eapol_sm_configure() argument
1116 if (sm == NULL) in eapol_sm_configure()
1119 sm->heldPeriod = heldPeriod; in eapol_sm_configure()
1121 sm->authPeriod = authPeriod; in eapol_sm_configure()
1123 sm->startPeriod = startPeriod; in eapol_sm_configure()
1125 sm->maxStart = maxStart; in eapol_sm_configure()
1134 const char * eapol_sm_get_method_name(struct eapol_sm *sm) in eapol_sm_get_method_name() argument
1136 if (sm->SUPP_PAE_state != SUPP_PAE_AUTHENTICATED || in eapol_sm_get_method_name()
1137 sm->suppPortStatus != Authorized) in eapol_sm_get_method_name()
1140 return eap_sm_get_method_name(sm->eap); in eapol_sm_get_method_name()
1158 int eapol_sm_get_status(struct eapol_sm *sm, char *buf, size_t buflen, in eapol_sm_get_status() argument
1162 if (sm == NULL) in eapol_sm_get_status()
1168 eapol_supp_pae_state(sm->SUPP_PAE_state), in eapol_sm_get_status()
1169 eapol_port_status(sm->suppPortStatus)); in eapol_sm_get_status()
1181 sm->heldPeriod, in eapol_sm_get_status()
1182 sm->authPeriod, in eapol_sm_get_status()
1183 sm->startPeriod, in eapol_sm_get_status()
1184 sm->maxStart, in eapol_sm_get_status()
1185 eapol_port_control(sm->portControl), in eapol_sm_get_status()
1186 eapol_supp_be_state(sm->SUPP_BE_state)); in eapol_sm_get_status()
1193 if (sm->use_eap_proxy) in eapol_sm_get_status()
1194 len += eap_proxy_sm_get_status(sm->eap_proxy, in eapol_sm_get_status()
1199 len += eap_sm_get_status(sm->eap, buf + len, buflen - len, verbose); in eapol_sm_get_status()
1217 int eapol_sm_get_mib(struct eapol_sm *sm, char *buf, size_t buflen) in eapol_sm_get_mib() argument
1222 if (sm == NULL) in eapol_sm_get_mib()
1232 sm->SUPP_PAE_state, in eapol_sm_get_mib()
1233 sm->heldPeriod, in eapol_sm_get_mib()
1234 sm->authPeriod, in eapol_sm_get_mib()
1235 sm->startPeriod, in eapol_sm_get_mib()
1236 sm->maxStart, in eapol_sm_get_mib()
1237 sm->suppPortStatus == Authorized ? in eapol_sm_get_mib()
1239 sm->SUPP_BE_state); in eapol_sm_get_mib()
1257 sm->dot1xSuppEapolFramesRx, in eapol_sm_get_mib()
1258 sm->dot1xSuppEapolFramesTx, in eapol_sm_get_mib()
1259 sm->dot1xSuppEapolStartFramesTx, in eapol_sm_get_mib()
1260 sm->dot1xSuppEapolLogoffFramesTx, in eapol_sm_get_mib()
1261 sm->dot1xSuppEapolRespFramesTx, in eapol_sm_get_mib()
1262 sm->dot1xSuppEapolReqIdFramesRx, in eapol_sm_get_mib()
1263 sm->dot1xSuppEapolReqFramesRx, in eapol_sm_get_mib()
1264 sm->dot1xSuppInvalidEapolFramesRx, in eapol_sm_get_mib()
1265 sm->dot1xSuppEapLengthErrorFramesRx, in eapol_sm_get_mib()
1266 sm->dot1xSuppLastEapolFrameVersion, in eapol_sm_get_mib()
1267 MAC2STR(sm->dot1xSuppLastEapolFrameSource)); in eapol_sm_get_mib()
1288 int eapol_sm_rx_eapol(struct eapol_sm *sm, const u8 *src, const u8 *buf, in eapol_sm_rx_eapol() argument
1297 if (sm == NULL) in eapol_sm_rx_eapol()
1300 if (encrypted == FRAME_NOT_ENCRYPTED && sm->ctx->encryption_required && in eapol_sm_rx_eapol()
1301 sm->ctx->encryption_required(sm->ctx->ctx)) { in eapol_sm_rx_eapol()
1307 sm->dot1xSuppEapolFramesRx++; in eapol_sm_rx_eapol()
1309 sm->dot1xSuppInvalidEapolFramesRx++; in eapol_sm_rx_eapol()
1313 sm->dot1xSuppLastEapolFrameVersion = hdr->version; in eapol_sm_rx_eapol()
1314 os_memcpy(sm->dot1xSuppLastEapolFrameSource, src, ETH_ALEN); in eapol_sm_rx_eapol()
1320 sm->dot1xSuppEapLengthErrorFramesRx++; in eapol_sm_rx_eapol()
1324 if (sm->conf.wps && sm->conf.workaround && in eapol_sm_rx_eapol()
1352 if (sm->conf.workaround) { in eapol_sm_rx_eapol()
1370 if (sm->cached_pmk) { in eapol_sm_rx_eapol()
1375 eapol_sm_abort_cached(sm); in eapol_sm_rx_eapol()
1377 wpabuf_free(sm->eapReqData); in eapol_sm_rx_eapol()
1378 sm->eapReqData = wpabuf_alloc_copy(hdr + 1, plen); in eapol_sm_rx_eapol()
1379 if (sm->eapReqData) { in eapol_sm_rx_eapol()
1382 sm->eapolEap = true; in eapol_sm_rx_eapol()
1384 if (sm->use_eap_proxy) { in eapol_sm_rx_eapol()
1386 sm->eap_proxy, in eapol_sm_rx_eapol()
1387 wpabuf_mhead_u8(sm->eapReqData), in eapol_sm_rx_eapol()
1388 wpabuf_len(sm->eapReqData)); in eapol_sm_rx_eapol()
1393 eapol_sm_step(sm); in eapol_sm_rx_eapol()
1416 os_free(sm->last_rx_key); in eapol_sm_rx_eapol()
1417 sm->last_rx_key = os_malloc(data_len); in eapol_sm_rx_eapol()
1418 if (sm->last_rx_key) { in eapol_sm_rx_eapol()
1421 os_memcpy(sm->last_rx_key, buf, data_len); in eapol_sm_rx_eapol()
1422 sm->last_rx_key_len = data_len; in eapol_sm_rx_eapol()
1423 sm->rxKey = true; in eapol_sm_rx_eapol()
1424 eapol_sm_step(sm); in eapol_sm_rx_eapol()
1437 sm->dot1xSuppInvalidEapolFramesRx++; in eapol_sm_rx_eapol()
1452 void eapol_sm_notify_tx_eapol_key(struct eapol_sm *sm) in eapol_sm_notify_tx_eapol_key() argument
1454 if (sm) in eapol_sm_notify_tx_eapol_key()
1455 sm->dot1xSuppEapolFramesTx++; in eapol_sm_notify_tx_eapol_key()
1466 void eapol_sm_notify_portEnabled(struct eapol_sm *sm, bool enabled) in eapol_sm_notify_portEnabled() argument
1468 if (sm == NULL) in eapol_sm_notify_portEnabled()
1472 if (sm->portEnabled != enabled) in eapol_sm_notify_portEnabled()
1473 sm->force_authorized_update = true; in eapol_sm_notify_portEnabled()
1474 sm->portEnabled = enabled; in eapol_sm_notify_portEnabled()
1475 eapol_sm_step(sm); in eapol_sm_notify_portEnabled()
1486 void eapol_sm_notify_portValid(struct eapol_sm *sm, bool valid) in eapol_sm_notify_portValid() argument
1488 if (sm == NULL) in eapol_sm_notify_portValid()
1492 sm->portValid = valid; in eapol_sm_notify_portValid()
1493 eapol_sm_step(sm); in eapol_sm_notify_portValid()
1508 void eapol_sm_notify_eap_success(struct eapol_sm *sm, bool success) in eapol_sm_notify_eap_success() argument
1510 if (sm == NULL) in eapol_sm_notify_eap_success()
1514 sm->eapSuccess = success; in eapol_sm_notify_eap_success()
1515 sm->altAccept = success; in eapol_sm_notify_eap_success()
1517 eap_notify_success(sm->eap); in eapol_sm_notify_eap_success()
1518 eapol_sm_step(sm); in eapol_sm_notify_eap_success()
1530 void eapol_sm_notify_eap_fail(struct eapol_sm *sm, bool fail) in eapol_sm_notify_eap_fail() argument
1532 if (sm == NULL) in eapol_sm_notify_eap_fail()
1536 sm->eapFail = fail; in eapol_sm_notify_eap_fail()
1537 sm->altReject = fail; in eapol_sm_notify_eap_fail()
1538 eapol_sm_step(sm); in eapol_sm_notify_eap_fail()
1554 void eapol_sm_notify_config(struct eapol_sm *sm, in eapol_sm_notify_config() argument
1558 if (sm == NULL) in eapol_sm_notify_config()
1561 sm->config = config; in eapol_sm_notify_config()
1563 sm->use_eap_proxy = eap_proxy_notify_config(sm->eap_proxy, config) > 0; in eapol_sm_notify_config()
1569 sm->conf.accept_802_1x_keys = conf->accept_802_1x_keys; in eapol_sm_notify_config()
1570 sm->conf.required_keys = conf->required_keys; in eapol_sm_notify_config()
1571 sm->conf.fast_reauth = conf->fast_reauth; in eapol_sm_notify_config()
1572 sm->conf.workaround = conf->workaround; in eapol_sm_notify_config()
1573 sm->conf.wps = conf->wps; in eapol_sm_notify_config()
1575 if (sm->use_eap_proxy) { in eapol_sm_notify_config()
1580 if (sm->eap) { in eapol_sm_notify_config()
1581 eap_set_fast_reauth(sm->eap, conf->fast_reauth); in eapol_sm_notify_config()
1582 eap_set_workaround(sm->eap, conf->workaround); in eapol_sm_notify_config()
1583 eap_set_force_disabled(sm->eap, conf->eap_disabled); in eapol_sm_notify_config()
1584 eap_set_external_sim(sm->eap, conf->external_sim); in eapol_sm_notify_config()
1600 int eapol_sm_get_key(struct eapol_sm *sm, u8 *key, size_t len) in eapol_sm_get_key() argument
1606 if (sm && sm->use_eap_proxy) { in eapol_sm_get_key()
1608 if (sm == NULL || !eap_proxy_key_available(sm->eap_proxy)) { in eapol_sm_get_key()
1612 eap_key = eap_proxy_get_eapKeyData(sm->eap_proxy, &eap_len); in eapol_sm_get_key()
1621 if (sm == NULL || !eap_key_available(sm->eap)) { in eapol_sm_get_key()
1625 eap_key = eap_get_eapKeyData(sm->eap, &eap_len); in eapol_sm_get_key()
1654 const u8 * eapol_sm_get_session_id(struct eapol_sm *sm, size_t *len) in eapol_sm_get_session_id() argument
1656 if (sm == NULL || !eap_key_available(sm->eap)) { in eapol_sm_get_session_id()
1660 return eap_get_eapSessionId(sm->eap, len); in eapol_sm_get_session_id()
1671 void eapol_sm_notify_logoff(struct eapol_sm *sm, bool logoff) in eapol_sm_notify_logoff() argument
1673 if (sm) { in eapol_sm_notify_logoff()
1674 sm->userLogoff = logoff; in eapol_sm_notify_logoff()
1677 sm->startWhen = 0; in eapol_sm_notify_logoff()
1679 eapol_sm_step(sm); in eapol_sm_notify_logoff()
1691 void eapol_sm_notify_cached(struct eapol_sm *sm) in eapol_sm_notify_cached() argument
1693 if (sm == NULL) in eapol_sm_notify_cached()
1696 sm->eapSuccess = true; in eapol_sm_notify_cached()
1697 eap_notify_success(sm->eap); in eapol_sm_notify_cached()
1698 eapol_sm_step(sm); in eapol_sm_notify_cached()
1708 void eapol_sm_notify_pmkid_attempt(struct eapol_sm *sm) in eapol_sm_notify_pmkid_attempt() argument
1710 if (sm == NULL) in eapol_sm_notify_pmkid_attempt()
1713 sm->cached_pmk = true; in eapol_sm_notify_pmkid_attempt()
1717 static void eapol_sm_abort_cached(struct eapol_sm *sm) in eapol_sm_abort_cached() argument
1721 if (sm == NULL) in eapol_sm_abort_cached()
1723 sm->cached_pmk = false; in eapol_sm_abort_cached()
1724 sm->SUPP_PAE_state = SUPP_PAE_CONNECTING; in eapol_sm_abort_cached()
1725 eapol_sm_set_port_unauthorized(sm); in eapol_sm_abort_cached()
1729 sm->startWhen = 3; in eapol_sm_abort_cached()
1730 eapol_enable_timer_tick(sm); in eapol_sm_abort_cached()
1732 if (sm->ctx->aborted_cached) in eapol_sm_abort_cached()
1733 sm->ctx->aborted_cached(sm->ctx->ctx); in eapol_sm_abort_cached()
1745 void eapol_sm_register_scard_ctx(struct eapol_sm *sm, void *ctx) in eapol_sm_register_scard_ctx() argument
1747 if (sm) { in eapol_sm_register_scard_ctx()
1748 sm->ctx->scard_ctx = ctx; in eapol_sm_register_scard_ctx()
1749 eap_register_scard_ctx(sm->eap, ctx); in eapol_sm_register_scard_ctx()
1761 void eapol_sm_notify_portControl(struct eapol_sm *sm, PortControl portControl) in eapol_sm_notify_portControl() argument
1763 if (sm == NULL) in eapol_sm_notify_portControl()
1767 sm->portControl = portControl; in eapol_sm_notify_portControl()
1768 eapol_sm_step(sm); in eapol_sm_notify_portControl()
1779 void eapol_sm_notify_ctrl_attached(struct eapol_sm *sm) in eapol_sm_notify_ctrl_attached() argument
1781 if (sm == NULL) in eapol_sm_notify_ctrl_attached()
1783 eap_sm_notify_ctrl_attached(sm->eap); in eapol_sm_notify_ctrl_attached()
1794 void eapol_sm_notify_ctrl_response(struct eapol_sm *sm) in eapol_sm_notify_ctrl_response() argument
1796 if (sm == NULL) in eapol_sm_notify_ctrl_response()
1798 if (sm->eapReqData && !sm->eapReq) { in eapol_sm_notify_ctrl_response()
1802 sm->eapolEap = true; in eapol_sm_notify_ctrl_response()
1803 sm->eapReq = true; in eapol_sm_notify_ctrl_response()
1804 eapol_sm_step(sm); in eapol_sm_notify_ctrl_response()
1816 void eapol_sm_request_reauth(struct eapol_sm *sm) in eapol_sm_request_reauth() argument
1818 if (sm == NULL || sm->SUPP_PAE_state != SUPP_PAE_AUTHENTICATED) in eapol_sm_request_reauth()
1820 eapol_sm_txStart(sm); in eapol_sm_request_reauth()
1834 void eapol_sm_notify_lower_layer_success(struct eapol_sm *sm, int in_eapol_sm) in eapol_sm_notify_lower_layer_success() argument
1836 if (sm == NULL) in eapol_sm_notify_lower_layer_success()
1838 eap_notify_lower_layer_success(sm->eap); in eapol_sm_notify_lower_layer_success()
1840 eapol_sm_step(sm); in eapol_sm_notify_lower_layer_success()
1848 void eapol_sm_invalidate_cached_session(struct eapol_sm *sm) in eapol_sm_invalidate_cached_session() argument
1850 if (sm) in eapol_sm_invalidate_cached_session()
1851 eap_invalidate_cached_session(sm->eap); in eapol_sm_invalidate_cached_session()
1857 struct eapol_sm *sm = ctx; in eapol_sm_get_config() local
1858 return sm ? sm->config : NULL; in eapol_sm_get_config()
1864 struct eapol_sm *sm = ctx; in eapol_sm_get_eapReqData() local
1865 if (sm == NULL || sm->eapReqData == NULL) in eapol_sm_get_eapReqData()
1868 return sm->eapReqData; in eapol_sm_get_eapReqData()
1874 struct eapol_sm *sm = ctx; in eapol_sm_get_bool() local
1875 if (sm == NULL) in eapol_sm_get_bool()
1879 return sm->eapSuccess; in eapol_sm_get_bool()
1881 return sm->eapRestart; in eapol_sm_get_bool()
1883 return sm->eapFail; in eapol_sm_get_bool()
1885 return sm->eapResp; in eapol_sm_get_bool()
1887 return sm->eapNoResp; in eapol_sm_get_bool()
1889 return sm->eapReq; in eapol_sm_get_bool()
1891 return sm->portEnabled; in eapol_sm_get_bool()
1893 return sm->altAccept; in eapol_sm_get_bool()
1895 return sm->altReject; in eapol_sm_get_bool()
1897 return sm->eapTriggerStart; in eapol_sm_get_bool()
1906 struct eapol_sm *sm = ctx; in eapol_sm_set_bool() local
1907 if (sm == NULL) in eapol_sm_set_bool()
1911 sm->eapSuccess = value; in eapol_sm_set_bool()
1914 sm->eapRestart = value; in eapol_sm_set_bool()
1917 sm->eapFail = value; in eapol_sm_set_bool()
1920 sm->eapResp = value; in eapol_sm_set_bool()
1923 sm->eapNoResp = value; in eapol_sm_set_bool()
1926 sm->eapReq = value; in eapol_sm_set_bool()
1929 sm->portEnabled = value; in eapol_sm_set_bool()
1932 sm->altAccept = value; in eapol_sm_set_bool()
1935 sm->altReject = value; in eapol_sm_set_bool()
1938 sm->eapTriggerStart = value; in eapol_sm_set_bool()
1946 struct eapol_sm *sm = ctx; in eapol_sm_get_int() local
1947 if (sm == NULL) in eapol_sm_get_int()
1951 return sm->idleWhile; in eapol_sm_get_int()
1960 struct eapol_sm *sm = ctx; in eapol_sm_set_int() local
1961 if (sm == NULL) in eapol_sm_set_int()
1965 sm->idleWhile = value; in eapol_sm_set_int()
1966 if (sm->idleWhile > 0) in eapol_sm_set_int()
1967 eapol_enable_timer_tick(sm); in eapol_sm_set_int()
1976 struct eapol_sm *sm = ctx; in eapol_sm_set_config_blob() local
1977 if (sm && sm->ctx && sm->ctx->set_config_blob) in eapol_sm_set_config_blob()
1978 sm->ctx->set_config_blob(sm->ctx->ctx, blob); in eapol_sm_set_config_blob()
1987 struct eapol_sm *sm = ctx; in eapol_sm_get_config_blob() local
1988 if (sm && sm->ctx && sm->ctx->get_config_blob) in eapol_sm_get_config_blob()
1989 return sm->ctx->get_config_blob(sm->ctx->ctx, name); in eapol_sm_get_config_blob()
2000 struct eapol_sm *sm = ctx; in eapol_sm_notify_pending() local
2001 if (sm == NULL) in eapol_sm_notify_pending()
2003 if (sm->eapReqData && !sm->eapReq) { in eapol_sm_notify_pending()
2006 sm->eapolEap = true; in eapol_sm_notify_pending()
2007 sm->eapReq = true; in eapol_sm_notify_pending()
2008 eapol_sm_step(sm); in eapol_sm_notify_pending()
2017 struct eapol_sm *sm = ctx; in eapol_sm_eap_param_needed() local
2019 if (sm->ctx->eap_param_needed) in eapol_sm_eap_param_needed()
2020 sm->ctx->eap_param_needed(sm->ctx->ctx, field, txt); in eapol_sm_eap_param_needed()
2029 struct eapol_sm *sm = ctx; in eapol_sm_notify_cert() local
2030 if (sm->ctx->cert_cb) in eapol_sm_notify_cert()
2031 sm->ctx->cert_cb(sm->ctx->ctx, cert, cert_hash); in eapol_sm_notify_cert()
2038 struct eapol_sm *sm = ctx; in eapol_sm_notify_status() local
2040 if (sm->ctx->status_cb) in eapol_sm_notify_status()
2041 sm->ctx->status_cb(sm->ctx->ctx, status, parameter); in eapol_sm_notify_status()
2047 struct eapol_sm *sm = ctx; in eapol_sm_notify_eap_error() local
2049 if (sm->ctx->eap_error_cb) in eapol_sm_notify_eap_error()
2050 sm->ctx->eap_error_cb(sm->ctx->ctx, error_code); in eapol_sm_notify_eap_error()
2058 struct eapol_sm *sm = ctx; in eapol_sm_eap_proxy_cb() local
2060 if (sm->ctx->eap_proxy_cb) in eapol_sm_eap_proxy_cb()
2061 sm->ctx->eap_proxy_cb(sm->ctx->ctx); in eapol_sm_eap_proxy_cb()
2069 struct eapol_sm *sm = ctx; in eapol_sm_eap_proxy_notify_sim_status() local
2071 if (sm->ctx->eap_proxy_notify_sim_status) in eapol_sm_eap_proxy_notify_sim_status()
2072 sm->ctx->eap_proxy_notify_sim_status(sm->ctx->ctx, sim_state); in eapol_sm_eap_proxy_notify_sim_status()
2080 struct eapol_sm *sm = ctx; in eapol_sm_set_anon_id() local
2082 if (sm->ctx->set_anon_id) in eapol_sm_set_anon_id()
2083 sm->ctx->set_anon_id(sm->ctx->ctx, id, len); in eapol_sm_set_anon_id()
2121 struct eapol_sm *sm; in eapol_sm_init() local
2123 sm = os_zalloc(sizeof(*sm)); in eapol_sm_init()
2124 if (sm == NULL) in eapol_sm_init()
2126 sm->ctx = ctx; in eapol_sm_init()
2128 sm->portControl = Auto; in eapol_sm_init()
2131 sm->heldPeriod = 60; in eapol_sm_init()
2132 sm->startPeriod = 30; in eapol_sm_init()
2133 sm->maxStart = 3; in eapol_sm_init()
2136 sm->authPeriod = 30; in eapol_sm_init()
2152 sm->eap = eap_peer_sm_init(sm, &eapol_cb, sm->ctx->msg_ctx, &conf); in eapol_sm_init()
2153 if (sm->eap == NULL) { in eapol_sm_init()
2154 os_free(sm); in eapol_sm_init()
2159 sm->use_eap_proxy = false; in eapol_sm_init()
2160 sm->eap_proxy = eap_proxy_init(sm, &eapol_cb, sm->ctx->msg_ctx); in eapol_sm_init()
2161 if (sm->eap_proxy == NULL) { in eapol_sm_init()
2167 sm->force_authorized_update = true; in eapol_sm_init()
2168 sm->initialize = true; in eapol_sm_init()
2169 eapol_sm_step(sm); in eapol_sm_init()
2170 sm->initialize = false; in eapol_sm_init()
2171 eapol_sm_step(sm); in eapol_sm_init()
2173 if (eloop_register_timeout(1, 0, eapol_port_timers_tick, NULL, sm) == 0) in eapol_sm_init()
2174 sm->timer_tick_enabled = 1; in eapol_sm_init()
2176 return sm; in eapol_sm_init()
2186 void eapol_sm_deinit(struct eapol_sm *sm) in eapol_sm_deinit() argument
2188 if (sm == NULL) in eapol_sm_deinit()
2190 eloop_cancel_timeout(eapol_sm_step_timeout, NULL, sm); in eapol_sm_deinit()
2191 eloop_cancel_timeout(eapol_port_timers_tick, NULL, sm); in eapol_sm_deinit()
2192 eap_peer_sm_deinit(sm->eap); in eapol_sm_deinit()
2194 eap_proxy_deinit(sm->eap_proxy); in eapol_sm_deinit()
2196 os_free(sm->last_rx_key); in eapol_sm_deinit()
2197 wpabuf_free(sm->eapReqData); in eapol_sm_deinit()
2198 os_free(sm->ctx); in eapol_sm_deinit()
2199 os_free(sm); in eapol_sm_deinit()
2203 void eapol_sm_set_ext_pw_ctx(struct eapol_sm *sm, in eapol_sm_set_ext_pw_ctx() argument
2206 if (sm && sm->eap) in eapol_sm_set_ext_pw_ctx()
2207 eap_sm_set_ext_pw_ctx(sm->eap, ext); in eapol_sm_set_ext_pw_ctx()
2211 int eapol_sm_failed(struct eapol_sm *sm) in eapol_sm_failed() argument
2213 if (sm == NULL) in eapol_sm_failed()
2215 return !sm->eapSuccess && sm->eapFail; in eapol_sm_failed()
2222 struct eapol_sm *sm = ctx; in eapol_sm_get_eap_proxy_imsi() local
2224 if (sm->eap_proxy == NULL) in eapol_sm_get_eap_proxy_imsi()
2226 return eap_proxy_get_imsi(sm->eap_proxy, sim_num, imsi, len); in eapol_sm_get_eap_proxy_imsi()
2231 void eapol_sm_erp_flush(struct eapol_sm *sm) in eapol_sm_erp_flush() argument
2233 if (sm) in eapol_sm_erp_flush()
2234 eap_peer_erp_free_keys(sm->eap); in eapol_sm_erp_flush()
2238 struct wpabuf * eapol_sm_build_erp_reauth_start(struct eapol_sm *sm) in eapol_sm_build_erp_reauth_start() argument
2241 if (!sm) in eapol_sm_build_erp_reauth_start()
2243 return eap_peer_build_erp_reauth_start(sm->eap, 0); in eapol_sm_build_erp_reauth_start()
2250 void eapol_sm_process_erp_finish(struct eapol_sm *sm, const u8 *buf, in eapol_sm_process_erp_finish() argument
2254 if (!sm) in eapol_sm_process_erp_finish()
2256 eap_peer_finish(sm->eap, (const struct eap_hdr *) buf, len); in eapol_sm_process_erp_finish()
2261 int eapol_sm_update_erp_next_seq_num(struct eapol_sm *sm, u16 next_seq_num) in eapol_sm_update_erp_next_seq_num() argument
2264 if (!sm) in eapol_sm_update_erp_next_seq_num()
2266 return eap_peer_update_erp_next_seq_num(sm->eap, next_seq_num); in eapol_sm_update_erp_next_seq_num()
2273 int eapol_sm_get_erp_info(struct eapol_sm *sm, struct eap_peer_config *config, in eapol_sm_get_erp_info() argument
2280 if (!sm) in eapol_sm_get_erp_info()
2282 return eap_peer_get_erp_info(sm->eap, config, username, username_len, in eapol_sm_get_erp_info()