Пример #1
0
struct zsBssInfo* zfBssInfoAllocate(zdev_t* dev)
{
    struct zsBssInfo* pBssInfo;

    zmw_get_wlan_dev(dev);

    if (wd->sta.bssInfoFreeCount == 0)
        return NULL;

    pBssInfo = wd->sta.bssInfoArray[wd->sta.bssInfoArrayHead];
    wd->sta.bssInfoArray[wd->sta.bssInfoArrayHead] = NULL;
    wd->sta.bssInfoArrayHead = (wd->sta.bssInfoArrayHead + 1) & (ZM_MAX_BSS - 1);
    wd->sta.bssInfoFreeCount--;
 
    zfZeroMemory((u8_t*)pBssInfo, sizeof(struct zsBssInfo));

    return pBssInfo;
}
Пример #2
0
void zfProcessEvent(zdev_t* dev, u16_t* eventArray, u8_t eventCount)
{
    u8_t i, j, bypass = FALSE; 
    u16_t eventBypass[32];
    u8_t eventBypassCount = 0;

    zmw_get_wlan_dev(dev);

    zmw_declare_for_critical_section();

    zfZeroMemory((u8_t*) eventBypass, 64);

    for( i=0; i<eventCount; i++ )
    {    
        for( j=0; j<eventBypassCount; j++ )
        {
            if ( eventBypass[j] == eventArray[i] )
            {
                bypass = TRUE;
                break;
            }
        }
        
        if ( bypass )
        {
            continue;
        }
        
        switch( eventArray[i] )
        {
            case ZM_EVENT_SCAN:
                {
                    zfScanMgrScanEventStart(dev);
                    eventBypass[eventBypassCount++] = ZM_EVENT_IN_SCAN;
                    eventBypass[eventBypassCount++] = ZM_EVENT_TIMEOUT_SCAN;                    
                }
                break;

            case ZM_EVENT_TIMEOUT_SCAN:
                {
                    u8_t res;
                    
                    res = zfScanMgrScanEventTimeout(dev);
                    if ( res == 0 )
                    {
                        eventBypass[eventBypassCount++] = ZM_EVENT_TIMEOUT_SCAN;
                    }
                    else if ( res == 1 )
                    {
                        eventBypass[eventBypassCount++] = ZM_EVENT_IN_SCAN;
                    }
                }
                break;
       
            case ZM_EVENT_IBSS_MONITOR:
                {
                    zfStaIbssMonitoring(dev, 0);
                }
                break;

            case ZM_EVENT_IN_SCAN:
                {
                    zfScanMgrScanEventRetry(dev);
                }
                break;

            case ZM_EVENT_CM_TIMER:
                {
                    zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_TIMER");

                    wd->sta.cmMicFailureCount = 0;
                }
                break;

            case ZM_EVENT_CM_DISCONNECT:
                {
                    zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_DISCONNECT");

                    zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT);
                    
                    zmw_enter_critical_section(dev);
                    //zfTimerSchedule(dev, ZM_EVENT_CM_BLOCK_TIMER, 
                    //                ZM_TICK_CM_BLOCK_TIMEOUT);

                    /* Timer Resolution on WinXP is 15/16 ms  */
                    /* Decrease Time offset for <XP> Counter Measure */
                    zfTimerSchedule(dev, ZM_EVENT_CM_BLOCK_TIMER, 
                                         ZM_TICK_CM_BLOCK_TIMEOUT - ZM_TICK_CM_BLOCK_TIMEOUT_OFFSET);

                    zmw_leave_critical_section(dev);
                    if (wd->sta.cmMicFailureCount == 2)  //accumlate 2 MIC error in 60sec. send deauth to AP
		      	        {
		                 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, wd->sta.bssid, 1, 0, 0);
		      	        } 
                    wd->sta.cmMicFailureCount = 0;
                    //zfiWlanDisable(dev);
                    zfHpResetKeyCache(dev);
                    if (wd->zfcbConnectNotify != NULL)
                    {
                        wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_DISCONNECT_MIC_FAIL,
                             wd->sta.bssid);           
                    }
                }
                break;

            case ZM_EVENT_CM_BLOCK_TIMER:
                {
                    zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_BLOCK_TIMER");

                    //zmw_enter_critical_section(dev);
                    wd->sta.cmDisallowSsidLength = 0;
                    if ( wd->sta.bAutoReconnect )
                    {   
                        zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_BLOCK_TIMER:bAutoReconnect!=0");
                        zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
                        zfScanMgrScanStart(dev, ZM_SCAN_MGR_SCAN_INTERNAL);        
                    }
                    //zmw_leave_critical_section(dev);                
                }
                break;
            
            case ZM_EVENT_TIMEOUT_ADDBA:
                {
                    if (!wd->addbaComplete && (wd->addbaCount < 5))
                    {
                        zfAggSendAddbaRequest(dev, wd->sta.bssid, 0, 0);
                        wd->addbaCount++;
                        zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_ADDBA, 100);
                    }
                    else
                    {
                        zfTimerCancel(dev, ZM_EVENT_TIMEOUT_ADDBA);
                    }
                }
                break;
                
            #ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
            case ZM_EVENT_TIMEOUT_PERFORMANCE:
                {
                    zfiPerformanceRefresh(dev);
                }
                break;
            #endif
            case ZM_EVENT_SKIP_COUNTERMEASURE:
				//enable the Countermeasure
				{
					zm_debug_msg0("Countermeasure : Enable MIC Check ");
					wd->TKIP_Group_KeyChanging = 0x0;
				}
				break;
            
            default:
                break;
        }
    }   
}
Пример #3
0
/* for WLAN operation, must be called first before other function.   */
extern u16_t zfiWlanOpen(zdev_t *dev, struct zsCbFuncTbl *cbFuncTbl)
{
	/* u16_t ret;
	   u32_t i;
	   u8_t* ch;
	   u8_t  bPassive;
	*/
	u32_t devSize;
	struct zfCbUsbFuncTbl cbUsbFuncTbl;
	zmw_get_wlan_dev(dev);

	zm_debug_msg0("start");

	devSize = sizeof(struct zsWlanDev);
	/* Zeroize zsWlanDev struct */
	zfZeroMemory((u8_t *)wd, (u16_t)devSize);

#ifdef ZM_ENABLE_AGGREGATION
	zfAggInit(dev);
#endif

	zfCwmInit(dev);

	wd->commTally.RateCtrlTxMPDU = 0;
	wd->commTally.RateCtrlBAFail = 0;
	wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT;

	if (cbFuncTbl == NULL) {
		/* zfcbRecvEth() is mandatory */
		zm_assert(0);
	} else {
		if (cbFuncTbl->zfcbRecvEth == NULL) {
			/* zfcbRecvEth() is mandatory */
			zm_assert(0);
		}
		wd->zfcbAuthNotify = cbFuncTbl->zfcbAuthNotify;
		wd->zfcbAuthNotify = cbFuncTbl->zfcbAuthNotify;
		wd->zfcbAsocNotify = cbFuncTbl->zfcbAsocNotify;
		wd->zfcbDisAsocNotify = cbFuncTbl->zfcbDisAsocNotify;
		wd->zfcbApConnectNotify = cbFuncTbl->zfcbApConnectNotify;
		wd->zfcbConnectNotify = cbFuncTbl->zfcbConnectNotify;
		wd->zfcbScanNotify = cbFuncTbl->zfcbScanNotify;
		wd->zfcbMicFailureNotify = cbFuncTbl->zfcbMicFailureNotify;
		wd->zfcbApMicFailureNotify = cbFuncTbl->zfcbApMicFailureNotify;
		wd->zfcbIbssPartnerNotify = cbFuncTbl->zfcbIbssPartnerNotify;
		wd->zfcbMacAddressNotify = cbFuncTbl->zfcbMacAddressNotify;
		wd->zfcbSendCompleteIndication =
					cbFuncTbl->zfcbSendCompleteIndication;
		wd->zfcbRecvEth = cbFuncTbl->zfcbRecvEth;
		wd->zfcbRestoreBufData = cbFuncTbl->zfcbRestoreBufData;
		wd->zfcbRecv80211 = cbFuncTbl->zfcbRecv80211;
#ifdef ZM_ENABLE_CENC
		wd->zfcbCencAsocNotify = cbFuncTbl->zfcbCencAsocNotify;
#endif /* ZM_ENABLE_CENC */
		wd->zfcbClassifyTxPacket = cbFuncTbl->zfcbClassifyTxPacket;
		wd->zfcbHwWatchDogNotify = cbFuncTbl->zfcbHwWatchDogNotify;
	}

	/* add by honda 0330 */
	cbUsbFuncTbl.zfcbUsbRecv = zfiUsbRecv;
	cbUsbFuncTbl.zfcbUsbRegIn = zfiUsbRegIn;
	cbUsbFuncTbl.zfcbUsbOutComplete = zfiUsbOutComplete;
	cbUsbFuncTbl.zfcbUsbRegOutComplete = zfiUsbRegOutComplete;
	zfwUsbRegisterCallBack(dev, &cbUsbFuncTbl);
	/* Init OWN MAC address */
	wd->macAddr[0] = 0x8000;
	wd->macAddr[1] = 0x0000;
	wd->macAddr[2] = 0x0000;

	wd->regulationTable.regionCode = 0xffff;

	zfHpInit(dev, wd->frequency);

	/* init region code */
	/* wd->regulationTable.regionCode = NULL1_WORLD; //Only 2.4g RegCode */
	/* zfHpGetRegulationTablefromRegionCode(dev, NULL1_WORLD); */
	/* zfiWlanSetDot11DMode(dev , 1); //Enable 802.11d */
	/* Get the first channel */
	/* wd->frequency = zfChGetFirstChannel(dev, &bPassive); */
#ifdef ZM_AP_DEBUG
	/* wd->frequency = 2437; */
#endif

	/* STA mode */
	wd->sta.mTxRate = 0x0;
	wd->sta.uTxRate = 0x3;
	wd->sta.mmTxRate = 0x0;
	wd->sta.adapterState = ZM_STA_STATE_DISCONNECT;
	wd->sta.capability[0] = 0x01;
	wd->sta.capability[1] = 0x00;

	wd->sta.preambleTypeHT = 0;
	wd->sta.htCtrlBandwidth = 0;
	wd->sta.htCtrlSTBC = 0;
	wd->sta.htCtrlSG = 0;
	wd->sta.defaultTA = 0;
	/*wd->sta.activescanTickPerChannel =
	*ZM_TIME_ACTIVE_SCAN/ZM_MS_PER_TICK;
	*/
	{
		u8_t Dur = ZM_TIME_ACTIVE_SCAN;
		zfwGetActiveScanDur(dev, &Dur);
		wd->sta.activescanTickPerChannel = Dur / ZM_MS_PER_TICK;

	}
	wd->sta.passiveScanTickPerChannel = ZM_TIME_PASSIVE_SCAN/ZM_MS_PER_TICK;
	wd->sta.bAutoReconnect = TRUE;
	wd->sta.dropUnencryptedPkts = FALSE;

	/* set default to bypass all multicast packet for linux,
	*  window XP would set 0 by wrapper initialization
	*/
	wd->sta.bAllMulticast = 1;

	/* Initial the RIFS Status / RIFS-like frame count / RIFS count */
	wd->sta.rifsState = ZM_RIFS_STATE_DETECTING;
	wd->sta.rifsLikeFrameCnt = 0;
	wd->sta.rifsCount = 0;

	wd->sta.osRxFilter = 0;
	wd->sta.bSafeMode = 0;

	/* Common */
	zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_DISCONNECT);
	wd->beaconInterval = 100;
	wd->rtsThreshold = 2346;
	wd->fragThreshold = 32767;
	wd->wlanMode = ZM_MODE_INFRASTRUCTURE;
	wd->txMCS = 0xff;    /* AUTO */
	wd->dtim = 1;
	/* wd->txMT = 1;       *//*OFDM */
	wd->tick = 1;
	wd->maxTxPower2 = 0xff;
	wd->maxTxPower5 = 0xff;
	wd->supportMode = 0xffffffff;
	wd->ws.adhocMode = ZM_ADHOCBAND_G;
	wd->ws.autoSetFrequency = 0xff;

	/* AP mode */
	/* wd->bgMode = wd->ws.bgMode; */
	wd->ap.ssidLen[0] = 6;
	wd->ap.ssid[0][0] = 'Z';
	wd->ap.ssid[0][1] = 'D';
	wd->ap.ssid[0][2] = '1';
	wd->ap.ssid[0][3] = '2';
	wd->ap.ssid[0][4] = '2';
	wd->ap.ssid[0][5] = '1';

	/* Init the country iso name as NA */
	wd->ws.countryIsoName[0] = 0;
	wd->ws.countryIsoName[1] = 0;
	wd->ws.countryIsoName[2] = '\0';

	/* init fragmentation is disabled */
	/* zfiWlanSetFragThreshold(dev, 0); */

	/* airopeek : swSniffer 1=>on  0=>off */
	wd->swSniffer = 0;
	wd->XLinkMode = 0;

	/* jhlee HT 0 */
#if 1
	/* AP Mode*/
	/* Init HT Capability Info */
	wd->ap.HTCap.Data.ElementID = ZM_WLAN_EID_HT_CAPABILITY;
	wd->ap.HTCap.Data.Length = 26;
	/*wd->ap.HTCap.Data.SupChannelWidthSet = 0;
	wd->ap.HTCap.Data.MIMOPowerSave = 3;
	wd->ap.HTCap.Data.ShortGIfor40MHz = 0;
	wd->ap.HTCap.Data.ShortGIfor20MHz = 0;
	wd->ap.HTCap.Data.DSSSandCCKin40MHz = 0;
	*/
	wd->ap.HTCap.Data.AMPDUParam |= HTCAP_MaxRxAMPDU3;
	wd->ap.HTCap.Data.MCSSet[0] = 0xFF; /* MCS 0 ~  7 */
	wd->ap.HTCap.Data.MCSSet[1] = 0xFF; /* MCS 8 ~ 15 */

	/* Init Extended HT Capability Info */
	wd->ap.ExtHTCap.Data.ElementID = ZM_WLAN_EID_EXTENDED_HT_CAPABILITY;
	wd->ap.ExtHTCap.Data.Length = 22;
	wd->ap.ExtHTCap.Data.ControlChannel = 6;
	/* wd->ap.ExtHTCap.Data.ExtChannelOffset = 3; */
	wd->ap.ExtHTCap.Data.ChannelInfo |= ExtHtCap_RecomTxWidthSet;
	/* wd->ap.ExtHTCap.Data.RIFSMode = 1; */
	wd->ap.ExtHTCap.Data.OperatingInfo |= 1;

	/* STA Mode*/
	/* Init HT Capability Info */
	wd->sta.HTCap.Data.ElementID = ZM_WLAN_EID_HT_CAPABILITY;
	wd->sta.HTCap.Data.Length = 26;

	/* Test with 5G-AP : 7603 */
	/* wd->sta.HTCap.Data.SupChannelWidthSet = 1; */
	wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SMEnabled;
	wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SupChannelWidthSet;
	wd->sta.HTCap.Data.HtCapInfo |= HTCAP_ShortGIfor40MHz;
	wd->sta.HTCap.Data.HtCapInfo |= HTCAP_DSSSandCCKin40MHz;
#ifndef ZM_DISABLE_AMSDU8K_SUPPORT
	wd->sta.HTCap.Data.HtCapInfo |= HTCAP_MaxAMSDULength;
#endif
	/*wd->sta.HTCap.Data.MIMOPowerSave = 0;
	wd->sta.HTCap.Data.ShortGIfor40MHz = 0;
	wd->sta.HTCap.Data.ShortGIfor20MHz = 0;
	wd->sta.HTCap.Data.DSSSandCCKin40MHz = 0;
	*/
	wd->sta.HTCap.Data.AMPDUParam |= HTCAP_MaxRxAMPDU3;
	wd->sta.HTCap.Data.MCSSet[0] = 0xFF; /* MCS 0 ~  7 */
	wd->sta.HTCap.Data.MCSSet[1] = 0xFF; /* MCS 8 ~ 15 */
	wd->sta.HTCap.Data.PCO |= HTCAP_TransmissionTime3;
	/* wd->sta.HTCap.Data.TransmissionTime = 0; */
	/* Init Extended HT Capability Info */
	wd->sta.ExtHTCap.Data.ElementID = ZM_WLAN_EID_EXTENDED_HT_CAPABILITY;
	wd->sta.ExtHTCap.Data.Length = 22;
	wd->sta.ExtHTCap.Data.ControlChannel = 6;

	/* wd->sta.ExtHTCap.Data.ExtChannelOffset |= 3; */
	wd->sta.ExtHTCap.Data.ChannelInfo |= ExtHtCap_ExtChannelOffsetBelow;

	/* wd->sta.ExtHTCap.Data.RecomTxWidthSet = 1; */
	/* wd->sta.ExtHTCap.Data.RIFSMode = 1; */
	wd->sta.ExtHTCap.Data.OperatingInfo |= 1;
#endif

#if 0
	/* WME test code */
	wd->ap.qosMode[0] = 1;
#endif

	wd->ledStruct.ledMode[0] = 0x2221;
	wd->ledStruct.ledMode[1] = 0x2221;

	zfTimerInit(dev);

	ZM_PERFORMANCE_INIT(dev);

	zfBssInfoCreate(dev);
	zfScanMgrInit(dev);
	zfPowerSavingMgrInit(dev);

#if 0
	/* Test code */
	{
		u32_t key[4] = {0xffffffff, 0xff, 0, 0};
		u16_t addr[3] = {0x8000, 0x01ab, 0x0000};
		/*zfSetKey(dev, 0, 0, ZM_WEP64, addr, key);
		zfSetKey(dev, 0, 0, ZM_AES, addr, key);
		zfSetKey(dev, 64, 0, 1, wd->macAddr, key);
		*/
	}
#endif

	/* WME settings */
	wd->ws.staWmeEnabled = 1;           /* Enable WME by default */
#define ZM_UAPSD_Q_SIZE 32 /* 2^N */
	wd->ap.uapsdQ = zfQueueCreate(dev, ZM_UAPSD_Q_SIZE);
	zm_assert(wd->ap.uapsdQ != NULL);
	wd->sta.uapsdQ = zfQueueCreate(dev, ZM_UAPSD_Q_SIZE);
	zm_assert(wd->sta.uapsdQ != NULL);

	/* zfHpInit(dev, wd->frequency); */

	/* MAC address */
	/* zfHpSetMacAddress(dev, wd->macAddr, 0); */
	zfHpGetMacAddress(dev);

	zfCoreSetFrequency(dev, wd->frequency);

#if ZM_PCI_LOOP_BACK == 1
	zfwWriteReg(dev, ZM_REG_PCI_CONTROL, 6);
#endif /* #if ZM_PCI_LOOP_BACK == 1 */

	/* zfiWlanSetDot11DMode(dev , 1); // Enable 802.11d */
	/* zfiWlanSetDot11HDFSMode(dev , 1); // Enable 802.11h DFS */
	wd->sta.DFSEnable = 1;
	wd->sta.capability[1] |= ZM_BIT_0;

	/* zfiWlanSetFrequency(dev, 5260000, TRUE); */
	/* zfiWlanSetAniMode(dev , 1); // Enable ANI */

	/* Trgger Rx DMA */
	zfHpStartRecv(dev);

	zm_debug_msg0("end");

	return 0;
}