static bool ieee80211_assoc_state_run_event(void *ctx, u_int16_t event, u_int16_t event_data_len, void *event_data) { wlan_assoc_sm_t sm = (wlan_assoc_sm_t) ctx; wlan_if_t vap = sm->vap_handle; u_int32_t time_elapsed; switch(event) { case IEEE80211_ASSOC_EVENT_BEACON_MISS: sm->last_failure = WLAN_ASSOC_SM_REASON_BEACON_MISS; /* beacon miss */ ieee80211_sm_transition_to(sm->hsm_handle,IEEE80211_ASSOC_STATE_INIT); return true; break; case IEEE80211_ASSOC_EVENT_DISASSOC: time_elapsed = CONVERT_SYSTEM_TIME_TO_MS(OS_GET_TIMESTAMP() - sm->last_connected_time); if ((sm->last_reason == IEEE80211_REASON_AUTH_EXPIRE || sm->last_reason == IEEE80211_REASON_ASSOC_EXPIRE) && (vap->auto_assoc)) { ieee80211_send_event(sm, WLAN_ASSOC_SM_EVENT_REJOINING, WLAN_ASSOC_SM_REASON_DISASSOC); ieee80211_sm_transition_to(sm->hsm_handle,IEEE80211_ASSOC_STATE_JOIN); #if ATH_SUPPORT_WPA_SUPPLICANT_CHECK_TIME } else if(sm->cur_rejoin_attempts < vap->iv_rejoint_attemp_time ) { sm->cur_rejoin_attempts++; ieee80211_send_event(sm, WLAN_ASSOC_SM_EVENT_REJOINING, WLAN_ASSOC_SM_REASON_DISASSOC); ieee80211_sm_transition_to(sm->hsm_handle, IEEE80211_ASSOC_STATE_JOIN); } else { #else } else if(sm->cur_rejoin_attempts < REJOIN_ATTEMP_TIME && time_elapsed < REJOIN_CHECKING_TIME) { sm->cur_rejoin_attempts++; ieee80211_send_event(sm, WLAN_ASSOC_SM_EVENT_REJOINING, WLAN_ASSOC_SM_REASON_DISASSOC); ieee80211_sm_transition_to(sm->hsm_handle, IEEE80211_ASSOC_STATE_JOIN); } else { #endif ieee80211_sm_transition_to(sm->hsm_handle,IEEE80211_ASSOC_STATE_INIT); } return true; break; case IEEE80211_ASSOC_EVENT_DEAUTH: time_elapsed = CONVERT_SYSTEM_TIME_TO_MS(OS_GET_TIMESTAMP() - sm->last_connected_time); if ((sm->last_reason == IEEE80211_REASON_AUTH_EXPIRE || sm->last_reason == IEEE80211_REASON_ASSOC_EXPIRE) && (vap->auto_assoc)) { ieee80211_send_event(sm, WLAN_ASSOC_SM_EVENT_REJOINING, WLAN_ASSOC_SM_REASON_DEAUTH); ieee80211_sm_transition_to(sm->hsm_handle,IEEE80211_ASSOC_STATE_JOIN); #if ATH_SUPPORT_WPA_SUPPLICANT_CHECK_TIME } else if(sm->cur_rejoin_attempts < vap->iv_rejoint_attemp_time ) { sm->cur_rejoin_attempts++; ieee80211_send_event(sm, WLAN_ASSOC_SM_EVENT_REJOINING, WLAN_ASSOC_SM_REASON_DEAUTH); ieee80211_sm_transition_to(sm->hsm_handle, IEEE80211_ASSOC_STATE_JOIN); } else { #else } else if(sm->cur_rejoin_attempts < REJOIN_ATTEMP_TIME && time_elapsed < REJOIN_CHECKING_TIME) {
/* * BEACONING */ static void ieee80211_btamp_conn_state_beaconing_entry(void *ctx) { wlan_btamp_conn_sm_t sm = (wlan_btamp_conn_sm_t) ctx; if (sm->is_join || sm->cur_auth_attempts) { sm->is_join = 0; sm->cur_auth_attempts = 0; sm->cur_assoc_attempts = 0; ieee80211_send_event(sm, sm->last_failure, sm->last_reason); sm->is_running = 0; } }
static bool ieee80211_assoc_state_auth_event(void *ctx, u_int16_t event, u_int16_t event_data_len, void *event_data) { wlan_assoc_sm_t sm = (wlan_assoc_sm_t) ctx; switch(event) { case IEEE80211_ASSOC_EVENT_AUTH_SUCCESS: ieee80211_sm_transition_to(sm->hsm_handle,IEEE80211_ASSOC_STATE_ASSOC); return true; break; case IEEE80211_ASSOC_EVENT_AUTH_FAIL: case IEEE80211_ASSOC_EVENT_TIMEOUT: sm->last_failure = WLAN_ASSOC_SM_REASON_AUTH_FAILED; if (sm->cur_auth_attempts < sm->max_auth_attempts) { ieee80211_sm_transition_to(sm->hsm_handle,IEEE80211_ASSOC_STATE_AUTH); return true; break; } IEEE80211_DPRINTF(sm->vap_handle,IEEE80211_MSG_STATE,"%s: max auth attempts reached \n",__func__); if (sm->scan_entry) { wlan_scan_entry_set_assoc_state(sm->scan_entry, AP_ASSOC_STATE_NONE); } /* fall thru */ case IEEE80211_ASSOC_EVENT_DISCONNECT_REQUEST: case IEEE80211_ASSOC_EVENT_DISASSOC_REQUEST: /* cancel pending mlme operation */ wlan_mlme_cancel(sm->vap_handle); if (wlan_mlme_operation_in_progress(sm->vap_handle)) { ieee80211_sm_transition_to(sm->hsm_handle,IEEE80211_ASSOC_STATE_MLME_WAIT); } else { ieee80211_sm_transition_to(sm->hsm_handle,IEEE80211_ASSOC_STATE_INIT); } return true; break; case IEEE80211_ASSOC_EVENT_DEAUTH: ieee80211_send_event(sm, WLAN_ASSOC_SM_EVENT_REJOINING, WLAN_ASSOC_SM_REASON_DEAUTH); ieee80211_sm_transition_to(sm->hsm_handle,IEEE80211_ASSOC_STATE_AUTH); return true; break; default: return false; } }
/* * INIT */ static void ieee80211_assoc_state_init_entry(void *ctx) { wlan_assoc_sm_t sm = (wlan_assoc_sm_t) ctx; if (sm->is_join) { sm->is_join=0; /* cancel any pending mlme operation */ wlan_mlme_cancel(sm->vap_handle); if (sm->sync_stop_requested) { wlan_mlme_stop_bss(sm->vap_handle, WLAN_MLME_STOP_BSS_F_FORCE_STOP_RESET); } else { wlan_mlme_connection_reset(sm->vap_handle); } } if (sm->scan_entry) { wlan_scan_entry_remove_reference(sm->scan_entry); sm->scan_entry=NULL; } if (sm->is_stop_requested ) { ieee80211_send_event(sm, WLAN_ASSOC_SM_EVENT_DISCONNECT, 0); } else { ieee80211_send_event(sm, WLAN_ASSOC_SM_EVENT_FAILED, sm->last_failure); } sm->cur_auth_attempts = 0; sm->cur_assoc_attempts = 0; sm->last_reason = 0; sm->last_failure = 0; sm->is_bcn_recvd = 0; sm->is_stop_requested = 0; sm->sync_stop_requested=0; sm->is_running = 0; /* Cisco AP workaround */ sm->last_connected_time = 0; sm->cur_rejoin_attempts = 0; }
/* * CONNECTED */ static void ieee80211_btamp_conn_state_connected_entry(void *ctx) { wlan_btamp_conn_sm_t sm = (wlan_btamp_conn_sm_t) ctx; struct ieee80211vap *vap = (struct ieee80211vap *)sm->vap_handle; struct ieee80211com *ic = vap->iv_ic; struct ieee80211_node *ni = NULL; /* Authorize peer node */ wlan_node_authorize(sm->vap_handle, true, sm->peer); ni = ieee80211_find_node(&ic->ic_sta, sm->peer); if (ni) { /* Set up node tx rate */ if (ic->ic_newassoc) ic->ic_newassoc(ni, TRUE); ieee80211_free_node(ni); } ieee80211_send_event(sm, WLAN_BTAMP_CONN_SM_CONNECTION_UP, WLAN_BTAMP_CONN_SM_REASON_NONE); }