2 ** $Id: //Department/DaVinci/BRANCHES/WIFI_P2P_DRIVER_V2_2/common/wlan_p2p.c#5 $
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 * 01 31 2012 yuche.tsai
57 * Fix compile error & del beacon scenario.
59 * 01 26 2012 yuche.tsai
61 * Fix compile warning.
63 * 01 19 2012 chinglan.wang
65 * Support the WPA-PSK TKIP security mode for the tethering.
67 * 01 13 2012 yuche.tsai
69 * WiFi Hot Spot Tethering for ICS ALPHA testing version.
71 * 11 24 2011 yuche.tsai
73 * Fix P2P IOCTL of multicast address bug, add low power driver stop control.
75 * 11 22 2011 yuche.tsai
77 * Update RSSI link quality of P2P Network query method. (Bug fix)
79 * 11 19 2011 yuche.tsai
81 * Add RSSI support for P2P network.
83 * 11 08 2011 yuche.tsai
84 * [WCXRP00001094] [Volunteer Patch][Driver] Driver version & supplicant version query & set support for service discovery version check.
85 * Add support for driver version query & p2p supplicant verseion set.
86 * For new service discovery mechanism sync.
88 * 10 18 2011 yuche.tsai
89 * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
90 * Support Channle Query.
92 * 10 18 2011 yuche.tsai
93 * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
97 * 08 23 2011 yuche.tsai
99 * Fix Multicast Issue of P2P.
101 * 04 27 2011 george.huang
102 * [WCXRP00000684] [MT6620 Wi-Fi][Driver] Support P2P setting ARP filter
103 * Support P2P ARP filter setting on early suspend/ late resume
105 * 04 08 2011 george.huang
106 * [WCXRP00000621] [MT6620 Wi-Fi][Driver] Support P2P supplicant to set power mode
107 * separate settings of P2P and AIS
109 * 03 22 2011 george.huang
110 * [WCXRP00000504] [MT6620 Wi-Fi][FW] Support Sigma CAPI for power saving related command
111 * link with supplicant commands
113 * 03 19 2011 terry.wu
114 * [WCXRP00000577] [MT6620 Wi-Fi][Driver][FW] Create V2.0 branch for firmware and driver
115 * create V2.0 p2p driver release based on label "MT6620_WIFI_P2P_DRIVER_V2_0_2100_0319_2011" from main trunk.
118 * [WCXRP00000571] [MT6620 Wi-Fi] [Driver] Not check the p2p role during set key
119 * Skip the p2p role for adding broadcast key issue.
122 * [WCXRP00000530] [MT6620 Wi-Fi] [Driver] skip doing p2pRunEventAAAComplete after send assoc response Tx Done
123 * fixed compiling error while enable dbg.
125 * 03 08 2011 yuche.tsai
126 * [WCXRP00000480] [Volunteer Patch][MT6620][Driver] WCS IE format issue[WCXRP00000509] [Volunteer Patch][MT6620][Driver] Kernal panic when remove p2p module.
129 * 03 07 2011 terry.wu
130 * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
131 * Toggle non-standard debug messages to comments.
134 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
135 * rename the define to anti_pviracy.
138 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
139 * add the code to get the check rsponse and indicate to app.
142 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
143 * Add Security check related code.
145 * 03 02 2011 yuche.tsai
146 * [WCXRP00000245] 1. Invitation Request/Response.
147 2. Provision Discovery Request/Response
149 * Fix SD Request Query Length issue.
151 * 03 02 2011 yuche.tsai
152 * [WCXRP00000245] 1. Invitation Request/Response.
153 2. Provision Discovery Request/Response
155 * Service Discovery Request.
157 * 03 01 2011 yuche.tsai
158 * [WCXRP00000245] 1. Invitation Request/Response.
159 2. Provision Discovery Request/Response
161 * Update Service Discovery Wlan OID related function.
163 * 03 01 2011 yuche.tsai
164 * [WCXRP00000245] 1. Invitation Request/Response.
165 2. Provision Discovery Request/Response
167 * Update Service Discovery Related wlanoid function.
169 * 02 09 2011 yuche.tsai
170 * [WCXRP00000245] 1. Invitation Request/Response.
171 2. Provision Discovery Request/Response
173 * Add Service Discovery Indication Related code.
175 * 01 26 2011 yuche.tsai
176 * [WCXRP00000245] 1. Invitation Request/Response.
177 2. Provision Discovery Request/Response
179 * Add Service Discovery Function.
182 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
183 * ioctl implementations for P2P Service Discovery
186 * [WCXRP00000338] [MT6620 Wi-Fi][Driver] Separate kalMemAlloc into kmalloc and vmalloc implementations to ease physically continous memory demands
187 * separate kalMemAlloc() into virtually-continous and physically-continous type to ease slab system pressure
190 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
191 * 1. header file restructure for more clear module isolation
192 * 2. add function interface definition for implementing Service Discovery callbacks
195 * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and replaced by ENUM_NETWORK_TYPE_INDEX_T only
196 * remove ENUM_NETWORK_TYPE_T definitions
200 * [WCXRP00000069][MT6620 Wi-Fi][Driver] Fix some code for phase 1 P2P Demo.
202 * 09 21 2010 kevin.huang
203 * [WCXRP00000054] [MT6620 Wi-Fi][Driver] Restructure driver for second Interface
204 * Isolate P2P related function for Hardware Software Bundle
206 * 09 03 2010 kevin.huang
208 * Refine #include sequence and solve recursive/nested #include issue
212 * revise constant definitions to be matched with implementation (original cmd-event definition is deprecated)
216 * add subroutines for P2P to set multicast list.
218 * 08 16 2010 george.huang
222 * 08 16 2010 george.huang
224 * support wlanoidSetP2pPowerSaveProfile() in P2P
226 * 08 16 2010 george.huang
228 * Support wlanoidSetNetworkAddress() for P2P
232 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
235 * [WPD00003833][MT6620 and MT5931] Driver migration
236 * add API in que_mgt to retrieve sta-rec index for security frames.
239 * [WPD00003833][MT6620 and MT5931] Driver migration
240 * 802.1x and bluetooth-over-Wi-Fi security frames are now delievered to firmware via command path instead of data path.
243 * [WPD00003833][MT6620 and MT5931] Driver migration
244 * 1) migrate assoc.c.
245 * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
246 * 3) add configuration options for CNM_MEM and RSN modules
247 * 4) add data path for management frames
248 * 5) eliminate rPacketInfo of MSDU_INFO_T
250 * 06 06 2010 kevin.huang
251 * [WPD00003832][MT6620 5931] Create driver base
252 * [MT6620 5931] Create driver base
255 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
256 * 1) add timeout handler mechanism for pending command packets
257 * 2) add p2p add/removal key
262 /******************************************************************************
263 * C O M P I L E R F L A G S
264 *******************************************************************************
267 /******************************************************************************
268 * E X T E R N A L R E F E R E N C E S
269 *******************************************************************************
271 #include "p2p_precomp.h"
273 /******************************************************************************
275 *******************************************************************************
278 /******************************************************************************
280 *******************************************************************************
283 /******************************************************************************
284 * P U B L I C D A T A
285 *******************************************************************************
288 /******************************************************************************
289 * P R I V A T E D A T A
290 *******************************************************************************
293 /******************************************************************************
295 *******************************************************************************
298 /******************************************************************************
299 * F U N C T I O N D E C L A R A T I O N S
300 *******************************************************************************
303 /******************************************************************************
305 *******************************************************************************
307 /*----------------------------------------------------------------------------*/
309 * \brief command packet generation utility
311 * \param[in] prAdapter Pointer to the Adapter structure.
312 * \param[in] ucCID Command ID
313 * \param[in] fgSetQuery Set or Query
314 * \param[in] fgNeedResp Need for response
315 * \param[in] pfCmdDoneHandler Function pointer when command is done
316 * \param[in] u4SetQueryInfoLen The length of the set/query buffer
317 * \param[in] pucInfoBuffer Pointer to set/query buffer
320 * \retval WLAN_STATUS_PENDING
321 * \retval WLAN_STATUS_FAILURE
323 /*----------------------------------------------------------------------------*/
325 wlanoidSendSetQueryP2PCmd (
326 IN P_ADAPTER_T prAdapter,
331 PFN_CMD_DONE_HANDLER pfCmdDoneHandler,
332 PFN_CMD_TIMEOUT_HANDLER pfCmdTimeoutHandler,
333 UINT_32 u4SetQueryInfoLen,
334 PUINT_8 pucInfoBuffer,
335 OUT PVOID pvSetQueryBuffer,
336 IN UINT_32 u4SetQueryBufferLen
339 P_GLUE_INFO_T prGlueInfo;
340 P_CMD_INFO_T prCmdInfo;
341 P_WIFI_CMD_T prWifiCmd;
346 prGlueInfo = prAdapter->prGlueInfo;
349 DEBUGFUNC("wlanoidSendSetQueryP2PCmd");
350 DBGLOG(REQ, TRACE, ("Command ID = 0x%08X\n", ucCID));
352 prCmdInfo = cmdBufAllocateCmdInfo(prAdapter, (CMD_HDR_SIZE + u4SetQueryInfoLen));
355 DBGLOG(INIT, ERROR, ("Allocate CMD_INFO_T ==> FAILED.\n"));
356 return WLAN_STATUS_FAILURE;
359 // increase command sequence number
360 ucCmdSeqNum = nicIncreaseCmdSeqNum(prAdapter);
361 DBGLOG(REQ, TRACE, ("ucCmdSeqNum =%d\n", ucCmdSeqNum));
363 // Setup common CMD Info Packet
364 prCmdInfo->eCmdType = COMMAND_TYPE_NETWORK_IOCTL;
365 prCmdInfo->eNetworkType = NETWORK_TYPE_P2P_INDEX;
366 prCmdInfo->u2InfoBufLen = (UINT_16)(CMD_HDR_SIZE + u4SetQueryInfoLen);
367 prCmdInfo->pfCmdDoneHandler = pfCmdDoneHandler;
368 prCmdInfo->pfCmdTimeoutHandler = pfCmdTimeoutHandler;
369 prCmdInfo->fgIsOid = fgIsOid;
370 prCmdInfo->ucCID = ucCID;
371 prCmdInfo->fgSetQuery = fgSetQuery;
372 prCmdInfo->fgNeedResp = fgNeedResp;
373 prCmdInfo->fgDriverDomainMCR = FALSE;
374 prCmdInfo->ucCmdSeqNum = ucCmdSeqNum;
375 prCmdInfo->u4SetInfoLen = u4SetQueryInfoLen;
376 prCmdInfo->pvInformationBuffer = pvSetQueryBuffer;
377 prCmdInfo->u4InformationBufferLength = u4SetQueryBufferLen;
379 // Setup WIFI_CMD_T (no payload)
380 prWifiCmd = (P_WIFI_CMD_T)(prCmdInfo->pucInfoBuffer);
381 prWifiCmd->u2TxByteCount_UserPriority = prCmdInfo->u2InfoBufLen;
382 prWifiCmd->ucCID = prCmdInfo->ucCID;
383 prWifiCmd->ucSetQuery = prCmdInfo->fgSetQuery;
384 prWifiCmd->ucSeqNum = prCmdInfo->ucCmdSeqNum;
386 if(u4SetQueryInfoLen > 0 && pucInfoBuffer != NULL) {
387 kalMemCopy(prWifiCmd->aucBuffer, pucInfoBuffer, u4SetQueryInfoLen);
390 // insert into prCmdQueue
391 kalEnqueueCommand(prGlueInfo, (P_QUE_ENTRY_T)prCmdInfo);
393 // wakeup txServiceThread later
394 GLUE_SET_EVENT(prGlueInfo);
395 return WLAN_STATUS_PENDING;
398 /*----------------------------------------------------------------------------*/
400 * \brief This routine is called to set a key to Wi-Fi Direct driver
402 * \param[in] prAdapter Pointer to the Adapter structure.
403 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
404 * \param[in] u4SetBufferLen The length of the set buffer.
405 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
406 * bytes read from the set buffer. If the call failed
407 * due to invalid length of the set buffer, returns
408 * the amount of storage needed.
410 * \retval WLAN_STATUS_SUCCESS
411 * \retval WLAN_STATUS_ADAPTER_NOT_READY
412 * \retval WLAN_STATUS_INVALID_LENGTH
413 * \retval WLAN_STATUS_INVALID_DATA
415 /*----------------------------------------------------------------------------*/
418 IN P_ADAPTER_T prAdapter,
419 IN PVOID pvSetBuffer,
420 IN UINT_32 u4SetBufferLen,
421 OUT PUINT_32 pu4SetInfoLen
424 CMD_802_11_KEY rCmdKey;
425 P_PARAM_KEY_T prNewKey;
427 DEBUGFUNC("wlanoidSetAddP2PKey");
428 DBGLOG(REQ, INFO, ("\n"));
432 ASSERT(pu4SetInfoLen);
434 prNewKey = (P_PARAM_KEY_T) pvSetBuffer;
436 /* Verify the key structure length. */
437 if (prNewKey->u4Length > u4SetBufferLen) {
438 DBGLOG(REQ, WARN, ("Invalid key structure length (%d) greater than total buffer length (%d)\n",
439 (UINT_8)prNewKey->u4Length,
440 (UINT_8)u4SetBufferLen));
442 *pu4SetInfoLen = u4SetBufferLen;
443 return WLAN_STATUS_INVALID_LENGTH;
445 /* Verify the key material length for key material buffer */
446 else if (prNewKey->u4KeyLength > prNewKey->u4Length - OFFSET_OF(PARAM_KEY_T, aucKeyMaterial)) {
447 DBGLOG(REQ, WARN, ("Invalid key material length (%d)\n", (UINT_8)prNewKey->u4KeyLength));
448 *pu4SetInfoLen = u4SetBufferLen;
449 return WLAN_STATUS_INVALID_DATA;
451 /* Exception check */
452 else if (prNewKey->u4KeyIndex & 0x0fffff00) {
453 return WLAN_STATUS_INVALID_DATA;
455 /* Exception check, pairwise key must with transmit bit enabled */
456 else if ((prNewKey->u4KeyIndex & BITS(30,31)) == IS_UNICAST_KEY) {
457 return WLAN_STATUS_INVALID_DATA;
459 else if (!(prNewKey->u4KeyLength == CCMP_KEY_LEN) && !(prNewKey->u4KeyLength == TKIP_KEY_LEN)) {
460 return WLAN_STATUS_INVALID_DATA;
462 /* Exception check, pairwise key must with transmit bit enabled */
463 else if ((prNewKey->u4KeyIndex & BITS(30,31)) == BITS(30,31)) {
464 if (((prNewKey->u4KeyIndex & 0xff) != 0) ||
465 ((prNewKey->arBSSID[0] == 0xff) && (prNewKey->arBSSID[1] == 0xff) && (prNewKey->arBSSID[2] == 0xff) &&
466 (prNewKey->arBSSID[3] == 0xff) && (prNewKey->arBSSID[4] == 0xff) && (prNewKey->arBSSID[5] == 0xff))) {
467 return WLAN_STATUS_INVALID_DATA;
471 *pu4SetInfoLen = u4SetBufferLen;
473 // fill CMD_802_11_KEY
474 kalMemZero(&rCmdKey, sizeof(CMD_802_11_KEY));
475 rCmdKey.ucAddRemove = 1; /* add */
476 rCmdKey.ucTxKey = ((prNewKey->u4KeyIndex & IS_TRANSMIT_KEY) == IS_TRANSMIT_KEY) ? 1 : 0;
477 rCmdKey.ucKeyType = ((prNewKey->u4KeyIndex & IS_UNICAST_KEY) == IS_UNICAST_KEY) ? 1 : 0;
478 if(kalP2PGetRole(prAdapter->prGlueInfo) == 1) { /* group client */
479 rCmdKey.ucIsAuthenticator = 0;
481 else { /* group owner */
482 rCmdKey.ucIsAuthenticator = 1;
484 COPY_MAC_ADDR(rCmdKey.aucPeerAddr, prNewKey->arBSSID);
485 rCmdKey.ucNetType = NETWORK_TYPE_P2P_INDEX;
486 if(prNewKey->u4KeyLength == CCMP_KEY_LEN)
487 rCmdKey.ucAlgorithmId = CIPHER_SUITE_CCMP; // AES
488 else if(prNewKey->u4KeyLength == TKIP_KEY_LEN)
489 rCmdKey.ucAlgorithmId = CIPHER_SUITE_TKIP; // TKIP
490 rCmdKey.ucKeyId = (UINT_8)(prNewKey->u4KeyIndex & 0xff);
491 rCmdKey.ucKeyLen = (UINT_8)prNewKey->u4KeyLength;
492 kalMemCopy(rCmdKey.aucKeyMaterial, (PUINT_8)prNewKey->aucKeyMaterial, rCmdKey.ucKeyLen);
494 return wlanoidSendSetQueryP2PCmd(prAdapter,
495 CMD_ID_ADD_REMOVE_KEY,
499 nicCmdEventSetCommon,
501 sizeof(CMD_802_11_KEY),
509 /*----------------------------------------------------------------------------*/
511 * \brief This routine is called to request Wi-Fi Direct driver to remove keys
513 * \param[in] prAdapter Pointer to the Adapter structure.
514 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
515 * \param[in] u4SetBufferLen The length of the set buffer.
516 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
517 * bytes read from the set buffer. If the call failed
518 * due to invalid length of the set buffer, returns
519 * the amount of storage needed.
521 * \retval WLAN_STATUS_SUCCESS
522 * \retval WLAN_STATUS_INVALID_DATA
523 * \retval WLAN_STATUS_INVALID_LENGTH
524 * \retval WLAN_STATUS_INVALID_DATA
526 /*----------------------------------------------------------------------------*/
528 wlanoidSetRemoveP2PKey(
529 IN P_ADAPTER_T prAdapter,
530 IN PVOID pvSetBuffer,
531 IN UINT_32 u4SetBufferLen,
532 OUT PUINT_32 pu4SetInfoLen
535 CMD_802_11_KEY rCmdKey;
536 P_PARAM_REMOVE_KEY_T prRemovedKey;
538 DEBUGFUNC("wlanoidSetRemoveP2PKey");
541 if (u4SetBufferLen < sizeof(PARAM_REMOVE_KEY_T)) {
542 return WLAN_STATUS_INVALID_LENGTH;
546 prRemovedKey = (P_PARAM_REMOVE_KEY_T)pvSetBuffer;
548 /* Check bit 31: this bit should always 0 */
549 if (prRemovedKey->u4KeyIndex & IS_TRANSMIT_KEY) {
550 /* Bit 31 should not be set */
551 DBGLOG(REQ, ERROR, ("invalid key index: 0x%08lx\n",
552 prRemovedKey->u4KeyIndex));
553 return WLAN_STATUS_INVALID_DATA;
556 /* Check bits 8 ~ 29 should always be 0 */
557 if (prRemovedKey->u4KeyIndex & BITS(8, 29)) {
558 /* Bit 31 should not be set */
559 DBGLOG(REQ, ERROR, ("invalid key index: 0x%08lx\n",
560 prRemovedKey->u4KeyIndex));
561 return WLAN_STATUS_INVALID_DATA;
564 /* There should not be any key operation for P2P Device */
565 if(kalP2PGetRole(prAdapter->prGlueInfo) == 0) {
566 // return WLAN_STATUS_NOT_ACCEPTED;
569 kalMemZero((PUINT_8)&rCmdKey, sizeof(CMD_802_11_KEY));
571 rCmdKey.ucAddRemove = 0; // remove
572 if(kalP2PGetRole(prAdapter->prGlueInfo) == 1) { /* group client */
573 rCmdKey.ucIsAuthenticator = 0;
575 else { /* group owner */
576 rCmdKey.ucIsAuthenticator = 1;
578 kalMemCopy(rCmdKey.aucPeerAddr, (PUINT_8)prRemovedKey->arBSSID, MAC_ADDR_LEN);
579 rCmdKey.ucNetType = NETWORK_TYPE_P2P_INDEX;
580 rCmdKey.ucKeyId = (UINT_8)(prRemovedKey->u4KeyIndex & 0x000000ff);
582 return wlanoidSendSetQueryP2PCmd(prAdapter,
583 CMD_ID_ADD_REMOVE_KEY,
587 nicCmdEventSetCommon,
589 sizeof(CMD_802_11_KEY),
596 /*----------------------------------------------------------------------------*/
598 * \brief Setting the IP address for pattern search function.
600 * \param[in] prAdapter Pointer to the Adapter structure.
601 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
602 * \param[in] u4SetBufferLen The length of the set buffer.
603 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
604 * bytes read from the set buffer. If the call failed
605 * due to invalid length of the set buffer, returns
606 * the amount of storage needed.
608 * \return WLAN_STATUS_SUCCESS
609 * \return WLAN_STATUS_ADAPTER_NOT_READY
610 * \return WLAN_STATUS_INVALID_LENGTH
612 /*----------------------------------------------------------------------------*/
614 wlanoidSetP2pNetworkAddress(
615 IN P_ADAPTER_T prAdapter,
616 IN PVOID pvSetBuffer,
617 IN UINT_32 u4SetBufferLen,
618 OUT PUINT_32 pu4SetInfoLen
621 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
623 P_CMD_SET_NETWORK_ADDRESS_LIST prCmdNetworkAddressList;
624 P_PARAM_NETWORK_ADDRESS_LIST prNetworkAddressList = (P_PARAM_NETWORK_ADDRESS_LIST)pvSetBuffer;
625 P_PARAM_NETWORK_ADDRESS prNetworkAddress;
626 P_PARAM_NETWORK_ADDRESS_IP prNetAddrIp;
627 UINT_32 u4IpAddressCount, u4CmdSize;
629 DEBUGFUNC("wlanoidSetP2pNetworkAddress");
630 DBGLOG(INIT, TRACE, ("\n"));
633 ASSERT(pu4SetInfoLen);
637 if (u4SetBufferLen < sizeof(PARAM_NETWORK_ADDRESS_LIST)) {
638 return WLAN_STATUS_INVALID_DATA;
642 u4IpAddressCount = 0;
644 prNetworkAddress = prNetworkAddressList->arAddress;
645 for ( i = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) {
646 if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
647 prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
651 prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((UINT_32) prNetworkAddress +
652 (UINT_32) (prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
655 // construct payload of command packet
656 u4CmdSize = OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST, arNetAddress) +
657 sizeof(IPV4_NETWORK_ADDRESS) * u4IpAddressCount;
659 prCmdNetworkAddressList = (P_CMD_SET_NETWORK_ADDRESS_LIST) kalMemAlloc(u4CmdSize, VIR_MEM_TYPE);
661 if(prCmdNetworkAddressList == NULL)
662 return WLAN_STATUS_FAILURE;
664 // fill P_CMD_SET_NETWORK_ADDRESS_LIST
665 prCmdNetworkAddressList->ucNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
666 prCmdNetworkAddressList->ucAddressCount = (UINT_8)u4IpAddressCount;
667 prNetworkAddress = prNetworkAddressList->arAddress;
668 for (i = 0, j = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) {
669 if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
670 prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
671 prNetAddrIp = (P_PARAM_NETWORK_ADDRESS_IP)prNetworkAddress->aucAddress;
673 kalMemCopy(prCmdNetworkAddressList->arNetAddress[j].aucIpAddr,
674 &(prNetAddrIp->in_addr),
680 prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((UINT_32) prNetworkAddress +
681 (UINT_32) (prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
684 rStatus = wlanSendSetQueryCmd(prAdapter,
685 CMD_ID_SET_IP_ADDRESS,
689 nicCmdEventSetIpAddress,
690 nicOidCmdTimeoutCommon,
692 (PUINT_8)prCmdNetworkAddressList,
697 kalMemFree(prCmdNetworkAddressList, VIR_MEM_TYPE, u4CmdSize);
701 /*----------------------------------------------------------------------------*/
703 * \brief This routine is used to query the power save profile.
705 * \param[in] prAdapter Pointer to the Adapter structure.
706 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
708 * \param[in] u4QueryBufLen The length of the query buffer.
709 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
710 * bytes written into the query buffer. If the call
711 * failed due to invalid length of the query buffer,
712 * returns the amount of storage needed.
714 * \return WLAN_STATUS_SUCCESS
716 /*----------------------------------------------------------------------------*/
718 wlanoidQueryP2pPowerSaveProfile (
719 IN P_ADAPTER_T prAdapter,
720 IN PVOID pvQueryBuffer,
721 IN UINT_32 u4QueryBufferLen,
722 OUT PUINT_32 pu4QueryInfoLen
725 DEBUGFUNC("wlanoidQueryP2pPowerSaveProfile");
728 ASSERT(pu4QueryInfoLen);
730 if (u4QueryBufferLen!=0) {
731 ASSERT(pvQueryBuffer);
733 *(PPARAM_POWER_MODE) pvQueryBuffer = (PARAM_POWER_MODE)(prAdapter->rWlanInfo.arPowerSaveMode[NETWORK_TYPE_P2P_INDEX].ucPsProfile);
734 *pu4QueryInfoLen = sizeof(PARAM_POWER_MODE);
737 return WLAN_STATUS_SUCCESS;
740 /*----------------------------------------------------------------------------*/
742 * \brief This routine is used to set the power save profile.
744 * \param[in] pvAdapter Pointer to the Adapter structure.
745 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
746 * \param[in] u4SetBufferLen The length of the set buffer.
747 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
748 * bytes read from the set buffer. If the call failed
749 * due to invalid length of the set buffer, returns
750 * the amount of storage needed.
752 * \retval WLAN_STATUS_SUCCESS
753 * \retval WLAN_STATUS_INVALID_LENGTH
755 /*----------------------------------------------------------------------------*/
757 wlanoidSetP2pPowerSaveProfile (
758 IN P_ADAPTER_T prAdapter,
759 IN PVOID pvSetBuffer,
760 IN UINT_32 u4SetBufferLen,
761 OUT PUINT_32 pu4SetInfoLen
765 PARAM_POWER_MODE ePowerMode;
766 DEBUGFUNC("wlanoidSetP2pPowerSaveProfile");
769 ASSERT(pu4SetInfoLen);
771 *pu4SetInfoLen = sizeof(PARAM_POWER_MODE);
772 if (u4SetBufferLen < sizeof(PARAM_POWER_MODE)) {
773 DBGLOG(REQ, WARN, ("Invalid length %ld\n", u4SetBufferLen));
774 return WLAN_STATUS_INVALID_LENGTH;
776 else if (*(PPARAM_POWER_MODE) pvSetBuffer >= Param_PowerModeMax) {
777 WARNLOG(("Invalid power mode %d\n",
778 *(PPARAM_POWER_MODE) pvSetBuffer));
779 return WLAN_STATUS_INVALID_DATA;
782 ePowerMode = *(PPARAM_POWER_MODE) pvSetBuffer;
784 if (prAdapter->fgEnCtiaPowerMode) {
785 if (ePowerMode == Param_PowerModeCAM) {
788 // User setting to PS mode (Param_PowerModeMAX_PSP or Param_PowerModeFast_PSP)
790 if (prAdapter->u4CtiaPowerMode == 0) {
791 // force to keep in CAM mode
792 ePowerMode = Param_PowerModeCAM;
793 } else if (prAdapter->u4CtiaPowerMode == 1) {
794 ePowerMode = Param_PowerModeMAX_PSP;
795 } else if (prAdapter->u4CtiaPowerMode == 2) {
796 ePowerMode = Param_PowerModeFast_PSP;
801 status = nicConfigPowerSaveProfile(
803 NETWORK_TYPE_P2P_INDEX,
807 } /* end of wlanoidSetP2pPowerSaveProfile() */
809 /*----------------------------------------------------------------------------*/
811 * \brief This routine is used to set the power save profile.
813 * \param[in] pvAdapter Pointer to the Adapter structure.
814 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
815 * \param[in] u4SetBufferLen The length of the set buffer.
816 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
817 * bytes read from the set buffer. If the call failed
818 * due to invalid length of the set buffer, returns
819 * the amount of storage needed.
821 * \retval WLAN_STATUS_SUCCESS
822 * \retval WLAN_STATUS_INVALID_LENGTH
824 /*----------------------------------------------------------------------------*/
826 wlanoidSetP2pSetNetworkAddress (
827 IN P_ADAPTER_T prAdapter,
828 IN PVOID pvSetBuffer,
829 IN UINT_32 u4SetBufferLen,
830 OUT PUINT_32 pu4SetInfoLen
833 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
835 P_CMD_SET_NETWORK_ADDRESS_LIST prCmdNetworkAddressList;
836 P_PARAM_NETWORK_ADDRESS_LIST prNetworkAddressList = (P_PARAM_NETWORK_ADDRESS_LIST)pvSetBuffer;
837 P_PARAM_NETWORK_ADDRESS prNetworkAddress;
838 P_PARAM_NETWORK_ADDRESS_IP prNetAddrIp;
839 UINT_32 u4IpAddressCount, u4CmdSize;
840 PUINT_8 pucBuf = (PUINT_8)pvSetBuffer;
842 DEBUGFUNC("wlanoidSetP2pSetNetworkAddress");
843 DBGLOG(INIT, TRACE, ("\n"));
844 printk("wlanoidSetP2pSetNetworkAddress (%d)\n", (INT_16)u4SetBufferLen);
847 ASSERT(pu4SetInfoLen);
851 if (u4SetBufferLen < sizeof(PARAM_NETWORK_ADDRESS_LIST)) {
852 return WLAN_STATUS_INVALID_DATA;
856 u4IpAddressCount = 0;
858 prNetworkAddress = prNetworkAddressList->arAddress;
859 for ( i = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) {
860 if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
861 prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
865 prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((UINT_32) prNetworkAddress +
866 (UINT_32) (prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
869 // construct payload of command packet
870 u4CmdSize = OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST, arNetAddress) +
871 sizeof(IPV4_NETWORK_ADDRESS) * u4IpAddressCount;
873 if (u4IpAddressCount == 0) {
874 u4CmdSize = sizeof(CMD_SET_NETWORK_ADDRESS_LIST);
877 prCmdNetworkAddressList = (P_CMD_SET_NETWORK_ADDRESS_LIST) kalMemAlloc(u4CmdSize, VIR_MEM_TYPE);
879 if(prCmdNetworkAddressList == NULL)
880 return WLAN_STATUS_FAILURE;
882 // fill P_CMD_SET_NETWORK_ADDRESS_LIST
883 prCmdNetworkAddressList->ucNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
885 /* only to set IP address to FW once ARP filter is enabled */
886 if (prAdapter->fgEnArpFilter) {
887 prCmdNetworkAddressList->ucAddressCount = (UINT_8)u4IpAddressCount;
888 prNetworkAddress = prNetworkAddressList->arAddress;
890 printk("u4IpAddressCount (%ld) \n", (INT_32)u4IpAddressCount);
891 for (i = 0, j = 0 ; i < prNetworkAddressList->u4AddressCount ; i++) {
892 if (prNetworkAddress->u2AddressType == PARAM_PROTOCOL_ID_TCP_IP &&
893 prNetworkAddress->u2AddressLength == sizeof(PARAM_NETWORK_ADDRESS_IP)) {
894 prNetAddrIp = (P_PARAM_NETWORK_ADDRESS_IP)prNetworkAddress->aucAddress;
896 kalMemCopy(prCmdNetworkAddressList->arNetAddress[j].aucIpAddr,
897 &(prNetAddrIp->in_addr),
902 pucBuf = (PUINT_8)&prNetAddrIp->in_addr;
903 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]);
906 prNetworkAddress = (P_PARAM_NETWORK_ADDRESS) ((UINT_32) prNetworkAddress +
907 (UINT_32) (prNetworkAddress->u2AddressLength + OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress)));
911 prCmdNetworkAddressList->ucAddressCount = 0;
914 rStatus = wlanSendSetQueryCmd(prAdapter,
915 CMD_ID_SET_IP_ADDRESS,
919 nicCmdEventSetIpAddress,
920 nicOidCmdTimeoutCommon,
922 (PUINT_8)prCmdNetworkAddressList,
927 kalMemFree(prCmdNetworkAddressList, VIR_MEM_TYPE, u4CmdSize);
929 } /* end of wlanoidSetP2pSetNetworkAddress() */
932 /*----------------------------------------------------------------------------*/
934 * \brief This routine is called to set Multicast Address List.
936 * \param[in] prAdapter Pointer to the Adapter structure.
937 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
938 * \param[in] u4SetBufferLen The length of the set buffer.
939 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
940 * bytes read from the set buffer. If the call failed
941 * due to invalid length of the set buffer, returns
942 * the amount of storage needed.
944 * \retval WLAN_STATUS_SUCCESS
945 * \retval WLAN_STATUS_INVALID_LENGTH
946 * \retval WLAN_STATUS_ADAPTER_NOT_READY
947 * \retval WLAN_STATUS_MULTICAST_FULL
949 /*----------------------------------------------------------------------------*/
951 wlanoidSetP2PMulticastList(
952 IN P_ADAPTER_T prAdapter,
953 IN PVOID pvSetBuffer,
954 IN UINT_32 u4SetBufferLen,
955 OUT PUINT_32 pu4SetInfoLen
958 CMD_MAC_MCAST_ADDR rCmdMacMcastAddr;
960 ASSERT(pu4SetInfoLen);
962 /* The data must be a multiple of the Ethernet address size. */
963 if ((u4SetBufferLen % MAC_ADDR_LEN)) {
964 DBGLOG(REQ, WARN, ("Invalid MC list length %ld\n", u4SetBufferLen));
966 *pu4SetInfoLen = (((u4SetBufferLen + MAC_ADDR_LEN) - 1) /
967 MAC_ADDR_LEN) * MAC_ADDR_LEN;
969 return WLAN_STATUS_INVALID_LENGTH;
972 *pu4SetInfoLen = u4SetBufferLen;
974 /* Verify if we can support so many multicast addresses. */
975 if ((u4SetBufferLen / MAC_ADDR_LEN) > MAX_NUM_GROUP_ADDR) {
976 DBGLOG(REQ, WARN, ("Too many MC addresses\n"));
978 return WLAN_STATUS_MULTICAST_FULL;
981 /* NOTE(Kevin): Windows may set u4SetBufferLen == 0 &&
982 * pvSetBuffer == NULL to clear exist Multicast List.
984 if (u4SetBufferLen) {
988 if (prAdapter->rAcpiState == ACPI_STATE_D3) {
989 DBGLOG(REQ, WARN, ("Fail in set multicast list! (Adapter not ready). ACPI=D%d, Radio=%d\n",
990 prAdapter->rAcpiState, prAdapter->fgIsRadioOff));
991 return WLAN_STATUS_ADAPTER_NOT_READY;
994 rCmdMacMcastAddr.u4NumOfGroupAddr = u4SetBufferLen / MAC_ADDR_LEN;
995 rCmdMacMcastAddr.ucNetTypeIndex = NETWORK_TYPE_P2P_INDEX;
996 kalMemCopy(rCmdMacMcastAddr.arAddress, pvSetBuffer, u4SetBufferLen);
998 return wlanoidSendSetQueryP2PCmd(prAdapter,
999 CMD_ID_MAC_MCAST_ADDR,
1002 FALSE, // This CMD response is no need to complete the OID. Or the event would unsync.
1003 nicCmdEventSetCommon,
1004 nicOidCmdTimeoutCommon,
1005 sizeof(CMD_MAC_MCAST_ADDR),
1006 (PUINT_8)&rCmdMacMcastAddr,
1011 } /* end of wlanoidSetP2PMulticastList() */
1014 /*----------------------------------------------------------------------------*/
1016 * \brief This routine is called to send GAS frame for P2P Service Discovery Request
1018 * \param[in] prAdapter Pointer to the Adapter structure.
1019 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
1020 * \param[in] u4SetBufferLen The length of the set buffer.
1021 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1022 * bytes read from the set buffer. If the call failed
1023 * due to invalid length of the set buffer, returns
1024 * the amount of storage needed.
1026 * \retval WLAN_STATUS_SUCCESS
1027 * \retval WLAN_STATUS_INVALID_LENGTH
1028 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1029 * \retval WLAN_STATUS_MULTICAST_FULL
1031 /*----------------------------------------------------------------------------*/
1033 wlanoidSendP2PSDRequest(
1034 IN P_ADAPTER_T prAdapter,
1035 IN PVOID pvSetBuffer,
1036 IN UINT_32 u4SetBufferLen,
1037 OUT PUINT_32 pu4SetInfoLen
1040 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
1042 ASSERT(pu4SetInfoLen);
1044 if (u4SetBufferLen) {
1045 ASSERT(pvSetBuffer);
1048 if (u4SetBufferLen < sizeof(PARAM_P2P_SEND_SD_REQUEST)) {
1049 *pu4SetInfoLen = sizeof(PARAM_P2P_SEND_SD_REQUEST);
1050 return WLAN_STATUS_BUFFER_TOO_SHORT;
1053 // rWlanStatus = p2pFsmRunEventSDRequest(prAdapter, (P_PARAM_P2P_SEND_SD_REQUEST)pvSetBuffer);
1056 } /* end of wlanoidSendP2PSDRequest() */
1059 /*----------------------------------------------------------------------------*/
1061 * \brief This routine is called to send GAS frame for P2P Service Discovery Response
1063 * \param[in] prAdapter Pointer to the Adapter structure.
1064 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
1065 * \param[in] u4SetBufferLen The length of the set buffer.
1066 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1067 * bytes read from the set buffer. If the call failed
1068 * due to invalid length of the set buffer, returns
1069 * the amount of storage needed.
1071 * \retval WLAN_STATUS_SUCCESS
1072 * \retval WLAN_STATUS_INVALID_LENGTH
1073 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1074 * \retval WLAN_STATUS_MULTICAST_FULL
1076 /*----------------------------------------------------------------------------*/
1078 wlanoidSendP2PSDResponse(
1079 IN P_ADAPTER_T prAdapter,
1080 IN PVOID pvSetBuffer,
1081 IN UINT_32 u4SetBufferLen,
1082 OUT PUINT_32 pu4SetInfoLen
1085 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
1087 ASSERT(pu4SetInfoLen);
1089 if (u4SetBufferLen) {
1090 ASSERT(pvSetBuffer);
1093 if (u4SetBufferLen < sizeof(PARAM_P2P_SEND_SD_RESPONSE)) {
1094 *pu4SetInfoLen = sizeof(PARAM_P2P_SEND_SD_RESPONSE);
1095 return WLAN_STATUS_BUFFER_TOO_SHORT;
1098 // rWlanStatus = p2pFsmRunEventSDResponse(prAdapter, (P_PARAM_P2P_SEND_SD_RESPONSE)pvSetBuffer);
1101 } /* end of wlanoidGetP2PSDRequest() */
1104 /*----------------------------------------------------------------------------*/
1106 * \brief This routine is called to get GAS frame for P2P Service Discovery Request
1108 * \param[in] prAdapter Pointer to the Adapter structure.
1109 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
1111 * \param[in] u4QueryBufferLen The length of the query buffer.
1112 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1113 * bytes written into the query buffer. If the call
1114 * failed due to invalid length of the query buffer,
1115 * returns the amount of storage needed.
1117 * \retval WLAN_STATUS_SUCCESS
1118 * \retval WLAN_STATUS_INVALID_LENGTH
1119 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1120 * \retval WLAN_STATUS_MULTICAST_FULL
1122 /*----------------------------------------------------------------------------*/
1124 wlanoidGetP2PSDRequest(
1125 IN P_ADAPTER_T prAdapter,
1126 IN PVOID pvQueryBuffer,
1127 IN UINT_32 u4QueryBufferLen,
1128 OUT PUINT_32 pu4QueryInfoLen
1131 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
1132 PUINT_8 pucPacketBuffer = NULL, pucTA = NULL;
1133 // PUINT_8 pucChannelNum = NULL;
1134 PUINT_16 pu2PacketLength = NULL;
1135 P_WLAN_MAC_HEADER_T prWlanHdr = (P_WLAN_MAC_HEADER_T)NULL;
1136 UINT_8 ucVersionNum = 0;
1137 // UINT_8 ucChannelNum = 0, ucSeqNum = 0;
1140 ASSERT(pu4QueryInfoLen);
1142 if (u4QueryBufferLen) {
1143 ASSERT(pvQueryBuffer);
1146 if (u4QueryBufferLen < sizeof(PARAM_P2P_GET_SD_REQUEST)) {
1147 *pu4QueryInfoLen = sizeof(PARAM_P2P_GET_SD_REQUEST);
1148 return WLAN_STATUS_BUFFER_TOO_SHORT;
1151 DBGLOG(P2P, TRACE, ("Get Service Discovery Request\n"));
1153 if ((ucVersionNum = p2pFuncGetVersionNumOfSD(prAdapter)) == 0) {
1154 P_PARAM_P2P_GET_SD_REQUEST prP2pGetSdReq = (P_PARAM_P2P_GET_SD_REQUEST)pvQueryBuffer;
1156 pucPacketBuffer = prP2pGetSdReq->aucPacketContent;
1157 pu2PacketLength = &prP2pGetSdReq->u2PacketLength;
1158 pucTA = &prP2pGetSdReq->rTransmitterAddr;
1161 P_PARAM_P2P_GET_SD_REQUEST_EX prP2pGetSdReqEx = (P_PARAM_P2P_GET_SD_REQUEST_EX)NULL;
1163 prP2pGetSdReqEx = (P_PARAM_P2P_GET_SD_REQUEST)pvQueryBuffer;
1164 pucPacketBuffer = prP2pGetSdReqEx->aucPacketContent;
1165 pu2PacketLength = &prP2pGetSdReqEx->u2PacketLength;
1166 pucTA = &prP2pGetSdReqEx->rTransmitterAddr;
1167 pucChannelNum = &prP2pGetSdReqEx->ucChannelNum;
1168 ucSeqNum = prP2pGetSdReqEx->ucSeqNum;
1172 rWlanStatus = p2pFuncGetServiceDiscoveryFrame(prAdapter,
1174 (u4QueryBufferLen - sizeof(PARAM_P2P_GET_SD_REQUEST)),
1175 (PUINT_32)pu2PacketLength,
1179 *pu4QueryInfoLen = 0;
1183 prWlanHdr = (P_WLAN_MAC_HEADER_T)pucPacketBuffer;
1185 kalMemCopy(pucTA, prWlanHdr->aucAddr2, MAC_ADDR_LEN);
1187 if (pu4QueryInfoLen) {
1188 if (ucVersionNum == 0) {
1189 *pu4QueryInfoLen = (UINT_32)(sizeof(PARAM_P2P_GET_SD_REQUEST) + (*pu2PacketLength));
1192 *pu4QueryInfoLen = (UINT_32)(sizeof(PARAM_P2P_GET_SD_REQUEST_EX) + (*pu2PacketLength));
1198 } /* end of wlanoidGetP2PSDRequest() */
1201 /*----------------------------------------------------------------------------*/
1203 * \brief This routine is called to get GAS frame for P2P Service Discovery Response
1205 * \param[in] prAdapter Pointer to the Adapter structure.
1206 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
1208 * \param[in] u4QueryBufferLen The length of the query buffer.
1209 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1210 * bytes written into the query buffer. If the call
1211 * failed due to invalid length of the query buffer,
1212 * returns the amount of storage needed.
1214 * \retval WLAN_STATUS_SUCCESS
1215 * \retval WLAN_STATUS_INVALID_LENGTH
1216 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1217 * \retval WLAN_STATUS_MULTICAST_FULL
1219 /*----------------------------------------------------------------------------*/
1221 wlanoidGetP2PSDResponse(
1222 IN P_ADAPTER_T prAdapter,
1223 IN PVOID pvQueryBuffer,
1224 IN UINT_32 u4QueryBufferLen,
1225 OUT PUINT_32 pu4QueryInfoLen
1228 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
1229 P_WLAN_MAC_HEADER_T prWlanHdr = (P_WLAN_MAC_HEADER_T)NULL;
1230 //UINT_8 ucSeqNum = 0,
1231 UINT_8 ucVersionNum = 0;
1232 PUINT_8 pucPacketContent = (PUINT_8)NULL, pucTA = (PUINT_8)NULL;
1233 PUINT_16 pu2PacketLength = (PUINT_16)NULL;
1236 ASSERT(pu4QueryInfoLen);
1238 if (u4QueryBufferLen) {
1239 ASSERT(pvQueryBuffer);
1242 if (u4QueryBufferLen < sizeof(PARAM_P2P_GET_SD_RESPONSE)) {
1243 *pu4QueryInfoLen = sizeof(PARAM_P2P_GET_SD_RESPONSE);
1244 return WLAN_STATUS_BUFFER_TOO_SHORT;
1247 DBGLOG(P2P, TRACE, ("Get Service Discovery Response\n"));
1250 if ((ucVersionNum = p2pFuncGetVersionNumOfSD(prAdapter)) == 0) {
1251 P_PARAM_P2P_GET_SD_RESPONSE prP2pGetSdRsp = (P_PARAM_P2P_GET_SD_RESPONSE)NULL;
1253 prP2pGetSdRsp = (P_PARAM_P2P_GET_SD_REQUEST)pvQueryBuffer;
1254 pucPacketContent = prP2pGetSdRsp->aucPacketContent;
1255 pucTA = &prP2pGetSdRsp->rTransmitterAddr;
1256 pu2PacketLength = &prP2pGetSdRsp->u2PacketLength;
1259 P_PARAM_P2P_GET_SD_RESPONSE_EX prP2pGetSdRspEx = (P_PARAM_P2P_GET_SD_RESPONSE_EX)NULL;
1261 prP2pGetSdRspEx = (P_PARAM_P2P_GET_SD_RESPONSE_EX)pvQueryBuffer;
1262 pucPacketContent = prP2pGetSdRspEx->aucPacketContent;
1263 pucTA = &prP2pGetSdRspEx->rTransmitterAddr;
1264 pu2PacketLength = &prP2pGetSdRspEx->u2PacketLength;
1265 ucSeqNum = prP2pGetSdRspEx->ucSeqNum;
1269 // rWlanStatus = p2pFuncGetServiceDiscoveryFrame(prAdapter,
1270 // pucPacketContent,
1271 // (u4QueryBufferLen - sizeof(PARAM_P2P_GET_SD_RESPONSE)),
1272 // (PUINT_32)pu2PacketLength,
1276 *pu4QueryInfoLen = 0;
1279 prWlanHdr = (P_WLAN_MAC_HEADER_T)pucPacketContent;
1281 kalMemCopy(pucTA, prWlanHdr->aucAddr2, MAC_ADDR_LEN);
1284 if (pu4QueryInfoLen) {
1285 if (ucVersionNum == 0) {
1286 *pu4QueryInfoLen = (UINT_32)(sizeof(PARAM_P2P_GET_SD_RESPONSE) + *pu2PacketLength);
1289 *pu4QueryInfoLen = (UINT_32)(sizeof(PARAM_P2P_GET_SD_RESPONSE_EX) + *pu2PacketLength);
1294 } /* end of wlanoidGetP2PSDResponse() */
1297 /*----------------------------------------------------------------------------*/
1299 * \brief This routine is called to terminate P2P Service Discovery Phase
1301 * \param[in] prAdapter Pointer to the Adapter structure.
1302 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
1303 * \param[in] u4SetBufferLen The length of the set buffer.
1304 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1305 * bytes read from the set buffer. If the call failed
1306 * due to invalid length of the set buffer, returns
1307 * the amount of storage needed.
1309 * \retval WLAN_STATUS_SUCCESS
1310 * \retval WLAN_STATUS_INVALID_LENGTH
1311 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1312 * \retval WLAN_STATUS_MULTICAST_FULL
1314 /*----------------------------------------------------------------------------*/
1316 wlanoidSetP2PTerminateSDPhase(
1317 IN P_ADAPTER_T prAdapter,
1318 IN PVOID pvSetBuffer,
1319 IN UINT_32 u4SetBufferLen,
1320 OUT PUINT_32 pu4SetInfoLen
1323 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
1324 P_PARAM_P2P_TERMINATE_SD_PHASE prP2pTerminateSD = (P_PARAM_P2P_TERMINATE_SD_PHASE)NULL;
1325 UINT_8 aucNullAddr[] = NULL_MAC_ADDR;
1328 if ((prAdapter == NULL) || (pu4SetInfoLen == NULL)) {
1333 if ((u4SetBufferLen) && (pvSetBuffer == NULL)) {
1337 if (u4SetBufferLen < sizeof(PARAM_P2P_TERMINATE_SD_PHASE)) {
1338 *pu4SetInfoLen = sizeof(PARAM_P2P_TERMINATE_SD_PHASE);
1339 rWlanStatus = WLAN_STATUS_BUFFER_TOO_SHORT;
1343 prP2pTerminateSD = (P_PARAM_P2P_TERMINATE_SD_PHASE)pvSetBuffer;
1345 if (EQUAL_MAC_ADDR(prP2pTerminateSD->rPeerAddr, aucNullAddr)) {
1346 DBGLOG(P2P, TRACE, ("Service Discovery Version 2.0\n"));
1347 // p2pFuncSetVersionNumOfSD(prAdapter, 2);
1350 //rWlanStatus = p2pFsmRunEventSDAbort(prAdapter);
1359 } /* end of wlanoidSetP2PTerminateSDPhase() */
1362 #if CFG_SUPPORT_ANTI_PIRACY
1363 /*----------------------------------------------------------------------------*/
1365 * \brief This routine is called to
1367 * \param[in] prAdapter Pointer to the Adapter structure.
1368 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
1369 * \param[in] u4SetBufferLen The length of the set buffer.
1370 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1371 * bytes read from the set buffer. If the call failed
1372 * due to invalid length of the set buffer, returns
1373 * the amount of storage needed.
1375 * \retval WLAN_STATUS_SUCCESS
1376 * \retval WLAN_STATUS_INVALID_LENGTH
1377 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1378 * \retval WLAN_STATUS_MULTICAST_FULL
1380 /*----------------------------------------------------------------------------*/
1382 wlanoidSetSecCheckRequest(
1383 IN P_ADAPTER_T prAdapter,
1384 IN PVOID pvSetBuffer,
1385 IN UINT_32 u4SetBufferLen,
1386 OUT PUINT_32 pu4SetInfoLen
1390 ASSERT(pu4SetInfoLen);
1392 if (u4SetBufferLen) {
1393 ASSERT(pvSetBuffer);
1396 return wlanoidSendSetQueryP2PCmd(prAdapter,
1402 nicOidCmdTimeoutCommon,
1404 (PUINT_8)pvSetBuffer,
1409 } /* end of wlanoidSetSecCheckRequest() */
1412 /*----------------------------------------------------------------------------*/
1414 * \brief This routine is called to
1416 * \param[in] prAdapter Pointer to the Adapter structure.
1417 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
1419 * \param[in] u4QueryBufferLen The length of the query buffer.
1420 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1421 * bytes written into the query buffer. If the call
1422 * failed due to invalid length of the query buffer,
1423 * returns the amount of storage needed.
1425 * \retval WLAN_STATUS_SUCCESS
1426 * \retval WLAN_STATUS_INVALID_LENGTH
1427 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1428 * \retval WLAN_STATUS_MULTICAST_FULL
1430 /*----------------------------------------------------------------------------*/
1432 wlanoidGetSecCheckResponse(
1433 IN P_ADAPTER_T prAdapter,
1434 IN PVOID pvQueryBuffer,
1435 IN UINT_32 u4QueryBufferLen,
1436 OUT PUINT_32 pu4QueryInfoLen
1439 WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
1440 //P_WLAN_MAC_HEADER_T prWlanHdr = (P_WLAN_MAC_HEADER_T)NULL;
1441 P_GLUE_INFO_T prGlueInfo;
1443 prGlueInfo = prAdapter->prGlueInfo;
1446 ASSERT(pu4QueryInfoLen);
1448 if (u4QueryBufferLen) {
1449 ASSERT(pvQueryBuffer);
1452 if (u4QueryBufferLen > 256) {
1453 u4QueryBufferLen = 256;
1456 *pu4QueryInfoLen = u4QueryBufferLen;
1459 DBGLOG_MEM8(SEC, LOUD, prGlueInfo->prP2PInfo->aucSecCheckRsp, u4QueryBufferLen);
1461 kalMemCopy((PUINT_8)(pvQueryBuffer + OFFSET_OF(IW_P2P_TRANSPORT_STRUCT, aucBuffer)), prGlueInfo->prP2PInfo->aucSecCheckRsp, u4QueryBufferLen);
1464 } /* end of wlanoidGetSecCheckResponse() */
1468 wlanoidSetNoaParam (
1469 IN P_ADAPTER_T prAdapter,
1470 IN PVOID pvSetBuffer,
1471 IN UINT_32 u4SetBufferLen,
1472 OUT PUINT_32 pu4SetInfoLen
1475 P_PARAM_CUSTOM_NOA_PARAM_STRUC_T prNoaParam;
1476 CMD_CUSTOM_NOA_PARAM_STRUC_T rCmdNoaParam;
1478 DEBUGFUNC("wlanoidSetNoaParam");
1479 DBGLOG(INIT, TRACE,("\n"));
1482 ASSERT(pu4SetInfoLen);
1484 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_NOA_PARAM_STRUC_T);
1486 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_NOA_PARAM_STRUC_T)) {
1487 return WLAN_STATUS_INVALID_LENGTH;
1490 ASSERT(pvSetBuffer);
1492 prNoaParam = (P_PARAM_CUSTOM_NOA_PARAM_STRUC_T)pvSetBuffer;
1494 kalMemZero(&rCmdNoaParam, sizeof(CMD_CUSTOM_NOA_PARAM_STRUC_T));
1495 rCmdNoaParam.u4NoaDurationMs = prNoaParam->u4NoaDurationMs;
1496 rCmdNoaParam.u4NoaIntervalMs = prNoaParam->u4NoaIntervalMs;
1497 rCmdNoaParam.u4NoaCount = prNoaParam->u4NoaCount;
1500 return wlanSendSetQueryCmd(prAdapter,
1501 CMD_ID_SET_NOA_PARAM,
1505 nicCmdEventSetCommon,
1506 nicOidCmdTimeoutCommon,
1507 sizeof(CMD_CUSTOM_NOA_PARAM_STRUC_T),
1508 (PUINT_8)&rCmdNoaParam,
1513 return wlanoidSendSetQueryP2PCmd(prAdapter,
1514 CMD_ID_SET_NOA_PARAM,
1519 nicOidCmdTimeoutCommon,
1520 sizeof(CMD_CUSTOM_NOA_PARAM_STRUC_T),
1521 (PUINT_8)&rCmdNoaParam,
1531 wlanoidSetOppPsParam (
1532 IN P_ADAPTER_T prAdapter,
1533 IN PVOID pvSetBuffer,
1534 IN UINT_32 u4SetBufferLen,
1535 OUT PUINT_32 pu4SetInfoLen
1538 P_PARAM_CUSTOM_OPPPS_PARAM_STRUC_T prOppPsParam;
1539 CMD_CUSTOM_OPPPS_PARAM_STRUC_T rCmdOppPsParam;
1541 DEBUGFUNC("wlanoidSetOppPsParam");
1542 DBGLOG(INIT, TRACE,("\n"));
1545 ASSERT(pu4SetInfoLen);
1547 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUC_T);
1549 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUC_T)) {
1550 return WLAN_STATUS_INVALID_LENGTH;
1553 ASSERT(pvSetBuffer);
1555 prOppPsParam = (P_PARAM_CUSTOM_OPPPS_PARAM_STRUC_T)pvSetBuffer;
1557 kalMemZero(&rCmdOppPsParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T));
1558 rCmdOppPsParam.u4CTwindowMs = prOppPsParam->u4CTwindowMs;
1561 return wlanSendSetQueryCmd(prAdapter,
1562 CMD_ID_SET_OPPPS_PARAM,
1566 nicCmdEventSetCommon,
1567 nicOidCmdTimeoutCommon,
1568 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T),
1569 (PUINT_8)&rCmdOppPsParam,
1574 return wlanoidSendSetQueryP2PCmd(prAdapter,
1575 CMD_ID_SET_NOA_PARAM,
1580 nicOidCmdTimeoutCommon,
1581 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T),
1582 (PUINT_8)&rCmdOppPsParam,
1592 wlanoidSetUApsdParam (
1593 IN P_ADAPTER_T prAdapter,
1594 IN PVOID pvSetBuffer,
1595 IN UINT_32 u4SetBufferLen,
1596 OUT PUINT_32 pu4SetInfoLen
1599 P_PARAM_CUSTOM_UAPSD_PARAM_STRUC_T prUapsdParam;
1600 CMD_CUSTOM_UAPSD_PARAM_STRUC_T rCmdUapsdParam;
1601 P_PM_PROFILE_SETUP_INFO_T prPmProfSetupInfo;
1602 P_BSS_INFO_T prBssInfo;
1605 DEBUGFUNC("wlanoidSetUApsdParam");
1606 DBGLOG(INIT, TRACE,("\n"));
1609 ASSERT(pu4SetInfoLen);
1611 *pu4SetInfoLen = sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUC_T);
1613 if (u4SetBufferLen < sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUC_T)) {
1614 return WLAN_STATUS_INVALID_LENGTH;
1617 ASSERT(pvSetBuffer);
1619 prBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
1620 prPmProfSetupInfo = &prBssInfo->rPmProfSetupInfo;
1622 prUapsdParam = (P_PARAM_CUSTOM_UAPSD_PARAM_STRUC_T)pvSetBuffer;
1624 kalMemZero(&rCmdUapsdParam, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T));
1625 rCmdUapsdParam.fgEnAPSD = prUapsdParam->fgEnAPSD;
1626 prAdapter->rWifiVar.fgSupportUAPSD = prUapsdParam->fgEnAPSD;
1628 rCmdUapsdParam.fgEnAPSD_AcBe = prUapsdParam->fgEnAPSD_AcBe;
1629 rCmdUapsdParam.fgEnAPSD_AcBk = prUapsdParam->fgEnAPSD_AcBk;
1630 rCmdUapsdParam.fgEnAPSD_AcVo = prUapsdParam->fgEnAPSD_AcVo;
1631 rCmdUapsdParam.fgEnAPSD_AcVi = prUapsdParam->fgEnAPSD_AcVi;
1632 prPmProfSetupInfo->ucBmpDeliveryAC =
1633 ((prUapsdParam->fgEnAPSD_AcBe << 0) |
1634 (prUapsdParam->fgEnAPSD_AcBk << 1) |
1635 (prUapsdParam->fgEnAPSD_AcVi << 2) |
1636 (prUapsdParam->fgEnAPSD_AcVo << 3));
1637 prPmProfSetupInfo->ucBmpTriggerAC =
1638 ((prUapsdParam->fgEnAPSD_AcBe << 0) |
1639 (prUapsdParam->fgEnAPSD_AcBk << 1) |
1640 (prUapsdParam->fgEnAPSD_AcVi << 2) |
1641 (prUapsdParam->fgEnAPSD_AcVo << 3));
1643 rCmdUapsdParam.ucMaxSpLen = prUapsdParam->ucMaxSpLen;
1644 prPmProfSetupInfo->ucUapsdSp = prUapsdParam->ucMaxSpLen;
1647 return wlanSendSetQueryCmd(prAdapter,
1648 CMD_ID_SET_UAPSD_PARAM,
1652 nicCmdEventSetCommon,
1653 nicOidCmdTimeoutCommon,
1654 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T),
1655 (PUINT_8)&rCmdUapsdParam,
1660 return wlanoidSendSetQueryP2PCmd(prAdapter,
1661 CMD_ID_SET_UAPSD_PARAM,
1666 nicOidCmdTimeoutCommon,
1667 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T),
1668 (PUINT_8)&rCmdUapsdParam,
1679 wlanoidQueryP2pOpChannel (
1680 IN P_ADAPTER_T prAdapter,
1681 IN PVOID pvQueryBuffer,
1682 IN UINT_32 u4QueryBufferLen,
1683 OUT PUINT_32 pu4QueryInfoLen
1687 WLAN_STATUS rResult = WLAN_STATUS_FAILURE;
1688 // PUINT_8 pucOpChnl = (PUINT_8)pvQueryBuffer;
1691 if ((prAdapter == NULL) || (pu4QueryInfoLen == NULL)) {
1696 if ((u4QueryBufferLen) && (pvQueryBuffer == NULL)) {
1700 if (u4QueryBufferLen < sizeof(UINT_8)) {
1701 *pu4QueryInfoLen = sizeof(UINT_8);
1702 rResult = WLAN_STATUS_BUFFER_TOO_SHORT;
1707 if (!p2pFuncGetCurrentOpChnl(prAdapter, pucOpChnl)) {
1708 rResult = WLAN_STATUS_INVALID_DATA;
1712 rResult = WLAN_STATUS_INVALID_DATA;
1716 *pu4QueryInfoLen = sizeof(UINT_8);
1717 rResult = WLAN_STATUS_SUCCESS;
1722 } /* wlanoidQueryP2pOpChannel */
1725 wlanoidQueryP2pVersion (
1726 IN P_ADAPTER_T prAdapter,
1727 IN PVOID pvQueryBuffer,
1728 IN UINT_32 u4QueryBufferLen,
1729 OUT PUINT_32 pu4QueryInfoLen
1732 WLAN_STATUS rResult = WLAN_STATUS_FAILURE;
1733 // PUINT_8 pucVersionNum = (PUINT_8)pvQueryBuffer;
1736 if ((prAdapter == NULL) || (pu4QueryInfoLen == NULL)) {
1741 if ((u4QueryBufferLen) && (pvQueryBuffer == NULL)) {
1745 if (u4QueryBufferLen < sizeof(UINT_8)) {
1746 *pu4QueryInfoLen = sizeof(UINT_8);
1747 rResult = WLAN_STATUS_BUFFER_TOO_SHORT;
1754 } /* wlanoidQueryP2pVersion */
1757 wlanoidSetP2pSupplicantVersion (
1758 IN P_ADAPTER_T prAdapter,
1759 IN PVOID pvSetBuffer,
1760 IN UINT_32 u4SetBufferLen,
1761 OUT PUINT_32 pu4SetInfoLen
1764 WLAN_STATUS rResult = WLAN_STATUS_FAILURE;
1765 UINT_8 ucVersionNum;
1768 if ((prAdapter == NULL) || (pu4SetInfoLen == NULL)) {
1770 rResult = WLAN_STATUS_INVALID_DATA;
1774 if ((u4SetBufferLen) && (pvSetBuffer == NULL)) {
1775 rResult = WLAN_STATUS_INVALID_DATA;
1779 *pu4SetInfoLen = sizeof(UINT_8);
1781 if (u4SetBufferLen < sizeof(UINT_8)) {
1782 rResult = WLAN_STATUS_INVALID_LENGTH;
1787 ucVersionNum = *((PUINT_8)pvSetBuffer);
1790 rResult = WLAN_STATUS_SUCCESS;
1794 } /* wlanoidSetP2pSupplicantVersion */
1796 #if CFG_SUPPORT_P2P_RSSI_QUERY
1798 wlanoidQueryP2pRssi (
1799 IN P_ADAPTER_T prAdapter,
1800 IN PVOID pvQueryBuffer,
1801 IN UINT_32 u4QueryBufferLen,
1802 OUT PUINT_32 pu4QueryInfoLen
1805 DEBUGFUNC("wlanoidQueryP2pRssi");
1808 ASSERT(pu4QueryInfoLen);
1809 if (u4QueryBufferLen) {
1810 ASSERT(pvQueryBuffer);
1813 *pu4QueryInfoLen = sizeof(PARAM_RSSI);
1815 /* Check for query buffer length */
1816 if (u4QueryBufferLen < *pu4QueryInfoLen) {
1817 DBGLOG(REQ, WARN, ("Too short length %ld\n", u4QueryBufferLen));
1818 return WLAN_STATUS_BUFFER_TOO_SHORT;
1821 if (prAdapter->fgIsP2pLinkQualityValid == TRUE &&
1822 (kalGetTimeTick() - prAdapter->rP2pLinkQualityUpdateTime) <= CFG_LINK_QUALITY_VALID_PERIOD) {
1825 rRssi = (PARAM_RSSI)prAdapter->rP2pLinkQuality.cRssi; // ranged from (-128 ~ 30) in unit of dBm
1827 if(rRssi > PARAM_WHQL_RSSI_MAX_DBM)
1828 rRssi = PARAM_WHQL_RSSI_MAX_DBM;
1829 else if(rRssi < PARAM_WHQL_RSSI_MIN_DBM)
1830 rRssi = PARAM_WHQL_RSSI_MIN_DBM;
1832 kalMemCopy(pvQueryBuffer, &rRssi, sizeof(PARAM_RSSI));
1833 return WLAN_STATUS_SUCCESS;
1837 return wlanSendSetQueryCmd(prAdapter,
1838 CMD_ID_GET_LINK_QUALITY,
1842 nicCmdEventQueryLinkQuality,
1843 nicOidCmdTimeoutCommon,
1850 return wlanSendSetQueryCmd(prAdapter,
1851 CMD_ID_GET_LINK_QUALITY,
1855 nicCmdEventQueryLinkQuality,
1856 nicOidCmdTimeoutCommon,
1864 } /* wlanoidQueryP2pRssi */