📄 zdasocsvc.c
字号:
#ifndef __ZDASOCSVC_C__
#define __ZDASOCSVC_C__
#include "zd80211.h"
#include "zd1205.h"
#include "zdturbo_burst.h"
U8 AsocState = STE_ASOC_IDLE;
static MacAddr_t AsSta;
extern struct net_device *g_dev;
BOOLEAN Disasoc(Signal_t *signal)
{
FrmDesc_t *pfrmDesc;
Frame_t *rdu;
MacAddr_t Sta;
ReasonCode Rsn;
U8 vapId = 0;
//ZDEBUG("Disasoc");
//FPRINT("Disasoc");
pfrmDesc = signal->frmInfo.frmDesc;
rdu = pfrmDesc->mpdu;
memcpy((U8 *)&Sta, (U8 *)(addr2(rdu)), 6); // Get the address of the transmitter.
Rsn = (ReasonCode)(reason(rdu));
if (mBssType == INFRASTRUCTURE_BSS)
{// This frame should be come from the associated AP.
if ((!mAssoc) || (memcmp(&Sta, (U8*)&mBssId, 6) != 0))
{ //Not for this BSSID
//discard this packet
freeFdesc(pfrmDesc);
return TRUE;
}
else
{
freeFdesc(pfrmDesc);
UpdateStaStatus(&Sta, STATION_STATE_DIS_ASOC, vapId);
pdot11Obj->StatusNotify(STA_DISASSOCIATED, (U8 *)&Sta);
mAssoc = FALSE;
memset((U8 *)&mBssId, 0, 6);
printk(KERN_ERR "Rx Disasoc from AP(Rsn:%d),set DIS_CONNECT_SET\n",Rsn);
mRequestFlag |= DIS_CONNECT_SET;
return TRUE;
}
}
else if (mBssType == AP_BSS)
{
if (memcmp(addr1(rdu), (U8*)&mBssId, 6))
{ //Not for this BSSID
freeFdesc(pfrmDesc);
return TRUE;
}
UpdateStaStatus(&Sta, STATION_STATE_DIS_ASOC, vapId);
freeFdesc(pfrmDesc);
//here to handle disassoc ind.
pdot11Obj->StatusNotify(STA_DISASSOCIATED, (U8 *)&Sta);
return TRUE;
}
else
{
freeFdesc(pfrmDesc);
return TRUE;
}
}
BOOLEAN DisasocReq(Signal_t *signal)
{
FrmDesc_t *pfrmDesc;
MacAddr_t Sta;
ReasonCode Rsn = RC_UNSPEC_REASON;
U8 vapId = 0;
//ZDEBUG("DisasocReq");
//FPRINT("DisasocReq");
memcpy((U8 *)&Sta, (U8 *)&signal->frmInfo.Sta, 6);
Rsn = signal->frmInfo.rCode;
pdot11Obj->StatusNotify(STA_DISASSOCIATED, (U8 *)&Sta);
vapId = signal->vapId;
UpdateStaStatus(&Sta, STATION_STATE_DIS_ASOC, vapId);
pfrmDesc = allocFdesc();
if(!pfrmDesc){
sigEnque(pMgtQ, (signal));
return FALSE;
}
mkDisAssoc_DeAuthFrm(pfrmDesc, ST_DISASOC, &Sta, Rsn, vapId);
sendMgtFrame(signal, pfrmDesc);
if (mBssType == INFRASTRUCTURE_BSS){
if (memcmp((U8 *)&mBssId, (U8 *)&Sta, 6) == 0){ // my AP
mAssoc = FALSE;
memset((U8 *)&mBssId, 0, 6);
}
}
return FALSE;
}
BOOLEAN Re_Asociate(Signal_t *signal)
{
struct zd1205_private *macp=g_dev->priv;
Hash_t *pHash;
FrmDesc_t *pfrmDesc;
Frame_t *rdu;
MacAddr_t Sta;
U16 aid = 0;
StatusCode asStatus;
U8 lsInterval;
Element WPA;
Element asSsid;
Element asRates;
Element extRates;
U16 cap;
U8 ZydasMode = 0;
int i;
U8 tmpMaxRate = 0x02;
U8 MaxRate;
U16 notifyStatus = STA_ASOC_REQ;
U16 notifyStatus1 = STA_ASSOCIATED;
TypeSubtype type = ST_ASOC_RSP;
U8 Preamble = 0;
U8 HigestBasicRate = 0;
U8 vapId = 0;
U8 Len;
Element *pExtRate = NULL;
BOOLEAN bErpSta = TRUE;
pExtRate = &mExtRates;
ZDEBUG("Re_Asociate");
pfrmDesc = signal->frmInfo.frmDesc;
if (mBssType == INFRASTRUCTURE_BSS){
freeFdesc(pfrmDesc);
return TRUE;
} else if (mBssType == AP_BSS){
rdu = pfrmDesc->mpdu;
lsInterval = listenInt(pfrmDesc->mpdu);
//FPRINT_V("lsInterval", lsInterval);
cap = cap(rdu);
memcpy((U8 *)&Sta, (U8 *)addr2(rdu), 6);
if ((isGroup(addr2(rdu))) || (!getElem(rdu, EID_SSID, &asSsid,1))
|| (!getElem(rdu, EID_SUPRATES, &asRates,1))){
freeFdesc(pfrmDesc);
return TRUE;
}
if ((eLen(&asSsid) != eLen(&dot11DesiredSsid) ||
memcmp(&asSsid, &dot11DesiredSsid, eLen(&dot11DesiredSsid)+2) != 0)){
freeFdesc(pfrmDesc);
return TRUE;
}
//check capability
if (cap & CAP_SHORT_PREAMBLE){
if (mPreambleType == LONG_PREAMBLE){ //we are long preamble, and STA is short preamble capability
freeFdesc(pfrmDesc);
return TRUE;
}
else
Preamble = 1;
}
else {
Preamble = 0;
}
// Privacy not match
if (cap & CAP_PRIVACY){
if (!mPrivacyInvoked && macp->cardSetting.WPAIeLen==0){
//if (!mPrivacyInvoked){
freeFdesc(pfrmDesc);
return TRUE;
}
}
else {
if (mPrivacyInvoked){
freeFdesc(pfrmDesc);
return TRUE;
}
}
//check short slot time
#if 0//defined(OFDM)
if (mMacMode != PURE_B_MODE){
if (cap & CAP_SHORT_SLOT_TIME){
if (!(mCap & CAP_SHORT_SLOT_TIME)){
FPRINT("CAP_SHORT_SLOT_TIME not match!!");
freeFdesc(pfrmDesc);
return TRUE;
}
}
else {
if (mCap & CAP_SHORT_SLOT_TIME){
asStatus = (StatusCode)SC_UNSUP_SHORT_SLOT_TIME;
goto check_failed;
}
}
}
FPRINT_V("cap", cap);
#endif
//check supported rates
Len = eLen(&asRates);
for (i=0; i<Len; i++){
if ( (asRates.buf[2+i] & 0x7f) > tmpMaxRate ){
tmpMaxRate = (asRates.buf[2+i] & 0x7f);
if (asRates.buf[2+i] & 0x80)
HigestBasicRate = asRates.buf[2+i];
}
if (((asRates.buf[2+i] & 0x7f) == 0x21) && (!(cap & CAP_PBCC_ENABLE))){ //Zydas 16.5M
ZydasMode = 1;
mZyDasModeClient = TRUE;
//FPRINT("ZydasMode");
}
}
if (!getElem(rdu, EID_EXT_RATES, &extRates,1)){
void *reg = pdot11Obj->reg;
// 11b STA
//FPRINT("11b STA");
if (mMacMode == PURE_G_MODE){ // don't support b only sta
MaxRate = RateConvert((tmpMaxRate & 0x7f));
//MaxBasicRate = RateConvert((HigestBasicRate & 0x7f));
if (MaxRate < pdot11Obj->BasicRate){
//FPRINT_V("MaxRate", MaxRate);
//FPRINT_V("pdot11Obj->BasicRate", pdot11Obj->BasicRate);
asStatus = SC_UNSUP_RATES;
goto check_failed;
}
}
bErpSta = FALSE;
pdot11Obj->ConfigFlag |= NON_ERP_PRESENT_SET;
pdot11Obj->ConfigFlag &= ~SHORT_SLOT_TIME_SET;
mCap &= ~CAP_SHORT_SLOT_TIME;
pdot11Obj->SetReg(reg, ZD_CWmin_CWmax, CW_NORMAL_SLOT);
if(PURE_A_MODE == mMacMode) {
pdot11Obj->ConfigFlag &= ~NON_ERP_PRESENT_SET;
pdot11Obj->ConfigFlag |= SHORT_SLOT_TIME_SET;
mCap |= CAP_SHORT_SLOT_TIME;
pdot11Obj->SetReg(reg, ZD_CWmin_CWmax, CW_SHORT_SLOT);
}
}
else { //11g STA
if (mMacMode != PURE_B_MODE && mMacMode != PURE_A_MODE){
Len = eLen(&extRates);
for (i=0; i<Len; i++){
if ( (extRates.buf[2+i] & 0x7f) > tmpMaxRate ){
tmpMaxRate = (extRates.buf[2+i] & 0x7f);
}
}
bErpSta = TRUE;
//FPRINT("11g STA");
}
else {
FPRINT("Pure B mode don't support G sta");
asStatus = SC_UNSUP_RATES;
goto check_failed;
}
}
MaxRate = RateConvert((tmpMaxRate & 0x7f));
if (MaxRate > mMaxTxRate)
MaxRate = mMaxTxRate;
if (signal->id == SIG_REASSOC)
notifyStatus = STA_REASOC_REQ;
if (!pdot11Obj->StatusNotify(notifyStatus, (U8 *)&Sta))
{ //Accept it
//if ((mDynKeyMode == DYN_KEY_TKIP) || (mDynKeyMode == DYN_KEY_AES)){
if (macp->cardSetting.WPAIeLen)
{
if (getElem(rdu, EID_WPA, &WPA,1)||getElem(rdu,EID_RSN,&WPA,1))
{
//zd1205_OctetDump("AssocRequest = ", asRdu->body, asRdu->bodyLen);
//zd1205_OctetDump("AssocRequest WPA_IE = ", &WPA.buf[2], WPA.buf[1]);
if (pdot11Obj->AssocRequest)
{
if (pdot11Obj->AssocRequest((U8 *)&Sta, rdu->body, rdu->bodyLen))
{ //reject
asStatus = SC_UNSPEC_FAILURE;
goto check_failed;
//we need reason code here
}
}
}
else
{
asStatus = SC_UNSPEC_FAILURE;
goto wpa_check_failed;
}
}
//wpa_check_ok:
if (!UpdateStaStatus(&Sta, STATION_STATE_ASOC, vapId)){
asStatus = SC_AP_FULL;
}
else{
AssocInfoUpdate(&Sta, MaxRate, lsInterval, ZydasMode, Preamble, bErpSta, 0,0,1,vapId);
aid = AIdLookup(&Sta);
printk(KERN_DEBUG "Re_Asoc: aid=%d\n", aid);
pHash = HashSearch(&Sta);
if (pHash != NULL)
{
if (!pHash->AlreadyIn)
{
pHash->AlreadyIn=1;
mCurrConnUser++;
if (bErpSta == FALSE)
{
printk(KERN_DEBUG "Increment mNumBOnlySta\n");
mNumBOnlySta++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -