📄 zdhci.c
字号:
memcpy(&signal->frmInfo.Sta, sta, 6);
signal->frmInfo.rCode = (ReasonCode)rCode;
sigEnque(pMgtQ, (signal));
return TRUE;
}
BOOLEAN zd_PassiveScan(void)
{
void *reg = pdot11Obj->reg;
//FPRINT("zd_PassiveScan");
if (pdot11Obj->ConfigFlag & PASSIVE_CHANNEL_SCAN_SET)
return FALSE;
pdot11Obj->ConfigFlag |= PASSIVE_CHANNEL_SCAN_SET;
pdot11Obj->SetReg(reg, ZD_Rx_Filter, 0x100); //only accept beacon frame
if(mMacMode != PURE_A_MODE) {
// printk("HW_SetRfChannel:%s(%d)\n",__FILE__,__LINE__);
HW_SetRfChannel(pdot11Obj, CurrScanCH, 1,mMacMode);
}
else {
// printk("HW_SetRfChannel:%s(%d)\n",__FILE__,__LINE__);
HW_SetRfChannel(pdot11Obj,dot11A_Channel[CurrScanCH-1],1 ,mMacMode);
}
pdot11Obj->StartTimer(SCAN_TIMEOUT, DO_SCAN);
return TRUE;
}
BOOLEAN zd_DisasocAll(U8 rCode)
{
int i;
MacAddr_t *sta;
if (mBssType == AP_BSS){
for (i=1; i<(MAX_AID+1); i++){
if (sstByAid[i]->asoc == STATION_STATE_ASOC){
sta = (MacAddr_t *)&sstByAid[i]->mac[0];
zd_CmdDisasoc(sta, rCode);
}
}
FlushQ(pTxQ);
}
else if (mBssType == INFRASTRUCTURE_BSS){
if (mAssoc)
zd_CmdDisasoc(&mBssId, rCode);
}
return TRUE;
}
BOOLEAN zd_ChooseAP(BOOLEAN bUseBssid)
{
U8 i;
U16 cap;
U16 quality = 10000;
BOOLEAN found = FALSE;
mBssIndex = 0xff;
for (i=0; i<mBssCnt; i++)
{
if (bUseBssid)
{
if (memcmp(&dot11DesiredBssid, &mBssInfo[i].bssid.mac[0], ETH_ALEN) == 0 && memcmp(&dot11DesiredBssid, zeroMacAddress, ETH_ALEN)!=0)
{
//ZD1211DEBUG(0, "zd_ChooseAP: Bssid" MACSTR "matched to index:%d\n",MAC2STR(dot11DesiredBssid), i);
mBssIndex = i;
break;
}
}
cap = mBssInfo[i].cap;
if ((memcmp(&dot11DesiredSsid, &mBssInfo[i].ssid, dot11DesiredSsid.buf[1]+2) == 0)
|| (!mProbeWithSsid) ) {
if(1)
;
else if ((mMacMode == PURE_B_MODE) && (mBssInfo[i].apMode == PURE_G_AP))
continue;
else if ((mMacMode == PURE_B_MODE) && (mBssInfo[i].apMode == PURE_A_AP))
continue;
else if ((mMacMode == PURE_G_MODE) && (mBssInfo[i].apMode == PURE_B_AP))
continue;
else if ((mMacMode == PURE_G_MODE) && (mBssInfo[i].apMode == PURE_A_AP))
continue;
else if ((mMacMode == PURE_A_MODE) && (mBssInfo[i].apMode != PURE_A_AP))
continue;
else if ((mMacMode == MIXED_MODE) && (mBssInfo[i].apMode == PURE_A_AP))
continue;
//check capability ...
if (cap & CAP_PRIVACY){
if (!mPrivacyInvoked)
continue;
}
else {
if (mPrivacyInvoked)
continue;
}
if (!pdot11Obj->IsUSB2_0){ //host is usb 1.1
if (mBssInfo[i].apMode == PURE_G_AP)
continue;
}
if (cap & CAP_ESS){
if (mBssInfo[i].signalQuality < quality ){
quality = mBssInfo[i].signalQuality;
mBssIndex = i;
//FPRINT_V("cap", cap);
}
}
//break;
}
}
if (mBssIndex< mBssCnt){
found = TRUE;
//FPRINT_V("Desired AP Found, Bss Index", mBssIndex);
if (pdot11Obj->ConfigFlag & SCAN_AND_CONNECT_SET){
//printk("zd_ChooseAP: set mRequestFlag.BSS_CONNECT_SET\n");
mRequestFlag |= BSS_CONNECT_SET;
pdot11Obj->ConfigFlag &= ~SCAN_AND_CONNECT_SET;
}
}
else{
//printk(" \n");
//printk(KERN_ERR "****** Can't find desiredSSID:");
//for (i=0; i<dot11DesiredSsid.buf[1]; i++) {
// printk("%c", dot11DesiredSsid.buf[2+i]);
//}
//printk(" \n");
}
// int j;
// if(0xff != mBssIndex) {
// for(j=0;j<mBssInfo[mBssIndex].ssid.buf[1];j++)
// printk("%c",mBssInfo[mBssIndex].ssid.buf[2+j]);
// printk(" ChooseAP(Mac=%d,Ch:%d)\n",mBssInfo[mBssIndex].apMode,mBssInfo[mBssIndex].Phpm.buf[2]);
// }
return found;
}
BOOLEAN zd_InfraConnect(U8 index)
{
Signal_t *signal;
struct zd1205_private *macp = (struct zd1205_private *)g_dev->priv;
MacAddr_t *pBssid;
Element *pSsid = NULL;
U32 tmpvalue;
BOOLEAN bChooseAPResult;
void *reg = pdot11Obj->reg;
//FPRINT("zd_InfraConnect");
if (mBssNum == 0)
return FALSE;
if ((signal = allocSignal()) == NULL)
return FALSE;
if(mCounterMeasureState) {
mRequestFlag &= ~BSS_CONNECT_SET;
freeSignal(signal);
return FALSE;
}
// look up global scan result table according to desired ssid,
// because mBssInfo order may be different from macp->BSSInfo[].
/*if (mBssCnt)
{
U8 ssidLength;
for(i=0; i<mBssCnt; i++)
{
ssidLength=dot11DesiredSsid.buf[1]+2;
if (mBssInfo[i].cap & CAP_ESS)
{
if (memcmp((U8*)&dot11DesiredSsid,(U8*)&mBssInfo[i].ssid,ssidLength)==0)
{
break;
}
}
}
} */
// Use zd_ChooseAP instead of above code
bChooseAPResult=zd_ChooseAP(0);
if (!bChooseAPResult || 1)
{// dot11DesiredSsid can't be found in table mBssInfo[]
if ((index+1) <= mBssCnt)
{
//printk(KERN_ERR "Desired SSID can't be found in current table\n");
mBssIndex=index; // Can't found in the latest scan result table, use the old index.
}
else
{
freeSignal(signal);
return FALSE; // The index exceed mBssInfo[].
}
}
else
{
//printk(KERN_ERR "Desired SSID found in location %d\n",mBssIndex);
}
//Disable IBSS mode
if(pdot11Obj->bDeviceInSleep)
{
printk("In SLLLLLLLLLLLLLLLLLLP @ %s\n", __FUNCTION__);
return FALSE;
}
tmpvalue = pdot11Obj->GetReg(reg, ZD_BCNInterval);
tmpvalue &= ~BIT_25;
pdot11Obj->SetReg(reg, ZD_BCNInterval, tmpvalue);
mCap |= BIT_0;
mCap &= ~BIT_1;
// For IBSS Connect
if (mBssInfo[index].cap & CAP_IBSS)
{
}
//mBssIndex = index;
//update beacon interval
HW_UpdateBcnInterval(pdot11Obj, mBssInfo[mBssIndex].bcnInterval);
pSsid = &mBssInfo[mBssIndex].ssid;
memcpy((U8 *)&mSsid, (U8 *)pSsid, pSsid->buf[1]+2);
pBssid = &mBssInfo[mBssIndex].bssid;
memcpy((U8 *)&mBssId, (U8 *)pBssid, 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]));
// Update channel number contained in the DS Parameter Set element of the received probe response or beacon frame.
mRfChannel = mBssInfo[mBssIndex].Phpm.buf[2];
if(PURE_A_AP == mBssInfo[mBssIndex].apMode) {
ChangeMacMode(PURE_A_MODE,mRfChannel);
zd_UpdateCardSetting(&(macp->cardSetting));
pdot11Obj->DelayUs(1000);
HW_SetRfChannel(pdot11Obj, mRfChannel, 1, PURE_A_MODE);
}
else {
if(PURE_A_MODE == mMacMode)
mMacMode = MIXED_MODE;
ChangeMacMode(mMacMode,mRfChannel);
zd_UpdateCardSetting(&(macp->cardSetting));
pdot11Obj->DelayUs(1000);
HW_SetRfChannel(pdot11Obj, mRfChannel, 1, MIXED_MODE);
}
signal->id = SIG_AUTH_REQ;
signal->block = BLOCK_AUTH_REQ;
memcpy(&signal->frmInfo.Sta, (U8 *)&mBssId, 6);
sigEnque(pMgtQ, (signal));
if (mRequestFlag & CONNECT_TOUT_SET)
mRequestFlag &= ~CONNECT_TOUT_SET;
if (mRequestFlag & BSS_CONNECT_SET)
mRequestFlag &= ~BSS_CONNECT_SET;
return TRUE;
}
BOOLEAN zd_IbssConnect(void)
{
struct zd1205_private *macp=g_dev->priv;
int i,j;
U8 Length;
BOOLEAN bBSSFound = FALSE;
MacAddr_t *pBssid;
BssInfo_t *pBssInfo;
void *reg = pdot11Obj->reg;
U32 tmpvalue;
//FPRINT("zd_IbssConnect");
#if defined(OFDM)
pdot11Obj->SetReg(reg, ZD_CWmin_CWmax, CW_NORMAL_SLOT);
// not to use short slot time
mCap &= ~BIT_10;
pdot11Obj->ConfigFlag &= ~SHORT_SLOT_TIME_SET;
if (mMacMode == PURE_G_MODE){
// not use protection mechanism
pdot11Obj->ConfigFlag &= ~ENABLE_PROTECTION_SET;
}
else if(mMacMode != PURE_A_MODE) {
// force use protection mechanism
pdot11Obj->ConfigFlag |= ENABLE_PROTECTION_SET;
}
#endif
// Recover the EIFS to 0x200.
// We need not use SleepResetDevice. In IBSS mode, we can easily
// get others traffic. (not less of Rx-Frame)
pdot11Obj->SetReg(reg, ZD_IFS_Value, 0x5200032);
if (mATIMWindow != 0){
// Do not set macp->PwrState = PSM, otherwise
// throughput with Cirrus card (in PS mode) will down.
//macp->PwrState = PSM;
// PwrMgt = 1
if(pdot11Obj->bDeviceInSleep)
{
printk("In SLLLLLLLLLLLLLLLLLLP @ %s\n", __FUNCTION__);
return FALSE;
}
tmpvalue = pdot11Obj->GetReg(reg, ZD_BCNInterval);
tmpvalue |= BIT_26;
pdot11Obj->SetReg(reg, ZD_BCNInterval, tmpvalue);
}
else{
//macp->PwrState = CAM;
// PwrMgt = 0;
if(pdot11Obj->bDeviceInSleep)
{
printk("In SLLLLLLLLLLLLLLLLLLP @ %s\n", __FUNCTION__);
return FALSE;
}
tmpvalue = pdot11Obj->GetReg(reg, ZD_BCNInterval);
tmpvalue &= ~BIT_26;
pdot11Obj->SetReg(reg, ZD_BCNInterval, tmpvalue);
}
mCap &= ~BIT_0;
mCap |= BIT_1;
mTimeBeforeAdhocRoaming = (jiffies + dot11MacAddress.mac[0] + 3) & 0x1F;
if (mBssCnt ){ // IBSS found
for (i=0; i<mBssCnt; i++){
Length = dot11DesiredSsid.buf[1]+2;
if (mBssInfo[i].cap & CAP_IBSS){
if (memcmp((U8 *)&dot11DesiredSsid, (U8 *)&mBssInfo[i].ssid, Length) == 0){
break;
}
}
}
if (i < mBssCnt){
bBSSFound = TRUE;
mBssIndex = i;
pBssInfo = &mBssInfo[mBssIndex];
mBssId.mac[0] = pBssInfo->bssid.mac[0];
mBssId.mac[1] = pBssInfo->bssid.mac[1];
mBssId.mac[2] = pBssInfo->bssid.mac[2];
mBssId.mac[3] = pBssInfo->bssid.mac[3];
mBssId.mac[4] = pBssInfo->bssid.mac[4];
mBssId.mac[5] = pBssInfo->bssid.mac[5];
//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]));
if(pBssInfo->apMode == PURE_A_AP)
ChangeMacMode(PURE_A_MODE, pBssInfo->Phpm.buf[2]);
else
ChangeMacMode(MIXED_MODE, pBssInfo->Phpm.buf[2]);
zd1205_SetRatesInfo(macp);
mMacMode = macp->cardSetting.MacMode;
mRfChannel = macp->cardSetting.Channel;
mPhpm.buf[0] = EID_DSPARMS;
mPhpm.buf[1] = 1;
mPhpm.buf[2] = mRfChannel;
printk("Ibss Join, MAC_MODE:%d, CHANNEL:%d\n", mMacMode,mRfChannel);
HW_SetRfChannel(pdot11Obj, mRfChannel, 1, mMacMode);
//FPRINT_V("mRfChannel", mRfChannel);
//update beacon interval
mBeaconPeriod = pBssInfo->bcnInterval; //MZCai
HW_UpdateBcnInterval(pdot11Obj, mBeaconPeriod);
//FPRINT_V("mBeaconPeriod", mBeaconPeriod);
//update supported rated
memcpy((U8 *)&mBrates, (U8 *)&pBssInfo->supRates, pBssInfo->supRates.buf[1]+2); //MZCAI
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) //MZCai
{
if(pBssInfo->extRates.buf[0] == EID_EXT_RATES)
{
//if(pdot11Obj->IsUSB2_0) //MZCAI
memcpy((U8 *)&mExtRates, (U8 *)&pBssInfo->extRates, pBssInfo->extRates.buf[1]+2); //MZCai
HW_SetSupportedRate(pdot11Obj, (U8 *)&mExtRates);
}
}
//zd1205_dump_data("mExtRates = ", (U8 *)&mExtRates, mExtRates.buf[1]+2);
#endif
//update ATIM Window
mATIMWindow = pBssInfo->IbssParms.buf[2]+(((U16)pBssInfo->IbssParms.buf[3]) << 8); //MZCai
memcpy((U8 *)&mIbssParms, (U8 *)&pBssInfo->IbssParms, pBssInfo->IbssParms.buf[1]+2); //MZCai
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;
}
}
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;
}
U32 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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -