2 ** $Id: @(#) gl_p2p_cfg80211.c@@
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 ********************************************************************************
53 /*******************************************************************************
54 * C O M P I L E R F L A G S
55 ********************************************************************************
58 /*******************************************************************************
59 * E X T E R N A L R E F E R E N C E S
60 ********************************************************************************
62 #include "net/cfg80211.h"
64 #ifdef CFG_DUAL_ANTENNA
65 #include "mtk_porting.h"
66 #include "dual_ant_bwcs.h"
71 wextSrchDesiredWPAIE (
72 IN PUINT_8 pucIEStart,
73 IN INT_32 i4TotalIeLen,
74 IN UINT_8 ucDesiredElemId,
75 OUT PUINT_8 *ppucDesiredIE
80 wextSrchDesiredWPSIE (
81 IN PUINT_8 pucIEStart,
82 IN INT_32 i4TotalIeLen,
83 IN UINT_8 ucDesiredElemId,
84 OUT PUINT_8 *ppucDesiredIE
88 /*******************************************************************************
90 ********************************************************************************
93 /*******************************************************************************
95 ********************************************************************************
98 /*******************************************************************************
100 ********************************************************************************
103 /*******************************************************************************
104 * P R I V A T E D A T A
105 ********************************************************************************
108 /*******************************************************************************
110 ********************************************************************************
113 /*******************************************************************************
114 * F U N C T I O N D E C L A R A T I O N S
115 ********************************************************************************
118 kalP2pFuncGetChannelType(
119 IN ENUM_CHNL_EXT_T rChnlSco,
120 OUT enum nl80211_channel_type *channel_type
124 struct ieee80211_channel *
125 kalP2pFuncGetChannelEntry(
126 IN P_GL_P2P_INFO_T prP2pInfo,
127 IN P_RF_CHANNEL_INFO_T prChannelInfo
131 /*******************************************************************************
133 ********************************************************************************
136 /*----------------------------------------------------------------------------*/
138 * \brief to retrieve Wi-Fi Direct state from glue layer
144 * ENUM_BOW_DEVICE_STATE
146 /*----------------------------------------------------------------------------*/
147 ENUM_PARAM_MEDIA_STATE_T
149 IN P_GLUE_INFO_T prGlueInfo
154 return prGlueInfo->prP2PInfo->eState;
155 } /* end of kalP2PGetState() */
158 /*----------------------------------------------------------------------------*/
160 * \brief to update the assoc req to p2p
170 /*----------------------------------------------------------------------------*/
172 kalP2PUpdateAssocInfo (
173 IN P_GLUE_INFO_T prGlueInfo,
174 IN PUINT_8 pucFrameBody,
175 IN UINT_32 u4FrameBodyLen,
176 IN BOOLEAN fgReassocRequest
179 union iwreq_data wrqu;
180 unsigned char *pucExtraInfo = NULL;
181 unsigned char *pucDesiredIE = NULL;
182 // unsigned char aucExtraInfoBuf[200];
185 memset(&wrqu, 0, sizeof(wrqu));
187 if (fgReassocRequest) {
188 if (u4FrameBodyLen < 15) {
190 printk(KERN_WARNING "frameBodyLen too short:%ld\n", frameBodyLen);
196 if (u4FrameBodyLen < 9) {
198 printk(KERN_WARNING "frameBodyLen too short:%ld\n", frameBodyLen);
206 if (fgReassocRequest) {
207 /* Capability information field 2 */
208 /* Listen interval field 2*/
209 /* Current AP address 6 */
211 u4FrameBodyLen -= 10;
214 /* Capability information field 2 */
215 /* Listen interval field 2*/
220 /* do supplicant a favor, parse to the start of WPA/RSN IE */
221 if (wextSrchDesiredWPSIE(cp, u4FrameBodyLen, 0xDD, &pucDesiredIE)) {
222 //printk("wextSrchDesiredWPSIE!!\n");
225 else if (wextSrchDesiredWPAIE(cp, u4FrameBodyLen, 0x30, &pucDesiredIE)) {
226 //printk("wextSrchDesiredWPAIE!!\n");
229 else if (wextSrchDesiredWPAIE(cp, u4FrameBodyLen, 0xDD, &pucDesiredIE)) {
230 //printk("wextSrchDesiredWPAIE!!\n");
234 /* no WPA/RSN IE found, skip this event */
235 goto skip_indicate_event;
238 /* IWEVASSOCREQIE, indicate binary string */
239 pucExtraInfo = pucDesiredIE;
240 wrqu.data.length = pucDesiredIE[1] + 2;
242 /* Send event to user space */
243 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler, IWEVASSOCREQIE, &wrqu, pucExtraInfo);
251 /*----------------------------------------------------------------------------*/
253 * \brief to set Wi-Fi Direct state in glue layer
262 /*----------------------------------------------------------------------------*/
265 IN P_GLUE_INFO_T prGlueInfo,
266 IN ENUM_PARAM_MEDIA_STATE_T eState,
267 IN PARAM_MAC_ADDRESS rPeerAddr,
271 union iwreq_data evt;
272 UINT_8 aucBuffer[IW_CUSTOM_MAX];
276 memset(&evt, 0, sizeof(evt));
278 if(eState == PARAM_MEDIA_STATE_CONNECTED) {
279 prGlueInfo->prP2PInfo->eState = PARAM_MEDIA_STATE_CONNECTED;
281 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_STA_CONNECT="MACSTR, MAC2STR(rPeerAddr));
282 evt.data.length = strlen(aucBuffer);
284 /* indicate in IWECUSTOM event */
285 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
291 else if(eState == PARAM_MEDIA_STATE_DISCONNECTED) {
292 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_STA_DISCONNECT="MACSTR, MAC2STR(rPeerAddr));
293 evt.data.length = strlen(aucBuffer);
295 /* indicate in IWECUSTOM event */
296 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
306 } /* end of kalP2PSetState() */
309 /*----------------------------------------------------------------------------*/
311 * \brief to retrieve Wi-Fi Direct operating frequency
319 /*----------------------------------------------------------------------------*/
322 IN P_GLUE_INFO_T prGlueInfo
327 return prGlueInfo->prP2PInfo->u4FreqInKHz;
328 } /* end of kalP2PGetFreqInKHz() */
331 /*----------------------------------------------------------------------------*/
333 * \brief to retrieve Bluetooth-over-Wi-Fi role
343 /*----------------------------------------------------------------------------*/
346 IN P_GLUE_INFO_T prGlueInfo
351 return prGlueInfo->prP2PInfo->ucRole;
352 } /* end of kalP2PGetRole() */
355 /*----------------------------------------------------------------------------*/
357 * \brief to set Wi-Fi Direct role
372 /*----------------------------------------------------------------------------*/
375 IN P_GLUE_INFO_T prGlueInfo,
382 union iwreq_data evt;
383 UINT_8 aucBuffer[IW_CUSTOM_MAX];
388 memset(&evt, 0, sizeof(evt));
391 prGlueInfo->prP2PInfo->ucRole = ucRole;
395 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_FORMATION_RST=%d%d%d%c%c", ucResult, ucRole, 1/* persistence or not */, pucSSID[7], pucSSID[8]);
397 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_FORMATION_RST=%d%d%d%c%c", ucResult, ucRole, 1/* persistence or not */, '0', '0');
399 evt.data.length = strlen(aucBuffer);
402 // printk("P2P GO SSID DIRECT-%c%c\n", pucSSID[7], pucSSID[8]);
404 /* indicate in IWECUSTOM event */
405 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
411 } /* end of kalP2PSetRole() */
414 /*----------------------------------------------------------------------------*/
416 * \brief to set the cipher for p2p
425 /*----------------------------------------------------------------------------*/
428 IN P_GLUE_INFO_T prGlueInfo,
433 ASSERT(prGlueInfo->prP2PInfo);
435 prGlueInfo->prP2PInfo->u4CipherPairwise = u4Cipher;
441 /*----------------------------------------------------------------------------*/
443 * \brief to get the cipher, return for cipher is ccmp
449 * TRUE: cipher is ccmp
450 * FALSE: cipher is none
452 /*----------------------------------------------------------------------------*/
455 IN P_GLUE_INFO_T prGlueInfo
459 ASSERT(prGlueInfo->prP2PInfo);
461 if (prGlueInfo->prP2PInfo->u4CipherPairwise == IW_AUTH_CIPHER_CCMP)
464 if (prGlueInfo->prP2PInfo->u4CipherPairwise == IW_AUTH_CIPHER_TKIP)
471 kalP2PGetCcmpCipher (
472 IN P_GLUE_INFO_T prGlueInfo
476 ASSERT(prGlueInfo->prP2PInfo);
478 if (prGlueInfo->prP2PInfo->u4CipherPairwise == IW_AUTH_CIPHER_CCMP)
481 if (prGlueInfo->prP2PInfo->u4CipherPairwise == IW_AUTH_CIPHER_TKIP)
489 kalP2PGetTkipCipher (
490 IN P_GLUE_INFO_T prGlueInfo
494 ASSERT(prGlueInfo->prP2PInfo);
496 if (prGlueInfo->prP2PInfo->u4CipherPairwise == IW_AUTH_CIPHER_CCMP)
499 if (prGlueInfo->prP2PInfo->u4CipherPairwise == IW_AUTH_CIPHER_TKIP)
505 /*----------------------------------------------------------------------------*/
507 * \brief to set the status of WSC
514 /*----------------------------------------------------------------------------*/
517 IN P_GLUE_INFO_T prGlueInfo,
522 ASSERT(prGlueInfo->prP2PInfo);
524 prGlueInfo->prP2PInfo->ucWSCRunning = ucWscMode;
528 /*----------------------------------------------------------------------------*/
530 * \brief to get the status of WSC
537 /*----------------------------------------------------------------------------*/
540 IN P_GLUE_INFO_T prGlueInfo
544 ASSERT(prGlueInfo->prP2PInfo);
546 return (prGlueInfo->prP2PInfo->ucWSCRunning);
550 /*----------------------------------------------------------------------------*/
552 * \brief to get the wsc ie length
556 * ucType : 0 for beacon, 1 for probe req, 2 for probe resp
561 /*----------------------------------------------------------------------------*/
564 IN P_GLUE_INFO_T prGlueInfo,
572 return prGlueInfo->prP2PInfo->u2WSCIELen[ucType];
576 /*----------------------------------------------------------------------------*/
578 * \brief to copy the wsc ie setting from p2p supplicant
586 /*----------------------------------------------------------------------------*/
589 IN P_GLUE_INFO_T prGlueInfo,
594 P_GL_P2P_INFO_T prGlP2pInfo = (P_GL_P2P_INFO_T)NULL;
597 if ((prGlueInfo == NULL) ||
599 (pucBuffer == NULL)) {
604 prGlP2pInfo = prGlueInfo->prP2PInfo;
606 kalMemCopy(pucBuffer, prGlP2pInfo->aucWSCIE[ucType], prGlP2pInfo->u2WSCIELen[ucType]);
616 IN P_GLUE_INFO_T prGlueInfo,
618 IN PUINT_8 pucBuffer,
619 IN UINT_16 u2BufferLength
622 P_GL_P2P_INFO_T prGlP2pInfo = (P_GL_P2P_INFO_T)NULL;
625 if ((prGlueInfo == NULL) ||
627 ((u2BufferLength > 0) && (pucBuffer == NULL))) {
632 if (u2BufferLength > 400) {
633 DBGLOG(P2P, ERROR, ("Buffer length is not enough, GLUE only 400 bytes but %d received\n", u2BufferLength));
639 prGlP2pInfo = prGlueInfo->prP2PInfo;
641 kalMemCopy(prGlP2pInfo->aucWSCIE[ucType], pucBuffer, u2BufferLength);
643 prGlP2pInfo->u2WSCIELen[ucType] = u2BufferLength;
649 } /* kalP2PUpdateWSC_IE */
653 /*----------------------------------------------------------------------------*/
655 * \brief indicate an event to supplicant for device connection request
657 * \param[in] prGlueInfo Pointer of GLUE_INFO_T
661 /*----------------------------------------------------------------------------*/
663 kalP2PIndicateConnReq(
664 IN P_GLUE_INFO_T prGlueInfo,
665 IN PUINT_8 pucDevName,
666 IN INT_32 u4NameLength,
667 IN PARAM_MAC_ADDRESS rPeerAddr,
668 IN UINT_8 ucDevType, /* 0: P2P Device / 1: GC / 2: GO */
669 IN INT_32 i4ConfigMethod,
670 IN INT_32 i4ActiveConfigMethod
673 union iwreq_data evt;
674 UINT_8 aucBuffer[IW_CUSTOM_MAX];
678 /* buffer peer information for later IOC_P2P_GET_REQ_DEVICE_INFO access */
679 prGlueInfo->prP2PInfo->u4ConnReqNameLength = u4NameLength > 32 ? 32 : u4NameLength;
680 kalMemCopy(prGlueInfo->prP2PInfo->aucConnReqDevName,
682 prGlueInfo->prP2PInfo->u4ConnReqNameLength);
683 COPY_MAC_ADDR(prGlueInfo->prP2PInfo->rConnReqPeerAddr, rPeerAddr);
684 prGlueInfo->prP2PInfo->ucConnReqDevType = ucDevType;
685 prGlueInfo->prP2PInfo->i4ConnReqConfigMethod = i4ConfigMethod;
686 prGlueInfo->prP2PInfo->i4ConnReqActiveConfigMethod = i4ActiveConfigMethod;
688 // prepare event structure
689 memset(&evt, 0, sizeof(evt));
691 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_DVC_REQ");
692 evt.data.length = strlen(aucBuffer);
694 /* indicate in IWEVCUSTOM event */
695 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
701 } /* end of kalP2PIndicateConnReq() */
704 /*----------------------------------------------------------------------------*/
706 * \brief Indicate an event to supplicant for device connection request from other device.
708 * \param[in] prGlueInfo Pointer of GLUE_INFO_T
709 * \param[in] pucGroupBssid Only valid when invitation Type equals to 0.
713 /*----------------------------------------------------------------------------*/
715 kalP2PInvitationIndication (
716 IN P_GLUE_INFO_T prGlueInfo,
717 IN P_P2P_DEVICE_DESC_T prP2pDevDesc,
720 IN UINT_8 ucOperatingChnl,
721 IN UINT_8 ucInvitationType,
722 IN PUINT_8 pucGroupBssid
726 union iwreq_data evt;
727 UINT_8 aucBuffer[IW_CUSTOM_MAX];
731 /* buffer peer information for later IOC_P2P_GET_STRUCT access */
732 prGlueInfo->prP2PInfo->u4ConnReqNameLength = (UINT_32)((prP2pDevDesc->u2NameLength > 32)? 32 : prP2pDevDesc->u2NameLength);
733 kalMemCopy(prGlueInfo->prP2PInfo->aucConnReqDevName,
734 prP2pDevDesc->aucName,
735 prGlueInfo->prP2PInfo->u4ConnReqNameLength);
736 COPY_MAC_ADDR(prGlueInfo->prP2PInfo->rConnReqPeerAddr, prP2pDevDesc->aucDeviceAddr);
737 COPY_MAC_ADDR(prGlueInfo->prP2PInfo->rConnReqGroupAddr, pucGroupBssid);
738 prGlueInfo->prP2PInfo->i4ConnReqConfigMethod = (INT_32)(prP2pDevDesc->u2ConfigMethod);
739 prGlueInfo->prP2PInfo->ucOperatingChnl = ucOperatingChnl;
740 prGlueInfo->prP2PInfo->ucInvitationType = ucInvitationType;
742 // prepare event structure
743 memset(&evt, 0, sizeof(evt));
745 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_INV_INDICATE");
746 evt.data.length = strlen(aucBuffer);
748 /* indicate in IWEVCUSTOM event */
749 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
756 P_MSG_P2P_CONNECTION_REQUEST_T prP2pConnReq = (P_MSG_P2P_CONNECTION_REQUEST_T)NULL;
757 P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T)NULL;
758 P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T)NULL;
761 ASSERT_BREAK((prGlueInfo != NULL) && (prP2pDevDesc != NULL));
764 // Not a real solution
766 prP2pSpecificBssInfo = prGlueInfo->prAdapter->rWifiVar.prP2pSpecificBssInfo;
767 prP2pConnSettings = prGlueInfo->prAdapter->rWifiVar.prP2PConnSettings;
769 prP2pConnReq = (P_MSG_P2P_CONNECTION_REQUEST_T)cnmMemAlloc(prGlueInfo->prAdapter,
771 sizeof(MSG_P2P_CONNECTION_REQUEST_T));
773 if (prP2pConnReq == NULL) {
778 kalMemZero(prP2pConnReq, sizeof(MSG_P2P_CONNECTION_REQUEST_T));
780 prP2pConnReq->rMsgHdr.eMsgId = MID_MNY_P2P_CONNECTION_REQ;
782 prP2pConnReq->eFormationPolicy = ENUM_P2P_FORMATION_POLICY_AUTO;
784 COPY_MAC_ADDR(prP2pConnReq->aucDeviceID, prP2pDevDesc->aucDeviceAddr);
786 prP2pConnReq->u2ConfigMethod = prP2pDevDesc->u2ConfigMethod;
788 if (ucInvitationType == P2P_INVITATION_TYPE_INVITATION) {
789 prP2pConnReq->fgIsPersistentGroup = FALSE;
790 prP2pConnReq->fgIsTobeGO = FALSE;
794 else if (ucInvitationType == P2P_INVITATION_TYPE_REINVOKE) {
795 DBGLOG(P2P, TRACE, ("Re-invoke Persistent Group\n"));
796 prP2pConnReq->fgIsPersistentGroup = TRUE;
797 prP2pConnReq->fgIsTobeGO = (prGlueInfo->prP2PInfo->ucRole == 2)?TRUE:FALSE;
802 p2pFsmRunEventDeviceDiscoveryAbort(prGlueInfo->prAdapter, NULL);
804 if (ucOperatingChnl != 0) {
805 prP2pSpecificBssInfo->ucPreferredChannel = ucOperatingChnl;
808 if ((ucSsidLen < 32) && (pucSsid != NULL)) {
809 COPY_SSID(prP2pConnSettings->aucSSID,
810 prP2pConnSettings->ucSSIDLen,
815 mboxSendMsg(prGlueInfo->prAdapter,
817 (P_MSG_HDR_T)prP2pConnReq,
818 MSG_SEND_METHOD_BUF);
825 // TODO: Invitation Indication
830 } /* kalP2PInvitationIndication */
833 /*----------------------------------------------------------------------------*/
835 * \brief Indicate an status to supplicant for device invitation status.
837 * \param[in] prGlueInfo Pointer of GLUE_INFO_T
841 /*----------------------------------------------------------------------------*/
843 kalP2PInvitationStatus (
844 IN P_GLUE_INFO_T prGlueInfo,
845 IN UINT_32 u4InvStatus
848 union iwreq_data evt;
849 UINT_8 aucBuffer[IW_CUSTOM_MAX];
853 /* buffer peer information for later IOC_P2P_GET_STRUCT access */
854 prGlueInfo->prP2PInfo->u4InvStatus = u4InvStatus;
856 // prepare event structure
857 memset(&evt, 0, sizeof(evt));
859 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_INV_STATUS");
860 evt.data.length = strlen(aucBuffer);
862 /* indicate in IWEVCUSTOM event */
863 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
869 } /* kalP2PInvitationStatus */
871 /*----------------------------------------------------------------------------*/
873 * \brief Indicate an event to supplicant for Service Discovery request from other device.
875 * \param[in] prGlueInfo Pointer of GLUE_INFO_T
879 /*----------------------------------------------------------------------------*/
881 kalP2PIndicateSDRequest(
882 IN P_GLUE_INFO_T prGlueInfo,
883 IN PARAM_MAC_ADDRESS rPeerAddr,
887 union iwreq_data evt;
888 UINT_8 aucBuffer[IW_CUSTOM_MAX];
892 memset(&evt, 0, sizeof(evt));
894 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_SD_REQ %d", ucSeqNum);
895 evt.data.length = strlen(aucBuffer);
897 /* indicate IWEVP2PSDREQ event */
898 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
904 } /* end of kalP2PIndicateSDRequest() */
907 /*----------------------------------------------------------------------------*/
909 * \brief Indicate an event to supplicant for Service Discovery response
912 * \param[in] prGlueInfo Pointer of GLUE_INFO_T
916 /*----------------------------------------------------------------------------*/
918 kalP2PIndicateSDResponse(
919 IN P_GLUE_INFO_T prGlueInfo,
920 IN PARAM_MAC_ADDRESS rPeerAddr,
924 union iwreq_data evt;
925 UINT_8 aucBuffer[IW_CUSTOM_MAX];
929 memset(&evt, 0, sizeof(evt));
931 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_SD_RESP %d", ucSeqNum);
932 evt.data.length = strlen(aucBuffer);
934 /* indicate IWEVP2PSDREQ event */
935 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
941 } /* end of kalP2PIndicateSDResponse() */
944 /*----------------------------------------------------------------------------*/
946 * \brief Indicate an event to supplicant for Service Discovery TX Done
949 * \param[in] prGlueInfo Pointer of GLUE_INFO_T
950 * \param[in] ucSeqNum Sequence number of the frame
951 * \param[in] ucStatus Status code for TX
955 /*----------------------------------------------------------------------------*/
957 kalP2PIndicateTXDone(
958 IN P_GLUE_INFO_T prGlueInfo,
963 union iwreq_data evt;
964 UINT_8 aucBuffer[IW_CUSTOM_MAX];
968 memset(&evt, 0, sizeof(evt));
970 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_SD_XMITTED: %d %d", ucSeqNum, ucStatus);
971 evt.data.length = strlen(aucBuffer);
973 /* indicate IWEVP2PSDREQ event */
974 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
980 } /* end of kalP2PIndicateSDResponse() */
985 P_GLUE_INFO_T prGlueInfo
989 ASSERT(prGlueInfo->prP2PInfo);
990 return prGlueInfo->prP2PInfo->prDevHandler;
993 #if CFG_SUPPORT_ANTI_PIRACY
994 /*----------------------------------------------------------------------------*/
998 * \param[in] prAdapter Pointer of ADAPTER_T
1002 /*----------------------------------------------------------------------------*/
1004 kalP2PIndicateSecCheckRsp (
1005 IN P_GLUE_INFO_T prGlueInfo,
1010 union iwreq_data evt;
1011 UINT_8 aucBuffer[IW_CUSTOM_MAX];
1015 memset(&evt, 0, sizeof(evt));
1016 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_SEC_CHECK_RSP=");
1018 kalMemCopy(prGlueInfo->prP2PInfo->aucSecCheckRsp, pucRsp, u2RspLen);
1019 evt.data.length = strlen(aucBuffer);
1022 DBGLOG_MEM8(SEC, LOUD, prGlueInfo->prP2PInfo->aucSecCheckRsp, u2RspLen);
1024 /* indicate in IWECUSTOM event */
1025 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
1030 } /* p2pFsmRunEventRxDisassociation */
1034 /*----------------------------------------------------------------------------*/
1038 * \param[in] prAdapter Pointer of ADAPTER_T
1042 /*----------------------------------------------------------------------------*/
1045 IN P_GLUE_INFO_T prGlueInfo,
1046 IN ENUM_BAND_T eSpecificBand,
1047 IN UINT_8 ucMaxChannelNum,
1048 IN PUINT_8 pucNumOfChannel,
1049 IN P_RF_CHANNEL_INFO_T paucChannelList
1052 rlmDomainGetChnlList(prGlueInfo->prAdapter,
1057 } /* kalGetChnlList */
1059 //////////////////////////////////////ICS SUPPORT//////////////////////////////////////
1062 kalP2PIndicateChannelReady (
1063 IN P_GLUE_INFO_T prGlueInfo,
1064 IN UINT_64 u8SeqNum,
1065 IN UINT_32 u4ChannelNum,
1066 IN ENUM_BAND_T eBand,
1067 IN ENUM_CHNL_EXT_T eSco,
1068 IN UINT_32 u4Duration
1071 struct ieee80211_channel *prIEEE80211ChnlStruct = (struct ieee80211_channel *)NULL;
1072 RF_CHANNEL_INFO_T rChannelInfo;
1073 enum nl80211_channel_type eChnlType = NL80211_CHAN_NO_HT;
1075 P_MSG_P2P_MGMT_TX_REQUEST_T prMsgTxReq = (P_MSG_P2P_MGMT_TX_REQUEST_T)NULL;
1076 INT_32 i4Rslt = -EINVAL;
1077 P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T)NULL;
1078 prP2pFsmInfo = prGlueInfo->prAdapter->rWifiVar.prP2pFsmInfo;
1079 P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = &(prP2pFsmInfo->rChnlReqInfo);
1083 if (prGlueInfo == NULL) {
1087 //if (prChnlReqInfo->fgNeedIndSupp) {
1088 kalMemZero(&rChannelInfo, sizeof(RF_CHANNEL_INFO_T));
1090 rChannelInfo.ucChannelNum = u4ChannelNum;
1091 rChannelInfo.eBand = eBand;
1093 prIEEE80211ChnlStruct = kalP2pFuncGetChannelEntry(prGlueInfo->prP2PInfo, &rChannelInfo);
1095 kalP2pFuncGetChannelType(eSco, &eChnlType);
1097 cfg80211_ready_on_channel(prGlueInfo->prP2PInfo->prDevHandler, //struct net_device * dev,
1098 u8SeqNum, //u64 cookie,
1099 prIEEE80211ChnlStruct, //struct ieee80211_channel * chan,
1100 eChnlType, //enum nl80211_channel_type channel_type,
1101 u4Duration, //unsigned int duration,
1102 GFP_KERNEL); //gfp_t gfp /* allocation flags */
1106 if (prChnlReqInfo->prMsgTxReq!=NULL) {
1107 prMsgTxReq = prChnlReqInfo->prMsgTxReq;
1108 mboxSendMsg(prGlueInfo->prAdapter,
1110 (P_MSG_HDR_T)prMsgTxReq,
1111 MSG_SEND_METHOD_UNBUF);
1113 prChnlReqInfo->prMsgTxReq=NULL;
1114 atomic_set(&prGlueInfo->rMgmtTxAto, 0);
1115 complete(&prGlueInfo->rMgmtTxComp);
1116 init_completion(&prGlueInfo->rMgmtTxComp);
1121 } /* kalP2PIndicateChannelReady */
1126 kalP2PIndicateChannelExpired (
1127 IN P_GLUE_INFO_T prGlueInfo,
1128 IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo
1132 P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T)NULL;
1133 struct ieee80211_channel *prIEEE80211ChnlStruct = (struct ieee80211_channel *)NULL;
1134 enum nl80211_channel_type eChnlType = NL80211_CHAN_NO_HT;
1135 RF_CHANNEL_INFO_T rRfChannelInfo;
1138 if ((prGlueInfo == NULL) || (prChnlReqInfo == NULL)) {
1143 #if 0 //LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0)
1144 if(prChnlReqInfo->fgNeedIndSupp==0){
1145 printk("ch expired, no need ind os\n");
1149 prGlueP2pInfo = prGlueInfo->prP2PInfo;
1151 if (prGlueP2pInfo == NULL) {
1157 DBGLOG(P2P, TRACE, ("kalP2PIndicateChannelExpired\n"));
1159 rRfChannelInfo.eBand = prChnlReqInfo->eBand;
1160 rRfChannelInfo.ucChannelNum = prChnlReqInfo->ucReqChnlNum;
1162 prIEEE80211ChnlStruct = kalP2pFuncGetChannelEntry(prGlueP2pInfo, &rRfChannelInfo);
1165 kalP2pFuncGetChannelType(prChnlReqInfo->eChnlSco,
1169 cfg80211_remain_on_channel_expired(prGlueP2pInfo->prDevHandler, //struct net_device * dev,
1170 prChnlReqInfo->u8Cookie,
1171 prIEEE80211ChnlStruct,
1177 } /* kalP2PIndicateChannelExpired */
1180 kalP2PIndicateScanDone (
1181 IN P_GLUE_INFO_T prGlueInfo,
1182 IN BOOLEAN fgIsAbort
1185 P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T)NULL;
1188 if (prGlueInfo == NULL) {
1194 prGlueP2pInfo = prGlueInfo->prP2PInfo;
1196 if (prGlueP2pInfo == NULL) {
1202 if (prGlueP2pInfo->prScanRequest) {
1203 cfg80211_scan_done(prGlueP2pInfo->prScanRequest,
1206 prGlueP2pInfo->prScanRequest = NULL;
1212 } /* kalP2PIndicateScanDone */
1215 kalP2PIndicateBssInfo (
1216 IN P_GLUE_INFO_T prGlueInfo,
1217 IN PUINT_8 pucFrameBuf,
1218 IN UINT_32 u4BufLen,
1219 IN P_RF_CHANNEL_INFO_T prChannelInfo,
1220 IN INT_32 i4SignalStrength
1223 P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T)NULL;
1224 struct ieee80211_channel *prChannelEntry = (struct ieee80211_channel *)NULL;
1225 struct ieee80211_mgmt *prBcnProbeRspFrame = (struct ieee80211_mgmt *)pucFrameBuf;
1226 struct cfg80211_bss *prCfg80211Bss = (struct cfg80211_bss *)NULL;
1229 if ((prGlueInfo == NULL) || (pucFrameBuf == NULL) || (prChannelInfo == NULL)) {
1234 prGlueP2pInfo = prGlueInfo->prP2PInfo;
1236 if (prGlueP2pInfo == NULL) {
1242 prChannelEntry = kalP2pFuncGetChannelEntry(prGlueP2pInfo, prChannelInfo);
1244 if (prChannelEntry == NULL) {
1245 DBGLOG(P2P, TRACE, ("Unknown channel info\n"));
1250 //rChannelInfo.center_freq = nicChannelNum2Freq((UINT_32)prChannelInfo->ucChannelNum) / 1000;
1252 prCfg80211Bss = cfg80211_inform_bss_frame(prGlueP2pInfo->wdev.wiphy, //struct wiphy * wiphy,
1260 /* Return this structure. */
1261 cfg80211_put_bss(prCfg80211Bss);
1267 } /* kalP2PIndicateBssInfo */
1270 kalP2PIndicateMgmtTxStatus (
1271 IN P_GLUE_INFO_T prGlueInfo,
1272 IN UINT_64 u8Cookie,
1274 IN PUINT_8 pucFrameBuf,
1275 IN UINT_32 u4FrameLen
1278 P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T)NULL;
1281 if ((prGlueInfo == NULL) ||
1282 (pucFrameBuf == NULL) ||
1283 (u4FrameLen == 0)) {
1284 DBGLOG(P2P, TRACE, ("Unexpected pointer PARAM. 0x%lx, 0x%lx, %ld.", prGlueInfo, pucFrameBuf, u4FrameLen));
1289 prGlueP2pInfo = prGlueInfo->prP2PInfo;
1291 cfg80211_mgmt_tx_status(prGlueP2pInfo->prDevHandler, //struct net_device * dev,
1300 } /* kalP2PIndicateMgmtTxStatus */
1303 kalP2PIndicateRxMgmtFrame (
1304 IN P_GLUE_INFO_T prGlueInfo,
1305 IN P_SW_RFB_T prSwRfb
1308 #define DBG_P2P_MGMT_FRAME_INDICATION 0
1309 P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T)NULL;
1311 UINT_8 ucChnlNum = 0;
1312 #if DBG_P2P_MGMT_FRAME_INDICATION
1313 P_WLAN_MAC_HEADER_T prWlanHeader = (P_WLAN_MAC_HEADER_T)NULL;
1318 if ((prGlueInfo == NULL) || (prSwRfb == NULL)) {
1323 prGlueP2pInfo = prGlueInfo->prP2PInfo;
1325 ucChnlNum = prSwRfb->prHifRxHdr->ucHwChannelNum;
1327 #if DBG_P2P_MGMT_FRAME_INDICATION
1329 prWlanHeader = (P_WLAN_MAC_HEADER_T)prSwRfb->pvHeader;
1331 switch (prWlanHeader->u2FrameCtrl) {
1332 case MAC_FRAME_PROBE_REQ:
1333 DBGLOG(P2P, TRACE, ("RX Probe Req at channel %d ", ucChnlNum));
1335 case MAC_FRAME_PROBE_RSP:
1336 DBGLOG(P2P, TRACE, ("RX Probe Rsp at channel %d ", ucChnlNum));
1338 case MAC_FRAME_ACTION:
1339 DBGLOG(P2P, TRACE, ("RX Action frame at channel %d ", ucChnlNum));
1342 DBGLOG(P2P, TRACE, ("RX Packet:%d at channel %d ", prWlanHeader->u2FrameCtrl, ucChnlNum));
1346 DBGLOG(P2P, TRACE, ("from: "MACSTR"\n", MAC2STR(prWlanHeader->aucAddr2)));
1348 i4Freq = nicChannelNum2Freq(ucChnlNum) / 1000;
1350 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
1351 cfg80211_rx_mgmt(prGlueP2pInfo->prDevHandler, //struct net_device * dev,
1353 RCPI_TO_dBm(prSwRfb->prHifRxHdr->ucRcpi),
1355 prSwRfb->u2PacketLen,
1358 cfg80211_rx_mgmt(prGlueP2pInfo->prDevHandler, //struct net_device * dev,
1361 prSwRfb->u2PacketLen,
1367 } /* kalP2PIndicateRxMgmtFrame */
1370 kalP2PGCIndicateConnectionStatus (
1371 IN P_GLUE_INFO_T prGlueInfo,
1372 IN P_P2P_CONNECTION_REQ_INFO_T prP2pConnInfo,
1373 IN PUINT_8 pucRxIEBuf,
1374 IN UINT_16 u2RxIELen,
1375 IN UINT_16 u2StatusReason
1378 P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T)NULL;
1379 UINT_8 ucChannelNum;
1380 struct ieee80211_channel *prChannel = NULL;
1381 struct cfg80211_bss *bss;
1383 P_BSS_DESC_T prBssDesc = NULL;
1386 if (prGlueInfo == NULL) {
1392 prGlueP2pInfo = prGlueInfo->prP2PInfo;
1394 if (prP2pConnInfo) {
1395 /* retrieve channel */
1396 ucChannelNum = wlanGetChannelNumberByNetwork(prGlueInfo->prAdapter, NETWORK_TYPE_P2P_INDEX);
1398 if(ucChannelNum <= 14) {
1399 prChannel = ieee80211_get_channel(prGlueInfo->prP2PInfo->wdev.wiphy, ieee80211_channel_to_frequency(ucChannelNum, IEEE80211_BAND_2GHZ));
1402 prChannel = ieee80211_get_channel(prGlueInfo->prP2PInfo->wdev.wiphy, ieee80211_channel_to_frequency(ucChannelNum, IEEE80211_BAND_5GHZ));
1405 /* ensure BSS exists */
1406 bss = cfg80211_get_bss(prGlueInfo->prP2PInfo->wdev.wiphy, prChannel, prP2pConnInfo->aucBssid,
1407 prP2pConnInfo->rSsidStruct.aucSsid, prP2pConnInfo->rSsidStruct.ucSsidLen,
1408 WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);
1411 /* create BSS on-the-fly */
1413 prBssDesc = wlanGetTargetBssDescByNetwork(prGlueInfo->prAdapter, NETWORK_TYPE_P2P_INDEX);
1415 if(prBssDesc != NULL) {
1416 bss = cfg80211_inform_bss(prGlueInfo->prP2PInfo->wdev.wiphy,
1418 prP2pConnInfo->aucBssid,
1420 WLAN_CAPABILITY_ESS,
1421 prBssDesc->u2BeaconInterval, /* beacon interval */
1422 prBssDesc->aucIEBuf, /* IE */
1423 prBssDesc->u2IELength, /* IE Length */
1424 RCPI_TO_dBm(prBssDesc->ucRCPI) * 100, /* MBM */
1429 cfg80211_connect_result(prGlueP2pInfo->prDevHandler, //struct net_device * dev,
1430 prP2pConnInfo->aucBssid,
1431 prP2pConnInfo->aucIEBuf,
1432 prP2pConnInfo->u4BufLength,
1436 GFP_KERNEL); //gfp_t gfp /* allocation flags */
1437 prP2pConnInfo->fgIsConnRequest = FALSE;
1438 #ifdef CFG_DUAL_ANTENNA
1439 wifi2bwcs_connection_event_ind_handler(prGlueInfo, WIFI_EVENT_P2P_GC_CONN_NEW);
1443 /* Disconnect, what if u2StatusReason == 0? */
1444 cfg80211_disconnected(prGlueP2pInfo->prDevHandler, //struct net_device * dev,
1449 #ifdef CFG_DUAL_ANTENNA
1450 wifi2bwcs_connection_event_ind_handler(prGlueInfo, WIFI_EVENT_P2P_GC_CONN_DEL);
1459 } /* kalP2PGCIndicateConnectionStatus */
1463 kalP2PGOStationUpdate (
1464 IN P_GLUE_INFO_T prGlueInfo,
1465 IN P_STA_RECORD_T prCliStaRec,
1469 P_GL_P2P_INFO_T prP2pGlueInfo = (P_GL_P2P_INFO_T)NULL;
1470 struct station_info rStationInfo;
1473 if ((prGlueInfo == NULL) || (prCliStaRec == NULL)) {
1478 prP2pGlueInfo = prGlueInfo->prP2PInfo;
1481 rStationInfo.filled = STATION_INFO_ASSOC_REQ_IES;
1482 rStationInfo.generation = ++prP2pGlueInfo->i4Generation;
1484 rStationInfo.assoc_req_ies = prCliStaRec->pucAssocReqIe;
1485 rStationInfo.assoc_req_ies_len = prCliStaRec->u2AssocReqIeLen;
1486 // rStationInfo.filled |= STATION_INFO_ASSOC_REQ_IES;
1488 cfg80211_new_sta(prGlueInfo->prP2PInfo->prDevHandler, //struct net_device * dev,
1489 prCliStaRec->aucMacAddr,
1494 ++prP2pGlueInfo->i4Generation;
1496 cfg80211_del_sta(prGlueInfo->prP2PInfo->prDevHandler, //struct net_device * dev,
1497 prCliStaRec->aucMacAddr,
1506 } /* kalP2PGOStationUpdate */
1512 kalP2pFuncGetChannelType(
1513 IN ENUM_CHNL_EXT_T rChnlSco,
1514 OUT enum nl80211_channel_type *channel_type
1517 BOOLEAN fgIsValid = FALSE;
1524 *channel_type = NL80211_CHAN_NO_HT;
1527 *channel_type = NL80211_CHAN_HT40MINUS;
1530 *channel_type = NL80211_CHAN_HT40PLUS;
1534 *channel_type = NL80211_CHAN_NO_HT;
1544 } /* kalP2pFuncGetChannelType */
1549 struct ieee80211_channel *
1550 kalP2pFuncGetChannelEntry (
1551 IN P_GL_P2P_INFO_T prP2pInfo,
1552 IN P_RF_CHANNEL_INFO_T prChannelInfo
1555 struct ieee80211_channel *prTargetChannelEntry = (struct ieee80211_channel *)NULL;
1556 UINT_32 u4TblSize = 0, u4Idx = 0;
1559 if ((prP2pInfo == NULL) || (prChannelInfo == NULL)) {
1564 switch (prChannelInfo->eBand) {
1566 prTargetChannelEntry = prP2pInfo->wdev.wiphy->bands[IEEE80211_BAND_2GHZ]->channels;
1567 u4TblSize = prP2pInfo->wdev.wiphy->bands[IEEE80211_BAND_2GHZ]->n_channels;
1570 prTargetChannelEntry = prP2pInfo->wdev.wiphy->bands[IEEE80211_BAND_5GHZ]->channels;
1571 u4TblSize = prP2pInfo->wdev.wiphy->bands[IEEE80211_BAND_5GHZ]->n_channels;
1578 if (prTargetChannelEntry == NULL) {
1584 for (u4Idx = 0; u4Idx < u4TblSize; u4Idx++, prTargetChannelEntry++) {
1585 if (prTargetChannelEntry->hw_value == prChannelInfo->ucChannelNum) {
1592 if (u4Idx == u4TblSize) {
1593 prTargetChannelEntry = NULL;
1600 return prTargetChannelEntry;
1601 } /* kalP2pFuncGetChannelEntry */
1604 /*----------------------------------------------------------------------------*/
1606 * \brief to set the block list of Hotspot
1613 /*----------------------------------------------------------------------------*/
1615 kalP2PSetBlackList (
1616 IN P_GLUE_INFO_T prGlueInfo,
1617 IN PARAM_MAC_ADDRESS rbssid,
1618 IN BOOLEAN fgIsblock
1621 UINT_8 aucNullAddr[] = NULL_MAC_ADDR;
1622 BOOLEAN fgIsValid = FALSE;
1626 ASSERT(prGlueInfo->prP2PInfo);
1629 for(i = 0; i < 8; i++) {
1630 if(UNEQUAL_MAC_ADDR(rbssid, aucNullAddr)) {
1631 if(UNEQUAL_MAC_ADDR(&(prGlueInfo->prP2PInfo->aucblackMACList[i]), rbssid)) {
1632 if(EQUAL_MAC_ADDR (&(prGlueInfo->prP2PInfo->aucblackMACList[i]), aucNullAddr)) {
1633 COPY_MAC_ADDR(&(prGlueInfo->prP2PInfo->aucblackMACList[i]), rbssid);
1642 for(i = 0; i < 8; i++) {
1643 if(EQUAL_MAC_ADDR(&(prGlueInfo->prP2PInfo->aucblackMACList[i]), rbssid)) {
1644 COPY_MAC_ADDR(&(prGlueInfo->prP2PInfo->aucblackMACList[i]), aucNullAddr);
1656 /*----------------------------------------------------------------------------*/
1658 * \brief to compare the black list of Hotspot
1665 /*----------------------------------------------------------------------------*/
1667 kalP2PCmpBlackList (
1668 IN P_GLUE_INFO_T prGlueInfo,
1669 IN PARAM_MAC_ADDRESS rbssid
1672 UINT_8 aucNullAddr[] = NULL_MAC_ADDR;
1673 BOOLEAN fgIsExsit = FALSE;
1677 ASSERT(prGlueInfo->prP2PInfo);
1679 for(i = 0; i < 8; i++) {
1680 if(UNEQUAL_MAC_ADDR(rbssid, aucNullAddr)){
1681 if(EQUAL_MAC_ADDR(&(prGlueInfo->prP2PInfo->aucblackMACList[i]), rbssid)) {
1693 /*----------------------------------------------------------------------------*/
1695 * \brief to return the max clients of Hotspot
1702 /*----------------------------------------------------------------------------*/
1704 kalP2PSetMaxClients (
1705 IN P_GLUE_INFO_T prGlueInfo,
1706 IN UINT_32 u4MaxClient
1710 ASSERT(prGlueInfo->prP2PInfo);
1712 if(u4MaxClient == 0 || prGlueInfo->prP2PInfo->ucMaxClients >= P2P_MAXIMUM_CLIENT_COUNT)
1713 prGlueInfo->prP2PInfo->ucMaxClients = P2P_MAXIMUM_CLIENT_COUNT;
1715 prGlueInfo->prP2PInfo->ucMaxClients = u4MaxClient;
1719 /*----------------------------------------------------------------------------*/
1721 * \brief to return the max clients of Hotspot
1728 /*----------------------------------------------------------------------------*/
1731 IN P_GLUE_INFO_T prGlueInfo,
1732 IN UINT_32 u4NumClient
1736 ASSERT(prGlueInfo->prP2PInfo);
1738 if(prGlueInfo->prP2PInfo->ucMaxClients) {
1739 if((UINT_8)u4NumClient > prGlueInfo->prP2PInfo->ucMaxClients)