80211mgr.c 23 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019
  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: 80211mgr.c
  20. *
  21. * Purpose: Handles the 802.11 management support functions
  22. *
  23. * Author: Lyndon Chen
  24. *
  25. * Date: May 8, 2002
  26. *
  27. * Functions:
  28. * vMgrEncodeBeacon - Encode the Beacon frame
  29. * vMgrDecodeBeacon - Decode the Beacon frame
  30. * vMgrEncodeIBSSATIM - Encode the IBSS ATIM frame
  31. * vMgrDecodeIBSSATIM - Decode the IBSS ATIM frame
  32. * vMgrEncodeDisassociation - Encode the Disassociation frame
  33. * vMgrDecodeDisassociation - Decode the Disassociation frame
  34. * vMgrEncodeAssocRequest - Encode the Association request frame
  35. * vMgrDecodeAssocRequest - Decode the Association request frame
  36. * vMgrEncodeAssocResponse - Encode the Association response frame
  37. * vMgrDecodeAssocResponse - Decode the Association response frame
  38. * vMgrEncodeReAssocRequest - Encode the ReAssociation request frame
  39. * vMgrDecodeReAssocRequest - Decode the ReAssociation request frame
  40. * vMgrEncodeProbeRequest - Encode the Probe request frame
  41. * vMgrDecodeProbeRequest - Decode the Probe request frame
  42. * vMgrEncodeProbeResponse - Encode the Probe response frame
  43. * vMgrDecodeProbeResponse - Decode the Probe response frame
  44. * vMgrEncodeAuthen - Encode the Authentication frame
  45. * vMgrDecodeAuthen - Decode the Authentication frame
  46. * vMgrEncodeDeauthen - Encode the DeAuthentication frame
  47. * vMgrDecodeDeauthen - Decode the DeAuthentication frame
  48. * vMgrEncodeReassocResponse - Encode the Reassociation response frame
  49. * vMgrDecodeReassocResponse - Decode the Reassociation response frame
  50. *
  51. * Revision History:
  52. *
  53. */
  54. #include "tmacro.h"
  55. #include "tether.h"
  56. #include "80211mgr.h"
  57. #include "80211hdr.h"
  58. #include "device.h"
  59. #include "wpa.h"
  60. /*--------------------- Static Definitions -------------------------*/
  61. /*--------------------- Static Classes ----------------------------*/
  62. /*--------------------- Static Functions --------------------------*/
  63. /*--------------------- Export Variables --------------------------*/
  64. /*--------------------- Export Functions --------------------------*/
  65. /*+
  66. *
  67. * Routine Description:
  68. * Encode Beacon frame body offset
  69. *
  70. * Return Value:
  71. * None.
  72. *
  73. -*/
  74. void
  75. vMgrEncodeBeacon(
  76. PWLAN_FR_BEACON pFrame
  77. )
  78. {
  79. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  80. /* Fixed Fields */
  81. pFrame->pqwTimestamp = (__le64 *)
  82. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  83. WLAN_BEACON_OFF_TS);
  84. pFrame->pwBeaconInterval = (unsigned short *)
  85. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  86. WLAN_BEACON_OFF_BCN_INT);
  87. pFrame->pwCapInfo = (unsigned short *)
  88. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  89. WLAN_BEACON_OFF_CAPINFO);
  90. pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_BEACON_OFF_SSID;
  91. }
  92. /*+
  93. *
  94. * Routine Description:
  95. * Decode Beacon frame body offset
  96. *
  97. *
  98. * Return Value:
  99. * None.
  100. *
  101. -*/
  102. void
  103. vMgrDecodeBeacon(
  104. PWLAN_FR_BEACON pFrame
  105. )
  106. {
  107. PWLAN_IE pItem;
  108. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  109. /* Fixed Fields */
  110. pFrame->pqwTimestamp = (__le64 *)
  111. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  112. WLAN_BEACON_OFF_TS);
  113. pFrame->pwBeaconInterval = (unsigned short *)
  114. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  115. WLAN_BEACON_OFF_BCN_INT);
  116. pFrame->pwCapInfo = (unsigned short *)
  117. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  118. WLAN_BEACON_OFF_CAPINFO);
  119. /* Information elements */
  120. pItem = (PWLAN_IE)((unsigned char *)
  121. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))) +
  122. WLAN_BEACON_OFF_SSID);
  123. while (((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) {
  124. switch (pItem->byElementID) {
  125. case WLAN_EID_SSID:
  126. if (pFrame->pSSID == NULL)
  127. pFrame->pSSID = (PWLAN_IE_SSID)pItem;
  128. break;
  129. case WLAN_EID_SUPP_RATES:
  130. if (pFrame->pSuppRates == NULL)
  131. pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
  132. break;
  133. case WLAN_EID_FH_PARMS:
  134. /* pFrame->pFHParms = (PWLAN_IE_FH_PARMS)pItem; */
  135. break;
  136. case WLAN_EID_DS_PARMS:
  137. if (pFrame->pDSParms == NULL)
  138. pFrame->pDSParms = (PWLAN_IE_DS_PARMS)pItem;
  139. break;
  140. case WLAN_EID_CF_PARMS:
  141. if (pFrame->pCFParms == NULL)
  142. pFrame->pCFParms = (PWLAN_IE_CF_PARMS)pItem;
  143. break;
  144. case WLAN_EID_IBSS_PARMS:
  145. if (pFrame->pIBSSParms == NULL)
  146. pFrame->pIBSSParms = (PWLAN_IE_IBSS_PARMS)pItem;
  147. break;
  148. case WLAN_EID_TIM:
  149. if (pFrame->pTIM == NULL)
  150. pFrame->pTIM = (PWLAN_IE_TIM)pItem;
  151. break;
  152. case WLAN_EID_RSN:
  153. if (pFrame->pRSN == NULL)
  154. pFrame->pRSN = (PWLAN_IE_RSN)pItem;
  155. break;
  156. case WLAN_EID_RSN_WPA:
  157. if (pFrame->pRSNWPA == NULL) {
  158. if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true)
  159. pFrame->pRSNWPA =
  160. (PWLAN_IE_RSN_EXT)pItem;
  161. }
  162. break;
  163. case WLAN_EID_ERP:
  164. if (pFrame->pERP == NULL)
  165. pFrame->pERP = (PWLAN_IE_ERP)pItem;
  166. break;
  167. case WLAN_EID_EXTSUPP_RATES:
  168. if (pFrame->pExtSuppRates == NULL)
  169. pFrame->pExtSuppRates =
  170. (PWLAN_IE_SUPP_RATES)pItem;
  171. break;
  172. case WLAN_EID_COUNTRY: /* 7 */
  173. if (pFrame->pIE_Country == NULL)
  174. pFrame->pIE_Country = (PWLAN_IE_COUNTRY)pItem;
  175. break;
  176. case WLAN_EID_PWR_CONSTRAINT: /* 32 */
  177. if (pFrame->pIE_PowerConstraint == NULL)
  178. pFrame->pIE_PowerConstraint =
  179. (PWLAN_IE_PW_CONST)pItem;
  180. break;
  181. case WLAN_EID_CH_SWITCH: /* 37 */
  182. if (pFrame->pIE_CHSW == NULL)
  183. pFrame->pIE_CHSW = (PWLAN_IE_CH_SW)pItem;
  184. break;
  185. case WLAN_EID_QUIET: /* 40 */
  186. if (pFrame->pIE_Quiet == NULL)
  187. pFrame->pIE_Quiet = (PWLAN_IE_QUIET)pItem;
  188. break;
  189. case WLAN_EID_IBSS_DFS:
  190. if (pFrame->pIE_IBSSDFS == NULL)
  191. pFrame->pIE_IBSSDFS = (PWLAN_IE_IBSS_DFS)pItem;
  192. break;
  193. default:
  194. pr_debug("Unrecognized EID=%dd in beacon decode\n",
  195. pItem->byElementID);
  196. break;
  197. }
  198. pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
  199. }
  200. }
  201. /*+
  202. *
  203. * Routine Description:
  204. * Encode IBSS ATIM
  205. *
  206. *
  207. * Return Value:
  208. * None.
  209. *
  210. -*/
  211. void
  212. vMgrEncodeIBSSATIM(
  213. PWLAN_FR_IBSSATIM pFrame
  214. )
  215. {
  216. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  217. pFrame->len = WLAN_HDR_ADDR3_LEN;
  218. }
  219. /*+
  220. *
  221. * Routine Description:
  222. * Decode IBSS ATIM
  223. *
  224. *
  225. * Return Value:
  226. * None.
  227. *
  228. -*/
  229. void
  230. vMgrDecodeIBSSATIM(
  231. PWLAN_FR_IBSSATIM pFrame
  232. )
  233. {
  234. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  235. }
  236. /*+
  237. *
  238. * Routine Description:
  239. * Encode Disassociation
  240. *
  241. *
  242. * Return Value:
  243. * None.
  244. *
  245. -*/
  246. void
  247. vMgrEncodeDisassociation(
  248. PWLAN_FR_DISASSOC pFrame
  249. )
  250. {
  251. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  252. /* Fixed Fields */
  253. pFrame->pwReason = (unsigned short *)
  254. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  255. WLAN_DISASSOC_OFF_REASON);
  256. pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_DISASSOC_OFF_REASON +
  257. sizeof(*(pFrame->pwReason));
  258. }
  259. /*+
  260. *
  261. * Routine Description:
  262. * Decode Disassociation
  263. *
  264. *
  265. * Return Value:
  266. * None.
  267. *
  268. -*/
  269. void
  270. vMgrDecodeDisassociation(
  271. PWLAN_FR_DISASSOC pFrame
  272. )
  273. {
  274. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  275. /* Fixed Fields */
  276. pFrame->pwReason = (unsigned short *)
  277. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  278. WLAN_DISASSOC_OFF_REASON);
  279. }
  280. /*+
  281. *
  282. * Routine Description:
  283. * Encode Association Request
  284. *
  285. *
  286. * Return Value:
  287. * None.
  288. *
  289. -*/
  290. void
  291. vMgrEncodeAssocRequest(
  292. PWLAN_FR_ASSOCREQ pFrame
  293. )
  294. {
  295. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  296. /* Fixed Fields */
  297. pFrame->pwCapInfo = (unsigned short *)
  298. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  299. WLAN_ASSOCREQ_OFF_CAP_INFO);
  300. pFrame->pwListenInterval = (unsigned short *)
  301. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  302. WLAN_ASSOCREQ_OFF_LISTEN_INT);
  303. pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_ASSOCREQ_OFF_LISTEN_INT +
  304. sizeof(*(pFrame->pwListenInterval));
  305. }
  306. /*+
  307. *
  308. * Routine Description: (AP)
  309. * Decode Association Request
  310. *
  311. *
  312. * Return Value:
  313. * None.
  314. *
  315. -*/
  316. void
  317. vMgrDecodeAssocRequest(
  318. PWLAN_FR_ASSOCREQ pFrame
  319. )
  320. {
  321. PWLAN_IE pItem;
  322. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  323. /* Fixed Fields */
  324. pFrame->pwCapInfo = (unsigned short *)
  325. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  326. WLAN_ASSOCREQ_OFF_CAP_INFO);
  327. pFrame->pwListenInterval = (unsigned short *)
  328. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  329. WLAN_ASSOCREQ_OFF_LISTEN_INT);
  330. /* Information elements */
  331. pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
  332. + WLAN_ASSOCREQ_OFF_SSID);
  333. while (((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) {
  334. switch (pItem->byElementID) {
  335. case WLAN_EID_SSID:
  336. if (pFrame->pSSID == NULL)
  337. pFrame->pSSID = (PWLAN_IE_SSID)pItem;
  338. break;
  339. case WLAN_EID_SUPP_RATES:
  340. if (pFrame->pSuppRates == NULL)
  341. pFrame->pSuppRates =
  342. (PWLAN_IE_SUPP_RATES)pItem;
  343. break;
  344. case WLAN_EID_RSN:
  345. if (pFrame->pRSN == NULL)
  346. pFrame->pRSN = (PWLAN_IE_RSN)pItem;
  347. break;
  348. case WLAN_EID_RSN_WPA:
  349. if (pFrame->pRSNWPA == NULL) {
  350. if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true)
  351. pFrame->pRSNWPA =
  352. (PWLAN_IE_RSN_EXT)pItem;
  353. }
  354. break;
  355. case WLAN_EID_EXTSUPP_RATES:
  356. if (pFrame->pExtSuppRates == NULL)
  357. pFrame->pExtSuppRates =
  358. (PWLAN_IE_SUPP_RATES)pItem;
  359. break;
  360. default:
  361. pr_debug("Unrecognized EID=%dd in assocreq decode\n",
  362. pItem->byElementID);
  363. break;
  364. }
  365. pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
  366. }
  367. }
  368. /*+
  369. *
  370. * Routine Description: (AP)
  371. * Encode Association Response
  372. *
  373. *
  374. * Return Value:
  375. * None.
  376. *
  377. -*/
  378. void
  379. vMgrEncodeAssocResponse(
  380. PWLAN_FR_ASSOCRESP pFrame
  381. )
  382. {
  383. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  384. /* Fixed Fields */
  385. pFrame->pwCapInfo = (unsigned short *)
  386. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  387. WLAN_ASSOCRESP_OFF_CAP_INFO);
  388. pFrame->pwStatus = (unsigned short *)
  389. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  390. WLAN_ASSOCRESP_OFF_STATUS);
  391. pFrame->pwAid = (unsigned short *)
  392. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  393. WLAN_ASSOCRESP_OFF_AID);
  394. pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_ASSOCRESP_OFF_AID +
  395. sizeof(*(pFrame->pwAid));
  396. }
  397. /*+
  398. *
  399. * Routine Description:
  400. * Decode Association Response
  401. *
  402. *
  403. * Return Value:
  404. * None.
  405. *
  406. -*/
  407. void
  408. vMgrDecodeAssocResponse(
  409. PWLAN_FR_ASSOCRESP pFrame
  410. )
  411. {
  412. PWLAN_IE pItem;
  413. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  414. /* Fixed Fields */
  415. pFrame->pwCapInfo = (unsigned short *)
  416. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  417. WLAN_ASSOCRESP_OFF_CAP_INFO);
  418. pFrame->pwStatus = (unsigned short *)
  419. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  420. WLAN_ASSOCRESP_OFF_STATUS);
  421. pFrame->pwAid = (unsigned short *)
  422. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  423. WLAN_ASSOCRESP_OFF_AID);
  424. /* Information elements */
  425. pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)
  426. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  427. WLAN_ASSOCRESP_OFF_SUPP_RATES);
  428. pItem = (PWLAN_IE)(pFrame->pSuppRates);
  429. pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
  430. if ((((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) &&
  431. (pItem->byElementID == WLAN_EID_EXTSUPP_RATES)) {
  432. pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
  433. pr_debug("pFrame->pExtSuppRates=[%p]\n", pItem);
  434. } else {
  435. pFrame->pExtSuppRates = NULL;
  436. }
  437. }
  438. /*+
  439. *
  440. * Routine Description:
  441. * Encode Reassociation Request
  442. *
  443. *
  444. * Return Value:
  445. * None.
  446. *
  447. -*/
  448. void
  449. vMgrEncodeReassocRequest(
  450. PWLAN_FR_REASSOCREQ pFrame
  451. )
  452. {
  453. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  454. /* Fixed Fields */
  455. pFrame->pwCapInfo = (unsigned short *)
  456. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  457. WLAN_REASSOCREQ_OFF_CAP_INFO);
  458. pFrame->pwListenInterval = (unsigned short *)
  459. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  460. WLAN_REASSOCREQ_OFF_LISTEN_INT);
  461. pFrame->pAddrCurrAP = (PIEEE_ADDR)
  462. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  463. WLAN_REASSOCREQ_OFF_CURR_AP);
  464. pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_REASSOCREQ_OFF_CURR_AP +
  465. sizeof(*(pFrame->pAddrCurrAP));
  466. }
  467. /*+
  468. *
  469. * Routine Description: (AP)
  470. * Decode Reassociation Request
  471. *
  472. *
  473. * Return Value:
  474. * None.
  475. *
  476. -*/
  477. void
  478. vMgrDecodeReassocRequest(
  479. PWLAN_FR_REASSOCREQ pFrame
  480. )
  481. {
  482. PWLAN_IE pItem;
  483. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  484. /* Fixed Fields */
  485. pFrame->pwCapInfo = (unsigned short *)
  486. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  487. WLAN_REASSOCREQ_OFF_CAP_INFO);
  488. pFrame->pwListenInterval = (unsigned short *)
  489. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  490. WLAN_REASSOCREQ_OFF_LISTEN_INT);
  491. pFrame->pAddrCurrAP = (PIEEE_ADDR)
  492. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  493. WLAN_REASSOCREQ_OFF_CURR_AP);
  494. /* Information elements */
  495. pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
  496. + WLAN_REASSOCREQ_OFF_SSID);
  497. while (((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) {
  498. switch (pItem->byElementID) {
  499. case WLAN_EID_SSID:
  500. if (pFrame->pSSID == NULL)
  501. pFrame->pSSID = (PWLAN_IE_SSID)pItem;
  502. break;
  503. case WLAN_EID_SUPP_RATES:
  504. if (pFrame->pSuppRates == NULL)
  505. pFrame->pSuppRates =
  506. (PWLAN_IE_SUPP_RATES)pItem;
  507. break;
  508. case WLAN_EID_RSN:
  509. if (pFrame->pRSN == NULL)
  510. pFrame->pRSN = (PWLAN_IE_RSN)pItem;
  511. break;
  512. case WLAN_EID_RSN_WPA:
  513. if (pFrame->pRSNWPA == NULL) {
  514. if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true)
  515. pFrame->pRSNWPA =
  516. (PWLAN_IE_RSN_EXT)pItem;
  517. }
  518. break;
  519. case WLAN_EID_EXTSUPP_RATES:
  520. if (pFrame->pExtSuppRates == NULL)
  521. pFrame->pExtSuppRates =
  522. (PWLAN_IE_SUPP_RATES)pItem;
  523. break;
  524. default:
  525. pr_debug("Unrecognized EID=%dd in reassocreq decode\n",
  526. pItem->byElementID);
  527. break;
  528. }
  529. pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
  530. }
  531. }
  532. /*+
  533. *
  534. * Routine Description:
  535. * Encode Probe Request
  536. *
  537. *
  538. * Return Value:
  539. * None.
  540. *
  541. -*/
  542. void
  543. vMgrEncodeProbeRequest(
  544. PWLAN_FR_PROBEREQ pFrame
  545. )
  546. {
  547. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  548. pFrame->len = WLAN_HDR_ADDR3_LEN;
  549. }
  550. /*+
  551. *
  552. * Routine Description:
  553. * Decode Probe Request
  554. *
  555. *
  556. * Return Value:
  557. * None.
  558. *
  559. -*/
  560. void
  561. vMgrDecodeProbeRequest(
  562. PWLAN_FR_PROBEREQ pFrame
  563. )
  564. {
  565. PWLAN_IE pItem;
  566. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  567. /* Information elements */
  568. pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)));
  569. while (((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) {
  570. switch (pItem->byElementID) {
  571. case WLAN_EID_SSID:
  572. if (pFrame->pSSID == NULL)
  573. pFrame->pSSID = (PWLAN_IE_SSID)pItem;
  574. break;
  575. case WLAN_EID_SUPP_RATES:
  576. if (pFrame->pSuppRates == NULL)
  577. pFrame->pSuppRates =
  578. (PWLAN_IE_SUPP_RATES)pItem;
  579. break;
  580. case WLAN_EID_EXTSUPP_RATES:
  581. if (pFrame->pExtSuppRates == NULL)
  582. pFrame->pExtSuppRates =
  583. (PWLAN_IE_SUPP_RATES)pItem;
  584. break;
  585. default:
  586. pr_debug("Bad EID=%dd in probereq\n",
  587. pItem->byElementID);
  588. break;
  589. }
  590. pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
  591. }
  592. }
  593. /*+
  594. *
  595. * Routine Description:
  596. * Encode Probe Response
  597. *
  598. *
  599. * Return Value:
  600. * None.
  601. *
  602. -*/
  603. void
  604. vMgrEncodeProbeResponse(
  605. PWLAN_FR_PROBERESP pFrame
  606. )
  607. {
  608. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  609. /* Fixed Fields */
  610. pFrame->pqwTimestamp = (__le64 *)
  611. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  612. WLAN_PROBERESP_OFF_TS);
  613. pFrame->pwBeaconInterval = (unsigned short *)
  614. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  615. WLAN_PROBERESP_OFF_BCN_INT);
  616. pFrame->pwCapInfo = (unsigned short *)
  617. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  618. WLAN_PROBERESP_OFF_CAP_INFO);
  619. pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_PROBERESP_OFF_CAP_INFO +
  620. sizeof(*(pFrame->pwCapInfo));
  621. }
  622. /*+
  623. *
  624. * Routine Description:
  625. * Decode Probe Response
  626. *
  627. *
  628. * Return Value:
  629. * None.
  630. *
  631. -*/
  632. void
  633. vMgrDecodeProbeResponse(
  634. PWLAN_FR_PROBERESP pFrame
  635. )
  636. {
  637. PWLAN_IE pItem;
  638. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  639. /* Fixed Fields */
  640. pFrame->pqwTimestamp = (__le64 *)
  641. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  642. WLAN_PROBERESP_OFF_TS);
  643. pFrame->pwBeaconInterval = (unsigned short *)
  644. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  645. WLAN_PROBERESP_OFF_BCN_INT);
  646. pFrame->pwCapInfo = (unsigned short *)
  647. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  648. WLAN_PROBERESP_OFF_CAP_INFO);
  649. /* Information elements */
  650. pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
  651. + WLAN_PROBERESP_OFF_SSID);
  652. while (((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) {
  653. switch (pItem->byElementID) {
  654. case WLAN_EID_SSID:
  655. if (pFrame->pSSID == NULL)
  656. pFrame->pSSID = (PWLAN_IE_SSID)pItem;
  657. break;
  658. case WLAN_EID_SUPP_RATES:
  659. if (pFrame->pSuppRates == NULL)
  660. pFrame->pSuppRates =
  661. (PWLAN_IE_SUPP_RATES)pItem;
  662. break;
  663. case WLAN_EID_FH_PARMS:
  664. break;
  665. case WLAN_EID_DS_PARMS:
  666. if (pFrame->pDSParms == NULL)
  667. pFrame->pDSParms = (PWLAN_IE_DS_PARMS)pItem;
  668. break;
  669. case WLAN_EID_CF_PARMS:
  670. if (pFrame->pCFParms == NULL)
  671. pFrame->pCFParms = (PWLAN_IE_CF_PARMS)pItem;
  672. break;
  673. case WLAN_EID_IBSS_PARMS:
  674. if (pFrame->pIBSSParms == NULL)
  675. pFrame->pIBSSParms =
  676. (PWLAN_IE_IBSS_PARMS)pItem;
  677. break;
  678. case WLAN_EID_RSN:
  679. if (pFrame->pRSN == NULL)
  680. pFrame->pRSN = (PWLAN_IE_RSN)pItem;
  681. break;
  682. case WLAN_EID_RSN_WPA:
  683. if (pFrame->pRSNWPA == NULL) {
  684. if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true)
  685. pFrame->pRSNWPA =
  686. (PWLAN_IE_RSN_EXT)pItem;
  687. }
  688. break;
  689. case WLAN_EID_ERP:
  690. if (pFrame->pERP == NULL)
  691. pFrame->pERP = (PWLAN_IE_ERP)pItem;
  692. break;
  693. case WLAN_EID_EXTSUPP_RATES:
  694. if (pFrame->pExtSuppRates == NULL)
  695. pFrame->pExtSuppRates =
  696. (PWLAN_IE_SUPP_RATES)pItem;
  697. break;
  698. case WLAN_EID_COUNTRY: /* 7 */
  699. if (pFrame->pIE_Country == NULL)
  700. pFrame->pIE_Country = (PWLAN_IE_COUNTRY)pItem;
  701. break;
  702. case WLAN_EID_PWR_CONSTRAINT: /* 32 */
  703. if (pFrame->pIE_PowerConstraint == NULL)
  704. pFrame->pIE_PowerConstraint =
  705. (PWLAN_IE_PW_CONST)pItem;
  706. break;
  707. case WLAN_EID_CH_SWITCH: /* 37 */
  708. if (pFrame->pIE_CHSW == NULL)
  709. pFrame->pIE_CHSW = (PWLAN_IE_CH_SW)pItem;
  710. break;
  711. case WLAN_EID_QUIET: /* 40 */
  712. if (pFrame->pIE_Quiet == NULL)
  713. pFrame->pIE_Quiet = (PWLAN_IE_QUIET)pItem;
  714. break;
  715. case WLAN_EID_IBSS_DFS:
  716. if (pFrame->pIE_IBSSDFS == NULL)
  717. pFrame->pIE_IBSSDFS = (PWLAN_IE_IBSS_DFS)pItem;
  718. break;
  719. default:
  720. pr_debug("Bad EID=%dd in proberesp\n",
  721. pItem->byElementID);
  722. break;
  723. }
  724. pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
  725. }
  726. }
  727. /*+
  728. *
  729. * Routine Description:
  730. * Encode Authentication frame
  731. *
  732. *
  733. * Return Value:
  734. * None.
  735. *
  736. -*/
  737. void
  738. vMgrEncodeAuthen(
  739. PWLAN_FR_AUTHEN pFrame
  740. )
  741. {
  742. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  743. /* Fixed Fields */
  744. pFrame->pwAuthAlgorithm = (unsigned short *)
  745. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  746. WLAN_AUTHEN_OFF_AUTH_ALG);
  747. pFrame->pwAuthSequence = (unsigned short *)
  748. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  749. WLAN_AUTHEN_OFF_AUTH_SEQ);
  750. pFrame->pwStatus = (unsigned short *)
  751. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  752. WLAN_AUTHEN_OFF_STATUS);
  753. pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_AUTHEN_OFF_STATUS +
  754. sizeof(*(pFrame->pwStatus));
  755. }
  756. /*+
  757. *
  758. * Routine Description:
  759. * Decode Authentication
  760. *
  761. *
  762. * Return Value:
  763. * None.
  764. *
  765. -*/
  766. void
  767. vMgrDecodeAuthen(
  768. PWLAN_FR_AUTHEN pFrame
  769. )
  770. {
  771. PWLAN_IE pItem;
  772. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  773. /* Fixed Fields */
  774. pFrame->pwAuthAlgorithm = (unsigned short *)
  775. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  776. WLAN_AUTHEN_OFF_AUTH_ALG);
  777. pFrame->pwAuthSequence = (unsigned short *)
  778. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  779. WLAN_AUTHEN_OFF_AUTH_SEQ);
  780. pFrame->pwStatus = (unsigned short *)
  781. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  782. WLAN_AUTHEN_OFF_STATUS);
  783. /* Information elements */
  784. pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))
  785. + WLAN_AUTHEN_OFF_CHALLENGE);
  786. if (((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len) &&
  787. pItem->byElementID == WLAN_EID_CHALLENGE)
  788. pFrame->pChallenge = (PWLAN_IE_CHALLENGE)pItem;
  789. }
  790. /*+
  791. *
  792. * Routine Description:
  793. * Encode Authentication
  794. *
  795. *
  796. * Return Value:
  797. * None.
  798. *
  799. -*/
  800. void
  801. vMgrEncodeDeauthen(
  802. PWLAN_FR_DEAUTHEN pFrame
  803. )
  804. {
  805. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  806. /* Fixed Fields */
  807. pFrame->pwReason = (unsigned short *)
  808. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  809. WLAN_DEAUTHEN_OFF_REASON);
  810. pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_DEAUTHEN_OFF_REASON +
  811. sizeof(*(pFrame->pwReason));
  812. }
  813. /*+
  814. *
  815. * Routine Description:
  816. * Decode Deauthentication
  817. *
  818. *
  819. * Return Value:
  820. * None.
  821. *
  822. -*/
  823. void
  824. vMgrDecodeDeauthen(
  825. PWLAN_FR_DEAUTHEN pFrame
  826. )
  827. {
  828. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  829. /* Fixed Fields */
  830. pFrame->pwReason = (unsigned short *)
  831. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  832. WLAN_DEAUTHEN_OFF_REASON);
  833. }
  834. /*+
  835. *
  836. * Routine Description: (AP)
  837. * Encode Reassociation Response
  838. *
  839. *
  840. * Return Value:
  841. * None.
  842. *
  843. -*/
  844. void
  845. vMgrEncodeReassocResponse(
  846. PWLAN_FR_REASSOCRESP pFrame
  847. )
  848. {
  849. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  850. /* Fixed Fields */
  851. pFrame->pwCapInfo = (unsigned short *)
  852. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  853. WLAN_REASSOCRESP_OFF_CAP_INFO);
  854. pFrame->pwStatus = (unsigned short *)
  855. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  856. WLAN_REASSOCRESP_OFF_STATUS);
  857. pFrame->pwAid = (unsigned short *)
  858. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  859. WLAN_REASSOCRESP_OFF_AID);
  860. pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_REASSOCRESP_OFF_AID +
  861. sizeof(*(pFrame->pwAid));
  862. }
  863. /*+
  864. *
  865. * Routine Description:
  866. * Decode Reassociation Response
  867. *
  868. *
  869. * Return Value:
  870. * None.
  871. *
  872. -*/
  873. void
  874. vMgrDecodeReassocResponse(
  875. PWLAN_FR_REASSOCRESP pFrame
  876. )
  877. {
  878. PWLAN_IE pItem;
  879. pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf;
  880. /* Fixed Fields */
  881. pFrame->pwCapInfo = (unsigned short *)
  882. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  883. WLAN_REASSOCRESP_OFF_CAP_INFO);
  884. pFrame->pwStatus = (unsigned short *)
  885. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  886. WLAN_REASSOCRESP_OFF_STATUS);
  887. pFrame->pwAid = (unsigned short *)
  888. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  889. WLAN_REASSOCRESP_OFF_AID);
  890. /* Information elements */
  891. pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)
  892. (WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) +
  893. WLAN_REASSOCRESP_OFF_SUPP_RATES);
  894. pItem = (PWLAN_IE)(pFrame->pSuppRates);
  895. pItem = (PWLAN_IE)(((unsigned char *)pItem) + 2 + pItem->len);
  896. if ((((unsigned char *)pItem) < (pFrame->pBuf + pFrame->len)) &&
  897. (pItem->byElementID == WLAN_EID_EXTSUPP_RATES)) {
  898. pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem;
  899. }
  900. }