static void ieee80211_btamp_conn_state_assoc_exit(void *ctx) { wlan_btamp_conn_sm_t sm = (wlan_btamp_conn_sm_t) ctx; wlan_mlme_cancel(sm->vap_handle); /* cancel any pending mlme assoc req */ OS_CANCEL_TIMER(&sm->sm_timer); }
static bool ieee80211_assoc_state_join_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_JOIN_SUCCESS: if (wlan_scan_entry_assoc_state(sm->scan_entry) >= AP_ASSOC_STATE_AUTH) { ieee80211_sm_transition_to(sm->hsm_handle,IEEE80211_ASSOC_STATE_ASSOC); } else { ieee80211_sm_transition_to(sm->hsm_handle,IEEE80211_ASSOC_STATE_AUTH); } return true; break; case IEEE80211_ASSOC_EVENT_BEACON_WAIT_TIMEOUT: case IEEE80211_ASSOC_EVENT_BEACON_MISS: case IEEE80211_ASSOC_EVENT_JOIN_FAIL: 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; default: return false; } }
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; }
static int ieee80211_vap_reset(struct ieee80211vap *vap, ieee80211_reset_request *reset_req) { struct ieee80211com *ic = vap->iv_ic; /* Cancel pending MLME requests */ wlan_mlme_cancel(vap); /* * Reset node table include all nodes. * NB: pairwise keys will be deleted during node cleanup. */ ieee80211_reset_bss(vap); /* Reset aplist configuration parameters */ ieee80211_aplist_config_init(ieee80211_vap_get_aplist_config(vap)); /* Reset RSN settings */ ieee80211_rsn_reset(vap); /* Reset statistics */ ieee80211_reset_stats(vap, reset_req->reset_hw); /* Reset some of the misc. vap settings */ vap->iv_des_modecaps = (1 << IEEE80211_MODE_AUTO); vap->iv_des_nssid = 0; OS_MEMZERO(&vap->iv_des_ssid[0], (sizeof(ieee80211_ssid) * IEEE80211_SCAN_MAX_SSID)); /* Because reset_start has graspped a mutex which chan_set *will also try to grasp, so don't call ieee80211_set_channel here. */ #if !ATH_RESET_SERIAL /* Reset some MIB variables if required */ if (reset_req->set_default_mib) { /* * NB: Only IEEE80211_RESET_TYPE_DOT11_INTF can reset MIB variables */ KASSERT(reset_req->type == IEEE80211_RESET_TYPE_DOT11_INTF, ("invalid reset request\n")); if (reset_req->reset_mac) { /* reset regdmn module */ ieee80211_regdmn_reset(ic); } if (reset_req->reset_phy) { /* set the desired PHY mode to 11b */ vap->iv_des_mode = reset_req->phy_mode; /* change to the default PHY mode if required */ /* set wireless mode */ ieee80211_setmode(ic, vap->iv_des_mode, vap->iv_opmode); /* set default channel */ ASSERT(vap->iv_des_chan[vap->iv_des_mode] != IEEE80211_CHAN_ANYC); ieee80211_set_channel(ic, vap->iv_des_chan[vap->iv_des_mode]); vap->iv_bsschan = ic->ic_curchan; } } #endif return 0; }
static void ieee80211_assoc_state_join_exit(void *ctx) { wlan_assoc_sm_t sm = (wlan_assoc_sm_t) ctx; wlan_mlme_cancel(sm->vap_handle);/* cancel any pending mlme join req */ }