MT7601u/src/os/linux/rt_profile.c
Murat Demirtas 612db32659 FIXED
2016-10-30 14:40:00 +00:00

986 lines
28 KiB
C

/****************************************************************************
* Ralink Tech Inc.
* 4F, No. 2 Technology 5th Rd.
* Science-based Industrial Park
* Hsin-chu, Taiwan, R.O.C.
* (c) Copyright 2002, Ralink Technology, Inc.
*
* All rights reserved. Ralink's source code is an unpublished work and the
* use of a copyright notice does not imply otherwise. This source code
* contains confidential trade secret material of Ralink Tech. Any attemp
* or participation in deciphering, decoding, reverse engineering or in any
* way altering the source code is stricitly prohibited, unless the prior
* written consent of Ralink Technology, Inc. is obtained.
****************************************************************************
Module Name:
rt_profile.c
Abstract:
Revision History:
Who When What
--------- ---------- ----------------------------------------------
*/
#include "rt_config.h"
#ifdef SYSTEM_LOG_SUPPORT
/* for wireless system event message */
char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = {
/* system status event */
"had associated successfully", /* IW_ASSOC_EVENT_FLAG */
"had disassociated", /* IW_DISASSOC_EVENT_FLAG */
"had deauthenticated", /* IW_DEAUTH_EVENT_FLAG */
"had been aged-out and disassociated", /* IW_AGEOUT_EVENT_FLAG */
"occurred CounterMeasures attack", /* IW_COUNTER_MEASURES_EVENT_FLAG */
"occurred replay counter different in Key Handshaking", /* IW_REPLAY_COUNTER_DIFF_EVENT_FLAG */
"occurred RSNIE different in Key Handshaking", /* IW_RSNIE_DIFF_EVENT_FLAG */
"occurred MIC different in Key Handshaking", /* IW_MIC_DIFF_EVENT_FLAG */
"occurred ICV error in RX", /* IW_ICV_ERROR_EVENT_FLAG */
"occurred MIC error in RX", /* IW_MIC_ERROR_EVENT_FLAG */
"Group Key Handshaking timeout", /* IW_GROUP_HS_TIMEOUT_EVENT_FLAG */
"Pairwise Key Handshaking timeout", /* IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG */
"RSN IE sanity check failure", /* IW_RSNIE_SANITY_FAIL_EVENT_FLAG */
"set key done in WPA/WPAPSK", /* IW_SET_KEY_DONE_WPA1_EVENT_FLAG */
"set key done in WPA2/WPA2PSK", /* IW_SET_KEY_DONE_WPA2_EVENT_FLAG */
"connects with our wireless client", /* IW_STA_LINKUP_EVENT_FLAG */
"disconnects with our wireless client", /* IW_STA_LINKDOWN_EVENT_FLAG */
"scan completed", /* IW_SCAN_COMPLETED_EVENT_FLAG */
"scan terminate!! Busy!! Enqueue fail!!", /* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */
"channel switch to ", /* IW_CHANNEL_CHANGE_EVENT_FLAG */
"wireless mode is not support", /* IW_STA_MODE_EVENT_FLAG */
"blacklisted in MAC filter list", /* IW_MAC_FILTER_LIST_EVENT_FLAG */
"Authentication rejected because of challenge failure", /* IW_AUTH_REJECT_CHALLENGE_FAILURE */
"Scanning", /* IW_SCANNING_EVENT_FLAG */
"Start a new IBSS", /* IW_START_IBSS_FLAG */
"Join the IBSS", /* IW_JOIN_IBSS_FLAG */
"Shared WEP fail", /* IW_SHARED_WEP_FAIL*/
};
#ifdef IDS_SUPPORT
/* for wireless IDS_spoof_attack event message */
char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = {
"detected conflict SSID", /* IW_CONFLICT_SSID_EVENT_FLAG */
"detected spoofed association response", /* IW_SPOOF_ASSOC_RESP_EVENT_FLAG */
"detected spoofed reassociation responses", /* IW_SPOOF_REASSOC_RESP_EVENT_FLAG */
"detected spoofed probe response", /* IW_SPOOF_PROBE_RESP_EVENT_FLAG */
"detected spoofed beacon", /* IW_SPOOF_BEACON_EVENT_FLAG */
"detected spoofed disassociation", /* IW_SPOOF_DISASSOC_EVENT_FLAG */
"detected spoofed authentication", /* IW_SPOOF_AUTH_EVENT_FLAG */
"detected spoofed deauthentication", /* IW_SPOOF_DEAUTH_EVENT_FLAG */
"detected spoofed unknown management frame", /* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */
"detected replay attack" /* IW_REPLAY_ATTACK_EVENT_FLAG */
};
/* for wireless IDS_flooding_attack event message */
char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = {
"detected authentication flooding", /* IW_FLOOD_AUTH_EVENT_FLAG */
"detected association request flooding", /* IW_FLOOD_ASSOC_REQ_EVENT_FLAG */
"detected reassociation request flooding", /* IW_FLOOD_REASSOC_REQ_EVENT_FLAG */
"detected probe request flooding", /* IW_FLOOD_PROBE_REQ_EVENT_FLAG */
"detected disassociation flooding", /* IW_FLOOD_DISASSOC_EVENT_FLAG */
"detected deauthentication flooding", /* IW_FLOOD_DEAUTH_EVENT_FLAG */
"detected 802.1x eap-request flooding" /* IW_FLOOD_EAP_REQ_EVENT_FLAG */
};
#endif /* IDS_SUPPORT */
#ifdef WSC_INCLUDED
/* for WSC wireless event message */
char const *pWirelessWscEventText[IW_WSC_EVENT_TYPE_NUM] = {
"PBC Session Overlap", /* IW_WSC_PBC_SESSION_OVERLAP */
"This WPS Registrar supports PBC", /* IW_WSC_REGISTRAR_SUPPORT_PBC */
"This WPS Registrar supports PIN", /* IW_WSC_REGISTRAR_SUPPORT_PIN */
"WPS status success", /* IW_WSC_STATUS_SUCCESS */
"WPS status fail", /* IW_WSC_STATUS_FAIL */
"WPS 2 mins time out!", /* IW_WSC_2MINS_TIMEOUT */
"WPS Send EAPOL_Start!", /* IW_WSC_SEND_EAPOL_START */
"WPS Send WscStart!", /* IW_WSC_SEND_WSC_START */
"WPS Send M1!", /* IW_WSC_SEND_M1 */
"WPS Send M2!", /* IW_WSC_SEND_M2 */
"WPS Send M3!", /* IW_WSC_SEND_M3 */
"WPS Send M4!", /* IW_WSC_SEND_M4 */
"WPS Send M5!", /* IW_WSC_SEND_M5 */
"WPS Send M6!", /* IW_WSC_SEND_M6 */
"WPS Send M7!", /* IW_WSC_SEND_M7 */
"WPS Send M8!", /* IW_WSC_SEND_M8 */
"WPS Send WscDone!", /* IW_WSC_SEND_DONE */
"WPS Send WscAck!", /* IW_WSC_SEND_ACK */
"WPS Send WscNack!", /* IW_WSC_SEND_NACK */
"WPS Receive WscStart!", /* IW_WSC_RECEIVE_WSC_START */
"WPS Receive M1!", /* IW_WSC_RECEIVE_M1 */
"WPS Receive M2!", /* IW_WSC_RECEIVE_M2 */
"WPS Receive M3!", /* IW_WSC_RECEIVE_M3 */
"WPS Receive M4!", /* IW_WSC_RECEIVE_M4 */
"WPS Receive M5!", /* IW_WSC_RECEIVE_M5 */
"WPS Receive M6!", /* IW_WSC_RECEIVE_M6 */
"WPS Receive M7!", /* IW_WSC_RECEIVE_M7 */
"WPS Receive M8!", /* IW_WSC_RECEIVE_M8 */
"WPS Receive WscDone!", /* IW_WSC_RECEIVE_DONE */
"WPS Receive WscAck!", /* IW_WSC_RECEIVE_ACK */
"WPS Receive WscNack!", /* IW_WSC_RECEIVE_NACK */
"Not only one candidate found" /* IW_WSC_MANY_CANDIDATE */
};
#endif /* WSC_INCLUDED */
#ifdef CONFIG_STA_SUPPORT
#ifdef IWSC_SUPPORT
// for IWSC wireless event messagechar
const *pWirelessIWscEventText[IW_IWSC_EVENT_TYPE_NUM] = {
"IWSC - T1 mins time out!", /* IW_IWSC_T1_TIMER_TIMEOUT */
"IWSC - T2 mins time out!", /* IW_IWSC_T2_TIMER_TIMEOUT */
"IWSC - Become Registrar", /* IW_IWSC_BECOME_REGISTRAR */
"IWSC - Become Enrollee", /* IW_IWSC_BECOME_ENROLLEE */
"IWSC - Entry time out", /* IW_IWSC_ENTRY_TIMER_TIMEOUT */
};
#endif /* IWSC_SUPPORT */
#endif /* CONFIG_STA_SUPPORT */
#endif /* SYSTEM_LOG_SUPPORT */
NDIS_STATUS RTMPReadParametersHook(
IN PRTMP_ADAPTER pAd)
{
PSTRING src = NULL;
RTMP_OS_FD srcf;
RTMP_OS_FS_INFO osFSInfo;
INT retval = NDIS_STATUS_FAILURE;
PSTRING buffer;
#ifdef HOSTAPD_SUPPORT
int i;
#endif /*HOSTAPD_SUPPORT */
/* buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG); */
os_alloc_mem(pAd, (UCHAR **)&buffer, MAX_INI_BUFFER_SIZE);
if(buffer == NULL)
return NDIS_STATUS_FAILURE;
memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
{
#ifdef CONFIG_AP_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
{
src = AP_PROFILE_PATH;
}
#endif /* CONFIG_AP_SUPPORT */
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
{
src = STA_PROFILE_PATH;
}
#endif /* CONFIG_STA_SUPPORT */
#ifdef MULTIPLE_CARD_SUPPORT
src = (PSTRING)pAd->MC_FileName;
#endif /* MULTIPLE_CARD_SUPPORT */
}
if (src && *src)
{
RtmpOSFSInfoChange(&osFSInfo, TRUE);
srcf = RtmpOSFileOpen(src, O_RDONLY, 0);
if (IS_FILE_OPEN_ERR(srcf))
{
DBGPRINT(RT_DEBUG_ERROR, ("Open file \"%s\" failed!\n", src));
}
else
{
retval =RtmpOSFileRead(srcf, buffer, MAX_INI_BUFFER_SIZE);
if (retval > 0)
{
RTMPSetProfileParameters(pAd, buffer);
retval = NDIS_STATUS_SUCCESS;
}
else
DBGPRINT(RT_DEBUG_ERROR, ("Read file \"%s\" failed(errCode=%d)!\n", src, retval));
retval = RtmpOSFileClose(srcf);
if ( retval != 0)
{
retval = NDIS_STATUS_FAILURE;
DBGPRINT(RT_DEBUG_ERROR, ("Close file \"%s\" failed(errCode=%d)!\n", src, retval));
}
}
RtmpOSFSInfoChange(&osFSInfo, FALSE);
}
#ifdef HOSTAPD_SUPPORT
for (i = 0; i < pAd->ApCfg.BssidNum; i++)
{
pAd->ApCfg.MBSSID[i].Hostapd=FALSE;
DBGPRINT(RT_DEBUG_TRACE, ("Reset ra%d hostapd support=FLASE", i));
}
#endif /*HOSTAPD_SUPPORT */
#ifdef SINGLE_SKU_V2
RTMPSetSingleSKUParameters(pAd);
#endif /* SINGLE_SKU_V2 */
/* kfree(buffer); */
os_free_mem(NULL, buffer);
return (retval);
}
#ifdef SYSTEM_LOG_SUPPORT
/*
========================================================================
Routine Description:
Send log message through wireless event
Support standard iw_event with IWEVCUSTOM. It is used below.
iwreq_data.data.flags is used to store event_flag that is defined by user.
iwreq_data.data.length is the length of the event log.
The format of the event log is composed of the entry's MAC address and
the desired log message (refer to pWirelessEventText).
ex: 11:22:33:44:55:66 has associated successfully
p.s. The requirement of Wireless Extension is v15 or newer.
========================================================================
*/
VOID RtmpDrvSendWirelessEvent(
IN VOID *pAdSrc,
IN USHORT Event_flag,
IN PUCHAR pAddr,
IN UCHAR BssIdx,
IN CHAR Rssi)
{
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;
PSTRING pBuf = NULL, pBufPtr = NULL;
USHORT event, type, BufLen;
UCHAR event_table_len = 0;
if (pAd->CommonCfg.bWirelessEvent == FALSE)
return;
type = Event_flag & 0xFF00;
event = Event_flag & 0x00FF;
switch (type)
{
case IW_SYS_EVENT_FLAG_START:
event_table_len = IW_SYS_EVENT_TYPE_NUM;
break;
#ifdef IDS_SUPPORT
case IW_SPOOF_EVENT_FLAG_START:
event_table_len = IW_SPOOF_EVENT_TYPE_NUM;
break;
case IW_FLOOD_EVENT_FLAG_START:
event_table_len = IW_FLOOD_EVENT_TYPE_NUM;
break;
#endif /* IDS_SUPPORT */
#ifdef WSC_INCLUDED
case IW_WSC_EVENT_FLAG_START:
event_table_len = IW_WSC_EVENT_TYPE_NUM;
break;
#endif /* WSC_INCLUDED */
#ifdef CONFIG_STA_SUPPORT
#ifdef IWSC_SUPPORT
case IW_IWSC_EVENT_FLAG_START:
event_table_len = IW_IWSC_EVENT_TYPE_NUM;
break;
#endif /* IWSC_SUPPORT */
#endif /* CONFIG_STA_SUPPORT */
}
if (event_table_len == 0)
{
DBGPRINT(RT_DEBUG_ERROR, ("%s : The type(%0x02x) is not valid.\n", __FUNCTION__, type));
return;
}
if (event >= event_table_len)
{
DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%0x02x) is not valid.\n", __FUNCTION__, event));
return;
}
/*Allocate memory and copy the msg. */
/* if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL) */
os_alloc_mem(NULL, (UCHAR **)&pBuf, IW_CUSTOM_MAX_LEN);
if(pBuf != NULL)
{
/*Prepare the payload */
memset(pBuf, 0, IW_CUSTOM_MAX_LEN);
pBufPtr = pBuf;
if (pAddr)
pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr));
else if (BssIdx < MAX_MBSSID_NUM(pAd))
pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(ra%d) ", BssIdx);
else
pBufPtr += sprintf(pBufPtr, "(RT2860) ");
if (type == IW_SYS_EVENT_FLAG_START)
{
pBufPtr += sprintf(pBufPtr, "%s", pWirelessSysEventText[event]);
if (Event_flag == IW_CHANNEL_CHANGE_EVENT_FLAG)
{
pBufPtr += sprintf(pBufPtr, "%3d", Rssi);
}
}
#ifdef IDS_SUPPORT
else if (type == IW_SPOOF_EVENT_FLAG_START)
pBufPtr += sprintf(pBufPtr, "%s (RSSI=%d)", pWirelessSpoofEventText[event], Rssi);
else if (type == IW_FLOOD_EVENT_FLAG_START)
pBufPtr += sprintf(pBufPtr, "%s", pWirelessFloodEventText[event]);
#endif /* IDS_SUPPORT */
#ifdef WSC_INCLUDED
else if (type == IW_WSC_EVENT_FLAG_START)
pBufPtr += sprintf(pBufPtr, "%s", pWirelessWscEventText[event]);
#endif /* WSC_INCLUDED */
#ifdef CONFIG_STA_SUPPORT
#ifdef IWSC_SUPPORT
else if (type == IW_IWSC_EVENT_FLAG_START)
pBufPtr += sprintf(pBufPtr, "%s", pWirelessIWscEventText[event]);
#endif /* IWSC_SUPPORT */
#endif /* CONFIG_STA_SUPPORT */
else
pBufPtr += sprintf(pBufPtr, "%s", "unknown event");
pBufPtr[pBufPtr - pBuf] = '\0';
BufLen = pBufPtr - pBuf;
RtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM, Event_flag, NULL, (PUCHAR)pBuf, BufLen);
/*DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __FUNCTION__, pBuf)); */
/* kfree(pBuf); */
os_free_mem(NULL, pBuf);
}
else
DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __FUNCTION__));
}
#endif /* SYSTEM_LOG_SUPPORT */
void RTMP_IndicateMediaState(
IN PRTMP_ADAPTER pAd,
IN NDIS_MEDIA_STATE media_state)
{
pAd->IndicateMediaState = media_state;
#ifdef SYSTEM_LOG_SUPPORT
if (pAd->IndicateMediaState == NdisMediaStateConnected)
{
RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
}
else
{
RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
}
#endif /* SYSTEM_LOG_SUPPORT */
}
void tbtt_tasklet(unsigned long data)
{
#ifdef CONFIG_AP_SUPPORT
#ifdef WORKQUEUE_BH
struct work_struct *work = (struct work_struct *)data;
POS_COOKIE pObj = container_of(work, struct os_cookie, tbtt_task);
RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pObj->pAd_va;
#else
PRTMP_ADAPTER pAd = (RTMP_ADAPTER *)data;
#endif /* WORKQUEUE_BH */
#ifdef P2P_SUPPORT
if (P2P_INF_ON(pAd) && P2P_GO_ON(pAd))
#else
if (pAd->OpMode == OPMODE_AP)
#endif /* P2P_SUPPORT */
{
/* step 7 - if DTIM, then move backlogged bcast/mcast frames from PSQ to TXQ whenever DtimCount==0 */
#ifdef RTMP_MAC_USB
if ((pAd->ApCfg.DtimCount + 1) == pAd->ApCfg.DtimPeriod)
#endif /* RTMP_MAC_USB */
{
PQUEUE_ENTRY pEntry;
BOOLEAN bPS = FALSE;
UINT count = 0;
unsigned long IrqFlags;
/* NdisAcquireSpinLock(&pAd->MacTabLock); */
/* NdisAcquireSpinLock(&pAd->TxSwQueueLock); */
RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);
while (pAd->MacTab.McastPsQueue.Head)
{
bPS = TRUE;
if (pAd->TxSwQueue[QID_AC_BE].Number <= (pAd->TxSwQMaxLen + MAX_PACKETS_IN_MCAST_PS_QUEUE))
{
pEntry = RemoveHeadQueue(&pAd->MacTab.McastPsQueue);
/*if(pAd->MacTab.McastPsQueue.Number) */
if (count)
{
RTMP_SET_PACKET_MOREDATA(pEntry, TRUE);
}
InsertHeadQueue(&pAd->TxSwQueue[QID_AC_BE], pEntry);
count++;
}
else
{
break;
}
}
RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
/* NdisReleaseSpinLock(&pAd->TxSwQueueLock); */
/* NdisReleaseSpinLock(&pAd->MacTabLock); */
if (pAd->MacTab.McastPsQueue.Number == 0)
{
UINT bss_index;
/* clear MCAST/BCAST backlog bit for all BSS */
for(bss_index=BSS0; bss_index<pAd->ApCfg.BssidNum; bss_index++)
WLAN_MR_TIM_BCMC_CLEAR(bss_index);
}
pAd->MacTab.PsQIdleCount = 0;
/* Dequeue outgoing framea from TxSwQueue0..3 queue and process it */
if (bPS == TRUE)
{
RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, /*MAX_TX_IN_TBTT*/MAX_PACKETS_IN_MCAST_PS_QUEUE);
}
}
}
#endif /* CONFIG_AP_SUPPORT */
}
void announce_802_3_packet(
IN VOID *pAdSrc,
IN PNDIS_PACKET pPacket,
IN UCHAR OpMode)
{
RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pAdSrc;
PNDIS_PACKET pRxPkt = pPacket;
ASSERT(pPacket);
MEM_DBG_PKT_FREE_INC(pPacket);
#ifdef CONFIG_AP_SUPPORT
#ifdef APCLI_SUPPORT
#ifdef P2P_SUPPORT
if (OpMode == OPMODE_AP)
#else
IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
#endif /* P2P_SUPPORT */
{
if (RTMP_MATPktRxNeedConvert(pAd, RtmpOsPktNetDevGet(pRxPkt)))
RTMP_MATEngineRxHandle(pAd, pRxPkt, 0);
}
#endif /* APCLI_SUPPORT */
#endif /* CONFIG_AP_SUPPORT */
#ifdef CONFIG_STA_SUPPORT
#endif /* CONFIG_STA_SUPPORT */
/* Push up the protocol stack */
#ifdef CONFIG_AP_SUPPORT
#ifdef PLATFORM_BL2348
{
extern int (*pToUpperLayerPktSent)(PNDIS_PACKET *pSkb);
RtmpOsPktProtocolAssign(pRxPkt);
pToUpperLayerPktSent(pRxPkt);
return;
}
#endif /* PLATFORM_BL2348 */
#endif /* CONFIG_AP_SUPPORT */
#ifdef IKANOS_VX_1X0
{
IKANOS_DataFrameRx(pAd, pRxPkt);
return;
}
#endif /* IKANOS_VX_1X0 */
#ifdef INF_PPA_SUPPORT
if (ppa_hook_directpath_send_fn && pAd->PPAEnable==TRUE )
{
RtmpOsPktInfPpaSend(pRxPkt);
pRxPkt=NULL;
return;
}
#endif /* INF_PPA_SUPPORT */
#ifdef CONFIG_AP_SUPPORT
#ifdef BG_FT_SUPPORT
if (BG_FTPH_PacketFromApHandle(pRxPkt) == 0)
return;
#endif /* BG_FT_SUPPORT */
#endif /* CONFIG_AP_SUPPORT */
//+++Add by shiang for debug
if (0) {
hex_dump("announce_802_3_packet", GET_OS_PKT_DATAPTR(pRxPkt), GET_OS_PKT_LEN(pRxPkt));
}
//---Add by shiang for debug
RtmpOsPktProtocolAssign(pRxPkt);
RtmpOsPktRcvHandle(pRxPkt);
}
#ifdef CONFIG_STA_SUPPORT
void STA_MonPktSend(
IN RTMP_ADAPTER *pAd,
IN RX_BLK *pRxBlk)
{
PNET_DEV pNetDev;
PNDIS_PACKET pRxPacket;
PHEADER_802_11 pHeader;
USHORT DataSize;
UINT32 MaxRssi;
UCHAR L2PAD, PHYMODE, BW, ShortGI, MCS, AMPDU, STBC, RSSI1;
UCHAR BssMonitorFlag11n, Channel, CentralChannel;
UCHAR *pData, *pDevName;
/* sanity check */
ASSERT(pRxBlk->pRxPacket);
if (pRxBlk->DataSize < 10)
{
DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too small! (%d)\n", __FUNCTION__, pRxBlk->DataSize));
goto err_free_sk_buff;
}
if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE)
{
DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%d)\n", __FUNCTION__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header)));
goto err_free_sk_buff;
}
/* init */
#ifdef MT7601
if ( IS_MT7601(pAd) )
MaxRssi = ConvertToRssi(pAd, pRxBlk->pRxWI->RxWISNR2, RSSI_0, pRxBlk->pRxWI->RxWISNR1, pRxBlk->pRxWI->RxWIBW);
else
#endif /* MT7601 */
MaxRssi = RTMPMaxRssi(pAd,
ConvertToRssi(pAd, pRxBlk->pRxWI->RxWIRSSI0, RSSI_0, 0, 0),
ConvertToRssi(pAd, pRxBlk->pRxWI->RxWIRSSI1, RSSI_1, 0, 0),
ConvertToRssi(pAd, pRxBlk->pRxWI->RxWIRSSI2, RSSI_2, 0, 0));
pNetDev = get_netdev_from_bssid(pAd, BSS0);
pRxPacket = pRxBlk->pRxPacket;
pHeader = pRxBlk->pHeader;
pData = pRxBlk->pData;
DataSize = pRxBlk->DataSize;
L2PAD = pRxBlk->pRxInfo->L2PAD;
PHYMODE = pRxBlk->pRxWI->RxWIPhyMode;
BW = pRxBlk->pRxWI->RxWIBW;
ShortGI = pRxBlk->pRxWI->RxWISGI;
MCS = pRxBlk->pRxWI->RxWIMCS;
AMPDU = pRxBlk->pRxInfo->AMPDU;
STBC = pRxBlk->pRxWI->RxWISTBC;
RSSI1 = pRxBlk->pRxWI->RxWIRSSI1;
BssMonitorFlag11n = 0;
#ifdef MONITOR_FLAG_11N_SNIFFER_SUPPORT
BssMonitorFlag11n = (pAd->StaCfg.BssMonitorFlag & MONITOR_FLAG_11N_SNIFFER);
#endif /* MONITOR_FLAG_11N_SNIFFER_SUPPORT */
pDevName = (UCHAR *)RtmpOsGetNetDevName(pAd->net_dev);
Channel = pAd->CommonCfg.Channel;
CentralChannel = pAd->CommonCfg.CentralChannel;
/* pass the packet */
send_monitor_packets(pNetDev, pRxPacket, pHeader, pData, DataSize,
L2PAD, PHYMODE, BW, ShortGI, MCS, AMPDU, STBC, RSSI1,
BssMonitorFlag11n, pDevName, Channel, CentralChannel,
MaxRssi);
return;
err_free_sk_buff:
RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);
return;
}
#endif /* CONFIG_STA_SUPPORT */
extern NDIS_SPIN_LOCK TimerSemLock;
VOID RTMPFreeAdapter(
IN VOID *pAdSrc)
{
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;
POS_COOKIE os_cookie;
int index;
os_cookie=(POS_COOKIE)pAd->OS_Cookie;
if (pAd->BeaconBuf)
os_free_mem(NULL, pAd->BeaconBuf);
NdisFreeSpinLock(&pAd->MgmtRingLock);
for (index =0 ; index < NUM_OF_TX_RING; index++)
{
NdisFreeSpinLock(&pAd->TxSwQueueLock[index]);
NdisFreeSpinLock(&pAd->DeQueueLock[index]);
pAd->DeQueueRunning[index] = FALSE;
}
NdisFreeSpinLock(&pAd->irq_lock);
#ifdef UAPSD_SUPPORT
NdisFreeSpinLock(&pAd->UAPSDEOSPLock); /* OS_ABL_SUPPORT */
#endif /* UAPSD_SUPPORT */
#ifdef DOT11_N_SUPPORT
NdisFreeSpinLock(&pAd->mpdu_blk_pool.lock);
#endif /* DOT11_N_SUPPORT */
if (pAd->iw_stats)
{
os_free_mem(NULL, pAd->iw_stats);
pAd->iw_stats = NULL;
}
if (pAd->stats)
{
os_free_mem(NULL, pAd->stats);
pAd->stats = NULL;
}
NdisFreeSpinLock(&TimerSemLock);
#ifdef RALINK_ATE
#ifdef RTMP_MAC_USB
RTMP_OS_ATMOIC_DESTROY(&pAd->BulkOutRemained);
RTMP_OS_ATMOIC_DESTROY(&pAd->BulkInRemained);
#endif /* RTMP_MAC_USB */
#endif /* RALINK_ATE */
RTMP_OS_FREE_TIMER(pAd);
RTMP_OS_FREE_LOCK(pAd);
RTMP_OS_FREE_TASKLET(pAd);
RTMP_OS_FREE_TASK(pAd);
RTMP_OS_FREE_SEM(pAd);
RTMP_OS_FREE_ATOMIC(pAd);
RtmpOsVfree(pAd); /* pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa); */
if (os_cookie)
os_free_mem(NULL, os_cookie);
}
int RTMPSendPackets(
IN NDIS_HANDLE dev_hnd,
IN PPNDIS_PACKET ppPacketArray,
IN UINT NumberOfPackets,
IN UINT32 PktTotalLen,
IN RTMP_NET_ETH_CONVERT_DEV_SEARCH Func)
{
RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev_hnd;
PNDIS_PACKET pPacket = ppPacketArray[0];
INC_COUNTER64(pAd->WlanCounters.TransmitCountFrmOs);
if (pPacket == NULL)
goto done;
/* RT2870STA does this in RTMPSendPackets() */
#ifdef RALINK_ATE
if (ATE_ON(pAd))
{
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_RESOURCES);
return 0;
}
#endif /* RALINK_ATE */
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
{
/* Drop send request since we are in monitor mode */
if (MONITOR_ON(pAd))
{
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
return 0;
}
}
#endif /* CONFIG_STA_SUPPORT */
/* EapolStart size is 18 */
if (PktTotalLen < 14)
{
/*printk("bad packet size: %d\n", pkt->len); */
hex_dump("bad packet", GET_OS_PKT_DATAPTR(pPacket), PktTotalLen);
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
return 0;
}
RTMP_SET_PACKET_5VT(pPacket, 0);
/* MiniportMMRequest(pAd, pkt->data, pkt->len); */
#ifdef CONFIG_5VT_ENHANCE
if (*(int*)(GET_OS_PKT_CB(pPacket)) == BRIDGE_TAG) {
RTMP_SET_PACKET_5VT(pPacket, 1);
}
#endif
#ifdef CONFIG_AP_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
APSendPackets((NDIS_HANDLE)pAd, (PPNDIS_PACKET) &pPacket, 1);
#endif /* CONFIG_AP_SUPPORT */
#ifdef CONFIG_STA_SUPPORT
IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
{
#ifdef P2P_SUPPORT
if (RTMP_GET_PACKET_OPMODE(pPacket))
{
APSendPackets((NDIS_HANDLE)pAd, (PPNDIS_PACKET) &pPacket, 1);
goto done;
}
#endif /* P2P_SUPPORT */
STASendPackets((NDIS_HANDLE)pAd, (PPNDIS_PACKET) &pPacket, 1);
}
#endif /* CONFIG_STA_SUPPORT */
done:
return 0;
}
PNET_DEV get_netdev_from_bssid(
IN PRTMP_ADAPTER pAd,
IN UCHAR FromWhichBSSID)
{
PNET_DEV dev_p = NULL;
#ifdef CONFIG_AP_SUPPORT
UCHAR infRealIdx;
#endif /* CONFIG_AP_SUPPORT */
do
{
#ifdef CONFIG_STA_SUPPORT
#ifdef P2P_SUPPORT
if(FromWhichBSSID >= MIN_NET_DEVICE_FOR_P2P_GO)
{
dev_p = pAd->ApCfg.MBSSID[BSS0].MSSIDDev;
break;
}
#endif /* P2P_SUPPORT */
#endif /* CONFIG_STA_SUPPORT */
#ifdef CONFIG_AP_SUPPORT
infRealIdx = FromWhichBSSID & (NET_DEVICE_REAL_IDX_MASK);
#ifdef APCLI_SUPPORT
if(FromWhichBSSID >= MIN_NET_DEVICE_FOR_APCLI)
{
dev_p = (infRealIdx >= MAX_APCLI_NUM ? NULL : pAd->ApCfg.ApCliTab[infRealIdx].dev);
break;
}
#endif /* APCLI_SUPPORT */
if ((FromWhichBSSID > 0) &&
(FromWhichBSSID < pAd->ApCfg.BssidNum) &&
(FromWhichBSSID < MAX_MBSSID_NUM(pAd)) &&
(FromWhichBSSID < HW_BEACON_MAX_NUM))
{
dev_p = pAd->ApCfg.MBSSID[FromWhichBSSID].MSSIDDev;
}
else
#endif /* CONFIG_AP_SUPPORT */
{
dev_p = pAd->net_dev;
}
} while (FALSE);
ASSERT(dev_p);
return dev_p; /* return one of MBSS */
}
#ifdef CONFIG_AP_SUPPORT
/*
========================================================================
Routine Description:
Driver pre-Ioctl for AP.
Arguments:
pAdSrc - WLAN control block pointer
pCB - the IOCTL parameters
Return Value:
NDIS_STATUS_SUCCESS - IOCTL OK
Otherwise - IOCTL fail
Note:
========================================================================
*/
INT RTMP_AP_IoctlPrepare(
IN RTMP_ADAPTER *pAd,
IN VOID *pCB)
{
RT_CMD_AP_IOCTL_CONFIG *pConfig = (RT_CMD_AP_IOCTL_CONFIG *)pCB;
POS_COOKIE pObj;
USHORT index;
INT Status = NDIS_STATUS_SUCCESS;
#ifdef CONFIG_APSTA_MIXED_SUPPORT
INT cmd = 0xff;
#endif /* CONFIG_APSTA_MIXED_SUPPORT */
pObj = (POS_COOKIE) pAd->OS_Cookie;
if((pConfig->priv_flags == INT_MAIN) && !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))
{
if (pConfig->pCmdData == NULL)
return Status;
if (RtPrivIoctlSetVal() == pConfig->CmdId_RTPRIV_IOCTL_SET)
{
if (TRUE
#ifdef CONFIG_APSTA_MIXED_SUPPORT
&& (strstr(pConfig->pCmdData, "OpMode") == NULL)
#endif /* CONFIG_APSTA_MIXED_SUPPORT */
#ifdef SINGLE_SKU
&& (strstr(pConfig->pCmdData, "ModuleTxpower") == NULL)
#endif /* SINGLE_SKU */
)
{
return -ENETDOWN;
}
}
else
return -ENETDOWN;
}
/* determine this ioctl command is comming from which interface. */
if (pConfig->priv_flags == INT_MAIN)
{
pObj->ioctl_if_type = INT_MAIN;
pObj->ioctl_if = MAIN_MBSSID;
/* DBGPRINT(RT_DEBUG_INFO, ("rt28xx_ioctl I/F(ra%d)(flags=%d): cmd = 0x%08x\n", pObj->ioctl_if, RT_DEV_PRIV_FLAGS_GET(net_dev), cmd)); */
}
else if (pConfig->priv_flags == INT_MBSSID)
{
pObj->ioctl_if_type = INT_MBSSID;
/* if (!RTMPEqualMemory(net_dev->name, pAd->net_dev->name, 3)) // for multi-physical card, no MBSSID */
if (strcmp(pConfig->name, RtmpOsGetNetDevName(pAd->net_dev)) != 0) /* sample */
{
for (index = 1; index < pAd->ApCfg.BssidNum; index++)
{
if (pAd->ApCfg.MBSSID[index].MSSIDDev == pConfig->net_dev)
{
pObj->ioctl_if = index;
/* DBGPRINT(RT_DEBUG_INFO, ("rt28xx_ioctl I/F(ra%d)(flags=%d): cmd = 0x%08x\n", index, RT_DEV_PRIV_FLAGS_GET(net_dev), cmd)); */
break;
}
}
/* Interface not found! */
if(index == pAd->ApCfg.BssidNum)
{
/* DBGPRINT(RT_DEBUG_ERROR, ("rt28xx_ioctl can not find I/F\n")); */
return -ENETDOWN;
}
}
else /* ioctl command from I/F(ra0) */
{
/* GET_PAD_FROM_NET_DEV(pAd, net_dev); */
pObj->ioctl_if = MAIN_MBSSID;
/* DBGPRINT(RT_DEBUG_ERROR, ("rt28xx_ioctl can not find I/F and use default: cmd = 0x%08x\n", cmd)); */
}
MBSS_MR_APIDX_SANITY_CHECK(pAd, pObj->ioctl_if);
}
#ifdef APCLI_SUPPORT
else if (pConfig->priv_flags == INT_APCLI)
{
pObj->ioctl_if_type = INT_APCLI;
for (index = 0; index < MAX_APCLI_NUM; index++)
{
if (pAd->ApCfg.ApCliTab[index].dev == pConfig->net_dev)
{
pObj->ioctl_if = index;
break;
}
if(index == MAX_APCLI_NUM)
{
DBGPRINT(RT_DEBUG_ERROR, ("rt28xx_ioctl can not find Apcli I/F\n"));
return -ENETDOWN;
}
}
APCLI_MR_APIDX_SANITY_CHECK(pObj->ioctl_if);
}
#endif /* APCLI_SUPPORT */
#ifdef P2P_SUPPORT
else if (pConfig->priv_flags == INT_P2P)
{
pObj->ioctl_if_type = INT_P2P;
pObj->ioctl_if = MAIN_MBSSID;
}
#endif /* P2P_SUPPORT */
else
{
/* DBGPRINT(RT_DEBUG_WARN, ("IOCTL is not supported in WDS interface\n")); */
return -EOPNOTSUPP;
}
pConfig->apidx = pObj->ioctl_if;
return Status;
}
VOID AP_E2PROM_IOCTL_PostCtrl(
IN RTMP_IOCTL_INPUT_STRUCT *wrq,
IN PSTRING msg)
{
wrq->u.data.length = strlen(msg);
if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))
{
DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__));
}
}
VOID IAPP_L2_UpdatePostCtrl(
IN PRTMP_ADAPTER pAd,
IN UINT8 *mac_p,
IN INT bssid)
{
}
#endif /* CONFIG_AP_SUPPORT */
//#ifdef WDS_SUPPORT
VOID AP_WDS_KeyNameMakeUp(
IN STRING *pKey,
IN UINT32 KeyMaxSize,
IN INT KeyId)
{
snprintf(pKey, KeyMaxSize, "Wds%dKey", KeyId);
}
//#endif /* WDS_SUPPORT */