static INLINE void ieee80211_vap_iter_reset(void *arg, wlan_if_t vap, bool is_last_vap) { struct ieee80211_vap_iter_reset_arg *params= (struct ieee80211_vap_iter_reset_arg *) arg; /* * In case iv_bss was not stopped. */ wlan_mlme_stop_bss(vap, WLAN_MLME_STOP_BSS_F_FORCE_STOP_RESET | WLAN_MLME_STOP_BSS_F_WAIT_RX_DONE); params->err = ieee80211_vap_reset(vap, params->reset_req); }
int wlan_vap_delete(wlan_if_t vaphandle) { struct ieee80211vap *vap = vaphandle; struct ieee80211com *ic = vap->iv_ic; IEEE80211_DPRINTF_IC(ic, IEEE80211_VERBOSE_LOUD,IEEE80211_MSG_DEBUG, "%s : enter. vaphandle=0x%x\n", __func__, vaphandle ); ieee80211_vap_pause_vdetach(ic,vap); IEEE80211_COMM_LOCK(ic); #ifdef MAGPIE_HIF_GMAC if (ic->ic_chanchange_cnt) ic->ic_chanchange_cnt -= ic->ic_chanchange_tbtt; #endif if (ieee80211_vap_deleted_is_clear(vap)) /* if not deleted then it is on the list */ { TAILQ_REMOVE(&ic->ic_vaps, vap, iv_next); if (TAILQ_EMPTY(&ic->ic_vaps)) /* reset to supported mode */ ic->ic_opmode = IEEE80211_M_STA; ieee80211_vap_deleted_set(vap); /* mark it as deleted */ IEEE80211_COMM_UNLOCK(ic); /* * In case iv_bss was not stopped or is in scanning. * TBD: BSS should have been stopped now. We can save the time for stop bss again. */ wlan_mlme_stop_bss(vap, WLAN_MLME_STOP_BSS_F_SEND_DEAUTH | WLAN_MLME_STOP_BSS_F_CLEAR_ASSOC_STATE | WLAN_MLME_STOP_BSS_F_WAIT_RX_DONE | WLAN_MLME_STOP_BSS_F_NO_RESET); ieee80211_sta_leave(vap->iv_bss); ieee80211_node_vdetach(vap); } else { IEEE80211_COMM_UNLOCK(ic); } IEEE80211_DPRINTF_IC(ic, IEEE80211_VERBOSE_LOUD,IEEE80211_MSG_DEBUG, "%s : exit. vaphandle=0x%x\n", __func__, vaphandle ); return 0; }
int wlan_reset(wlan_if_t vaphandle, ieee80211_reset_request *reset_req) { struct ieee80211vap *vap = vaphandle; struct ieee80211com *ic = vap->iv_ic; int err = 0; /* NB: must set H/W MAC address before chip reset */ if (reset_req->reset_mac && IEEE80211_ADDR_IS_VALID(reset_req->macaddr) && !IEEE80211_ADDR_EQ(reset_req->macaddr, ic->ic_myaddr)) { IEEE80211_ADDR_COPY(ic->ic_myaddr, reset_req->macaddr); ic->ic_set_macaddr(ic, reset_req->macaddr); IEEE80211_ADDR_COPY(vap->iv_myaddr, ic->ic_myaddr); /* * TBD: if OS tries to set mac addr when multiple VAP co-exist, * we need to notify other VAPs and the corresponding ports * so that the port owner can change source address!! */ } /* reset UMAC software states */ if (reset_req->type == IEEE80211_RESET_TYPE_DOT11_INTF) { /* * In case iv_bss was not stopped. */ wlan_mlme_stop_bss(vap, WLAN_MLME_STOP_BSS_F_FORCE_STOP_RESET | WLAN_MLME_STOP_BSS_F_WAIT_RX_DONE); err = ieee80211_vap_reset(vap, reset_req); } else if (reset_req->type == IEEE80211_RESET_TYPE_DEVICE) { u_int32_t num_vaps; struct ieee80211_vap_iter_reset_arg params; params.err=0; params.reset_req = reset_req; ieee80211_iterate_vap_list_internal(ic,ieee80211_vap_iter_reset,((void *) ¶ms),num_vaps); err = params.err; } /* TBD: Always reset the hardware? */ err = ic->ic_reset(ic); if (err) return err; return err; }
/* * 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; }
/* End: gengzj added end */ int wlan_vap_delete(wlan_if_t vaphandle) { struct ieee80211vap *vap = vaphandle; struct ieee80211com *ic = vap->iv_ic; IEEE80211_DPRINTF_IC(ic, IEEE80211_VERBOSE_LOUD,IEEE80211_MSG_DEBUG, "%s : enter. vaphandle=0x%x\n", __func__, vaphandle ); ieee80211_vap_pause_vdetach(ic,vap); IEEE80211_COMM_LOCK(ic); /* Begin: gengzj added for wifipos 2013-11-26 */ /*AUTELAN-Added-begin:Added by pengdecai for wifi scan locate function*/ #if 0 if((NULL != vap->iv_scan_locate) && \ (NULL != vap->iv_scan_locate->sl_sock)) { // printk("driver:fun %s vap->iv_scan_locate->sl_sock= %p\n",__func__, vap->iv_scan_locate->sl_sock); vap->iv_locate = 0; if(NULL != vap->iv_scan_locate->sl_sock) { OS_SOCKET_RELEASE(vap->iv_scan_locate->sl_sock); } //free scan locate struct OS_FREE(vap->iv_scan_locate); vap->iv_scan_locate = NULL; } #endif /*AUTELAN-Added-end:Added by pengdecai for wifi scan locate function*/ /* End: gengzj added end */ #ifdef MAGPIE_HIF_GMAC if (ic->ic_chanchange_cnt) ic->ic_chanchange_cnt -= ic->ic_chanchange_tbtt; #endif if (ieee80211_vap_deleted_is_clear(vap)) /* if not deleted then it is on the list */ { TAILQ_REMOVE(&ic->ic_vaps, vap, iv_next); if (TAILQ_EMPTY(&ic->ic_vaps)) /* reset to supported mode */ ic->ic_opmode = IEEE80211_M_STA; ieee80211_vap_deleted_set(vap); /* mark it as deleted */ IEEE80211_COMM_UNLOCK(ic); /* * In case iv_bss was not stopped or is in scanning. * TBD: BSS should have been stopped now. We can save the time for stop bss again. */ wlan_mlme_stop_bss(vap, WLAN_MLME_STOP_BSS_F_SEND_DEAUTH | WLAN_MLME_STOP_BSS_F_CLEAR_ASSOC_STATE | WLAN_MLME_STOP_BSS_F_WAIT_RX_DONE | WLAN_MLME_STOP_BSS_F_NO_RESET); /*zhaoyang1 transplant from 717*/ /*suzhaoyu add for customer online-traffic limit*/ OS_FREE_TIMER(&vap->online_traffic_timer); /*suzhaoyu addend*/ /*zhaoyang1 transplant end*/ ieee80211_sta_leave(vap->iv_bss); ieee80211_node_vdetach(vap); } else { IEEE80211_COMM_UNLOCK(ic); } IEEE80211_DPRINTF_IC(ic, IEEE80211_VERBOSE_LOUD,IEEE80211_MSG_DEBUG, "%s : exit. vaphandle=0x%x\n", __func__, vaphandle ); return 0; }