#ifdef CONFIG_AP_MODE if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { _irqL irqL; struct sta_info *psta; struct sta_priv *pstapriv = &padapter->stapriv; //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); //rtw_free_stainfo(padapter, psta); //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" reason=%u, ta=%pM\n" , FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe)); psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); if(psta) { u8 updated = _FALSE; _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); if(rtw_is_list_empty(&psta->asoc_list)==_FALSE) { rtw_list_delete(&psta->asoc_list); pstapriv->asoc_list_cnt--; updated = ap_free_sta(padapter, psta, _FALSE, reason); } _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); associated_clients_update(padapter, updated); }
static s32 pre_recv_entry(union recv_frame *precvframe, u8 *pphy_status) { s32 ret=_SUCCESS; #ifdef CONFIG_CONCURRENT_MODE u8 *secondary_myid, *paddr1; union recv_frame *precvframe_if2 = NULL; _adapter *primary_padapter = precvframe->u.hdr.adapter; _adapter *secondary_padapter = primary_padapter->pbuddy_adapter; struct recv_priv *precvpriv = &primary_padapter->recvpriv; _queue *pfree_recv_queue = &precvpriv->free_recv_queue; u8 *pbuf = precvframe->u.hdr.rx_data; if(!secondary_padapter) return ret; paddr1 = GetAddr1Ptr(pbuf); if(IS_MCAST(paddr1) == _FALSE)//unicast packets { secondary_myid = adapter_mac_addr(secondary_padapter); if(_rtw_memcmp(paddr1, secondary_myid, ETH_ALEN)) { //change to secondary interface precvframe->u.hdr.adapter = secondary_padapter; } //ret = recv_entry(precvframe); } else // Handle BC/MC Packets { u8 clone = _TRUE; #if 0 u8 type, subtype, *paddr2, *paddr3; type = GetFrameType(pbuf); subtype = GetFrameSubType(pbuf); //bit(7)~bit(2) switch (type) { case WIFI_MGT_TYPE: //Handle BC/MC mgnt Packets if(subtype == WIFI_BEACON) { paddr3 = GetAddr3Ptr(precvframe->u.hdr.rx_data); if (check_fwstate(&secondary_padapter->mlmepriv, _FW_LINKED) && _rtw_memcmp(paddr3, get_bssid(&secondary_padapter->mlmepriv), ETH_ALEN)) { //change to secondary interface precvframe->u.hdr.adapter = secondary_padapter; clone = _FALSE; } if(check_fwstate(&primary_padapter->mlmepriv, _FW_LINKED) && _rtw_memcmp(paddr3, get_bssid(&primary_padapter->mlmepriv), ETH_ALEN)) { if(clone==_FALSE) { clone = _TRUE; } else { clone = _FALSE; } precvframe->u.hdr.adapter = primary_padapter; } if(check_fwstate(&primary_padapter->mlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) || check_fwstate(&secondary_padapter->mlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)) { clone = _TRUE; precvframe->u.hdr.adapter = primary_padapter; } } else if(subtype == WIFI_PROBEREQ) { //probe req frame is only for interface2 //change to secondary interface precvframe->u.hdr.adapter = secondary_padapter; clone = _FALSE; } break; case WIFI_CTRL_TYPE: // Handle BC/MC ctrl Packets break; case WIFI_DATA_TYPE: //Handle BC/MC data Packets //Notes: AP MODE never rx BC/MC data packets paddr2 = GetAddr2Ptr(precvframe->u.hdr.rx_data); if(_rtw_memcmp(paddr2, get_bssid(&secondary_padapter->mlmepriv), ETH_ALEN)) { //change to secondary interface precvframe->u.hdr.adapter = secondary_padapter; clone = _FALSE; } break; default: break; } #endif if(_TRUE == clone) { //clone/copy to if2 struct rx_pkt_attrib *pattrib = NULL; precvframe_if2 = rtw_alloc_recvframe(pfree_recv_queue); if(precvframe_if2) { precvframe_if2->u.hdr.adapter = secondary_padapter; _rtw_init_listhead(&precvframe_if2->u.hdr.list); precvframe_if2->u.hdr.precvbuf = NULL; //can't access the precvbuf for new arch. precvframe_if2->u.hdr.len=0; _rtw_memcpy(&precvframe_if2->u.hdr.attrib, &precvframe->u.hdr.attrib, sizeof(struct rx_pkt_attrib)); pattrib = &precvframe_if2->u.hdr.attrib; if(rtw_os_alloc_recvframe(secondary_padapter, precvframe_if2, pbuf, NULL) == _SUCCESS) { recvframe_put(precvframe_if2, pattrib->pkt_len); //recvframe_pull(precvframe_if2, drvinfo_sz + RXDESC_SIZE); if (pattrib->physt && pphy_status) rx_query_phy_status(precvframe_if2, pphy_status); ret = rtw_recv_entry(precvframe_if2); } else { rtw_free_recvframe(precvframe_if2, pfree_recv_queue); DBG_8192C("%s()-%d: alloc_skb() failed!\n", __FUNCTION__, __LINE__); } } } } //if (precvframe->u.hdr.attrib.physt) // rx_query_phy_status(precvframe, pphy_status); //ret = rtw_recv_entry(precvframe); #endif return ret; }
unsigned int aesccmp_decrypt(struct rtl8192cd_priv *priv, struct rx_frinfo *pfrinfo) { UINT8 *ttkey = NULL; UINT32 hdrlen, keylen = 0; UINT8 a4_exists; UINT8 qc_exists; UINT8 *sa = pfrinfo->sa; UINT8 *pframe = get_pframe(pfrinfo); UINT8 to_fr_ds = pfrinfo->to_fr_ds; struct stat_info *pstat = NULL; if (to_fr_ds != 0x03) { hdrlen = WLAN_HDR_A3_LEN; a4_exists = 0; } else { hdrlen = WLAN_HDR_A4_LEN; a4_exists = 1; } if (is_qos_data(pframe)) { qc_exists = 1; hdrlen += 2; } else qc_exists = 0; if (OPMODE & WIFI_AP_STATE) { #if defined(WDS) || defined(CONFIG_RTK_MESH) if (to_fr_ds == 3) pstat = get_stainfo (priv, GetAddr2Ptr(pframe)); else #endif #ifdef A4_STA if (to_fr_ds == 3) pstat = get_stainfo (priv, GetAddr2Ptr(pframe)); else #endif pstat = get_stainfo (priv, sa); { if (pstat == NULL) { DEBUG_ERR("AES Rx fails! sa=%02X%02X%02X%02X%02X%02X\n", sa[0], sa[1], sa[2], sa[3], sa[4], sa[5]); return FALSE; } keylen = GET_UNICAST_ENCRYP_KEYLEN; ttkey = GET_UNICAST_ENCRYP_KEY; } } #ifdef CLIENT_MODE else if (OPMODE & WIFI_STATION_STATE) { if (IS_MCAST(pfrinfo->da)) { keylen = GET_GROUP_ENCRYP_KEYLEN; ttkey = GET_GROUP_ENCRYP_KEY; } else { pstat = get_stainfo(priv, BSSID); if (pstat == NULL) { DEBUG_ERR("rx aes pstat == NULL\n"); return FALSE; } keylen = GET_UNICAST_ENCRYP_KEYLEN; ttkey = GET_UNICAST_ENCRYP_KEY; } } else if (OPMODE & WIFI_ADHOC_STATE) { keylen = GET_GROUP_ENCRYP_KEYLEN; ttkey = GET_GROUP_ENCRYP_KEY; } #endif if (keylen == 0) { DEBUG_ERR("no descrypt key for AES due to keylen=0\n"); return FALSE; } aes_rx(ttkey, qc_exists, a4_exists, pframe, hdrlen, pfrinfo->pktlen-hdrlen-8); return TRUE; }