rxtx.c 124 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260
  1. /*
  2. * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
  3. * All rights reserved.
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License along
  16. * with this program; if not, write to the Free Software Foundation, Inc.,
  17. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  18. *
  19. * File: rxtx.c
  20. *
  21. * Purpose: handle WMAC/802.3/802.11 rx & tx functions
  22. *
  23. * Author: Lyndon Chen
  24. *
  25. * Date: May 20, 2003
  26. *
  27. * Functions:
  28. * s_vGenerateTxParameter - Generate tx dma required parameter.
  29. * s_vGenerateMACHeader - Translate 802.3 to 802.11 header
  30. * csBeacon_xmit - beacon tx function
  31. * csMgmt_xmit - management tx function
  32. * s_uGetDataDuration - get tx data required duration
  33. * s_uFillDataHead- fulfill tx data duration header
  34. * s_uGetRTSCTSDuration- get rtx/cts required duration
  35. * s_uGetRTSCTSRsvTime- get rts/cts reserved time
  36. * s_uGetTxRsvTime- get frame reserved time
  37. * s_vFillCTSHead- fulfill CTS ctl header
  38. * s_vFillFragParameter- Set fragment ctl parameter.
  39. * s_vFillRTSHead- fulfill RTS ctl header
  40. * s_vFillTxKey- fulfill tx encrypt key
  41. * s_vSWencryption- Software encrypt header
  42. * vDMA0_tx_80211- tx 802.11 frame via dma0
  43. * vGenerateFIFOHeader- Generate tx FIFO ctl header
  44. *
  45. * Revision History:
  46. *
  47. */
  48. #include "device.h"
  49. #include "rxtx.h"
  50. #include "tether.h"
  51. #include "card.h"
  52. #include "bssdb.h"
  53. #include "mac.h"
  54. #include "baseband.h"
  55. #include "michael.h"
  56. #include "tkip.h"
  57. #include "tcrc.h"
  58. #include "wctl.h"
  59. #include "hostap.h"
  60. #include "rf.h"
  61. #include "datarate.h"
  62. #include "usbpipe.h"
  63. #include "iocmd.h"
  64. /*--------------------- Static Definitions -------------------------*/
  65. /*--------------------- Static Classes ----------------------------*/
  66. /*--------------------- Static Variables --------------------------*/
  67. static int msglevel = MSG_LEVEL_INFO;
  68. /*--------------------- Static Functions --------------------------*/
  69. /*--------------------- Static Definitions -------------------------*/
  70. #define CRITICAL_PACKET_LEN 256 // if packet size < 256 -> in-direct send
  71. // packet size >= 256 -> direct send
  72. const WORD wTimeStampOff[2][MAX_RATE] = {
  73. {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble
  74. {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble
  75. };
  76. const WORD wFB_Opt0[2][5] = {
  77. {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0
  78. {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1
  79. };
  80. const WORD wFB_Opt1[2][5] = {
  81. {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0
  82. {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1
  83. };
  84. #define RTSDUR_BB 0
  85. #define RTSDUR_BA 1
  86. #define RTSDUR_AA 2
  87. #define CTSDUR_BA 3
  88. #define RTSDUR_BA_F0 4
  89. #define RTSDUR_AA_F0 5
  90. #define RTSDUR_BA_F1 6
  91. #define RTSDUR_AA_F1 7
  92. #define CTSDUR_BA_F0 8
  93. #define CTSDUR_BA_F1 9
  94. #define DATADUR_B 10
  95. #define DATADUR_A 11
  96. #define DATADUR_A_F0 12
  97. #define DATADUR_A_F1 13
  98. /*--------------------- Static Functions --------------------------*/
  99. static
  100. void
  101. s_vSaveTxPktInfo(
  102. PSDevice pDevice,
  103. BYTE byPktNum,
  104. PBYTE pbyDestAddr,
  105. WORD wPktLength,
  106. WORD wFIFOCtl
  107. );
  108. static
  109. void *
  110. s_vGetFreeContext(
  111. PSDevice pDevice
  112. );
  113. static
  114. void
  115. s_vGenerateTxParameter(
  116. PSDevice pDevice,
  117. BYTE byPktType,
  118. WORD wCurrentRate,
  119. void *pTxBufHead,
  120. void *pvRrvTime,
  121. void *pvRTS,
  122. void *pvCTS,
  123. unsigned int cbFrameSize,
  124. BOOL bNeedACK,
  125. unsigned int uDMAIdx,
  126. PSEthernetHeader psEthHeader
  127. );
  128. static unsigned int s_uFillDataHead(
  129. PSDevice pDevice,
  130. BYTE byPktType,
  131. WORD wCurrentRate,
  132. void *pTxDataHead,
  133. unsigned int cbFrameLength,
  134. unsigned int uDMAIdx,
  135. BOOL bNeedAck,
  136. unsigned int uFragIdx,
  137. unsigned int cbLastFragmentSize,
  138. unsigned int uMACfragNum,
  139. BYTE byFBOption
  140. );
  141. static
  142. void
  143. s_vGenerateMACHeader (
  144. PSDevice pDevice,
  145. PBYTE pbyBufferAddr,
  146. WORD wDuration,
  147. PSEthernetHeader psEthHeader,
  148. BOOL bNeedEncrypt,
  149. WORD wFragType,
  150. unsigned int uDMAIdx,
  151. unsigned int uFragIdx
  152. );
  153. static
  154. void
  155. s_vFillTxKey(
  156. PSDevice pDevice,
  157. PBYTE pbyBuf,
  158. PBYTE pbyIVHead,
  159. PSKeyItem pTransmitKey,
  160. PBYTE pbyHdrBuf,
  161. WORD wPayloadLen,
  162. PBYTE pMICHDR
  163. );
  164. static
  165. void
  166. s_vSWencryption (
  167. PSDevice pDevice,
  168. PSKeyItem pTransmitKey,
  169. PBYTE pbyPayloadHead,
  170. WORD wPayloadSize
  171. );
  172. static unsigned int s_uGetTxRsvTime(
  173. PSDevice pDevice,
  174. BYTE byPktType,
  175. unsigned int cbFrameLength,
  176. WORD wRate,
  177. BOOL bNeedAck
  178. );
  179. static unsigned int s_uGetRTSCTSRsvTime(
  180. PSDevice pDevice,
  181. BYTE byRTSRsvType,
  182. BYTE byPktType,
  183. unsigned int cbFrameLength,
  184. WORD wCurrentRate
  185. );
  186. static
  187. void
  188. s_vFillCTSHead (
  189. PSDevice pDevice,
  190. unsigned int uDMAIdx,
  191. BYTE byPktType,
  192. void *pvCTS,
  193. unsigned int cbFrameLength,
  194. BOOL bNeedAck,
  195. BOOL bDisCRC,
  196. WORD wCurrentRate,
  197. BYTE byFBOption
  198. );
  199. static
  200. void
  201. s_vFillRTSHead(
  202. PSDevice pDevice,
  203. BYTE byPktType,
  204. void *pvRTS,
  205. unsigned int cbFrameLength,
  206. BOOL bNeedAck,
  207. BOOL bDisCRC,
  208. PSEthernetHeader psEthHeader,
  209. WORD wCurrentRate,
  210. BYTE byFBOption
  211. );
  212. static unsigned int s_uGetDataDuration(
  213. PSDevice pDevice,
  214. BYTE byDurType,
  215. unsigned int cbFrameLength,
  216. BYTE byPktType,
  217. WORD wRate,
  218. BOOL bNeedAck,
  219. unsigned int uFragIdx,
  220. unsigned int cbLastFragmentSize,
  221. unsigned int uMACfragNum,
  222. BYTE byFBOption
  223. );
  224. static
  225. unsigned int
  226. s_uGetRTSCTSDuration (
  227. PSDevice pDevice,
  228. BYTE byDurType,
  229. unsigned int cbFrameLength,
  230. BYTE byPktType,
  231. WORD wRate,
  232. BOOL bNeedAck,
  233. BYTE byFBOption
  234. );
  235. /*--------------------- Export Variables --------------------------*/
  236. static
  237. void *
  238. s_vGetFreeContext(
  239. PSDevice pDevice
  240. )
  241. {
  242. PUSB_SEND_CONTEXT pContext = NULL;
  243. PUSB_SEND_CONTEXT pReturnContext = NULL;
  244. unsigned int ii;
  245. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GetFreeContext()\n");
  246. for (ii = 0; ii < pDevice->cbTD; ii++) {
  247. pContext = pDevice->apTD[ii];
  248. if (pContext->bBoolInUse == FALSE) {
  249. pContext->bBoolInUse = TRUE;
  250. pReturnContext = pContext;
  251. break;
  252. }
  253. }
  254. if ( ii == pDevice->cbTD ) {
  255. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Free Tx Context\n");
  256. }
  257. return (void *) pReturnContext;
  258. }
  259. static
  260. void
  261. s_vSaveTxPktInfo(PSDevice pDevice, BYTE byPktNum, PBYTE pbyDestAddr, WORD wPktLength, WORD wFIFOCtl)
  262. {
  263. PSStatCounter pStatistic=&(pDevice->scStatistic);
  264. if (is_broadcast_ether_addr(pbyDestAddr))
  265. pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_BROAD;
  266. else if (is_multicast_ether_addr(pbyDestAddr))
  267. pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_MULTI;
  268. else
  269. pStatistic->abyTxPktInfo[byPktNum].byBroadMultiUni = TX_PKT_UNI;
  270. pStatistic->abyTxPktInfo[byPktNum].wLength = wPktLength;
  271. pStatistic->abyTxPktInfo[byPktNum].wFIFOCtl = wFIFOCtl;
  272. memcpy(pStatistic->abyTxPktInfo[byPktNum].abyDestAddr,
  273. pbyDestAddr,
  274. ETH_ALEN);
  275. }
  276. static
  277. void
  278. s_vFillTxKey (
  279. PSDevice pDevice,
  280. PBYTE pbyBuf,
  281. PBYTE pbyIVHead,
  282. PSKeyItem pTransmitKey,
  283. PBYTE pbyHdrBuf,
  284. WORD wPayloadLen,
  285. PBYTE pMICHDR
  286. )
  287. {
  288. PDWORD pdwIV = (PDWORD) pbyIVHead;
  289. PDWORD pdwExtIV = (PDWORD) ((PBYTE)pbyIVHead+4);
  290. WORD wValue;
  291. PS802_11Header pMACHeader = (PS802_11Header)pbyHdrBuf;
  292. DWORD dwRevIVCounter;
  293. //Fill TXKEY
  294. if (pTransmitKey == NULL)
  295. return;
  296. dwRevIVCounter = cpu_to_le32(pDevice->dwIVCounter);
  297. *pdwIV = pDevice->dwIVCounter;
  298. pDevice->byKeyIndex = pTransmitKey->dwKeyIndex & 0xf;
  299. if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
  300. if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN ){
  301. memcpy(pDevice->abyPRNG, (PBYTE)&(dwRevIVCounter), 3);
  302. memcpy(pDevice->abyPRNG+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
  303. } else {
  304. memcpy(pbyBuf, (PBYTE)&(dwRevIVCounter), 3);
  305. memcpy(pbyBuf+3, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
  306. if(pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) {
  307. memcpy(pbyBuf+8, (PBYTE)&(dwRevIVCounter), 3);
  308. memcpy(pbyBuf+11, pTransmitKey->abyKey, pTransmitKey->uKeyLength);
  309. }
  310. memcpy(pDevice->abyPRNG, pbyBuf, 16);
  311. }
  312. // Append IV after Mac Header
  313. *pdwIV &= WEP_IV_MASK;//00000000 11111111 11111111 11111111
  314. *pdwIV |= (pDevice->byKeyIndex << 30);
  315. *pdwIV = cpu_to_le32(*pdwIV);
  316. pDevice->dwIVCounter++;
  317. if (pDevice->dwIVCounter > WEP_IV_MASK) {
  318. pDevice->dwIVCounter = 0;
  319. }
  320. } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
  321. pTransmitKey->wTSC15_0++;
  322. if (pTransmitKey->wTSC15_0 == 0) {
  323. pTransmitKey->dwTSC47_16++;
  324. }
  325. TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
  326. pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
  327. memcpy(pbyBuf, pDevice->abyPRNG, 16);
  328. // Make IV
  329. memcpy(pdwIV, pDevice->abyPRNG, 3);
  330. *(pbyIVHead+3) = (BYTE)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
  331. // Append IV&ExtIV after Mac Header
  332. *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
  333. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV);
  334. } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
  335. pTransmitKey->wTSC15_0++;
  336. if (pTransmitKey->wTSC15_0 == 0) {
  337. pTransmitKey->dwTSC47_16++;
  338. }
  339. memcpy(pbyBuf, pTransmitKey->abyKey, 16);
  340. // Make IV
  341. *pdwIV = 0;
  342. *(pbyIVHead+3) = (BYTE)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV
  343. *pdwIV |= cpu_to_le16((WORD)(pTransmitKey->wTSC15_0));
  344. //Append IV&ExtIV after Mac Header
  345. *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16);
  346. //Fill MICHDR0
  347. *pMICHDR = 0x59;
  348. *((PBYTE)(pMICHDR+1)) = 0; // TxPriority
  349. memcpy(pMICHDR+2, &(pMACHeader->abyAddr2[0]), 6);
  350. *((PBYTE)(pMICHDR+8)) = HIBYTE(HIWORD(pTransmitKey->dwTSC47_16));
  351. *((PBYTE)(pMICHDR+9)) = LOBYTE(HIWORD(pTransmitKey->dwTSC47_16));
  352. *((PBYTE)(pMICHDR+10)) = HIBYTE(LOWORD(pTransmitKey->dwTSC47_16));
  353. *((PBYTE)(pMICHDR+11)) = LOBYTE(LOWORD(pTransmitKey->dwTSC47_16));
  354. *((PBYTE)(pMICHDR+12)) = HIBYTE(pTransmitKey->wTSC15_0);
  355. *((PBYTE)(pMICHDR+13)) = LOBYTE(pTransmitKey->wTSC15_0);
  356. *((PBYTE)(pMICHDR+14)) = HIBYTE(wPayloadLen);
  357. *((PBYTE)(pMICHDR+15)) = LOBYTE(wPayloadLen);
  358. //Fill MICHDR1
  359. *((PBYTE)(pMICHDR+16)) = 0; // HLEN[15:8]
  360. if (pDevice->bLongHeader) {
  361. *((PBYTE)(pMICHDR+17)) = 28; // HLEN[7:0]
  362. } else {
  363. *((PBYTE)(pMICHDR+17)) = 22; // HLEN[7:0]
  364. }
  365. wValue = cpu_to_le16(pMACHeader->wFrameCtl & 0xC78F);
  366. memcpy(pMICHDR+18, (PBYTE)&wValue, 2); // MSKFRACTL
  367. memcpy(pMICHDR+20, &(pMACHeader->abyAddr1[0]), 6);
  368. memcpy(pMICHDR+26, &(pMACHeader->abyAddr2[0]), 6);
  369. //Fill MICHDR2
  370. memcpy(pMICHDR+32, &(pMACHeader->abyAddr3[0]), 6);
  371. wValue = pMACHeader->wSeqCtl;
  372. wValue &= 0x000F;
  373. wValue = cpu_to_le16(wValue);
  374. memcpy(pMICHDR+38, (PBYTE)&wValue, 2); // MSKSEQCTL
  375. if (pDevice->bLongHeader) {
  376. memcpy(pMICHDR+40, &(pMACHeader->abyAddr4[0]), 6);
  377. }
  378. }
  379. }
  380. static
  381. void
  382. s_vSWencryption (
  383. PSDevice pDevice,
  384. PSKeyItem pTransmitKey,
  385. PBYTE pbyPayloadHead,
  386. WORD wPayloadSize
  387. )
  388. {
  389. unsigned int cbICVlen = 4;
  390. DWORD dwICV = 0xFFFFFFFFL;
  391. PDWORD pdwICV;
  392. if (pTransmitKey == NULL)
  393. return;
  394. if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
  395. //=======================================================================
  396. // Append ICV after payload
  397. dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
  398. pdwICV = (PDWORD)(pbyPayloadHead + wPayloadSize);
  399. // finally, we must invert dwCRC to get the correct answer
  400. *pdwICV = cpu_to_le32(~dwICV);
  401. // RC4 encryption
  402. rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3);
  403. rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
  404. //=======================================================================
  405. } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
  406. //=======================================================================
  407. //Append ICV after payload
  408. dwICV = CRCdwGetCrc32Ex(pbyPayloadHead, wPayloadSize, dwICV);//ICV(Payload)
  409. pdwICV = (PDWORD)(pbyPayloadHead + wPayloadSize);
  410. // finally, we must invert dwCRC to get the correct answer
  411. *pdwICV = cpu_to_le32(~dwICV);
  412. // RC4 encryption
  413. rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
  414. rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen);
  415. //=======================================================================
  416. }
  417. }
  418. /*byPktType : PK_TYPE_11A 0
  419. PK_TYPE_11B 1
  420. PK_TYPE_11GB 2
  421. PK_TYPE_11GA 3
  422. */
  423. static
  424. unsigned int
  425. s_uGetTxRsvTime (
  426. PSDevice pDevice,
  427. BYTE byPktType,
  428. unsigned int cbFrameLength,
  429. WORD wRate,
  430. BOOL bNeedAck
  431. )
  432. {
  433. unsigned int uDataTime, uAckTime;
  434. uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wRate);
  435. if (byPktType == PK_TYPE_11B) {//llb,CCK mode
  436. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (WORD)pDevice->byTopCCKBasicRate);
  437. } else {//11g 2.4G OFDM mode & 11a 5G OFDM mode
  438. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, (WORD)pDevice->byTopOFDMBasicRate);
  439. }
  440. if (bNeedAck) {
  441. return (uDataTime + pDevice->uSIFS + uAckTime);
  442. }
  443. else {
  444. return uDataTime;
  445. }
  446. }
  447. //byFreqType: 0=>5GHZ 1=>2.4GHZ
  448. static
  449. unsigned int
  450. s_uGetRTSCTSRsvTime (
  451. PSDevice pDevice,
  452. BYTE byRTSRsvType,
  453. BYTE byPktType,
  454. unsigned int cbFrameLength,
  455. WORD wCurrentRate
  456. )
  457. {
  458. unsigned int uRrvTime , uRTSTime, uCTSTime, uAckTime, uDataTime;
  459. uRrvTime = uRTSTime = uCTSTime = uAckTime = uDataTime = 0;
  460. uDataTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, cbFrameLength, wCurrentRate);
  461. if (byRTSRsvType == 0) { //RTSTxRrvTime_bb
  462. uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
  463. uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  464. }
  465. else if (byRTSRsvType == 1){ //RTSTxRrvTime_ba, only in 2.4GHZ
  466. uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopCCKBasicRate);
  467. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  468. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  469. }
  470. else if (byRTSRsvType == 2) { //RTSTxRrvTime_aa
  471. uRTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 20, pDevice->byTopOFDMBasicRate);
  472. uCTSTime = uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  473. }
  474. else if (byRTSRsvType == 3) { //CTSTxRrvTime_ba, only in 2.4GHZ
  475. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  476. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  477. uRrvTime = uCTSTime + uAckTime + uDataTime + 2*pDevice->uSIFS;
  478. return uRrvTime;
  479. }
  480. //RTSRrvTime
  481. uRrvTime = uRTSTime + uCTSTime + uAckTime + uDataTime + 3*pDevice->uSIFS;
  482. return uRrvTime;
  483. }
  484. //byFreqType 0: 5GHz, 1:2.4Ghz
  485. static
  486. unsigned int
  487. s_uGetDataDuration (
  488. PSDevice pDevice,
  489. BYTE byDurType,
  490. unsigned int cbFrameLength,
  491. BYTE byPktType,
  492. WORD wRate,
  493. BOOL bNeedAck,
  494. unsigned int uFragIdx,
  495. unsigned int cbLastFragmentSize,
  496. unsigned int uMACfragNum,
  497. BYTE byFBOption
  498. )
  499. {
  500. BOOL bLastFrag = 0;
  501. unsigned int uAckTime = 0, uNextPktTime = 0;
  502. if (uFragIdx == (uMACfragNum-1)) {
  503. bLastFrag = 1;
  504. }
  505. switch (byDurType) {
  506. case DATADUR_B: //DATADUR_B
  507. if (((uMACfragNum == 1)) || (bLastFrag == 1)) {//Non Frag or Last Frag
  508. if (bNeedAck) {
  509. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  510. return (pDevice->uSIFS + uAckTime);
  511. } else {
  512. return 0;
  513. }
  514. }
  515. else {//First Frag or Mid Frag
  516. if (uFragIdx == (uMACfragNum-2)) {
  517. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
  518. } else {
  519. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
  520. }
  521. if (bNeedAck) {
  522. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  523. return (pDevice->uSIFS + uAckTime + uNextPktTime);
  524. } else {
  525. return (pDevice->uSIFS + uNextPktTime);
  526. }
  527. }
  528. break;
  529. case DATADUR_A: //DATADUR_A
  530. if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
  531. if(bNeedAck){
  532. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  533. return (pDevice->uSIFS + uAckTime);
  534. } else {
  535. return 0;
  536. }
  537. }
  538. else {//First Frag or Mid Frag
  539. if(uFragIdx == (uMACfragNum-2)){
  540. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wRate, bNeedAck);
  541. } else {
  542. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
  543. }
  544. if(bNeedAck){
  545. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  546. return (pDevice->uSIFS + uAckTime + uNextPktTime);
  547. } else {
  548. return (pDevice->uSIFS + uNextPktTime);
  549. }
  550. }
  551. break;
  552. case DATADUR_A_F0: //DATADUR_A_F0
  553. if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
  554. if(bNeedAck){
  555. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  556. return (pDevice->uSIFS + uAckTime);
  557. } else {
  558. return 0;
  559. }
  560. }
  561. else { //First Frag or Mid Frag
  562. if (byFBOption == AUTO_FB_0) {
  563. if (wRate < RATE_18M)
  564. wRate = RATE_18M;
  565. else if (wRate > RATE_54M)
  566. wRate = RATE_54M;
  567. if(uFragIdx == (uMACfragNum-2)){
  568. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
  569. } else {
  570. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
  571. }
  572. } else { // (byFBOption == AUTO_FB_1)
  573. if (wRate < RATE_18M)
  574. wRate = RATE_18M;
  575. else if (wRate > RATE_54M)
  576. wRate = RATE_54M;
  577. if(uFragIdx == (uMACfragNum-2)){
  578. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
  579. } else {
  580. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
  581. }
  582. }
  583. if(bNeedAck){
  584. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  585. return (pDevice->uSIFS + uAckTime + uNextPktTime);
  586. } else {
  587. return (pDevice->uSIFS + uNextPktTime);
  588. }
  589. }
  590. break;
  591. case DATADUR_A_F1: //DATADUR_A_F1
  592. if (((uMACfragNum==1)) || (bLastFrag==1)) {//Non Frag or Last Frag
  593. if(bNeedAck){
  594. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  595. return (pDevice->uSIFS + uAckTime);
  596. } else {
  597. return 0;
  598. }
  599. }
  600. else { //First Frag or Mid Frag
  601. if (byFBOption == AUTO_FB_0) {
  602. if (wRate < RATE_18M)
  603. wRate = RATE_18M;
  604. else if (wRate > RATE_54M)
  605. wRate = RATE_54M;
  606. if(uFragIdx == (uMACfragNum-2)){
  607. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
  608. } else {
  609. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
  610. }
  611. } else { // (byFBOption == AUTO_FB_1)
  612. if (wRate < RATE_18M)
  613. wRate = RATE_18M;
  614. else if (wRate > RATE_54M)
  615. wRate = RATE_54M;
  616. if(uFragIdx == (uMACfragNum-2)){
  617. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbLastFragmentSize, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
  618. } else {
  619. uNextPktTime = s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
  620. }
  621. }
  622. if(bNeedAck){
  623. uAckTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  624. return (pDevice->uSIFS + uAckTime + uNextPktTime);
  625. } else {
  626. return (pDevice->uSIFS + uNextPktTime);
  627. }
  628. }
  629. break;
  630. default:
  631. break;
  632. }
  633. ASSERT(FALSE);
  634. return 0;
  635. }
  636. //byFreqType: 0=>5GHZ 1=>2.4GHZ
  637. static
  638. unsigned int
  639. s_uGetRTSCTSDuration (
  640. PSDevice pDevice,
  641. BYTE byDurType,
  642. unsigned int cbFrameLength,
  643. BYTE byPktType,
  644. WORD wRate,
  645. BOOL bNeedAck,
  646. BYTE byFBOption
  647. )
  648. {
  649. unsigned int uCTSTime = 0, uDurTime = 0;
  650. switch (byDurType) {
  651. case RTSDUR_BB: //RTSDuration_bb
  652. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  653. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
  654. break;
  655. case RTSDUR_BA: //RTSDuration_ba
  656. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  657. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
  658. break;
  659. case RTSDUR_AA: //RTSDuration_aa
  660. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  661. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
  662. break;
  663. case CTSDUR_BA: //CTSDuration_ba
  664. uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wRate, bNeedAck);
  665. break;
  666. case RTSDUR_BA_F0: //RTSDuration_ba_f0
  667. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  668. if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
  669. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
  670. } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
  671. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
  672. }
  673. break;
  674. case RTSDUR_AA_F0: //RTSDuration_aa_f0
  675. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  676. if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
  677. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
  678. } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
  679. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
  680. }
  681. break;
  682. case RTSDUR_BA_F1: //RTSDuration_ba_f1
  683. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopCCKBasicRate);
  684. if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
  685. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
  686. } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
  687. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
  688. }
  689. break;
  690. case RTSDUR_AA_F1: //RTSDuration_aa_f1
  691. uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, 14, pDevice->byTopOFDMBasicRate);
  692. if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
  693. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
  694. } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
  695. uDurTime = uCTSTime + 2*pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
  696. }
  697. break;
  698. case CTSDUR_BA_F0: //CTSDuration_ba_f0
  699. if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
  700. uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE0][wRate-RATE_18M], bNeedAck);
  701. } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
  702. uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE0][wRate-RATE_18M], bNeedAck);
  703. }
  704. break;
  705. case CTSDUR_BA_F1: //CTSDuration_ba_f1
  706. if ((byFBOption == AUTO_FB_0) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
  707. uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt0[FB_RATE1][wRate-RATE_18M], bNeedAck);
  708. } else if ((byFBOption == AUTO_FB_1) && (wRate >= RATE_18M) && (wRate <=RATE_54M)) {
  709. uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, byPktType, cbFrameLength, wFB_Opt1[FB_RATE1][wRate-RATE_18M], bNeedAck);
  710. }
  711. break;
  712. default:
  713. break;
  714. }
  715. return uDurTime;
  716. }
  717. static
  718. unsigned int
  719. s_uFillDataHead (
  720. PSDevice pDevice,
  721. BYTE byPktType,
  722. WORD wCurrentRate,
  723. void *pTxDataHead,
  724. unsigned int cbFrameLength,
  725. unsigned int uDMAIdx,
  726. BOOL bNeedAck,
  727. unsigned int uFragIdx,
  728. unsigned int cbLastFragmentSize,
  729. unsigned int uMACfragNum,
  730. BYTE byFBOption
  731. )
  732. {
  733. if (pTxDataHead == NULL) {
  734. return 0;
  735. }
  736. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
  737. if ((uDMAIdx == TYPE_ATIMDMA) || (uDMAIdx == TYPE_BEACONDMA)) {
  738. PSTxDataHead_ab pBuf = (PSTxDataHead_ab) pTxDataHead;
  739. //Get SignalField,ServiceField,Length
  740. BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
  741. (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
  742. );
  743. //Get Duration and TimeStampOff
  744. pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
  745. wCurrentRate, bNeedAck, uFragIdx,
  746. cbLastFragmentSize, uMACfragNum,
  747. byFBOption); //1: 2.4GHz
  748. if(uDMAIdx!=TYPE_ATIMDMA) {
  749. pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
  750. }
  751. return (pBuf->wDuration);
  752. }
  753. else { // DATA & MANAGE Frame
  754. if (byFBOption == AUTO_FB_NONE) {
  755. PSTxDataHead_g pBuf = (PSTxDataHead_g)pTxDataHead;
  756. //Get SignalField,ServiceField,Length
  757. BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
  758. (PWORD)&(pBuf->wTransmitLength_a), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
  759. );
  760. BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
  761. (PWORD)&(pBuf->wTransmitLength_b), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
  762. );
  763. //Get Duration and TimeStamp
  764. pBuf->wDuration_a = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength,
  765. byPktType, wCurrentRate, bNeedAck, uFragIdx,
  766. cbLastFragmentSize, uMACfragNum,
  767. byFBOption); //1: 2.4GHz
  768. pBuf->wDuration_b = (WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength,
  769. PK_TYPE_11B, pDevice->byTopCCKBasicRate,
  770. bNeedAck, uFragIdx, cbLastFragmentSize,
  771. uMACfragNum, byFBOption); //1: 2.4GHz
  772. pBuf->wTimeStampOff_a = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
  773. pBuf->wTimeStampOff_b = wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE];
  774. return (pBuf->wDuration_a);
  775. } else {
  776. // Auto Fallback
  777. PSTxDataHead_g_FB pBuf = (PSTxDataHead_g_FB)pTxDataHead;
  778. //Get SignalField,ServiceField,Length
  779. BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
  780. (PWORD)&(pBuf->wTransmitLength_a), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
  781. );
  782. BBvCaculateParameter(pDevice, cbFrameLength, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
  783. (PWORD)&(pBuf->wTransmitLength_b), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
  784. );
  785. //Get Duration and TimeStamp
  786. pBuf->wDuration_a = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
  787. wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
  788. pBuf->wDuration_b = (WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, PK_TYPE_11B,
  789. pDevice->byTopCCKBasicRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
  790. pBuf->wDuration_a_f0 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
  791. wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
  792. pBuf->wDuration_a_f1 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
  793. wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //1: 2.4GHz
  794. pBuf->wTimeStampOff_a = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
  795. pBuf->wTimeStampOff_b = wTimeStampOff[pDevice->byPreambleType%2][pDevice->byTopCCKBasicRate%MAX_RATE];
  796. return (pBuf->wDuration_a);
  797. } //if (byFBOption == AUTO_FB_NONE)
  798. }
  799. }
  800. else if (byPktType == PK_TYPE_11A) {
  801. if ((byFBOption != AUTO_FB_NONE) && (uDMAIdx != TYPE_ATIMDMA) && (uDMAIdx != TYPE_BEACONDMA)) {
  802. // Auto Fallback
  803. PSTxDataHead_a_FB pBuf = (PSTxDataHead_a_FB)pTxDataHead;
  804. //Get SignalField,ServiceField,Length
  805. BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
  806. (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
  807. );
  808. //Get Duration and TimeStampOff
  809. pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
  810. wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz
  811. pBuf->wDuration_f0 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F0, cbFrameLength, byPktType,
  812. wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz
  813. pBuf->wDuration_f1 = (WORD)s_uGetDataDuration(pDevice, DATADUR_A_F1, cbFrameLength, byPktType,
  814. wCurrentRate, bNeedAck, uFragIdx, cbLastFragmentSize, uMACfragNum, byFBOption); //0: 5GHz
  815. if(uDMAIdx!=TYPE_ATIMDMA) {
  816. pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
  817. }
  818. return (pBuf->wDuration);
  819. } else {
  820. PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
  821. //Get SignalField,ServiceField,Length
  822. BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
  823. (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
  824. );
  825. //Get Duration and TimeStampOff
  826. pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameLength, byPktType,
  827. wCurrentRate, bNeedAck, uFragIdx,
  828. cbLastFragmentSize, uMACfragNum,
  829. byFBOption);
  830. if(uDMAIdx!=TYPE_ATIMDMA) {
  831. pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
  832. }
  833. return (pBuf->wDuration);
  834. }
  835. }
  836. else if (byPktType == PK_TYPE_11B) {
  837. PSTxDataHead_ab pBuf = (PSTxDataHead_ab)pTxDataHead;
  838. //Get SignalField,ServiceField,Length
  839. BBvCaculateParameter(pDevice, cbFrameLength, wCurrentRate, byPktType,
  840. (PWORD)&(pBuf->wTransmitLength), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
  841. );
  842. //Get Duration and TimeStampOff
  843. pBuf->wDuration = (WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameLength, byPktType,
  844. wCurrentRate, bNeedAck, uFragIdx,
  845. cbLastFragmentSize, uMACfragNum,
  846. byFBOption);
  847. if (uDMAIdx != TYPE_ATIMDMA) {
  848. pBuf->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
  849. }
  850. return (pBuf->wDuration);
  851. }
  852. return 0;
  853. }
  854. static
  855. void
  856. s_vFillRTSHead (
  857. PSDevice pDevice,
  858. BYTE byPktType,
  859. void *pvRTS,
  860. unsigned int cbFrameLength,
  861. BOOL bNeedAck,
  862. BOOL bDisCRC,
  863. PSEthernetHeader psEthHeader,
  864. WORD wCurrentRate,
  865. BYTE byFBOption
  866. )
  867. {
  868. unsigned int uRTSFrameLen = 20;
  869. WORD wLen = 0x0000;
  870. if (pvRTS == NULL)
  871. return;
  872. if (bDisCRC) {
  873. // When CRCDIS bit is on, H/W forgot to generate FCS for RTS frame,
  874. // in this case we need to decrease its length by 4.
  875. uRTSFrameLen -= 4;
  876. }
  877. // Note: So far RTSHead dosen't appear in ATIM & Beacom DMA, so we don't need to take them into account.
  878. // Otherwise, we need to modified codes for them.
  879. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
  880. if (byFBOption == AUTO_FB_NONE) {
  881. PSRTS_g pBuf = (PSRTS_g)pvRTS;
  882. //Get SignalField,ServiceField,Length
  883. BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
  884. (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
  885. );
  886. pBuf->wTransmitLength_b = cpu_to_le16(wLen);
  887. BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
  888. (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
  889. );
  890. pBuf->wTransmitLength_a = cpu_to_le16(wLen);
  891. //Get Duration
  892. pBuf->wDuration_bb = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, PK_TYPE_11B, pDevice->byTopCCKBasicRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
  893. pBuf->wDuration_aa = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //2:RTSDuration_aa, 1:2.4G, 2,3: 2.4G OFDMData
  894. pBuf->wDuration_ba = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //1:RTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
  895. pBuf->Data.wDurationID = pBuf->wDuration_aa;
  896. //Get RTS Frame body
  897. pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
  898. if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
  899. (pDevice->eOPMode == OP_MODE_AP)) {
  900. memcpy(&(pBuf->Data.abyRA[0]),
  901. &(psEthHeader->abyDstAddr[0]),
  902. ETH_ALEN);
  903. }
  904. else {
  905. memcpy(&(pBuf->Data.abyRA[0]),
  906. &(pDevice->abyBSSID[0]),
  907. ETH_ALEN);
  908. }
  909. if (pDevice->eOPMode == OP_MODE_AP) {
  910. memcpy(&(pBuf->Data.abyTA[0]),
  911. &(pDevice->abyBSSID[0]),
  912. ETH_ALEN);
  913. }
  914. else {
  915. memcpy(&(pBuf->Data.abyTA[0]),
  916. &(psEthHeader->abySrcAddr[0]),
  917. ETH_ALEN);
  918. }
  919. }
  920. else {
  921. PSRTS_g_FB pBuf = (PSRTS_g_FB)pvRTS;
  922. //Get SignalField,ServiceField,Length
  923. BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
  924. (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
  925. );
  926. pBuf->wTransmitLength_b = cpu_to_le16(wLen);
  927. BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
  928. (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_a), (PBYTE)&(pBuf->bySignalField_a)
  929. );
  930. pBuf->wTransmitLength_a = cpu_to_le16(wLen);
  931. //Get Duration
  932. pBuf->wDuration_bb = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, PK_TYPE_11B, pDevice->byTopCCKBasicRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
  933. pBuf->wDuration_aa = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //2:RTSDuration_aa, 1:2.4G, 2,3:2.4G OFDMData
  934. pBuf->wDuration_ba = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //1:RTSDuration_ba, 1:2.4G, 2,3:2.4G OFDMData
  935. pBuf->wRTSDuration_ba_f0 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //4:wRTSDuration_ba_f0, 1:2.4G, 1:CCKData
  936. pBuf->wRTSDuration_aa_f0 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //5:wRTSDuration_aa_f0, 1:2.4G, 1:CCKData
  937. pBuf->wRTSDuration_ba_f1 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //6:wRTSDuration_ba_f1, 1:2.4G, 1:CCKData
  938. pBuf->wRTSDuration_aa_f1 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //7:wRTSDuration_aa_f1, 1:2.4G, 1:CCKData
  939. pBuf->Data.wDurationID = pBuf->wDuration_aa;
  940. //Get RTS Frame body
  941. pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
  942. if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
  943. (pDevice->eOPMode == OP_MODE_AP)) {
  944. memcpy(&(pBuf->Data.abyRA[0]),
  945. &(psEthHeader->abyDstAddr[0]),
  946. ETH_ALEN);
  947. }
  948. else {
  949. memcpy(&(pBuf->Data.abyRA[0]),
  950. &(pDevice->abyBSSID[0]),
  951. ETH_ALEN);
  952. }
  953. if (pDevice->eOPMode == OP_MODE_AP) {
  954. memcpy(&(pBuf->Data.abyTA[0]),
  955. &(pDevice->abyBSSID[0]),
  956. ETH_ALEN);
  957. }
  958. else {
  959. memcpy(&(pBuf->Data.abyTA[0]),
  960. &(psEthHeader->abySrcAddr[0]),
  961. ETH_ALEN);
  962. }
  963. } // if (byFBOption == AUTO_FB_NONE)
  964. }
  965. else if (byPktType == PK_TYPE_11A) {
  966. if (byFBOption == AUTO_FB_NONE) {
  967. PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
  968. //Get SignalField,ServiceField,Length
  969. BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
  970. (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
  971. );
  972. pBuf->wTransmitLength = cpu_to_le16(wLen);
  973. //Get Duration
  974. pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
  975. pBuf->Data.wDurationID = pBuf->wDuration;
  976. //Get RTS Frame body
  977. pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
  978. if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
  979. (pDevice->eOPMode == OP_MODE_AP)) {
  980. memcpy(&(pBuf->Data.abyRA[0]),
  981. &(psEthHeader->abyDstAddr[0]),
  982. ETH_ALEN);
  983. } else {
  984. memcpy(&(pBuf->Data.abyRA[0]),
  985. &(pDevice->abyBSSID[0]),
  986. ETH_ALEN);
  987. }
  988. if (pDevice->eOPMode == OP_MODE_AP) {
  989. memcpy(&(pBuf->Data.abyTA[0]),
  990. &(pDevice->abyBSSID[0]),
  991. ETH_ALEN);
  992. } else {
  993. memcpy(&(pBuf->Data.abyTA[0]),
  994. &(psEthHeader->abySrcAddr[0]),
  995. ETH_ALEN);
  996. }
  997. }
  998. else {
  999. PSRTS_a_FB pBuf = (PSRTS_a_FB)pvRTS;
  1000. //Get SignalField,ServiceField,Length
  1001. BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopOFDMBasicRate, byPktType,
  1002. (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
  1003. );
  1004. pBuf->wTransmitLength = cpu_to_le16(wLen);
  1005. //Get Duration
  1006. pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_aa, 0:5G, 0: 5G OFDMData
  1007. pBuf->wRTSDuration_f0 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //5:RTSDuration_aa_f0, 0:5G, 0: 5G OFDMData
  1008. pBuf->wRTSDuration_f1 = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_AA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //7:RTSDuration_aa_f1, 0:5G, 0:
  1009. pBuf->Data.wDurationID = pBuf->wDuration;
  1010. //Get RTS Frame body
  1011. pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
  1012. if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
  1013. (pDevice->eOPMode == OP_MODE_AP)) {
  1014. memcpy(&(pBuf->Data.abyRA[0]),
  1015. &(psEthHeader->abyDstAddr[0]),
  1016. ETH_ALEN);
  1017. } else {
  1018. memcpy(&(pBuf->Data.abyRA[0]),
  1019. &(pDevice->abyBSSID[0]),
  1020. ETH_ALEN);
  1021. }
  1022. if (pDevice->eOPMode == OP_MODE_AP) {
  1023. memcpy(&(pBuf->Data.abyTA[0]),
  1024. &(pDevice->abyBSSID[0]),
  1025. ETH_ALEN);
  1026. } else {
  1027. memcpy(&(pBuf->Data.abyTA[0]),
  1028. &(psEthHeader->abySrcAddr[0]),
  1029. ETH_ALEN);
  1030. }
  1031. }
  1032. }
  1033. else if (byPktType == PK_TYPE_11B) {
  1034. PSRTS_ab pBuf = (PSRTS_ab)pvRTS;
  1035. //Get SignalField,ServiceField,Length
  1036. BBvCaculateParameter(pDevice, uRTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
  1037. (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField), (PBYTE)&(pBuf->bySignalField)
  1038. );
  1039. pBuf->wTransmitLength = cpu_to_le16(wLen);
  1040. //Get Duration
  1041. pBuf->wDuration = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, RTSDUR_BB, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //0:RTSDuration_bb, 1:2.4G, 1:CCKData
  1042. pBuf->Data.wDurationID = pBuf->wDuration;
  1043. //Get RTS Frame body
  1044. pBuf->Data.wFrameControl = TYPE_CTL_RTS;//0x00B4
  1045. if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
  1046. (pDevice->eOPMode == OP_MODE_AP)) {
  1047. memcpy(&(pBuf->Data.abyRA[0]),
  1048. &(psEthHeader->abyDstAddr[0]),
  1049. ETH_ALEN);
  1050. }
  1051. else {
  1052. memcpy(&(pBuf->Data.abyRA[0]),
  1053. &(pDevice->abyBSSID[0]),
  1054. ETH_ALEN);
  1055. }
  1056. if (pDevice->eOPMode == OP_MODE_AP) {
  1057. memcpy(&(pBuf->Data.abyTA[0]),
  1058. &(pDevice->abyBSSID[0]),
  1059. ETH_ALEN);
  1060. } else {
  1061. memcpy(&(pBuf->Data.abyTA[0]),
  1062. &(psEthHeader->abySrcAddr[0]),
  1063. ETH_ALEN);
  1064. }
  1065. }
  1066. }
  1067. static
  1068. void
  1069. s_vFillCTSHead (
  1070. PSDevice pDevice,
  1071. unsigned int uDMAIdx,
  1072. BYTE byPktType,
  1073. void *pvCTS,
  1074. unsigned int cbFrameLength,
  1075. BOOL bNeedAck,
  1076. BOOL bDisCRC,
  1077. WORD wCurrentRate,
  1078. BYTE byFBOption
  1079. )
  1080. {
  1081. unsigned int uCTSFrameLen = 14;
  1082. WORD wLen = 0x0000;
  1083. if (pvCTS == NULL) {
  1084. return;
  1085. }
  1086. if (bDisCRC) {
  1087. // When CRCDIS bit is on, H/W forgot to generate FCS for CTS frame,
  1088. // in this case we need to decrease its length by 4.
  1089. uCTSFrameLen -= 4;
  1090. }
  1091. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
  1092. if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA) {
  1093. // Auto Fall back
  1094. PSCTS_FB pBuf = (PSCTS_FB)pvCTS;
  1095. //Get SignalField,ServiceField,Length
  1096. BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
  1097. (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
  1098. );
  1099. pBuf->wTransmitLength_b = cpu_to_le16(wLen);
  1100. pBuf->wDuration_ba = (WORD)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption); //3:CTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
  1101. pBuf->wDuration_ba += pDevice->wCTSDuration;
  1102. pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
  1103. //Get CTSDuration_ba_f0
  1104. pBuf->wCTSDuration_ba_f0 = (WORD)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F0, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption); //8:CTSDuration_ba_f0, 1:2.4G, 2,3:2.4G OFDM Data
  1105. pBuf->wCTSDuration_ba_f0 += pDevice->wCTSDuration;
  1106. pBuf->wCTSDuration_ba_f0 = cpu_to_le16(pBuf->wCTSDuration_ba_f0);
  1107. //Get CTSDuration_ba_f1
  1108. pBuf->wCTSDuration_ba_f1 = (WORD)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA_F1, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption); //9:CTSDuration_ba_f1, 1:2.4G, 2,3:2.4G OFDM Data
  1109. pBuf->wCTSDuration_ba_f1 += pDevice->wCTSDuration;
  1110. pBuf->wCTSDuration_ba_f1 = cpu_to_le16(pBuf->wCTSDuration_ba_f1);
  1111. //Get CTS Frame body
  1112. pBuf->Data.wDurationID = pBuf->wDuration_ba;
  1113. pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
  1114. pBuf->Data.wReserved = 0x0000;
  1115. memcpy(&(pBuf->Data.abyRA[0]),
  1116. &(pDevice->abyCurrentNetAddr[0]),
  1117. ETH_ALEN);
  1118. } else { //if (byFBOption != AUTO_FB_NONE && uDMAIdx != TYPE_ATIMDMA && uDMAIdx != TYPE_BEACONDMA)
  1119. PSCTS pBuf = (PSCTS)pvCTS;
  1120. //Get SignalField,ServiceField,Length
  1121. BBvCaculateParameter(pDevice, uCTSFrameLen, pDevice->byTopCCKBasicRate, PK_TYPE_11B,
  1122. (PWORD)&(wLen), (PBYTE)&(pBuf->byServiceField_b), (PBYTE)&(pBuf->bySignalField_b)
  1123. );
  1124. pBuf->wTransmitLength_b = cpu_to_le16(wLen);
  1125. //Get CTSDuration_ba
  1126. pBuf->wDuration_ba = cpu_to_le16((WORD)s_uGetRTSCTSDuration(pDevice, CTSDUR_BA, cbFrameLength, byPktType, wCurrentRate, bNeedAck, byFBOption)); //3:CTSDuration_ba, 1:2.4G, 2,3:2.4G OFDM Data
  1127. pBuf->wDuration_ba += pDevice->wCTSDuration;
  1128. pBuf->wDuration_ba = cpu_to_le16(pBuf->wDuration_ba);
  1129. //Get CTS Frame body
  1130. pBuf->Data.wDurationID = pBuf->wDuration_ba;
  1131. pBuf->Data.wFrameControl = TYPE_CTL_CTS;//0x00C4
  1132. pBuf->Data.wReserved = 0x0000;
  1133. memcpy(&(pBuf->Data.abyRA[0]),
  1134. &(pDevice->abyCurrentNetAddr[0]),
  1135. ETH_ALEN);
  1136. }
  1137. }
  1138. }
  1139. /*+
  1140. *
  1141. * Description:
  1142. * Generate FIFO control for MAC & Baseband controller
  1143. *
  1144. * Parameters:
  1145. * In:
  1146. * pDevice - Pointer to adpater
  1147. * pTxDataHead - Transmit Data Buffer
  1148. * pTxBufHead - pTxBufHead
  1149. * pvRrvTime - pvRrvTime
  1150. * pvRTS - RTS Buffer
  1151. * pCTS - CTS Buffer
  1152. * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS)
  1153. * bNeedACK - If need ACK
  1154. * uDMAIdx - DMA Index
  1155. * Out:
  1156. * none
  1157. *
  1158. * Return Value: none
  1159. *
  1160. -*/
  1161. static
  1162. void
  1163. s_vGenerateTxParameter (
  1164. PSDevice pDevice,
  1165. BYTE byPktType,
  1166. WORD wCurrentRate,
  1167. void *pTxBufHead,
  1168. void *pvRrvTime,
  1169. void *pvRTS,
  1170. void *pvCTS,
  1171. unsigned int cbFrameSize,
  1172. BOOL bNeedACK,
  1173. unsigned int uDMAIdx,
  1174. PSEthernetHeader psEthHeader
  1175. )
  1176. {
  1177. unsigned int cbMACHdLen = WLAN_HDR_ADDR3_LEN; /* 24 */
  1178. WORD wFifoCtl;
  1179. BOOL bDisCRC = FALSE;
  1180. BYTE byFBOption = AUTO_FB_NONE;
  1181. // WORD wCurrentRate = pDevice->wCurrentRate;
  1182. //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter...\n");
  1183. PSTxBufHead pFifoHead = (PSTxBufHead)pTxBufHead;
  1184. pFifoHead->wReserved = wCurrentRate;
  1185. wFifoCtl = pFifoHead->wFIFOCtl;
  1186. if (wFifoCtl & FIFOCTL_CRCDIS) {
  1187. bDisCRC = TRUE;
  1188. }
  1189. if (wFifoCtl & FIFOCTL_AUTO_FB_0) {
  1190. byFBOption = AUTO_FB_0;
  1191. }
  1192. else if (wFifoCtl & FIFOCTL_AUTO_FB_1) {
  1193. byFBOption = AUTO_FB_1;
  1194. }
  1195. if (pDevice->bLongHeader)
  1196. cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
  1197. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
  1198. if (pvRTS != NULL) { //RTS_need
  1199. //Fill RsvTime
  1200. if (pvRrvTime) {
  1201. PSRrvTime_gRTS pBuf = (PSRrvTime_gRTS)pvRrvTime;
  1202. pBuf->wRTSTxRrvTime_aa = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 1:2.4GHz
  1203. pBuf->wRTSTxRrvTime_ba = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 1, byPktType, cbFrameSize, wCurrentRate));//1:RTSTxRrvTime_ba, 1:2.4GHz
  1204. pBuf->wRTSTxRrvTime_bb = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
  1205. pBuf->wTxRrvTime_a = cpu_to_le16((WORD) s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
  1206. pBuf->wTxRrvTime_b = cpu_to_le16((WORD) s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
  1207. }
  1208. //Fill RTS
  1209. s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
  1210. }
  1211. else {//RTS_needless, PCF mode
  1212. //Fill RsvTime
  1213. if (pvRrvTime) {
  1214. PSRrvTime_gCTS pBuf = (PSRrvTime_gCTS)pvRrvTime;
  1215. pBuf->wTxRrvTime_a = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//2.4G OFDM
  1216. pBuf->wTxRrvTime_b = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, pDevice->byTopCCKBasicRate, bNeedACK));//1:CCK
  1217. pBuf->wCTSTxRrvTime_ba = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 3, byPktType, cbFrameSize, wCurrentRate));//3:CTSTxRrvTime_Ba, 1:2.4GHz
  1218. }
  1219. //Fill CTS
  1220. s_vFillCTSHead(pDevice, uDMAIdx, byPktType, pvCTS, cbFrameSize, bNeedACK, bDisCRC, wCurrentRate, byFBOption);
  1221. }
  1222. }
  1223. else if (byPktType == PK_TYPE_11A) {
  1224. if (pvRTS != NULL) {//RTS_need, non PCF mode
  1225. //Fill RsvTime
  1226. if (pvRrvTime) {
  1227. PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
  1228. pBuf->wRTSTxRrvTime = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 2, byPktType, cbFrameSize, wCurrentRate));//2:RTSTxRrvTime_aa, 0:5GHz
  1229. pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, byPktType, cbFrameSize, wCurrentRate, bNeedACK));//0:OFDM
  1230. }
  1231. //Fill RTS
  1232. s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
  1233. }
  1234. else if (pvRTS == NULL) {//RTS_needless, non PCF mode
  1235. //Fill RsvTime
  1236. if (pvRrvTime) {
  1237. PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
  1238. pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11A, cbFrameSize, wCurrentRate, bNeedACK)); //0:OFDM
  1239. }
  1240. }
  1241. }
  1242. else if (byPktType == PK_TYPE_11B) {
  1243. if ((pvRTS != NULL)) {//RTS_need, non PCF mode
  1244. //Fill RsvTime
  1245. if (pvRrvTime) {
  1246. PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
  1247. pBuf->wRTSTxRrvTime = cpu_to_le16((WORD)s_uGetRTSCTSRsvTime(pDevice, 0, byPktType, cbFrameSize, wCurrentRate));//0:RTSTxRrvTime_bb, 1:2.4GHz
  1248. pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK));//1:CCK
  1249. }
  1250. //Fill RTS
  1251. s_vFillRTSHead(pDevice, byPktType, pvRTS, cbFrameSize, bNeedACK, bDisCRC, psEthHeader, wCurrentRate, byFBOption);
  1252. }
  1253. else { //RTS_needless, non PCF mode
  1254. //Fill RsvTime
  1255. if (pvRrvTime) {
  1256. PSRrvTime_ab pBuf = (PSRrvTime_ab)pvRrvTime;
  1257. pBuf->wTxRrvTime = cpu_to_le16((WORD)s_uGetTxRsvTime(pDevice, PK_TYPE_11B, cbFrameSize, wCurrentRate, bNeedACK)); //1:CCK
  1258. }
  1259. }
  1260. }
  1261. //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"s_vGenerateTxParameter END.\n");
  1262. }
  1263. /*
  1264. PBYTE pbyBuffer,//point to pTxBufHead
  1265. WORD wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last
  1266. unsigned int cbFragmentSize,//Hdr+payoad+FCS
  1267. */
  1268. BOOL
  1269. s_bPacketToWirelessUsb(
  1270. PSDevice pDevice,
  1271. BYTE byPktType,
  1272. PBYTE usbPacketBuf,
  1273. BOOL bNeedEncryption,
  1274. unsigned int uSkbPacketLen,
  1275. unsigned int uDMAIdx,
  1276. PSEthernetHeader psEthHeader,
  1277. PBYTE pPacket,
  1278. PSKeyItem pTransmitKey,
  1279. unsigned int uNodeIndex,
  1280. WORD wCurrentRate,
  1281. unsigned int *pcbHeaderLen,
  1282. unsigned int *pcbTotalLen
  1283. )
  1284. {
  1285. PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
  1286. unsigned int cbFrameSize, cbFrameBodySize;
  1287. PTX_BUFFER pTxBufHead;
  1288. unsigned int cb802_1_H_len;
  1289. unsigned int cbIVlen = 0, cbICVlen = 0, cbMIClen = 0,
  1290. cbMACHdLen = 0, cbFCSlen = 4;
  1291. unsigned int cbMICHDR = 0;
  1292. BOOL bNeedACK,bRTS;
  1293. PBYTE pbyType,pbyMacHdr,pbyIVHead,pbyPayloadHead,pbyTxBufferAddr;
  1294. BYTE abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00};
  1295. BYTE abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8};
  1296. unsigned int uDuration;
  1297. unsigned int cbHeaderLength = 0, uPadding = 0;
  1298. void *pvRrvTime;
  1299. PSMICHDRHead pMICHDR;
  1300. void *pvRTS;
  1301. void *pvCTS;
  1302. void *pvTxDataHd;
  1303. BYTE byFBOption = AUTO_FB_NONE,byFragType;
  1304. WORD wTxBufSize;
  1305. DWORD dwMICKey0,dwMICKey1,dwMIC_Priority,dwCRC;
  1306. PDWORD pdwMIC_L,pdwMIC_R;
  1307. BOOL bSoftWEP = FALSE;
  1308. pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
  1309. if ((bNeedEncryption) && (pTransmitKey != NULL)) {
  1310. if (((PSKeyTable) (pTransmitKey->pvKeyTable))->bSoftWEP == TRUE) {
  1311. // WEP 256
  1312. bSoftWEP = TRUE;
  1313. }
  1314. }
  1315. pTxBufHead = (PTX_BUFFER) usbPacketBuf;
  1316. memset(pTxBufHead, 0, sizeof(TX_BUFFER));
  1317. // Get pkt type
  1318. if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
  1319. if (pDevice->dwDiagRefCount == 0) {
  1320. cb802_1_H_len = 8;
  1321. } else {
  1322. cb802_1_H_len = 2;
  1323. }
  1324. } else {
  1325. cb802_1_H_len = 0;
  1326. }
  1327. cbFrameBodySize = uSkbPacketLen - ETH_HLEN + cb802_1_H_len;
  1328. //Set packet type
  1329. pTxBufHead->wFIFOCtl |= (WORD)(byPktType<<8);
  1330. if (pDevice->dwDiagRefCount != 0) {
  1331. bNeedACK = FALSE;
  1332. pTxBufHead->wFIFOCtl = pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
  1333. } else { //if (pDevice->dwDiagRefCount != 0) {
  1334. if ((pDevice->eOPMode == OP_MODE_ADHOC) ||
  1335. (pDevice->eOPMode == OP_MODE_AP)) {
  1336. if (is_multicast_ether_addr(psEthHeader->abyDstAddr)) {
  1337. bNeedACK = FALSE;
  1338. pTxBufHead->wFIFOCtl =
  1339. pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK);
  1340. } else {
  1341. bNeedACK = TRUE;
  1342. pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
  1343. }
  1344. }
  1345. else {
  1346. // MSDUs in Infra mode always need ACK
  1347. bNeedACK = TRUE;
  1348. pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
  1349. }
  1350. } //if (pDevice->dwDiagRefCount != 0) {
  1351. pTxBufHead->wTimeStamp = DEFAULT_MSDU_LIFETIME_RES_64us;
  1352. //Set FIFOCTL_LHEAD
  1353. if (pDevice->bLongHeader)
  1354. pTxBufHead->wFIFOCtl |= FIFOCTL_LHEAD;
  1355. if (pDevice->bSoftwareGenCrcErr) {
  1356. pTxBufHead->wFIFOCtl |= FIFOCTL_CRCDIS; // set tx descriptors to NO hardware CRC
  1357. }
  1358. //Set FRAGCTL_MACHDCNT
  1359. if (pDevice->bLongHeader) {
  1360. cbMACHdLen = WLAN_HDR_ADDR3_LEN + 6;
  1361. } else {
  1362. cbMACHdLen = WLAN_HDR_ADDR3_LEN;
  1363. }
  1364. pTxBufHead->wFragCtl |= (WORD)(cbMACHdLen << 10);
  1365. //Set FIFOCTL_GrpAckPolicy
  1366. if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
  1367. pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
  1368. }
  1369. //Set Auto Fallback Ctl
  1370. if (wCurrentRate >= RATE_18M) {
  1371. if (pDevice->byAutoFBCtrl == AUTO_FB_0) {
  1372. pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0;
  1373. byFBOption = AUTO_FB_0;
  1374. } else if (pDevice->byAutoFBCtrl == AUTO_FB_1) {
  1375. pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1;
  1376. byFBOption = AUTO_FB_1;
  1377. }
  1378. }
  1379. if (bSoftWEP != TRUE) {
  1380. if ((bNeedEncryption) && (pTransmitKey != NULL)) { //WEP enabled
  1381. if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104
  1382. pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
  1383. }
  1384. if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
  1385. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Tx Set wFragCtl == FRAGCTL_TKIP\n");
  1386. pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
  1387. }
  1388. else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP
  1389. pTxBufHead->wFragCtl |= FRAGCTL_AES;
  1390. }
  1391. }
  1392. }
  1393. if ((bNeedEncryption) && (pTransmitKey != NULL)) {
  1394. if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) {
  1395. cbIVlen = 4;
  1396. cbICVlen = 4;
  1397. }
  1398. else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) {
  1399. cbIVlen = 8;//IV+ExtIV
  1400. cbMIClen = 8;
  1401. cbICVlen = 4;
  1402. }
  1403. if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) {
  1404. cbIVlen = 8;//RSN Header
  1405. cbICVlen = 8;//MIC
  1406. cbMICHDR = sizeof(SMICHDRHead);
  1407. }
  1408. if (bSoftWEP == FALSE) {
  1409. //MAC Header should be padding 0 to DW alignment.
  1410. uPadding = 4 - (cbMACHdLen%4);
  1411. uPadding %= 4;
  1412. }
  1413. }
  1414. cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen;
  1415. if ( (bNeedACK == FALSE) ||(cbFrameSize < pDevice->wRTSThreshold) ) {
  1416. bRTS = FALSE;
  1417. } else {
  1418. bRTS = TRUE;
  1419. pTxBufHead->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY);
  1420. }
  1421. pbyTxBufferAddr = (PBYTE) &(pTxBufHead->adwTxKey[0]);
  1422. wTxBufSize = sizeof(STxBufHead);
  1423. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
  1424. if (byFBOption == AUTO_FB_NONE) {
  1425. if (bRTS == TRUE) {//RTS_need
  1426. pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
  1427. pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
  1428. pvRTS = (PSRTS_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
  1429. pvCTS = NULL;
  1430. pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g));
  1431. cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g) + sizeof(STxDataHead_g);
  1432. }
  1433. else { //RTS_needless
  1434. pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
  1435. pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
  1436. pvRTS = NULL;
  1437. pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
  1438. pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
  1439. cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
  1440. }
  1441. } else {
  1442. // Auto Fall Back
  1443. if (bRTS == TRUE) {//RTS_need
  1444. pvRrvTime = (PSRrvTime_gRTS) (pbyTxBufferAddr + wTxBufSize);
  1445. pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS));
  1446. pvRTS = (PSRTS_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR);
  1447. pvCTS = NULL;
  1448. pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB));
  1449. cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gRTS) + cbMICHDR + sizeof(SRTS_g_FB) + sizeof(STxDataHead_g_FB);
  1450. }
  1451. else if (bRTS == FALSE) { //RTS_needless
  1452. pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
  1453. pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
  1454. pvRTS = NULL;
  1455. pvCTS = (PSCTS_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
  1456. pvTxDataHd = (PSTxDataHead_g_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB));
  1457. cbHeaderLength = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS_FB) + sizeof(STxDataHead_g_FB);
  1458. }
  1459. } // Auto Fall Back
  1460. }
  1461. else {//802.11a/b packet
  1462. if (byFBOption == AUTO_FB_NONE) {
  1463. if (bRTS == TRUE) {//RTS_need
  1464. pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
  1465. pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
  1466. pvRTS = (PSRTS_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
  1467. pvCTS = NULL;
  1468. pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab));
  1469. cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_ab) + sizeof(STxDataHead_ab);
  1470. }
  1471. else if (bRTS == FALSE) { //RTS_needless, no MICHDR
  1472. pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
  1473. pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
  1474. pvRTS = NULL;
  1475. pvCTS = NULL;
  1476. pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
  1477. cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
  1478. }
  1479. } else {
  1480. // Auto Fall Back
  1481. if (bRTS == TRUE) {//RTS_need
  1482. pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
  1483. pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
  1484. pvRTS = (PSRTS_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
  1485. pvCTS = NULL;
  1486. pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB));
  1487. cbHeaderLength = wTxBufSize + sizeof(PSRrvTime_ab) + cbMICHDR + sizeof(SRTS_a_FB) + sizeof(STxDataHead_a_FB);
  1488. }
  1489. else if (bRTS == FALSE) { //RTS_needless
  1490. pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
  1491. pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
  1492. pvRTS = NULL;
  1493. pvCTS = NULL;
  1494. pvTxDataHd = (PSTxDataHead_a_FB) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
  1495. cbHeaderLength = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_a_FB);
  1496. }
  1497. } // Auto Fall Back
  1498. }
  1499. pbyMacHdr = (PBYTE)(pbyTxBufferAddr + cbHeaderLength);
  1500. pbyIVHead = (PBYTE)(pbyMacHdr + cbMACHdLen + uPadding);
  1501. pbyPayloadHead = (PBYTE)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen);
  1502. //=========================
  1503. // No Fragmentation
  1504. //=========================
  1505. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Fragmentation...\n");
  1506. byFragType = FRAGCTL_NONFRAG;
  1507. //uDMAIdx = TYPE_AC0DMA;
  1508. //pTxBufHead = (PSTxBufHead) &(pTxBufHead->adwTxKey[0]);
  1509. //Fill FIFO,RrvTime,RTS,and CTS
  1510. s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate,
  1511. (void *)pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
  1512. cbFrameSize, bNeedACK, uDMAIdx, psEthHeader);
  1513. //Fill DataHead
  1514. uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, uDMAIdx, bNeedACK,
  1515. 0, 0, 1/*uMACfragNum*/, byFBOption);
  1516. // Generate TX MAC Header
  1517. s_vGenerateMACHeader(pDevice, pbyMacHdr, (WORD)uDuration, psEthHeader, bNeedEncryption,
  1518. byFragType, uDMAIdx, 0);
  1519. if (bNeedEncryption == TRUE) {
  1520. //Fill TXKEY
  1521. s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
  1522. pbyMacHdr, (WORD)cbFrameBodySize, (PBYTE)pMICHDR);
  1523. if (pDevice->bEnableHostWEP) {
  1524. pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
  1525. pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
  1526. }
  1527. }
  1528. // 802.1H
  1529. if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
  1530. if (pDevice->dwDiagRefCount == 0) {
  1531. if ((psEthHeader->wType == cpu_to_le16(ETH_P_IPX)) ||
  1532. (psEthHeader->wType == cpu_to_le16(0xF380))) {
  1533. memcpy((PBYTE) (pbyPayloadHead),
  1534. abySNAP_Bridgetunnel, 6);
  1535. } else {
  1536. memcpy((PBYTE) (pbyPayloadHead), &abySNAP_RFC1042[0], 6);
  1537. }
  1538. pbyType = (PBYTE) (pbyPayloadHead + 6);
  1539. memcpy(pbyType, &(psEthHeader->wType), sizeof(WORD));
  1540. } else {
  1541. memcpy((PBYTE) (pbyPayloadHead), &(psEthHeader->wType), sizeof(WORD));
  1542. }
  1543. }
  1544. if (pPacket != NULL) {
  1545. // Copy the Packet into a tx Buffer
  1546. memcpy((pbyPayloadHead + cb802_1_H_len),
  1547. (pPacket + ETH_HLEN),
  1548. uSkbPacketLen - ETH_HLEN
  1549. );
  1550. } else {
  1551. // while bRelayPacketSend psEthHeader is point to header+payload
  1552. memcpy((pbyPayloadHead + cb802_1_H_len), ((PBYTE)psEthHeader) + ETH_HLEN, uSkbPacketLen - ETH_HLEN);
  1553. }
  1554. ASSERT(uLength == cbNdisBodySize);
  1555. if ((bNeedEncryption == TRUE) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
  1556. ///////////////////////////////////////////////////////////////////
  1557. if (pDevice->sMgmtObj.eAuthenMode == WMAC_AUTH_WPANONE) {
  1558. dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
  1559. dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
  1560. }
  1561. else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) {
  1562. dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
  1563. dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
  1564. }
  1565. else {
  1566. dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[24]);
  1567. dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[28]);
  1568. }
  1569. // DO Software Michael
  1570. MIC_vInit(dwMICKey0, dwMICKey1);
  1571. MIC_vAppend((PBYTE)&(psEthHeader->abyDstAddr[0]), 12);
  1572. dwMIC_Priority = 0;
  1573. MIC_vAppend((PBYTE)&dwMIC_Priority, 4);
  1574. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
  1575. ///////////////////////////////////////////////////////////////////
  1576. //DBG_PRN_GRP12(("Length:%d, %d\n", cbFrameBodySize, uFromHDtoPLDLength));
  1577. //for (ii = 0; ii < cbFrameBodySize; ii++) {
  1578. // DBG_PRN_GRP12(("%02x ", *((PBYTE)((pbyPayloadHead + cb802_1_H_len) + ii))));
  1579. //}
  1580. //DBG_PRN_GRP12(("\n\n\n"));
  1581. MIC_vAppend(pbyPayloadHead, cbFrameBodySize);
  1582. pdwMIC_L = (PDWORD)(pbyPayloadHead + cbFrameBodySize);
  1583. pdwMIC_R = (PDWORD)(pbyPayloadHead + cbFrameBodySize + 4);
  1584. MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
  1585. MIC_vUnInit();
  1586. if (pDevice->bTxMICFail == TRUE) {
  1587. *pdwMIC_L = 0;
  1588. *pdwMIC_R = 0;
  1589. pDevice->bTxMICFail = FALSE;
  1590. }
  1591. //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
  1592. //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderLength, uPadding, cbIVlen);
  1593. //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R);
  1594. }
  1595. if (bSoftWEP == TRUE) {
  1596. s_vSWencryption(pDevice, pTransmitKey, (pbyPayloadHead), (WORD)(cbFrameBodySize + cbMIClen));
  1597. } else if ( ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) && (bNeedEncryption == TRUE)) ||
  1598. ((pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) && (bNeedEncryption == TRUE)) ||
  1599. ((pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) && (bNeedEncryption == TRUE)) ) {
  1600. cbFrameSize -= cbICVlen;
  1601. }
  1602. if (pDevice->bSoftwareGenCrcErr == TRUE) {
  1603. unsigned int cbLen;
  1604. PDWORD pdwCRC;
  1605. dwCRC = 0xFFFFFFFFL;
  1606. cbLen = cbFrameSize - cbFCSlen;
  1607. // calculate CRC, and wrtie CRC value to end of TD
  1608. dwCRC = CRCdwGetCrc32Ex(pbyMacHdr, cbLen, dwCRC);
  1609. pdwCRC = (PDWORD)(pbyMacHdr + cbLen);
  1610. // finally, we must invert dwCRC to get the correct answer
  1611. *pdwCRC = ~dwCRC;
  1612. // Force Error
  1613. *pdwCRC -= 1;
  1614. } else {
  1615. cbFrameSize -= cbFCSlen;
  1616. }
  1617. *pcbHeaderLen = cbHeaderLength;
  1618. *pcbTotalLen = cbHeaderLength + cbFrameSize ;
  1619. //Set FragCtl in TxBufferHead
  1620. pTxBufHead->wFragCtl |= (WORD)byFragType;
  1621. return TRUE;
  1622. }
  1623. /*+
  1624. *
  1625. * Description:
  1626. * Translate 802.3 to 802.11 header
  1627. *
  1628. * Parameters:
  1629. * In:
  1630. * pDevice - Pointer to adpater
  1631. * dwTxBufferAddr - Transmit Buffer
  1632. * pPacket - Packet from upper layer
  1633. * cbPacketSize - Transmit Data Length
  1634. * Out:
  1635. * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header
  1636. * pcbAppendPayload - size of append payload for 802.1H translation
  1637. *
  1638. * Return Value: none
  1639. *
  1640. -*/
  1641. void
  1642. s_vGenerateMACHeader (
  1643. PSDevice pDevice,
  1644. PBYTE pbyBufferAddr,
  1645. WORD wDuration,
  1646. PSEthernetHeader psEthHeader,
  1647. BOOL bNeedEncrypt,
  1648. WORD wFragType,
  1649. unsigned int uDMAIdx,
  1650. unsigned int uFragIdx
  1651. )
  1652. {
  1653. PS802_11Header pMACHeader = (PS802_11Header)pbyBufferAddr;
  1654. memset(pMACHeader, 0, (sizeof(S802_11Header))); //- sizeof(pMACHeader->dwIV)));
  1655. if (uDMAIdx == TYPE_ATIMDMA) {
  1656. pMACHeader->wFrameCtl = TYPE_802_11_ATIM;
  1657. } else {
  1658. pMACHeader->wFrameCtl = TYPE_802_11_DATA;
  1659. }
  1660. if (pDevice->eOPMode == OP_MODE_AP) {
  1661. memcpy(&(pMACHeader->abyAddr1[0]),
  1662. &(psEthHeader->abyDstAddr[0]),
  1663. ETH_ALEN);
  1664. memcpy(&(pMACHeader->abyAddr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN);
  1665. memcpy(&(pMACHeader->abyAddr3[0]),
  1666. &(psEthHeader->abySrcAddr[0]),
  1667. ETH_ALEN);
  1668. pMACHeader->wFrameCtl |= FC_FROMDS;
  1669. } else {
  1670. if (pDevice->eOPMode == OP_MODE_ADHOC) {
  1671. memcpy(&(pMACHeader->abyAddr1[0]),
  1672. &(psEthHeader->abyDstAddr[0]),
  1673. ETH_ALEN);
  1674. memcpy(&(pMACHeader->abyAddr2[0]),
  1675. &(psEthHeader->abySrcAddr[0]),
  1676. ETH_ALEN);
  1677. memcpy(&(pMACHeader->abyAddr3[0]),
  1678. &(pDevice->abyBSSID[0]),
  1679. ETH_ALEN);
  1680. } else {
  1681. memcpy(&(pMACHeader->abyAddr3[0]),
  1682. &(psEthHeader->abyDstAddr[0]),
  1683. ETH_ALEN);
  1684. memcpy(&(pMACHeader->abyAddr2[0]),
  1685. &(psEthHeader->abySrcAddr[0]),
  1686. ETH_ALEN);
  1687. memcpy(&(pMACHeader->abyAddr1[0]),
  1688. &(pDevice->abyBSSID[0]),
  1689. ETH_ALEN);
  1690. pMACHeader->wFrameCtl |= FC_TODS;
  1691. }
  1692. }
  1693. if (bNeedEncrypt)
  1694. pMACHeader->wFrameCtl |= cpu_to_le16((WORD)WLAN_SET_FC_ISWEP(1));
  1695. pMACHeader->wDurationID = cpu_to_le16(wDuration);
  1696. if (pDevice->bLongHeader) {
  1697. PWLAN_80211HDR_A4 pMACA4Header = (PWLAN_80211HDR_A4) pbyBufferAddr;
  1698. pMACHeader->wFrameCtl |= (FC_TODS | FC_FROMDS);
  1699. memcpy(pMACA4Header->abyAddr4, pDevice->abyBSSID, WLAN_ADDR_LEN);
  1700. }
  1701. pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
  1702. //Set FragNumber in Sequence Control
  1703. pMACHeader->wSeqCtl |= cpu_to_le16((WORD)uFragIdx);
  1704. if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) {
  1705. pDevice->wSeqCounter++;
  1706. if (pDevice->wSeqCounter > 0x0fff)
  1707. pDevice->wSeqCounter = 0;
  1708. }
  1709. if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) { //StartFrag or MidFrag
  1710. pMACHeader->wFrameCtl |= FC_MOREFRAG;
  1711. }
  1712. }
  1713. /*+
  1714. *
  1715. * Description:
  1716. * Request instructs a MAC to transmit a 802.11 management packet through
  1717. * the adapter onto the medium.
  1718. *
  1719. * Parameters:
  1720. * In:
  1721. * hDeviceContext - Pointer to the adapter
  1722. * pPacket - A pointer to a descriptor for the packet to transmit
  1723. * Out:
  1724. * none
  1725. *
  1726. * Return Value: CMD_STATUS_PENDING if MAC Tx resource available; otherwise FALSE
  1727. *
  1728. -*/
  1729. CMD_STATUS csMgmt_xmit(
  1730. PSDevice pDevice,
  1731. PSTxMgmtPacket pPacket
  1732. )
  1733. {
  1734. BYTE byPktType;
  1735. PBYTE pbyTxBufferAddr;
  1736. void *pvRTS;
  1737. PSCTS pCTS;
  1738. void *pvTxDataHd;
  1739. unsigned int uDuration;
  1740. unsigned int cbReqCount;
  1741. PS802_11Header pMACHeader;
  1742. unsigned int cbHeaderSize;
  1743. unsigned int cbFrameBodySize;
  1744. BOOL bNeedACK;
  1745. BOOL bIsPSPOLL = FALSE;
  1746. PSTxBufHead pTxBufHead;
  1747. unsigned int cbFrameSize;
  1748. unsigned int cbIVlen = 0;
  1749. unsigned int cbICVlen = 0;
  1750. unsigned int cbMIClen = 0;
  1751. unsigned int cbFCSlen = 4;
  1752. unsigned int uPadding = 0;
  1753. WORD wTxBufSize;
  1754. unsigned int cbMacHdLen;
  1755. SEthernetHeader sEthHeader;
  1756. void *pvRrvTime;
  1757. void *pMICHDR;
  1758. PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
  1759. WORD wCurrentRate = RATE_1M;
  1760. PTX_BUFFER pTX_Buffer;
  1761. PUSB_SEND_CONTEXT pContext;
  1762. pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
  1763. if (NULL == pContext) {
  1764. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n");
  1765. return CMD_STATUS_RESOURCES;
  1766. }
  1767. pTX_Buffer = (PTX_BUFFER) (&pContext->Data[0]);
  1768. pbyTxBufferAddr = (PBYTE)&(pTX_Buffer->adwTxKey[0]);
  1769. cbFrameBodySize = pPacket->cbPayloadLen;
  1770. pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
  1771. wTxBufSize = sizeof(STxBufHead);
  1772. memset(pTxBufHead, 0, wTxBufSize);
  1773. if (pDevice->byBBType == BB_TYPE_11A) {
  1774. wCurrentRate = RATE_6M;
  1775. byPktType = PK_TYPE_11A;
  1776. } else {
  1777. wCurrentRate = RATE_1M;
  1778. byPktType = PK_TYPE_11B;
  1779. }
  1780. // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
  1781. // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
  1782. // And cmd timer will wait data pkt TX finish before scanning so it's OK
  1783. // to set power here.
  1784. if (pMgmt->eScanState != WMAC_NO_SCANNING) {
  1785. RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
  1786. } else {
  1787. RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
  1788. }
  1789. pDevice->wCurrentRate = wCurrentRate;
  1790. //Set packet type
  1791. if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
  1792. pTxBufHead->wFIFOCtl = 0;
  1793. }
  1794. else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
  1795. pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
  1796. }
  1797. else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
  1798. pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
  1799. }
  1800. else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
  1801. pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
  1802. }
  1803. pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
  1804. pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
  1805. if (is_multicast_ether_addr(pPacket->p80211Header->sA3.abyAddr1)) {
  1806. bNeedACK = FALSE;
  1807. }
  1808. else {
  1809. bNeedACK = TRUE;
  1810. pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
  1811. };
  1812. if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
  1813. (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
  1814. pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
  1815. //Set Preamble type always long
  1816. //pDevice->byPreambleType = PREAMBLE_LONG;
  1817. // probe-response don't retry
  1818. //if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
  1819. // bNeedACK = FALSE;
  1820. // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
  1821. //}
  1822. }
  1823. pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
  1824. if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
  1825. bIsPSPOLL = TRUE;
  1826. cbMacHdLen = WLAN_HDR_ADDR2_LEN;
  1827. } else {
  1828. cbMacHdLen = WLAN_HDR_ADDR3_LEN;
  1829. }
  1830. //Set FRAGCTL_MACHDCNT
  1831. pTxBufHead->wFragCtl |= cpu_to_le16((WORD)(cbMacHdLen << 10));
  1832. // Notes:
  1833. // Although spec says MMPDU can be fragmented; In most case,
  1834. // no one will send a MMPDU under fragmentation. With RTS may occur.
  1835. pDevice->bAES = FALSE; //Set FRAGCTL_WEPTYP
  1836. if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
  1837. if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
  1838. cbIVlen = 4;
  1839. cbICVlen = 4;
  1840. pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
  1841. }
  1842. else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
  1843. cbIVlen = 8;//IV+ExtIV
  1844. cbMIClen = 8;
  1845. cbICVlen = 4;
  1846. pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
  1847. //We need to get seed here for filling TxKey entry.
  1848. //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
  1849. // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
  1850. }
  1851. else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
  1852. cbIVlen = 8;//RSN Header
  1853. cbICVlen = 8;//MIC
  1854. pTxBufHead->wFragCtl |= FRAGCTL_AES;
  1855. pDevice->bAES = TRUE;
  1856. }
  1857. //MAC Header should be padding 0 to DW alignment.
  1858. uPadding = 4 - (cbMacHdLen%4);
  1859. uPadding %= 4;
  1860. }
  1861. cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen;
  1862. //Set FIFOCTL_GrpAckPolicy
  1863. if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
  1864. pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
  1865. }
  1866. //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
  1867. //Set RrvTime/RTS/CTS Buffer
  1868. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
  1869. pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
  1870. pMICHDR = NULL;
  1871. pvRTS = NULL;
  1872. pCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
  1873. pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS));
  1874. cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + sizeof(SCTS) + sizeof(STxDataHead_g);
  1875. }
  1876. else { // 802.11a/b packet
  1877. pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
  1878. pMICHDR = NULL;
  1879. pvRTS = NULL;
  1880. pCTS = NULL;
  1881. pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
  1882. cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + sizeof(STxDataHead_ab);
  1883. }
  1884. memset((void *)(pbyTxBufferAddr + wTxBufSize), 0,
  1885. (cbHeaderSize - wTxBufSize));
  1886. memcpy(&(sEthHeader.abyDstAddr[0]),
  1887. &(pPacket->p80211Header->sA3.abyAddr1[0]),
  1888. ETH_ALEN);
  1889. memcpy(&(sEthHeader.abySrcAddr[0]),
  1890. &(pPacket->p80211Header->sA3.abyAddr2[0]),
  1891. ETH_ALEN);
  1892. //=========================
  1893. // No Fragmentation
  1894. //=========================
  1895. pTxBufHead->wFragCtl |= (WORD)FRAGCTL_NONFRAG;
  1896. //Fill FIFO,RrvTime,RTS,and CTS
  1897. s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, pbyTxBufferAddr, pvRrvTime, pvRTS, pCTS,
  1898. cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader);
  1899. //Fill DataHead
  1900. uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
  1901. 0, 0, 1, AUTO_FB_NONE);
  1902. pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
  1903. cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize;
  1904. if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) {
  1905. PBYTE pbyIVHead;
  1906. PBYTE pbyPayloadHead;
  1907. PBYTE pbyBSSID;
  1908. PSKeyItem pTransmitKey = NULL;
  1909. pbyIVHead = (PBYTE)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding);
  1910. pbyPayloadHead = (PBYTE)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen);
  1911. do {
  1912. if ((pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) &&
  1913. (pDevice->bLinkPass == TRUE)) {
  1914. pbyBSSID = pDevice->abyBSSID;
  1915. // get pairwise key
  1916. if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) {
  1917. // get group key
  1918. if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) {
  1919. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
  1920. break;
  1921. }
  1922. } else {
  1923. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get PTK.\n");
  1924. break;
  1925. }
  1926. }
  1927. // get group key
  1928. pbyBSSID = pDevice->abyBroadcastAddr;
  1929. if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
  1930. pTransmitKey = NULL;
  1931. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KEY is NULL. OP Mode[%d]\n", pDevice->eOPMode);
  1932. } else {
  1933. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n");
  1934. }
  1935. } while(FALSE);
  1936. //Fill TXKEY
  1937. s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
  1938. (PBYTE)pMACHeader, (WORD)cbFrameBodySize, NULL);
  1939. memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen);
  1940. memcpy(pbyPayloadHead, ((PBYTE)(pPacket->p80211Header) + cbMacHdLen),
  1941. cbFrameBodySize);
  1942. }
  1943. else {
  1944. // Copy the Packet into a tx Buffer
  1945. memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
  1946. }
  1947. pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
  1948. pDevice->wSeqCounter++ ;
  1949. if (pDevice->wSeqCounter > 0x0fff)
  1950. pDevice->wSeqCounter = 0;
  1951. if (bIsPSPOLL) {
  1952. // The MAC will automatically replace the Duration-field of MAC header by Duration-field
  1953. // of FIFO control header.
  1954. // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
  1955. // in the same place of other packet's Duration-field).
  1956. // And it will cause Cisco-AP to issue Disassociation-packet
  1957. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
  1958. ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
  1959. ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
  1960. } else {
  1961. ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(pPacket->p80211Header->sA2.wDurationID);
  1962. }
  1963. }
  1964. pTX_Buffer->wTxByteCount = cpu_to_le16((WORD)(cbReqCount));
  1965. pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
  1966. pTX_Buffer->byType = 0x00;
  1967. pContext->pPacket = NULL;
  1968. pContext->Type = CONTEXT_MGMT_PACKET;
  1969. pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
  1970. if (WLAN_GET_FC_TODS(pMACHeader->wFrameCtl) == 0) {
  1971. s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr1[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
  1972. }
  1973. else {
  1974. s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr3[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
  1975. }
  1976. PIPEnsSendBulkOut(pDevice,pContext);
  1977. return CMD_STATUS_PENDING;
  1978. }
  1979. CMD_STATUS
  1980. csBeacon_xmit(
  1981. PSDevice pDevice,
  1982. PSTxMgmtPacket pPacket
  1983. )
  1984. {
  1985. unsigned int cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN;
  1986. unsigned int cbHeaderSize = 0;
  1987. WORD wTxBufSize = sizeof(STxShortBufHead);
  1988. PSTxShortBufHead pTxBufHead;
  1989. PS802_11Header pMACHeader;
  1990. PSTxDataHead_ab pTxDataHead;
  1991. WORD wCurrentRate;
  1992. unsigned int cbFrameBodySize;
  1993. unsigned int cbReqCount;
  1994. PBEACON_BUFFER pTX_Buffer;
  1995. PBYTE pbyTxBufferAddr;
  1996. PUSB_SEND_CONTEXT pContext;
  1997. CMD_STATUS status;
  1998. pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
  1999. if (NULL == pContext) {
  2000. status = CMD_STATUS_RESOURCES;
  2001. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n");
  2002. return status ;
  2003. }
  2004. pTX_Buffer = (PBEACON_BUFFER) (&pContext->Data[0]);
  2005. pbyTxBufferAddr = (PBYTE)&(pTX_Buffer->wFIFOCtl);
  2006. cbFrameBodySize = pPacket->cbPayloadLen;
  2007. pTxBufHead = (PSTxShortBufHead) pbyTxBufferAddr;
  2008. wTxBufSize = sizeof(STxShortBufHead);
  2009. memset(pTxBufHead, 0, wTxBufSize);
  2010. if (pDevice->byBBType == BB_TYPE_11A) {
  2011. wCurrentRate = RATE_6M;
  2012. pTxDataHead = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize);
  2013. //Get SignalField,ServiceField,Length
  2014. BBvCaculateParameter(pDevice, cbFrameSize, wCurrentRate, PK_TYPE_11A,
  2015. (PWORD)&(pTxDataHead->wTransmitLength), (PBYTE)&(pTxDataHead->byServiceField), (PBYTE)&(pTxDataHead->bySignalField)
  2016. );
  2017. //Get Duration and TimeStampOff
  2018. pTxDataHead->wDuration = cpu_to_le16((WORD)s_uGetDataDuration(pDevice, DATADUR_A, cbFrameSize, PK_TYPE_11A,
  2019. wCurrentRate, FALSE, 0, 0, 1, AUTO_FB_NONE));
  2020. pTxDataHead->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
  2021. cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
  2022. } else {
  2023. wCurrentRate = RATE_1M;
  2024. pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
  2025. pTxDataHead = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize);
  2026. //Get SignalField,ServiceField,Length
  2027. BBvCaculateParameter(pDevice, cbFrameSize, wCurrentRate, PK_TYPE_11B,
  2028. (PWORD)&(pTxDataHead->wTransmitLength), (PBYTE)&(pTxDataHead->byServiceField), (PBYTE)&(pTxDataHead->bySignalField)
  2029. );
  2030. //Get Duration and TimeStampOff
  2031. pTxDataHead->wDuration = cpu_to_le16((WORD)s_uGetDataDuration(pDevice, DATADUR_B, cbFrameSize, PK_TYPE_11B,
  2032. wCurrentRate, FALSE, 0, 0, 1, AUTO_FB_NONE));
  2033. pTxDataHead->wTimeStampOff = wTimeStampOff[pDevice->byPreambleType%2][wCurrentRate%MAX_RATE];
  2034. cbHeaderSize = wTxBufSize + sizeof(STxDataHead_ab);
  2035. }
  2036. //Generate Beacon Header
  2037. pMACHeader = (PS802_11Header)(pbyTxBufferAddr + cbHeaderSize);
  2038. memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen);
  2039. pMACHeader->wDurationID = 0;
  2040. pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
  2041. pDevice->wSeqCounter++ ;
  2042. if (pDevice->wSeqCounter > 0x0fff)
  2043. pDevice->wSeqCounter = 0;
  2044. cbReqCount = cbHeaderSize + WLAN_HDR_ADDR3_LEN + cbFrameBodySize;
  2045. pTX_Buffer->wTxByteCount = (WORD)cbReqCount;
  2046. pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
  2047. pTX_Buffer->byType = 0x01;
  2048. pContext->pPacket = NULL;
  2049. pContext->Type = CONTEXT_MGMT_PACKET;
  2050. pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
  2051. PIPEnsSendBulkOut(pDevice,pContext);
  2052. return CMD_STATUS_PENDING;
  2053. }
  2054. void
  2055. vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb) {
  2056. PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
  2057. BYTE byPktType;
  2058. PBYTE pbyTxBufferAddr;
  2059. void *pvRTS;
  2060. void *pvCTS;
  2061. void *pvTxDataHd;
  2062. unsigned int uDuration;
  2063. unsigned int cbReqCount;
  2064. PS802_11Header pMACHeader;
  2065. unsigned int cbHeaderSize;
  2066. unsigned int cbFrameBodySize;
  2067. BOOL bNeedACK;
  2068. BOOL bIsPSPOLL = FALSE;
  2069. PSTxBufHead pTxBufHead;
  2070. unsigned int cbFrameSize;
  2071. unsigned int cbIVlen = 0;
  2072. unsigned int cbICVlen = 0;
  2073. unsigned int cbMIClen = 0;
  2074. unsigned int cbFCSlen = 4;
  2075. unsigned int uPadding = 0;
  2076. unsigned int cbMICHDR = 0;
  2077. unsigned int uLength = 0;
  2078. DWORD dwMICKey0, dwMICKey1;
  2079. DWORD dwMIC_Priority;
  2080. PDWORD pdwMIC_L;
  2081. PDWORD pdwMIC_R;
  2082. WORD wTxBufSize;
  2083. unsigned int cbMacHdLen;
  2084. SEthernetHeader sEthHeader;
  2085. void *pvRrvTime;
  2086. void *pMICHDR;
  2087. WORD wCurrentRate = RATE_1M;
  2088. PUWLAN_80211HDR p80211Header;
  2089. unsigned int uNodeIndex = 0;
  2090. BOOL bNodeExist = FALSE;
  2091. SKeyItem STempKey;
  2092. PSKeyItem pTransmitKey = NULL;
  2093. PBYTE pbyIVHead;
  2094. PBYTE pbyPayloadHead;
  2095. PBYTE pbyMacHdr;
  2096. unsigned int cbExtSuppRate = 0;
  2097. PTX_BUFFER pTX_Buffer;
  2098. PUSB_SEND_CONTEXT pContext;
  2099. // PWLAN_IE pItem;
  2100. pvRrvTime = pMICHDR = pvRTS = pvCTS = pvTxDataHd = NULL;
  2101. if(skb->len <= WLAN_HDR_ADDR3_LEN) {
  2102. cbFrameBodySize = 0;
  2103. }
  2104. else {
  2105. cbFrameBodySize = skb->len - WLAN_HDR_ADDR3_LEN;
  2106. }
  2107. p80211Header = (PUWLAN_80211HDR)skb->data;
  2108. pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
  2109. if (NULL == pContext) {
  2110. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0 TX...NO CONTEXT!\n");
  2111. dev_kfree_skb_irq(skb);
  2112. return ;
  2113. }
  2114. pTX_Buffer = (PTX_BUFFER)(&pContext->Data[0]);
  2115. pbyTxBufferAddr = (PBYTE)(&pTX_Buffer->adwTxKey[0]);
  2116. pTxBufHead = (PSTxBufHead) pbyTxBufferAddr;
  2117. wTxBufSize = sizeof(STxBufHead);
  2118. memset(pTxBufHead, 0, wTxBufSize);
  2119. if (pDevice->byBBType == BB_TYPE_11A) {
  2120. wCurrentRate = RATE_6M;
  2121. byPktType = PK_TYPE_11A;
  2122. } else {
  2123. wCurrentRate = RATE_1M;
  2124. byPktType = PK_TYPE_11B;
  2125. }
  2126. // SetPower will cause error power TX state for OFDM Date packet in TX buffer.
  2127. // 2004.11.11 Kyle -- Using OFDM power to tx MngPkt will decrease the connection capability.
  2128. // And cmd timer will wait data pkt TX finish before scanning so it's OK
  2129. // to set power here.
  2130. if (pMgmt->eScanState != WMAC_NO_SCANNING) {
  2131. RFbSetPower(pDevice, wCurrentRate, pDevice->byCurrentCh);
  2132. } else {
  2133. RFbSetPower(pDevice, wCurrentRate, pMgmt->uCurrChannel);
  2134. }
  2135. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vDMA0_tx_80211: p80211Header->sA3.wFrameCtl = %x \n", p80211Header->sA3.wFrameCtl);
  2136. //Set packet type
  2137. if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000
  2138. pTxBufHead->wFIFOCtl = 0;
  2139. }
  2140. else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000
  2141. pTxBufHead->wFIFOCtl |= FIFOCTL_11B;
  2142. }
  2143. else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000
  2144. pTxBufHead->wFIFOCtl |= FIFOCTL_11GB;
  2145. }
  2146. else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000
  2147. pTxBufHead->wFIFOCtl |= FIFOCTL_11GA;
  2148. }
  2149. pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN;
  2150. pTxBufHead->wTimeStamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us);
  2151. if (is_multicast_ether_addr(p80211Header->sA3.abyAddr1)) {
  2152. bNeedACK = FALSE;
  2153. if (pDevice->bEnableHostWEP) {
  2154. uNodeIndex = 0;
  2155. bNodeExist = TRUE;
  2156. }
  2157. }
  2158. else {
  2159. if (pDevice->bEnableHostWEP) {
  2160. if (BSSbIsSTAInNodeDB(pDevice, (PBYTE)(p80211Header->sA3.abyAddr1), &uNodeIndex))
  2161. bNodeExist = TRUE;
  2162. }
  2163. bNeedACK = TRUE;
  2164. pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK;
  2165. };
  2166. if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
  2167. (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) {
  2168. pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY;
  2169. //Set Preamble type always long
  2170. //pDevice->byPreambleType = PREAMBLE_LONG;
  2171. // probe-response don't retry
  2172. //if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) {
  2173. // bNeedACK = FALSE;
  2174. // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK);
  2175. //}
  2176. }
  2177. pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0);
  2178. if ((p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) {
  2179. bIsPSPOLL = TRUE;
  2180. cbMacHdLen = WLAN_HDR_ADDR2_LEN;
  2181. } else {
  2182. cbMacHdLen = WLAN_HDR_ADDR3_LEN;
  2183. }
  2184. // hostapd deamon ext support rate patch
  2185. if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
  2186. if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0) {
  2187. cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN;
  2188. }
  2189. if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0) {
  2190. cbExtSuppRate += ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
  2191. }
  2192. if (cbExtSuppRate >0) {
  2193. cbFrameBodySize = WLAN_ASSOCRESP_OFF_SUPP_RATES;
  2194. }
  2195. }
  2196. //Set FRAGCTL_MACHDCNT
  2197. pTxBufHead->wFragCtl |= cpu_to_le16((WORD)cbMacHdLen << 10);
  2198. // Notes:
  2199. // Although spec says MMPDU can be fragmented; In most case,
  2200. // no one will send a MMPDU under fragmentation. With RTS may occur.
  2201. pDevice->bAES = FALSE; //Set FRAGCTL_WEPTYP
  2202. if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
  2203. if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) {
  2204. cbIVlen = 4;
  2205. cbICVlen = 4;
  2206. pTxBufHead->wFragCtl |= FRAGCTL_LEGACY;
  2207. }
  2208. else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
  2209. cbIVlen = 8;//IV+ExtIV
  2210. cbMIClen = 8;
  2211. cbICVlen = 4;
  2212. pTxBufHead->wFragCtl |= FRAGCTL_TKIP;
  2213. //We need to get seed here for filling TxKey entry.
  2214. //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr,
  2215. // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG);
  2216. }
  2217. else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
  2218. cbIVlen = 8;//RSN Header
  2219. cbICVlen = 8;//MIC
  2220. cbMICHDR = sizeof(SMICHDRHead);
  2221. pTxBufHead->wFragCtl |= FRAGCTL_AES;
  2222. pDevice->bAES = TRUE;
  2223. }
  2224. //MAC Header should be padding 0 to DW alignment.
  2225. uPadding = 4 - (cbMacHdLen%4);
  2226. uPadding %= 4;
  2227. }
  2228. cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen + cbExtSuppRate;
  2229. //Set FIFOCTL_GrpAckPolicy
  2230. if (pDevice->bGrpAckPolicy == TRUE) {//0000 0100 0000 0000
  2231. pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK;
  2232. }
  2233. //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter()
  2234. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet
  2235. pvRrvTime = (PSRrvTime_gCTS) (pbyTxBufferAddr + wTxBufSize);
  2236. pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS));
  2237. pvRTS = NULL;
  2238. pvCTS = (PSCTS) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR);
  2239. pvTxDataHd = (PSTxDataHead_g) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS));
  2240. cbHeaderSize = wTxBufSize + sizeof(SRrvTime_gCTS) + cbMICHDR + sizeof(SCTS) + sizeof(STxDataHead_g);
  2241. }
  2242. else {//802.11a/b packet
  2243. pvRrvTime = (PSRrvTime_ab) (pbyTxBufferAddr + wTxBufSize);
  2244. pMICHDR = (PSMICHDRHead) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab));
  2245. pvRTS = NULL;
  2246. pvCTS = NULL;
  2247. pvTxDataHd = (PSTxDataHead_ab) (pbyTxBufferAddr + wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR);
  2248. cbHeaderSize = wTxBufSize + sizeof(SRrvTime_ab) + cbMICHDR + sizeof(STxDataHead_ab);
  2249. }
  2250. memset((void *)(pbyTxBufferAddr + wTxBufSize), 0,
  2251. (cbHeaderSize - wTxBufSize));
  2252. memcpy(&(sEthHeader.abyDstAddr[0]),
  2253. &(p80211Header->sA3.abyAddr1[0]),
  2254. ETH_ALEN);
  2255. memcpy(&(sEthHeader.abySrcAddr[0]),
  2256. &(p80211Header->sA3.abyAddr2[0]),
  2257. ETH_ALEN);
  2258. //=========================
  2259. // No Fragmentation
  2260. //=========================
  2261. pTxBufHead->wFragCtl |= (WORD)FRAGCTL_NONFRAG;
  2262. //Fill FIFO,RrvTime,RTS,and CTS
  2263. s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, pbyTxBufferAddr, pvRrvTime, pvRTS, pvCTS,
  2264. cbFrameSize, bNeedACK, TYPE_TXDMA0, &sEthHeader);
  2265. //Fill DataHead
  2266. uDuration = s_uFillDataHead(pDevice, byPktType, wCurrentRate, pvTxDataHd, cbFrameSize, TYPE_TXDMA0, bNeedACK,
  2267. 0, 0, 1, AUTO_FB_NONE);
  2268. pMACHeader = (PS802_11Header) (pbyTxBufferAddr + cbHeaderSize);
  2269. cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + (cbFrameBodySize + cbMIClen) + cbExtSuppRate;
  2270. pbyMacHdr = (PBYTE)(pbyTxBufferAddr + cbHeaderSize);
  2271. pbyPayloadHead = (PBYTE)(pbyMacHdr + cbMacHdLen + uPadding + cbIVlen);
  2272. pbyIVHead = (PBYTE)(pbyMacHdr + cbMacHdLen + uPadding);
  2273. // Copy the Packet into a tx Buffer
  2274. memcpy(pbyMacHdr, skb->data, cbMacHdLen);
  2275. // version set to 0, patch for hostapd deamon
  2276. pMACHeader->wFrameCtl &= cpu_to_le16(0xfffc);
  2277. memcpy(pbyPayloadHead, (skb->data + cbMacHdLen), cbFrameBodySize);
  2278. // replace support rate, patch for hostapd deamon( only support 11M)
  2279. if (WLAN_GET_FC_FSTYPE(p80211Header->sA4.wFrameCtl) == WLAN_FSTYPE_ASSOCRESP) {
  2280. if (cbExtSuppRate != 0) {
  2281. if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len != 0)
  2282. memcpy((pbyPayloadHead + cbFrameBodySize),
  2283. pMgmt->abyCurrSuppRates,
  2284. ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN
  2285. );
  2286. if (((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len != 0)
  2287. memcpy((pbyPayloadHead + cbFrameBodySize) + ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates)->len + WLAN_IEHDR_LEN,
  2288. pMgmt->abyCurrExtSuppRates,
  2289. ((PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates)->len + WLAN_IEHDR_LEN
  2290. );
  2291. }
  2292. }
  2293. // Set wep
  2294. if (WLAN_GET_FC_ISWEP(p80211Header->sA4.wFrameCtl) != 0) {
  2295. if (pDevice->bEnableHostWEP) {
  2296. pTransmitKey = &STempKey;
  2297. pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
  2298. pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
  2299. pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
  2300. pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
  2301. pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
  2302. memcpy(pTransmitKey->abyKey,
  2303. &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
  2304. pTransmitKey->uKeyLength
  2305. );
  2306. }
  2307. if ((pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) {
  2308. dwMICKey0 = *(PDWORD)(&pTransmitKey->abyKey[16]);
  2309. dwMICKey1 = *(PDWORD)(&pTransmitKey->abyKey[20]);
  2310. // DO Software Michael
  2311. MIC_vInit(dwMICKey0, dwMICKey1);
  2312. MIC_vAppend((PBYTE)&(sEthHeader.abyDstAddr[0]), 12);
  2313. dwMIC_Priority = 0;
  2314. MIC_vAppend((PBYTE)&dwMIC_Priority, 4);
  2315. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0_tx_8021:MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1);
  2316. uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen;
  2317. MIC_vAppend((pbyTxBufferAddr + uLength), cbFrameBodySize);
  2318. pdwMIC_L = (PDWORD)(pbyTxBufferAddr + uLength + cbFrameBodySize);
  2319. pdwMIC_R = (PDWORD)(pbyTxBufferAddr + uLength + cbFrameBodySize + 4);
  2320. MIC_vGetMIC(pdwMIC_L, pdwMIC_R);
  2321. MIC_vUnInit();
  2322. if (pDevice->bTxMICFail == TRUE) {
  2323. *pdwMIC_L = 0;
  2324. *pdwMIC_R = 0;
  2325. pDevice->bTxMICFail = FALSE;
  2326. }
  2327. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize);
  2328. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderSize, uPadding, cbIVlen);
  2329. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lx, %lx\n", *pdwMIC_L, *pdwMIC_R);
  2330. }
  2331. s_vFillTxKey(pDevice, (PBYTE)(pTxBufHead->adwTxKey), pbyIVHead, pTransmitKey,
  2332. pbyMacHdr, (WORD)cbFrameBodySize, (PBYTE)pMICHDR);
  2333. if (pDevice->bEnableHostWEP) {
  2334. pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16 = pTransmitKey->dwTSC47_16;
  2335. pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0 = pTransmitKey->wTSC15_0;
  2336. }
  2337. if ((pDevice->byLocalID <= REV_ID_VT3253_A1)) {
  2338. s_vSWencryption(pDevice, pTransmitKey, pbyPayloadHead, (WORD)(cbFrameBodySize + cbMIClen));
  2339. }
  2340. }
  2341. pMACHeader->wSeqCtl = cpu_to_le16(pDevice->wSeqCounter << 4);
  2342. pDevice->wSeqCounter++ ;
  2343. if (pDevice->wSeqCounter > 0x0fff)
  2344. pDevice->wSeqCounter = 0;
  2345. if (bIsPSPOLL) {
  2346. // The MAC will automatically replace the Duration-field of MAC header by Duration-field
  2347. // of FIFO control header.
  2348. // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is
  2349. // in the same place of other packet's Duration-field).
  2350. // And it will cause Cisco-AP to issue Disassociation-packet
  2351. if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {
  2352. ((PSTxDataHead_g)pvTxDataHd)->wDuration_a = cpu_to_le16(p80211Header->sA2.wDurationID);
  2353. ((PSTxDataHead_g)pvTxDataHd)->wDuration_b = cpu_to_le16(p80211Header->sA2.wDurationID);
  2354. } else {
  2355. ((PSTxDataHead_ab)pvTxDataHd)->wDuration = cpu_to_le16(p80211Header->sA2.wDurationID);
  2356. }
  2357. }
  2358. pTX_Buffer->wTxByteCount = cpu_to_le16((WORD)(cbReqCount));
  2359. pTX_Buffer->byPKTNO = (BYTE) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
  2360. pTX_Buffer->byType = 0x00;
  2361. pContext->pPacket = skb;
  2362. pContext->Type = CONTEXT_MGMT_PACKET;
  2363. pContext->uBufLen = (WORD)cbReqCount + 4; //USB header
  2364. if (WLAN_GET_FC_TODS(pMACHeader->wFrameCtl) == 0) {
  2365. s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr1[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
  2366. }
  2367. else {
  2368. s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pMACHeader->abyAddr3[0]),(WORD)cbFrameSize,pTX_Buffer->wFIFOCtl);
  2369. }
  2370. PIPEnsSendBulkOut(pDevice,pContext);
  2371. return ;
  2372. }
  2373. //TYPE_AC0DMA data tx
  2374. /*
  2375. * Description:
  2376. * Tx packet via AC0DMA(DMA1)
  2377. *
  2378. * Parameters:
  2379. * In:
  2380. * pDevice - Pointer to the adapter
  2381. * skb - Pointer to tx skb packet
  2382. * Out:
  2383. * void
  2384. *
  2385. * Return Value: NULL
  2386. */
  2387. int nsDMA_tx_packet(PSDevice pDevice, unsigned int uDMAIdx, struct sk_buff *skb)
  2388. {
  2389. PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
  2390. unsigned int BytesToWrite = 0, uHeaderLen = 0;
  2391. unsigned int uNodeIndex = 0;
  2392. BYTE byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
  2393. WORD wAID;
  2394. BYTE byPktType;
  2395. BOOL bNeedEncryption = FALSE;
  2396. PSKeyItem pTransmitKey = NULL;
  2397. SKeyItem STempKey;
  2398. unsigned int ii;
  2399. BOOL bTKIP_UseGTK = FALSE;
  2400. BOOL bNeedDeAuth = FALSE;
  2401. PBYTE pbyBSSID;
  2402. BOOL bNodeExist = FALSE;
  2403. PUSB_SEND_CONTEXT pContext;
  2404. BOOL fConvertedPacket;
  2405. PTX_BUFFER pTX_Buffer;
  2406. unsigned int status;
  2407. WORD wKeepRate = pDevice->wCurrentRate;
  2408. struct net_device_stats* pStats = &pDevice->stats;
  2409. BOOL bTxeapol_key = FALSE;
  2410. if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
  2411. if (pDevice->uAssocCount == 0) {
  2412. dev_kfree_skb_irq(skb);
  2413. return 0;
  2414. }
  2415. if (is_multicast_ether_addr((PBYTE)(skb->data))) {
  2416. uNodeIndex = 0;
  2417. bNodeExist = TRUE;
  2418. if (pMgmt->sNodeDBTable[0].bPSEnable) {
  2419. skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skb);
  2420. pMgmt->sNodeDBTable[0].wEnQueueCnt++;
  2421. // set tx map
  2422. pMgmt->abyPSTxMap[0] |= byMask[0];
  2423. return 0;
  2424. }
  2425. // muticast/broadcast data rate
  2426. if (pDevice->byBBType != BB_TYPE_11A)
  2427. pDevice->wCurrentRate = RATE_2M;
  2428. else
  2429. pDevice->wCurrentRate = RATE_24M;
  2430. // long preamble type
  2431. pDevice->byPreambleType = PREAMBLE_SHORT;
  2432. }else {
  2433. if (BSSbIsSTAInNodeDB(pDevice, (PBYTE)(skb->data), &uNodeIndex)) {
  2434. if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
  2435. skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
  2436. pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
  2437. // set tx map
  2438. wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
  2439. pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
  2440. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set:pMgmt->abyPSTxMap[%d]= %d\n",
  2441. (wAID >> 3), pMgmt->abyPSTxMap[wAID >> 3]);
  2442. return 0;
  2443. }
  2444. // AP rate decided from node
  2445. pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
  2446. // tx preamble decided from node
  2447. if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
  2448. pDevice->byPreambleType = pDevice->byShortPreamble;
  2449. }else {
  2450. pDevice->byPreambleType = PREAMBLE_LONG;
  2451. }
  2452. bNodeExist = TRUE;
  2453. }
  2454. }
  2455. if (bNodeExist == FALSE) {
  2456. DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Unknown STA not found in node DB \n");
  2457. dev_kfree_skb_irq(skb);
  2458. return 0;
  2459. }
  2460. }
  2461. pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
  2462. if (pContext == NULL) {
  2463. DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG" pContext == NULL\n");
  2464. dev_kfree_skb_irq(skb);
  2465. return STATUS_RESOURCES;
  2466. }
  2467. memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)(skb->data), ETH_HLEN);
  2468. //mike add:station mode check eapol-key challenge--->
  2469. {
  2470. BYTE Protocol_Version; //802.1x Authentication
  2471. BYTE Packet_Type; //802.1x Authentication
  2472. BYTE Descriptor_type;
  2473. WORD Key_info;
  2474. Protocol_Version = skb->data[ETH_HLEN];
  2475. Packet_Type = skb->data[ETH_HLEN+1];
  2476. Descriptor_type = skb->data[ETH_HLEN+1+1+2];
  2477. Key_info = (skb->data[ETH_HLEN+1+1+2+1] << 8)|(skb->data[ETH_HLEN+1+1+2+2]);
  2478. if (pDevice->sTxEthHeader.wType == cpu_to_le16(ETH_P_PAE)) {
  2479. /* 802.1x OR eapol-key challenge frame transfer */
  2480. if (((Protocol_Version == 1) || (Protocol_Version == 2)) &&
  2481. (Packet_Type == 3)) {
  2482. bTxeapol_key = TRUE;
  2483. if(!(Key_info & BIT3) && //WPA or RSN group-key challenge
  2484. (Key_info & BIT8) && (Key_info & BIT9)) { //send 2/2 key
  2485. if(Descriptor_type==254) {
  2486. pDevice->fWPA_Authened = TRUE;
  2487. PRINT_K("WPA ");
  2488. }
  2489. else {
  2490. pDevice->fWPA_Authened = TRUE;
  2491. PRINT_K("WPA2(re-keying) ");
  2492. }
  2493. PRINT_K("Authentication completed!!\n");
  2494. }
  2495. else if((Key_info & BIT3) && (Descriptor_type==2) && //RSN pairse-key challenge
  2496. (Key_info & BIT8) && (Key_info & BIT9)) {
  2497. pDevice->fWPA_Authened = TRUE;
  2498. PRINT_K("WPA2 Authentication completed!!\n");
  2499. }
  2500. }
  2501. }
  2502. }
  2503. //mike add:station mode check eapol-key challenge<---
  2504. if (pDevice->bEncryptionEnable == TRUE) {
  2505. bNeedEncryption = TRUE;
  2506. // get Transmit key
  2507. do {
  2508. if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
  2509. (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
  2510. pbyBSSID = pDevice->abyBSSID;
  2511. // get pairwise key
  2512. if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == FALSE) {
  2513. // get group key
  2514. if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == TRUE) {
  2515. bTKIP_UseGTK = TRUE;
  2516. DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
  2517. break;
  2518. }
  2519. } else {
  2520. DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get PTK.\n");
  2521. break;
  2522. }
  2523. }else if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
  2524. pbyBSSID = pDevice->sTxEthHeader.abyDstAddr; //TO_DS = 0 and FROM_DS = 0 --> 802.11 MAC Address1
  2525. DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS Serach Key: \n");
  2526. for (ii = 0; ii< 6; ii++)
  2527. DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"%x \n", *(pbyBSSID+ii));
  2528. DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"\n");
  2529. // get pairwise key
  2530. if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == TRUE)
  2531. break;
  2532. }
  2533. // get group key
  2534. pbyBSSID = pDevice->abyBroadcastAddr;
  2535. if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
  2536. pTransmitKey = NULL;
  2537. if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
  2538. DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode);
  2539. }
  2540. else
  2541. DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"NOT IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode);
  2542. } else {
  2543. bTKIP_UseGTK = TRUE;
  2544. DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
  2545. }
  2546. } while(FALSE);
  2547. }
  2548. if (pDevice->bEnableHostWEP) {
  2549. DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"acdma0: STA index %d\n", uNodeIndex);
  2550. if (pDevice->bEncryptionEnable == TRUE) {
  2551. pTransmitKey = &STempKey;
  2552. pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
  2553. pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
  2554. pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
  2555. pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
  2556. pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
  2557. memcpy(pTransmitKey->abyKey,
  2558. &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
  2559. pTransmitKey->uKeyLength
  2560. );
  2561. }
  2562. }
  2563. byPktType = (BYTE)pDevice->byPacketType;
  2564. if (pDevice->bFixRate) {
  2565. if (pDevice->byBBType == BB_TYPE_11B) {
  2566. if (pDevice->uConnectionRate >= RATE_11M) {
  2567. pDevice->wCurrentRate = RATE_11M;
  2568. } else {
  2569. pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
  2570. }
  2571. } else {
  2572. if ((pDevice->byBBType == BB_TYPE_11A) &&
  2573. (pDevice->uConnectionRate <= RATE_6M)) {
  2574. pDevice->wCurrentRate = RATE_6M;
  2575. } else {
  2576. if (pDevice->uConnectionRate >= RATE_54M)
  2577. pDevice->wCurrentRate = RATE_54M;
  2578. else
  2579. pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
  2580. }
  2581. }
  2582. }
  2583. else {
  2584. if (pDevice->eOPMode == OP_MODE_ADHOC) {
  2585. // Adhoc Tx rate decided from node DB
  2586. if (is_multicast_ether_addr(pDevice->sTxEthHeader.abyDstAddr)) {
  2587. // Multicast use highest data rate
  2588. pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate;
  2589. // preamble type
  2590. pDevice->byPreambleType = pDevice->byShortPreamble;
  2591. }
  2592. else {
  2593. if(BSSbIsSTAInNodeDB(pDevice, &(pDevice->sTxEthHeader.abyDstAddr[0]), &uNodeIndex)) {
  2594. pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
  2595. if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) {
  2596. pDevice->byPreambleType = pDevice->byShortPreamble;
  2597. }
  2598. else {
  2599. pDevice->byPreambleType = PREAMBLE_LONG;
  2600. }
  2601. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Found Node Index is [%d] Tx Data Rate:[%d]\n",uNodeIndex, pDevice->wCurrentRate);
  2602. }
  2603. else {
  2604. if (pDevice->byBBType != BB_TYPE_11A)
  2605. pDevice->wCurrentRate = RATE_2M;
  2606. else
  2607. pDevice->wCurrentRate = RATE_24M; // refer to vMgrCreateOwnIBSS()'s
  2608. // abyCurrExtSuppRates[]
  2609. pDevice->byPreambleType = PREAMBLE_SHORT;
  2610. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Not Found Node use highest basic Rate.....\n");
  2611. }
  2612. }
  2613. }
  2614. if (pDevice->eOPMode == OP_MODE_INFRASTRUCTURE) {
  2615. // Infra STA rate decided from AP Node, index = 0
  2616. pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate;
  2617. }
  2618. }
  2619. if (pDevice->sTxEthHeader.wType == cpu_to_le16(ETH_P_PAE)) {
  2620. if (pDevice->byBBType != BB_TYPE_11A) {
  2621. pDevice->wCurrentRate = RATE_1M;
  2622. pDevice->byACKRate = RATE_1M;
  2623. pDevice->byTopCCKBasicRate = RATE_1M;
  2624. pDevice->byTopOFDMBasicRate = RATE_6M;
  2625. } else {
  2626. pDevice->wCurrentRate = RATE_6M;
  2627. pDevice->byACKRate = RATE_6M;
  2628. pDevice->byTopCCKBasicRate = RATE_1M;
  2629. pDevice->byTopOFDMBasicRate = RATE_6M;
  2630. }
  2631. }
  2632. DBG_PRT(MSG_LEVEL_DEBUG,
  2633. KERN_INFO "dma_tx: pDevice->wCurrentRate = %d\n",
  2634. pDevice->wCurrentRate);
  2635. if (wKeepRate != pDevice->wCurrentRate) {
  2636. bScheduleCommand((void *) pDevice, WLAN_CMD_SETPOWER, NULL);
  2637. }
  2638. if (pDevice->wCurrentRate <= RATE_11M) {
  2639. byPktType = PK_TYPE_11B;
  2640. }
  2641. if (bNeedEncryption == TRUE) {
  2642. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType));
  2643. if ((pDevice->sTxEthHeader.wType) == cpu_to_le16(ETH_P_PAE)) {
  2644. bNeedEncryption = FALSE;
  2645. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType));
  2646. if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
  2647. if (pTransmitKey == NULL) {
  2648. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Don't Find TX KEY\n");
  2649. }
  2650. else {
  2651. if (bTKIP_UseGTK == TRUE) {
  2652. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n");
  2653. }
  2654. else {
  2655. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
  2656. bNeedEncryption = TRUE;
  2657. }
  2658. }
  2659. }
  2660. if (pDevice->byCntMeasure == 2) {
  2661. bNeedDeAuth = TRUE;
  2662. pDevice->s802_11Counter.TKIPCounterMeasuresInvoked++;
  2663. }
  2664. if (pDevice->bEnableHostWEP) {
  2665. if ((uNodeIndex != 0) &&
  2666. (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) {
  2667. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex);
  2668. bNeedEncryption = TRUE;
  2669. }
  2670. }
  2671. }
  2672. else {
  2673. if (pTransmitKey == NULL) {
  2674. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n");
  2675. dev_kfree_skb_irq(skb);
  2676. pStats->tx_dropped++;
  2677. return STATUS_FAILURE;
  2678. }
  2679. }
  2680. }
  2681. fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType,
  2682. (PBYTE)(&pContext->Data[0]), bNeedEncryption,
  2683. skb->len, uDMAIdx, &pDevice->sTxEthHeader,
  2684. (PBYTE)skb->data, pTransmitKey, uNodeIndex,
  2685. pDevice->wCurrentRate,
  2686. &uHeaderLen, &BytesToWrite
  2687. );
  2688. if (fConvertedPacket == FALSE) {
  2689. pContext->bBoolInUse = FALSE;
  2690. dev_kfree_skb_irq(skb);
  2691. return STATUS_FAILURE;
  2692. }
  2693. if ( pDevice->bEnablePSMode == TRUE ) {
  2694. if ( !pDevice->bPSModeTxBurst ) {
  2695. bScheduleCommand((void *) pDevice,
  2696. WLAN_CMD_MAC_DISPOWERSAVING,
  2697. NULL);
  2698. pDevice->bPSModeTxBurst = TRUE;
  2699. }
  2700. }
  2701. pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]);
  2702. pTX_Buffer->byPKTNO = (BYTE) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
  2703. pTX_Buffer->wTxByteCount = (WORD)BytesToWrite;
  2704. pContext->pPacket = skb;
  2705. pContext->Type = CONTEXT_DATA_PACKET;
  2706. pContext->uBufLen = (WORD)BytesToWrite + 4 ; //USB header
  2707. s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.abyDstAddr[0]),(WORD) (BytesToWrite-uHeaderLen),pTX_Buffer->wFIFOCtl);
  2708. status = PIPEnsSendBulkOut(pDevice,pContext);
  2709. if (bNeedDeAuth == TRUE) {
  2710. WORD wReason = WLAN_MGMT_REASON_MIC_FAILURE;
  2711. bScheduleCommand((void *) pDevice, WLAN_CMD_DEAUTH, (PBYTE) &wReason);
  2712. }
  2713. if(status!=STATUS_PENDING) {
  2714. pContext->bBoolInUse = FALSE;
  2715. dev_kfree_skb_irq(skb);
  2716. return STATUS_FAILURE;
  2717. }
  2718. else
  2719. return 0;
  2720. }
  2721. /*
  2722. * Description:
  2723. * Relay packet send (AC1DMA) from rx dpc.
  2724. *
  2725. * Parameters:
  2726. * In:
  2727. * pDevice - Pointer to the adapter
  2728. * pPacket - Pointer to rx packet
  2729. * cbPacketSize - rx ethernet frame size
  2730. * Out:
  2731. * TURE, FALSE
  2732. *
  2733. * Return Value: Return TRUE if packet is copy to dma1; otherwise FALSE
  2734. */
  2735. BOOL
  2736. bRelayPacketSend (
  2737. PSDevice pDevice,
  2738. PBYTE pbySkbData,
  2739. unsigned int uDataLen,
  2740. unsigned int uNodeIndex
  2741. )
  2742. {
  2743. PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
  2744. unsigned int BytesToWrite = 0, uHeaderLen = 0;
  2745. BYTE byPktType = PK_TYPE_11B;
  2746. BOOL bNeedEncryption = FALSE;
  2747. SKeyItem STempKey;
  2748. PSKeyItem pTransmitKey = NULL;
  2749. PBYTE pbyBSSID;
  2750. PUSB_SEND_CONTEXT pContext;
  2751. BYTE byPktTyp;
  2752. BOOL fConvertedPacket;
  2753. PTX_BUFFER pTX_Buffer;
  2754. unsigned int status;
  2755. WORD wKeepRate = pDevice->wCurrentRate;
  2756. pContext = (PUSB_SEND_CONTEXT)s_vGetFreeContext(pDevice);
  2757. if (NULL == pContext) {
  2758. return FALSE;
  2759. }
  2760. memcpy(pDevice->sTxEthHeader.abyDstAddr, (PBYTE)pbySkbData, ETH_HLEN);
  2761. if (pDevice->bEncryptionEnable == TRUE) {
  2762. bNeedEncryption = TRUE;
  2763. // get group key
  2764. pbyBSSID = pDevice->abyBroadcastAddr;
  2765. if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == FALSE) {
  2766. pTransmitKey = NULL;
  2767. DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"KEY is NULL. [%d]\n", pMgmt->eCurrMode);
  2768. } else {
  2769. DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n");
  2770. }
  2771. }
  2772. if (pDevice->bEnableHostWEP) {
  2773. if (uNodeIndex < MAX_NODE_NUM + 1) {
  2774. pTransmitKey = &STempKey;
  2775. pTransmitKey->byCipherSuite = pMgmt->sNodeDBTable[uNodeIndex].byCipherSuite;
  2776. pTransmitKey->dwKeyIndex = pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex;
  2777. pTransmitKey->uKeyLength = pMgmt->sNodeDBTable[uNodeIndex].uWepKeyLength;
  2778. pTransmitKey->dwTSC47_16 = pMgmt->sNodeDBTable[uNodeIndex].dwTSC47_16;
  2779. pTransmitKey->wTSC15_0 = pMgmt->sNodeDBTable[uNodeIndex].wTSC15_0;
  2780. memcpy(pTransmitKey->abyKey,
  2781. &pMgmt->sNodeDBTable[uNodeIndex].abyWepKey[0],
  2782. pTransmitKey->uKeyLength
  2783. );
  2784. }
  2785. }
  2786. if ( bNeedEncryption && (pTransmitKey == NULL) ) {
  2787. pContext->bBoolInUse = FALSE;
  2788. return FALSE;
  2789. }
  2790. byPktTyp = (BYTE)pDevice->byPacketType;
  2791. if (pDevice->bFixRate) {
  2792. if (pDevice->byBBType == BB_TYPE_11B) {
  2793. if (pDevice->uConnectionRate >= RATE_11M) {
  2794. pDevice->wCurrentRate = RATE_11M;
  2795. } else {
  2796. pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
  2797. }
  2798. } else {
  2799. if ((pDevice->byBBType == BB_TYPE_11A) &&
  2800. (pDevice->uConnectionRate <= RATE_6M)) {
  2801. pDevice->wCurrentRate = RATE_6M;
  2802. } else {
  2803. if (pDevice->uConnectionRate >= RATE_54M)
  2804. pDevice->wCurrentRate = RATE_54M;
  2805. else
  2806. pDevice->wCurrentRate = (WORD)pDevice->uConnectionRate;
  2807. }
  2808. }
  2809. }
  2810. else {
  2811. pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate;
  2812. }
  2813. if (wKeepRate != pDevice->wCurrentRate) {
  2814. bScheduleCommand((void *) pDevice, WLAN_CMD_SETPOWER, NULL);
  2815. }
  2816. if (pDevice->wCurrentRate <= RATE_11M)
  2817. byPktType = PK_TYPE_11B;
  2818. BytesToWrite = uDataLen + ETH_FCS_LEN;
  2819. // Convert the packet to an usb frame and copy into our buffer
  2820. // and send the irp.
  2821. fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType,
  2822. (PBYTE)(&pContext->Data[0]), bNeedEncryption,
  2823. uDataLen, TYPE_AC0DMA, &pDevice->sTxEthHeader,
  2824. pbySkbData, pTransmitKey, uNodeIndex,
  2825. pDevice->wCurrentRate,
  2826. &uHeaderLen, &BytesToWrite
  2827. );
  2828. if (fConvertedPacket == FALSE) {
  2829. pContext->bBoolInUse = FALSE;
  2830. return FALSE;
  2831. }
  2832. pTX_Buffer = (PTX_BUFFER)&(pContext->Data[0]);
  2833. pTX_Buffer->byPKTNO = (BYTE) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F));
  2834. pTX_Buffer->wTxByteCount = (WORD)BytesToWrite;
  2835. pContext->pPacket = NULL;
  2836. pContext->Type = CONTEXT_DATA_PACKET;
  2837. pContext->uBufLen = (WORD)BytesToWrite + 4 ; //USB header
  2838. s_vSaveTxPktInfo(pDevice, (BYTE) (pTX_Buffer->byPKTNO & 0x0F), &(pContext->sEthHeader.abyDstAddr[0]),(WORD) (BytesToWrite-uHeaderLen),pTX_Buffer->wFIFOCtl);
  2839. status = PIPEnsSendBulkOut(pDevice,pContext);
  2840. return TRUE;
  2841. }