diff options
Diffstat (limited to 'drivers/staging/rtl8723au/core/rtw_sta_mgt.c')
-rw-r--r-- | drivers/staging/rtl8723au/core/rtw_sta_mgt.c | 439 |
1 files changed, 0 insertions, 439 deletions
diff --git a/drivers/staging/rtl8723au/core/rtw_sta_mgt.c b/drivers/staging/rtl8723au/core/rtw_sta_mgt.c deleted file mode 100644 index a9b778c45d44..000000000000 --- a/drivers/staging/rtl8723au/core/rtw_sta_mgt.c +++ /dev/null @@ -1,439 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - ******************************************************************************/ -#define _RTW_STA_MGT_C_ - -#include <osdep_service.h> -#include <drv_types.h> -#include <recv_osdep.h> -#include <xmit_osdep.h> -#include <mlme_osdep.h> -#include <sta_info.h> -#include <rtl8723a_hal.h> - -static const u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - -static void _rtw_init_stainfo(struct sta_info *psta) -{ - memset((u8 *)psta, 0, sizeof(struct sta_info)); - spin_lock_init(&psta->lock); - INIT_LIST_HEAD(&psta->list); - INIT_LIST_HEAD(&psta->hash_list); - _rtw_init_queue23a(&psta->sleep_q); - psta->sleepq_len = 0; - _rtw_init_sta_xmit_priv23a(&psta->sta_xmitpriv); - _rtw_init_sta_recv_priv23a(&psta->sta_recvpriv); -#ifdef CONFIG_8723AU_AP_MODE - INIT_LIST_HEAD(&psta->asoc_list); - INIT_LIST_HEAD(&psta->auth_list); - psta->expire_to = 0; - psta->flags = 0; - psta->capability = 0; - psta->bpairwise_key_installed = false; - psta->nonerp_set = 0; - psta->no_short_slot_time_set = 0; - psta->no_short_preamble_set = 0; - psta->no_ht_gf_set = 0; - psta->no_ht_set = 0; - psta->ht_20mhz_set = 0; - psta->keep_alive_trycnt = 0; -#endif /* CONFIG_8723AU_AP_MODE */ -} - -int _rtw_init_sta_priv23a(struct sta_priv *pstapriv) -{ - int i; - - spin_lock_init(&pstapriv->sta_hash_lock); - pstapriv->asoc_sta_count = 0; - for (i = 0; i < NUM_STA; i++) - INIT_LIST_HEAD(&pstapriv->sta_hash[i]); - -#ifdef CONFIG_8723AU_AP_MODE - pstapriv->sta_dz_bitmap = 0; - pstapriv->tim_bitmap = 0; - INIT_LIST_HEAD(&pstapriv->asoc_list); - INIT_LIST_HEAD(&pstapriv->auth_list); - spin_lock_init(&pstapriv->asoc_list_lock); - spin_lock_init(&pstapriv->auth_list_lock); - pstapriv->asoc_list_cnt = 0; - pstapriv->auth_list_cnt = 0; - pstapriv->auth_to = 3; /* 3*2 = 6 sec */ - pstapriv->assoc_to = 3; - /* pstapriv->expire_to = 900; 900*2 = 1800 sec = 30 min, - expire after no any traffic. */ - /* pstapriv->expire_to = 30; 30*2 = 60 sec = 1 min, - expire after no any traffic. */ - pstapriv->expire_to = 3; /* 3*2 = 6 sec */ - pstapriv->max_num_sta = NUM_STA; -#endif - return _SUCCESS; -} - -int _rtw_free_sta_priv23a(struct sta_priv *pstapriv) -{ - struct list_head *phead; - struct sta_info *psta, *ptmp; - struct recv_reorder_ctrl *preorder_ctrl; - int index; - - if (pstapriv) { - /* delete all reordering_ctrl_timer */ - spin_lock_bh(&pstapriv->sta_hash_lock); - for (index = 0; index < NUM_STA; index++) { - phead = &pstapriv->sta_hash[index]; - list_for_each_entry_safe(psta, ptmp, phead, hash_list) { - int i; - - for (i = 0; i < 16 ; i++) { - preorder_ctrl = &psta->recvreorder_ctrl[i]; - del_timer_sync(&preorder_ctrl->reordering_ctrl_timer); - } - } - } - spin_unlock_bh(&pstapriv->sta_hash_lock); - /*===============================*/ - } - return _SUCCESS; -} - -struct sta_info * -rtw_alloc_stainfo23a(struct sta_priv *pstapriv, const u8 *hwaddr, gfp_t gfp) -{ - struct list_head *phash_list; - struct sta_info *psta; - struct recv_reorder_ctrl *preorder_ctrl; - s32 index; - int i = 0; - u16 wRxSeqInitialValue = 0xffff; - - psta = kmalloc(sizeof(struct sta_info), gfp); - if (!psta) - return NULL; - - spin_lock_bh(&pstapriv->sta_hash_lock); - - _rtw_init_stainfo(psta); - - psta->padapter = pstapriv->padapter; - - ether_addr_copy(psta->hwaddr, hwaddr); - - index = wifi_mac_hash(hwaddr); - - RT_TRACE(_module_rtl871x_sta_mgt_c_, _drv_info_, - "rtw_alloc_stainfo23a: index = %x\n", index); - if (index >= NUM_STA) { - RT_TRACE(_module_rtl871x_sta_mgt_c_, _drv_err_, - "ERROR => rtw_alloc_stainfo23a: index >= NUM_STA\n"); - psta = NULL; - goto exit; - } - phash_list = &pstapriv->sta_hash[index]; - - list_add_tail(&psta->hash_list, phash_list); - - pstapriv->asoc_sta_count++; - -/* For the SMC router, the sequence number of first packet of WPS - handshake will be 0. */ -/* In this case, this packet will be dropped by recv_decache function - if we use the 0x00 as the default value for tid_rxseq variable. */ -/* So, we initialize the tid_rxseq variable as the 0xffff. */ - - for (i = 0; i < 16; i++) - memcpy(&psta->sta_recvpriv.rxcache.tid_rxseq[i], - &wRxSeqInitialValue, 2); - - RT_TRACE(_module_rtl871x_sta_mgt_c_, _drv_info_, - "alloc number_%d stainfo with hwaddr = %pM\n", - pstapriv->asoc_sta_count, hwaddr); - - init_addba_retry_timer23a(psta); - - /* for A-MPDU Rx reordering buffer control */ - for (i = 0; i < 16; i++) { - preorder_ctrl = &psta->recvreorder_ctrl[i]; - - preorder_ctrl->padapter = pstapriv->padapter; - - preorder_ctrl->enable = false; - - preorder_ctrl->indicate_seq = 0xffff; - preorder_ctrl->wend_b = 0xffff; - /* preorder_ctrl->wsize_b = (NR_RECVBUFF-2); */ - preorder_ctrl->wsize_b = 64;/* 64; */ - - _rtw_init_queue23a(&preorder_ctrl->pending_recvframe_queue); - - rtw_init_recv_timer23a(preorder_ctrl); - } - /* init for DM */ - psta->rssi_stat.UndecoratedSmoothedPWDB = (-1); - psta->rssi_stat.UndecoratedSmoothedCCK = (-1); - - /* init for the sequence number of received management frame */ - psta->RxMgmtFrameSeqNum = 0xffff; -exit: - spin_unlock_bh(&pstapriv->sta_hash_lock); - return psta; -} - -/* using pstapriv->sta_hash_lock to protect */ -int rtw_free_stainfo23a(struct rtw_adapter *padapter, struct sta_info *psta) -{ - struct recv_reorder_ctrl *preorder_ctrl; - struct sta_xmit_priv *pstaxmitpriv; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct sta_priv *pstapriv = &padapter->stapriv; - struct hw_xmit *phwxmit; - int i; - - if (!psta) - goto exit; - - spin_lock_bh(&psta->lock); - psta->state &= ~_FW_LINKED; - spin_unlock_bh(&psta->lock); - - pstaxmitpriv = &psta->sta_xmitpriv; - - spin_lock_bh(&pxmitpriv->lock); - - rtw_free_xmitframe_queue23a(pxmitpriv, &psta->sleep_q); - psta->sleepq_len = 0; - - /* vo */ - rtw_free_xmitframe_queue23a(pxmitpriv, &pstaxmitpriv->vo_q.sta_pending); - list_del_init(&pstaxmitpriv->vo_q.tx_pending); - phwxmit = pxmitpriv->hwxmits; - phwxmit->accnt -= pstaxmitpriv->vo_q.qcnt; - pstaxmitpriv->vo_q.qcnt = 0; - - /* vi */ - rtw_free_xmitframe_queue23a(pxmitpriv, &pstaxmitpriv->vi_q.sta_pending); - list_del_init(&pstaxmitpriv->vi_q.tx_pending); - phwxmit = pxmitpriv->hwxmits+1; - phwxmit->accnt -= pstaxmitpriv->vi_q.qcnt; - pstaxmitpriv->vi_q.qcnt = 0; - - /* be */ - rtw_free_xmitframe_queue23a(pxmitpriv, &pstaxmitpriv->be_q.sta_pending); - list_del_init(&pstaxmitpriv->be_q.tx_pending); - phwxmit = pxmitpriv->hwxmits+2; - phwxmit->accnt -= pstaxmitpriv->be_q.qcnt; - pstaxmitpriv->be_q.qcnt = 0; - - /* bk */ - rtw_free_xmitframe_queue23a(pxmitpriv, &pstaxmitpriv->bk_q.sta_pending); - list_del_init(&pstaxmitpriv->bk_q.tx_pending); - phwxmit = pxmitpriv->hwxmits+3; - phwxmit->accnt -= pstaxmitpriv->bk_q.qcnt; - pstaxmitpriv->bk_q.qcnt = 0; - - spin_unlock_bh(&pxmitpriv->lock); - - list_del_init(&psta->hash_list); - RT_TRACE(_module_rtl871x_sta_mgt_c_, _drv_err_, - "free number_%d stainfo with hwaddr = %pM\n", - pstapriv->asoc_sta_count, psta->hwaddr); - pstapriv->asoc_sta_count--; - - /* re-init sta_info; 20061114 will be init in alloc_stainfo */ - /* _rtw_init_sta_xmit_priv23a(&psta->sta_xmitpriv); */ - /* _rtw_init_sta_recv_priv23a(&psta->sta_recvpriv); */ - - del_timer_sync(&psta->addba_retry_timer); - - /* for A-MPDU Rx reordering buffer control, - cancel reordering_ctrl_timer */ - for (i = 0; i < 16; i++) { - struct list_head *phead, *plist; - struct recv_frame *prframe; - struct rtw_queue *ppending_recvframe_queue; - - preorder_ctrl = &psta->recvreorder_ctrl[i]; - - del_timer_sync(&preorder_ctrl->reordering_ctrl_timer); - - ppending_recvframe_queue = - &preorder_ctrl->pending_recvframe_queue; - - spin_lock_bh(&ppending_recvframe_queue->lock); - phead = get_list_head(ppending_recvframe_queue); - plist = phead->next; - - while (!list_empty(phead)) { - prframe = container_of(plist, struct recv_frame, list); - plist = plist->next; - list_del_init(&prframe->list); - rtw_free_recvframe23a(prframe); - } - spin_unlock_bh(&ppending_recvframe_queue->lock); - } - if (!(psta->state & WIFI_AP_STATE)) - rtl8723a_SetHalODMVar(padapter, HAL_ODM_STA_INFO, psta, false); -#ifdef CONFIG_8723AU_AP_MODE - spin_lock_bh(&pstapriv->auth_list_lock); - if (!list_empty(&psta->auth_list)) { - list_del_init(&psta->auth_list); - pstapriv->auth_list_cnt--; - } - spin_unlock_bh(&pstapriv->auth_list_lock); - - psta->expire_to = 0; - - psta->sleepq_ac_len = 0; - psta->qos_info = 0; - - psta->max_sp_len = 0; - psta->uapsd_bk = 0; - psta->uapsd_be = 0; - psta->uapsd_vi = 0; - psta->uapsd_vo = 0; - - psta->has_legacy_ac = 0; - - pstapriv->sta_dz_bitmap &= ~CHKBIT(psta->aid); - pstapriv->tim_bitmap &= ~CHKBIT(psta->aid); - - if ((psta->aid > 0) && (pstapriv->sta_aid[psta->aid - 1] == psta)) { - pstapriv->sta_aid[psta->aid - 1] = NULL; - psta->aid = 0; - } -#endif /* CONFIG_8723AU_AP_MODE */ - - kfree(psta); -exit: - return _SUCCESS; -} - -/* free all stainfo which in sta_hash[all] */ -void rtw_free_all_stainfo23a(struct rtw_adapter *padapter) -{ - struct list_head *phead; - struct sta_info *psta, *ptmp; - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *pbcmc_stainfo = rtw_get_bcmc_stainfo23a(padapter); - s32 index; - - if (pstapriv->asoc_sta_count == 1) - return; - - spin_lock_bh(&pstapriv->sta_hash_lock); - for (index = 0; index < NUM_STA; index++) { - phead = &pstapriv->sta_hash[index]; - list_for_each_entry_safe(psta, ptmp, phead, hash_list) { - if (pbcmc_stainfo != psta) - rtw_free_stainfo23a(padapter, psta); - } - } - spin_unlock_bh(&pstapriv->sta_hash_lock); -} - -/* any station allocated can be searched by hash list */ -struct sta_info *rtw_get_stainfo23a(struct sta_priv *pstapriv, const u8 *hwaddr) -{ - struct list_head *phead; - struct sta_info *pos, *psta = NULL; - u32 index; - const u8 *addr; - - if (!hwaddr) - return NULL; - - if (is_multicast_ether_addr(hwaddr)) - addr = bc_addr; - else - addr = hwaddr; - - index = wifi_mac_hash(addr); - - spin_lock_bh(&pstapriv->sta_hash_lock); - phead = &pstapriv->sta_hash[index]; - list_for_each_entry(pos, phead, hash_list) { - psta = pos; - - /* if found the matched address */ - if (ether_addr_equal(psta->hwaddr, addr)) - break; - - psta = NULL; - } - spin_unlock_bh(&pstapriv->sta_hash_lock); - return psta; -} - -int rtw_init_bcmc_stainfo23a(struct rtw_adapter *padapter) -{ - struct sta_priv *pstapriv = &padapter->stapriv; - struct sta_info *psta; - struct tx_servq *ptxservq; - int res = _SUCCESS; - - psta = rtw_alloc_stainfo23a(pstapriv, bc_addr, GFP_KERNEL); - if (!psta) { - res = _FAIL; - RT_TRACE(_module_rtl871x_sta_mgt_c_, _drv_err_, - "rtw_alloc_stainfo23a fail\n"); - return res; - } - /* default broadcast & multicast use macid 1 */ - psta->mac_id = 1; - - ptxservq = &psta->sta_xmitpriv.be_q; - return _SUCCESS; -} - -struct sta_info *rtw_get_bcmc_stainfo23a(struct rtw_adapter *padapter) -{ - struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; - - psta = rtw_get_stainfo23a(pstapriv, bc_addr); - return psta; -} - -bool rtw_access_ctrl23a(struct rtw_adapter *padapter, u8 *mac_addr) -{ - bool res = true; -#ifdef CONFIG_8723AU_AP_MODE - struct list_head *phead; - struct rtw_wlan_acl_node *paclnode; - bool match = false; - struct sta_priv *pstapriv = &padapter->stapriv; - struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; - struct rtw_queue *pacl_node_q = &pacl_list->acl_node_q; - - spin_lock_bh(&pacl_node_q->lock); - phead = get_list_head(pacl_node_q); - list_for_each_entry(paclnode, phead, list) { - if (ether_addr_equal(paclnode->addr, mac_addr)) { - if (paclnode->valid) { - match = true; - break; - } - } - } - spin_unlock_bh(&pacl_node_q->lock); - - if (pacl_list->mode == 1)/* accept unless in deny list */ - res = (match) ? false : true; - else if (pacl_list->mode == 2)/* deny unless in accept list */ - res = (match) ? true : false; - else - res = true; -#endif - return res; -} |