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.
15 * 07 17 2012 yuche.tsai
17 * Compile no error before trial run.
19 * 11 24 2011 yuche.tsai
21 * Fix P2P IOCTL of multicast address bug, add low power driver stop control.
23 * 11 22 2011 yuche.tsai
25 * Update RSSI link quality of P2P Network query method. (Bug fix)
27 * 11 19 2011 yuche.tsai
29 * Add RSSI support for P2P network.
31 * 11 08 2011 yuche.tsai
32 * [WCXRP00001094] [Volunteer Patch][Driver] Driver version & supplicant version query & set support for service discovery version check.
33 * Add support for driver version query & p2p supplicant verseion set.
34 * For new service discovery mechanism sync.
36 * 10 18 2011 yuche.tsai
37 * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
38 * Support Channle Query.
40 * 10 18 2011 yuche.tsai
41 * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
45 * 08 23 2011 yuche.tsai
47 * Fix Multicast Issue of P2P.
49 * 04 27 2011 george.huang
50 * [WCXRP00000684] [MT6620 Wi-Fi][Driver] Support P2P setting ARP filter
51 * Support P2P ARP filter setting on early suspend/ late resume
53 * 04 08 2011 george.huang
54 * [WCXRP00000621] [MT6620 Wi-Fi][Driver] Support P2P supplicant to set power mode
55 * separate settings of P2P and AIS
57 * 03 22 2011 george.huang
58 * [WCXRP00000504] [MT6620 Wi-Fi][FW] Support Sigma CAPI for power saving related command
59 * link with supplicant commands
62 * [WCXRP00000571] [MT6620 Wi-Fi] [Driver] Not check the p2p role during set key
63 * Skip the p2p role for adding broadcast key issue.
66 * [WCXRP00000530] [MT6620 Wi-Fi] [Driver] skip doing p2pRunEventAAAComplete after send assoc response Tx Done
67 * fixed compiling error while enable dbg.
69 * 03 08 2011 yuche.tsai
70 * [WCXRP00000480] [Volunteer Patch][MT6620][Driver] WCS IE format issue[WCXRP00000509] [Volunteer Patch][MT6620][Driver] Kernal panic when remove p2p module.
74 * [WCXRP00000521] [MT6620 Wi-Fi][Driver] Remove non-standard debug message
75 * Toggle non-standard debug messages to comments.
78 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
79 * rename the define to anti_pviracy.
82 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
83 * add the code to get the check rsponse and indicate to app.
86 * [WCXRP00000506] [MT6620 Wi-Fi][Driver][FW] Add Security check related code
87 * Add Security check related code.
89 * 03 02 2011 yuche.tsai
90 * [WCXRP00000245] 1. Invitation Request/Response.
91 2. Provision Discovery Request/Response
93 * Fix SD Request Query Length issue.
95 * 03 02 2011 yuche.tsai
96 * [WCXRP00000245] 1. Invitation Request/Response.
97 2. Provision Discovery Request/Response
99 * Service Discovery Request.
101 * 03 01 2011 yuche.tsai
102 * [WCXRP00000245] 1. Invitation Request/Response.
103 2. Provision Discovery Request/Response
105 * Update Service Discovery Wlan OID related function.
107 * 03 01 2011 yuche.tsai
108 * [WCXRP00000245] 1. Invitation Request/Response.
109 2. Provision Discovery Request/Response
111 * Update Service Discovery Related wlanoid function.
113 * 02 09 2011 yuche.tsai
114 * [WCXRP00000245] 1. Invitation Request/Response.
115 2. Provision Discovery Request/Response
117 * Add Service Discovery Indication Related code.
119 * 01 26 2011 yuche.tsai
120 * [WCXRP00000245] 1. Invitation Request/Response.
121 2. Provision Discovery Request/Response
123 * Add Service Discovery Function.
126 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
127 * ioctl implementations for P2P Service Discovery
130 * [WCXRP00000338] [MT6620 Wi-Fi][Driver] Separate kalMemAlloc into kmalloc and vmalloc implementations to ease physically continous memory demands
131 * separate kalMemAlloc() into virtually-continous and physically-continous type to ease slab system pressure
134 * [WCXRP00000283] [MT6620 Wi-Fi][Driver][Wi-Fi Direct] Implementation of interface for supporting Wi-Fi Direct Service Discovery
135 * 1. header file restructure for more clear module isolation
136 * 2. add function interface definition for implementing Service Discovery callbacks
139 * [WCXRP00000077] [MT6620 Wi-Fi][Driver][FW] Eliminate use of ENUM_NETWORK_TYPE_T and replaced by ENUM_NETWORK_TYPE_INDEX_T only
140 * remove ENUM_NETWORK_TYPE_T definitions
144 * [WCXRP00000069][MT6620 Wi-Fi][Driver] Fix some code for phase 1 P2P Demo.
146 * 09 21 2010 kevin.huang
147 * [WCXRP00000054] [MT6620 Wi-Fi][Driver] Restructure driver for second Interface
148 * Isolate P2P related function for Hardware Software Bundle
150 * 09 03 2010 kevin.huang
152 * Refine #include sequence and solve recursive/nested #include issue
156 * revise constant definitions to be matched with implementation (original cmd-event definition is deprecated)
160 * add subroutines for P2P to set multicast list.
162 * 08 16 2010 george.huang
166 * 08 16 2010 george.huang
168 * support wlanoidSetP2pPowerSaveProfile() in P2P
170 * 08 16 2010 george.huang
172 * Support wlanoidSetNetworkAddress() for P2P
176 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
179 * [WPD00003833][MT6620 and MT5931] Driver migration
180 * add API in que_mgt to retrieve sta-rec index for security frames.
183 * [WPD00003833][MT6620 and MT5931] Driver migration
184 * 802.1x and bluetooth-over-Wi-Fi security frames are now delievered to firmware via command path instead of data path.
187 * [WPD00003833][MT6620 and MT5931] Driver migration
188 * 1) migrate assoc.c.
189 * 2) add ucTxSeqNum for tracking frames which needs TX-DONE awareness
190 * 3) add configuration options for CNM_MEM and RSN modules
191 * 4) add data path for management frames
192 * 5) eliminate rPacketInfo of MSDU_INFO_T
194 * 06 06 2010 kevin.huang
195 * [WPD00003832][MT6620 5931] Create driver base
196 * [MT6620 5931] Create driver base
199 * [WPD00003831][MT6620 Wi-Fi] Add framework for Wi-Fi Direct support
200 * 1) add timeout handler mechanism for pending command packets
201 * 2) add p2p add/removal key
206 /******************************************************************************
207 * C O M P I L E R F L A G S
208 *******************************************************************************
211 /******************************************************************************
212 * E X T E R N A L R E F E R E N C E S
213 *******************************************************************************
217 /******************************************************************************
219 *******************************************************************************
222 /******************************************************************************
224 *******************************************************************************
227 /******************************************************************************
228 * P U B L I C D A T A
229 *******************************************************************************
232 /******************************************************************************
233 * P R I V A T E D A T A
234 *******************************************************************************
237 /******************************************************************************
239 *******************************************************************************
242 /******************************************************************************
243 * F U N C T I O N D E C L A R A T I O N S
244 *******************************************************************************
247 /******************************************************************************
249 *******************************************************************************
251 /*----------------------------------------------------------------------------*/
253 * \brief command packet generation utility
255 * \param[in] prAdapter Pointer to the Adapter structure.
256 * \param[in] ucCID Command ID
257 * \param[in] fgSetQuery Set or Query
258 * \param[in] fgNeedResp Need for response
259 * \param[in] pfCmdDoneHandler Function pointer when command is done
260 * \param[in] u4SetQueryInfoLen The length of the set/query buffer
261 * \param[in] pucInfoBuffer Pointer to set/query buffer
264 * \retval WLAN_STATUS_PENDING
265 * \retval WLAN_STATUS_FAILURE
267 /*----------------------------------------------------------------------------*/
269 wlanoidSendSetQueryP2PCmd(IN P_ADAPTER_T prAdapter
,
274 PFN_CMD_DONE_HANDLER pfCmdDoneHandler
,
275 PFN_CMD_TIMEOUT_HANDLER pfCmdTimeoutHandler
,
276 UINT_32 u4SetQueryInfoLen
,
277 PUINT_8 pucInfoBuffer
,
278 OUT PVOID pvSetQueryBuffer
, IN UINT_32 u4SetQueryBufferLen
)
280 P_GLUE_INFO_T prGlueInfo
;
281 P_CMD_INFO_T prCmdInfo
;
282 P_WIFI_CMD_T prWifiCmd
;
287 prGlueInfo
= prAdapter
->prGlueInfo
;
290 DEBUGFUNC("wlanoidSendSetQueryP2PCmd");
291 DBGLOG(REQ
, TRACE
, ("Command ID = 0x%08X\n", ucCID
));
293 prCmdInfo
= cmdBufAllocateCmdInfo(prAdapter
, (CMD_HDR_SIZE
+ u4SetQueryInfoLen
));
296 DBGLOG(INIT
, ERROR
, ("Allocate CMD_INFO_T ==> FAILED.\n"));
297 return WLAN_STATUS_FAILURE
;
299 /* increase command sequence number */
300 ucCmdSeqNum
= nicIncreaseCmdSeqNum(prAdapter
);
301 DBGLOG(REQ
, TRACE
, ("ucCmdSeqNum =%d\n", ucCmdSeqNum
));
303 /* Setup common CMD Info Packet */
304 prCmdInfo
->eCmdType
= COMMAND_TYPE_NETWORK_IOCTL
;
305 prCmdInfo
->eNetworkType
= NETWORK_TYPE_P2P_INDEX
;
306 prCmdInfo
->u2InfoBufLen
= (UINT_16
) (CMD_HDR_SIZE
+ u4SetQueryInfoLen
);
307 prCmdInfo
->pfCmdDoneHandler
= pfCmdDoneHandler
;
308 prCmdInfo
->pfCmdTimeoutHandler
= pfCmdTimeoutHandler
;
309 prCmdInfo
->fgIsOid
= fgIsOid
;
310 prCmdInfo
->ucCID
= ucCID
;
311 prCmdInfo
->fgSetQuery
= fgSetQuery
;
312 prCmdInfo
->fgNeedResp
= fgNeedResp
;
313 prCmdInfo
->fgDriverDomainMCR
= FALSE
;
314 prCmdInfo
->ucCmdSeqNum
= ucCmdSeqNum
;
315 prCmdInfo
->u4SetInfoLen
= u4SetQueryInfoLen
;
316 prCmdInfo
->pvInformationBuffer
= pvSetQueryBuffer
;
317 prCmdInfo
->u4InformationBufferLength
= u4SetQueryBufferLen
;
319 /* Setup WIFI_CMD_T (no payload) */
320 prWifiCmd
= (P_WIFI_CMD_T
) (prCmdInfo
->pucInfoBuffer
);
321 prWifiCmd
->u2TxByteCount_UserPriority
= prCmdInfo
->u2InfoBufLen
;
322 prWifiCmd
->ucCID
= prCmdInfo
->ucCID
;
323 prWifiCmd
->ucSetQuery
= prCmdInfo
->fgSetQuery
;
324 prWifiCmd
->ucSeqNum
= prCmdInfo
->ucCmdSeqNum
;
326 if (u4SetQueryInfoLen
> 0 && pucInfoBuffer
!= NULL
) {
327 kalMemCopy(prWifiCmd
->aucBuffer
, pucInfoBuffer
, u4SetQueryInfoLen
);
329 /* insert into prCmdQueue */
330 kalEnqueueCommand(prGlueInfo
, (P_QUE_ENTRY_T
) prCmdInfo
);
332 /* wakeup txServiceThread later */
333 GLUE_SET_EVENT(prGlueInfo
);
334 return WLAN_STATUS_PENDING
;
337 /*----------------------------------------------------------------------------*/
339 * \brief This routine is called to set a key to Wi-Fi Direct driver
341 * \param[in] prAdapter Pointer to the Adapter structure.
342 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
343 * \param[in] u4SetBufferLen The length of the set buffer.
344 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
345 * bytes read from the set buffer. If the call failed
346 * due to invalid length of the set buffer, returns
347 * the amount of storage needed.
349 * \retval WLAN_STATUS_SUCCESS
350 * \retval WLAN_STATUS_ADAPTER_NOT_READY
351 * \retval WLAN_STATUS_INVALID_LENGTH
352 * \retval WLAN_STATUS_INVALID_DATA
354 /*----------------------------------------------------------------------------*/
356 wlanoidSetAddP2PKey(IN P_ADAPTER_T prAdapter
,
357 IN PVOID pvSetBuffer
, IN UINT_32 u4SetBufferLen
, OUT PUINT_32 pu4SetInfoLen
)
359 CMD_802_11_KEY rCmdKey
;
360 P_PARAM_KEY_T prNewKey
;
362 DEBUGFUNC("wlanoidSetAddP2PKey");
363 DBGLOG(REQ
, INFO
, ("\n"));
367 ASSERT(pu4SetInfoLen
);
369 prNewKey
= (P_PARAM_KEY_T
) pvSetBuffer
;
371 /* Verify the key structure length. */
372 if (prNewKey
->u4Length
> u4SetBufferLen
) {
374 ("Invalid key structure length (%d) greater than total buffer length (%d)\n",
375 (UINT_8
) prNewKey
->u4Length
, (UINT_8
) u4SetBufferLen
));
377 *pu4SetInfoLen
= u4SetBufferLen
;
378 return WLAN_STATUS_INVALID_LENGTH
;
380 /* Verify the key material length for key material buffer */
381 else if (prNewKey
->u4KeyLength
>
382 prNewKey
->u4Length
- OFFSET_OF(PARAM_KEY_T
, aucKeyMaterial
)) {
384 ("Invalid key material length (%d)\n", (UINT_8
) prNewKey
->u4KeyLength
));
385 *pu4SetInfoLen
= u4SetBufferLen
;
386 return WLAN_STATUS_INVALID_DATA
;
388 /* Exception check */
389 else if (prNewKey
->u4KeyIndex
& 0x0fffff00) {
390 return WLAN_STATUS_INVALID_DATA
;
392 /* Exception check, pairwise key must with transmit bit enabled */
393 else if ((prNewKey
->u4KeyIndex
& BITS(30, 31)) == IS_UNICAST_KEY
) {
394 return WLAN_STATUS_INVALID_DATA
;
395 } else if (!(prNewKey
->u4KeyLength
== CCMP_KEY_LEN
)
396 && !(prNewKey
->u4KeyLength
== TKIP_KEY_LEN
)) {
397 return WLAN_STATUS_INVALID_DATA
;
399 /* Exception check, pairwise key must with transmit bit enabled */
400 else if ((prNewKey
->u4KeyIndex
& BITS(30, 31)) == BITS(30, 31)) {
401 if (((prNewKey
->u4KeyIndex
& 0xff) != 0) ||
402 ((prNewKey
->arBSSID
[0] == 0xff) && (prNewKey
->arBSSID
[1] == 0xff)
403 && (prNewKey
->arBSSID
[2] == 0xff) && (prNewKey
->arBSSID
[3] == 0xff)
404 && (prNewKey
->arBSSID
[4] == 0xff) && (prNewKey
->arBSSID
[5] == 0xff))) {
405 return WLAN_STATUS_INVALID_DATA
;
409 *pu4SetInfoLen
= u4SetBufferLen
;
411 /* fill CMD_802_11_KEY */
412 kalMemZero(&rCmdKey
, sizeof(CMD_802_11_KEY
));
413 rCmdKey
.ucAddRemove
= 1; /* add */
414 rCmdKey
.ucTxKey
= ((prNewKey
->u4KeyIndex
& IS_TRANSMIT_KEY
) == IS_TRANSMIT_KEY
) ? 1 : 0;
415 rCmdKey
.ucKeyType
= ((prNewKey
->u4KeyIndex
& IS_UNICAST_KEY
) == IS_UNICAST_KEY
) ? 1 : 0;
416 if (kalP2PGetRole(prAdapter
->prGlueInfo
) == 1) { /* group client */
417 rCmdKey
.ucIsAuthenticator
= 0;
418 } else { /* group owner */
419 rCmdKey
.ucIsAuthenticator
= 1;
421 COPY_MAC_ADDR(rCmdKey
.aucPeerAddr
, prNewKey
->arBSSID
);
422 rCmdKey
.ucNetType
= NETWORK_TYPE_P2P_INDEX
;
423 if (prNewKey
->u4KeyLength
== CCMP_KEY_LEN
)
424 rCmdKey
.ucAlgorithmId
= CIPHER_SUITE_CCMP
; /* AES */
425 else if (prNewKey
->u4KeyLength
== TKIP_KEY_LEN
)
426 rCmdKey
.ucAlgorithmId
= CIPHER_SUITE_TKIP
; /* TKIP */
427 rCmdKey
.ucKeyId
= (UINT_8
) (prNewKey
->u4KeyIndex
& 0xff);
428 rCmdKey
.ucKeyLen
= (UINT_8
) prNewKey
->u4KeyLength
;
429 kalMemCopy(rCmdKey
.aucKeyMaterial
, (PUINT_8
) prNewKey
->aucKeyMaterial
, rCmdKey
.ucKeyLen
);
431 return wlanoidSendSetQueryP2PCmd(prAdapter
,
432 CMD_ID_ADD_REMOVE_KEY
,
436 nicCmdEventSetCommon
,
438 sizeof(CMD_802_11_KEY
),
439 (PUINT_8
) &rCmdKey
, pvSetBuffer
, u4SetBufferLen
);
443 /*----------------------------------------------------------------------------*/
445 * \brief This routine is called to request Wi-Fi Direct driver to remove keys
447 * \param[in] prAdapter Pointer to the Adapter structure.
448 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
449 * \param[in] u4SetBufferLen The length of the set buffer.
450 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
451 * bytes read from the set buffer. If the call failed
452 * due to invalid length of the set buffer, returns
453 * the amount of storage needed.
455 * \retval WLAN_STATUS_SUCCESS
456 * \retval WLAN_STATUS_INVALID_DATA
457 * \retval WLAN_STATUS_INVALID_LENGTH
458 * \retval WLAN_STATUS_INVALID_DATA
460 /*----------------------------------------------------------------------------*/
462 wlanoidSetRemoveP2PKey(IN P_ADAPTER_T prAdapter
,
463 IN PVOID pvSetBuffer
, IN UINT_32 u4SetBufferLen
, OUT PUINT_32 pu4SetInfoLen
)
465 CMD_802_11_KEY rCmdKey
;
466 P_PARAM_REMOVE_KEY_T prRemovedKey
;
468 DEBUGFUNC("wlanoidSetRemoveP2PKey");
471 if (u4SetBufferLen
< sizeof(PARAM_REMOVE_KEY_T
)) {
472 return WLAN_STATUS_INVALID_LENGTH
;
476 prRemovedKey
= (P_PARAM_REMOVE_KEY_T
) pvSetBuffer
;
478 /* Check bit 31: this bit should always 0 */
479 if (prRemovedKey
->u4KeyIndex
& IS_TRANSMIT_KEY
) {
480 /* Bit 31 should not be set */
481 DBGLOG(REQ
, ERROR
, ("invalid key index: 0x%08lx\n", prRemovedKey
->u4KeyIndex
));
482 return WLAN_STATUS_INVALID_DATA
;
485 /* Check bits 8 ~ 29 should always be 0 */
486 if (prRemovedKey
->u4KeyIndex
& BITS(8, 29)) {
487 /* Bit 31 should not be set */
488 DBGLOG(REQ
, ERROR
, ("invalid key index: 0x%08lx\n", prRemovedKey
->u4KeyIndex
));
489 return WLAN_STATUS_INVALID_DATA
;
492 /* There should not be any key operation for P2P Device */
493 if (kalP2PGetRole(prAdapter
->prGlueInfo
) == 0) {
494 /* return WLAN_STATUS_NOT_ACCEPTED; */
497 kalMemZero((PUINT_8
) &rCmdKey
, sizeof(CMD_802_11_KEY
));
499 rCmdKey
.ucAddRemove
= 0; /* remove */
500 if (kalP2PGetRole(prAdapter
->prGlueInfo
) == 1) { /* group client */
501 rCmdKey
.ucIsAuthenticator
= 0;
502 } else { /* group owner */
503 rCmdKey
.ucIsAuthenticator
= 1;
505 kalMemCopy(rCmdKey
.aucPeerAddr
, (PUINT_8
) prRemovedKey
->arBSSID
, MAC_ADDR_LEN
);
506 rCmdKey
.ucNetType
= NETWORK_TYPE_P2P_INDEX
;
507 rCmdKey
.ucKeyId
= (UINT_8
) (prRemovedKey
->u4KeyIndex
& 0x000000ff);
509 return wlanoidSendSetQueryP2PCmd(prAdapter
,
510 CMD_ID_ADD_REMOVE_KEY
,
514 nicCmdEventSetCommon
,
516 sizeof(CMD_802_11_KEY
),
517 (PUINT_8
) &rCmdKey
, pvSetBuffer
, u4SetBufferLen
);
520 /*----------------------------------------------------------------------------*/
522 * \brief Setting the IP address for pattern search function.
524 * \param[in] prAdapter Pointer to the Adapter structure.
525 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
526 * \param[in] u4SetBufferLen The length of the set buffer.
527 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
528 * bytes read from the set buffer. If the call failed
529 * due to invalid length of the set buffer, returns
530 * the amount of storage needed.
532 * \return WLAN_STATUS_SUCCESS
533 * \return WLAN_STATUS_ADAPTER_NOT_READY
534 * \return WLAN_STATUS_INVALID_LENGTH
536 /*----------------------------------------------------------------------------*/
538 wlanoidSetP2pNetworkAddress(IN P_ADAPTER_T prAdapter
,
539 IN PVOID pvSetBuffer
,
540 IN UINT_32 u4SetBufferLen
, OUT PUINT_32 pu4SetInfoLen
)
542 WLAN_STATUS rStatus
= WLAN_STATUS_SUCCESS
;
544 P_CMD_SET_NETWORK_ADDRESS_LIST prCmdNetworkAddressList
;
545 P_PARAM_NETWORK_ADDRESS_LIST prNetworkAddressList
=
546 (P_PARAM_NETWORK_ADDRESS_LIST
) pvSetBuffer
;
547 P_PARAM_NETWORK_ADDRESS prNetworkAddress
;
548 P_PARAM_NETWORK_ADDRESS_IP prNetAddrIp
;
549 UINT_32 u4IpAddressCount
, u4CmdSize
;
551 DEBUGFUNC("wlanoidSetP2pNetworkAddress");
552 DBGLOG(INIT
, TRACE
, ("\n"));
555 ASSERT(pu4SetInfoLen
);
559 if (u4SetBufferLen
< sizeof(PARAM_NETWORK_ADDRESS_LIST
)) {
560 return WLAN_STATUS_INVALID_DATA
;
564 u4IpAddressCount
= 0;
566 prNetworkAddress
= prNetworkAddressList
->arAddress
;
567 for (i
= 0; i
< prNetworkAddressList
->u4AddressCount
; i
++) {
568 if (prNetworkAddress
->u2AddressType
== PARAM_PROTOCOL_ID_TCP_IP
&&
569 prNetworkAddress
->u2AddressLength
== sizeof(PARAM_NETWORK_ADDRESS_IP
)) {
573 prNetworkAddress
= (P_PARAM_NETWORK_ADDRESS
) ((UINT_32
) prNetworkAddress
+
574 (UINT_32
) (prNetworkAddress
->
577 (PARAM_NETWORK_ADDRESS
,
581 /* construct payload of command packet */
582 u4CmdSize
= OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST
, arNetAddress
) +
583 sizeof(IPV4_NETWORK_ADDRESS
) * u4IpAddressCount
;
585 prCmdNetworkAddressList
=
586 (P_CMD_SET_NETWORK_ADDRESS_LIST
) kalMemAlloc(u4CmdSize
, VIR_MEM_TYPE
);
588 if (prCmdNetworkAddressList
== NULL
)
589 return WLAN_STATUS_FAILURE
;
591 /* fill P_CMD_SET_NETWORK_ADDRESS_LIST */
592 prCmdNetworkAddressList
->ucNetTypeIndex
= NETWORK_TYPE_P2P_INDEX
;
593 prCmdNetworkAddressList
->ucAddressCount
= (UINT_8
) u4IpAddressCount
;
594 prNetworkAddress
= prNetworkAddressList
->arAddress
;
595 for (i
= 0, j
= 0; i
< prNetworkAddressList
->u4AddressCount
; i
++) {
596 if (prNetworkAddress
->u2AddressType
== PARAM_PROTOCOL_ID_TCP_IP
&&
597 prNetworkAddress
->u2AddressLength
== sizeof(PARAM_NETWORK_ADDRESS_IP
)) {
598 prNetAddrIp
= (P_PARAM_NETWORK_ADDRESS_IP
) prNetworkAddress
->aucAddress
;
600 kalMemCopy(prCmdNetworkAddressList
->arNetAddress
[j
].aucIpAddr
,
601 &(prNetAddrIp
->in_addr
), sizeof(UINT_32
));
606 prNetworkAddress
= (P_PARAM_NETWORK_ADDRESS
) ((UINT_32
) prNetworkAddress
+
607 (UINT_32
) (prNetworkAddress
->
610 (PARAM_NETWORK_ADDRESS
,
614 rStatus
= wlanSendSetQueryCmd(prAdapter
,
615 CMD_ID_SET_IP_ADDRESS
,
619 nicCmdEventSetIpAddress
,
620 nicOidCmdTimeoutCommon
,
622 (PUINT_8
) prCmdNetworkAddressList
,
623 pvSetBuffer
, u4SetBufferLen
);
625 kalMemFree(prCmdNetworkAddressList
, VIR_MEM_TYPE
, u4CmdSize
);
629 /*----------------------------------------------------------------------------*/
631 * \brief This routine is used to query the power save profile.
633 * \param[in] prAdapter Pointer to the Adapter structure.
634 * \param[out] pvQueryBuf A pointer to the buffer that holds the result of
636 * \param[in] u4QueryBufLen The length of the query buffer.
637 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
638 * bytes written into the query buffer. If the call
639 * failed due to invalid length of the query buffer,
640 * returns the amount of storage needed.
642 * \return WLAN_STATUS_SUCCESS
644 /*----------------------------------------------------------------------------*/
646 wlanoidQueryP2pPowerSaveProfile(IN P_ADAPTER_T prAdapter
,
647 IN PVOID pvQueryBuffer
,
648 IN UINT_32 u4QueryBufferLen
, OUT PUINT_32 pu4QueryInfoLen
)
650 DEBUGFUNC("wlanoidQueryP2pPowerSaveProfile");
653 ASSERT(pu4QueryInfoLen
);
655 if (u4QueryBufferLen
!= 0) {
656 ASSERT(pvQueryBuffer
);
658 *(PPARAM_POWER_MODE
) pvQueryBuffer
=
659 (PARAM_POWER_MODE
) (prAdapter
->rWlanInfo
.
660 arPowerSaveMode
[NETWORK_TYPE_P2P_INDEX
].ucPsProfile
);
661 *pu4QueryInfoLen
= sizeof(PARAM_POWER_MODE
);
664 return WLAN_STATUS_SUCCESS
;
667 /*----------------------------------------------------------------------------*/
669 * \brief This routine is used to set the power save profile.
671 * \param[in] pvAdapter Pointer to the Adapter structure.
672 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
673 * \param[in] u4SetBufferLen The length of the set buffer.
674 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
675 * bytes read from the set buffer. If the call failed
676 * due to invalid length of the set buffer, returns
677 * the amount of storage needed.
679 * \retval WLAN_STATUS_SUCCESS
680 * \retval WLAN_STATUS_INVALID_LENGTH
682 /*----------------------------------------------------------------------------*/
684 wlanoidSetP2pPowerSaveProfile(IN P_ADAPTER_T prAdapter
,
685 IN PVOID pvSetBuffer
,
686 IN UINT_32 u4SetBufferLen
, OUT PUINT_32 pu4SetInfoLen
)
689 PARAM_POWER_MODE ePowerMode
;
690 DEBUGFUNC("wlanoidSetP2pPowerSaveProfile");
693 ASSERT(pu4SetInfoLen
);
695 *pu4SetInfoLen
= sizeof(PARAM_POWER_MODE
);
696 if (u4SetBufferLen
< sizeof(PARAM_POWER_MODE
)) {
697 DBGLOG(REQ
, WARN
, ("Invalid length %ld\n", u4SetBufferLen
));
698 return WLAN_STATUS_INVALID_LENGTH
;
699 } else if (*(PPARAM_POWER_MODE
) pvSetBuffer
>= Param_PowerModeMax
) {
700 WARNLOG(("Invalid power mode %d\n", *(PPARAM_POWER_MODE
) pvSetBuffer
));
701 return WLAN_STATUS_INVALID_DATA
;
704 ePowerMode
= *(PPARAM_POWER_MODE
) pvSetBuffer
;
706 if (prAdapter
->fgEnCtiaPowerMode
) {
707 if (ePowerMode
== Param_PowerModeCAM
) {
710 /* User setting to PS mode (Param_PowerModeMAX_PSP or Param_PowerModeFast_PSP) */
712 if (prAdapter
->u4CtiaPowerMode
== 0) {
713 /* force to keep in CAM mode */
714 ePowerMode
= Param_PowerModeCAM
;
715 } else if (prAdapter
->u4CtiaPowerMode
== 1) {
716 ePowerMode
= Param_PowerModeMAX_PSP
;
717 } else if (prAdapter
->u4CtiaPowerMode
== 2) {
718 ePowerMode
= Param_PowerModeFast_PSP
;
723 status
= nicConfigPowerSaveProfile(prAdapter
, NETWORK_TYPE_P2P_INDEX
, ePowerMode
, TRUE
);
725 } /* end of wlanoidSetP2pPowerSaveProfile() */
727 /*----------------------------------------------------------------------------*/
729 * \brief This routine is used to set the power save profile.
731 * \param[in] pvAdapter Pointer to the Adapter structure.
732 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
733 * \param[in] u4SetBufferLen The length of the set buffer.
734 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
735 * bytes read from the set buffer. If the call failed
736 * due to invalid length of the set buffer, returns
737 * the amount of storage needed.
739 * \retval WLAN_STATUS_SUCCESS
740 * \retval WLAN_STATUS_INVALID_LENGTH
742 /*----------------------------------------------------------------------------*/
744 wlanoidSetP2pSetNetworkAddress(IN P_ADAPTER_T prAdapter
,
745 IN PVOID pvSetBuffer
,
746 IN UINT_32 u4SetBufferLen
, OUT PUINT_32 pu4SetInfoLen
)
748 WLAN_STATUS rStatus
= WLAN_STATUS_SUCCESS
;
750 P_CMD_SET_NETWORK_ADDRESS_LIST prCmdNetworkAddressList
;
751 P_PARAM_NETWORK_ADDRESS_LIST prNetworkAddressList
=
752 (P_PARAM_NETWORK_ADDRESS_LIST
) pvSetBuffer
;
753 P_PARAM_NETWORK_ADDRESS prNetworkAddress
;
754 P_PARAM_NETWORK_ADDRESS_IP prNetAddrIp
;
755 UINT_32 u4IpAddressCount
, u4CmdSize
;
756 PUINT_8 pucBuf
= (PUINT_8
) pvSetBuffer
;
758 DEBUGFUNC("wlanoidSetP2pSetNetworkAddress");
759 DBGLOG(INIT
, TRACE
, ("\n"));
760 printk("wlanoidSetP2pSetNetworkAddress (%d)\n", (INT_16
) u4SetBufferLen
);
763 ASSERT(pu4SetInfoLen
);
767 if (u4SetBufferLen
< sizeof(PARAM_NETWORK_ADDRESS_LIST
)) {
768 return WLAN_STATUS_INVALID_DATA
;
772 u4IpAddressCount
= 0;
774 prNetworkAddress
= prNetworkAddressList
->arAddress
;
775 for (i
= 0; i
< prNetworkAddressList
->u4AddressCount
; i
++) {
776 if (prNetworkAddress
->u2AddressType
== PARAM_PROTOCOL_ID_TCP_IP
&&
777 prNetworkAddress
->u2AddressLength
== sizeof(PARAM_NETWORK_ADDRESS_IP
)) {
781 prNetworkAddress
= (P_PARAM_NETWORK_ADDRESS
) ((UINT_32
) prNetworkAddress
+
782 (UINT_32
) (prNetworkAddress
->
785 (PARAM_NETWORK_ADDRESS
,
789 /* construct payload of command packet */
790 u4CmdSize
= OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST
, arNetAddress
) +
791 sizeof(IPV4_NETWORK_ADDRESS
) * u4IpAddressCount
;
793 if (u4IpAddressCount
== 0) {
794 u4CmdSize
= sizeof(CMD_SET_NETWORK_ADDRESS_LIST
);
797 prCmdNetworkAddressList
=
798 (P_CMD_SET_NETWORK_ADDRESS_LIST
) kalMemAlloc(u4CmdSize
, VIR_MEM_TYPE
);
800 if (prCmdNetworkAddressList
== NULL
)
801 return WLAN_STATUS_FAILURE
;
803 /* fill P_CMD_SET_NETWORK_ADDRESS_LIST */
804 prCmdNetworkAddressList
->ucNetTypeIndex
= NETWORK_TYPE_P2P_INDEX
;
806 /* only to set IP address to FW once ARP filter is enabled */
807 if (prAdapter
->fgEnArpFilter
) {
808 prCmdNetworkAddressList
->ucAddressCount
= (UINT_8
) u4IpAddressCount
;
809 prNetworkAddress
= prNetworkAddressList
->arAddress
;
811 printk("u4IpAddressCount (%ld)\n", (INT_32
) u4IpAddressCount
);
812 for (i
= 0, j
= 0; i
< prNetworkAddressList
->u4AddressCount
; i
++) {
813 if (prNetworkAddress
->u2AddressType
== PARAM_PROTOCOL_ID_TCP_IP
&&
814 prNetworkAddress
->u2AddressLength
== sizeof(PARAM_NETWORK_ADDRESS_IP
)) {
816 (P_PARAM_NETWORK_ADDRESS_IP
) prNetworkAddress
->aucAddress
;
818 kalMemCopy(prCmdNetworkAddressList
->arNetAddress
[j
].aucIpAddr
,
819 &(prNetAddrIp
->in_addr
), sizeof(UINT_32
));
823 pucBuf
= (PUINT_8
) &prNetAddrIp
->in_addr
;
824 printk("prNetAddrIp->in_addr:%d:%d:%d:%d\n", (UINT_8
) pucBuf
[0],
825 (UINT_8
) pucBuf
[1], (UINT_8
) pucBuf
[2], (UINT_8
) pucBuf
[3]);
828 prNetworkAddress
= (P_PARAM_NETWORK_ADDRESS
) ((UINT_32
) prNetworkAddress
+
829 (UINT_32
) (prNetworkAddress
->
832 (PARAM_NETWORK_ADDRESS
,
837 prCmdNetworkAddressList
->ucAddressCount
= 0;
840 rStatus
= wlanSendSetQueryCmd(prAdapter
,
841 CMD_ID_SET_IP_ADDRESS
,
845 nicCmdEventSetIpAddress
,
846 nicOidCmdTimeoutCommon
,
848 (PUINT_8
) prCmdNetworkAddressList
,
849 pvSetBuffer
, u4SetBufferLen
);
851 kalMemFree(prCmdNetworkAddressList
, VIR_MEM_TYPE
, u4CmdSize
);
853 } /* end of wlanoidSetP2pSetNetworkAddress() */
856 /*----------------------------------------------------------------------------*/
858 * \brief This routine is called to set Multicast Address List.
860 * \param[in] prAdapter Pointer to the Adapter structure.
861 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
862 * \param[in] u4SetBufferLen The length of the set buffer.
863 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
864 * bytes read from the set buffer. If the call failed
865 * due to invalid length of the set buffer, returns
866 * the amount of storage needed.
868 * \retval WLAN_STATUS_SUCCESS
869 * \retval WLAN_STATUS_INVALID_LENGTH
870 * \retval WLAN_STATUS_ADAPTER_NOT_READY
871 * \retval WLAN_STATUS_MULTICAST_FULL
873 /*----------------------------------------------------------------------------*/
875 wlanoidSetP2PMulticastList(IN P_ADAPTER_T prAdapter
,
876 IN PVOID pvSetBuffer
,
877 IN UINT_32 u4SetBufferLen
, OUT PUINT_32 pu4SetInfoLen
)
879 CMD_MAC_MCAST_ADDR rCmdMacMcastAddr
;
881 ASSERT(pu4SetInfoLen
);
883 /* The data must be a multiple of the Ethernet address size. */
884 if ((u4SetBufferLen
% MAC_ADDR_LEN
)) {
885 DBGLOG(REQ
, WARN
, ("Invalid MC list length %ld\n", u4SetBufferLen
));
887 *pu4SetInfoLen
= (((u4SetBufferLen
+ MAC_ADDR_LEN
) - 1) /
888 MAC_ADDR_LEN
) * MAC_ADDR_LEN
;
890 return WLAN_STATUS_INVALID_LENGTH
;
893 *pu4SetInfoLen
= u4SetBufferLen
;
895 /* Verify if we can support so many multicast addresses. */
896 if ((u4SetBufferLen
/ MAC_ADDR_LEN
) > MAX_NUM_GROUP_ADDR
) {
897 DBGLOG(REQ
, WARN
, ("Too many MC addresses\n"));
899 return WLAN_STATUS_MULTICAST_FULL
;
902 /* NOTE(Kevin): Windows may set u4SetBufferLen == 0 &&
903 * pvSetBuffer == NULL to clear exist Multicast List.
905 if (u4SetBufferLen
) {
909 if (prAdapter
->rAcpiState
== ACPI_STATE_D3
) {
911 ("Fail in set multicast list! (Adapter not ready). ACPI=D%d, Radio=%d\n",
912 prAdapter
->rAcpiState
, prAdapter
->fgIsRadioOff
));
913 return WLAN_STATUS_ADAPTER_NOT_READY
;
916 rCmdMacMcastAddr
.u4NumOfGroupAddr
= u4SetBufferLen
/ MAC_ADDR_LEN
;
917 rCmdMacMcastAddr
.ucNetTypeIndex
= NETWORK_TYPE_P2P_INDEX
;
918 kalMemCopy(rCmdMacMcastAddr
.arAddress
, pvSetBuffer
, u4SetBufferLen
);
920 return wlanoidSendSetQueryP2PCmd(prAdapter
, CMD_ID_MAC_MCAST_ADDR
, TRUE
, FALSE
, FALSE
, /* This CMD response is no need to complete the OID. Or the event would unsync. */
921 nicCmdEventSetCommon
,
922 nicOidCmdTimeoutCommon
,
923 sizeof(CMD_MAC_MCAST_ADDR
),
924 (PUINT_8
) &rCmdMacMcastAddr
, pvSetBuffer
, u4SetBufferLen
);
926 } /* end of wlanoidSetP2PMulticastList() */
929 /*----------------------------------------------------------------------------*/
931 * \brief This routine is called to send GAS frame for P2P Service Discovery Request
933 * \param[in] prAdapter Pointer to the Adapter structure.
934 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
935 * \param[in] u4SetBufferLen The length of the set buffer.
936 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
937 * bytes read from the set buffer. If the call failed
938 * due to invalid length of the set buffer, returns
939 * the amount of storage needed.
941 * \retval WLAN_STATUS_SUCCESS
942 * \retval WLAN_STATUS_INVALID_LENGTH
943 * \retval WLAN_STATUS_ADAPTER_NOT_READY
944 * \retval WLAN_STATUS_MULTICAST_FULL
946 /*----------------------------------------------------------------------------*/
948 wlanoidSendP2PSDRequest(IN P_ADAPTER_T prAdapter
,
949 IN PVOID pvSetBuffer
, IN UINT_32 u4SetBufferLen
, OUT PUINT_32 pu4SetInfoLen
)
951 WLAN_STATUS rWlanStatus
= WLAN_STATUS_SUCCESS
;
953 ASSERT(pu4SetInfoLen
);
955 if (u4SetBufferLen
) {
959 if (u4SetBufferLen
< sizeof(PARAM_P2P_SEND_SD_REQUEST
)) {
960 *pu4SetInfoLen
= sizeof(PARAM_P2P_SEND_SD_REQUEST
);
961 return WLAN_STATUS_BUFFER_TOO_SHORT
;
963 /* rWlanStatus = p2pFsmRunEventSDRequest(prAdapter, (P_PARAM_P2P_SEND_SD_REQUEST)pvSetBuffer); */
966 } /* end of wlanoidSendP2PSDRequest() */
969 /*----------------------------------------------------------------------------*/
971 * \brief This routine is called to send GAS frame for P2P Service Discovery Response
973 * \param[in] prAdapter Pointer to the Adapter structure.
974 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
975 * \param[in] u4SetBufferLen The length of the set buffer.
976 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
977 * bytes read from the set buffer. If the call failed
978 * due to invalid length of the set buffer, returns
979 * the amount of storage needed.
981 * \retval WLAN_STATUS_SUCCESS
982 * \retval WLAN_STATUS_INVALID_LENGTH
983 * \retval WLAN_STATUS_ADAPTER_NOT_READY
984 * \retval WLAN_STATUS_MULTICAST_FULL
986 /*----------------------------------------------------------------------------*/
988 wlanoidSendP2PSDResponse(IN P_ADAPTER_T prAdapter
,
989 IN PVOID pvSetBuffer
,
990 IN UINT_32 u4SetBufferLen
, OUT PUINT_32 pu4SetInfoLen
)
992 WLAN_STATUS rWlanStatus
= WLAN_STATUS_SUCCESS
;
994 ASSERT(pu4SetInfoLen
);
996 if (u4SetBufferLen
) {
1000 if (u4SetBufferLen
< sizeof(PARAM_P2P_SEND_SD_RESPONSE
)) {
1001 *pu4SetInfoLen
= sizeof(PARAM_P2P_SEND_SD_RESPONSE
);
1002 return WLAN_STATUS_BUFFER_TOO_SHORT
;
1004 /* rWlanStatus = p2pFsmRunEventSDResponse(prAdapter, (P_PARAM_P2P_SEND_SD_RESPONSE)pvSetBuffer); */
1007 } /* end of wlanoidGetP2PSDRequest() */
1010 /*----------------------------------------------------------------------------*/
1012 * \brief This routine is called to get GAS frame for P2P Service Discovery Request
1014 * \param[in] prAdapter Pointer to the Adapter structure.
1015 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
1017 * \param[in] u4QueryBufferLen The length of the query buffer.
1018 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1019 * bytes written into the query buffer. If the call
1020 * failed due to invalid length of the query buffer,
1021 * returns the amount of storage needed.
1023 * \retval WLAN_STATUS_SUCCESS
1024 * \retval WLAN_STATUS_INVALID_LENGTH
1025 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1026 * \retval WLAN_STATUS_MULTICAST_FULL
1028 /*----------------------------------------------------------------------------*/
1030 wlanoidGetP2PSDRequest(IN P_ADAPTER_T prAdapter
,
1031 IN PVOID pvQueryBuffer
,
1032 IN UINT_32 u4QueryBufferLen
, OUT PUINT_32 pu4QueryInfoLen
)
1034 WLAN_STATUS rWlanStatus
= WLAN_STATUS_SUCCESS
;
1035 PUINT_8 pucPacketBuffer
= NULL
, pucTA
= NULL
;
1036 /* PUINT_8 pucChannelNum = NULL; */
1037 PUINT_16 pu2PacketLength
= NULL
;
1038 P_WLAN_MAC_HEADER_T prWlanHdr
= (P_WLAN_MAC_HEADER_T
) NULL
;
1039 UINT_8 ucVersionNum
= 0;
1040 /* UINT_8 ucChannelNum = 0, ucSeqNum = 0; */
1043 ASSERT(pu4QueryInfoLen
);
1045 if (u4QueryBufferLen
) {
1046 ASSERT(pvQueryBuffer
);
1049 if (u4QueryBufferLen
< sizeof(PARAM_P2P_GET_SD_REQUEST
)) {
1050 *pu4QueryInfoLen
= sizeof(PARAM_P2P_GET_SD_REQUEST
);
1051 return WLAN_STATUS_BUFFER_TOO_SHORT
;
1054 DBGLOG(P2P
, TRACE
, ("Get Service Discovery Request\n"));
1056 if ((ucVersionNum
= p2pFuncGetVersionNumOfSD(prAdapter
)) == 0) {
1057 P_PARAM_P2P_GET_SD_REQUEST prP2pGetSdReq
=
1058 (P_PARAM_P2P_GET_SD_REQUEST
) pvQueryBuffer
;
1060 pucPacketBuffer
= prP2pGetSdReq
->aucPacketContent
;
1061 pu2PacketLength
= &prP2pGetSdReq
->u2PacketLength
;
1062 pucTA
= &prP2pGetSdReq
->rTransmitterAddr
;
1064 P_PARAM_P2P_GET_SD_REQUEST_EX prP2pGetSdReqEx
=
1065 (P_PARAM_P2P_GET_SD_REQUEST_EX
) NULL
;
1067 prP2pGetSdReqEx
= (P_PARAM_P2P_GET_SD_REQUEST
) pvQueryBuffer
;
1068 pucPacketBuffer
= prP2pGetSdReqEx
->aucPacketContent
;
1069 pu2PacketLength
= &prP2pGetSdReqEx
->u2PacketLength
;
1070 pucTA
= &prP2pGetSdReqEx
->rTransmitterAddr
;
1071 pucChannelNum
= &prP2pGetSdReqEx
->ucChannelNum
;
1072 ucSeqNum
= prP2pGetSdReqEx
->ucSeqNum
;
1076 rWlanStatus
= p2pFuncGetServiceDiscoveryFrame(prAdapter
,
1079 sizeof(PARAM_P2P_GET_SD_REQUEST
)),
1080 (PUINT_32
) pu2PacketLength
, pucChannelNum
,
1083 *pu4QueryInfoLen
= 0;
1087 prWlanHdr
= (P_WLAN_MAC_HEADER_T
) pucPacketBuffer
;
1089 kalMemCopy(pucTA
, prWlanHdr
->aucAddr2
, MAC_ADDR_LEN
);
1091 if (pu4QueryInfoLen
) {
1092 if (ucVersionNum
== 0) {
1094 (UINT_32
) (sizeof(PARAM_P2P_GET_SD_REQUEST
) + (*pu2PacketLength
));
1097 (UINT_32
) (sizeof(PARAM_P2P_GET_SD_REQUEST_EX
) + (*pu2PacketLength
));
1103 } /* end of wlanoidGetP2PSDRequest() */
1106 /*----------------------------------------------------------------------------*/
1108 * \brief This routine is called to get GAS frame for P2P Service Discovery Response
1110 * \param[in] prAdapter Pointer to the Adapter structure.
1111 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
1113 * \param[in] u4QueryBufferLen The length of the query buffer.
1114 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1115 * bytes written into the query buffer. If the call
1116 * failed due to invalid length of the query buffer,
1117 * returns the amount of storage needed.
1119 * \retval WLAN_STATUS_SUCCESS
1120 * \retval WLAN_STATUS_INVALID_LENGTH
1121 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1122 * \retval WLAN_STATUS_MULTICAST_FULL
1124 /*----------------------------------------------------------------------------*/
1126 wlanoidGetP2PSDResponse(IN P_ADAPTER_T prAdapter
,
1127 IN PVOID pvQueryBuffer
,
1128 IN UINT_32 u4QueryBufferLen
, OUT PUINT_32 pu4QueryInfoLen
)
1130 WLAN_STATUS rWlanStatus
= WLAN_STATUS_SUCCESS
;
1131 P_WLAN_MAC_HEADER_T prWlanHdr
= (P_WLAN_MAC_HEADER_T
) NULL
;
1132 /* UINT_8 ucSeqNum = 0, */
1133 UINT_8 ucVersionNum
= 0;
1134 PUINT_8 pucPacketContent
= (PUINT_8
) NULL
, pucTA
= (PUINT_8
) NULL
;
1135 PUINT_16 pu2PacketLength
= (PUINT_16
) NULL
;
1138 ASSERT(pu4QueryInfoLen
);
1140 if (u4QueryBufferLen
) {
1141 ASSERT(pvQueryBuffer
);
1144 if (u4QueryBufferLen
< sizeof(PARAM_P2P_GET_SD_RESPONSE
)) {
1145 *pu4QueryInfoLen
= sizeof(PARAM_P2P_GET_SD_RESPONSE
);
1146 return WLAN_STATUS_BUFFER_TOO_SHORT
;
1149 DBGLOG(P2P
, TRACE
, ("Get Service Discovery Response\n"));
1152 if ((ucVersionNum
= p2pFuncGetVersionNumOfSD(prAdapter
)) == 0) {
1153 P_PARAM_P2P_GET_SD_RESPONSE prP2pGetSdRsp
= (P_PARAM_P2P_GET_SD_RESPONSE
) NULL
;
1155 prP2pGetSdRsp
= (P_PARAM_P2P_GET_SD_REQUEST
) pvQueryBuffer
;
1156 pucPacketContent
= prP2pGetSdRsp
->aucPacketContent
;
1157 pucTA
= &prP2pGetSdRsp
->rTransmitterAddr
;
1158 pu2PacketLength
= &prP2pGetSdRsp
->u2PacketLength
;
1160 P_PARAM_P2P_GET_SD_RESPONSE_EX prP2pGetSdRspEx
=
1161 (P_PARAM_P2P_GET_SD_RESPONSE_EX
) NULL
;
1163 prP2pGetSdRspEx
= (P_PARAM_P2P_GET_SD_RESPONSE_EX
) pvQueryBuffer
;
1164 pucPacketContent
= prP2pGetSdRspEx
->aucPacketContent
;
1165 pucTA
= &prP2pGetSdRspEx
->rTransmitterAddr
;
1166 pu2PacketLength
= &prP2pGetSdRspEx
->u2PacketLength
;
1167 ucSeqNum
= prP2pGetSdRspEx
->ucSeqNum
;
1171 /* rWlanStatus = p2pFuncGetServiceDiscoveryFrame(prAdapter, */
1172 /* pucPacketContent, */
1173 /* (u4QueryBufferLen - sizeof(PARAM_P2P_GET_SD_RESPONSE)), */
1174 /* (PUINT_32)pu2PacketLength, */
1178 *pu4QueryInfoLen
= 0;
1181 prWlanHdr
= (P_WLAN_MAC_HEADER_T
) pucPacketContent
;
1183 kalMemCopy(pucTA
, prWlanHdr
->aucAddr2
, MAC_ADDR_LEN
);
1186 if (pu4QueryInfoLen
) {
1187 if (ucVersionNum
== 0) {
1189 (UINT_32
) (sizeof(PARAM_P2P_GET_SD_RESPONSE
) + *pu2PacketLength
);
1192 (UINT_32
) (sizeof(PARAM_P2P_GET_SD_RESPONSE_EX
) + *pu2PacketLength
);
1197 } /* end of wlanoidGetP2PSDResponse() */
1200 /*----------------------------------------------------------------------------*/
1202 * \brief This routine is called to terminate P2P Service Discovery Phase
1204 * \param[in] prAdapter Pointer to the Adapter structure.
1205 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
1206 * \param[in] u4SetBufferLen The length of the set buffer.
1207 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1208 * bytes read from the set buffer. If the call failed
1209 * due to invalid length of the set buffer, returns
1210 * the amount of storage needed.
1212 * \retval WLAN_STATUS_SUCCESS
1213 * \retval WLAN_STATUS_INVALID_LENGTH
1214 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1215 * \retval WLAN_STATUS_MULTICAST_FULL
1217 /*----------------------------------------------------------------------------*/
1219 wlanoidSetP2PTerminateSDPhase(IN P_ADAPTER_T prAdapter
,
1220 IN PVOID pvSetBuffer
,
1221 IN UINT_32 u4SetBufferLen
, OUT PUINT_32 pu4SetInfoLen
)
1223 WLAN_STATUS rWlanStatus
= WLAN_STATUS_SUCCESS
;
1224 P_PARAM_P2P_TERMINATE_SD_PHASE prP2pTerminateSD
= (P_PARAM_P2P_TERMINATE_SD_PHASE
) NULL
;
1225 UINT_8 aucNullAddr
[] = NULL_MAC_ADDR
;
1228 if ((prAdapter
== NULL
) || (pu4SetInfoLen
== NULL
)) {
1233 if ((u4SetBufferLen
) && (pvSetBuffer
== NULL
)) {
1237 if (u4SetBufferLen
< sizeof(PARAM_P2P_TERMINATE_SD_PHASE
)) {
1238 *pu4SetInfoLen
= sizeof(PARAM_P2P_TERMINATE_SD_PHASE
);
1239 rWlanStatus
= WLAN_STATUS_BUFFER_TOO_SHORT
;
1243 prP2pTerminateSD
= (P_PARAM_P2P_TERMINATE_SD_PHASE
) pvSetBuffer
;
1245 if (EQUAL_MAC_ADDR(prP2pTerminateSD
->rPeerAddr
, aucNullAddr
)) {
1246 DBGLOG(P2P
, TRACE
, ("Service Discovery Version 2.0\n"));
1247 /* p2pFuncSetVersionNumOfSD(prAdapter, 2); */
1249 /* rWlanStatus = p2pFsmRunEventSDAbort(prAdapter); */
1258 } /* end of wlanoidSetP2PTerminateSDPhase() */
1261 #if CFG_SUPPORT_ANTI_PIRACY
1262 /*----------------------------------------------------------------------------*/
1264 * \brief This routine is called to
1266 * \param[in] prAdapter Pointer to the Adapter structure.
1267 * \param[in] pvSetBuffer Pointer to the buffer that holds the data to be set.
1268 * \param[in] u4SetBufferLen The length of the set buffer.
1269 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1270 * bytes read from the set buffer. If the call failed
1271 * due to invalid length of the set buffer, returns
1272 * the amount of storage needed.
1274 * \retval WLAN_STATUS_SUCCESS
1275 * \retval WLAN_STATUS_INVALID_LENGTH
1276 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1277 * \retval WLAN_STATUS_MULTICAST_FULL
1279 /*----------------------------------------------------------------------------*/
1281 wlanoidSetSecCheckRequest(IN P_ADAPTER_T prAdapter
,
1282 IN PVOID pvSetBuffer
,
1283 IN UINT_32 u4SetBufferLen
, OUT PUINT_32 pu4SetInfoLen
)
1286 ASSERT(pu4SetInfoLen
);
1288 if (u4SetBufferLen
) {
1289 ASSERT(pvSetBuffer
);
1292 return wlanoidSendSetQueryP2PCmd(prAdapter
,
1298 nicOidCmdTimeoutCommon
,
1300 (PUINT_8
) pvSetBuffer
, pvSetBuffer
, u4SetBufferLen
);
1302 } /* end of wlanoidSetSecCheckRequest() */
1305 /*----------------------------------------------------------------------------*/
1307 * \brief This routine is called to
1309 * \param[in] prAdapter Pointer to the Adapter structure.
1310 * \param[out] pvQueryBuffer A pointer to the buffer that holds the result of
1312 * \param[in] u4QueryBufferLen The length of the query buffer.
1313 * \param[out] pu4QueryInfoLen If the call is successful, returns the number of
1314 * bytes written into the query buffer. If the call
1315 * failed due to invalid length of the query buffer,
1316 * returns the amount of storage needed.
1318 * \retval WLAN_STATUS_SUCCESS
1319 * \retval WLAN_STATUS_INVALID_LENGTH
1320 * \retval WLAN_STATUS_ADAPTER_NOT_READY
1321 * \retval WLAN_STATUS_MULTICAST_FULL
1323 /*----------------------------------------------------------------------------*/
1325 wlanoidGetSecCheckResponse(IN P_ADAPTER_T prAdapter
,
1326 IN PVOID pvQueryBuffer
,
1327 IN UINT_32 u4QueryBufferLen
, OUT PUINT_32 pu4QueryInfoLen
)
1329 WLAN_STATUS rWlanStatus
= WLAN_STATUS_SUCCESS
;
1330 /* P_WLAN_MAC_HEADER_T prWlanHdr = (P_WLAN_MAC_HEADER_T)NULL; */
1331 P_GLUE_INFO_T prGlueInfo
;
1333 prGlueInfo
= prAdapter
->prGlueInfo
;
1336 ASSERT(pu4QueryInfoLen
);
1338 if (u4QueryBufferLen
) {
1339 ASSERT(pvQueryBuffer
);
1342 if (u4QueryBufferLen
> 256) {
1343 u4QueryBufferLen
= 256;
1346 *pu4QueryInfoLen
= u4QueryBufferLen
;
1349 DBGLOG_MEM8(SEC
, LOUD
, prGlueInfo
->prP2PInfo
->aucSecCheckRsp
, u4QueryBufferLen
);
1351 kalMemCopy((PUINT_8
) (pvQueryBuffer
+ OFFSET_OF(IW_P2P_TRANSPORT_STRUCT
, aucBuffer
)),
1352 prGlueInfo
->prP2PInfo
->aucSecCheckRsp
, u4QueryBufferLen
);
1355 } /* end of wlanoidGetSecCheckResponse() */
1359 wlanoidSetNoaParam(IN P_ADAPTER_T prAdapter
,
1360 IN PVOID pvSetBuffer
, IN UINT_32 u4SetBufferLen
, OUT PUINT_32 pu4SetInfoLen
)
1362 P_PARAM_CUSTOM_NOA_PARAM_STRUC_T prNoaParam
;
1363 CMD_CUSTOM_NOA_PARAM_STRUC_T rCmdNoaParam
;
1365 DEBUGFUNC("wlanoidSetNoaParam");
1366 DBGLOG(INIT
, TRACE
, ("\n"));
1369 ASSERT(pu4SetInfoLen
);
1371 *pu4SetInfoLen
= sizeof(PARAM_CUSTOM_NOA_PARAM_STRUC_T
);
1373 if (u4SetBufferLen
< sizeof(PARAM_CUSTOM_NOA_PARAM_STRUC_T
)) {
1374 return WLAN_STATUS_INVALID_LENGTH
;
1377 ASSERT(pvSetBuffer
);
1379 prNoaParam
= (P_PARAM_CUSTOM_NOA_PARAM_STRUC_T
) pvSetBuffer
;
1381 kalMemZero(&rCmdNoaParam
, sizeof(CMD_CUSTOM_NOA_PARAM_STRUC_T
));
1382 rCmdNoaParam
.u4NoaDurationMs
= prNoaParam
->u4NoaDurationMs
;
1383 rCmdNoaParam
.u4NoaIntervalMs
= prNoaParam
->u4NoaIntervalMs
;
1384 rCmdNoaParam
.u4NoaCount
= prNoaParam
->u4NoaCount
;
1387 return wlanSendSetQueryCmd(prAdapter
,
1388 CMD_ID_SET_NOA_PARAM
,
1392 nicCmdEventSetCommon
,
1393 nicOidCmdTimeoutCommon
,
1394 sizeof(CMD_CUSTOM_NOA_PARAM_STRUC_T
),
1395 (PUINT_8
) &rCmdNoaParam
, pvSetBuffer
, u4SetBufferLen
);
1397 return wlanoidSendSetQueryP2PCmd(prAdapter
,
1398 CMD_ID_SET_NOA_PARAM
,
1403 nicOidCmdTimeoutCommon
,
1404 sizeof(CMD_CUSTOM_NOA_PARAM_STRUC_T
),
1405 (PUINT_8
) &rCmdNoaParam
, pvSetBuffer
, u4SetBufferLen
);
1412 wlanoidSetOppPsParam(IN P_ADAPTER_T prAdapter
,
1413 IN PVOID pvSetBuffer
, IN UINT_32 u4SetBufferLen
, OUT PUINT_32 pu4SetInfoLen
)
1415 P_PARAM_CUSTOM_OPPPS_PARAM_STRUC_T prOppPsParam
;
1416 CMD_CUSTOM_OPPPS_PARAM_STRUC_T rCmdOppPsParam
;
1418 DEBUGFUNC("wlanoidSetOppPsParam");
1419 DBGLOG(INIT
, TRACE
, ("\n"));
1422 ASSERT(pu4SetInfoLen
);
1424 *pu4SetInfoLen
= sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUC_T
);
1426 if (u4SetBufferLen
< sizeof(PARAM_CUSTOM_OPPPS_PARAM_STRUC_T
)) {
1427 return WLAN_STATUS_INVALID_LENGTH
;
1430 ASSERT(pvSetBuffer
);
1432 prOppPsParam
= (P_PARAM_CUSTOM_OPPPS_PARAM_STRUC_T
) pvSetBuffer
;
1434 kalMemZero(&rCmdOppPsParam
, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T
));
1435 rCmdOppPsParam
.u4CTwindowMs
= prOppPsParam
->u4CTwindowMs
;
1438 return wlanSendSetQueryCmd(prAdapter
,
1439 CMD_ID_SET_OPPPS_PARAM
,
1443 nicCmdEventSetCommon
,
1444 nicOidCmdTimeoutCommon
,
1445 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T
),
1446 (PUINT_8
) &rCmdOppPsParam
, pvSetBuffer
, u4SetBufferLen
);
1448 return wlanoidSendSetQueryP2PCmd(prAdapter
,
1449 CMD_ID_SET_NOA_PARAM
,
1454 nicOidCmdTimeoutCommon
,
1455 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T
),
1456 (PUINT_8
) &rCmdOppPsParam
, pvSetBuffer
, u4SetBufferLen
);
1463 wlanoidSetUApsdParam(IN P_ADAPTER_T prAdapter
,
1464 IN PVOID pvSetBuffer
, IN UINT_32 u4SetBufferLen
, OUT PUINT_32 pu4SetInfoLen
)
1466 P_PARAM_CUSTOM_UAPSD_PARAM_STRUC_T prUapsdParam
;
1467 CMD_CUSTOM_UAPSD_PARAM_STRUC_T rCmdUapsdParam
;
1468 P_PM_PROFILE_SETUP_INFO_T prPmProfSetupInfo
;
1469 P_BSS_INFO_T prBssInfo
;
1472 DEBUGFUNC("wlanoidSetUApsdParam");
1473 DBGLOG(INIT
, TRACE
, ("\n"));
1476 ASSERT(pu4SetInfoLen
);
1478 *pu4SetInfoLen
= sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUC_T
);
1480 if (u4SetBufferLen
< sizeof(PARAM_CUSTOM_UAPSD_PARAM_STRUC_T
)) {
1481 return WLAN_STATUS_INVALID_LENGTH
;
1484 ASSERT(pvSetBuffer
);
1486 prBssInfo
= &(prAdapter
->rWifiVar
.arBssInfo
[NETWORK_TYPE_P2P_INDEX
]);
1487 prPmProfSetupInfo
= &prBssInfo
->rPmProfSetupInfo
;
1489 prUapsdParam
= (P_PARAM_CUSTOM_UAPSD_PARAM_STRUC_T
) pvSetBuffer
;
1491 kalMemZero(&rCmdUapsdParam
, sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T
));
1492 rCmdUapsdParam
.fgEnAPSD
= prUapsdParam
->fgEnAPSD
;
1493 prAdapter
->rWifiVar
.fgSupportUAPSD
= prUapsdParam
->fgEnAPSD
;
1495 rCmdUapsdParam
.fgEnAPSD_AcBe
= prUapsdParam
->fgEnAPSD_AcBe
;
1496 rCmdUapsdParam
.fgEnAPSD_AcBk
= prUapsdParam
->fgEnAPSD_AcBk
;
1497 rCmdUapsdParam
.fgEnAPSD_AcVo
= prUapsdParam
->fgEnAPSD_AcVo
;
1498 rCmdUapsdParam
.fgEnAPSD_AcVi
= prUapsdParam
->fgEnAPSD_AcVi
;
1499 prPmProfSetupInfo
->ucBmpDeliveryAC
=
1500 ((prUapsdParam
->fgEnAPSD_AcBe
<< 0) |
1501 (prUapsdParam
->fgEnAPSD_AcBk
<< 1) |
1502 (prUapsdParam
->fgEnAPSD_AcVi
<< 2) | (prUapsdParam
->fgEnAPSD_AcVo
<< 3));
1503 prPmProfSetupInfo
->ucBmpTriggerAC
=
1504 ((prUapsdParam
->fgEnAPSD_AcBe
<< 0) |
1505 (prUapsdParam
->fgEnAPSD_AcBk
<< 1) |
1506 (prUapsdParam
->fgEnAPSD_AcVi
<< 2) | (prUapsdParam
->fgEnAPSD_AcVo
<< 3));
1508 rCmdUapsdParam
.ucMaxSpLen
= prUapsdParam
->ucMaxSpLen
;
1509 prPmProfSetupInfo
->ucUapsdSp
= prUapsdParam
->ucMaxSpLen
;
1512 return wlanSendSetQueryCmd(prAdapter
,
1513 CMD_ID_SET_UAPSD_PARAM
,
1517 nicCmdEventSetCommon
,
1518 nicOidCmdTimeoutCommon
,
1519 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T
),
1520 (PUINT_8
) &rCmdUapsdParam
, pvSetBuffer
, u4SetBufferLen
);
1522 return wlanoidSendSetQueryP2PCmd(prAdapter
,
1523 CMD_ID_SET_UAPSD_PARAM
,
1528 nicOidCmdTimeoutCommon
,
1529 sizeof(CMD_CUSTOM_OPPPS_PARAM_STRUC_T
),
1530 (PUINT_8
) &rCmdUapsdParam
, pvSetBuffer
, u4SetBufferLen
);
1538 wlanoidQueryP2pOpChannel(IN P_ADAPTER_T prAdapter
,
1539 IN PVOID pvQueryBuffer
,
1540 IN UINT_32 u4QueryBufferLen
, OUT PUINT_32 pu4QueryInfoLen
)
1543 WLAN_STATUS rResult
= WLAN_STATUS_FAILURE
;
1544 /* PUINT_8 pucOpChnl = (PUINT_8)pvQueryBuffer; */
1547 if ((prAdapter
== NULL
) || (pu4QueryInfoLen
== NULL
)) {
1552 if ((u4QueryBufferLen
) && (pvQueryBuffer
== NULL
)) {
1556 if (u4QueryBufferLen
< sizeof(UINT_8
)) {
1557 *pu4QueryInfoLen
= sizeof(UINT_8
);
1558 rResult
= WLAN_STATUS_BUFFER_TOO_SHORT
;
1562 if (!p2pFuncGetCurrentOpChnl(prAdapter
, pucOpChnl
)) {
1563 rResult
= WLAN_STATUS_INVALID_DATA
;
1567 rResult
= WLAN_STATUS_INVALID_DATA
;
1571 *pu4QueryInfoLen
= sizeof(UINT_8
);
1572 rResult
= WLAN_STATUS_SUCCESS
;
1577 } /* wlanoidQueryP2pOpChannel */
1580 wlanoidQueryP2pVersion(IN P_ADAPTER_T prAdapter
,
1581 IN PVOID pvQueryBuffer
,
1582 IN UINT_32 u4QueryBufferLen
, OUT PUINT_32 pu4QueryInfoLen
)
1584 WLAN_STATUS rResult
= WLAN_STATUS_FAILURE
;
1585 /* PUINT_8 pucVersionNum = (PUINT_8)pvQueryBuffer; */
1588 if ((prAdapter
== NULL
) || (pu4QueryInfoLen
== NULL
)) {
1593 if ((u4QueryBufferLen
) && (pvQueryBuffer
== NULL
)) {
1597 if (u4QueryBufferLen
< sizeof(UINT_8
)) {
1598 *pu4QueryInfoLen
= sizeof(UINT_8
);
1599 rResult
= WLAN_STATUS_BUFFER_TOO_SHORT
;
1606 } /* wlanoidQueryP2pVersion */
1609 wlanoidSetP2pSupplicantVersion(IN P_ADAPTER_T prAdapter
,
1610 IN PVOID pvSetBuffer
,
1611 IN UINT_32 u4SetBufferLen
, OUT PUINT_32 pu4SetInfoLen
)
1613 WLAN_STATUS rResult
= WLAN_STATUS_FAILURE
;
1614 UINT_8 ucVersionNum
;
1617 if ((prAdapter
== NULL
) || (pu4SetInfoLen
== NULL
)) {
1619 rResult
= WLAN_STATUS_INVALID_DATA
;
1623 if ((u4SetBufferLen
) && (pvSetBuffer
== NULL
)) {
1624 rResult
= WLAN_STATUS_INVALID_DATA
;
1628 *pu4SetInfoLen
= sizeof(UINT_8
);
1630 if (u4SetBufferLen
< sizeof(UINT_8
)) {
1631 rResult
= WLAN_STATUS_INVALID_LENGTH
;
1636 ucVersionNum
= *((PUINT_8
) pvSetBuffer
);
1639 rResult
= WLAN_STATUS_SUCCESS
;
1643 } /* wlanoidSetP2pSupplicantVersion */
1646 /*----------------------------------------------------------------------------*/
1648 * \brief This routine is used to set the WPS mode.
1650 * \param[in] pvAdapter Pointer to the Adapter structure.
1651 * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set.
1652 * \param[in] u4SetBufferLen The length of the set buffer.
1653 * \param[out] pu4SetInfoLen If the call is successful, returns the number of
1654 * bytes read from the set buffer. If the call failed
1655 * due to invalid length of the set buffer, returns
1656 * the amount of storage needed.
1658 * \retval WLAN_STATUS_SUCCESS
1659 * \retval WLAN_STATUS_INVALID_LENGTH
1661 /*----------------------------------------------------------------------------*/
1663 wlanoidSetP2pWPSmode(IN P_ADAPTER_T prAdapter
,
1664 IN PVOID pvSetBuffer
, IN UINT_32 u4SetBufferLen
, OUT PUINT_32 pu4SetInfoLen
)
1667 UINT_32 u4IsWPSmode
= 0;
1668 DEBUGFUNC("wlanoidSetP2pWPSmode");
1671 ASSERT(pu4SetInfoLen
);
1674 u4IsWPSmode
= *(PUINT_32
) pvSetBuffer
;
1680 prAdapter
->rWifiVar
.prP2pFsmInfo
->fgIsWPSMode
= 1;
1682 prAdapter
->rWifiVar
.prP2pFsmInfo
->fgIsWPSMode
= 0;
1685 status
= nicUpdateBss(prAdapter
, NETWORK_TYPE_P2P_INDEX
);
1688 } /* end of wlanoidSetP2pWPSmode() */
1691 #if CFG_SUPPORT_P2P_RSSI_QUERY
1693 wlanoidQueryP2pRssi(IN P_ADAPTER_T prAdapter
,
1694 IN PVOID pvQueryBuffer
,
1695 IN UINT_32 u4QueryBufferLen
, OUT PUINT_32 pu4QueryInfoLen
)
1697 DEBUGFUNC("wlanoidQueryP2pRssi");
1700 ASSERT(pu4QueryInfoLen
);
1701 if (u4QueryBufferLen
) {
1702 ASSERT(pvQueryBuffer
);
1705 *pu4QueryInfoLen
= sizeof(PARAM_RSSI
);
1707 /* Check for query buffer length */
1708 if (u4QueryBufferLen
< *pu4QueryInfoLen
) {
1709 DBGLOG(REQ
, WARN
, ("Too short length %ld\n", u4QueryBufferLen
));
1710 return WLAN_STATUS_BUFFER_TOO_SHORT
;
1713 if (prAdapter
->fgIsP2pLinkQualityValid
== TRUE
&&
1714 (kalGetTimeTick() - prAdapter
->rP2pLinkQualityUpdateTime
) <=
1715 CFG_LINK_QUALITY_VALID_PERIOD
) {
1718 rRssi
= (PARAM_RSSI
) prAdapter
->rP2pLinkQuality
.cRssi
; /* ranged from (-128 ~ 30) in unit of dBm */
1720 if (rRssi
> PARAM_WHQL_RSSI_MAX_DBM
)
1721 rRssi
= PARAM_WHQL_RSSI_MAX_DBM
;
1722 else if (rRssi
< PARAM_WHQL_RSSI_MIN_DBM
)
1723 rRssi
= PARAM_WHQL_RSSI_MIN_DBM
;
1725 kalMemCopy(pvQueryBuffer
, &rRssi
, sizeof(PARAM_RSSI
));
1726 return WLAN_STATUS_SUCCESS
;
1729 return wlanSendSetQueryCmd(prAdapter
,
1730 CMD_ID_GET_LINK_QUALITY
,
1734 nicCmdEventQueryLinkQuality
,
1735 nicOidCmdTimeoutCommon
,
1737 pvQueryBuffer
, pvQueryBuffer
, u4QueryBufferLen
);
1739 return wlanSendSetQueryCmd(prAdapter
,
1740 CMD_ID_GET_LINK_QUALITY
,
1744 nicCmdEventQueryLinkQuality
,
1745 nicOidCmdTimeoutCommon
,
1746 0, NULL
, pvQueryBuffer
, u4QueryBufferLen
);
1749 } /* wlanoidQueryP2pRssi */