wlan_p2p.c 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653
  1. /*
  2. ** Id: //Department/DaVinci/TRUNK/WiFi_P2P_Driver/common/wlan_p2p.c#8
  3. */
  4. /*! \file wlan_bow.c
  5. \brief This file contains the Wi-Fi Direct commands processing routines for
  6. MediaTek Inc. 802.11 Wireless LAN Adapters.
  7. */
  8. /*
  9. ** Log: wlan_p2p.c
  10. *
  11. * 07 17 2012 yuche.tsai
  12. * NULL
  13. * Compile no error before trial run.
  14. *
  15. * 11 24 2011 yuche.tsai
  16. * NULL
  17. * Fix P2P IOCTL of multicast address bug, add low power driver stop control.
  18. *
  19. * 11 22 2011 yuche.tsai
  20. * NULL
  21. * Update RSSI link quality of P2P Network query method. (Bug fix)
  22. *
  23. * 11 19 2011 yuche.tsai
  24. * NULL
  25. * Add RSSI support for P2P network.
  26. *
  27. * 11 08 2011 yuche.tsai
  28. * [WCXRP00001094] [Volunteer Patch][Driver] Driver version & supplicant version query & set support
  29. * for service discovery version check.
  30. * Add support for driver version query & p2p supplicant verseion set.
  31. * For new service discovery mechanism sync.
  32. *
  33. * 10 18 2011 yuche.tsai
  34. * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
  35. * Support Channel Query.
  36. *
  37. * 10 18 2011 yuche.tsai
  38. * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
  39. * New 2.1 branch
  40. *
  41. * 08 23 2011 yuche.tsai
  42. * NULL
  43. * Fix Multicast Issue of P2P.
  44. *
  45. * 04 27 2011 george.huang
  46. * [WCXRP00000684] [MT6620 Wi-Fi][Driver] Support P2P setting ARP filter
  47. * Support P2P ARP filter setting on early suspend/ late resume
  48. *
  49. * 04 08 2011 george.huang
  50. * [WCXRP00000621] [MT6620 Wi-Fi][Driver] Support P2P supplicant to set power mode
  51. * separate settings of P2P and AIS
  52. *
  53. * 03 22 2011 george.huang
  54. * [WCXRP00000504] [MT6620 Wi-Fi][FW] Support Sigma CAPI for power saving related command
  55. * link with supplicant commands
  56. *
  57. * 03 17 2011 wh.su
  58. * [WCXRP00000571] [MT6620 Wi-Fi] [Driver] Not check the p2p role during set key
  59. * Skip the p2p role for adding broadcast key issue.
  60. *
  61. * 03 16 2011 wh.su
  62. * [WCXRP00000530] [MT6620 Wi-Fi] [Driver] skip doing p2pRunEventAAAComplete after send assoc response Tx Done
  63. * fixed compiling error while enable dbg.
  64. *
  65. * 03 08 2011 yuche.tsai
  66. * [WCXRP00000480] [Volunteer Patch][MT6620][Driver] WCS IE format
  67. * issue[WCXRP00000509] [Volunteer Patch][MT6620][Driver] Kernal panic when remove p2p module.
  68. * .
  69. *
  70. * 03 07 2011 terry.wu
  71. * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
  72. * Toggle non-standard debug messages to comments.
  73. *
  74. * 03 07 2011 wh.su
  75. * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
  76. * rename the define to anti_pviracy.
  77. *
  78. * 03 05 2011 wh.su
  79. * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
  80. * add the code to get the check rsponse and indicate to app.
  81. *
  82. * 03 02 2011 wh.su
  83. * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
  84. * Add Security check related code.
  85. *
  86. * 03 02 2011 yuche.tsai
  87. * [WCXRP00000245] 1. Invitation Request/Response.
  88. 2. Provision Discovery Request/Response
  89. * Fix SD Request Query Length issue.
  90. *
  91. * 03 02 2011 yuche.tsai
  92. * [WCXRP00000245] 1. Invitation Request/Response.
  93. 2. Provision Discovery Request/Response
  94. * Service Discovery Request.
  95. *
  96. * 03 01 2011 yuche.tsai
  97. * [WCXRP00000245] 1. Invitation Request/Response.
  98. 2. Provision Discovery Request/Response
  99. * Update Service Discovery Wlan OID related function.
  100. *
  101. * 03 01 2011 yuche.tsai
  102. * [WCXRP00000245] 1. Invitation Request/Response.
  103. 2. Provision Discovery Request/Response
  104. * Update Service Discovery Related wlanoid function.
  105. *
  106. * 02 09 2011 yuche.tsai
  107. * [WCXRP00000245] 1. Invitation Request/Response.
  108. 2. Provision Discovery Request/Response
  109. * Add Service Discovery Indication Related code.
  110. *
  111. * 01 26 2011 yuche.tsai
  112. * [WCXRP00000245] 1. Invitation Request/Response.
  113. 2. Provision Discovery Request/Response
  114. * Add Service Discovery Function.
  115. *
  116. * 01 05 2011 cp.wu
  117. * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface
  118. * for supporting Wi-Fi Direct Service Discovery ioctl implementations for P2P Service Discovery
  119. *
  120. * 01 04 2011 cp.wu
  121. * [WCXRP00000338] [MT6620 Wi-Fi][Driver] Separate kalMemAlloc into kmalloc and vmalloc implementations to
  122. * ease physically continuous memory demands separate kalMemAlloc() into virtually-continuous
  123. * and physically-continuous type to ease slab system pressure
  124. *
  125. * 12 22 2010 cp.wu
  126. * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface
  127. * for supporting Wi-Fi Direct Service Discovery
  128. * 1. header file restructure for more clear module isolation
  129. * 2. add function interface definition for implementing Service Discovery callbacks
  130. *
  131. * 10 04 2010 cp.wu
  132. * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T
  133. * and replaced by ENUM_NETWORK_TYPE_INDEX_T only remove ENUM_NETWORK_TYPE_T definitions
  134. *
  135. * 09 28 2010 wh.su
  136. * NULL
  137. * [WCXRP00000069][MT6620 Wi-Fi][Driver] Fix some code for phase 1 P2P Demo.
  138. *
  139. * 09 21 2010 kevin.huang
  140. * [WCXRP00000054] [MT6620 Wi-Fi][Driver] Restructure driver for second Interface
  141. * Isolate P2P related function for Hardware Software Bundle
  142. *
  143. * 09 03 2010 kevin.huang
  144. * NULL
  145. * Refine #include sequence and solve recursive/nested #include issue
  146. *
  147. * 08 23 2010 cp.wu
  148. * NULL
  149. * revise constant definitions to be matched with implementation (original cmd-event definition is deprecated)
  150. *
  151. * 08 16 2010 cp.wu
  152. * NULL
  153. * add subroutines for P2P to set multicast list.
  154. *
  155. * 08 16 2010 george.huang
  156. * NULL
  157. * .
  158. *
  159. * 08 16 2010 george.huang
  160. * NULL
  161. * support wlanoidSetP2pPowerSaveProfile() in P2P
  162. *
  163. * 08 16 2010 george.huang
  164. * NULL
  165. * Support wlanoidSetNetworkAddress() for P2P
  166. *
  167. * 07 08 2010 cp.wu
  168. *
  169. * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
  170. *
  171. * 06 25 2010 cp.wu
  172. * [WPD00003833][MT6620 and MT5931] Driver migration
  173. * add API in que_mgt to retrieve sta-rec index for security frames.
  174. *
  175. * 06 24 2010 cp.wu
  176. * [WPD00003833][MT6620 and MT5931] Driver migration
  177. * 802.1x and bluetooth-over-Wi-Fi security frames are now delievered to firmware via command path instead of data path.
  178. *
  179. * 06 11 2010 cp.wu
  180. * [WPD00003833][MT6620 and MT5931] Driver migration
  181. * 1) migrate assoc.c.
  182. * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
  183. * 3) add configuration options for CNM_MEM and RSN modules
  184. * 4) add data path for management frames
  185. * 5) eliminate rPacketInfo of MSDU_INFO_T
  186. *
  187. * 06 06 2010 kevin.huang
  188. * [WPD00003832][MT6620 5931] Create driver base
  189. * [MT6620 5931] Create driver base
  190. *
  191. * 05 17 2010 cp.wu
  192. * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
  193. * 1) add timeout handler mechanism for pending command packets
  194. * 2) add p2p add/removal key
  195. *
  196. **
  197. */
  198. /******************************************************************************
  199. * C O M P I L E R F L A G S
  200. *******************************************************************************
  201. */
  202. /******************************************************************************
  203. * E X T E R N A L R E F E R E N C E S
  204. *******************************************************************************
  205. */
  206. #include "precomp.h"
  207. /******************************************************************************
  208. * C O N S T A N T S
  209. *******************************************************************************
  210. */
  211. /******************************************************************************
  212. * D A T A T Y P E S
  213. *******************************************************************************
  214. */
  215. /******************************************************************************
  216. * P U B L I C D A T A
  217. *******************************************************************************
  218. */
  219. /******************************************************************************
  220. * P R I V A T E D A T A
  221. *******************************************************************************
  222. */
  223. /******************************************************************************
  224. * M A C R O S
  225. *******************************************************************************
  226. */
  227. /******************************************************************************
  228. * F U N C T I O N D E C L A R A T I O N S
  229. *******************************************************************************
  230. */
  231. /******************************************************************************
  232. * F U N C T I O N S
  233. *******************************************************************************
  234. */
  235. /*----------------------------------------------------------------------------*/
  236. /*!
  237. * \brief command packet generation utility
  238. *
  239. * \param[in] prAdapter Pointer to the Adapter structure.
  240. * \param[in] ucCID Command ID
  241. * \param[in] fgSetQuery Set or Query
  242. * \param[in] fgNeedResp Need for response
  243. * \param[in] pfCmdDoneHandler Function pointer when command is done
  244. * \param[in] u4SetQueryInfoLen The length of the set/query buffer
  245. * \param[in] pucInfoBuffer Pointer to set/query buffer
  246. *
  247. *
  248. * \retval WLAN_STATUS_PENDING
  249. * \retval WLAN_STATUS_FAILURE
  250. */
  251. /*----------------------------------------------------------------------------*/
  252. WLAN_STATUS
  253. wlanoidSendSetQueryP2PCmd(IN P_ADAPTER_T prAdapter,
  254. UINT_8 ucCID,
  255. BOOLEAN fgSetQuery,
  256. BOOLEAN fgNeedResp,
  257. BOOLEAN fgIsOid,
  258. PFN_CMD_DONE_HANDLER pfCmdDoneHandler,
  259. PFN_CMD_TIMEOUT_HANDLER pfCmdTimeoutHandler,
  260. UINT_32 u4SetQueryInfoLen,
  261. PUINT_8 pucInfoBuffer, OUT PVOID pvSetQueryBuffer, IN UINT_32 u4SetQueryBufferLen)
  262. {
  263. P_GLUE_INFO_T prGlueInfo;
  264. P_CMD_INFO_T prCmdInfo;
  265. P_WIFI_CMD_T prWifiCmd;
  266. UINT_8 ucCmdSeqNum;
  267. ASSERT(prAdapter);
  268. prGlueInfo = prAdapter->prGlueInfo;
  269. ASSERT(prGlueInfo);
  270. DEBUGFUNC("wlanoidSendSetQueryP2PCmd");
  271. DBGLOG(REQ, TRACE, "Command ID = 0x%08X\n", ucCID);
  272. prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetQueryInfoLen));
  273. if (!prCmdInfo) {
  274. DBGLOG(P2P, ERROR, "Allocate CMD_INFO_T ==> FAILED.\n");
  275. return WLAN_STATUS_FAILURE;
  276. }
  277. /* increase command sequence number */
  278. ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
  279. DBGLOG(REQ, TRACE, "ucCmdSeqNum =%d\n", ucCmdSeqNum);
  280. /* Setup common CMD Info Packet */
  281. prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
  282. prCmdInfo->eNetworkType = NETWORK_TYPE_P2P_INDEX;
  283. prCmdInfo->u2InfoBufLen = (UINT_16) (CMD_HDR_SIZE + u4SetQueryInfoLen);
  284. prCmdInfo->pfCmdDoneHandler = pfCmdDoneHandler;
  285. prCmdInfo->pfCmdTimeoutHandler = pfCmdTimeoutHandler;
  286. prCmdInfo->fgIsOid = fgIsOid;
  287. prCmdInfo->ucCID = ucCID;
  288. prCmdInfo->fgSetQuery = fgSetQuery;
  289. prCmdInfo->fgNeedResp = fgNeedResp;
  290. prCmdInfo->fgDriverDomainMCR = FALSE;
  291. prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
  292. prCmdInfo->u4SetInfoLen = u4SetQueryInfoLen;
  293. prCmdInfo->pvInformationBuffer = pvSetQueryBuffer;
  294. prCmdInfo->u4InformationBufferLength = u4SetQueryBufferLen;
  295. /* Setup WIFI_CMD_T (no payload) */
  296. prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
  297. prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
  298. prWifiCmd->ucCID = prCmdInfo->ucCID;
  299. prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
  300. prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
  301. if (u4SetQueryInfoLen > 0 && pucInfoBuffer != NULL)
  302. kalMemCopy(prWifiCmd->aucBuffer, pucInfoBuffer, u4SetQueryInfoLen);
  303. /* insert into prCmdQueue */
  304. kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T) prCmdInfo);
  305. /* wakeup txServiceThread later */
  306. GLUE_SET_EVENT(prGlueInfo);
  307. return WLAN_STATUS_PENDING;
  308. }
  309. /*----------------------------------------------------------------------------*/
  310. /*!
  311. * \brief This routine is called to set a key to Wi-Fi Direct driver
  312. *
  313. * \param[in] prAdapter Pointer to the Adapter structure.
  314. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  315. * \param[in] u4SetBufferLen The length of the set buffer.
  316. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  317. * bytes read from the set buffer. If the call failed
  318. * due to invalid length of the set buffer, returns
  319. * the amount of storage needed.
  320. *
  321. * \retval WLAN_STATUS_SUCCESS
  322. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  323. * \retval WLAN_STATUS_INVALID_LENGTH
  324. * \retval WLAN_STATUS_INVALID_DATA
  325. */
  326. /*----------------------------------------------------------------------------*/
  327. WLAN_STATUS
  328. wlanoidSetAddP2PKey(IN P_ADAPTER_T prAdapter,
  329. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  330. {
  331. CMD_802_11_KEY rCmdKey;
  332. P_PARAM_KEY_T prNewKey;
  333. DEBUGFUNC("wlanoidSetAddP2PKey");
  334. DBGLOG(REQ, INFO, "\n");
  335. ASSERT(prAdapter);
  336. ASSERT(pvSetBuffer);
  337. ASSERT(pu4SetInfoLen);
  338. prNewKey = (P_PARAM_KEY_T) pvSetBuffer;
  339. /* Verify the key structure length. */
  340. if (prNewKey->u4Length > u4SetBufferLen) {
  341. DBGLOG(REQ, WARN, "Invalid key structure length (%d) greater than total buffer length (%d)\n",
  342. (UINT_8) prNewKey->u4Length, (UINT_8) u4SetBufferLen);
  343. *pu4SetInfoLen = u4SetBufferLen;
  344. return WLAN_STATUS_INVALID_LENGTH;
  345. }
  346. /* Verify the key material length for key material buffer */
  347. else if (prNewKey->u4KeyLength > prNewKey->u4Length - OFFSET_OF(PARAM_KEY_T, aucKeyMaterial)) {
  348. DBGLOG(REQ, WARN, "Invalid key material length (%d)\n", (UINT_8) prNewKey->u4KeyLength);
  349. *pu4SetInfoLen = u4SetBufferLen;
  350. return WLAN_STATUS_INVALID_DATA;
  351. }
  352. /* Exception check */
  353. else if (prNewKey->u4KeyIndex & 0x0fffff00)
  354. return WLAN_STATUS_INVALID_DATA;
  355. /* Exception check, pairwise key must with transmit bit enabled */
  356. else if ((prNewKey->u4KeyIndex & BITS(30, 31)) == IS_UNICAST_KEY) {
  357. return WLAN_STATUS_INVALID_DATA;
  358. } else if (!(prNewKey->u4KeyLength == CCMP_KEY_LEN) && !(prNewKey->u4KeyLength == TKIP_KEY_LEN)) {
  359. return WLAN_STATUS_INVALID_DATA;
  360. }
  361. /* Exception check, pairwise key must with transmit bit enabled */
  362. else if ((prNewKey->u4KeyIndex & BITS(30, 31)) == BITS(30, 31)) {
  363. if (((prNewKey->u4KeyIndex & 0xff) != 0) ||
  364. ((prNewKey->arBSSID[0] == 0xff) && (prNewKey->arBSSID[1] == 0xff) && (prNewKey->arBSSID[2] == 0xff)
  365. && (prNewKey->arBSSID[3] == 0xff) && (prNewKey->arBSSID[4] == 0xff)
  366. && (prNewKey->arBSSID[5] == 0xff))) {
  367. return WLAN_STATUS_INVALID_DATA;
  368. }
  369. }
  370. *pu4SetInfoLen = u4SetBufferLen;
  371. /* fill CMD_802_11_KEY */
  372. kalMemZero(&rCmdKey, sizeof(CMD_802_11_KEY));
  373. rCmdKey.ucAddRemove = 1; /* add */
  374. rCmdKey.ucTxKey = ((prNewKey->u4KeyIndex & IS_TRANSMIT_KEY) == IS_TRANSMIT_KEY) ? 1 : 0;
  375. rCmdKey.ucKeyType = ((prNewKey->u4KeyIndex & IS_UNICAST_KEY) == IS_UNICAST_KEY) ? 1 : 0;
  376. if (kalP2PGetRole(prAdapter->prGlueInfo) == 1) { /* group client */
  377. rCmdKey.ucIsAuthenticator = 0;
  378. } else { /* group owner */
  379. rCmdKey.ucIsAuthenticator = 1;
  380. }
  381. COPY_MAC_ADDR(rCmdKey.aucPeerAddr, prNewKey->arBSSID);
  382. rCmdKey.ucNetType = NETWORK_TYPE_P2P_INDEX;
  383. if (prNewKey->u4KeyLength == CCMP_KEY_LEN)
  384. rCmdKey.ucAlgorithmId = CIPHER_SUITE_CCMP; /* AES */
  385. else if (prNewKey->u4KeyLength == TKIP_KEY_LEN)
  386. rCmdKey.ucAlgorithmId = CIPHER_SUITE_TKIP; /* TKIP */
  387. rCmdKey.ucKeyId = (UINT_8) (prNewKey->u4KeyIndex & 0xff);
  388. rCmdKey.ucKeyLen = (UINT_8) prNewKey->u4KeyLength;
  389. kalMemCopy(rCmdKey.aucKeyMaterial, (PUINT_8) prNewKey->aucKeyMaterial, rCmdKey.ucKeyLen);
  390. return wlanoidSendSetQueryP2PCmd(prAdapter,
  391. CMD_ID_ADD_REMOVE_KEY,
  392. TRUE,
  393. FALSE,
  394. TRUE,
  395. nicCmdEventSetCommon,
  396. NULL,
  397. sizeof(CMD_802_11_KEY), (PUINT_8) &rCmdKey, pvSetBuffer, u4SetBufferLen);
  398. }
  399. /*----------------------------------------------------------------------------*/
  400. /*!
  401. * \brief This routine is called to request Wi-Fi Direct driver to remove keys
  402. *
  403. * \param[in] prAdapter Pointer to the Adapter structure.
  404. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  405. * \param[in] u4SetBufferLen The length of the set buffer.
  406. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  407. * bytes read from the set buffer. If the call failed
  408. * due to invalid length of the set buffer, returns
  409. * the amount of storage needed.
  410. *
  411. * \retval WLAN_STATUS_SUCCESS
  412. * \retval WLAN_STATUS_INVALID_DATA
  413. * \retval WLAN_STATUS_INVALID_LENGTH
  414. * \retval WLAN_STATUS_INVALID_DATA
  415. */
  416. /*----------------------------------------------------------------------------*/
  417. WLAN_STATUS
  418. wlanoidSetRemoveP2PKey(IN P_ADAPTER_T prAdapter,
  419. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  420. {
  421. CMD_802_11_KEY rCmdKey;
  422. P_PARAM_REMOVE_KEY_T prRemovedKey;
  423. DEBUGFUNC("wlanoidSetRemoveP2PKey");
  424. ASSERT(prAdapter);
  425. if (u4SetBufferLen < sizeof(PARAM_REMOVE_KEY_T))
  426. return WLAN_STATUS_INVALID_LENGTH;
  427. ASSERT(pvSetBuffer);
  428. prRemovedKey = (P_PARAM_REMOVE_KEY_T) pvSetBuffer;
  429. /* Check bit 31: this bit should always 0 */
  430. if (prRemovedKey->u4KeyIndex & IS_TRANSMIT_KEY) {
  431. /* Bit 31 should not be set */
  432. DBGLOG(REQ, ERROR, "invalid key index: 0x%08x\n", prRemovedKey->u4KeyIndex);
  433. return WLAN_STATUS_INVALID_DATA;
  434. }
  435. /* Check bits 8 ~ 29 should always be 0 */
  436. if (prRemovedKey->u4KeyIndex & BITS(8, 29)) {
  437. /* Bit 31 should not be set */
  438. DBGLOG(REQ, ERROR, "invalid key index: 0x%08x\n", prRemovedKey->u4KeyIndex);
  439. return WLAN_STATUS_INVALID_DATA;
  440. }
  441. /* There should not be any key operation for P2P Device */
  442. if (kalP2PGetRole(prAdapter->prGlueInfo) == 0)
  443. ; /* return WLAN_STATUS_NOT_ACCEPTED; */
  444. kalMemZero((PUINT_8) &rCmdKey, sizeof(CMD_802_11_KEY));
  445. rCmdKey.ucAddRemove = 0; /* remove */
  446. if (kalP2PGetRole(prAdapter->prGlueInfo) == 1) { /* group client */
  447. rCmdKey.ucIsAuthenticator = 0;
  448. } else { /* group owner */
  449. rCmdKey.ucIsAuthenticator = 1;
  450. }
  451. kalMemCopy(rCmdKey.aucPeerAddr, (PUINT_8) prRemovedKey->arBSSID, MAC_ADDR_LEN);
  452. rCmdKey.ucNetType = NETWORK_TYPE_P2P_INDEX;
  453. rCmdKey.ucKeyId = (UINT_8) (prRemovedKey->u4KeyIndex & 0x000000ff);
  454. return wlanoidSendSetQueryP2PCmd(prAdapter,
  455. CMD_ID_ADD_REMOVE_KEY,
  456. TRUE,
  457. FALSE,
  458. TRUE,
  459. nicCmdEventSetCommon,
  460. NULL,
  461. sizeof(CMD_802_11_KEY), (PUINT_8) &rCmdKey, pvSetBuffer, u4SetBufferLen);
  462. }
  463. /*----------------------------------------------------------------------------*/
  464. /*!
  465. * \brief Setting the IP address for pattern search function.
  466. *
  467. * \param[in] prAdapter Pointer to the Adapter structure.
  468. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  469. * \param[in] u4SetBufferLen The length of the set buffer.
  470. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  471. * bytes read from the set buffer. If the call failed
  472. * due to invalid length of the set buffer, returns
  473. * the amount of storage needed.
  474. *
  475. * \return WLAN_STATUS_SUCCESS
  476. * \return WLAN_STATUS_ADAPTER_NOT_READY
  477. * \return WLAN_STATUS_INVALID_LENGTH
  478. */
  479. /*----------------------------------------------------------------------------*/
  480. WLAN_STATUS
  481. wlanoidSetP2pNetworkAddress(IN P_ADAPTER_T prAdapter,
  482. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  483. {
  484. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  485. UINT_32 i, j;
  486. P_CMD_SET_NETWORK_ADDRESS_LIST prCmdNetworkAddressList;
  487. P_PARAM_NETWORK_ADDRESS_LIST prNetworkAddressList = (P_PARAM_NETWORK_ADDRESS_LIST) pvSetBuffer;
  488. P_PARAM_NETWORK_ADDRESS prNetworkAddress;
  489. P_PARAM_NETWORK_ADDRESS_IP prNetAddrIp;
  490. UINT_32 u4IpAddressCount, u4CmdSize;
  491. DEBUGFUNC("wlanoidSetP2pNetworkAddress");
  492. DBGLOG(P2P, TRACE, "\n");
  493. ASSERT(prAdapter);
  494. ASSERT(pu4SetInfoLen);
  495. *pu4SetInfoLen = 4;
  496. if (u4SetBufferLen < sizeof(PARAM_NETWORK_ADDRESS_LIST))
  497. return WLAN_STATUS_INVALID_DATA;
  498. *pu4SetInfoLen = 0;
  499. u4IpAddressCount = 0;
  500. prNetworkAddress = prNetworkAddressList->arAddress;
  501. for (i = 0; i < prNetworkAddressList->u4AddressCount; i++) {
  502. if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
  503. prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
  504. u4IpAddressCount++;
  505. }
  506. prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((ULONG) prNetworkAddress +
  507. (ULONG) (prNetworkAddress->u2AddressLength +
  508. OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
  509. }
  510. /* construct payload of command packet */
  511. u4CmdSize = OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST, arNetAddress) +
  512. sizeof(IPV4_NETWORK_ADDRESS) * u4IpAddressCount;
  513. prCmdNetworkAddressList = (P_CMD_SET_NETWORK_ADDRESS_LIST) kalMemAlloc(u4CmdSize, VIR_MEM_TYPE);
  514. if (prCmdNetworkAddressList == NULL)
  515. return WLAN_STATUS_FAILURE;
  516. /* fill P_CMD_SET_NETWORK_ADDRESS_LIST */
  517. prCmdNetworkAddressList->ucNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
  518. prCmdNetworkAddressList->ucAddressCount = (UINT_8) u4IpAddressCount;
  519. prNetworkAddress = prNetworkAddressList->arAddress;
  520. for (i = 0, j = 0; i < prNetworkAddressList->u4AddressCount; i++) {
  521. if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
  522. prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
  523. prNetAddrIp = (P_PARAM_NETWORK_ADDRESS_IP) prNetworkAddress->aucAddress;
  524. kalMemCopy(prCmdNetworkAddressList->arNetAddress[j].aucIpAddr,
  525. &(prNetAddrIp->in_addr), sizeof(UINT_32));
  526. j++;
  527. }
  528. prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((ULONG) prNetworkAddress +
  529. (ULONG) (prNetworkAddress->u2AddressLength +
  530. OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
  531. }
  532. rStatus = wlanSendSetQueryCmd(prAdapter,
  533. CMD_ID_SET_IP_ADDRESS,
  534. TRUE,
  535. FALSE,
  536. TRUE,
  537. nicCmdEventSetIpAddress,
  538. nicOidCmdTimeoutCommon,
  539. u4CmdSize, (PUINT_8) prCmdNetworkAddressList, pvSetBuffer, u4SetBufferLen);
  540. kalMemFree(prCmdNetworkAddressList, VIR_MEM_TYPE, u4CmdSize);
  541. return rStatus;
  542. }
  543. /*----------------------------------------------------------------------------*/
  544. /*!
  545. * \brief This routine is used to query the power save profile.
  546. *
  547. * \param[in] prAdapter Pointer to the Adapter structure.
  548. * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
  549. * the query.
  550. * \param[in] u4QueryBufLen The length of the query buffer.
  551. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  552. * bytes written into the query buffer. If the call
  553. * failed due to invalid length of the query buffer,
  554. * returns the amount of storage needed.
  555. *
  556. * \return WLAN_STATUS_SUCCESS
  557. */
  558. /*----------------------------------------------------------------------------*/
  559. WLAN_STATUS
  560. wlanoidQueryP2pPowerSaveProfile(IN P_ADAPTER_T prAdapter,
  561. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  562. {
  563. DEBUGFUNC("wlanoidQueryP2pPowerSaveProfile");
  564. ASSERT(prAdapter);
  565. ASSERT(pu4QueryInfoLen);
  566. if (u4QueryBufferLen != 0) {
  567. ASSERT(pvQueryBuffer);
  568. *(PPARAM_POWER_MODE) pvQueryBuffer =
  569. (PARAM_POWER_MODE) (prAdapter->rWlanInfo.arPowerSaveMode[NETWORK_TYPE_P2P_INDEX].ucPsProfile);
  570. *pu4QueryInfoLen = sizeof(PARAM_POWER_MODE);
  571. }
  572. return WLAN_STATUS_SUCCESS;
  573. }
  574. /*----------------------------------------------------------------------------*/
  575. /*!
  576. * \brief This routine is used to set the power save profile.
  577. *
  578. * \param[in] pvAdapter Pointer to the Adapter structure.
  579. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  580. * \param[in] u4SetBufferLen The length of the set buffer.
  581. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  582. * bytes read from the set buffer. If the call failed
  583. * due to invalid length of the set buffer, returns
  584. * the amount of storage needed.
  585. *
  586. * \retval WLAN_STATUS_SUCCESS
  587. * \retval WLAN_STATUS_INVALID_LENGTH
  588. */
  589. /*----------------------------------------------------------------------------*/
  590. WLAN_STATUS
  591. wlanoidSetP2pPowerSaveProfile(IN P_ADAPTER_T prAdapter,
  592. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  593. {
  594. WLAN_STATUS status;
  595. PARAM_POWER_MODE ePowerMode;
  596. DEBUGFUNC("wlanoidSetP2pPowerSaveProfile");
  597. ASSERT(prAdapter);
  598. ASSERT(pu4SetInfoLen);
  599. *pu4SetInfoLen = sizeof(PARAM_POWER_MODE);
  600. if (u4SetBufferLen < sizeof(PARAM_POWER_MODE)) {
  601. DBGLOG(REQ, WARN, "Invalid length %u\n", u4SetBufferLen);
  602. return WLAN_STATUS_INVALID_LENGTH;
  603. } else if (*(PPARAM_POWER_MODE) pvSetBuffer >= Param_PowerModeMax) {
  604. WARNLOG(("Invalid power mode %d\n", *(PPARAM_POWER_MODE) pvSetBuffer));
  605. return WLAN_STATUS_INVALID_DATA;
  606. }
  607. ePowerMode = *(PPARAM_POWER_MODE) pvSetBuffer;
  608. if (prAdapter->fgEnCtiaPowerMode) {
  609. if (ePowerMode == Param_PowerModeCAM) {
  610. /*Todo:: Nothing*/
  611. /*Todo:: Nothing*/
  612. } else {
  613. /* User setting to PS mode (Param_PowerModeMAX_PSP or Param_PowerModeFast_PSP) */
  614. if (prAdapter->u4CtiaPowerMode == 0) {
  615. /* force to keep in CAM mode */
  616. ePowerMode = Param_PowerModeCAM;
  617. } else if (prAdapter->u4CtiaPowerMode == 1) {
  618. ePowerMode = Param_PowerModeMAX_PSP;
  619. } else if (prAdapter->u4CtiaPowerMode == 2) {
  620. ePowerMode = Param_PowerModeFast_PSP;
  621. }
  622. }
  623. }
  624. status = nicConfigPowerSaveProfile(prAdapter, NETWORK_TYPE_P2P_INDEX, ePowerMode, TRUE);
  625. return status;
  626. } /* end of wlanoidSetP2pPowerSaveProfile() */
  627. /*----------------------------------------------------------------------------*/
  628. /*!
  629. * \brief This routine is used to set the power save profile.
  630. *
  631. * \param[in] pvAdapter Pointer to the Adapter structure.
  632. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  633. * \param[in] u4SetBufferLen The length of the set buffer.
  634. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  635. * bytes read from the set buffer. If the call failed
  636. * due to invalid length of the set buffer, returns
  637. * the amount of storage needed.
  638. *
  639. * \retval WLAN_STATUS_SUCCESS
  640. * \retval WLAN_STATUS_INVALID_LENGTH
  641. */
  642. /*----------------------------------------------------------------------------*/
  643. WLAN_STATUS
  644. wlanoidSetP2pSetNetworkAddress(IN P_ADAPTER_T prAdapter,
  645. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  646. {
  647. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  648. UINT_32 i, j;
  649. P_CMD_SET_NETWORK_ADDRESS_LIST prCmdNetworkAddressList;
  650. P_PARAM_NETWORK_ADDRESS_LIST prNetworkAddressList = (P_PARAM_NETWORK_ADDRESS_LIST) pvSetBuffer;
  651. P_PARAM_NETWORK_ADDRESS prNetworkAddress;
  652. P_PARAM_NETWORK_ADDRESS_IP prNetAddrIp;
  653. UINT_32 u4IpAddressCount, u4CmdSize;
  654. PUINT_8 pucBuf = (PUINT_8) pvSetBuffer;
  655. DEBUGFUNC("wlanoidSetP2pSetNetworkAddress");
  656. DBGLOG(P2P, TRACE, "\n");
  657. DBGLOG(P2P, INFO, "wlanoidSetP2pSetNetworkAddress (%d)\n", (INT_16) u4SetBufferLen);
  658. ASSERT(prAdapter);
  659. ASSERT(pu4SetInfoLen);
  660. *pu4SetInfoLen = 4;
  661. if (u4SetBufferLen < sizeof(PARAM_NETWORK_ADDRESS_LIST))
  662. return WLAN_STATUS_INVALID_DATA;
  663. *pu4SetInfoLen = 0;
  664. u4IpAddressCount = 0;
  665. prNetworkAddress = prNetworkAddressList->arAddress;
  666. for (i = 0; i < prNetworkAddressList->u4AddressCount; i++) {
  667. if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
  668. prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
  669. u4IpAddressCount++;
  670. }
  671. prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((ULONG) prNetworkAddress +
  672. (ULONG) (prNetworkAddress->u2AddressLength +
  673. OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
  674. }
  675. /* construct payload of command packet */
  676. u4CmdSize = OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST, arNetAddress) +
  677. sizeof(IPV4_NETWORK_ADDRESS) * u4IpAddressCount;
  678. if (u4IpAddressCount == 0)
  679. u4CmdSize = sizeof(CMD_SET_NETWORK_ADDRESS_LIST);
  680. prCmdNetworkAddressList = (P_CMD_SET_NETWORK_ADDRESS_LIST) kalMemAlloc(u4CmdSize, VIR_MEM_TYPE);
  681. if (prCmdNetworkAddressList == NULL)
  682. return WLAN_STATUS_FAILURE;
  683. /* fill P_CMD_SET_NETWORK_ADDRESS_LIST */
  684. prCmdNetworkAddressList->ucNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
  685. /* only to set IP address to FW once ARP filter is enabled */
  686. if (prAdapter->fgEnArpFilter) {
  687. prCmdNetworkAddressList->ucAddressCount = (UINT_8) u4IpAddressCount;
  688. prNetworkAddress = prNetworkAddressList->arAddress;
  689. DBGLOG(P2P, INFO, "u4IpAddressCount (%u)\n", u4IpAddressCount);
  690. for (i = 0, j = 0; i < prNetworkAddressList->u4AddressCount; i++) {
  691. if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
  692. prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
  693. prNetAddrIp = (P_PARAM_NETWORK_ADDRESS_IP) prNetworkAddress->aucAddress;
  694. kalMemCopy(prCmdNetworkAddressList->arNetAddress[j].aucIpAddr,
  695. &(prNetAddrIp->in_addr), sizeof(UINT_32));
  696. j++;
  697. pucBuf = (PUINT_8) &prNetAddrIp->in_addr;
  698. DBGLOG(P2P, INFO, "prNetAddrIp->in_addr:%d:%d:%d:%d\n",
  699. (UINT_8) pucBuf[0], (UINT_8) pucBuf[1],
  700. (UINT_8) pucBuf[2], (UINT_8) pucBuf[3]);
  701. }
  702. prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((ULONG) prNetworkAddress +
  703. (ULONG) (prNetworkAddress->u2AddressLength +
  704. OFFSET_OF(PARAM_NETWORK_ADDRESS,
  705. aucAddress)));
  706. }
  707. } else {
  708. prCmdNetworkAddressList->ucAddressCount = 0;
  709. }
  710. rStatus = wlanSendSetQueryCmd(prAdapter,
  711. CMD_ID_SET_IP_ADDRESS,
  712. TRUE,
  713. FALSE,
  714. TRUE,
  715. nicCmdEventSetIpAddress,
  716. nicOidCmdTimeoutCommon,
  717. u4CmdSize, (PUINT_8) prCmdNetworkAddressList, pvSetBuffer, u4SetBufferLen);
  718. kalMemFree(prCmdNetworkAddressList, VIR_MEM_TYPE, u4CmdSize);
  719. return rStatus;
  720. } /* end of wlanoidSetP2pSetNetworkAddress() */
  721. /*----------------------------------------------------------------------------*/
  722. /*!
  723. * \brief This routine is called to set Multicast Address List.
  724. *
  725. * \param[in] prAdapter Pointer to the Adapter structure.
  726. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  727. * \param[in] u4SetBufferLen The length of the set buffer.
  728. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  729. * bytes read from the set buffer. If the call failed
  730. * due to invalid length of the set buffer, returns
  731. * the amount of storage needed.
  732. *
  733. * \retval WLAN_STATUS_SUCCESS
  734. * \retval WLAN_STATUS_INVALID_LENGTH
  735. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  736. * \retval WLAN_STATUS_MULTICAST_FULL
  737. */
  738. /*----------------------------------------------------------------------------*/
  739. WLAN_STATUS
  740. wlanoidSetP2PMulticastList(IN P_ADAPTER_T prAdapter,
  741. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  742. {
  743. CMD_MAC_MCAST_ADDR rCmdMacMcastAddr;
  744. ASSERT(prAdapter);
  745. ASSERT(pu4SetInfoLen);
  746. /* The data must be a multiple of the Ethernet address size. */
  747. if ((u4SetBufferLen % MAC_ADDR_LEN)) {
  748. DBGLOG(REQ, WARN, "Invalid MC list length %u\n", u4SetBufferLen);
  749. *pu4SetInfoLen = (((u4SetBufferLen + MAC_ADDR_LEN) - 1) / MAC_ADDR_LEN) * MAC_ADDR_LEN;
  750. return WLAN_STATUS_INVALID_LENGTH;
  751. }
  752. *pu4SetInfoLen = u4SetBufferLen;
  753. /* Verify if we can support so many multicast addresses. */
  754. if ((u4SetBufferLen / MAC_ADDR_LEN) > MAX_NUM_GROUP_ADDR) {
  755. DBGLOG(REQ, WARN, "Too many MC addresses\n");
  756. return WLAN_STATUS_MULTICAST_FULL;
  757. }
  758. /* NOTE(Kevin): Windows may set u4SetBufferLen == 0 &&
  759. * pvSetBuffer == NULL to clear exist Multicast List.
  760. */
  761. if (u4SetBufferLen)
  762. ASSERT(pvSetBuffer);
  763. if (prAdapter->rAcpiState == ACPI_STATE_D3) {
  764. DBGLOG(REQ, WARN, "Fail in set multicast list! (Adapter not ready). ACPI=D%d, Radio=%d\n",
  765. prAdapter->rAcpiState, prAdapter->fgIsRadioOff);
  766. return WLAN_STATUS_ADAPTER_NOT_READY;
  767. }
  768. rCmdMacMcastAddr.u4NumOfGroupAddr = u4SetBufferLen / MAC_ADDR_LEN;
  769. rCmdMacMcastAddr.ucNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
  770. kalMemCopy(rCmdMacMcastAddr.arAddress, pvSetBuffer, u4SetBufferLen);
  771. /* This CMD response is no need to complete the OID. Or the event would unsync. */
  772. return wlanoidSendSetQueryP2PCmd(prAdapter, CMD_ID_MAC_MCAST_ADDR, TRUE, FALSE, FALSE,
  773. nicCmdEventSetCommon,
  774. nicOidCmdTimeoutCommon,
  775. sizeof(CMD_MAC_MCAST_ADDR),
  776. (PUINT_8) &rCmdMacMcastAddr, pvSetBuffer, u4SetBufferLen);
  777. } /* end of wlanoidSetP2PMulticastList() */
  778. /*----------------------------------------------------------------------------*/
  779. /*!
  780. * \brief This routine is called to send GAS frame for P2P Service Discovery Request
  781. *
  782. * \param[in] prAdapter Pointer to the Adapter structure.
  783. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  784. * \param[in] u4SetBufferLen The length of the set buffer.
  785. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  786. * bytes read from the set buffer. If the call failed
  787. * due to invalid length of the set buffer, returns
  788. * the amount of storage needed.
  789. *
  790. * \retval WLAN_STATUS_SUCCESS
  791. * \retval WLAN_STATUS_INVALID_LENGTH
  792. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  793. * \retval WLAN_STATUS_MULTICAST_FULL
  794. */
  795. /*----------------------------------------------------------------------------*/
  796. WLAN_STATUS
  797. wlanoidSendP2PSDRequest(IN P_ADAPTER_T prAdapter,
  798. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  799. {
  800. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  801. ASSERT(prAdapter);
  802. ASSERT(pu4SetInfoLen);
  803. if (u4SetBufferLen)
  804. ASSERT(pvSetBuffer);
  805. if (u4SetBufferLen < sizeof(PARAM_P2P_SEND_SD_REQUEST)) {
  806. *pu4SetInfoLen = sizeof(PARAM_P2P_SEND_SD_REQUEST);
  807. return WLAN_STATUS_BUFFER_TOO_SHORT;
  808. }
  809. /* rWlanStatus = p2pFsmRunEventSDRequest(prAdapter, (P_PARAM_P2P_SEND_SD_REQUEST)pvSetBuffer); */
  810. return rWlanStatus;
  811. } /* end of wlanoidSendP2PSDRequest() */
  812. /*----------------------------------------------------------------------------*/
  813. /*!
  814. * \brief This routine is called to send GAS frame for P2P Service Discovery Response
  815. *
  816. * \param[in] prAdapter Pointer to the Adapter structure.
  817. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  818. * \param[in] u4SetBufferLen The length of the set buffer.
  819. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  820. * bytes read from the set buffer. If the call failed
  821. * due to invalid length of the set buffer, returns
  822. * the amount of storage needed.
  823. *
  824. * \retval WLAN_STATUS_SUCCESS
  825. * \retval WLAN_STATUS_INVALID_LENGTH
  826. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  827. * \retval WLAN_STATUS_MULTICAST_FULL
  828. */
  829. /*----------------------------------------------------------------------------*/
  830. WLAN_STATUS
  831. wlanoidSendP2PSDResponse(IN P_ADAPTER_T prAdapter,
  832. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  833. {
  834. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  835. ASSERT(prAdapter);
  836. ASSERT(pu4SetInfoLen);
  837. if (u4SetBufferLen)
  838. ASSERT(pvSetBuffer);
  839. if (u4SetBufferLen < sizeof(PARAM_P2P_SEND_SD_RESPONSE)) {
  840. *pu4SetInfoLen = sizeof(PARAM_P2P_SEND_SD_RESPONSE);
  841. return WLAN_STATUS_BUFFER_TOO_SHORT;
  842. }
  843. /* rWlanStatus = p2pFsmRunEventSDResponse(prAdapter, (P_PARAM_P2P_SEND_SD_RESPONSE)pvSetBuffer); */
  844. return rWlanStatus;
  845. } /* end of wlanoidGetP2PSDRequest() */
  846. /*----------------------------------------------------------------------------*/
  847. /*!
  848. * \brief This routine is called to get GAS frame for P2P Service Discovery Request
  849. *
  850. * \param[in] prAdapter Pointer to the Adapter structure.
  851. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  852. * the query.
  853. * \param[in] u4QueryBufferLen The length of the query buffer.
  854. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  855. * bytes written into the query buffer. If the call
  856. * failed due to invalid length of the query buffer,
  857. * returns the amount of storage needed.
  858. *
  859. * \retval WLAN_STATUS_SUCCESS
  860. * \retval WLAN_STATUS_INVALID_LENGTH
  861. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  862. * \retval WLAN_STATUS_MULTICAST_FULL
  863. */
  864. /*----------------------------------------------------------------------------*/
  865. WLAN_STATUS
  866. wlanoidGetP2PSDRequest(IN P_ADAPTER_T prAdapter,
  867. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  868. {
  869. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  870. /*PUINT_8 pucPacketBuffer = NULL, pucTA = NULL;*/
  871. /* PUINT_8 pucChannelNum = NULL; */
  872. /*PUINT_16 pu2PacketLength = NULL;*/
  873. /*P_WLAN_MAC_HEADER_T prWlanHdr = (P_WLAN_MAC_HEADER_T) NULL;*/
  874. /*UINT_8 ucVersionNum = 0;*/
  875. /* UINT_8 ucChannelNum = 0, ucSeqNum = 0; */
  876. ASSERT(prAdapter);
  877. ASSERT(pu4QueryInfoLen);
  878. if (u4QueryBufferLen)
  879. ASSERT(pvQueryBuffer);
  880. if (u4QueryBufferLen < sizeof(PARAM_P2P_GET_SD_REQUEST)) {
  881. *pu4QueryInfoLen = sizeof(PARAM_P2P_GET_SD_REQUEST);
  882. return WLAN_STATUS_BUFFER_TOO_SHORT;
  883. }
  884. DBGLOG(P2P, TRACE, "Get Service Discovery Request\n");
  885. #if 0
  886. ucVersionNum = p2pFuncGetVersionNumOfSD(prAdapter);
  887. if (ucVersionNum == 0) {
  888. P_PARAM_P2P_GET_SD_REQUEST prP2pGetSdReq = (P_PARAM_P2P_GET_SD_REQUEST) pvQueryBuffer;
  889. pucPacketBuffer = prP2pGetSdReq->aucPacketContent;
  890. pu2PacketLength = &prP2pGetSdReq->u2PacketLength;
  891. pucTA = &prP2pGetSdReq->rTransmitterAddr;
  892. } else {
  893. P_PARAM_P2P_GET_SD_REQUEST_EX prP2pGetSdReqEx = (P_PARAM_P2P_GET_SD_REQUEST_EX) NULL;
  894. prP2pGetSdReqEx = (P_PARAM_P2P_GET_SD_REQUEST) pvQueryBuffer;
  895. pucPacketBuffer = prP2pGetSdReqEx->aucPacketContent;
  896. pu2PacketLength = &prP2pGetSdReqEx->u2PacketLength;
  897. pucTA = &prP2pGetSdReqEx->rTransmitterAddr;
  898. pucChannelNum = &prP2pGetSdReqEx->ucChannelNum;
  899. ucSeqNum = prP2pGetSdReqEx->ucSeqNum;
  900. }
  901. rWlanStatus = p2pFuncGetServiceDiscoveryFrame(prAdapter,
  902. pucPacketBuffer,
  903. (u4QueryBufferLen - sizeof(PARAM_P2P_GET_SD_REQUEST)),
  904. (PUINT_32) pu2PacketLength, pucChannelNum, ucSeqNum);
  905. #else
  906. *pu4QueryInfoLen = 0;
  907. return rWlanStatus;
  908. #endif
  909. /*
  910. prWlanHdr = (P_WLAN_MAC_HEADER_T) pucPacketBuffer;
  911. kalMemCopy(pucTA, prWlanHdr->aucAddr2, MAC_ADDR_LEN);
  912. if (pu4QueryInfoLen) {
  913. if (ucVersionNum == 0)
  914. *pu4QueryInfoLen = (UINT_32) (sizeof(PARAM_P2P_GET_SD_REQUEST) + (*pu2PacketLength));
  915. else
  916. *pu4QueryInfoLen = (UINT_32) (sizeof(PARAM_P2P_GET_SD_REQUEST_EX) + (*pu2PacketLength));
  917. }
  918. return rWlanStatus;
  919. */
  920. } /* end of wlanoidGetP2PSDRequest() */
  921. /*----------------------------------------------------------------------------*/
  922. /*!
  923. * \brief This routine is called to get GAS frame for P2P Service Discovery Response
  924. *
  925. * \param[in] prAdapter Pointer to the Adapter structure.
  926. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  927. * the query.
  928. * \param[in] u4QueryBufferLen The length of the query buffer.
  929. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  930. * bytes written into the query buffer. If the call
  931. * failed due to invalid length of the query buffer,
  932. * returns the amount of storage needed.
  933. *
  934. * \retval WLAN_STATUS_SUCCESS
  935. * \retval WLAN_STATUS_INVALID_LENGTH
  936. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  937. * \retval WLAN_STATUS_MULTICAST_FULL
  938. */
  939. /*----------------------------------------------------------------------------*/
  940. WLAN_STATUS
  941. wlanoidGetP2PSDResponse(IN P_ADAPTER_T prAdapter,
  942. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  943. {
  944. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  945. /*P_WLAN_MAC_HEADER_T prWlanHdr = (P_WLAN_MAC_HEADER_T) NULL;*/
  946. /* UINT_8 ucSeqNum = 0, */
  947. /*UINT_8 ucVersionNum = 0;*/
  948. /*PUINT_8 pucPacketContent = (PUINT_8) NULL, pucTA = (PUINT_8) NULL;*/
  949. /*PUINT_16 pu2PacketLength = (PUINT_16) NULL;*/
  950. ASSERT(prAdapter);
  951. ASSERT(pu4QueryInfoLen);
  952. if (u4QueryBufferLen)
  953. ASSERT(pvQueryBuffer);
  954. if (u4QueryBufferLen < sizeof(PARAM_P2P_GET_SD_RESPONSE)) {
  955. *pu4QueryInfoLen = sizeof(PARAM_P2P_GET_SD_RESPONSE);
  956. return WLAN_STATUS_BUFFER_TOO_SHORT;
  957. }
  958. DBGLOG(P2P, TRACE, "Get Service Discovery Response\n");
  959. #if 0
  960. ucVersionNum = p2pFuncGetVersionNumOfSD(prAdapter);
  961. if (ucVersionNum == 0) {
  962. P_PARAM_P2P_GET_SD_RESPONSE prP2pGetSdRsp = (P_PARAM_P2P_GET_SD_RESPONSE) NULL;
  963. prP2pGetSdRsp = (P_PARAM_P2P_GET_SD_REQUEST) pvQueryBuffer;
  964. pucPacketContent = prP2pGetSdRsp->aucPacketContent;
  965. pucTA = &prP2pGetSdRsp->rTransmitterAddr;
  966. pu2PacketLength = &prP2pGetSdRsp->u2PacketLength;
  967. } else {
  968. P_PARAM_P2P_GET_SD_RESPONSE_EX prP2pGetSdRspEx = (P_PARAM_P2P_GET_SD_RESPONSE_EX) NULL;
  969. prP2pGetSdRspEx = (P_PARAM_P2P_GET_SD_RESPONSE_EX) pvQueryBuffer;
  970. pucPacketContent = prP2pGetSdRspEx->aucPacketContent;
  971. pucTA = &prP2pGetSdRspEx->rTransmitterAddr;
  972. pu2PacketLength = &prP2pGetSdRspEx->u2PacketLength;
  973. ucSeqNum = prP2pGetSdRspEx->ucSeqNum;
  974. }
  975. /* rWlanStatus = p2pFuncGetServiceDiscoveryFrame(prAdapter, */
  976. /* pucPacketContent, */
  977. /* (u4QueryBufferLen - sizeof(PARAM_P2P_GET_SD_RESPONSE)), */
  978. /* (PUINT_32)pu2PacketLength, */
  979. /* NULL, */
  980. /* ucSeqNum); */
  981. #else
  982. *pu4QueryInfoLen = 0;
  983. return rWlanStatus;
  984. #endif
  985. /*
  986. prWlanHdr = (P_WLAN_MAC_HEADER_T) pucPacketContent;
  987. kalMemCopy(pucTA, prWlanHdr->aucAddr2, MAC_ADDR_LEN);
  988. if (pu4QueryInfoLen) {
  989. if (ucVersionNum == 0)
  990. *pu4QueryInfoLen = (UINT_32) (sizeof(PARAM_P2P_GET_SD_RESPONSE) + *pu2PacketLength);
  991. else
  992. *pu4QueryInfoLen = (UINT_32) (sizeof(PARAM_P2P_GET_SD_RESPONSE_EX) + *pu2PacketLength);
  993. }
  994. return rWlanStatus;
  995. */
  996. } /* end of wlanoidGetP2PSDResponse() */
  997. /*----------------------------------------------------------------------------*/
  998. /*!
  999. * \brief This routine is called to terminate P2P Service Discovery Phase
  1000. *
  1001. * \param[in] prAdapter Pointer to the Adapter structure.
  1002. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  1003. * \param[in] u4SetBufferLen The length of the set buffer.
  1004. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  1005. * bytes read from the set buffer. If the call failed
  1006. * due to invalid length of the set buffer, returns
  1007. * the amount of storage needed.
  1008. *
  1009. * \retval WLAN_STATUS_SUCCESS
  1010. * \retval WLAN_STATUS_INVALID_LENGTH
  1011. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  1012. * \retval WLAN_STATUS_MULTICAST_FULL
  1013. */
  1014. /*----------------------------------------------------------------------------*/
  1015. WLAN_STATUS
  1016. wlanoidSetP2PTerminateSDPhase(IN P_ADAPTER_T prAdapter,
  1017. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  1018. {
  1019. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  1020. P_PARAM_P2P_TERMINATE_SD_PHASE prP2pTerminateSD = (P_PARAM_P2P_TERMINATE_SD_PHASE) NULL;
  1021. UINT_8 aucNullAddr[] = NULL_MAC_ADDR;
  1022. do {
  1023. if ((prAdapter == NULL) || (pu4SetInfoLen == NULL))
  1024. break;
  1025. if ((u4SetBufferLen) && (pvSetBuffer == NULL))
  1026. break;
  1027. if (u4SetBufferLen < sizeof(PARAM_P2P_TERMINATE_SD_PHASE)) {
  1028. *pu4SetInfoLen = sizeof(PARAM_P2P_TERMINATE_SD_PHASE);
  1029. rWlanStatus = WLAN_STATUS_BUFFER_TOO_SHORT;
  1030. break;
  1031. }
  1032. prP2pTerminateSD = (P_PARAM_P2P_TERMINATE_SD_PHASE) pvSetBuffer;
  1033. if (EQUAL_MAC_ADDR(prP2pTerminateSD->rPeerAddr, aucNullAddr)) {
  1034. DBGLOG(P2P, TRACE, "Service Discovery Version 2.0\n");
  1035. /* p2pFuncSetVersionNumOfSD(prAdapter, 2); */
  1036. }
  1037. /* rWlanStatus = p2pFsmRunEventSDAbort(prAdapter); */
  1038. } while (FALSE);
  1039. return rWlanStatus;
  1040. } /* end of wlanoidSetP2PTerminateSDPhase() */
  1041. #if CFG_SUPPORT_ANTI_PIRACY
  1042. /*----------------------------------------------------------------------------*/
  1043. /*!
  1044. * \brief This routine is called to
  1045. *
  1046. * \param[in] prAdapter Pointer to the Adapter structure.
  1047. * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
  1048. * \param[in] u4SetBufferLen The length of the set buffer.
  1049. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  1050. * bytes read from the set buffer. If the call failed
  1051. * due to invalid length of the set buffer, returns
  1052. * the amount of storage needed.
  1053. *
  1054. * \retval WLAN_STATUS_SUCCESS
  1055. * \retval WLAN_STATUS_INVALID_LENGTH
  1056. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  1057. * \retval WLAN_STATUS_MULTICAST_FULL
  1058. */
  1059. /*----------------------------------------------------------------------------*/
  1060. WLAN_STATUS
  1061. wlanoidSetSecCheckRequest(IN P_ADAPTER_T prAdapter,
  1062. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  1063. {
  1064. ASSERT(prAdapter);
  1065. ASSERT(pu4SetInfoLen);
  1066. if (u4SetBufferLen)
  1067. ASSERT(pvSetBuffer);
  1068. return wlanoidSendSetQueryP2PCmd(prAdapter,
  1069. CMD_ID_SEC_CHECK,
  1070. FALSE,
  1071. TRUE,
  1072. TRUE,
  1073. NULL,
  1074. nicOidCmdTimeoutCommon,
  1075. u4SetBufferLen, (PUINT_8) pvSetBuffer, pvSetBuffer, u4SetBufferLen);
  1076. } /* end of wlanoidSetSecCheckRequest() */
  1077. /*----------------------------------------------------------------------------*/
  1078. /*!
  1079. * \brief This routine is called to
  1080. *
  1081. * \param[in] prAdapter Pointer to the Adapter structure.
  1082. * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
  1083. * the query.
  1084. * \param[in] u4QueryBufferLen The length of the query buffer.
  1085. * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
  1086. * bytes written into the query buffer. If the call
  1087. * failed due to invalid length of the query buffer,
  1088. * returns the amount of storage needed.
  1089. *
  1090. * \retval WLAN_STATUS_SUCCESS
  1091. * \retval WLAN_STATUS_INVALID_LENGTH
  1092. * \retval WLAN_STATUS_ADAPTER_NOT_READY
  1093. * \retval WLAN_STATUS_MULTICAST_FULL
  1094. */
  1095. /*----------------------------------------------------------------------------*/
  1096. WLAN_STATUS
  1097. wlanoidGetSecCheckResponse(IN P_ADAPTER_T prAdapter,
  1098. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  1099. {
  1100. WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
  1101. /* P_WLAN_MAC_HEADER_T prWlanHdr = (P_WLAN_MAC_HEADER_T)NULL; */
  1102. P_GLUE_INFO_T prGlueInfo;
  1103. prGlueInfo = prAdapter->prGlueInfo;
  1104. ASSERT(prAdapter);
  1105. ASSERT(pu4QueryInfoLen);
  1106. if (u4QueryBufferLen)
  1107. ASSERT(pvQueryBuffer);
  1108. if (u4QueryBufferLen > 256)
  1109. u4QueryBufferLen = 256;
  1110. *pu4QueryInfoLen = u4QueryBufferLen;
  1111. #if DBG
  1112. DBGLOG_MEM8(SEC, LOUD, prGlueInfo->prP2PInfo->aucSecCheckRsp, u4QueryBufferLen);
  1113. #endif
  1114. kalMemCopy((PUINT_8) (pvQueryBuffer + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer)),
  1115. prGlueInfo->prP2PInfo->aucSecCheckRsp, u4QueryBufferLen);
  1116. return rWlanStatus;
  1117. } /* end of wlanoidGetSecCheckResponse() */
  1118. #endif
  1119. WLAN_STATUS
  1120. wlanoidSetNoaParam(IN P_ADAPTER_T prAdapter,
  1121. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  1122. {
  1123. P_PARAM_CUSTOM_NOA_PARAM_STRUCT_T prNoaParam;
  1124. CMD_CUSTOM_NOA_PARAM_STRUCT_T rCmdNoaParam;
  1125. DEBUGFUNC("wlanoidSetNoaParam");
  1126. DBGLOG(P2P, TRACE, "\n");
  1127. ASSERT(prAdapter);
  1128. ASSERT(pu4SetInfoLen);
  1129. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_NOA_PARAM_STRUCT_T);
  1130. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_NOA_PARAM_STRUCT_T))
  1131. return WLAN_STATUS_INVALID_LENGTH;
  1132. ASSERT(pvSetBuffer);
  1133. prNoaParam = (P_PARAM_CUSTOM_NOA_PARAM_STRUCT_T) pvSetBuffer;
  1134. kalMemZero(&rCmdNoaParam, sizeof(CMD_CUSTOM_NOA_PARAM_STRUCT_T));
  1135. rCmdNoaParam.u4NoaDurationMs = prNoaParam->u4NoaDurationMs;
  1136. rCmdNoaParam.u4NoaIntervalMs = prNoaParam->u4NoaIntervalMs;
  1137. rCmdNoaParam.u4NoaCount = prNoaParam->u4NoaCount;
  1138. #if 0
  1139. return wlanSendSetQueryCmd(prAdapter,
  1140. CMD_ID_SET_NOA_PARAM,
  1141. TRUE,
  1142. FALSE,
  1143. TRUE,
  1144. nicCmdEventSetCommon,
  1145. nicOidCmdTimeoutCommon,
  1146. sizeof(CMD_CUSTOM_NOA_PARAM_STRUCT_T),
  1147. (PUINT_8) &rCmdNoaParam, pvSetBuffer, u4SetBufferLen);
  1148. #else
  1149. return wlanoidSendSetQueryP2PCmd(prAdapter,
  1150. CMD_ID_SET_NOA_PARAM,
  1151. TRUE,
  1152. FALSE,
  1153. TRUE,
  1154. NULL,
  1155. nicOidCmdTimeoutCommon,
  1156. sizeof(CMD_CUSTOM_NOA_PARAM_STRUCT_T),
  1157. (PUINT_8) &rCmdNoaParam, pvSetBuffer, u4SetBufferLen);
  1158. #endif
  1159. }
  1160. WLAN_STATUS
  1161. wlanoidSetOppPsParam(IN P_ADAPTER_T prAdapter,
  1162. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  1163. {
  1164. P_PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T prOppPsParam;
  1165. CMD_CUSTOM_OPPPS_PARAM_STRUCT_T rCmdOppPsParam;
  1166. DEBUGFUNC("wlanoidSetOppPsParam");
  1167. DBGLOG(P2P, TRACE, "\n");
  1168. ASSERT(prAdapter);
  1169. ASSERT(pu4SetInfoLen);
  1170. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T);
  1171. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T))
  1172. return WLAN_STATUS_INVALID_LENGTH;
  1173. ASSERT(pvSetBuffer);
  1174. prOppPsParam = (P_PARAM_CUSTOM_OPPPS_PARAM_STRUCT_T) pvSetBuffer;
  1175. kalMemZero(&rCmdOppPsParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T));
  1176. rCmdOppPsParam.u4CTwindowMs = prOppPsParam->u4CTwindowMs;
  1177. #if 0
  1178. return wlanSendSetQueryCmd(prAdapter,
  1179. CMD_ID_SET_OPPPS_PARAM,
  1180. TRUE,
  1181. FALSE,
  1182. TRUE,
  1183. nicCmdEventSetCommon,
  1184. nicOidCmdTimeoutCommon,
  1185. sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T),
  1186. (PUINT_8) &rCmdOppPsParam, pvSetBuffer, u4SetBufferLen);
  1187. #else
  1188. return wlanoidSendSetQueryP2PCmd(prAdapter,
  1189. CMD_ID_SET_NOA_PARAM,
  1190. TRUE,
  1191. FALSE,
  1192. TRUE,
  1193. NULL,
  1194. nicOidCmdTimeoutCommon,
  1195. sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T),
  1196. (PUINT_8) &rCmdOppPsParam, pvSetBuffer, u4SetBufferLen);
  1197. #endif
  1198. }
  1199. WLAN_STATUS
  1200. wlanoidSetUApsdParam(IN P_ADAPTER_T prAdapter,
  1201. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  1202. {
  1203. P_PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T prUapsdParam;
  1204. CMD_CUSTOM_UAPSD_PARAM_STRUCT_T rCmdUapsdParam;
  1205. P_PM_PROFILE_SETUP_INFO_T prPmProfSetupInfo;
  1206. P_BSS_INFO_T prBssInfo;
  1207. DEBUGFUNC("wlanoidSetUApsdParam");
  1208. DBGLOG(P2P, TRACE, "\n");
  1209. ASSERT(prAdapter);
  1210. ASSERT(pu4SetInfoLen);
  1211. *pu4SetInfoLen = sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T);
  1212. if (u4SetBufferLen < sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T))
  1213. return WLAN_STATUS_INVALID_LENGTH;
  1214. ASSERT(pvSetBuffer);
  1215. prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  1216. prPmProfSetupInfo = &prBssInfo->rPmProfSetupInfo;
  1217. prUapsdParam = (P_PARAM_CUSTOM_UAPSD_PARAM_STRUCT_T) pvSetBuffer;
  1218. kalMemZero(&rCmdUapsdParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T));
  1219. rCmdUapsdParam.fgEnAPSD = prUapsdParam->fgEnAPSD;
  1220. prAdapter->rWifiVar.fgSupportUAPSD = prUapsdParam->fgEnAPSD;
  1221. rCmdUapsdParam.fgEnAPSD_AcBe = prUapsdParam->fgEnAPSD_AcBe;
  1222. rCmdUapsdParam.fgEnAPSD_AcBk = prUapsdParam->fgEnAPSD_AcBk;
  1223. rCmdUapsdParam.fgEnAPSD_AcVo = prUapsdParam->fgEnAPSD_AcVo;
  1224. rCmdUapsdParam.fgEnAPSD_AcVi = prUapsdParam->fgEnAPSD_AcVi;
  1225. prPmProfSetupInfo->ucBmpDeliveryAC =
  1226. ((prUapsdParam->fgEnAPSD_AcBe << 0) |
  1227. (prUapsdParam->fgEnAPSD_AcBk << 1) |
  1228. (prUapsdParam->fgEnAPSD_AcVi << 2) | (prUapsdParam->fgEnAPSD_AcVo << 3));
  1229. prPmProfSetupInfo->ucBmpTriggerAC =
  1230. ((prUapsdParam->fgEnAPSD_AcBe << 0) |
  1231. (prUapsdParam->fgEnAPSD_AcBk << 1) |
  1232. (prUapsdParam->fgEnAPSD_AcVi << 2) | (prUapsdParam->fgEnAPSD_AcVo << 3));
  1233. rCmdUapsdParam.ucMaxSpLen = prUapsdParam->ucMaxSpLen;
  1234. prPmProfSetupInfo->ucUapsdSp = prUapsdParam->ucMaxSpLen;
  1235. #if 0
  1236. return wlanSendSetQueryCmd(prAdapter,
  1237. CMD_ID_SET_UAPSD_PARAM,
  1238. TRUE,
  1239. FALSE,
  1240. TRUE,
  1241. nicCmdEventSetCommon,
  1242. nicOidCmdTimeoutCommon,
  1243. sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T),
  1244. (PUINT_8) &rCmdUapsdParam, pvSetBuffer, u4SetBufferLen);
  1245. #else
  1246. return wlanoidSendSetQueryP2PCmd(prAdapter,
  1247. CMD_ID_SET_UAPSD_PARAM,
  1248. TRUE,
  1249. FALSE,
  1250. TRUE,
  1251. NULL,
  1252. nicOidCmdTimeoutCommon,
  1253. sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUCT_T),
  1254. (PUINT_8) &rCmdUapsdParam, pvSetBuffer, u4SetBufferLen);
  1255. #endif
  1256. }
  1257. WLAN_STATUS
  1258. wlanoidQueryP2pOpChannel(IN P_ADAPTER_T prAdapter,
  1259. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  1260. {
  1261. WLAN_STATUS rResult = WLAN_STATUS_FAILURE;
  1262. /* PUINT_8 pucOpChnl = (PUINT_8)pvQueryBuffer; */
  1263. do {
  1264. if ((prAdapter == NULL) || (pu4QueryInfoLen == NULL))
  1265. break;
  1266. if ((u4QueryBufferLen) && (pvQueryBuffer == NULL))
  1267. break;
  1268. if (u4QueryBufferLen < sizeof(UINT_8)) {
  1269. *pu4QueryInfoLen = sizeof(UINT_8);
  1270. rResult = WLAN_STATUS_BUFFER_TOO_SHORT;
  1271. break;
  1272. }
  1273. #if 0
  1274. if (!p2pFuncGetCurrentOpChnl(prAdapter, pucOpChnl)) {
  1275. rResult = WLAN_STATUS_INVALID_DATA;
  1276. break;
  1277. }
  1278. #else
  1279. rResult = WLAN_STATUS_INVALID_DATA;
  1280. break;
  1281. #endif
  1282. /*
  1283. *pu4QueryInfoLen = sizeof(UINT_8);
  1284. rResult = WLAN_STATUS_SUCCESS;
  1285. */
  1286. } while (FALSE);
  1287. return rResult;
  1288. } /* wlanoidQueryP2pOpChannel */
  1289. WLAN_STATUS
  1290. wlanoidQueryP2pVersion(IN P_ADAPTER_T prAdapter,
  1291. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  1292. {
  1293. WLAN_STATUS rResult = WLAN_STATUS_FAILURE;
  1294. /* PUINT_8 pucVersionNum = (PUINT_8)pvQueryBuffer; */
  1295. do {
  1296. if ((prAdapter == NULL) || (pu4QueryInfoLen == NULL))
  1297. break;
  1298. if ((u4QueryBufferLen) && (pvQueryBuffer == NULL))
  1299. break;
  1300. if (u4QueryBufferLen < sizeof(UINT_8)) {
  1301. *pu4QueryInfoLen = sizeof(UINT_8);
  1302. rResult = WLAN_STATUS_BUFFER_TOO_SHORT;
  1303. break;
  1304. }
  1305. } while (FALSE);
  1306. return rResult;
  1307. } /* wlanoidQueryP2pVersion */
  1308. WLAN_STATUS
  1309. wlanoidSetP2pSupplicantVersion(IN P_ADAPTER_T prAdapter,
  1310. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  1311. {
  1312. WLAN_STATUS rResult = WLAN_STATUS_FAILURE;
  1313. UINT_8 ucVersionNum;
  1314. do {
  1315. if ((prAdapter == NULL) || (pu4SetInfoLen == NULL)) {
  1316. rResult = WLAN_STATUS_INVALID_DATA;
  1317. break;
  1318. }
  1319. if ((u4SetBufferLen) && (pvSetBuffer == NULL)) {
  1320. rResult = WLAN_STATUS_INVALID_DATA;
  1321. break;
  1322. }
  1323. *pu4SetInfoLen = sizeof(UINT_8);
  1324. if (u4SetBufferLen < sizeof(UINT_8)) {
  1325. rResult = WLAN_STATUS_INVALID_LENGTH;
  1326. break;
  1327. }
  1328. ucVersionNum = *((PUINT_8) pvSetBuffer);
  1329. rResult = WLAN_STATUS_SUCCESS;
  1330. } while (FALSE);
  1331. return rResult;
  1332. } /* wlanoidSetP2pSupplicantVersion */
  1333. /*----------------------------------------------------------------------------*/
  1334. /*!
  1335. * \brief This routine is used to set the WPS mode.
  1336. *
  1337. * \param[in] pvAdapter Pointer to the Adapter structure.
  1338. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
  1339. * \param[in] u4SetBufferLen The length of the set buffer.
  1340. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  1341. * bytes read from the set buffer. If the call failed
  1342. * due to invalid length of the set buffer, returns
  1343. * the amount of storage needed.
  1344. *
  1345. * \retval WLAN_STATUS_SUCCESS
  1346. * \retval WLAN_STATUS_INVALID_LENGTH
  1347. */
  1348. /*----------------------------------------------------------------------------*/
  1349. WLAN_STATUS
  1350. wlanoidSetP2pWPSmode(IN P_ADAPTER_T prAdapter,
  1351. IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen)
  1352. {
  1353. WLAN_STATUS status;
  1354. UINT_32 u4IsWPSmode = 0;
  1355. DEBUGFUNC("wlanoidSetP2pWPSmode");
  1356. ASSERT(prAdapter);
  1357. ASSERT(pu4SetInfoLen);
  1358. if (pvSetBuffer)
  1359. u4IsWPSmode = *(PUINT_32) pvSetBuffer;
  1360. else
  1361. u4IsWPSmode = 0;
  1362. if (u4IsWPSmode)
  1363. prAdapter->rWifiVar.prP2pFsmInfo->fgIsWPSMode = 1;
  1364. else
  1365. prAdapter->rWifiVar.prP2pFsmInfo->fgIsWPSMode = 0;
  1366. status = nicUpdateBss(prAdapter, NETWORK_TYPE_P2P_INDEX);
  1367. return status;
  1368. } /* end of wlanoidSetP2pWPSmode() */
  1369. #if CFG_SUPPORT_P2P_RSSI_QUERY
  1370. WLAN_STATUS
  1371. wlanoidQueryP2pRssi(IN P_ADAPTER_T prAdapter,
  1372. IN PVOID pvQueryBuffer, IN UINT_32 u4QueryBufferLen, OUT PUINT_32 pu4QueryInfoLen)
  1373. {
  1374. DEBUGFUNC("wlanoidQueryP2pRssi");
  1375. ASSERT(prAdapter);
  1376. ASSERT(pu4QueryInfoLen);
  1377. if (u4QueryBufferLen)
  1378. ASSERT(pvQueryBuffer);
  1379. *pu4QueryInfoLen = sizeof(PARAM_RSSI);
  1380. /* Check for query buffer length */
  1381. if (u4QueryBufferLen < *pu4QueryInfoLen) {
  1382. DBGLOG(REQ, WARN, "Too short length %u\n", u4QueryBufferLen);
  1383. return WLAN_STATUS_BUFFER_TOO_SHORT;
  1384. }
  1385. if (prAdapter->fgIsP2pLinkQualityValid == TRUE &&
  1386. (kalGetTimeTick() - prAdapter->rP2pLinkQualityUpdateTime) <= CFG_LINK_QUALITY_VALID_PERIOD) {
  1387. PARAM_RSSI rRssi;
  1388. rRssi = (PARAM_RSSI) prAdapter->rP2pLinkQuality.cRssi; /* ranged from (-128 ~ 30) in unit of dBm */
  1389. if (rRssi > PARAM_WHQL_RSSI_MAX_DBM)
  1390. rRssi = PARAM_WHQL_RSSI_MAX_DBM;
  1391. else if (rRssi < PARAM_WHQL_RSSI_MIN_DBM)
  1392. rRssi = PARAM_WHQL_RSSI_MIN_DBM;
  1393. kalMemCopy(pvQueryBuffer, &rRssi, sizeof(PARAM_RSSI));
  1394. return WLAN_STATUS_SUCCESS;
  1395. }
  1396. #ifdef LINUX
  1397. return wlanSendSetQueryCmd(prAdapter,
  1398. CMD_ID_GET_LINK_QUALITY,
  1399. FALSE,
  1400. TRUE,
  1401. TRUE,
  1402. nicCmdEventQueryLinkQuality,
  1403. nicOidCmdTimeoutCommon,
  1404. *pu4QueryInfoLen, pvQueryBuffer, pvQueryBuffer, u4QueryBufferLen);
  1405. #else
  1406. return wlanSendSetQueryCmd(prAdapter,
  1407. CMD_ID_GET_LINK_QUALITY,
  1408. FALSE,
  1409. TRUE,
  1410. TRUE,
  1411. nicCmdEventQueryLinkQuality,
  1412. nicOidCmdTimeoutCommon, 0, NULL, pvQueryBuffer, u4QueryBufferLen);
  1413. #endif
  1414. } /* wlanoidQueryP2pRssi */
  1415. #endif