1 #ifndef __ZDASOCSVC_C__
2 #define __ZDASOCSVC_C__
6 #include "zdturbo_burst.h"
8 U8 AsocState
= STE_ASOC_IDLE
;
9 static MacAddr_t AsSta
;
10 extern struct net_device
*g_dev
;
13 BOOLEAN
Disasoc(Signal_t
*signal
)
23 pfrmDesc
= signal
->frmInfo
.frmDesc
;
25 memcpy((U8
*)&Sta
, (U8
*)(addr2(rdu
)), 6); // Get the address of the transmitter.
26 Rsn
= (ReasonCode
)(reason(rdu
));
28 if (mBssType
== INFRASTRUCTURE_BSS
)
29 {// This frame should be come from the associated AP.
30 if ((!mAssoc
) || (memcmp(&Sta
, (U8
*)&mBssId
, 6) != 0))
31 { //Not for this BSSID
39 UpdateStaStatus(&Sta
, STATION_STATE_DIS_ASOC
, vapId
);
40 pdot11Obj
->StatusNotify(STA_DISASSOCIATED
, (U8
*)&Sta
);
42 memset((U8
*)&mBssId
, 0, 6);
43 printk(KERN_ERR
"Rx Disasoc from AP(Rsn:%d),set DIS_CONNECT_SET\n",Rsn
);
44 mRequestFlag
|= DIS_CONNECT_SET
;
48 else if (mBssType
== AP_BSS
)
50 if (memcmp(addr1(rdu
), (U8
*)&mBssId
, 6))
51 { //Not for this BSSID
55 UpdateStaStatus(&Sta
, STATION_STATE_DIS_ASOC
, vapId
);
57 //here to handle disassoc ind.
58 pdot11Obj
->StatusNotify(STA_DISASSOCIATED
, (U8
*)&Sta
);
69 BOOLEAN
DisasocReq(Signal_t
*signal
)
73 ReasonCode Rsn
= RC_UNSPEC_REASON
;
76 //ZDEBUG("DisasocReq");
77 //FPRINT("DisasocReq");
79 memcpy((U8
*)&Sta
, (U8
*)&signal
->frmInfo
.Sta
, 6);
80 Rsn
= signal
->frmInfo
.rCode
;
81 pdot11Obj
->StatusNotify(STA_DISASSOCIATED
, (U8
*)&Sta
);
83 vapId
= signal
->vapId
;
84 UpdateStaStatus(&Sta
, STATION_STATE_DIS_ASOC
, vapId
);
86 pfrmDesc
= allocFdesc();
88 sigEnque(pMgtQ
, (signal
));
92 mkDisAssoc_DeAuthFrm(pfrmDesc
, ST_DISASOC
, &Sta
, Rsn
, vapId
);
93 sendMgtFrame(signal
, pfrmDesc
);
95 if (mBssType
== INFRASTRUCTURE_BSS
){
96 if (memcmp((U8
*)&mBssId
, (U8
*)&Sta
, 6) == 0){ // my AP
98 memset((U8
*)&mBssId
, 0, 6);
106 BOOLEAN
Re_Asociate(Signal_t
*signal
)
108 struct zd1205_private
*macp
=g_dev
->priv
;
123 U8 tmpMaxRate
= 0x02;
125 U16 notifyStatus
= STA_ASOC_REQ
;
126 U16 notifyStatus1
= STA_ASSOCIATED
;
127 TypeSubtype type
= ST_ASOC_RSP
;
129 U8 HigestBasicRate
= 0;
132 Element
*pExtRate
= NULL
;
134 BOOLEAN bErpSta
= TRUE
;
135 pExtRate
= &mExtRates
;
137 ZDEBUG("Re_Asociate");
138 pfrmDesc
= signal
->frmInfo
.frmDesc
;
140 if (mBssType
== INFRASTRUCTURE_BSS
){
143 } else if (mBssType
== AP_BSS
){
144 rdu
= pfrmDesc
->mpdu
;
145 lsInterval
= listenInt(pfrmDesc
->mpdu
);
146 //FPRINT_V("lsInterval", lsInterval);
148 memcpy((U8
*)&Sta
, (U8
*)addr2(rdu
), 6);
150 if ((isGroup(addr2(rdu
))) || (!getElem(rdu
, EID_SSID
, &asSsid
,1))
151 || (!getElem(rdu
, EID_SUPRATES
, &asRates
,1))){
156 if ((eLen(&asSsid
) != eLen(&dot11DesiredSsid
) ||
157 memcmp(&asSsid
, &dot11DesiredSsid
, eLen(&dot11DesiredSsid
)+2) != 0)){
163 if (cap
& CAP_SHORT_PREAMBLE
){
164 if (mPreambleType
== LONG_PREAMBLE
){ //we are long preamble, and STA is short preamble capability
177 if (cap
& CAP_PRIVACY
){
178 if (!mPrivacyInvoked
&& macp
->cardSetting
.WPAIeLen
==0){
179 //if (!mPrivacyInvoked){
185 if (mPrivacyInvoked
){
191 //check short slot time
193 if (mMacMode
!= PURE_B_MODE
){
194 if (cap
& CAP_SHORT_SLOT_TIME
){
195 if (!(mCap
& CAP_SHORT_SLOT_TIME
)){
196 FPRINT("CAP_SHORT_SLOT_TIME not match!!");
202 if (mCap
& CAP_SHORT_SLOT_TIME
){
203 asStatus
= (StatusCode
)SC_UNSUP_SHORT_SLOT_TIME
;
209 FPRINT_V("cap", cap
);
213 //check supported rates
214 Len
= eLen(&asRates
);
215 for (i
=0; i
<Len
; i
++){
216 if ( (asRates
.buf
[2+i
] & 0x7f) > tmpMaxRate
){
217 tmpMaxRate
= (asRates
.buf
[2+i
] & 0x7f);
218 if (asRates
.buf
[2+i
] & 0x80)
219 HigestBasicRate
= asRates
.buf
[2+i
];
222 if (((asRates
.buf
[2+i
] & 0x7f) == 0x21) && (!(cap
& CAP_PBCC_ENABLE
))){ //Zydas 16.5M
224 mZyDasModeClient
= TRUE
;
225 //FPRINT("ZydasMode");
229 if (!getElem(rdu
, EID_EXT_RATES
, &extRates
,1)){
230 void *reg
= pdot11Obj
->reg
;
233 if (mMacMode
== PURE_G_MODE
){ // don't support b only sta
234 MaxRate
= RateConvert((tmpMaxRate
& 0x7f));
235 //MaxBasicRate = RateConvert((HigestBasicRate & 0x7f));
236 if (MaxRate
< pdot11Obj
->BasicRate
){
237 //FPRINT_V("MaxRate", MaxRate);
238 //FPRINT_V("pdot11Obj->BasicRate", pdot11Obj->BasicRate);
239 asStatus
= SC_UNSUP_RATES
;
244 pdot11Obj
->ConfigFlag
|= NON_ERP_PRESENT_SET
;
245 pdot11Obj
->ConfigFlag
&= ~SHORT_SLOT_TIME_SET
;
246 mCap
&= ~CAP_SHORT_SLOT_TIME
;
247 pdot11Obj
->SetReg(reg
, ZD_CWmin_CWmax
, CW_NORMAL_SLOT
);
248 if(PURE_A_MODE
== mMacMode
) {
249 pdot11Obj
->ConfigFlag
&= ~NON_ERP_PRESENT_SET
;
250 pdot11Obj
->ConfigFlag
|= SHORT_SLOT_TIME_SET
;
251 mCap
|= CAP_SHORT_SLOT_TIME
;
252 pdot11Obj
->SetReg(reg
, ZD_CWmin_CWmax
, CW_SHORT_SLOT
);
257 if (mMacMode
!= PURE_B_MODE
&& mMacMode
!= PURE_A_MODE
){
259 Len
= eLen(&extRates
);
260 for (i
=0; i
<Len
; i
++){
261 if ( (extRates
.buf
[2+i
] & 0x7f) > tmpMaxRate
){
262 tmpMaxRate
= (extRates
.buf
[2+i
] & 0x7f);
269 FPRINT("Pure B mode don't support G sta");
270 asStatus
= SC_UNSUP_RATES
;
275 MaxRate
= RateConvert((tmpMaxRate
& 0x7f));
277 if (MaxRate
> mMaxTxRate
)
278 MaxRate
= mMaxTxRate
;
280 if (signal
->id
== SIG_REASSOC
)
281 notifyStatus
= STA_REASOC_REQ
;
283 if (!pdot11Obj
->StatusNotify(notifyStatus
, (U8
*)&Sta
))
285 //if ((mDynKeyMode == DYN_KEY_TKIP) || (mDynKeyMode == DYN_KEY_AES)){
286 if (macp
->cardSetting
.WPAIeLen
)
288 if (getElem(rdu
, EID_WPA
, &WPA
,1)||getElem(rdu
,EID_RSN
,&WPA
,1))
290 //zd1205_OctetDump("AssocRequest = ", asRdu->body, asRdu->bodyLen);
291 //zd1205_OctetDump("AssocRequest WPA_IE = ", &WPA.buf[2], WPA.buf[1]);
292 if (pdot11Obj
->AssocRequest
)
294 if (pdot11Obj
->AssocRequest((U8
*)&Sta
, rdu
->body
, rdu
->bodyLen
))
296 asStatus
= SC_UNSPEC_FAILURE
;
298 //we need reason code here
304 asStatus
= SC_UNSPEC_FAILURE
;
305 goto wpa_check_failed
;
310 if (!UpdateStaStatus(&Sta
, STATION_STATE_ASOC
, vapId
)){
311 asStatus
= SC_AP_FULL
;
314 AssocInfoUpdate(&Sta
, MaxRate
, lsInterval
, ZydasMode
, Preamble
, bErpSta
, 0,0,1,vapId
);
315 aid
= AIdLookup(&Sta
);
316 printk(KERN_DEBUG
"Re_Asoc: aid=%d\n", aid
);
317 pHash
= HashSearch(&Sta
);
320 if (!pHash
->AlreadyIn
)
324 if (bErpSta
== FALSE
)
326 printk(KERN_DEBUG
"Increment mNumBOnlySta\n");
332 asStatus
= SC_SUCCESSFUL
;
333 if (signal
->id
== SIG_REASSOC
)
334 notifyStatus1
= STA_REASSOCIATED
;
335 pdot11Obj
->StatusNotify(notifyStatus1
, (U8
*)&Sta
);
337 if (mMacMode
!= PURE_B_MODE
&& mMacMode
!= PURE_A_MODE
){
338 if (pdot11Obj
->ConfigFlag
& NON_ERP_PRESENT_SET
){
340 void *reg
= pdot11Obj
->reg
;
342 // force enabled protection mode for debug
343 mErp
.buf
[2] |= (NON_ERP_PRESENT
| USE_PROTECTION
);
344 tmpValue
= pdot11Obj
->GetReg(reg
, ZD_RTS_CTS_Rate
);
345 tmpValue
&= ~CTS_MOD_TYPE_OFDM
;
346 tmpValue
|= CTS_RATE_11M
;
347 pdot11Obj
->SetReg(reg
, ZD_RTS_CTS_Rate
, tmpValue
);
349 if (Preamble
== 0){ //long preamble
350 mErp
.buf
[2] |= BARKER_PREAMBLE
;
351 tmpValue
= pdot11Obj
->GetReg(reg
, ZD_RTS_CTS_Rate
);
352 tmpValue
&= ~NON_BARKER_PMB_SET
;
353 tmpValue
|= CTS_RATE_11M
;
354 pdot11Obj
->SetReg(reg
, ZD_RTS_CTS_Rate
, tmpValue
);
355 //FPRINT("Enable Barker Preamble");
357 pdot11Obj
->ConfigFlag
|= ENABLE_PROTECTION_SET
;
358 //FPRINT("Enable Protection Mode");
366 asStatus
= SC_UNSPEC_FAILURE
;
372 FPRINT_V("Aid", aid
);
373 FPRINT_V("MaxRate", MaxRate
);
377 if (signal
->id
== SIG_REASSOC
)
378 type
= ST_REASOC_RSP
;
379 mkRe_AsocRspFrm(pfrmDesc
, type
, &Sta
, mCap
, asStatus
, aid
, &mBrates
, pExtRate
, vapId
);
380 sendMgtFrame(signal
, pfrmDesc
);
390 BOOLEAN
Re_AsocReq(Signal_t
*signal
)
394 TypeSubtype subType
= ST_ASOC_REQ
;
395 Element
*pExtRate
= NULL
;
397 FPRINT("Re_AsocReq");
399 pfrmDesc
= allocFdesc();
401 sigEnque(pMgtQ
, (signal
));
406 if (signal
->id
== SIG_REASSOC_REQ
){
407 subType
= ST_REASOC_REQ
;
410 pExtRate
= &mExtRates
;
412 memcpy((U8
*)&AsSta
, (U8
*)&mBssId
, 6);
414 mkRe_AsocReqFrm(pfrmDesc
, subType
, &mBssId
, mCap
, mListenInterval
,
415 &mOldAP
, &mSsid
, &mBrates
, pExtRate
, &mWPAIe
, vapId
);
417 pdot11Obj
->StartTimer(ASOC_TIMEOUT
, DO_ASOC
);
418 AsocState
= STE_WAIT_ASOC_RSP
;
419 return sendMgtFrame(signal
, pfrmDesc
);
422 BOOLEAN
Re_AsocRsp(Signal_t
*signal
)
425 BssInfo_t
*asocBss
= NULL
;
426 U8 Turbo_AMSDU
= FALSE
, Turbo_BURST
= FALSE
, Turbo_AMSDU_LEN
= 1;
434 //ZDEBUG("Re_AsocRsp");
435 FPRINT("Re_AsocRsp");
437 pfrmDesc
= signal
->frmInfo
.frmDesc
;
438 rdu
= pfrmDesc
->mpdu
;
440 memcpy((U8
*)&Sta
, (U8
*)addr2(rdu
), 6);
441 if (memcmp(&AsSta
, &Sta
, 6) != 0){
442 //FPRINT("Not for my Assoc AP");
446 pdot11Obj
->StopTimer(DO_ASOC
);
447 AsocState
= STE_ASOC_IDLE
;
450 status
= status(rdu
);
451 if (status
== SC_SUCCESSFUL
){
453 U8 tmpMaxRate
= 0x02;
457 BOOLEAN bErpSta
= FALSE
;
459 U8 HigestBasicRate
= 0;
461 UpdateStaStatus(&Sta
, STATION_STATE_ASOC
, vapId
);
462 pHash
= HashSearch(&Sta
);
465 if (!pHash
->AlreadyIn
)
475 if (mAPCap
& CAP_SHORT_PREAMBLE
){
482 mAid
= (aid(rdu
) & 0x3FFF);
483 getElem(rdu
, EID_SUPRATES
, &mAPBrates
,1);
484 //zd1205_dump_data("mAPBrates", &mAPBrates.buf[2], mAPBrates.buf[1]);
486 if (getElem(rdu
, EID_EXT_RATES
, &mAPErates
,1)){
487 //zd1205_dump_data("mAPErates", &mAPErates.buf[2], mAPErates.buf[1]);
490 memcpy((U8
*)&mBssId
, (U8
*)addr2(rdu
), 6);
493 //update supported rates
494 HW_SetSupportedRate(pdot11Obj
, (U8
*)&mAPBrates
);
495 HW_SetSupportedRate(pdot11Obj
, (U8
*)&mAPErates
);
497 Len
= eLen(&mAPBrates
);
498 for (i
=0; i
<Len
; i
++){
499 if ((mAPBrates
.buf
[2+i
] & 0x7f) > tmpMaxRate
){
500 tmpMaxRate
= (mAPBrates
.buf
[2+i
] & 0x7f);
501 if (mAPBrates
.buf
[2+i
] & 0x80)
502 HigestBasicRate
= mAPBrates
.buf
[2+i
];
505 if (((mAPBrates
.buf
[2+i
] & 0x7f) == 0x21) && (!(mAPCap
& CAP_PBCC_ENABLE
))){ //Zydas 16.5M
511 Len
= eLen(&mAPErates
);
512 for (i
=0; i
<Len
; i
++){
513 if ((mAPErates
.buf
[2+i
] & 0x7f) > tmpMaxRate
){
514 tmpMaxRate
= (mAPErates
.buf
[2+i
] & 0x7f);
515 if (mAPErates
.buf
[2+i
] & 0x80)
516 HigestBasicRate
= mAPErates
.buf
[2+i
];
520 //FPRINT_V("tmpMaxRate", tmpMaxRate);
521 //FPRINT_V("mMaxTxRate", mMaxTxRate);
522 MaxRate
= RateConvert((tmpMaxRate
& 0x7f));
523 //FPRINT_V("MaxRate", MaxRate);
524 if (MaxRate
> mMaxTxRate
)
525 MaxRate
= mMaxTxRate
;
526 memset(mAPBrates
.buf
, 0, sizeof(Element
));
527 memset(mAPErates
.buf
, 0, sizeof(Element
));
528 #if ZDCONF_LP_SUPPORT == 1
529 asocBss
= zd1212_bssid_to_BssInfo(mBssId
.mac
);
532 if(asocBss
->zdIE_BURST
.buf
[0] == EID_ZYDAS
)
534 if(asocBss
->zdIE_BURST
.buf
[8] & BIT_7
)
536 Turbo_BURST
= Turbo_BURST
&& pdot11Obj
->BURST_MODE
;
539 if(asocBss
->zdIE_AMSDU
.buf
[0] == EID_ZYDAS
)
541 if(asocBss
->zdIE_AMSDU
.buf
[8] & BIT_0
)
544 Turbo_AMSDU_LEN
= asocBss
->zdIE_AMSDU
.buf
[8] & BIT_1
;
546 Turbo_AMSDU
= Turbo_AMSDU
&& pdot11Obj
->LP_MODE
;
551 printk("zd1212_bssid_to_BssInfo is NULL in %s, Something wrong\n", __FUNCTION__
);
554 AssocInfoUpdate(&mBssId
, MaxRate
, mAid
, ZydasMode
, Preamble
, bErpSta
, Turbo_BURST
, Turbo_AMSDU
, Turbo_AMSDU_LEN
,vapId
);
555 #elif ZDCONF_LP_SUPPORT == 0
556 AssocInfoUpdate(&mBssId
, MaxRate
, mAid
, ZydasMode
, Preamble
, bErpSta
,0,0,0,vapId
);
559 pdot11Obj
->StatusNotify(STA_ASSOCIATED
, (U8
*)&mBssId
);
560 pdot11Obj
->Aid
= mAid
;
563 FPRINT_V("Aid", mAid
);
564 FPRINT_V("MaxRate", MaxRate
);
566 FPRINT("Asoc Failed!!!");
567 FPRINT_V("Status Code", status
);
576 BOOLEAN
AsocTimeOut(Signal_t
*signal
)
579 FPRINT("AsocTimeOut");
581 if (AsocState
== STE_WAIT_ASOC_RSP
){
582 AsocState
= STE_ASOC_IDLE
;
583 UpdateStaStatus(&mBssId
, STATION_STATE_DIS_ASOC
, vapId
);
586 mRequestFlag
|= CONNECT_TOUT_SET
;
591 BOOLEAN
AsocEntry(Signal_t
*signal
)
595 if (AsocState
== STE_ASOC_IDLE
){
597 case SIG_DIASSOC_REQ
:
598 return DisasocReq(signal
);
601 return Disasoc(signal
);
605 return Re_Asociate(signal
);
608 case SIG_REASSOC_REQ
:
609 if(memcmp(mBssId
.mac
, zeroMacAddress
, ETH_ALEN
) == 0)
611 return Re_AsocReq(signal
);
616 } else if (AsocState
== STE_WAIT_ASOC_RSP
){
618 case SIG_DIASSOC_REQ
:
619 return DisasocReq(signal
);
622 return Disasoc(signal
);
626 return Re_Asociate(signal
);
629 case SIG_REASSOC_REQ
:
630 if(memcmp(mBssId
.mac
, zeroMacAddress
, ETH_ALEN
) == 0)
632 return Re_AsocReq(signal
);
635 case SIG_REASSOC_RSP
:
636 return Re_AsocRsp(signal
);
640 return AsocTimeOut(signal
);
649 pfrmDesc
= signal
->frmInfo
.frmDesc
;