dpc.c 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313
  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: dpc.c
  20. *
  21. * Purpose: handle dpc rx functions
  22. *
  23. * Author: Lyndon Chen
  24. *
  25. * Date: May 20, 2003
  26. *
  27. * Functions:
  28. * device_receive_frame - Rcv 802.11 frame function
  29. * s_bAPModeRxCtl- AP Rcv frame filer Ctl.
  30. * s_bAPModeRxData- AP Rcv data frame handle
  31. * s_bHandleRxEncryption- Rcv decrypted data via on-fly
  32. * s_bHostWepRxEncryption- Rcv encrypted data via host
  33. * s_byGetRateIdx- get rate index
  34. * s_vGetDASA- get data offset
  35. * s_vProcessRxMACHeader- Rcv 802.11 and translate to 802.3
  36. *
  37. * Revision History:
  38. *
  39. */
  40. #include "device.h"
  41. #include "rxtx.h"
  42. #include "tether.h"
  43. #include "card.h"
  44. #include "bssdb.h"
  45. #include "mac.h"
  46. #include "baseband.h"
  47. #include "michael.h"
  48. #include "tkip.h"
  49. #include "tcrc.h"
  50. #include "wctl.h"
  51. #include "wroute.h"
  52. #include "hostap.h"
  53. #include "rf.h"
  54. #include "iowpa.h"
  55. #include "aes_ccmp.h"
  56. #include "dpc.h"
  57. /*--------------------- Static Definitions -------------------------*/
  58. /*--------------------- Static Classes ----------------------------*/
  59. /*--------------------- Static Variables --------------------------*/
  60. static const unsigned char acbyRxRate[MAX_RATE] =
  61. {2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108};
  62. /*--------------------- Static Functions --------------------------*/
  63. /*--------------------- Static Definitions -------------------------*/
  64. /*--------------------- Static Functions --------------------------*/
  65. static unsigned char s_byGetRateIdx(unsigned char byRate);
  66. static void
  67. s_vGetDASA(unsigned char *pbyRxBufferAddr, unsigned int *pcbHeaderSize,
  68. PSEthernetHeader psEthHeader);
  69. static void
  70. s_vProcessRxMACHeader(struct vnt_private *pDevice, unsigned char *pbyRxBufferAddr,
  71. unsigned int cbPacketSize, bool bIsWEP, bool bExtIV,
  72. unsigned int *pcbHeadSize);
  73. static bool s_bAPModeRxCtl(
  74. struct vnt_private *pDevice,
  75. unsigned char *pbyFrame,
  76. int iSANodeIndex
  77. );
  78. static bool s_bAPModeRxData(
  79. struct vnt_private *pDevice,
  80. struct sk_buff *skb,
  81. unsigned int FrameSize,
  82. unsigned int cbHeaderOffset,
  83. int iSANodeIndex,
  84. int iDANodeIndex
  85. );
  86. static bool s_bHandleRxEncryption(
  87. struct vnt_private *pDevice,
  88. unsigned char *pbyFrame,
  89. unsigned int FrameSize,
  90. unsigned char *pbyRsr,
  91. unsigned char *pbyNewRsr,
  92. PSKeyItem *pKeyOut,
  93. bool *pbExtIV,
  94. unsigned short *pwRxTSC15_0,
  95. unsigned long *pdwRxTSC47_16
  96. );
  97. static bool s_bHostWepRxEncryption(
  98. struct vnt_private *pDevice,
  99. unsigned char *pbyFrame,
  100. unsigned int FrameSize,
  101. unsigned char *pbyRsr,
  102. bool bOnFly,
  103. PSKeyItem pKey,
  104. unsigned char *pbyNewRsr,
  105. bool *pbExtIV,
  106. unsigned short *pwRxTSC15_0,
  107. unsigned long *pdwRxTSC47_16
  108. );
  109. /*--------------------- Export Variables --------------------------*/
  110. /*+
  111. *
  112. * Description:
  113. * Translate Rcv 802.11 header to 802.3 header with Rx buffer
  114. *
  115. * Parameters:
  116. * In:
  117. * pDevice
  118. * dwRxBufferAddr - Address of Rcv Buffer
  119. * cbPacketSize - Rcv Packet size
  120. * bIsWEP - If Rcv with WEP
  121. * Out:
  122. * pcbHeaderSize - 802.11 header size
  123. *
  124. * Return Value: None
  125. *
  126. -*/
  127. static void
  128. s_vProcessRxMACHeader(struct vnt_private *pDevice,
  129. unsigned char *pbyRxBufferAddr,
  130. unsigned int cbPacketSize, bool bIsWEP, bool bExtIV,
  131. unsigned int *pcbHeadSize)
  132. {
  133. unsigned char *pbyRxBuffer;
  134. unsigned int cbHeaderSize = 0;
  135. unsigned short *pwType;
  136. PS802_11Header pMACHeader;
  137. int ii;
  138. pMACHeader = (PS802_11Header) (pbyRxBufferAddr + cbHeaderSize);
  139. s_vGetDASA((unsigned char *)pMACHeader, &cbHeaderSize, &pDevice->sRxEthHeader);
  140. if (bIsWEP) {
  141. if (bExtIV) {
  142. // strip IV&ExtIV , add 8 byte
  143. cbHeaderSize += (WLAN_HDR_ADDR3_LEN + 8);
  144. } else {
  145. // strip IV , add 4 byte
  146. cbHeaderSize += (WLAN_HDR_ADDR3_LEN + 4);
  147. }
  148. } else {
  149. cbHeaderSize += WLAN_HDR_ADDR3_LEN;
  150. }
  151. pbyRxBuffer = (unsigned char *)(pbyRxBufferAddr + cbHeaderSize);
  152. if (ether_addr_equal(pbyRxBuffer, pDevice->abySNAP_Bridgetunnel)) {
  153. cbHeaderSize += 6;
  154. } else if (ether_addr_equal(pbyRxBuffer, pDevice->abySNAP_RFC1042)) {
  155. cbHeaderSize += 6;
  156. pwType = (unsigned short *)(pbyRxBufferAddr + cbHeaderSize);
  157. if ((*pwType != TYPE_PKT_IPX) && (*pwType != cpu_to_le16(0xF380))) {
  158. } else {
  159. cbHeaderSize -= 8;
  160. pwType = (unsigned short *)(pbyRxBufferAddr + cbHeaderSize);
  161. if (bIsWEP) {
  162. if (bExtIV)
  163. *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 8); // 8 is IV&ExtIV
  164. else
  165. *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 4); // 4 is IV
  166. } else {
  167. *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN);
  168. }
  169. }
  170. } else {
  171. cbHeaderSize -= 2;
  172. pwType = (unsigned short *)(pbyRxBufferAddr + cbHeaderSize);
  173. if (bIsWEP) {
  174. if (bExtIV)
  175. *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 8); // 8 is IV&ExtIV
  176. else
  177. *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 4); // 4 is IV
  178. } else {
  179. *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN);
  180. }
  181. }
  182. cbHeaderSize -= (ETH_ALEN * 2);
  183. pbyRxBuffer = (unsigned char *)(pbyRxBufferAddr + cbHeaderSize);
  184. for (ii = 0; ii < ETH_ALEN; ii++)
  185. *pbyRxBuffer++ = pDevice->sRxEthHeader.abyDstAddr[ii];
  186. for (ii = 0; ii < ETH_ALEN; ii++)
  187. *pbyRxBuffer++ = pDevice->sRxEthHeader.abySrcAddr[ii];
  188. *pcbHeadSize = cbHeaderSize;
  189. }
  190. static unsigned char s_byGetRateIdx(unsigned char byRate)
  191. {
  192. unsigned char byRateIdx;
  193. for (byRateIdx = 0; byRateIdx < MAX_RATE; byRateIdx++) {
  194. if (acbyRxRate[byRateIdx % MAX_RATE] == byRate)
  195. return byRateIdx;
  196. }
  197. return 0;
  198. }
  199. static void
  200. s_vGetDASA(unsigned char *pbyRxBufferAddr, unsigned int *pcbHeaderSize,
  201. PSEthernetHeader psEthHeader)
  202. {
  203. unsigned int cbHeaderSize = 0;
  204. PS802_11Header pMACHeader;
  205. int ii;
  206. pMACHeader = (PS802_11Header) (pbyRxBufferAddr + cbHeaderSize);
  207. if ((pMACHeader->wFrameCtl & FC_TODS) == 0) {
  208. if (pMACHeader->wFrameCtl & FC_FROMDS) {
  209. for (ii = 0; ii < ETH_ALEN; ii++) {
  210. psEthHeader->abyDstAddr[ii] = pMACHeader->abyAddr1[ii];
  211. psEthHeader->abySrcAddr[ii] = pMACHeader->abyAddr3[ii];
  212. }
  213. } else {
  214. // IBSS mode
  215. for (ii = 0; ii < ETH_ALEN; ii++) {
  216. psEthHeader->abyDstAddr[ii] = pMACHeader->abyAddr1[ii];
  217. psEthHeader->abySrcAddr[ii] = pMACHeader->abyAddr2[ii];
  218. }
  219. }
  220. } else {
  221. // Is AP mode..
  222. if (pMACHeader->wFrameCtl & FC_FROMDS) {
  223. for (ii = 0; ii < ETH_ALEN; ii++) {
  224. psEthHeader->abyDstAddr[ii] = pMACHeader->abyAddr3[ii];
  225. psEthHeader->abySrcAddr[ii] = pMACHeader->abyAddr4[ii];
  226. cbHeaderSize += 6;
  227. }
  228. } else {
  229. for (ii = 0; ii < ETH_ALEN; ii++) {
  230. psEthHeader->abyDstAddr[ii] = pMACHeader->abyAddr3[ii];
  231. psEthHeader->abySrcAddr[ii] = pMACHeader->abyAddr2[ii];
  232. }
  233. }
  234. }
  235. *pcbHeaderSize = cbHeaderSize;
  236. }
  237. bool
  238. device_receive_frame(
  239. struct vnt_private *pDevice,
  240. PSRxDesc pCurrRD
  241. )
  242. {
  243. PDEVICE_RD_INFO pRDInfo = pCurrRD->pRDInfo;
  244. struct net_device_stats *pStats = &pDevice->dev->stats;
  245. struct sk_buff *skb;
  246. PSMgmtObject pMgmt = pDevice->pMgmt;
  247. PSRxMgmtPacket pRxPacket = &(pDevice->pMgmt->sRxPacket);
  248. PS802_11Header p802_11Header;
  249. unsigned char *pbyRsr;
  250. unsigned char *pbyNewRsr;
  251. unsigned char *pbyRSSI;
  252. __le64 *pqwTSFTime;
  253. unsigned short *pwFrameSize;
  254. unsigned char *pbyFrame;
  255. bool bDeFragRx = false;
  256. bool bIsWEP = false;
  257. unsigned int cbHeaderOffset;
  258. unsigned int FrameSize;
  259. unsigned short wEtherType = 0;
  260. int iSANodeIndex = -1;
  261. int iDANodeIndex = -1;
  262. unsigned int ii;
  263. unsigned int cbIVOffset;
  264. bool bExtIV = false;
  265. unsigned char *pbyRxSts;
  266. unsigned char *pbyRxRate;
  267. unsigned char *pbySQ;
  268. unsigned int cbHeaderSize;
  269. PSKeyItem pKey = NULL;
  270. unsigned short wRxTSC15_0 = 0;
  271. unsigned long dwRxTSC47_16 = 0;
  272. SKeyItem STempKey;
  273. // 802.11h RPI
  274. unsigned long dwDuration = 0;
  275. long ldBm = 0;
  276. long ldBmThreshold = 0;
  277. PS802_11Header pMACHeader;
  278. bool bRxeapol_key = false;
  279. skb = pRDInfo->skb;
  280. pci_unmap_single(pDevice->pcid, pRDInfo->skb_dma,
  281. pDevice->rx_buf_sz, PCI_DMA_FROMDEVICE);
  282. pwFrameSize = (unsigned short *)(skb->data + 2);
  283. FrameSize = cpu_to_le16(pCurrRD->m_rd1RD1.wReqCount) - cpu_to_le16(pCurrRD->m_rd0RD0.wResCount);
  284. // Max: 2312Payload + 30HD +4CRC + 2Padding + 4Len + 8TSF + 4RSR
  285. // Min (ACK): 10HD +4CRC + 2Padding + 4Len + 8TSF + 4RSR
  286. if ((FrameSize > 2364) || (FrameSize <= 32)) {
  287. // Frame Size error drop this packet.
  288. pr_debug("---------- WRONG Length 1\n");
  289. return false;
  290. }
  291. pbyRxSts = (unsigned char *)(skb->data);
  292. pbyRxRate = (unsigned char *)(skb->data + 1);
  293. pbyRsr = (unsigned char *)(skb->data + FrameSize - 1);
  294. pbyRSSI = (unsigned char *)(skb->data + FrameSize - 2);
  295. pbyNewRsr = (unsigned char *)(skb->data + FrameSize - 3);
  296. pbySQ = (unsigned char *)(skb->data + FrameSize - 4);
  297. pqwTSFTime = (__le64 *)(skb->data + FrameSize - 12);
  298. pbyFrame = (unsigned char *)(skb->data + 4);
  299. // get packet size
  300. FrameSize = cpu_to_le16(*pwFrameSize);
  301. if ((FrameSize > 2346)|(FrameSize < 14)) { // Max: 2312Payload + 30HD +4CRC
  302. // Min: 14 bytes ACK
  303. pr_debug("---------- WRONG Length 2\n");
  304. return false;
  305. }
  306. // update receive statistic counter
  307. STAvUpdateRDStatCounter(&pDevice->scStatistic,
  308. *pbyRsr,
  309. *pbyNewRsr,
  310. *pbyRxRate,
  311. pbyFrame,
  312. FrameSize);
  313. pMACHeader = (PS802_11Header)((unsigned char *)(skb->data) + 8);
  314. if (pDevice->bMeasureInProgress) {
  315. if ((*pbyRsr & RSR_CRCOK) != 0)
  316. pDevice->byBasicMap |= 0x01;
  317. dwDuration = (FrameSize << 4);
  318. dwDuration /= acbyRxRate[*pbyRxRate%MAX_RATE];
  319. if (*pbyRxRate <= RATE_11M) {
  320. if (*pbyRxSts & 0x01) {
  321. // long preamble
  322. dwDuration += 192;
  323. } else {
  324. // short preamble
  325. dwDuration += 96;
  326. }
  327. } else {
  328. dwDuration += 16;
  329. }
  330. RFvRSSITodBm(pDevice, *pbyRSSI, &ldBm);
  331. ldBmThreshold = -57;
  332. for (ii = 7; ii > 0;) {
  333. if (ldBm > ldBmThreshold)
  334. break;
  335. ldBmThreshold -= 5;
  336. ii--;
  337. }
  338. pDevice->dwRPIs[ii] += dwDuration;
  339. return false;
  340. }
  341. if (!is_multicast_ether_addr(pbyFrame)) {
  342. if (WCTLbIsDuplicate(&(pDevice->sDupRxCache), (PS802_11Header)(skb->data + 4))) {
  343. pDevice->s802_11Counter.FrameDuplicateCount++;
  344. return false;
  345. }
  346. }
  347. // Use for TKIP MIC
  348. s_vGetDASA(skb->data+4, &cbHeaderSize, &pDevice->sRxEthHeader);
  349. // filter packet send from myself
  350. if (ether_addr_equal(pDevice->sRxEthHeader.abySrcAddr,
  351. pDevice->abyCurrentNetAddr))
  352. return false;
  353. if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) || (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
  354. if (IS_CTL_PSPOLL(pbyFrame) || !IS_TYPE_CONTROL(pbyFrame)) {
  355. p802_11Header = (PS802_11Header)(pbyFrame);
  356. // get SA NodeIndex
  357. if (BSSDBbIsSTAInNodeDB(pMgmt, (unsigned char *)(p802_11Header->abyAddr2), &iSANodeIndex)) {
  358. pMgmt->sNodeDBTable[iSANodeIndex].ulLastRxJiffer = jiffies;
  359. pMgmt->sNodeDBTable[iSANodeIndex].uInActiveCount = 0;
  360. }
  361. }
  362. }
  363. if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
  364. if (s_bAPModeRxCtl(pDevice, pbyFrame, iSANodeIndex))
  365. return false;
  366. }
  367. if (IS_FC_WEP(pbyFrame)) {
  368. bool bRxDecryOK = false;
  369. pr_debug("rx WEP pkt\n");
  370. bIsWEP = true;
  371. if ((pDevice->bEnableHostWEP) && (iSANodeIndex >= 0)) {
  372. pKey = &STempKey;
  373. pKey->byCipherSuite = pMgmt->sNodeDBTable[iSANodeIndex].byCipherSuite;
  374. pKey->dwKeyIndex = pMgmt->sNodeDBTable[iSANodeIndex].dwKeyIndex;
  375. pKey->uKeyLength = pMgmt->sNodeDBTable[iSANodeIndex].uWepKeyLength;
  376. pKey->dwTSC47_16 = pMgmt->sNodeDBTable[iSANodeIndex].dwTSC47_16;
  377. pKey->wTSC15_0 = pMgmt->sNodeDBTable[iSANodeIndex].wTSC15_0;
  378. memcpy(pKey->abyKey,
  379. &pMgmt->sNodeDBTable[iSANodeIndex].abyWepKey[0],
  380. pKey->uKeyLength
  381. );
  382. bRxDecryOK = s_bHostWepRxEncryption(pDevice,
  383. pbyFrame,
  384. FrameSize,
  385. pbyRsr,
  386. pMgmt->sNodeDBTable[iSANodeIndex].bOnFly,
  387. pKey,
  388. pbyNewRsr,
  389. &bExtIV,
  390. &wRxTSC15_0,
  391. &dwRxTSC47_16);
  392. } else {
  393. bRxDecryOK = s_bHandleRxEncryption(pDevice,
  394. pbyFrame,
  395. FrameSize,
  396. pbyRsr,
  397. pbyNewRsr,
  398. &pKey,
  399. &bExtIV,
  400. &wRxTSC15_0,
  401. &dwRxTSC47_16);
  402. }
  403. if (bRxDecryOK) {
  404. if ((*pbyNewRsr & NEWRSR_DECRYPTOK) == 0) {
  405. pr_debug("ICV Fail\n");
  406. if ((pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPA) ||
  407. (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) ||
  408. (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) ||
  409. (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPA2) ||
  410. (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) {
  411. if ((pKey != NULL) && (pKey->byCipherSuite == KEY_CTL_TKIP))
  412. pDevice->s802_11Counter.TKIPICVErrors++;
  413. else if ((pKey != NULL) && (pKey->byCipherSuite == KEY_CTL_CCMP))
  414. pDevice->s802_11Counter.CCMPDecryptErrors++;
  415. }
  416. return false;
  417. }
  418. } else {
  419. pr_debug("WEP Func Fail\n");
  420. return false;
  421. }
  422. if ((pKey != NULL) && (pKey->byCipherSuite == KEY_CTL_CCMP))
  423. FrameSize -= 8; // Message Integrity Code
  424. else
  425. FrameSize -= 4; // 4 is ICV
  426. }
  427. //
  428. // RX OK
  429. //
  430. //remove the CRC length
  431. FrameSize -= ETH_FCS_LEN;
  432. if ((!(*pbyRsr & (RSR_ADDRBROAD | RSR_ADDRMULTI))) && // unicast address
  433. (IS_FRAGMENT_PKT((skb->data+4)))
  434. ) {
  435. // defragment
  436. bDeFragRx = WCTLbHandleFragment(pDevice, (PS802_11Header)(skb->data+4), FrameSize, bIsWEP, bExtIV);
  437. pDevice->s802_11Counter.ReceivedFragmentCount++;
  438. if (bDeFragRx) {
  439. // defrag complete
  440. skb = pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].skb;
  441. FrameSize = pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].cbFrameLength;
  442. } else {
  443. return false;
  444. }
  445. }
  446. // Management & Control frame Handle
  447. if ((IS_TYPE_DATA((skb->data+4))) == false) {
  448. // Handle Control & Manage Frame
  449. if (IS_TYPE_MGMT((skb->data+4))) {
  450. unsigned char *pbyData1;
  451. unsigned char *pbyData2;
  452. pRxPacket->p80211Header = (PUWLAN_80211HDR)(skb->data+4);
  453. pRxPacket->cbMPDULen = FrameSize;
  454. pRxPacket->uRSSI = *pbyRSSI;
  455. pRxPacket->bySQ = *pbySQ;
  456. pRxPacket->qwLocalTSF = le64_to_cpu(*pqwTSFTime);
  457. if (bIsWEP) {
  458. // strip IV
  459. pbyData1 = WLAN_HDR_A3_DATA_PTR(skb->data+4);
  460. pbyData2 = WLAN_HDR_A3_DATA_PTR(skb->data+4) + 4;
  461. for (ii = 0; ii < (FrameSize - 4); ii++) {
  462. *pbyData1 = *pbyData2;
  463. pbyData1++;
  464. pbyData2++;
  465. }
  466. }
  467. pRxPacket->byRxRate = s_byGetRateIdx(*pbyRxRate);
  468. pRxPacket->byRxChannel = (*pbyRxSts) >> 2;
  469. vMgrRxManagePacket((void *)pDevice, pDevice->pMgmt, pRxPacket);
  470. // hostap Deamon handle 802.11 management
  471. if (pDevice->bEnableHostapd) {
  472. skb->dev = pDevice->apdev;
  473. skb->data += 4;
  474. skb->tail += 4;
  475. skb_put(skb, FrameSize);
  476. skb_reset_mac_header(skb);
  477. skb->pkt_type = PACKET_OTHERHOST;
  478. skb->protocol = htons(ETH_P_802_2);
  479. memset(skb->cb, 0, sizeof(skb->cb));
  480. netif_rx(skb);
  481. return true;
  482. }
  483. }
  484. return false;
  485. } else {
  486. if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
  487. //In AP mode, hw only check addr1(BSSID or RA) if equal to local MAC.
  488. if (!(*pbyRsr & RSR_BSSIDOK)) {
  489. if (bDeFragRx) {
  490. if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) {
  491. pr_err("%s: can not alloc more frag bufs\n",
  492. pDevice->dev->name);
  493. }
  494. }
  495. return false;
  496. }
  497. } else {
  498. // discard DATA packet while not associate || BSSID error
  499. if (!pDevice->bLinkPass || !(*pbyRsr & RSR_BSSIDOK)) {
  500. if (bDeFragRx) {
  501. if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) {
  502. pr_err("%s: can not alloc more frag bufs\n",
  503. pDevice->dev->name);
  504. }
  505. }
  506. return false;
  507. }
  508. //mike add:station mode check eapol-key challenge--->
  509. {
  510. unsigned char Protocol_Version; //802.1x Authentication
  511. unsigned char Packet_Type; //802.1x Authentication
  512. if (bIsWEP)
  513. cbIVOffset = 8;
  514. else
  515. cbIVOffset = 0;
  516. wEtherType = (skb->data[cbIVOffset + 8 + 24 + 6] << 8) |
  517. skb->data[cbIVOffset + 8 + 24 + 6 + 1];
  518. Protocol_Version = skb->data[cbIVOffset + 8 + 24 + 6 + 1 + 1];
  519. Packet_Type = skb->data[cbIVOffset + 8 + 24 + 6 + 1 + 1 + 1];
  520. if (wEtherType == ETH_P_PAE) { //Protocol Type in LLC-Header
  521. if (((Protocol_Version == 1) || (Protocol_Version == 2)) &&
  522. (Packet_Type == 3)) { //802.1x OR eapol-key challenge frame receive
  523. bRxeapol_key = true;
  524. }
  525. }
  526. }
  527. //mike add:station mode check eapol-key challenge<---
  528. }
  529. }
  530. // Data frame Handle
  531. if (pDevice->bEnablePSMode) {
  532. if (!IS_FC_MOREDATA((skb->data+4))) {
  533. if (pDevice->pMgmt->bInTIMWake == true)
  534. pDevice->pMgmt->bInTIMWake = false;
  535. }
  536. }
  537. // Now it only supports 802.11g Infrastructure Mode, and support rate must up to 54 Mbps
  538. if (pDevice->bDiversityEnable && (FrameSize > 50) &&
  539. (pDevice->op_mode == NL80211_IFTYPE_STATION) &&
  540. pDevice->bLinkPass) {
  541. BBvAntennaDiversity(pDevice, s_byGetRateIdx(*pbyRxRate), 0);
  542. }
  543. if (pDevice->byLocalID != REV_ID_VT3253_B1)
  544. pDevice->uCurrRSSI = *pbyRSSI;
  545. pDevice->byCurrSQ = *pbySQ;
  546. if ((*pbyRSSI != 0) &&
  547. (pMgmt->pCurrBSS != NULL)) {
  548. RFvRSSITodBm(pDevice, *pbyRSSI, &ldBm);
  549. // Monitor if RSSI is too strong.
  550. pMgmt->pCurrBSS->byRSSIStatCnt++;
  551. pMgmt->pCurrBSS->byRSSIStatCnt %= RSSI_STAT_COUNT;
  552. pMgmt->pCurrBSS->ldBmAverage[pMgmt->pCurrBSS->byRSSIStatCnt] = ldBm;
  553. for (ii = 0; ii < RSSI_STAT_COUNT; ii++)
  554. if (pMgmt->pCurrBSS->ldBmAverage[ii] != 0)
  555. pMgmt->pCurrBSS->ldBmMAX = max(pMgmt->pCurrBSS->ldBmAverage[ii], ldBm);
  556. }
  557. // -----------------------------------------------
  558. if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && pDevice->bEnable8021x) {
  559. unsigned char abyMacHdr[24];
  560. // Only 802.1x packet incoming allowed
  561. if (bIsWEP)
  562. cbIVOffset = 8;
  563. else
  564. cbIVOffset = 0;
  565. wEtherType = (skb->data[cbIVOffset + 4 + 24 + 6] << 8) |
  566. skb->data[cbIVOffset + 4 + 24 + 6 + 1];
  567. pr_debug("wEtherType = %04x\n", wEtherType);
  568. if (wEtherType == ETH_P_PAE) {
  569. skb->dev = pDevice->apdev;
  570. if (bIsWEP) {
  571. // strip IV header(8)
  572. memcpy(&abyMacHdr[0], (skb->data + 4), 24);
  573. memcpy((skb->data + 4 + cbIVOffset), &abyMacHdr[0], 24);
  574. }
  575. skb->data += (cbIVOffset + 4);
  576. skb->tail += (cbIVOffset + 4);
  577. skb_put(skb, FrameSize);
  578. skb_reset_mac_header(skb);
  579. skb->pkt_type = PACKET_OTHERHOST;
  580. skb->protocol = htons(ETH_P_802_2);
  581. memset(skb->cb, 0, sizeof(skb->cb));
  582. netif_rx(skb);
  583. return true;
  584. }
  585. // check if 802.1x authorized
  586. if (!(pMgmt->sNodeDBTable[iSANodeIndex].dwFlags & WLAN_STA_AUTHORIZED))
  587. return false;
  588. }
  589. if ((pKey != NULL) && (pKey->byCipherSuite == KEY_CTL_TKIP)) {
  590. if (bIsWEP)
  591. FrameSize -= 8; //MIC
  592. }
  593. //--------------------------------------------------------------------------------
  594. // Soft MIC
  595. if ((pKey != NULL) && (pKey->byCipherSuite == KEY_CTL_TKIP)) {
  596. if (bIsWEP) {
  597. __le32 *pdwMIC_L;
  598. __le32 *pdwMIC_R;
  599. __le32 dwMIC_Priority;
  600. __le32 dwMICKey0 = 0, dwMICKey1 = 0;
  601. u32 dwLocalMIC_L = 0;
  602. u32 dwLocalMIC_R = 0;
  603. viawget_wpa_header *wpahdr;
  604. if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
  605. dwMICKey0 = cpu_to_le32(*(u32 *)(&pKey->abyKey[24]));
  606. dwMICKey1 = cpu_to_le32(*(u32 *)(&pKey->abyKey[28]));
  607. } else {
  608. if (pDevice->pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
  609. dwMICKey0 = cpu_to_le32(*(u32 *)(&pKey->abyKey[16]));
  610. dwMICKey1 = cpu_to_le32(*(u32 *)(&pKey->abyKey[20]));
  611. } else if ((pKey->dwKeyIndex & BIT28) == 0) {
  612. dwMICKey0 = cpu_to_le32(*(u32 *)(&pKey->abyKey[16]));
  613. dwMICKey1 = cpu_to_le32(*(u32 *)(&pKey->abyKey[20]));
  614. } else {
  615. dwMICKey0 = cpu_to_le32(*(u32 *)(&pKey->abyKey[24]));
  616. dwMICKey1 = cpu_to_le32(*(u32 *)(&pKey->abyKey[28]));
  617. }
  618. }
  619. MIC_vInit(dwMICKey0, dwMICKey1);
  620. MIC_vAppend((unsigned char *)&(pDevice->sRxEthHeader.abyDstAddr[0]), 12);
  621. dwMIC_Priority = 0;
  622. MIC_vAppend((unsigned char *)&dwMIC_Priority, 4);
  623. // 4 is Rcv buffer header, 24 is MAC Header, and 8 is IV and Ext IV.
  624. MIC_vAppend((unsigned char *)(skb->data + 4 + WLAN_HDR_ADDR3_LEN + 8),
  625. FrameSize - WLAN_HDR_ADDR3_LEN - 8);
  626. MIC_vGetMIC(&dwLocalMIC_L, &dwLocalMIC_R);
  627. MIC_vUnInit();
  628. pdwMIC_L = (__le32 *)(skb->data + 4 + FrameSize);
  629. pdwMIC_R = (__le32 *)(skb->data + 4 + FrameSize + 4);
  630. if ((le32_to_cpu(*pdwMIC_L) != dwLocalMIC_L) ||
  631. (le32_to_cpu(*pdwMIC_R) != dwLocalMIC_R) ||
  632. pDevice->bRxMICFail) {
  633. pr_debug("MIC comparison is fail!\n");
  634. pDevice->bRxMICFail = false;
  635. pDevice->s802_11Counter.TKIPLocalMICFailures++;
  636. if (bDeFragRx) {
  637. if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) {
  638. pr_err("%s: can not alloc more frag bufs\n",
  639. pDevice->dev->name);
  640. }
  641. }
  642. //2008-0409-07, <Add> by Einsn Liu
  643. #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
  644. //send event to wpa_supplicant
  645. {
  646. union iwreq_data wrqu;
  647. struct iw_michaelmicfailure ev;
  648. int keyidx = pbyFrame[cbHeaderSize+3] >> 6; //top two-bits
  649. memset(&ev, 0, sizeof(ev));
  650. ev.flags = keyidx & IW_MICFAILURE_KEY_ID;
  651. if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
  652. (pMgmt->eCurrState == WMAC_STATE_ASSOC) &&
  653. (*pbyRsr & (RSR_ADDRBROAD | RSR_ADDRMULTI)) == 0) {
  654. ev.flags |= IW_MICFAILURE_PAIRWISE;
  655. } else {
  656. ev.flags |= IW_MICFAILURE_GROUP;
  657. }
  658. ev.src_addr.sa_family = ARPHRD_ETHER;
  659. memcpy(ev.src_addr.sa_data, pMACHeader->abyAddr2, ETH_ALEN);
  660. memset(&wrqu, 0, sizeof(wrqu));
  661. wrqu.data.length = sizeof(ev);
  662. wireless_send_event(pDevice->dev, IWEVMICHAELMICFAILURE, &wrqu, (char *)&ev);
  663. }
  664. #endif
  665. if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
  666. wpahdr = (viawget_wpa_header *)pDevice->skb->data;
  667. if ((pDevice->pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
  668. (pDevice->pMgmt->eCurrState == WMAC_STATE_ASSOC) &&
  669. (*pbyRsr & (RSR_ADDRBROAD | RSR_ADDRMULTI)) == 0) {
  670. wpahdr->type = VIAWGET_PTK_MIC_MSG;
  671. } else {
  672. wpahdr->type = VIAWGET_GTK_MIC_MSG;
  673. }
  674. wpahdr->resp_ie_len = 0;
  675. wpahdr->req_ie_len = 0;
  676. skb_put(pDevice->skb, sizeof(viawget_wpa_header));
  677. pDevice->skb->dev = pDevice->wpadev;
  678. skb_reset_mac_header(pDevice->skb);
  679. pDevice->skb->pkt_type = PACKET_HOST;
  680. pDevice->skb->protocol = htons(ETH_P_802_2);
  681. memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
  682. netif_rx(pDevice->skb);
  683. pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
  684. }
  685. return false;
  686. }
  687. }
  688. } //---end of SOFT MIC-----------------------------------------------------------------------
  689. // ++++++++++ Reply Counter Check +++++++++++++
  690. if ((pKey != NULL) && ((pKey->byCipherSuite == KEY_CTL_TKIP) ||
  691. (pKey->byCipherSuite == KEY_CTL_CCMP))) {
  692. if (bIsWEP) {
  693. unsigned short wLocalTSC15_0 = 0;
  694. unsigned long dwLocalTSC47_16 = 0;
  695. unsigned long long RSC = 0;
  696. // endian issues
  697. RSC = *((unsigned long long *)&(pKey->KeyRSC));
  698. wLocalTSC15_0 = (unsigned short)RSC;
  699. dwLocalTSC47_16 = (unsigned long)(RSC>>16);
  700. RSC = dwRxTSC47_16;
  701. RSC <<= 16;
  702. RSC += wRxTSC15_0;
  703. pKey->KeyRSC = RSC;
  704. if ((pDevice->sMgmtObj.eCurrMode == WMAC_MODE_ESS_STA) &&
  705. (pDevice->sMgmtObj.eCurrState == WMAC_STATE_ASSOC)) {
  706. // check RSC
  707. if ((wRxTSC15_0 < wLocalTSC15_0) &&
  708. (dwRxTSC47_16 <= dwLocalTSC47_16) &&
  709. !((dwRxTSC47_16 == 0) && (dwLocalTSC47_16 == 0xFFFFFFFF))) {
  710. pr_debug("TSC is illegal~~!\n ");
  711. if (pKey->byCipherSuite == KEY_CTL_TKIP)
  712. pDevice->s802_11Counter.TKIPReplays++;
  713. else
  714. pDevice->s802_11Counter.CCMPReplays++;
  715. if (bDeFragRx) {
  716. if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) {
  717. pr_err("%s: can not alloc more frag bufs\n",
  718. pDevice->dev->name);
  719. }
  720. }
  721. return false;
  722. }
  723. }
  724. }
  725. } // ----- End of Reply Counter Check --------------------------
  726. s_vProcessRxMACHeader(pDevice, (unsigned char *)(skb->data+4), FrameSize, bIsWEP, bExtIV, &cbHeaderOffset);
  727. FrameSize -= cbHeaderOffset;
  728. cbHeaderOffset += 4; // 4 is Rcv buffer header
  729. // Null data, framesize = 14
  730. if (FrameSize < 15)
  731. return false;
  732. if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
  733. if (!s_bAPModeRxData(pDevice,
  734. skb,
  735. FrameSize,
  736. cbHeaderOffset,
  737. iSANodeIndex,
  738. iDANodeIndex
  739. )) {
  740. if (bDeFragRx) {
  741. if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) {
  742. pr_err("%s: can not alloc more frag bufs\n",
  743. pDevice->dev->name);
  744. }
  745. }
  746. return false;
  747. }
  748. }
  749. skb->data += cbHeaderOffset;
  750. skb->tail += cbHeaderOffset;
  751. skb_put(skb, FrameSize);
  752. skb->protocol = eth_type_trans(skb, skb->dev);
  753. //drop frame not met IEEE 802.3
  754. skb->ip_summed = CHECKSUM_NONE;
  755. pStats->rx_bytes += skb->len;
  756. pStats->rx_packets++;
  757. netif_rx(skb);
  758. if (bDeFragRx) {
  759. if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) {
  760. pr_err("%s: can not alloc more frag bufs\n",
  761. pDevice->dev->name);
  762. }
  763. return false;
  764. }
  765. return true;
  766. }
  767. static bool s_bAPModeRxCtl(
  768. struct vnt_private *pDevice,
  769. unsigned char *pbyFrame,
  770. int iSANodeIndex
  771. )
  772. {
  773. PS802_11Header p802_11Header;
  774. CMD_STATUS Status;
  775. PSMgmtObject pMgmt = pDevice->pMgmt;
  776. if (IS_CTL_PSPOLL(pbyFrame) || !IS_TYPE_CONTROL(pbyFrame)) {
  777. p802_11Header = (PS802_11Header)(pbyFrame);
  778. if (!IS_TYPE_MGMT(pbyFrame)) {
  779. // Data & PS-Poll packet
  780. // check frame class
  781. if (iSANodeIndex > 0) {
  782. // frame class 3 fliter & checking
  783. if (pMgmt->sNodeDBTable[iSANodeIndex].eNodeState < NODE_AUTH) {
  784. // send deauth notification
  785. // reason = (6) class 2 received from nonauth sta
  786. vMgrDeAuthenBeginSta(pDevice,
  787. pMgmt,
  788. (unsigned char *)(p802_11Header->abyAddr2),
  789. (WLAN_MGMT_REASON_CLASS2_NONAUTH),
  790. &Status
  791. );
  792. pr_debug("dpc: send vMgrDeAuthenBeginSta 1\n");
  793. return true;
  794. }
  795. if (pMgmt->sNodeDBTable[iSANodeIndex].eNodeState < NODE_ASSOC) {
  796. // send deassoc notification
  797. // reason = (7) class 3 received from nonassoc sta
  798. vMgrDisassocBeginSta(pDevice,
  799. pMgmt,
  800. (unsigned char *)(p802_11Header->abyAddr2),
  801. (WLAN_MGMT_REASON_CLASS3_NONASSOC),
  802. &Status
  803. );
  804. pr_debug("dpc: send vMgrDisassocBeginSta 2\n");
  805. return true;
  806. }
  807. if (pMgmt->sNodeDBTable[iSANodeIndex].bPSEnable) {
  808. // delcare received ps-poll event
  809. if (IS_CTL_PSPOLL(pbyFrame)) {
  810. pMgmt->sNodeDBTable[iSANodeIndex].bRxPSPoll = true;
  811. bScheduleCommand((void *)pDevice, WLAN_CMD_RX_PSPOLL, NULL);
  812. pr_debug("dpc: WLAN_CMD_RX_PSPOLL 1\n");
  813. } else {
  814. // check Data PS state
  815. // if PW bit off, send out all PS bufferring packets.
  816. if (!IS_FC_POWERMGT(pbyFrame)) {
  817. pMgmt->sNodeDBTable[iSANodeIndex].bPSEnable = false;
  818. pMgmt->sNodeDBTable[iSANodeIndex].bRxPSPoll = true;
  819. bScheduleCommand((void *)pDevice, WLAN_CMD_RX_PSPOLL, NULL);
  820. pr_debug("dpc: WLAN_CMD_RX_PSPOLL 2\n");
  821. }
  822. }
  823. } else {
  824. if (IS_FC_POWERMGT(pbyFrame)) {
  825. pMgmt->sNodeDBTable[iSANodeIndex].bPSEnable = true;
  826. // Once if STA in PS state, enable multicast bufferring
  827. pMgmt->sNodeDBTable[0].bPSEnable = true;
  828. } else {
  829. // clear all pending PS frame.
  830. if (pMgmt->sNodeDBTable[iSANodeIndex].wEnQueueCnt > 0) {
  831. pMgmt->sNodeDBTable[iSANodeIndex].bPSEnable = false;
  832. pMgmt->sNodeDBTable[iSANodeIndex].bRxPSPoll = true;
  833. bScheduleCommand((void *)pDevice, WLAN_CMD_RX_PSPOLL, NULL);
  834. pr_debug("dpc: WLAN_CMD_RX_PSPOLL 3\n");
  835. }
  836. }
  837. }
  838. } else {
  839. vMgrDeAuthenBeginSta(pDevice,
  840. pMgmt,
  841. (unsigned char *)(p802_11Header->abyAddr2),
  842. (WLAN_MGMT_REASON_CLASS2_NONAUTH),
  843. &Status
  844. );
  845. pr_debug("dpc: send vMgrDeAuthenBeginSta 3\n");
  846. pr_debug("BSSID:%pM\n",
  847. p802_11Header->abyAddr3);
  848. pr_debug("ADDR2:%pM\n",
  849. p802_11Header->abyAddr2);
  850. pr_debug("ADDR1:%pM\n",
  851. p802_11Header->abyAddr1);
  852. pr_debug("dpc: wFrameCtl= %x\n",
  853. p802_11Header->wFrameCtl);
  854. VNSvInPortB(pDevice->PortOffset + MAC_REG_RCR, &(pDevice->byRxMode));
  855. pr_debug("dpc:pDevice->byRxMode = %x\n",
  856. pDevice->byRxMode);
  857. return true;
  858. }
  859. }
  860. }
  861. return false;
  862. }
  863. static bool s_bHandleRxEncryption(
  864. struct vnt_private *pDevice,
  865. unsigned char *pbyFrame,
  866. unsigned int FrameSize,
  867. unsigned char *pbyRsr,
  868. unsigned char *pbyNewRsr,
  869. PSKeyItem *pKeyOut,
  870. bool *pbExtIV,
  871. unsigned short *pwRxTSC15_0,
  872. unsigned long *pdwRxTSC47_16
  873. )
  874. {
  875. unsigned int PayloadLen = FrameSize;
  876. unsigned char *pbyIV;
  877. unsigned char byKeyIdx;
  878. PSKeyItem pKey = NULL;
  879. unsigned char byDecMode = KEY_CTL_WEP;
  880. PSMgmtObject pMgmt = pDevice->pMgmt;
  881. *pwRxTSC15_0 = 0;
  882. *pdwRxTSC47_16 = 0;
  883. pbyIV = pbyFrame + WLAN_HDR_ADDR3_LEN;
  884. if (WLAN_GET_FC_TODS(*(unsigned short *)pbyFrame) &&
  885. WLAN_GET_FC_FROMDS(*(unsigned short *)pbyFrame)) {
  886. pbyIV += 6; // 6 is 802.11 address4
  887. PayloadLen -= 6;
  888. }
  889. byKeyIdx = (*(pbyIV+3) & 0xc0);
  890. byKeyIdx >>= 6;
  891. pr_debug("\nKeyIdx: %d\n", byKeyIdx);
  892. if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA) ||
  893. (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) ||
  894. (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) ||
  895. (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) ||
  896. (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) {
  897. if (((*pbyRsr & (RSR_ADDRBROAD | RSR_ADDRMULTI)) == 0) &&
  898. (pDevice->pMgmt->byCSSPK != KEY_CTL_NONE)) {
  899. // unicast pkt use pairwise key
  900. pr_debug("unicast pkt\n");
  901. if (KeybGetKey(&(pDevice->sKey), pDevice->abyBSSID, 0xFFFFFFFF, &pKey) == true) {
  902. if (pDevice->pMgmt->byCSSPK == KEY_CTL_TKIP)
  903. byDecMode = KEY_CTL_TKIP;
  904. else if (pDevice->pMgmt->byCSSPK == KEY_CTL_CCMP)
  905. byDecMode = KEY_CTL_CCMP;
  906. }
  907. pr_debug("unicast pkt: %d, %p\n", byDecMode, pKey);
  908. } else {
  909. // use group key
  910. KeybGetKey(&(pDevice->sKey), pDevice->abyBSSID, byKeyIdx, &pKey);
  911. if (pDevice->pMgmt->byCSSGK == KEY_CTL_TKIP)
  912. byDecMode = KEY_CTL_TKIP;
  913. else if (pDevice->pMgmt->byCSSGK == KEY_CTL_CCMP)
  914. byDecMode = KEY_CTL_CCMP;
  915. pr_debug("group pkt: %d, %d, %p\n",
  916. byKeyIdx, byDecMode, pKey);
  917. }
  918. }
  919. // our WEP only support Default Key
  920. if (pKey == NULL) {
  921. // use default group key
  922. KeybGetKey(&(pDevice->sKey), pDevice->abyBroadcastAddr, byKeyIdx, &pKey);
  923. if (pDevice->pMgmt->byCSSGK == KEY_CTL_TKIP)
  924. byDecMode = KEY_CTL_TKIP;
  925. else if (pDevice->pMgmt->byCSSGK == KEY_CTL_CCMP)
  926. byDecMode = KEY_CTL_CCMP;
  927. }
  928. *pKeyOut = pKey;
  929. pr_debug("AES:%d %d %d\n",
  930. pDevice->pMgmt->byCSSPK, pDevice->pMgmt->byCSSGK, byDecMode);
  931. if (pKey == NULL) {
  932. pr_debug("pKey == NULL\n");
  933. return false;
  934. }
  935. if (byDecMode != pKey->byCipherSuite) {
  936. *pKeyOut = NULL;
  937. return false;
  938. }
  939. if (byDecMode == KEY_CTL_WEP) {
  940. // handle WEP
  941. if ((pDevice->byLocalID <= REV_ID_VT3253_A1) ||
  942. (((PSKeyTable)(pKey->pvKeyTable))->bSoftWEP == true)) {
  943. // Software WEP
  944. // 1. 3253A
  945. // 2. WEP 256
  946. PayloadLen -= (WLAN_HDR_ADDR3_LEN + 4 + 4); // 24 is 802.11 header,4 is IV, 4 is crc
  947. memcpy(pDevice->abyPRNG, pbyIV, 3);
  948. memcpy(pDevice->abyPRNG + 3, pKey->abyKey, pKey->uKeyLength);
  949. rc4_init(&pDevice->SBox, pDevice->abyPRNG, pKey->uKeyLength + 3);
  950. rc4_encrypt(&pDevice->SBox, pbyIV+4, pbyIV+4, PayloadLen);
  951. if (ETHbIsBufferCrc32Ok(pbyIV+4, PayloadLen))
  952. *pbyNewRsr |= NEWRSR_DECRYPTOK;
  953. }
  954. } else if ((byDecMode == KEY_CTL_TKIP) ||
  955. (byDecMode == KEY_CTL_CCMP)) {
  956. // TKIP/AES
  957. PayloadLen -= (WLAN_HDR_ADDR3_LEN + 8 + 4); // 24 is 802.11 header, 8 is IV&ExtIV, 4 is crc
  958. *pdwRxTSC47_16 = cpu_to_le32(*(unsigned long *)(pbyIV + 4));
  959. pr_debug("ExtIV: %lx\n", *pdwRxTSC47_16);
  960. if (byDecMode == KEY_CTL_TKIP)
  961. *pwRxTSC15_0 = cpu_to_le16(MAKEWORD(*(pbyIV + 2), *pbyIV));
  962. else
  963. *pwRxTSC15_0 = cpu_to_le16(*(unsigned short *)pbyIV);
  964. pr_debug("TSC0_15: %x\n", *pwRxTSC15_0);
  965. if ((byDecMode == KEY_CTL_TKIP) &&
  966. (pDevice->byLocalID <= REV_ID_VT3253_A1)) {
  967. // Software TKIP
  968. // 1. 3253 A
  969. PS802_11Header pMACHeader = (PS802_11Header)(pbyFrame);
  970. TKIPvMixKey(pKey->abyKey, pMACHeader->abyAddr2, *pwRxTSC15_0, *pdwRxTSC47_16, pDevice->abyPRNG);
  971. rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
  972. rc4_encrypt(&pDevice->SBox, pbyIV+8, pbyIV+8, PayloadLen);
  973. if (ETHbIsBufferCrc32Ok(pbyIV+8, PayloadLen)) {
  974. *pbyNewRsr |= NEWRSR_DECRYPTOK;
  975. pr_debug("ICV OK!\n");
  976. } else {
  977. pr_debug("ICV FAIL!!!\n");
  978. pr_debug("PayloadLen = %d\n", PayloadLen);
  979. }
  980. }
  981. }// end of TKIP/AES
  982. if ((*(pbyIV+3) & 0x20) != 0)
  983. *pbExtIV = true;
  984. return true;
  985. }
  986. static bool s_bHostWepRxEncryption(
  987. struct vnt_private *pDevice,
  988. unsigned char *pbyFrame,
  989. unsigned int FrameSize,
  990. unsigned char *pbyRsr,
  991. bool bOnFly,
  992. PSKeyItem pKey,
  993. unsigned char *pbyNewRsr,
  994. bool *pbExtIV,
  995. unsigned short *pwRxTSC15_0,
  996. unsigned long *pdwRxTSC47_16
  997. )
  998. {
  999. unsigned int PayloadLen = FrameSize;
  1000. unsigned char *pbyIV;
  1001. unsigned char byKeyIdx;
  1002. unsigned char byDecMode = KEY_CTL_WEP;
  1003. PS802_11Header pMACHeader;
  1004. *pwRxTSC15_0 = 0;
  1005. *pdwRxTSC47_16 = 0;
  1006. pbyIV = pbyFrame + WLAN_HDR_ADDR3_LEN;
  1007. if (WLAN_GET_FC_TODS(*(unsigned short *)pbyFrame) &&
  1008. WLAN_GET_FC_FROMDS(*(unsigned short *)pbyFrame)) {
  1009. pbyIV += 6; // 6 is 802.11 address4
  1010. PayloadLen -= 6;
  1011. }
  1012. byKeyIdx = (*(pbyIV+3) & 0xc0);
  1013. byKeyIdx >>= 6;
  1014. pr_debug("\nKeyIdx: %d\n", byKeyIdx);
  1015. if (pDevice->pMgmt->byCSSGK == KEY_CTL_TKIP)
  1016. byDecMode = KEY_CTL_TKIP;
  1017. else if (pDevice->pMgmt->byCSSGK == KEY_CTL_CCMP)
  1018. byDecMode = KEY_CTL_CCMP;
  1019. pr_debug("AES:%d %d %d\n",
  1020. pDevice->pMgmt->byCSSPK, pDevice->pMgmt->byCSSGK, byDecMode);
  1021. if (byDecMode != pKey->byCipherSuite)
  1022. return false;
  1023. if (byDecMode == KEY_CTL_WEP) {
  1024. // handle WEP
  1025. pr_debug("byDecMode == KEY_CTL_WEP\n");
  1026. if ((pDevice->byLocalID <= REV_ID_VT3253_A1) ||
  1027. (((PSKeyTable)(pKey->pvKeyTable))->bSoftWEP == true) ||
  1028. !bOnFly) {
  1029. // Software WEP
  1030. // 1. 3253A
  1031. // 2. WEP 256
  1032. // 3. NotOnFly
  1033. PayloadLen -= (WLAN_HDR_ADDR3_LEN + 4 + 4); // 24 is 802.11 header,4 is IV, 4 is crc
  1034. memcpy(pDevice->abyPRNG, pbyIV, 3);
  1035. memcpy(pDevice->abyPRNG + 3, pKey->abyKey, pKey->uKeyLength);
  1036. rc4_init(&pDevice->SBox, pDevice->abyPRNG, pKey->uKeyLength + 3);
  1037. rc4_encrypt(&pDevice->SBox, pbyIV+4, pbyIV+4, PayloadLen);
  1038. if (ETHbIsBufferCrc32Ok(pbyIV+4, PayloadLen))
  1039. *pbyNewRsr |= NEWRSR_DECRYPTOK;
  1040. }
  1041. } else if ((byDecMode == KEY_CTL_TKIP) ||
  1042. (byDecMode == KEY_CTL_CCMP)) {
  1043. // TKIP/AES
  1044. PayloadLen -= (WLAN_HDR_ADDR3_LEN + 8 + 4); // 24 is 802.11 header, 8 is IV&ExtIV, 4 is crc
  1045. *pdwRxTSC47_16 = cpu_to_le32(*(unsigned long *)(pbyIV + 4));
  1046. pr_debug("ExtIV: %lx\n", *pdwRxTSC47_16);
  1047. if (byDecMode == KEY_CTL_TKIP)
  1048. *pwRxTSC15_0 = cpu_to_le16(MAKEWORD(*(pbyIV+2), *pbyIV));
  1049. else
  1050. *pwRxTSC15_0 = cpu_to_le16(*(unsigned short *)pbyIV);
  1051. pr_debug("TSC0_15: %x\n", *pwRxTSC15_0);
  1052. if (byDecMode == KEY_CTL_TKIP) {
  1053. if ((pDevice->byLocalID <= REV_ID_VT3253_A1) || !bOnFly) {
  1054. // Software TKIP
  1055. // 1. 3253 A
  1056. // 2. NotOnFly
  1057. pr_debug("soft KEY_CTL_TKIP\n");
  1058. pMACHeader = (PS802_11Header)(pbyFrame);
  1059. TKIPvMixKey(pKey->abyKey, pMACHeader->abyAddr2, *pwRxTSC15_0, *pdwRxTSC47_16, pDevice->abyPRNG);
  1060. rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN);
  1061. rc4_encrypt(&pDevice->SBox, pbyIV+8, pbyIV+8, PayloadLen);
  1062. if (ETHbIsBufferCrc32Ok(pbyIV+8, PayloadLen)) {
  1063. *pbyNewRsr |= NEWRSR_DECRYPTOK;
  1064. pr_debug("ICV OK!\n");
  1065. } else {
  1066. pr_debug("ICV FAIL!!!\n");
  1067. pr_debug("PayloadLen = %d\n",
  1068. PayloadLen);
  1069. }
  1070. }
  1071. }
  1072. if (byDecMode == KEY_CTL_CCMP) {
  1073. if (!bOnFly) {
  1074. // Software CCMP
  1075. // NotOnFly
  1076. pr_debug("soft KEY_CTL_CCMP\n");
  1077. if (AESbGenCCMP(pKey->abyKey, pbyFrame, FrameSize)) {
  1078. *pbyNewRsr |= NEWRSR_DECRYPTOK;
  1079. pr_debug("CCMP MIC compare OK!\n");
  1080. } else {
  1081. pr_debug("CCMP MIC fail!\n");
  1082. }
  1083. }
  1084. }
  1085. }// end of TKIP/AES
  1086. if ((*(pbyIV+3) & 0x20) != 0)
  1087. *pbExtIV = true;
  1088. return true;
  1089. }
  1090. static bool s_bAPModeRxData(
  1091. struct vnt_private *pDevice,
  1092. struct sk_buff *skb,
  1093. unsigned int FrameSize,
  1094. unsigned int cbHeaderOffset,
  1095. int iSANodeIndex,
  1096. int iDANodeIndex
  1097. )
  1098. {
  1099. PSMgmtObject pMgmt = pDevice->pMgmt;
  1100. bool bRelayAndForward = false;
  1101. bool bRelayOnly = false;
  1102. unsigned char byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
  1103. unsigned short wAID;
  1104. struct sk_buff *skbcpy = NULL;
  1105. if (FrameSize > CB_MAX_BUF_SIZE)
  1106. return false;
  1107. // check DA
  1108. if (is_multicast_ether_addr((unsigned char *)(skb->data+cbHeaderOffset))) {
  1109. if (pMgmt->sNodeDBTable[0].bPSEnable) {
  1110. skbcpy = dev_alloc_skb((int)pDevice->rx_buf_sz);
  1111. // if any node in PS mode, buffer packet until DTIM.
  1112. if (skbcpy == NULL) {
  1113. pr_info("relay multicast no skb available\n");
  1114. } else {
  1115. skbcpy->dev = pDevice->dev;
  1116. skbcpy->len = FrameSize;
  1117. memcpy(skbcpy->data, skb->data+cbHeaderOffset, FrameSize);
  1118. skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skbcpy);
  1119. pMgmt->sNodeDBTable[0].wEnQueueCnt++;
  1120. // set tx map
  1121. pMgmt->abyPSTxMap[0] |= byMask[0];
  1122. }
  1123. } else {
  1124. bRelayAndForward = true;
  1125. }
  1126. } else {
  1127. // check if relay
  1128. if (BSSDBbIsSTAInNodeDB(pMgmt, (unsigned char *)(skb->data+cbHeaderOffset), &iDANodeIndex)) {
  1129. if (pMgmt->sNodeDBTable[iDANodeIndex].eNodeState >= NODE_ASSOC) {
  1130. if (pMgmt->sNodeDBTable[iDANodeIndex].bPSEnable) {
  1131. // queue this skb until next PS tx, and then release.
  1132. skb->data += cbHeaderOffset;
  1133. skb->tail += cbHeaderOffset;
  1134. skb_put(skb, FrameSize);
  1135. skb_queue_tail(&pMgmt->sNodeDBTable[iDANodeIndex].sTxPSQueue, skb);
  1136. pMgmt->sNodeDBTable[iDANodeIndex].wEnQueueCnt++;
  1137. wAID = pMgmt->sNodeDBTable[iDANodeIndex].wAID;
  1138. pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7];
  1139. pr_debug("relay: index= %d, pMgmt->abyPSTxMap[%d]= %d\n",
  1140. iDANodeIndex, (wAID >> 3),
  1141. pMgmt->abyPSTxMap[wAID >> 3]);
  1142. return true;
  1143. } else {
  1144. bRelayOnly = true;
  1145. }
  1146. }
  1147. }
  1148. }
  1149. if (bRelayOnly || bRelayAndForward) {
  1150. // relay this packet right now
  1151. if (bRelayAndForward)
  1152. iDANodeIndex = 0;
  1153. if ((pDevice->uAssocCount > 1) && (iDANodeIndex >= 0))
  1154. ROUTEbRelay(pDevice, (unsigned char *)(skb->data + cbHeaderOffset), FrameSize, (unsigned int)iDANodeIndex);
  1155. if (bRelayOnly)
  1156. return false;
  1157. }
  1158. // none associate, don't forward
  1159. if (pDevice->uAssocCount == 0)
  1160. return false;
  1161. return true;
  1162. }