📄 zdhci.c
字号:
else {
//if (!(pdot11Obj->ConfigFlag & IBSS_CHANNEL_SCAN_SET)){
// pdot11Obj->ConfigFlag |= IBSS_CHANNEL_SCAN_SET;
// zd_CmdProbeReq(1);
//}
//return FALSE;
printk("We found no IBSS, and we ignore the above code");
printk("without confirm\n");
}
if (!bBSSFound){
//FPRINT("IBSS not found, create it !!!");
/****************************************************/
/* We generate an IBSS */
/****************************************************/
if(pdot11Obj->bDeviceInSleep)
{
printk("In SLLLLLLLLLLLLLLLLLLP @ %s\n", __FUNCTION__);
return FALSE;
}
seed = pdot11Obj->GetReg(reg, ZD_TSF_LowPart);
mBssIndex = 0xff;
//generate random BSSID
mBssId.mac[0] = (U8)((pdot11Obj->Rand(seed) & ~0x3) | 0x2); // I/G = 0, U/L = 1
mBssId.mac[1] = (U8)pdot11Obj->Rand(seed);
mBssId.mac[2] = (U8)pdot11Obj->Rand(seed);
mBssId.mac[3] = (U8)pdot11Obj->Rand(seed);
mBssId.mac[4] = (U8)pdot11Obj->Rand(seed);
mBssId.mac[5] = (U8)pdot11Obj->Rand(seed);
//zd1205_dump_data("mBssId = ", (U8 *)&mBssId, 6);
//update Bssid
pdot11Obj->SetReg(reg, ZD_BSSID_P1, zd_cpu_to_le32(*(U32 *)&mBssId.mac[0]));
pdot11Obj->SetReg(reg, ZD_BSSID_P2, zd_cpu_to_le32(*(U32 *)&mBssId.mac[4]));
ChangeMacMode(macp->IBSS_DesiredMacMode, macp->IBSS_DesiredChannel);
mMacMode = macp->cardSetting.MacMode;
mRfChannel = macp->cardSetting.Channel;
mPhpm.buf[0] = EID_DSPARMS;
mPhpm.buf[1] = 1;
mPhpm.buf[2] = mRfChannel;
printk("Ibss Create, MAC_MODE:%d, CHANNEL:%d\n", mMacMode,mRfChannel);
HW_SetRfChannel(pdot11Obj, mRfChannel, 1, mMacMode);
//FPRINT_V("mRfChannel", mRfChannel);
//update beacon interval
HW_UpdateBcnInterval(pdot11Obj, mBeaconPeriod);
//FPRINT_V("mBeaconPeriod", mBeaconPeriod);
//update supported rated
HW_SetSupportedRate(pdot11Obj, (U8 *)&mBrates);
//zd1205_dump_data("mBrates = ", (U8 *)&mBrates, mBrates.buf[1]+2);
#if defined(OFDM)
if(mMacMode != PURE_A_MODE && mMacMode != PURE_B_MODE)
if (pdot11Obj->IsUSB2_0)
HW_SetSupportedRate(pdot11Obj, (U8 *)&mExtRates);
//zd1205_dump_data("mExtRates = ", (U8 *)&mExtRates, mExtRates.buf[1]+2);
#endif
//update ATIM Window
HW_UpdateATIMWindow(pdot11Obj, mATIMWindow);
//FPRINT_V("mATIMWindow", mATIMWindow);
ConfigBcnFIFO();
HW_EnableBeacon(pdot11Obj, mBeaconPeriod, 0, INDEPENDENT_BSS);
HW_RadioOnOff(pdot11Obj, mRadioOn);
mRequestFlag &= ~IBSS_CONNECT_SET;
mAssoc = TRUE;
memcpy(&pdot11Obj->CurrSsid[0], (U8 *)&mSsid, mSsid.buf[1]+2);
pdot11Obj->StatusNotify(STA_ASSOCIATED, (U8 *)&mBssId);
return TRUE;
}
return FALSE;
}
#endif
void zd_ResetDevice(void)
{
U16 BeaconInterval = 0x2;
U32 tmpvalue;
void *reg = pdot11Obj->reg;
// Device will reset after 1ms
HW_UpdateBcnInterval(pdot11Obj, BeaconInterval);
pdot11Obj->SetReg(reg, ZD_Pre_TBTT, 0x1);
//++ Ensure the following is an atomic operation.
#ifndef HOST_IF_USB
i_state = pdot11Obj->EnterCS();
#endif
if(pdot11Obj->bDeviceInSleep)
{
printk("In SLLLLLLLLLLLLLLLLLLP @ %s\n", __FUNCTION__);
return;
}
tmpvalue = pdot11Obj->GetReg(reg, ZD_PS_Ctrl);
pdot11Obj->SetReg(reg, ZD_PS_Ctrl, (tmpvalue | BIT_0));
pdot11Obj->bDeviceInSleep = 1;
#ifndef HOST_IF_USB
pdot11Obj->ExitCS(i_state);
// Delay 1ms to ensure device had been reset
pdot11Obj->DelayUs(1000);
#endif
}
BOOLEAN zd_PseudoIbssConnect(void)
{
void *reg = pdot11Obj->reg;
U8 IBSS_BSSID[6];
memset(IBSS_BSSID, 0, 6);
//++
// Set EIFS=0x32 to prevent chamber low Tx-throughput (sometimes)
// problem. In chamber environment, almost no Rx-frame, once
// we detect a CRC16/CRC32 error frame, we adopt EIFS, because of
// less of RX-frame, it's less posibility to change EIFS to DIFS
// by FA (Frame Analyzer), and therefore damage the Tx-Throughput.
// We must use SleepResetDevice to trigger FA to adpot 0x32.
pdot11Obj->SetReg(reg, ZD_IFS_Value, 0x5032032);
zd_ResetDevice();
//update Bssid
pdot11Obj->SetReg(reg, ZD_BSSID_P1, zd_cpu_to_le32(*(U32 *)&IBSS_BSSID[0]));
pdot11Obj->SetReg(reg, ZD_BSSID_P2, zd_cpu_to_le32(*(U32 *)&IBSS_BSSID[4]));
HW_SetRfChannel(pdot11Obj, mRfChannel, 1, mMacMode);
mAssoc = TRUE;
pdot11Obj->StatusNotify(STA_ASSOCIATED, (U8 *)IBSS_BSSID);
return TRUE;
}
BOOLEAN zd_CmdConnect(U8 index, U8 bssType)
{
if (bssType == INFRASTRUCTURE_BSS)
{
//printk(KERN_ERR "Build Infra-Type BSS\n");
return zd_InfraConnect(index-1);
}
#if ZDCONF_ADHOC_SUPPORT == 1
else if (bssType==INDEPENDENT_BSS)
{
//printk(KERN_ERR "Build IBSS\n");
return zd_IbssConnect();
}
#endif
#if ZDCONF_PSEUDO_SUPPORT == 1
else if (bssType == PSEUDO_IBSS)
return zd_PseudoIbssConnect();
#endif
return TRUE;
}
BOOLEAN zd_CmdDisConnect(void)
{
mAssoc = FALSE;
mRequestFlag |= DIS_CONNECT_SET;
return TRUE;
}
BOOLEAN zd_CmdRoaming(void)
{
if ((mRequestFlag & (ROAMING_SET | CHANNEL_SCAN_SET)) || pdot11Obj->bChScanning || (pdot11Obj->ConfigFlag & SCAN_AND_CONNECT_SET))
return FALSE;
mAssoc = FALSE;
#if ZDCONF_ADHOC_SUPPORT == 1
if (mBssType == INDEPENDENT_BSS)
mRequestFlag |= CHANNEL_SCAN_SET;
else
#endif
mRequestFlag |= ROAMING_SET;
return TRUE;
}
BOOLEAN zd_CmdFlushQ(void)
{
if (pdot11Obj->QueueFlag & TX_QUEUE_SET){
FlushQ(pTxQ);
}
else if (pdot11Obj->QueueFlag & MGT_QUEUE_SET){
FlushQ(pMgtQ);
}
else if (pdot11Obj->QueueFlag & AWAKE_QUEUE_SET){
FlushQ(pAwakeQ);
}
return TRUE;
}
BOOLEAN zd_CmdProcess(U16 CmdId, void *parm1, U32 parm2)
{
BOOLEAN status = TRUE;
switch(CmdId){
case CMD_RESET_80211:
status = zd_Reset80211((zd_80211Obj_t *)parm1);
break;
case CMD_ENABLE:
#if ZDCONF_AP_SUPPORT == 1
if (mBssType == AP_BSS)
status = zd_StartAP();
else
#endif
{
if ((pdot11Obj->ConfigFlag & SCAN_AND_CONNECT_SET)||(mRequestFlag & CHANNEL_SCAN_SET))
{
// printk("Scan and connect is underGoing\n");
break;
}
else if (!mIfaceOpened)
{
status = zd_StartSTA(1);
mIfaceOpened = TRUE;
}
else
{
pdot11Obj->ConfigFlag |= SCAN_AND_CONNECT_SET;
zd_ChooseAP(0);
}
}
break;
case CMD_DISASOC: //IAPP cth
status = zd_CmdDisasoc((MacAddr_t*)parm1, (U8)parm2);
break;
case CMD_DEAUTH://MAC filter cth
status = zd_CmdDeauth((MacAddr_t*)parm1, (U8)parm2);
break;
#if ZDCONF_AP_SUPPORT == 1
case CMD_PS_POLL:
//PSDEBUG("CMD_PS_POLL");
status = zd_HandlePsPoll((U8 *)parm1);
break;
#endif
case CMD_PASSIVE_SCAN:
status = zd_PassiveScan();
break;
case CMD_DISASOC_ALL:
status = zd_DisasocAll((U8)parm2);
break;
case CMD_CONNECT:
{
U8 *pBsstype=(U8*)parm1;
status = zd_CmdConnect((U8)parm2,*pBsstype);
}
break;
case CMD_PROBE_REQ:
//FPRINT("CMD_PROBE_REQ");
status = zd_CmdProbeReq((U8)parm2);
pdot11Obj->ConfigFlag |= JUST_CHANNEL_SCAN;
break;
case CMD_DIS_CONNECT:
status = zd_CmdDisConnect();
break;
case CMD_FLUSH_QUEUE:
status = zd_CmdFlushQ();
break;
case CMD_ROAMING:
status = zd_CmdRoaming();
break;
default:
status = FALSE;
break;
}
return status;
}
//Event Nofify Functions
void zd_NextBcn(void)
{
#if ZDCONF_AP_SUPPORT == 1
if (mBssType == AP_BSS){
if (mDtimCount == 0)
mDtimCount = mDtimPeriod;
mDtimCount--;
}
#endif
ConfigBcnFIFO();
if (pTxQ->cnt)
pdot11Obj->QueueFlag |= TX_QUEUE_SET;
return;
}
#if ZDCONF_AP_SUPPORT == 1
void zd_DtimNotify(void)
{
SendMcPkt();
return;
}
#endif
extern BOOLEAN Tchal_WaitChalRsp(Signal_t *signal);
void zd_SendTChalMsg(void)
{
Tchal_WaitChalRsp(NULL);
return;
}
extern BOOLEAN AuthTimeOut(Signal_t *signal);
void zd_SendTAuthMsg(void)
{
AuthTimeOut(NULL);
return;
}
extern BOOLEAN AsocTimeOut(Signal_t *signal);
void zd_SendTAsocMsg(void)
{
AsocTimeOut(NULL);
return;
}
void zd_SwitchNextCH(void)
{
void *reg = pdot11Obj->reg;
static u8 LastScanMacMode;
static u8 ScanAround = 0;
//static u8 ScanWait = 0;
static u8 initMAC_Mode = 0xff;
struct zd1205_private *macp = (struct zd1205_priviate *)g_dev->priv;
if(initMAC_Mode == 0xff)
initMAC_Mode = mMacMode;
//FPRINT("zd_SwitchNextCH");
if ((PURE_A_MODE != mMacMode && CurrScanCH > MAX_CHANNEL_ALLOW)
#if ZDCONF_80211A_SUPPORT == 1
|| (PURE_A_MODE == mMacMode && CurrScanCH > dot11A_Channel_Amount - 1)
#endif
//In 11a, channel array index 0 is also meaningful.
){ //Scan Finish...
#ifdef HMAC_DEBUG
U8 i, j;
U16 cap;
#endif
#if ZDCONF_AP_SUPPORT == 1
if (mBssType == AP_BSS)
pdot11Obj->SetReg(reg, ZD_Rx_Filter, AP_RX_FILTER);
else
#endif
pdot11Obj->SetReg(reg, ZD_Rx_Filter, STA_RX_FILTER);
if (pdot11Obj->ConfigFlag & PASSIVE_CHANNEL_SCAN_SET)
pdot11Obj->ConfigFlag &= ~PASSIVE_CHANNEL_SCAN_SET;
if (pdot11Obj->ConfigFlag & IBSS_CHANNEL_SCAN_SET)
{
pdot11Obj->ConfigFlag &= ~IBSS_CHANNEL_SCAN_SET;
//mRequestFlag |= IBSS_CONNECT_SET;
}
CurrScanCH = 1;
pdot11Obj->bChScanning = 0;
zd1205_notify_scan_done(macp);
set_bit(CTX_FLAG_ESSID_WAS_SET, (void *)&macp->flags);
ScanAround=0;
if (pdot11Obj->ConfigFlag & ACTIVE_CHANNEL_SCAN_SET)
{
#ifdef HMAC_DEBUG
printk("\nSSID BSSID CH Signal Mode Basic-Rates Ext-Rates b/g AP");
printk("\n------------------------------------------------------------------------------------");
for (i=0; i<mBssNum; i++)
{
printk("\n");
for (j=0; j<mBssInfo[i].ssid.buf[1]; j++) {
printk("%c", mBssInfo[i].ssid.buf[2+j]);
}
for (j=mBssInfo[i].ssid.buf[1]; j<12; j++) {
printk(" ");
}
printk("%02x:%02x:%02x:%02x:%02x:%02x",
mBssInfo[i].bssid.mac[0], mBssInfo[i].bssid.mac[1], mBssInfo[i].bssid.mac[2],
mBssInfo[i].bssid.mac[3], mBssInfo[i].bssid.mac[4], mBssInfo[i].bssid.mac[5]);
printk(" %2d", mBssInfo[i].Phpm.buf[2]);
printk(" %2d", mBssInfo[i].signalStrength);
cap = mBssInfo[i].cap;
cap &= (CAP_PRIVACY | CAP_IBSS | CAP_ESS);
switch(cap) {
case 0x01:
printk(" Infra ");
break;
case 0x02:
printk(" Ad_Hoc ");
break;
case 0x11:
printk(" Infra, W");
break;
case 0x12:
printk(" Ad_Hoc,W");
break;
default :
break;
}
printk(" ");
for (j=0; j<mBssInfo[i].supRates.buf[1]; j++) {
printk(" %x", mBssInfo[i].supRates.buf[2+j]);
}
printk(" ");
for (j=0; j<mBssInfo[i].extRates.buf[1]; j++) {
printk(" %x", mBssInfo[i].extRates.buf[2+j]);
}
if (mBssInfo[i].apMode == PURE_B_AP)
printk(" B-AP");
else if (mBssInfo[i].apMode == PURE_G_AP)
printk(" G-AP");
else if (mBssInfo[i].apMode == MIXED_AP)
printk(" M-AP");
}
else if (mBssInfo[i].apMode == PURE_A_AP)
printk(" A_AP");
else
VerAssert();
printk("\n");
FPRINT("****** Scan Finished ******");
#endif
pdot11Obj->ConfigFlag &= ~ACTIVE_CHANNEL_SCAN_SET;
mBssCnt = mBssNum;
}//End of ACTIVE_CHANNEL_SCAN_SET
if (pdot11Obj->ConfigFlag & JUST_CHANNEL_SCAN){
pdot11Obj->ConfigFlag &= ~JUST_CHANNEL_SCAN;
if (mAssoc || (mBssType == AP_BSS))
{
mMacMode = initMAC_Mode;
HW_SetRfChannel(pdot11Obj, mRfChannel, 1, initMAC_Mode);
}
}
else
{
if (mBssType == INFRASTRUCTURE_BSS)
zd_ChooseAP(0);
#if ZDCONF_ADHOC_SUPPORT == 1
if (mBssType == INDEPENDENT_BSS)
zd_IbssConnect();
#endif
}
if (pdot11Obj->ConfigFlag & SCAN_AND_CONNECT_SET)
{
pdot11Obj->ConfigFlag &= ~SCAN_AND_CONNECT_SET;
}
initMAC_Mode = 0xff;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -