2 ** $Id: //Department/DaVinci/TRUNK/WiFi_P2P_Driver/common/wlan_p2p.c#8 $
6 \brief This file contains the Wi-Fi Direct commands processing routines for
7 MediaTek Inc. 802.11 Wireless LAN Adapters.
10 /******************************************************************************
11 * Copyright (c) 2007 MediaTek Inc.
13 * All rights reserved. Copying, compilation, modification, distribution
14 * or any other use whatsoever of this material is strictly prohibited
15 * except in accordance with a Software License Agreement with
17 *******************************************************************************
20 /******************************************************************************
23 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
24 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
25 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
26 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
27 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
28 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
29 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
30 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
31 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
32 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
33 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
34 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
35 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
37 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
38 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
39 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
40 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
41 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
43 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
44 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
45 * OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
46 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
47 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
49 *******************************************************************************
55 * 07 17 2012 yuche.tsai
57 * Compile no error before trial run.
59 * 11 24 2011 yuche.tsai
61 * Fix P2P IOCTL of multicast address bug, add low power driver stop control.
63 * 11 22 2011 yuche.tsai
65 * Update RSSI link quality of P2P Network query method. (Bug fix)
67 * 11 19 2011 yuche.tsai
69 * Add RSSI support for P2P network.
71 * 11 08 2011 yuche.tsai
72 * [WCXRP00001094] [Volunteer Patch][Driver] Driver version & supplicant version query & set support for service discovery version check.
73 * Add support for driver version query & p2p supplicant verseion set.
74 * For new service discovery mechanism sync.
76 * 10 18 2011 yuche.tsai
77 * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
78 * Support Channle Query.
80 * 10 18 2011 yuche.tsai
81 * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
85 * 08 23 2011 yuche.tsai
87 * Fix Multicast Issue of P2P.
89 * 04 27 2011 george.huang
90 * [WCXRP00000684] [MT6620 Wi-Fi][Driver] Support P2P setting ARP filter
91 * Support P2P ARP filter setting on early suspend/ late resume
93 * 04 08 2011 george.huang
94 * [WCXRP00000621] [MT6620 Wi-Fi][Driver] Support P2P supplicant to set power mode
95 * separate settings of P2P and AIS
97 * 03 22 2011 george.huang
98 * [WCXRP00000504] [MT6620 Wi-Fi][FW] Support Sigma CAPI for power saving related command
99 * link with supplicant commands
102 * [WCXRP00000571] [MT6620 Wi-Fi] [Driver] Not check the p2p role during set key
103 * Skip the p2p role for adding broadcast key issue.
106 * [WCXRP00000530] [MT6620 Wi-Fi] [Driver] skip doing p2pRunEventAAAComplete after send assoc response Tx Done
107 * fixed compiling error while enable dbg.
109 * 03 08 2011 yuche.tsai
110 * [WCXRP00000480] [Volunteer Patch][MT6620][Driver] WCS IE format issue[WCXRP00000509] [Volunteer Patch][MT6620][Driver] Kernal panic when remove p2p module.
113 * 03 07 2011 terry.wu
114 * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
115 * Toggle non-standard debug messages to comments.
118 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
119 * rename the define to anti_pviracy.
122 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
123 * add the code to get the check rsponse and indicate to app.
126 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
127 * Add Security check related code.
129 * 03 02 2011 yuche.tsai
130 * [WCXRP00000245] 1. Invitation Request/Response.
131 2. Provision Discovery Request/Response
133 * Fix SD Request Query Length issue.
135 * 03 02 2011 yuche.tsai
136 * [WCXRP00000245] 1. Invitation Request/Response.
137 2. Provision Discovery Request/Response
139 * Service Discovery Request.
141 * 03 01 2011 yuche.tsai
142 * [WCXRP00000245] 1. Invitation Request/Response.
143 2. Provision Discovery Request/Response
145 * Update Service Discovery Wlan OID related function.
147 * 03 01 2011 yuche.tsai
148 * [WCXRP00000245] 1. Invitation Request/Response.
149 2. Provision Discovery Request/Response
151 * Update Service Discovery Related wlanoid function.
153 * 02 09 2011 yuche.tsai
154 * [WCXRP00000245] 1. Invitation Request/Response.
155 2. Provision Discovery Request/Response
157 * Add Service Discovery Indication Related code.
159 * 01 26 2011 yuche.tsai
160 * [WCXRP00000245] 1. Invitation Request/Response.
161 2. Provision Discovery Request/Response
163 * Add Service Discovery Function.
166 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
167 * ioctl implementations for P2P Service Discovery
170 * [WCXRP00000338] [MT6620 Wi-Fi][Driver] Separate kalMemAlloc into kmalloc and vmalloc implementations to ease physically continous memory demands
171 * separate kalMemAlloc() into virtually-continous and physically-continous type to ease slab system pressure
174 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
175 * 1. header file restructure for more clear module isolation
176 * 2. add function interface definition for implementing Service Discovery callbacks
179 * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and replaced by ENUM_NETWORK_TYPE_INDEX_T only
180 * remove ENUM_NETWORK_TYPE_T definitions
184 * [WCXRP00000069][MT6620 Wi-Fi][Driver] Fix some code for phase 1 P2P Demo.
186 * 09 21 2010 kevin.huang
187 * [WCXRP00000054] [MT6620 Wi-Fi][Driver] Restructure driver for second Interface
188 * Isolate P2P related function for Hardware Software Bundle
190 * 09 03 2010 kevin.huang
192 * Refine #include sequence and solve recursive/nested #include issue
196 * revise constant definitions to be matched with implementation (original cmd-event definition is deprecated)
200 * add subroutines for P2P to set multicast list.
202 * 08 16 2010 george.huang
206 * 08 16 2010 george.huang
208 * support wlanoidSetP2pPowerSaveProfile() in P2P
210 * 08 16 2010 george.huang
212 * Support wlanoidSetNetworkAddress() for P2P
216 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
219 * [WPD00003833][MT6620 and MT5931] Driver migration
220 * add API in que_mgt to retrieve sta-rec index for security frames.
223 * [WPD00003833][MT6620 and MT5931] Driver migration
224 * 802.1x and bluetooth-over-Wi-Fi security frames are now delievered to firmware via command path instead of data path.
227 * [WPD00003833][MT6620 and MT5931] Driver migration
228 * 1) migrate assoc.c.
229 * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
230 * 3) add configuration options for CNM_MEM and RSN modules
231 * 4) add data path for management frames
232 * 5) eliminate rPacketInfo of MSDU_INFO_T
234 * 06 06 2010 kevin.huang
235 * [WPD00003832][MT6620 5931] Create driver base
236 * [MT6620 5931] Create driver base
239 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
240 * 1) add timeout handler mechanism for pending command packets
241 * 2) add p2p add/removal key
246 /******************************************************************************
247 * C O M P I L E R F L A G S
248 *******************************************************************************
251 /******************************************************************************
252 * E X T E R N A L R E F E R E N C E S
253 *******************************************************************************
257 /******************************************************************************
259 *******************************************************************************
262 /******************************************************************************
264 *******************************************************************************
267 /******************************************************************************
268 * P U B L I C D A T A
269 *******************************************************************************
272 /******************************************************************************
273 * P R I V A T E D A T A
274 *******************************************************************************
277 /******************************************************************************
279 *******************************************************************************
282 /******************************************************************************
283 * F U N C T I O N D E C L A R A T I O N S
284 *******************************************************************************
287 /******************************************************************************
289 *******************************************************************************
291 /*----------------------------------------------------------------------------*/
293 * \brief command packet generation utility
295 * \param[in] prAdapter Pointer to the Adapter structure.
296 * \param[in] ucCID Command ID
297 * \param[in] fgSetQuery Set or Query
298 * \param[in] fgNeedResp Need for response
299 * \param[in] pfCmdDoneHandler Function pointer when command is done
300 * \param[in] u4SetQueryInfoLen The length of the set/query buffer
301 * \param[in] pucInfoBuffer Pointer to set/query buffer
304 * \retval WLAN_STATUS_PENDING
305 * \retval WLAN_STATUS_FAILURE
307 /*----------------------------------------------------------------------------*/
309 wlanoidSendSetQueryP2PCmd (
310 IN P_ADAPTER_T prAdapter,
315 PFN_CMD_DONE_HANDLER pfCmdDoneHandler,
316 PFN_CMD_TIMEOUT_HANDLER pfCmdTimeoutHandler,
317 UINT_32 u4SetQueryInfoLen,
318 PUINT_8 pucInfoBuffer,
319 OUT PVOID pvSetQueryBuffer,
320 IN UINT_32 u4SetQueryBufferLen
323 P_GLUE_INFO_T prGlueInfo;
324 P_CMD_INFO_T prCmdInfo;
325 P_WIFI_CMD_T prWifiCmd;
330 prGlueInfo = prAdapter->prGlueInfo;
333 DEBUGFUNC("wlanoidSendSetQueryP2PCmd");
334 DBGLOG(REQ, TRACE, ("Command ID = 0x%08X\n", ucCID));
336 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetQueryInfoLen));
339 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
340 return WLAN_STATUS_FAILURE;
343 // increase command sequence number
344 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
345 DBGLOG(REQ, TRACE, ("ucCmdSeqNum =%d\n", ucCmdSeqNum));
347 // Setup common CMD Info Packet
348 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
349 prCmdInfo->eNetworkType = NETWORK_TYPE_P2P_INDEX;
350 prCmdInfo->u2InfoBufLen = (UINT_16)(CMD_HDR_SIZE + u4SetQueryInfoLen);
351 prCmdInfo->pfCmdDoneHandler = pfCmdDoneHandler;
352 prCmdInfo->pfCmdTimeoutHandler = pfCmdTimeoutHandler;
353 prCmdInfo->fgIsOid = fgIsOid;
354 prCmdInfo->ucCID = ucCID;
355 prCmdInfo->fgSetQuery = fgSetQuery;
356 prCmdInfo->fgNeedResp = fgNeedResp;
357 prCmdInfo->fgDriverDomainMCR = FALSE;
358 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
359 prCmdInfo->u4SetInfoLen = u4SetQueryInfoLen;
360 prCmdInfo->pvInformationBuffer = pvSetQueryBuffer;
361 prCmdInfo->u4InformationBufferLength = u4SetQueryBufferLen;
363 // Setup WIFI_CMD_T (no payload)
364 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
365 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
366 prWifiCmd->ucCID = prCmdInfo->ucCID;
367 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
368 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
370 if(u4SetQueryInfoLen > 0 && pucInfoBuffer != NULL) {
371 kalMemCopy(prWifiCmd->aucBuffer, pucInfoBuffer, u4SetQueryInfoLen);
374 // insert into prCmdQueue
375 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
377 // wakeup txServiceThread later
378 GLUE_SET_EVENT(prGlueInfo);
379 return WLAN_STATUS_PENDING;
382 /*----------------------------------------------------------------------------*/
384 * \brief This routine is called to set a key to Wi-Fi Direct driver
386 * \param[in] prAdapter Pointer to the Adapter structure.
387 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
388 * \param[in] u4SetBufferLen The length of the set buffer.
389 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
390 * bytes read from the set buffer. If the call failed
391 * due to invalid length of the set buffer, returns
392 * the amount of storage needed.
394 * \retval WLAN_STATUS_SUCCESS
395 * \retval WLAN_STATUS_ADAPTER_NOT_READY
396 * \retval WLAN_STATUS_INVALID_LENGTH
397 * \retval WLAN_STATUS_INVALID_DATA
399 /*----------------------------------------------------------------------------*/
402 IN P_ADAPTER_T prAdapter,
403 IN PVOID pvSetBuffer,
404 IN UINT_32 u4SetBufferLen,
405 OUT PUINT_32 pu4SetInfoLen
408 CMD_802_11_KEY rCmdKey;
409 P_PARAM_KEY_T prNewKey;
411 DEBUGFUNC("wlanoidSetAddP2PKey");
412 DBGLOG(REQ, INFO, ("\n"));
416 ASSERT(pu4SetInfoLen);
418 prNewKey = (P_PARAM_KEY_T) pvSetBuffer;
420 /* Verify the key structure length. */
421 if (prNewKey->u4Length > u4SetBufferLen) {
422 DBGLOG(REQ, WARN, ("Invalid key structure length (%d) greater than total buffer length (%d)\n",
423 (UINT_8)prNewKey->u4Length,
424 (UINT_8)u4SetBufferLen));
426 *pu4SetInfoLen = u4SetBufferLen;
427 return WLAN_STATUS_INVALID_LENGTH;
429 /* Verify the key material length for key material buffer */
430 else if (prNewKey->u4KeyLength > prNewKey->u4Length - OFFSET_OF(PARAM_KEY_T, aucKeyMaterial)) {
431 DBGLOG(REQ, WARN, ("Invalid key material length (%d)\n", (UINT_8)prNewKey->u4KeyLength));
432 *pu4SetInfoLen = u4SetBufferLen;
433 return WLAN_STATUS_INVALID_DATA;
435 /* Exception check */
436 else if (prNewKey->u4KeyIndex & 0x0fffff00) {
437 return WLAN_STATUS_INVALID_DATA;
439 /* Exception check, pairwise key must with transmit bit enabled */
440 else if ((prNewKey->u4KeyIndex & BITS(30,31)) == IS_UNICAST_KEY) {
441 return WLAN_STATUS_INVALID_DATA;
443 else if (!(prNewKey->u4KeyLength == CCMP_KEY_LEN) && !(prNewKey->u4KeyLength == TKIP_KEY_LEN)) {
444 return WLAN_STATUS_INVALID_DATA;
446 /* Exception check, pairwise key must with transmit bit enabled */
447 else if ((prNewKey->u4KeyIndex & BITS(30,31)) == BITS(30,31)) {
448 if (((prNewKey->u4KeyIndex & 0xff) != 0) ||
449 ((prNewKey->arBSSID[0] == 0xff) && (prNewKey->arBSSID[1] == 0xff) && (prNewKey->arBSSID[2] == 0xff) &&
450 (prNewKey->arBSSID[3] == 0xff) && (prNewKey->arBSSID[4] == 0xff) && (prNewKey->arBSSID[5] == 0xff))) {
451 return WLAN_STATUS_INVALID_DATA;
455 *pu4SetInfoLen = u4SetBufferLen;
457 // fill CMD_802_11_KEY
458 kalMemZero(&rCmdKey, sizeof(CMD_802_11_KEY));
459 rCmdKey.ucAddRemove = 1; /* add */
460 rCmdKey.ucTxKey = ((prNewKey->u4KeyIndex & IS_TRANSMIT_KEY) == IS_TRANSMIT_KEY) ? 1 : 0;
461 rCmdKey.ucKeyType = ((prNewKey->u4KeyIndex & IS_UNICAST_KEY) == IS_UNICAST_KEY) ? 1 : 0;
462 if(kalP2PGetRole(prAdapter->prGlueInfo) == 1) { /* group client */
463 rCmdKey.ucIsAuthenticator = 0;
465 else { /* group owner */
466 rCmdKey.ucIsAuthenticator = 1;
468 COPY_MAC_ADDR(rCmdKey.aucPeerAddr, prNewKey->arBSSID);
469 rCmdKey.ucNetType = NETWORK_TYPE_P2P_INDEX;
470 if(prNewKey->u4KeyLength == CCMP_KEY_LEN)
471 rCmdKey.ucAlgorithmId = CIPHER_SUITE_CCMP; // AES
472 else if(prNewKey->u4KeyLength == TKIP_KEY_LEN)
473 rCmdKey.ucAlgorithmId = CIPHER_SUITE_TKIP; // TKIP
474 rCmdKey.ucKeyId = (UINT_8)(prNewKey->u4KeyIndex & 0xff);
475 rCmdKey.ucKeyLen = (UINT_8)prNewKey->u4KeyLength;
476 kalMemCopy(rCmdKey.aucKeyMaterial, (PUINT_8)prNewKey->aucKeyMaterial, rCmdKey.ucKeyLen);
478 return wlanoidSendSetQueryP2PCmd(prAdapter,
479 CMD_ID_ADD_REMOVE_KEY,
483 nicCmdEventSetCommon,
485 sizeof(CMD_802_11_KEY),
493 /*----------------------------------------------------------------------------*/
495 * \brief This routine is called to request Wi-Fi Direct driver to remove keys
497 * \param[in] prAdapter Pointer to the Adapter structure.
498 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
499 * \param[in] u4SetBufferLen The length of the set buffer.
500 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
501 * bytes read from the set buffer. If the call failed
502 * due to invalid length of the set buffer, returns
503 * the amount of storage needed.
505 * \retval WLAN_STATUS_SUCCESS
506 * \retval WLAN_STATUS_INVALID_DATA
507 * \retval WLAN_STATUS_INVALID_LENGTH
508 * \retval WLAN_STATUS_INVALID_DATA
510 /*----------------------------------------------------------------------------*/
512 wlanoidSetRemoveP2PKey(
513 IN P_ADAPTER_T prAdapter,
514 IN PVOID pvSetBuffer,
515 IN UINT_32 u4SetBufferLen,
516 OUT PUINT_32 pu4SetInfoLen
519 CMD_802_11_KEY rCmdKey;
520 P_PARAM_REMOVE_KEY_T prRemovedKey;
522 DEBUGFUNC("wlanoidSetRemoveP2PKey");
525 if (u4SetBufferLen < sizeof(PARAM_REMOVE_KEY_T)) {
526 return WLAN_STATUS_INVALID_LENGTH;
530 prRemovedKey = (P_PARAM_REMOVE_KEY_T)pvSetBuffer;
532 /* Check bit 31: this bit should always 0 */
533 if (prRemovedKey->u4KeyIndex & IS_TRANSMIT_KEY) {
534 /* Bit 31 should not be set */
535 DBGLOG(REQ, ERROR, ("invalid key index: 0x%08lx\n",
536 prRemovedKey->u4KeyIndex));
537 return WLAN_STATUS_INVALID_DATA;
540 /* Check bits 8 ~ 29 should always be 0 */
541 if (prRemovedKey->u4KeyIndex & BITS(8, 29)) {
542 /* Bit 31 should not be set */
543 DBGLOG(REQ, ERROR, ("invalid key index: 0x%08lx\n",
544 prRemovedKey->u4KeyIndex));
545 return WLAN_STATUS_INVALID_DATA;
548 /* There should not be any key operation for P2P Device */
549 if(kalP2PGetRole(prAdapter->prGlueInfo) == 0) {
550 // return WLAN_STATUS_NOT_ACCEPTED;
553 kalMemZero((PUINT_8)&rCmdKey, sizeof(CMD_802_11_KEY));
555 rCmdKey.ucAddRemove = 0; // remove
556 if(kalP2PGetRole(prAdapter->prGlueInfo) == 1) { /* group client */
557 rCmdKey.ucIsAuthenticator = 0;
559 else { /* group owner */
560 rCmdKey.ucIsAuthenticator = 1;
562 kalMemCopy(rCmdKey.aucPeerAddr, (PUINT_8)prRemovedKey->arBSSID, MAC_ADDR_LEN);
563 rCmdKey.ucNetType = NETWORK_TYPE_P2P_INDEX;
564 rCmdKey.ucKeyId = (UINT_8)(prRemovedKey->u4KeyIndex & 0x000000ff);
566 return wlanoidSendSetQueryP2PCmd(prAdapter,
567 CMD_ID_ADD_REMOVE_KEY,
571 nicCmdEventSetCommon,
573 sizeof(CMD_802_11_KEY),
580 /*----------------------------------------------------------------------------*/
582 * \brief Setting the IP address for pattern search function.
584 * \param[in] prAdapter Pointer to the Adapter structure.
585 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
586 * \param[in] u4SetBufferLen The length of the set buffer.
587 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
588 * bytes read from the set buffer. If the call failed
589 * due to invalid length of the set buffer, returns
590 * the amount of storage needed.
592 * \return WLAN_STATUS_SUCCESS
593 * \return WLAN_STATUS_ADAPTER_NOT_READY
594 * \return WLAN_STATUS_INVALID_LENGTH
596 /*----------------------------------------------------------------------------*/
598 wlanoidSetP2pNetworkAddress(
599 IN P_ADAPTER_T prAdapter,
600 IN PVOID pvSetBuffer,
601 IN UINT_32 u4SetBufferLen,
602 OUT PUINT_32 pu4SetInfoLen
605 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
607 P_CMD_SET_NETWORK_ADDRESS_LIST prCmdNetworkAddressList;
608 P_PARAM_NETWORK_ADDRESS_LIST prNetworkAddressList = (P_PARAM_NETWORK_ADDRESS_LIST)pvSetBuffer;
609 P_PARAM_NETWORK_ADDRESS prNetworkAddress;
610 P_PARAM_NETWORK_ADDRESS_IP prNetAddrIp;
611 UINT_32 u4IpAddressCount, u4CmdSize;
613 DEBUGFUNC("wlanoidSetP2pNetworkAddress");
614 DBGLOG(INIT, TRACE, ("\n"));
617 ASSERT(pu4SetInfoLen);
621 if (u4SetBufferLen < sizeof(PARAM_NETWORK_ADDRESS_LIST)) {
622 return WLAN_STATUS_INVALID_DATA;
626 u4IpAddressCount = 0;
628 prNetworkAddress = prNetworkAddressList->arAddress;
629 for ( i = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) {
630 if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
631 prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
635 prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((UINT_32) prNetworkAddress +
636 (UINT_32) (prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
639 // construct payload of command packet
640 u4CmdSize = OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST, arNetAddress) +
641 sizeof(IPV4_NETWORK_ADDRESS) * u4IpAddressCount;
643 prCmdNetworkAddressList = (P_CMD_SET_NETWORK_ADDRESS_LIST) kalMemAlloc(u4CmdSize, VIR_MEM_TYPE);
645 if(prCmdNetworkAddressList == NULL)
646 return WLAN_STATUS_FAILURE;
648 // fill P_CMD_SET_NETWORK_ADDRESS_LIST
649 prCmdNetworkAddressList->ucNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
650 prCmdNetworkAddressList->ucAddressCount = (UINT_8)u4IpAddressCount;
651 prNetworkAddress = prNetworkAddressList->arAddress;
652 for (i = 0, j = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) {
653 if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
654 prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
655 prNetAddrIp = (P_PARAM_NETWORK_ADDRESS_IP)prNetworkAddress->aucAddress;
657 kalMemCopy(prCmdNetworkAddressList->arNetAddress[j].aucIpAddr,
658 &(prNetAddrIp->in_addr),
664 prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((UINT_32) prNetworkAddress +
665 (UINT_32) (prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
668 rStatus = wlanSendSetQueryCmd(prAdapter,
669 CMD_ID_SET_IP_ADDRESS,
673 nicCmdEventSetIpAddress,
674 nicOidCmdTimeoutCommon,
676 (PUINT_8)prCmdNetworkAddressList,
681 kalMemFree(prCmdNetworkAddressList, VIR_MEM_TYPE, u4CmdSize);
685 /*----------------------------------------------------------------------------*/
687 * \brief This routine is used to query the power save profile.
689 * \param[in] prAdapter Pointer to the Adapter structure.
690 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
692 * \param[in] u4QueryBufLen The length of the query buffer.
693 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
694 * bytes written into the query buffer. If the call
695 * failed due to invalid length of the query buffer,
696 * returns the amount of storage needed.
698 * \return WLAN_STATUS_SUCCESS
700 /*----------------------------------------------------------------------------*/
702 wlanoidQueryP2pPowerSaveProfile (
703 IN P_ADAPTER_T prAdapter,
704 IN PVOID pvQueryBuffer,
705 IN UINT_32 u4QueryBufferLen,
706 OUT PUINT_32 pu4QueryInfoLen
709 DEBUGFUNC("wlanoidQueryP2pPowerSaveProfile");
712 ASSERT(pu4QueryInfoLen);
714 if (u4QueryBufferLen!=0) {
715 ASSERT(pvQueryBuffer);
717 *(PPARAM_POWER_MODE) pvQueryBuffer = (PARAM_POWER_MODE)(prAdapter->rWlanInfo.arPowerSaveMode[NETWORK_TYPE_P2P_INDEX].ucPsProfile);
718 *pu4QueryInfoLen = sizeof(PARAM_POWER_MODE);
721 return WLAN_STATUS_SUCCESS;
724 /*----------------------------------------------------------------------------*/
726 * \brief This routine is used to set the power save profile.
728 * \param[in] pvAdapter Pointer to the Adapter structure.
729 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
730 * \param[in] u4SetBufferLen The length of the set buffer.
731 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
732 * bytes read from the set buffer. If the call failed
733 * due to invalid length of the set buffer, returns
734 * the amount of storage needed.
736 * \retval WLAN_STATUS_SUCCESS
737 * \retval WLAN_STATUS_INVALID_LENGTH
739 /*----------------------------------------------------------------------------*/
741 wlanoidSetP2pPowerSaveProfile (
742 IN P_ADAPTER_T prAdapter,
743 IN PVOID pvSetBuffer,
744 IN UINT_32 u4SetBufferLen,
745 OUT PUINT_32 pu4SetInfoLen
749 PARAM_POWER_MODE ePowerMode;
750 DEBUGFUNC("wlanoidSetP2pPowerSaveProfile");
753 ASSERT(pu4SetInfoLen);
755 *pu4SetInfoLen = sizeof(PARAM_POWER_MODE);
756 if (u4SetBufferLen < sizeof(PARAM_POWER_MODE)) {
757 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4SetBufferLen));
758 return WLAN_STATUS_INVALID_LENGTH;
760 else if (*(PPARAM_POWER_MODE) pvSetBuffer >= Param_PowerModeMax) {
761 WARNLOG(("Invalid power mode %d\n",
762 *(PPARAM_POWER_MODE) pvSetBuffer));
763 return WLAN_STATUS_INVALID_DATA;
766 ePowerMode = *(PPARAM_POWER_MODE) pvSetBuffer;
768 if (prAdapter->fgEnCtiaPowerMode) {
769 if (ePowerMode == Param_PowerModeCAM) {
772 // User setting to PS mode (Param_PowerModeMAX_PSP or Param_PowerModeFast_PSP)
774 if (prAdapter->u4CtiaPowerMode == 0) {
775 // force to keep in CAM mode
776 ePowerMode = Param_PowerModeCAM;
777 } else if (prAdapter->u4CtiaPowerMode == 1) {
778 ePowerMode = Param_PowerModeMAX_PSP;
779 } else if (prAdapter->u4CtiaPowerMode == 2) {
780 ePowerMode = Param_PowerModeFast_PSP;
785 status = nicConfigPowerSaveProfile(
787 NETWORK_TYPE_P2P_INDEX,
791 } /* end of wlanoidSetP2pPowerSaveProfile() */
793 /*----------------------------------------------------------------------------*/
795 * \brief This routine is used to set the power save profile.
797 * \param[in] pvAdapter Pointer to the Adapter structure.
798 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
799 * \param[in] u4SetBufferLen The length of the set buffer.
800 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
801 * bytes read from the set buffer. If the call failed
802 * due to invalid length of the set buffer, returns
803 * the amount of storage needed.
805 * \retval WLAN_STATUS_SUCCESS
806 * \retval WLAN_STATUS_INVALID_LENGTH
808 /*----------------------------------------------------------------------------*/
810 wlanoidSetP2pSetNetworkAddress (
811 IN P_ADAPTER_T prAdapter,
812 IN PVOID pvSetBuffer,
813 IN UINT_32 u4SetBufferLen,
814 OUT PUINT_32 pu4SetInfoLen
817 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
819 P_CMD_SET_NETWORK_ADDRESS_LIST prCmdNetworkAddressList;
820 P_PARAM_NETWORK_ADDRESS_LIST prNetworkAddressList = (P_PARAM_NETWORK_ADDRESS_LIST)pvSetBuffer;
821 P_PARAM_NETWORK_ADDRESS prNetworkAddress;
822 P_PARAM_NETWORK_ADDRESS_IP prNetAddrIp;
823 UINT_32 u4IpAddressCount, u4CmdSize;
824 PUINT_8 pucBuf = (PUINT_8)pvSetBuffer;
826 DEBUGFUNC("wlanoidSetP2pSetNetworkAddress");
827 DBGLOG(INIT, TRACE, ("\n"));
828 printk("wlanoidSetP2pSetNetworkAddress (%d)\n", (INT_16)u4SetBufferLen);
831 ASSERT(pu4SetInfoLen);
835 if (u4SetBufferLen < sizeof(PARAM_NETWORK_ADDRESS_LIST)) {
836 return WLAN_STATUS_INVALID_DATA;
840 u4IpAddressCount = 0;
842 prNetworkAddress = prNetworkAddressList->arAddress;
843 for ( i = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) {
844 if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
845 prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
849 prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((UINT_32) prNetworkAddress +
850 (UINT_32) (prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
853 // construct payload of command packet
854 u4CmdSize = OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST, arNetAddress) +
855 sizeof(IPV4_NETWORK_ADDRESS) * u4IpAddressCount;
857 if (u4IpAddressCount == 0) {
858 u4CmdSize = sizeof(CMD_SET_NETWORK_ADDRESS_LIST);
861 prCmdNetworkAddressList = (P_CMD_SET_NETWORK_ADDRESS_LIST) kalMemAlloc(u4CmdSize, VIR_MEM_TYPE);
863 if(prCmdNetworkAddressList == NULL)
864 return WLAN_STATUS_FAILURE;
866 // fill P_CMD_SET_NETWORK_ADDRESS_LIST
867 prCmdNetworkAddressList->ucNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
869 /* only to set IP address to FW once ARP filter is enabled */
870 if (prAdapter->fgEnArpFilter) {
871 prCmdNetworkAddressList->ucAddressCount = (UINT_8)u4IpAddressCount;
872 prNetworkAddress = prNetworkAddressList->arAddress;
874 printk("u4IpAddressCount (%ld) \n", (INT_32)u4IpAddressCount);
875 for (i = 0, j = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) {
876 if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
877 prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
878 prNetAddrIp = (P_PARAM_NETWORK_ADDRESS_IP)prNetworkAddress->aucAddress;
880 kalMemCopy(prCmdNetworkAddressList->arNetAddress[j].aucIpAddr,
881 &(prNetAddrIp->in_addr),
886 pucBuf = (PUINT_8)&prNetAddrIp->in_addr;
887 printk("prNetAddrIp->in_addr:%d:%d:%d:%d\n", (UINT_8)pucBuf[0], (UINT_8)pucBuf[1], (UINT_8)pucBuf[2], (UINT_8)pucBuf[3]);
890 prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((UINT_32) prNetworkAddress +
891 (UINT_32) (prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
895 prCmdNetworkAddressList->ucAddressCount = 0;
898 rStatus = wlanSendSetQueryCmd(prAdapter,
899 CMD_ID_SET_IP_ADDRESS,
903 nicCmdEventSetIpAddress,
904 nicOidCmdTimeoutCommon,
906 (PUINT_8)prCmdNetworkAddressList,
911 kalMemFree(prCmdNetworkAddressList, VIR_MEM_TYPE, u4CmdSize);
913 } /* end of wlanoidSetP2pSetNetworkAddress() */
916 /*----------------------------------------------------------------------------*/
918 * \brief This routine is called to set Multicast Address List.
920 * \param[in] prAdapter Pointer to the Adapter structure.
921 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
922 * \param[in] u4SetBufferLen The length of the set buffer.
923 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
924 * bytes read from the set buffer. If the call failed
925 * due to invalid length of the set buffer, returns
926 * the amount of storage needed.
928 * \retval WLAN_STATUS_SUCCESS
929 * \retval WLAN_STATUS_INVALID_LENGTH
930 * \retval WLAN_STATUS_ADAPTER_NOT_READY
931 * \retval WLAN_STATUS_MULTICAST_FULL
933 /*----------------------------------------------------------------------------*/
935 wlanoidSetP2PMulticastList(
936 IN P_ADAPTER_T prAdapter,
937 IN PVOID pvSetBuffer,
938 IN UINT_32 u4SetBufferLen,
939 OUT PUINT_32 pu4SetInfoLen
942 CMD_MAC_MCAST_ADDR rCmdMacMcastAddr;
944 ASSERT(pu4SetInfoLen);
946 /* The data must be a multiple of the Ethernet address size. */
947 if ((u4SetBufferLen % MAC_ADDR_LEN)) {
948 DBGLOG(REQ, WARN, ("Invalid MC list length %ld\n", u4SetBufferLen));
950 *pu4SetInfoLen = (((u4SetBufferLen + MAC_ADDR_LEN) - 1) /
951 MAC_ADDR_LEN) * MAC_ADDR_LEN;
953 return WLAN_STATUS_INVALID_LENGTH;
956 *pu4SetInfoLen = u4SetBufferLen;
958 /* Verify if we can support so many multicast addresses. */
959 if ((u4SetBufferLen / MAC_ADDR_LEN) > MAX_NUM_GROUP_ADDR) {
960 DBGLOG(REQ, WARN, ("Too many MC addresses\n"));
962 return WLAN_STATUS_MULTICAST_FULL;
965 /* NOTE(Kevin): Windows may set u4SetBufferLen == 0 &&
966 * pvSetBuffer == NULL to clear exist Multicast List.
968 if (u4SetBufferLen) {
972 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
973 DBGLOG(REQ, WARN, ("Fail in set multicast list! (Adapter not ready). ACPI=D%d, Radio=%d\n",
974 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
975 return WLAN_STATUS_ADAPTER_NOT_READY;
978 rCmdMacMcastAddr.u4NumOfGroupAddr = u4SetBufferLen / MAC_ADDR_LEN;
979 rCmdMacMcastAddr.ucNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
980 kalMemCopy(rCmdMacMcastAddr.arAddress, pvSetBuffer, u4SetBufferLen);
982 return wlanoidSendSetQueryP2PCmd(prAdapter,
983 CMD_ID_MAC_MCAST_ADDR,
986 FALSE, // This CMD response is no need to complete the OID. Or the event would unsync.
987 nicCmdEventSetCommon,
988 nicOidCmdTimeoutCommon,
989 sizeof(CMD_MAC_MCAST_ADDR),
990 (PUINT_8)&rCmdMacMcastAddr,
995 } /* end of wlanoidSetP2PMulticastList() */
998 /*----------------------------------------------------------------------------*/
1000 * \brief This routine is called to send GAS frame for P2P Service Discovery Request
1002 * \param[in] prAdapter Pointer to the Adapter structure.
1003 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
1004 * \param[in] u4SetBufferLen The length of the set buffer.
1005 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1006 * bytes read from the set buffer. If the call failed
1007 * due to invalid length of the set buffer, returns
1008 * the amount of storage needed.
1010 * \retval WLAN_STATUS_SUCCESS
1011 * \retval WLAN_STATUS_INVALID_LENGTH
1012 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1013 * \retval WLAN_STATUS_MULTICAST_FULL
1015 /*----------------------------------------------------------------------------*/
1017 wlanoidSendP2PSDRequest(
1018 IN P_ADAPTER_T prAdapter,
1019 IN PVOID pvSetBuffer,
1020 IN UINT_32 u4SetBufferLen,
1021 OUT PUINT_32 pu4SetInfoLen
1024 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
1026 ASSERT(pu4SetInfoLen);
1028 if (u4SetBufferLen) {
1029 ASSERT(pvSetBuffer);
1032 if (u4SetBufferLen < sizeof(PARAM_P2P_SEND_SD_REQUEST)) {
1033 *pu4SetInfoLen = sizeof(PARAM_P2P_SEND_SD_REQUEST);
1034 return WLAN_STATUS_BUFFER_TOO_SHORT;
1037 // rWlanStatus = p2pFsmRunEventSDRequest(prAdapter, (P_PARAM_P2P_SEND_SD_REQUEST)pvSetBuffer);
1040 } /* end of wlanoidSendP2PSDRequest() */
1043 /*----------------------------------------------------------------------------*/
1045 * \brief This routine is called to send GAS frame for P2P Service Discovery Response
1047 * \param[in] prAdapter Pointer to the Adapter structure.
1048 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
1049 * \param[in] u4SetBufferLen The length of the set buffer.
1050 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1051 * bytes read from the set buffer. If the call failed
1052 * due to invalid length of the set buffer, returns
1053 * the amount of storage needed.
1055 * \retval WLAN_STATUS_SUCCESS
1056 * \retval WLAN_STATUS_INVALID_LENGTH
1057 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1058 * \retval WLAN_STATUS_MULTICAST_FULL
1060 /*----------------------------------------------------------------------------*/
1062 wlanoidSendP2PSDResponse(
1063 IN P_ADAPTER_T prAdapter,
1064 IN PVOID pvSetBuffer,
1065 IN UINT_32 u4SetBufferLen,
1066 OUT PUINT_32 pu4SetInfoLen
1069 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
1071 ASSERT(pu4SetInfoLen);
1073 if (u4SetBufferLen) {
1074 ASSERT(pvSetBuffer);
1077 if (u4SetBufferLen < sizeof(PARAM_P2P_SEND_SD_RESPONSE)) {
1078 *pu4SetInfoLen = sizeof(PARAM_P2P_SEND_SD_RESPONSE);
1079 return WLAN_STATUS_BUFFER_TOO_SHORT;
1082 // rWlanStatus = p2pFsmRunEventSDResponse(prAdapter, (P_PARAM_P2P_SEND_SD_RESPONSE)pvSetBuffer);
1085 } /* end of wlanoidGetP2PSDRequest() */
1088 /*----------------------------------------------------------------------------*/
1090 * \brief This routine is called to get GAS frame for P2P Service Discovery Request
1092 * \param[in] prAdapter Pointer to the Adapter structure.
1093 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
1095 * \param[in] u4QueryBufferLen The length of the query buffer.
1096 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1097 * bytes written into the query buffer. If the call
1098 * failed due to invalid length of the query buffer,
1099 * returns the amount of storage needed.
1101 * \retval WLAN_STATUS_SUCCESS
1102 * \retval WLAN_STATUS_INVALID_LENGTH
1103 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1104 * \retval WLAN_STATUS_MULTICAST_FULL
1106 /*----------------------------------------------------------------------------*/
1108 wlanoidGetP2PSDRequest(
1109 IN P_ADAPTER_T prAdapter,
1110 IN PVOID pvQueryBuffer,
1111 IN UINT_32 u4QueryBufferLen,
1112 OUT PUINT_32 pu4QueryInfoLen
1115 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
1116 PUINT_8 pucPacketBuffer = NULL, pucTA = NULL;
1117 // PUINT_8 pucChannelNum = NULL;
1118 PUINT_16 pu2PacketLength = NULL;
1119 P_WLAN_MAC_HEADER_T prWlanHdr = (P_WLAN_MAC_HEADER_T)NULL;
1120 UINT_8 ucVersionNum = 0;
1121 // UINT_8 ucChannelNum = 0, ucSeqNum = 0;
1124 ASSERT(pu4QueryInfoLen);
1126 if (u4QueryBufferLen) {
1127 ASSERT(pvQueryBuffer);
1130 if (u4QueryBufferLen < sizeof(PARAM_P2P_GET_SD_REQUEST)) {
1131 *pu4QueryInfoLen = sizeof(PARAM_P2P_GET_SD_REQUEST);
1132 return WLAN_STATUS_BUFFER_TOO_SHORT;
1135 DBGLOG(P2P, TRACE, ("Get Service Discovery Request\n"));
1137 if ((ucVersionNum = p2pFuncGetVersionNumOfSD(prAdapter)) == 0) {
1138 P_PARAM_P2P_GET_SD_REQUEST prP2pGetSdReq = (P_PARAM_P2P_GET_SD_REQUEST)pvQueryBuffer;
1140 pucPacketBuffer = prP2pGetSdReq->aucPacketContent;
1141 pu2PacketLength = &prP2pGetSdReq->u2PacketLength;
1142 pucTA = &prP2pGetSdReq->rTransmitterAddr;
1145 P_PARAM_P2P_GET_SD_REQUEST_EX prP2pGetSdReqEx = (P_PARAM_P2P_GET_SD_REQUEST_EX)NULL;
1147 prP2pGetSdReqEx = (P_PARAM_P2P_GET_SD_REQUEST)pvQueryBuffer;
1148 pucPacketBuffer = prP2pGetSdReqEx->aucPacketContent;
1149 pu2PacketLength = &prP2pGetSdReqEx->u2PacketLength;
1150 pucTA = &prP2pGetSdReqEx->rTransmitterAddr;
1151 pucChannelNum = &prP2pGetSdReqEx->ucChannelNum;
1152 ucSeqNum = prP2pGetSdReqEx->ucSeqNum;
1156 rWlanStatus = p2pFuncGetServiceDiscoveryFrame(prAdapter,
1158 (u4QueryBufferLen - sizeof(PARAM_P2P_GET_SD_REQUEST)),
1159 (PUINT_32)pu2PacketLength,
1163 *pu4QueryInfoLen = 0;
1167 prWlanHdr = (P_WLAN_MAC_HEADER_T)pucPacketBuffer;
1169 kalMemCopy(pucTA, prWlanHdr->aucAddr2, MAC_ADDR_LEN);
1171 if (pu4QueryInfoLen) {
1172 if (ucVersionNum == 0) {
1173 *pu4QueryInfoLen = (UINT_32)(sizeof(PARAM_P2P_GET_SD_REQUEST) + (*pu2PacketLength));
1176 *pu4QueryInfoLen = (UINT_32)(sizeof(PARAM_P2P_GET_SD_REQUEST_EX) + (*pu2PacketLength));
1182 } /* end of wlanoidGetP2PSDRequest() */
1185 /*----------------------------------------------------------------------------*/
1187 * \brief This routine is called to get GAS frame for P2P Service Discovery Response
1189 * \param[in] prAdapter Pointer to the Adapter structure.
1190 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
1192 * \param[in] u4QueryBufferLen The length of the query buffer.
1193 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1194 * bytes written into the query buffer. If the call
1195 * failed due to invalid length of the query buffer,
1196 * returns the amount of storage needed.
1198 * \retval WLAN_STATUS_SUCCESS
1199 * \retval WLAN_STATUS_INVALID_LENGTH
1200 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1201 * \retval WLAN_STATUS_MULTICAST_FULL
1203 /*----------------------------------------------------------------------------*/
1205 wlanoidGetP2PSDResponse(
1206 IN P_ADAPTER_T prAdapter,
1207 IN PVOID pvQueryBuffer,
1208 IN UINT_32 u4QueryBufferLen,
1209 OUT PUINT_32 pu4QueryInfoLen
1212 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
1213 P_WLAN_MAC_HEADER_T prWlanHdr = (P_WLAN_MAC_HEADER_T)NULL;
1214 //UINT_8 ucSeqNum = 0,
1215 UINT_8 ucVersionNum = 0;
1216 PUINT_8 pucPacketContent = (PUINT_8)NULL, pucTA = (PUINT_8)NULL;
1217 PUINT_16 pu2PacketLength = (PUINT_16)NULL;
1220 ASSERT(pu4QueryInfoLen);
1222 if (u4QueryBufferLen) {
1223 ASSERT(pvQueryBuffer);
1226 if (u4QueryBufferLen < sizeof(PARAM_P2P_GET_SD_RESPONSE)) {
1227 *pu4QueryInfoLen = sizeof(PARAM_P2P_GET_SD_RESPONSE);
1228 return WLAN_STATUS_BUFFER_TOO_SHORT;
1231 DBGLOG(P2P, TRACE, ("Get Service Discovery Response\n"));
1234 if ((ucVersionNum = p2pFuncGetVersionNumOfSD(prAdapter)) == 0) {
1235 P_PARAM_P2P_GET_SD_RESPONSE prP2pGetSdRsp = (P_PARAM_P2P_GET_SD_RESPONSE)NULL;
1237 prP2pGetSdRsp = (P_PARAM_P2P_GET_SD_REQUEST)pvQueryBuffer;
1238 pucPacketContent = prP2pGetSdRsp->aucPacketContent;
1239 pucTA = &prP2pGetSdRsp->rTransmitterAddr;
1240 pu2PacketLength = &prP2pGetSdRsp->u2PacketLength;
1243 P_PARAM_P2P_GET_SD_RESPONSE_EX prP2pGetSdRspEx = (P_PARAM_P2P_GET_SD_RESPONSE_EX)NULL;
1245 prP2pGetSdRspEx = (P_PARAM_P2P_GET_SD_RESPONSE_EX)pvQueryBuffer;
1246 pucPacketContent = prP2pGetSdRspEx->aucPacketContent;
1247 pucTA = &prP2pGetSdRspEx->rTransmitterAddr;
1248 pu2PacketLength = &prP2pGetSdRspEx->u2PacketLength;
1249 ucSeqNum = prP2pGetSdRspEx->ucSeqNum;
1253 // rWlanStatus = p2pFuncGetServiceDiscoveryFrame(prAdapter,
1254 // pucPacketContent,
1255 // (u4QueryBufferLen - sizeof(PARAM_P2P_GET_SD_RESPONSE)),
1256 // (PUINT_32)pu2PacketLength,
1260 *pu4QueryInfoLen = 0;
1263 prWlanHdr = (P_WLAN_MAC_HEADER_T)pucPacketContent;
1265 kalMemCopy(pucTA, prWlanHdr->aucAddr2, MAC_ADDR_LEN);
1268 if (pu4QueryInfoLen) {
1269 if (ucVersionNum == 0) {
1270 *pu4QueryInfoLen = (UINT_32)(sizeof(PARAM_P2P_GET_SD_RESPONSE) + *pu2PacketLength);
1273 *pu4QueryInfoLen = (UINT_32)(sizeof(PARAM_P2P_GET_SD_RESPONSE_EX) + *pu2PacketLength);
1278 } /* end of wlanoidGetP2PSDResponse() */
1281 /*----------------------------------------------------------------------------*/
1283 * \brief This routine is called to terminate P2P Service Discovery Phase
1285 * \param[in] prAdapter Pointer to the Adapter structure.
1286 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
1287 * \param[in] u4SetBufferLen The length of the set buffer.
1288 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1289 * bytes read from the set buffer. If the call failed
1290 * due to invalid length of the set buffer, returns
1291 * the amount of storage needed.
1293 * \retval WLAN_STATUS_SUCCESS
1294 * \retval WLAN_STATUS_INVALID_LENGTH
1295 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1296 * \retval WLAN_STATUS_MULTICAST_FULL
1298 /*----------------------------------------------------------------------------*/
1300 wlanoidSetP2PTerminateSDPhase(
1301 IN P_ADAPTER_T prAdapter,
1302 IN PVOID pvSetBuffer,
1303 IN UINT_32 u4SetBufferLen,
1304 OUT PUINT_32 pu4SetInfoLen
1307 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
1308 P_PARAM_P2P_TERMINATE_SD_PHASE prP2pTerminateSD = (P_PARAM_P2P_TERMINATE_SD_PHASE)NULL;
1309 UINT_8 aucNullAddr[] = NULL_MAC_ADDR;
1312 if ((prAdapter == NULL) || (pu4SetInfoLen == NULL)) {
1317 if ((u4SetBufferLen) && (pvSetBuffer == NULL)) {
1321 if (u4SetBufferLen < sizeof(PARAM_P2P_TERMINATE_SD_PHASE)) {
1322 *pu4SetInfoLen = sizeof(PARAM_P2P_TERMINATE_SD_PHASE);
1323 rWlanStatus = WLAN_STATUS_BUFFER_TOO_SHORT;
1327 prP2pTerminateSD = (P_PARAM_P2P_TERMINATE_SD_PHASE)pvSetBuffer;
1329 if (EQUAL_MAC_ADDR(prP2pTerminateSD->rPeerAddr, aucNullAddr)) {
1330 DBGLOG(P2P, TRACE, ("Service Discovery Version 2.0\n"));
1331 // p2pFuncSetVersionNumOfSD(prAdapter, 2);
1334 //rWlanStatus = p2pFsmRunEventSDAbort(prAdapter);
1343 } /* end of wlanoidSetP2PTerminateSDPhase() */
1346 #if CFG_SUPPORT_ANTI_PIRACY
1347 /*----------------------------------------------------------------------------*/
1349 * \brief This routine is called to
1351 * \param[in] prAdapter Pointer to the Adapter structure.
1352 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
1353 * \param[in] u4SetBufferLen The length of the set buffer.
1354 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1355 * bytes read from the set buffer. If the call failed
1356 * due to invalid length of the set buffer, returns
1357 * the amount of storage needed.
1359 * \retval WLAN_STATUS_SUCCESS
1360 * \retval WLAN_STATUS_INVALID_LENGTH
1361 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1362 * \retval WLAN_STATUS_MULTICAST_FULL
1364 /*----------------------------------------------------------------------------*/
1366 wlanoidSetSecCheckRequest(
1367 IN P_ADAPTER_T prAdapter,
1368 IN PVOID pvSetBuffer,
1369 IN UINT_32 u4SetBufferLen,
1370 OUT PUINT_32 pu4SetInfoLen
1374 ASSERT(pu4SetInfoLen);
1376 if (u4SetBufferLen) {
1377 ASSERT(pvSetBuffer);
1380 return wlanoidSendSetQueryP2PCmd(prAdapter,
1386 nicOidCmdTimeoutCommon,
1388 (PUINT_8)pvSetBuffer,
1393 } /* end of wlanoidSetSecCheckRequest() */
1396 /*----------------------------------------------------------------------------*/
1398 * \brief This routine is called to
1400 * \param[in] prAdapter Pointer to the Adapter structure.
1401 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
1403 * \param[in] u4QueryBufferLen The length of the query buffer.
1404 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1405 * bytes written into the query buffer. If the call
1406 * failed due to invalid length of the query buffer,
1407 * returns the amount of storage needed.
1409 * \retval WLAN_STATUS_SUCCESS
1410 * \retval WLAN_STATUS_INVALID_LENGTH
1411 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1412 * \retval WLAN_STATUS_MULTICAST_FULL
1414 /*----------------------------------------------------------------------------*/
1416 wlanoidGetSecCheckResponse(
1417 IN P_ADAPTER_T prAdapter,
1418 IN PVOID pvQueryBuffer,
1419 IN UINT_32 u4QueryBufferLen,
1420 OUT PUINT_32 pu4QueryInfoLen
1423 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
1424 //P_WLAN_MAC_HEADER_T prWlanHdr = (P_WLAN_MAC_HEADER_T)NULL;
1425 P_GLUE_INFO_T prGlueInfo;
1427 prGlueInfo = prAdapter->prGlueInfo;
1430 ASSERT(pu4QueryInfoLen);
1432 if (u4QueryBufferLen) {
1433 ASSERT(pvQueryBuffer);
1436 if (u4QueryBufferLen > 256) {
1437 u4QueryBufferLen = 256;
1440 *pu4QueryInfoLen = u4QueryBufferLen;
1443 DBGLOG_MEM8(SEC, LOUD, prGlueInfo->prP2PInfo->aucSecCheckRsp, u4QueryBufferLen);
1445 kalMemCopy((PUINT_8)(pvQueryBuffer + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer)), prGlueInfo->prP2PInfo->aucSecCheckRsp, u4QueryBufferLen);
1448 } /* end of wlanoidGetSecCheckResponse() */
1452 wlanoidSetNoaParam (
1453 IN P_ADAPTER_T prAdapter,
1454 IN PVOID pvSetBuffer,
1455 IN UINT_32 u4SetBufferLen,
1456 OUT PUINT_32 pu4SetInfoLen
1459 P_PARAM_CUSTOM_NOA_PARAM_STRUC_T prNoaParam;
1460 CMD_CUSTOM_NOA_PARAM_STRUC_T rCmdNoaParam;
1462 DEBUGFUNC("wlanoidSetNoaParam");
1463 DBGLOG(INIT, TRACE,("\n"));
1466 ASSERT(pu4SetInfoLen);
1468 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_NOA_PARAM_STRUC_T);
1470 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_NOA_PARAM_STRUC_T)) {
1471 return WLAN_STATUS_INVALID_LENGTH;
1474 ASSERT(pvSetBuffer);
1476 prNoaParam = (P_PARAM_CUSTOM_NOA_PARAM_STRUC_T)pvSetBuffer;
1478 kalMemZero(&rCmdNoaParam, sizeof(CMD_CUSTOM_NOA_PARAM_STRUC_T));
1479 rCmdNoaParam.u4NoaDurationMs = prNoaParam->u4NoaDurationMs;
1480 rCmdNoaParam.u4NoaIntervalMs = prNoaParam->u4NoaIntervalMs;
1481 rCmdNoaParam.u4NoaCount = prNoaParam->u4NoaCount;
1484 return wlanSendSetQueryCmd(prAdapter,
1485 CMD_ID_SET_NOA_PARAM,
1489 nicCmdEventSetCommon,
1490 nicOidCmdTimeoutCommon,
1491 sizeof(CMD_CUSTOM_NOA_PARAM_STRUC_T),
1492 (PUINT_8)&rCmdNoaParam,
1497 return wlanoidSendSetQueryP2PCmd(prAdapter,
1498 CMD_ID_SET_NOA_PARAM,
1503 nicOidCmdTimeoutCommon,
1504 sizeof(CMD_CUSTOM_NOA_PARAM_STRUC_T),
1505 (PUINT_8)&rCmdNoaParam,
1515 wlanoidSetOppPsParam (
1516 IN P_ADAPTER_T prAdapter,
1517 IN PVOID pvSetBuffer,
1518 IN UINT_32 u4SetBufferLen,
1519 OUT PUINT_32 pu4SetInfoLen
1522 P_PARAM_CUSTOM_OPPPS_PARAM_STRUC_T prOppPsParam;
1523 CMD_CUSTOM_OPPPS_PARAM_STRUC_T rCmdOppPsParam;
1525 DEBUGFUNC("wlanoidSetOppPsParam");
1526 DBGLOG(INIT, TRACE,("\n"));
1529 ASSERT(pu4SetInfoLen);
1531 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUC_T);
1533 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUC_T)) {
1534 return WLAN_STATUS_INVALID_LENGTH;
1537 ASSERT(pvSetBuffer);
1539 prOppPsParam = (P_PARAM_CUSTOM_OPPPS_PARAM_STRUC_T)pvSetBuffer;
1541 kalMemZero(&rCmdOppPsParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T));
1542 rCmdOppPsParam.u4CTwindowMs = prOppPsParam->u4CTwindowMs;
1545 return wlanSendSetQueryCmd(prAdapter,
1546 CMD_ID_SET_OPPPS_PARAM,
1550 nicCmdEventSetCommon,
1551 nicOidCmdTimeoutCommon,
1552 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T),
1553 (PUINT_8)&rCmdOppPsParam,
1558 return wlanoidSendSetQueryP2PCmd(prAdapter,
1559 CMD_ID_SET_NOA_PARAM,
1564 nicOidCmdTimeoutCommon,
1565 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T),
1566 (PUINT_8)&rCmdOppPsParam,
1576 wlanoidSetUApsdParam (
1577 IN P_ADAPTER_T prAdapter,
1578 IN PVOID pvSetBuffer,
1579 IN UINT_32 u4SetBufferLen,
1580 OUT PUINT_32 pu4SetInfoLen
1583 P_PARAM_CUSTOM_UAPSD_PARAM_STRUC_T prUapsdParam;
1584 CMD_CUSTOM_UAPSD_PARAM_STRUC_T rCmdUapsdParam;
1585 P_PM_PROFILE_SETUP_INFO_T prPmProfSetupInfo;
1586 P_BSS_INFO_T prBssInfo;
1589 DEBUGFUNC("wlanoidSetUApsdParam");
1590 DBGLOG(INIT, TRACE,("\n"));
1593 ASSERT(pu4SetInfoLen);
1595 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUC_T);
1597 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUC_T)) {
1598 return WLAN_STATUS_INVALID_LENGTH;
1601 ASSERT(pvSetBuffer);
1603 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
1604 prPmProfSetupInfo = &prBssInfo->rPmProfSetupInfo;
1606 prUapsdParam = (P_PARAM_CUSTOM_UAPSD_PARAM_STRUC_T)pvSetBuffer;
1608 kalMemZero(&rCmdUapsdParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T));
1609 rCmdUapsdParam.fgEnAPSD = prUapsdParam->fgEnAPSD;
1610 prAdapter->rWifiVar.fgSupportUAPSD = prUapsdParam->fgEnAPSD;
1612 rCmdUapsdParam.fgEnAPSD_AcBe = prUapsdParam->fgEnAPSD_AcBe;
1613 rCmdUapsdParam.fgEnAPSD_AcBk = prUapsdParam->fgEnAPSD_AcBk;
1614 rCmdUapsdParam.fgEnAPSD_AcVo = prUapsdParam->fgEnAPSD_AcVo;
1615 rCmdUapsdParam.fgEnAPSD_AcVi = prUapsdParam->fgEnAPSD_AcVi;
1616 prPmProfSetupInfo->ucBmpDeliveryAC =
1617 ((prUapsdParam->fgEnAPSD_AcBe << 0) |
1618 (prUapsdParam->fgEnAPSD_AcBk << 1) |
1619 (prUapsdParam->fgEnAPSD_AcVi << 2) |
1620 (prUapsdParam->fgEnAPSD_AcVo << 3));
1621 prPmProfSetupInfo->ucBmpTriggerAC =
1622 ((prUapsdParam->fgEnAPSD_AcBe << 0) |
1623 (prUapsdParam->fgEnAPSD_AcBk << 1) |
1624 (prUapsdParam->fgEnAPSD_AcVi << 2) |
1625 (prUapsdParam->fgEnAPSD_AcVo << 3));
1627 rCmdUapsdParam.ucMaxSpLen = prUapsdParam->ucMaxSpLen;
1628 prPmProfSetupInfo->ucUapsdSp = prUapsdParam->ucMaxSpLen;
1631 return wlanSendSetQueryCmd(prAdapter,
1632 CMD_ID_SET_UAPSD_PARAM,
1636 nicCmdEventSetCommon,
1637 nicOidCmdTimeoutCommon,
1638 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T),
1639 (PUINT_8)&rCmdUapsdParam,
1644 return wlanoidSendSetQueryP2PCmd(prAdapter,
1645 CMD_ID_SET_UAPSD_PARAM,
1650 nicOidCmdTimeoutCommon,
1651 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T),
1652 (PUINT_8)&rCmdUapsdParam,
1663 wlanoidQueryP2pOpChannel (
1664 IN P_ADAPTER_T prAdapter,
1665 IN PVOID pvQueryBuffer,
1666 IN UINT_32 u4QueryBufferLen,
1667 OUT PUINT_32 pu4QueryInfoLen
1671 WLAN_STATUS rResult = WLAN_STATUS_FAILURE;
1672 // PUINT_8 pucOpChnl = (PUINT_8)pvQueryBuffer;
1675 if ((prAdapter == NULL) || (pu4QueryInfoLen == NULL)) {
1680 if ((u4QueryBufferLen) && (pvQueryBuffer == NULL)) {
1684 if (u4QueryBufferLen < sizeof(UINT_8)) {
1685 *pu4QueryInfoLen = sizeof(UINT_8);
1686 rResult = WLAN_STATUS_BUFFER_TOO_SHORT;
1691 if (!p2pFuncGetCurrentOpChnl(prAdapter, pucOpChnl)) {
1692 rResult = WLAN_STATUS_INVALID_DATA;
1696 rResult = WLAN_STATUS_INVALID_DATA;
1700 *pu4QueryInfoLen = sizeof(UINT_8);
1701 rResult = WLAN_STATUS_SUCCESS;
1706 } /* wlanoidQueryP2pOpChannel */
1709 wlanoidQueryP2pVersion (
1710 IN P_ADAPTER_T prAdapter,
1711 IN PVOID pvQueryBuffer,
1712 IN UINT_32 u4QueryBufferLen,
1713 OUT PUINT_32 pu4QueryInfoLen
1716 WLAN_STATUS rResult = WLAN_STATUS_FAILURE;
1717 // PUINT_8 pucVersionNum = (PUINT_8)pvQueryBuffer;
1720 if ((prAdapter == NULL) || (pu4QueryInfoLen == NULL)) {
1725 if ((u4QueryBufferLen) && (pvQueryBuffer == NULL)) {
1729 if (u4QueryBufferLen < sizeof(UINT_8)) {
1730 *pu4QueryInfoLen = sizeof(UINT_8);
1731 rResult = WLAN_STATUS_BUFFER_TOO_SHORT;
1738 } /* wlanoidQueryP2pVersion */
1741 wlanoidSetP2pSupplicantVersion (
1742 IN P_ADAPTER_T prAdapter,
1743 IN PVOID pvSetBuffer,
1744 IN UINT_32 u4SetBufferLen,
1745 OUT PUINT_32 pu4SetInfoLen
1748 WLAN_STATUS rResult = WLAN_STATUS_FAILURE;
1749 UINT_8 ucVersionNum;
1752 if ((prAdapter == NULL) || (pu4SetInfoLen == NULL)) {
1754 rResult = WLAN_STATUS_INVALID_DATA;
1758 if ((u4SetBufferLen) && (pvSetBuffer == NULL)) {
1759 rResult = WLAN_STATUS_INVALID_DATA;
1763 *pu4SetInfoLen = sizeof(UINT_8);
1765 if (u4SetBufferLen < sizeof(UINT_8)) {
1766 rResult = WLAN_STATUS_INVALID_LENGTH;
1771 ucVersionNum = *((PUINT_8)pvSetBuffer);
1774 rResult = WLAN_STATUS_SUCCESS;
1778 } /* wlanoidSetP2pSupplicantVersion */
1780 #if CFG_SUPPORT_P2P_RSSI_QUERY
1782 wlanoidQueryP2pRssi (
1783 IN P_ADAPTER_T prAdapter,
1784 IN PVOID pvQueryBuffer,
1785 IN UINT_32 u4QueryBufferLen,
1786 OUT PUINT_32 pu4QueryInfoLen
1789 DEBUGFUNC("wlanoidQueryP2pRssi");
1792 ASSERT(pu4QueryInfoLen);
1793 if (u4QueryBufferLen) {
1794 ASSERT(pvQueryBuffer);
1797 *pu4QueryInfoLen = sizeof(PARAM_RSSI);
1799 /* Check for query buffer length */
1800 if (u4QueryBufferLen < *pu4QueryInfoLen) {
1801 DBGLOG(REQ, WARN, ("Too short length %ld\n", u4QueryBufferLen));
1802 return WLAN_STATUS_BUFFER_TOO_SHORT;
1805 if (prAdapter->fgIsP2pLinkQualityValid == TRUE &&
1806 (kalGetTimeTick() - prAdapter->rP2pLinkQualityUpdateTime) <= CFG_LINK_QUALITY_VALID_PERIOD) {
1809 rRssi = (PARAM_RSSI)prAdapter->rP2pLinkQuality.cRssi; // ranged from (-128 ~ 30) in unit of dBm
1811 if(rRssi > PARAM_WHQL_RSSI_MAX_DBM)
1812 rRssi = PARAM_WHQL_RSSI_MAX_DBM;
1813 else if(rRssi < PARAM_WHQL_RSSI_MIN_DBM)
1814 rRssi = PARAM_WHQL_RSSI_MIN_DBM;
1816 kalMemCopy(pvQueryBuffer, &rRssi, sizeof(PARAM_RSSI));
1817 return WLAN_STATUS_SUCCESS;
1821 return wlanSendSetQueryCmd(prAdapter,
1822 CMD_ID_GET_LINK_QUALITY,
1826 nicCmdEventQueryLinkQuality,
1827 nicOidCmdTimeoutCommon,
1834 return wlanSendSetQueryCmd(prAdapter,
1835 CMD_ID_GET_LINK_QUALITY,
1839 nicCmdEventQueryLinkQuality,
1840 nicOidCmdTimeoutCommon,
1848 } /* wlanoidQueryP2pRssi */