/* Confirmations */ void ieee80211_mlme_join_complete_infra(struct ieee80211_node *ni) { struct ieee80211vap *vap = ni->ni_vap; struct ieee80211_mlme_priv *mlme_priv = vap->iv_mlme_priv; if ((mlme_priv->im_request_type == MLME_REQ_JOIN_INFRA) && (MLME_STOP_WAITING_FOR_JOIN(mlme_priv) == 1)) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_MLME, "%s\n", __func__); /* Request complete */ mlme_priv->im_request_type = MLME_REQ_NONE; /* * We have received the beacon that synchronises us with the BSS. * We don't care whether the Timer got cancelled or not. The macro * HW_STOP_WAITING_FOR_JOIN synchronizes us with the cancel operation */ OS_CANCEL_TIMER(&mlme_priv->im_timeout_timer); /* Call MLME confirmation handler */ IEEE80211_DELIVER_EVENT_MLME_JOIN_COMPLETE_INFRA(vap, IEEE80211_STATUS_SUCCESS); } else { if (mlme_priv->im_request_type != MLME_REQ_NONE) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_MLME, "%s: Failed: im_request_type=%d\n", __func__, mlme_priv->im_request_type); } } /* start SW bmiss. will be here for every beacon received from our AP */ mlme_sta_swbmiss_timer_start(vap); }
void ieee80211_mlme_join_complete_btamp(struct ieee80211_node *ni) { struct ieee80211vap *vap = ni->ni_vap; struct ieee80211_mlme_priv *mlme_priv = vap->iv_mlme_priv; IEEE80211_DPRINTF(vap, IEEE80211_MSG_MLME, "%s\n", __func__); /* Request complete */ //mlme_priv->im_request_type = MLME_REQ_NONE; /* Call MLME confirmation handler */ IEEE80211_DELIVER_EVENT_MLME_JOIN_COMPLETE_INFRA(vap, IEEE80211_STATUS_SUCCESS); }
static void mlme_timeout_callback(struct ieee80211vap *vap, IEEE80211_STATUS ieeeStatus) { struct ieee80211_mlme_priv *mlme_priv = vap->iv_mlme_priv; int mlme_request_type = mlme_priv->im_request_type; IEEE80211_DPRINTF(vap, IEEE80211_MSG_MLME, "%s. Request type = %d\n", __func__, mlme_request_type); /* Request complete */ mlme_priv->im_request_type = MLME_REQ_NONE; switch(mlme_request_type) { case MLME_REQ_JOIN_INFRA: ASSERT(vap->iv_opmode != IEEE80211_M_IBSS); /* * Cancel the Join operation if it has not already completed */ if (MLME_STOP_WAITING_FOR_JOIN(mlme_priv) == TRUE) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_MLME,"%s", "Cancelled the Join Operation as it took too long\n"); IEEE80211_DELIVER_EVENT_MLME_JOIN_COMPLETE_INFRA(vap, ieeeStatus); } break; case MLME_REQ_JOIN_ADHOC: ASSERT(vap->iv_opmode == IEEE80211_M_IBSS); /* * Cancel the Join operation if it has not already completed */ if (MLME_STOP_WAITING_FOR_JOIN(mlme_priv) == TRUE) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_MLME,"%s", "Cancelled the Join Operation as it took too long\n"); IEEE80211_DELIVER_EVENT_MLME_JOIN_COMPLETE_ADHOC(vap, ieeeStatus); } break; case MLME_REQ_AUTH: /* * Cancel the auth operation if it has not already completed */ IEEE80211_DPRINTF(vap, IEEE80211_MSG_MLME,"%s", "Cancelled the Auth Operation as it took too long\n"); mlme_priv->im_expected_auth_seq_number = 0; IEEE80211_DELIVER_EVENT_MLME_AUTH_COMPLETE(vap, ieeeStatus); break; case MLME_REQ_ASSOC: /* * Cancel the assoc operation if it has not already completed */ IEEE80211_DPRINTF(vap, IEEE80211_MSG_MLME,"%s", "Cancelled the Assoc Operation as it took too long\n"); IEEE80211_DELIVER_EVENT_MLME_ASSOC_COMPLETE(vap, ieeeStatus, 0, NULL); break; case MLME_REQ_REASSOC: /* * Cancel the reassoc operation if it has not already completed */ IEEE80211_DPRINTF(vap, IEEE80211_MSG_MLME,"%s", "Cancelled the Reassoc Operation as it took too long\n"); IEEE80211_DELIVER_EVENT_MLME_REASSOC_COMPLETE(vap, ieeeStatus, 0, NULL); break; case MLME_REQ_NONE: IEEE80211_DPRINTF(vap, IEEE80211_MSG_MLME,"%s", "mlme_request_type is MLME_REQ_NONE, do nothing.\n"); break; default: ASSERT(0); break; } }
void ieee80211_mlme_join_infra_continue(struct ieee80211vap *vap, int32_t status) { struct ieee80211com *ic = vap->iv_ic; struct ieee80211_node *ni; struct ieee80211_mlme_priv *mlme_priv = vap->iv_mlme_priv; u_int32_t join_timeout_ms; if (mlme_priv->im_request_type != MLME_REQ_JOIN_INFRA) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_MLME, "%s : im_request_type != JOIN_INFRA\n", __func__); return; } if (status != EOK) { mlme_priv->im_request_type = MLME_REQ_NONE; IEEE80211_DELIVER_EVENT_MLME_JOIN_COMPLETE_INFRA(vap, IEEE80211_STATUS_UNSPECIFIED); return; } /* iv_bss is valid only after ieee80211_sta_join */ ni = vap->iv_bss; IEEE80211_DPRINTF(vap, IEEE80211_MSG_MLME, "%s ni=%02X:%02X:%02X:%02X:%02X:%02X\n", __func__, ni->ni_macaddr[0], ni->ni_macaddr[1], ni->ni_macaddr[2], ni->ni_macaddr[3], ni->ni_macaddr[4], ni->ni_macaddr[5]); /* Update erp info */ if (ni->ni_erp & IEEE80211_ERP_USE_PROTECTION) ic->ic_flags |= IEEE80211_F_USEPROT; else ic->ic_flags &= ~IEEE80211_F_USEPROT; ic->ic_update_protmode(ic); if(ni->ni_erp & IEEE80211_ERP_LONG_PREAMBLE) ic->ic_flags |= IEEE80211_F_USEBARKER; else ic->ic_flags &= (~IEEE80211_F_USEBARKER); /* Update slot time info */ ieee80211_set_shortslottime(ic, IEEE80211_IS_CHAN_A(vap->iv_bsschan) || IEEE80211_IS_CHAN_11NA(vap->iv_bsschan) || (ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_SLOTTIME)); /* Put underlying H/W to JOIN state */ ieee80211_vap_join(vap); #ifdef ATH_SUPPORT_TxBF ieee80211_init_txbf(ic, ni); #endif /* Send a direct probe to increase the odds of receiving a probe response */ ieee80211_send_probereq(ni, ic->ic_myaddr, ni->ni_bssid, ni->ni_bssid, ni->ni_essid, ni->ni_esslen, vap->iv_opt_ie.ie, vap->iv_opt_ie.length); /* Set the timeout timer for Join Failure case. */ join_timeout_ms = IEEE80211_TU_TO_MS(mlme_priv->im_timeout * ni->ni_intval); IEEE80211_DPRINTF(vap, IEEE80211_MSG_MLME, "%s: Setting Join Timeout timer for %d ms\n", __func__, join_timeout_ms); OS_SET_TIMER(&mlme_priv->im_timeout_timer, join_timeout_ms); /* Set the appropriate filtering function and wait for Join Beacon */ MLME_WAIT_FOR_BSS_JOIN(mlme_priv); }