⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zdasocsvc.c

📁 ZYDAS zd1211b driver for Linux2.4
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifndef __ZDASOCSVC_C__#define __ZDASOCSVC_C__#include "zd80211.h"#include "zd1205.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))                                || (!getElem(rdu, EID_SUPRATES, &asRates))) {                        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)) {                        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)||getElem(rdu,EID_RSN,&WPA)) {                                        //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, 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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -