Ejemplo n.º 1
0
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) {
Ejemplo n.º 2
0
/*
 * 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;
    }
}
Ejemplo n.º 3
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;
        
    }
}
Ejemplo n.º 4
0
/*
 * 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;    
}
Ejemplo n.º 5
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);
}