2 ** $Id: @(#) gl_p2p_cfg80211.c@@
13 /*******************************************************************************
14 * C O M P I L E R F L A G S
15 ********************************************************************************
18 /*******************************************************************************
19 * E X T E R N A L R E F E R E N C E S
20 ********************************************************************************
22 #include "net/cfg80211.h"
26 wextSrchDesiredWPAIE (
27 IN PUINT_8 pucIEStart,
28 IN INT_32 i4TotalIeLen,
29 IN UINT_8 ucDesiredElemId,
30 OUT PUINT_8 *ppucDesiredIE
35 wextSrchDesiredWPSIE (
36 IN PUINT_8 pucIEStart,
37 IN INT_32 i4TotalIeLen,
38 IN UINT_8 ucDesiredElemId,
39 OUT PUINT_8 *ppucDesiredIE
43 /*******************************************************************************
45 ********************************************************************************
48 /*******************************************************************************
50 ********************************************************************************
53 /*******************************************************************************
55 ********************************************************************************
58 /*******************************************************************************
59 * P R I V A T E D A T A
60 ********************************************************************************
63 /*******************************************************************************
65 ********************************************************************************
68 /*******************************************************************************
69 * F U N C T I O N D E C L A R A T I O N S
70 ********************************************************************************
73 kalP2pFuncGetChannelType(
74 IN ENUM_CHNL_EXT_T rChnlSco,
75 OUT enum nl80211_channel_type *channel_type
79 struct ieee80211_channel *
80 kalP2pFuncGetChannelEntry(
81 IN P_GL_P2P_INFO_T prP2pInfo,
82 IN P_RF_CHANNEL_INFO_T prChannelInfo
86 /*******************************************************************************
88 ********************************************************************************
91 /*----------------------------------------------------------------------------*/
93 * \brief to retrieve Wi-Fi Direct state from glue layer
99 * ENUM_BOW_DEVICE_STATE
101 /*----------------------------------------------------------------------------*/
102 ENUM_PARAM_MEDIA_STATE_T
104 IN P_GLUE_INFO_T prGlueInfo
109 return prGlueInfo->prP2PInfo->eState;
110 } /* end of kalP2PGetState() */
113 /*----------------------------------------------------------------------------*/
115 * \brief to update the assoc req to p2p
125 /*----------------------------------------------------------------------------*/
127 kalP2PUpdateAssocInfo (
128 IN P_GLUE_INFO_T prGlueInfo,
129 IN PUINT_8 pucFrameBody,
130 IN UINT_32 u4FrameBodyLen,
131 IN BOOLEAN fgReassocRequest
134 union iwreq_data wrqu;
135 unsigned char *pucExtraInfo = NULL;
136 unsigned char *pucDesiredIE = NULL;
137 // unsigned char aucExtraInfoBuf[200];
140 memset(&wrqu, 0, sizeof(wrqu));
142 if (fgReassocRequest) {
143 if (u4FrameBodyLen < 15) {
145 printk(KERN_WARNING "frameBodyLen too short:%ld\n", frameBodyLen);
151 if (u4FrameBodyLen < 9) {
153 printk(KERN_WARNING "frameBodyLen too short:%ld\n", frameBodyLen);
161 if (fgReassocRequest) {
162 /* Capability information field 2 */
163 /* Listen interval field 2*/
164 /* Current AP address 6 */
166 u4FrameBodyLen -= 10;
169 /* Capability information field 2 */
170 /* Listen interval field 2*/
175 /* do supplicant a favor, parse to the start of WPA/RSN IE */
176 if (wextSrchDesiredWPSIE(cp, u4FrameBodyLen, 0xDD, &pucDesiredIE)) {
177 //printk("wextSrchDesiredWPSIE!!\n");
180 else if (wextSrchDesiredWPAIE(cp, u4FrameBodyLen, 0x30, &pucDesiredIE)) {
181 //printk("wextSrchDesiredWPAIE!!\n");
184 else if (wextSrchDesiredWPAIE(cp, u4FrameBodyLen, 0xDD, &pucDesiredIE)) {
185 //printk("wextSrchDesiredWPAIE!!\n");
189 /* no WPA/RSN IE found, skip this event */
190 goto skip_indicate_event;
193 /* IWEVASSOCREQIE, indicate binary string */
194 pucExtraInfo = pucDesiredIE;
195 wrqu.data.length = pucDesiredIE[1] + 2;
197 /* Send event to user space */
198 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler, IWEVASSOCREQIE, &wrqu, pucExtraInfo);
206 /*----------------------------------------------------------------------------*/
208 * \brief to set Wi-Fi Direct state in glue layer
217 /*----------------------------------------------------------------------------*/
220 IN P_GLUE_INFO_T prGlueInfo,
221 IN ENUM_PARAM_MEDIA_STATE_T eState,
222 IN PARAM_MAC_ADDRESS rPeerAddr,
226 union iwreq_data evt;
227 UINT_8 aucBuffer[IW_CUSTOM_MAX];
231 memset(&evt, 0, sizeof(evt));
233 if(eState == PARAM_MEDIA_STATE_CONNECTED) {
234 prGlueInfo->prP2PInfo->eState = PARAM_MEDIA_STATE_CONNECTED;
236 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_STA_CONNECT="MACSTR, MAC2STR(rPeerAddr));
237 evt.data.length = strlen(aucBuffer);
239 /* indicate in IWECUSTOM event */
240 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
246 else if(eState == PARAM_MEDIA_STATE_DISCONNECTED) {
247 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_STA_DISCONNECT="MACSTR, MAC2STR(rPeerAddr));
248 evt.data.length = strlen(aucBuffer);
250 /* indicate in IWECUSTOM event */
251 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
261 } /* end of kalP2PSetState() */
264 /*----------------------------------------------------------------------------*/
266 * \brief to retrieve Wi-Fi Direct operating frequency
274 /*----------------------------------------------------------------------------*/
277 IN P_GLUE_INFO_T prGlueInfo
282 return prGlueInfo->prP2PInfo->u4FreqInKHz;
283 } /* end of kalP2PGetFreqInKHz() */
286 /*----------------------------------------------------------------------------*/
288 * \brief to retrieve Bluetooth-over-Wi-Fi role
298 /*----------------------------------------------------------------------------*/
301 IN P_GLUE_INFO_T prGlueInfo
306 return prGlueInfo->prP2PInfo->ucRole;
307 } /* end of kalP2PGetRole() */
310 /*----------------------------------------------------------------------------*/
312 * \brief to set Wi-Fi Direct role
327 /*----------------------------------------------------------------------------*/
330 IN P_GLUE_INFO_T prGlueInfo,
337 union iwreq_data evt;
338 UINT_8 aucBuffer[IW_CUSTOM_MAX];
343 memset(&evt, 0, sizeof(evt));
346 prGlueInfo->prP2PInfo->ucRole = ucRole;
350 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_FORMATION_RST=%d%d%d%c%c", ucResult, ucRole, 1/* persistence or not */, pucSSID[7], pucSSID[8]);
352 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_FORMATION_RST=%d%d%d%c%c", ucResult, ucRole, 1/* persistence or not */, '0', '0');
354 evt.data.length = strlen(aucBuffer);
357 // printk("P2P GO SSID DIRECT-%c%c\n", pucSSID[7], pucSSID[8]);
359 /* indicate in IWECUSTOM event */
360 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
366 } /* end of kalP2PSetRole() */
369 /*----------------------------------------------------------------------------*/
371 * \brief to set the cipher for p2p
380 /*----------------------------------------------------------------------------*/
383 IN P_GLUE_INFO_T prGlueInfo,
388 ASSERT(prGlueInfo->prP2PInfo);
390 prGlueInfo->prP2PInfo->u4CipherPairwise = u4Cipher;
396 /*----------------------------------------------------------------------------*/
398 * \brief to get the cipher, return for cipher is ccmp
404 * TRUE: cipher is ccmp
405 * FALSE: cipher is none
407 /*----------------------------------------------------------------------------*/
410 IN P_GLUE_INFO_T prGlueInfo
414 ASSERT(prGlueInfo->prP2PInfo);
416 if (prGlueInfo->prP2PInfo->u4CipherPairwise == IW_AUTH_CIPHER_CCMP)
419 if (prGlueInfo->prP2PInfo->u4CipherPairwise == IW_AUTH_CIPHER_TKIP)
426 kalP2PGetCcmpCipher (
427 IN P_GLUE_INFO_T prGlueInfo
431 ASSERT(prGlueInfo->prP2PInfo);
433 if (prGlueInfo->prP2PInfo->u4CipherPairwise == IW_AUTH_CIPHER_CCMP)
436 if (prGlueInfo->prP2PInfo->u4CipherPairwise == IW_AUTH_CIPHER_TKIP)
444 kalP2PGetTkipCipher (
445 IN P_GLUE_INFO_T prGlueInfo
449 ASSERT(prGlueInfo->prP2PInfo);
451 if (prGlueInfo->prP2PInfo->u4CipherPairwise == IW_AUTH_CIPHER_CCMP)
454 if (prGlueInfo->prP2PInfo->u4CipherPairwise == IW_AUTH_CIPHER_TKIP)
460 /*----------------------------------------------------------------------------*/
462 * \brief to set the status of WSC
469 /*----------------------------------------------------------------------------*/
472 IN P_GLUE_INFO_T prGlueInfo,
477 ASSERT(prGlueInfo->prP2PInfo);
479 prGlueInfo->prP2PInfo->ucWSCRunning = ucWscMode;
483 /*----------------------------------------------------------------------------*/
485 * \brief to get the status of WSC
492 /*----------------------------------------------------------------------------*/
495 IN P_GLUE_INFO_T prGlueInfo
499 ASSERT(prGlueInfo->prP2PInfo);
501 return (prGlueInfo->prP2PInfo->ucWSCRunning);
505 /*----------------------------------------------------------------------------*/
507 * \brief to get the wsc ie length
511 * ucType : 0 for beacon, 1 for probe req, 2 for probe resp
516 /*----------------------------------------------------------------------------*/
519 IN P_GLUE_INFO_T prGlueInfo,
527 return prGlueInfo->prP2PInfo->u2WSCIELen[ucType];
531 /*----------------------------------------------------------------------------*/
533 * \brief to copy the wsc ie setting from p2p supplicant
541 /*----------------------------------------------------------------------------*/
544 IN P_GLUE_INFO_T prGlueInfo,
549 P_GL_P2P_INFO_T prGlP2pInfo = (P_GL_P2P_INFO_T)NULL;
552 if ((prGlueInfo == NULL) ||
554 (pucBuffer == NULL)) {
559 prGlP2pInfo = prGlueInfo->prP2PInfo;
561 kalMemCopy(pucBuffer, prGlP2pInfo->aucWSCIE[ucType], prGlP2pInfo->u2WSCIELen[ucType]);
571 IN P_GLUE_INFO_T prGlueInfo,
573 IN PUINT_8 pucBuffer,
574 IN UINT_16 u2BufferLength
577 P_GL_P2P_INFO_T prGlP2pInfo = (P_GL_P2P_INFO_T)NULL;
580 if ((prGlueInfo == NULL) ||
582 ((u2BufferLength > 0) && (pucBuffer == NULL))) {
587 if (u2BufferLength > 400) {
588 DBGLOG(P2P, ERROR, ("Buffer length is not enough, GLUE only 400 bytes but %d received\n", u2BufferLength));
594 prGlP2pInfo = prGlueInfo->prP2PInfo;
596 kalMemCopy(prGlP2pInfo->aucWSCIE[ucType], pucBuffer, u2BufferLength);
598 prGlP2pInfo->u2WSCIELen[ucType] = u2BufferLength;
604 } /* kalP2PUpdateWSC_IE */
608 /*----------------------------------------------------------------------------*/
610 * \brief indicate an event to supplicant for device connection request
612 * \param[in] prGlueInfo Pointer of GLUE_INFO_T
616 /*----------------------------------------------------------------------------*/
618 kalP2PIndicateConnReq(
619 IN P_GLUE_INFO_T prGlueInfo,
620 IN PUINT_8 pucDevName,
621 IN INT_32 u4NameLength,
622 IN PARAM_MAC_ADDRESS rPeerAddr,
623 IN UINT_8 ucDevType, /* 0: P2P Device / 1: GC / 2: GO */
624 IN INT_32 i4ConfigMethod,
625 IN INT_32 i4ActiveConfigMethod
628 union iwreq_data evt;
629 UINT_8 aucBuffer[IW_CUSTOM_MAX];
633 /* buffer peer information for later IOC_P2P_GET_REQ_DEVICE_INFO access */
634 prGlueInfo->prP2PInfo->u4ConnReqNameLength = u4NameLength > 32 ? 32 : u4NameLength;
635 kalMemCopy(prGlueInfo->prP2PInfo->aucConnReqDevName,
637 prGlueInfo->prP2PInfo->u4ConnReqNameLength);
638 COPY_MAC_ADDR(prGlueInfo->prP2PInfo->rConnReqPeerAddr, rPeerAddr);
639 prGlueInfo->prP2PInfo->ucConnReqDevType = ucDevType;
640 prGlueInfo->prP2PInfo->i4ConnReqConfigMethod = i4ConfigMethod;
641 prGlueInfo->prP2PInfo->i4ConnReqActiveConfigMethod = i4ActiveConfigMethod;
643 // prepare event structure
644 memset(&evt, 0, sizeof(evt));
646 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_DVC_REQ");
647 evt.data.length = strlen(aucBuffer);
649 /* indicate in IWEVCUSTOM event */
650 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
656 } /* end of kalP2PIndicateConnReq() */
659 /*----------------------------------------------------------------------------*/
661 * \brief Indicate an event to supplicant for device connection request from other device.
663 * \param[in] prGlueInfo Pointer of GLUE_INFO_T
664 * \param[in] pucGroupBssid Only valid when invitation Type equals to 0.
668 /*----------------------------------------------------------------------------*/
670 kalP2PInvitationIndication (
671 IN P_GLUE_INFO_T prGlueInfo,
672 IN P_P2P_DEVICE_DESC_T prP2pDevDesc,
675 IN UINT_8 ucOperatingChnl,
676 IN UINT_8 ucInvitationType,
677 IN PUINT_8 pucGroupBssid
681 union iwreq_data evt;
682 UINT_8 aucBuffer[IW_CUSTOM_MAX];
686 /* buffer peer information for later IOC_P2P_GET_STRUCT access */
687 prGlueInfo->prP2PInfo->u4ConnReqNameLength = (UINT_32)((prP2pDevDesc->u2NameLength > 32)? 32 : prP2pDevDesc->u2NameLength);
688 kalMemCopy(prGlueInfo->prP2PInfo->aucConnReqDevName,
689 prP2pDevDesc->aucName,
690 prGlueInfo->prP2PInfo->u4ConnReqNameLength);
691 COPY_MAC_ADDR(prGlueInfo->prP2PInfo->rConnReqPeerAddr, prP2pDevDesc->aucDeviceAddr);
692 COPY_MAC_ADDR(prGlueInfo->prP2PInfo->rConnReqGroupAddr, pucGroupBssid);
693 prGlueInfo->prP2PInfo->i4ConnReqConfigMethod = (INT_32)(prP2pDevDesc->u2ConfigMethod);
694 prGlueInfo->prP2PInfo->ucOperatingChnl = ucOperatingChnl;
695 prGlueInfo->prP2PInfo->ucInvitationType = ucInvitationType;
697 // prepare event structure
698 memset(&evt, 0, sizeof(evt));
700 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_INV_INDICATE");
701 evt.data.length = strlen(aucBuffer);
703 /* indicate in IWEVCUSTOM event */
704 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
711 P_MSG_P2P_CONNECTION_REQUEST_T prP2pConnReq = (P_MSG_P2P_CONNECTION_REQUEST_T)NULL;
712 P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T)NULL;
713 P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T)NULL;
716 ASSERT_BREAK((prGlueInfo != NULL) && (prP2pDevDesc != NULL));
719 // Not a real solution
721 prP2pSpecificBssInfo = prGlueInfo->prAdapter->rWifiVar.prP2pSpecificBssInfo;
722 prP2pConnSettings = prGlueInfo->prAdapter->rWifiVar.prP2PConnSettings;
724 prP2pConnReq = (P_MSG_P2P_CONNECTION_REQUEST_T)cnmMemAlloc(prGlueInfo->prAdapter,
726 sizeof(MSG_P2P_CONNECTION_REQUEST_T));
728 if (prP2pConnReq == NULL) {
733 kalMemZero(prP2pConnReq, sizeof(MSG_P2P_CONNECTION_REQUEST_T));
735 prP2pConnReq->rMsgHdr.eMsgId = MID_MNY_P2P_CONNECTION_REQ;
737 prP2pConnReq->eFormationPolicy = ENUM_P2P_FORMATION_POLICY_AUTO;
739 COPY_MAC_ADDR(prP2pConnReq->aucDeviceID, prP2pDevDesc->aucDeviceAddr);
741 prP2pConnReq->u2ConfigMethod = prP2pDevDesc->u2ConfigMethod;
743 if (ucInvitationType == P2P_INVITATION_TYPE_INVITATION) {
744 prP2pConnReq->fgIsPersistentGroup = FALSE;
745 prP2pConnReq->fgIsTobeGO = FALSE;
749 else if (ucInvitationType == P2P_INVITATION_TYPE_REINVOKE) {
750 DBGLOG(P2P, TRACE, ("Re-invoke Persistent Group\n"));
751 prP2pConnReq->fgIsPersistentGroup = TRUE;
752 prP2pConnReq->fgIsTobeGO = (prGlueInfo->prP2PInfo->ucRole == 2)?TRUE:FALSE;
757 p2pFsmRunEventDeviceDiscoveryAbort(prGlueInfo->prAdapter, NULL);
759 if (ucOperatingChnl != 0) {
760 prP2pSpecificBssInfo->ucPreferredChannel = ucOperatingChnl;
763 if ((ucSsidLen < 32) && (pucSsid != NULL)) {
764 COPY_SSID(prP2pConnSettings->aucSSID,
765 prP2pConnSettings->ucSSIDLen,
770 mboxSendMsg(prGlueInfo->prAdapter,
772 (P_MSG_HDR_T)prP2pConnReq,
773 MSG_SEND_METHOD_BUF);
780 // TODO: Invitation Indication
785 } /* kalP2PInvitationIndication */
788 /*----------------------------------------------------------------------------*/
790 * \brief Indicate an status to supplicant for device invitation status.
792 * \param[in] prGlueInfo Pointer of GLUE_INFO_T
796 /*----------------------------------------------------------------------------*/
798 kalP2PInvitationStatus (
799 IN P_GLUE_INFO_T prGlueInfo,
800 IN UINT_32 u4InvStatus
803 union iwreq_data evt;
804 UINT_8 aucBuffer[IW_CUSTOM_MAX];
808 /* buffer peer information for later IOC_P2P_GET_STRUCT access */
809 prGlueInfo->prP2PInfo->u4InvStatus = u4InvStatus;
811 // prepare event structure
812 memset(&evt, 0, sizeof(evt));
814 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_INV_STATUS");
815 evt.data.length = strlen(aucBuffer);
817 /* indicate in IWEVCUSTOM event */
818 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
824 } /* kalP2PInvitationStatus */
826 /*----------------------------------------------------------------------------*/
828 * \brief Indicate an event to supplicant for Service Discovery request from other device.
830 * \param[in] prGlueInfo Pointer of GLUE_INFO_T
834 /*----------------------------------------------------------------------------*/
836 kalP2PIndicateSDRequest(
837 IN P_GLUE_INFO_T prGlueInfo,
838 IN PARAM_MAC_ADDRESS rPeerAddr,
842 union iwreq_data evt;
843 UINT_8 aucBuffer[IW_CUSTOM_MAX];
847 memset(&evt, 0, sizeof(evt));
849 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_SD_REQ %d", ucSeqNum);
850 evt.data.length = strlen(aucBuffer);
852 /* indicate IWEVP2PSDREQ event */
853 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
859 } /* end of kalP2PIndicateSDRequest() */
862 /*----------------------------------------------------------------------------*/
864 * \brief Indicate an event to supplicant for Service Discovery response
867 * \param[in] prGlueInfo Pointer of GLUE_INFO_T
871 /*----------------------------------------------------------------------------*/
873 kalP2PIndicateSDResponse(
874 IN P_GLUE_INFO_T prGlueInfo,
875 IN PARAM_MAC_ADDRESS rPeerAddr,
879 union iwreq_data evt;
880 UINT_8 aucBuffer[IW_CUSTOM_MAX];
884 memset(&evt, 0, sizeof(evt));
886 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_SD_RESP %d", ucSeqNum);
887 evt.data.length = strlen(aucBuffer);
889 /* indicate IWEVP2PSDREQ event */
890 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
896 } /* end of kalP2PIndicateSDResponse() */
899 /*----------------------------------------------------------------------------*/
901 * \brief Indicate an event to supplicant for Service Discovery TX Done
904 * \param[in] prGlueInfo Pointer of GLUE_INFO_T
905 * \param[in] ucSeqNum Sequence number of the frame
906 * \param[in] ucStatus Status code for TX
910 /*----------------------------------------------------------------------------*/
912 kalP2PIndicateTXDone(
913 IN P_GLUE_INFO_T prGlueInfo,
918 union iwreq_data evt;
919 UINT_8 aucBuffer[IW_CUSTOM_MAX];
923 memset(&evt, 0, sizeof(evt));
925 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_SD_XMITTED: %d %d", ucSeqNum, ucStatus);
926 evt.data.length = strlen(aucBuffer);
928 /* indicate IWEVP2PSDREQ event */
929 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
935 } /* end of kalP2PIndicateSDResponse() */
940 P_GLUE_INFO_T prGlueInfo
944 ASSERT(prGlueInfo->prP2PInfo);
945 return prGlueInfo->prP2PInfo->prDevHandler;
948 #if CFG_SUPPORT_ANTI_PIRACY
949 /*----------------------------------------------------------------------------*/
953 * \param[in] prAdapter Pointer of ADAPTER_T
957 /*----------------------------------------------------------------------------*/
959 kalP2PIndicateSecCheckRsp (
960 IN P_GLUE_INFO_T prGlueInfo,
965 union iwreq_data evt;
966 UINT_8 aucBuffer[IW_CUSTOM_MAX];
970 memset(&evt, 0, sizeof(evt));
971 snprintf(aucBuffer, IW_CUSTOM_MAX-1, "P2P_SEC_CHECK_RSP=");
973 kalMemCopy(prGlueInfo->prP2PInfo->aucSecCheckRsp, pucRsp, u2RspLen);
974 evt.data.length = strlen(aucBuffer);
977 DBGLOG_MEM8(SEC, LOUD, prGlueInfo->prP2PInfo->aucSecCheckRsp, u2RspLen);
979 /* indicate in IWECUSTOM event */
980 wireless_send_event(prGlueInfo->prP2PInfo->prDevHandler,
985 } /* p2pFsmRunEventRxDisassociation */
989 /*----------------------------------------------------------------------------*/
993 * \param[in] prAdapter Pointer of ADAPTER_T
997 /*----------------------------------------------------------------------------*/
1000 IN P_GLUE_INFO_T prGlueInfo,
1001 IN ENUM_BAND_T eSpecificBand,
1002 IN UINT_8 ucMaxChannelNum,
1003 IN PUINT_8 pucNumOfChannel,
1004 IN P_RF_CHANNEL_INFO_T paucChannelList
1007 rlmDomainGetChnlList(prGlueInfo->prAdapter,
1012 } /* kalGetChnlList */
1014 //////////////////////////////////////ICS SUPPORT//////////////////////////////////////
1017 kalP2PIndicateChannelReady (
1018 IN P_GLUE_INFO_T prGlueInfo,
1019 IN UINT_64 u8SeqNum,
1020 IN UINT_32 u4ChannelNum,
1021 IN ENUM_BAND_T eBand,
1022 IN ENUM_CHNL_EXT_T eSco,
1023 IN UINT_32 u4Duration
1026 struct ieee80211_channel *prIEEE80211ChnlStruct = (struct ieee80211_channel *)NULL;
1027 RF_CHANNEL_INFO_T rChannelInfo;
1028 enum nl80211_channel_type eChnlType = NL80211_CHAN_NO_HT;
1031 if (prGlueInfo == NULL) {
1036 kalMemZero(&rChannelInfo, sizeof(RF_CHANNEL_INFO_T));
1038 rChannelInfo.ucChannelNum = u4ChannelNum;
1039 rChannelInfo.eBand = eBand;
1041 prIEEE80211ChnlStruct = kalP2pFuncGetChannelEntry(prGlueInfo->prP2PInfo, &rChannelInfo);
1043 kalP2pFuncGetChannelType(eSco, &eChnlType);
1045 cfg80211_ready_on_channel(prGlueInfo->prP2PInfo->prDevHandler, //struct net_device * dev,
1046 u8SeqNum, //u64 cookie,
1047 prIEEE80211ChnlStruct, //struct ieee80211_channel * chan,
1048 eChnlType, //enum nl80211_channel_type channel_type,
1049 u4Duration, //unsigned int duration,
1050 GFP_KERNEL); //gfp_t gfp /* allocation flags */
1054 } /* kalP2PIndicateChannelReady */
1057 kalP2PIndicateChannelExpired (
1058 IN P_GLUE_INFO_T prGlueInfo,
1059 IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo
1063 P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T)NULL;
1064 struct ieee80211_channel *prIEEE80211ChnlStruct = (struct ieee80211_channel *)NULL;
1065 enum nl80211_channel_type eChnlType = NL80211_CHAN_NO_HT;
1066 RF_CHANNEL_INFO_T rRfChannelInfo;
1069 if ((prGlueInfo == NULL) || (prChnlReqInfo == NULL)) {
1075 prGlueP2pInfo = prGlueInfo->prP2PInfo;
1077 if (prGlueP2pInfo == NULL) {
1083 DBGLOG(P2P, TRACE, ("kalP2PIndicateChannelExpired\n"));
1085 rRfChannelInfo.eBand = prChnlReqInfo->eBand;
1086 rRfChannelInfo.ucChannelNum = prChnlReqInfo->ucReqChnlNum;
1088 prIEEE80211ChnlStruct = kalP2pFuncGetChannelEntry(prGlueP2pInfo, &rRfChannelInfo);
1091 kalP2pFuncGetChannelType(prChnlReqInfo->eChnlSco,
1095 cfg80211_remain_on_channel_expired(prGlueP2pInfo->prDevHandler, //struct net_device * dev,
1096 prChnlReqInfo->u8Cookie,
1097 prIEEE80211ChnlStruct,
1103 } /* kalP2PIndicateChannelExpired */
1106 kalP2PIndicateScanDone (
1107 IN P_GLUE_INFO_T prGlueInfo,
1108 IN BOOLEAN fgIsAbort
1111 P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T)NULL;
1114 if (prGlueInfo == NULL) {
1120 prGlueP2pInfo = prGlueInfo->prP2PInfo;
1122 if (prGlueP2pInfo == NULL) {
1128 if (prGlueP2pInfo->prScanRequest) {
1129 cfg80211_scan_done(prGlueP2pInfo->prScanRequest,
1132 prGlueP2pInfo->prScanRequest = NULL;
1138 } /* kalP2PIndicateScanDone */
1141 kalP2PIndicateBssInfo (
1142 IN P_GLUE_INFO_T prGlueInfo,
1143 IN PUINT_8 pucFrameBuf,
1144 IN UINT_32 u4BufLen,
1145 IN P_RF_CHANNEL_INFO_T prChannelInfo,
1146 IN INT_32 i4SignalStrength
1149 P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T)NULL;
1150 struct ieee80211_channel *prChannelEntry = (struct ieee80211_channel *)NULL;
1151 struct ieee80211_mgmt *prBcnProbeRspFrame = (struct ieee80211_mgmt *)pucFrameBuf;
1152 struct cfg80211_bss *prCfg80211Bss = (struct cfg80211_bss *)NULL;
1155 if ((prGlueInfo == NULL) || (pucFrameBuf == NULL) || (prChannelInfo == NULL)) {
1160 prGlueP2pInfo = prGlueInfo->prP2PInfo;
1162 if (prGlueP2pInfo == NULL) {
1168 prChannelEntry = kalP2pFuncGetChannelEntry(prGlueP2pInfo, prChannelInfo);
1170 if (prChannelEntry == NULL) {
1171 DBGLOG(P2P, TRACE, ("Unknown channel info\n"));
1176 //rChannelInfo.center_freq = nicChannelNum2Freq((UINT_32)prChannelInfo->ucChannelNum) / 1000;
1178 prCfg80211Bss = cfg80211_inform_bss_frame(prGlueP2pInfo->wdev.wiphy, //struct wiphy * wiphy,
1186 /* Return this structure. */
1187 cfg80211_put_bss(prCfg80211Bss);
1193 } /* kalP2PIndicateBssInfo */
1196 kalP2PIndicateMgmtTxStatus (
1197 IN P_GLUE_INFO_T prGlueInfo,
1198 IN UINT_64 u8Cookie,
1200 IN PUINT_8 pucFrameBuf,
1201 IN UINT_32 u4FrameLen
1204 P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T)NULL;
1207 if ((prGlueInfo == NULL) ||
1208 (pucFrameBuf == NULL) ||
1209 (u4FrameLen == 0)) {
1210 DBGLOG(P2P, TRACE, ("Unexpected pointer PARAM. 0x%lx, 0x%lx, %ld.", prGlueInfo, pucFrameBuf, u4FrameLen));
1215 prGlueP2pInfo = prGlueInfo->prP2PInfo;
1217 cfg80211_mgmt_tx_status(prGlueP2pInfo->prDevHandler, //struct net_device * dev,
1226 } /* kalP2PIndicateMgmtTxStatus */
1229 kalP2PIndicateRxMgmtFrame (
1230 IN P_GLUE_INFO_T prGlueInfo,
1231 IN P_SW_RFB_T prSwRfb
1234 #define DBG_P2P_MGMT_FRAME_INDICATION 0
1235 P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T)NULL;
1237 UINT_8 ucChnlNum = 0;
1238 #if DBG_P2P_MGMT_FRAME_INDICATION
1239 P_WLAN_MAC_HEADER_T prWlanHeader = (P_WLAN_MAC_HEADER_T)NULL;
1244 if ((prGlueInfo == NULL) || (prSwRfb == NULL)) {
1249 prGlueP2pInfo = prGlueInfo->prP2PInfo;
1251 ucChnlNum = prSwRfb->prHifRxHdr->ucHwChannelNum;
1253 #if DBG_P2P_MGMT_FRAME_INDICATION
1255 prWlanHeader = (P_WLAN_MAC_HEADER_T)prSwRfb->pvHeader;
1257 switch (prWlanHeader->u2FrameCtrl) {
1258 case MAC_FRAME_PROBE_REQ:
1259 DBGLOG(P2P, TRACE, ("RX Probe Req at channel %d ", ucChnlNum));
1261 case MAC_FRAME_PROBE_RSP:
1262 DBGLOG(P2P, TRACE, ("RX Probe Rsp at channel %d ", ucChnlNum));
1264 case MAC_FRAME_ACTION:
1265 DBGLOG(P2P, TRACE, ("RX Action frame at channel %d ", ucChnlNum));
1268 DBGLOG(P2P, TRACE, ("RX Packet:%d at channel %d ", prWlanHeader->u2FrameCtrl, ucChnlNum));
1272 DBGLOG(P2P, TRACE, ("from: "MACSTR"\n", MAC2STR(prWlanHeader->aucAddr2)));
1274 i4Freq = nicChannelNum2Freq(ucChnlNum) / 1000;
1276 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
1277 cfg80211_rx_mgmt(prGlueP2pInfo->prDevHandler, //struct net_device * dev,
1279 RCPI_TO_dBm(prSwRfb->prHifRxHdr->ucRcpi),
1281 prSwRfb->u2PacketLen,
1284 cfg80211_rx_mgmt(prGlueP2pInfo->prDevHandler, //struct net_device * dev,
1287 prSwRfb->u2PacketLen,
1293 } /* kalP2PIndicateRxMgmtFrame */
1296 kalP2PGCIndicateConnectionStatus (
1297 IN P_GLUE_INFO_T prGlueInfo,
1298 IN P_P2P_CONNECTION_REQ_INFO_T prP2pConnInfo,
1299 IN PUINT_8 pucRxIEBuf,
1300 IN UINT_16 u2RxIELen,
1301 IN UINT_16 u2StatusReason
1304 P_GL_P2P_INFO_T prGlueP2pInfo = (P_GL_P2P_INFO_T)NULL;
1307 if (prGlueInfo == NULL) {
1313 prGlueP2pInfo = prGlueInfo->prP2PInfo;
1315 if (prP2pConnInfo) {
1316 cfg80211_connect_result(prGlueP2pInfo->prDevHandler, //struct net_device * dev,
1317 prP2pConnInfo->aucBssid,
1318 prP2pConnInfo->aucIEBuf,
1319 prP2pConnInfo->u4BufLength,
1323 GFP_KERNEL); //gfp_t gfp /* allocation flags */
1324 prP2pConnInfo->fgIsConnRequest = FALSE;
1327 /* Disconnect, what if u2StatusReason == 0? */
1328 cfg80211_disconnected(prGlueP2pInfo->prDevHandler, //struct net_device * dev,
1340 } /* kalP2PGCIndicateConnectionStatus */
1344 kalP2PGOStationUpdate (
1345 IN P_GLUE_INFO_T prGlueInfo,
1346 IN P_STA_RECORD_T prCliStaRec,
1350 P_GL_P2P_INFO_T prP2pGlueInfo = (P_GL_P2P_INFO_T)NULL;
1351 struct station_info rStationInfo;
1354 if ((prGlueInfo == NULL) || (prCliStaRec == NULL)) {
1359 prP2pGlueInfo = prGlueInfo->prP2PInfo;
1362 rStationInfo.filled = STATION_INFO_ASSOC_REQ_IES;
1363 rStationInfo.generation = ++prP2pGlueInfo->i4Generation;
1365 rStationInfo.assoc_req_ies = prCliStaRec->pucAssocReqIe;
1366 rStationInfo.assoc_req_ies_len = prCliStaRec->u2AssocReqIeLen;
1367 // rStationInfo.filled |= STATION_INFO_ASSOC_REQ_IES;
1369 cfg80211_new_sta(prGlueInfo->prP2PInfo->prDevHandler, //struct net_device * dev,
1370 prCliStaRec->aucMacAddr,
1375 ++prP2pGlueInfo->i4Generation;
1377 cfg80211_del_sta(prGlueInfo->prP2PInfo->prDevHandler, //struct net_device * dev,
1378 prCliStaRec->aucMacAddr,
1387 } /* kalP2PGOStationUpdate */
1393 kalP2pFuncGetChannelType(
1394 IN ENUM_CHNL_EXT_T rChnlSco,
1395 OUT enum nl80211_channel_type *channel_type
1398 BOOLEAN fgIsValid = FALSE;
1405 *channel_type = NL80211_CHAN_NO_HT;
1408 *channel_type = NL80211_CHAN_HT40MINUS;
1411 *channel_type = NL80211_CHAN_HT40PLUS;
1415 *channel_type = NL80211_CHAN_NO_HT;
1425 } /* kalP2pFuncGetChannelType */
1430 struct ieee80211_channel *
1431 kalP2pFuncGetChannelEntry (
1432 IN P_GL_P2P_INFO_T prP2pInfo,
1433 IN P_RF_CHANNEL_INFO_T prChannelInfo
1436 struct ieee80211_channel *prTargetChannelEntry = (struct ieee80211_channel *)NULL;
1437 UINT_32 u4TblSize = 0, u4Idx = 0;
1440 if ((prP2pInfo == NULL) || (prChannelInfo == NULL)) {
1445 switch (prChannelInfo->eBand) {
1447 prTargetChannelEntry = prP2pInfo->wdev.wiphy->bands[IEEE80211_BAND_2GHZ]->channels;
1448 u4TblSize = prP2pInfo->wdev.wiphy->bands[IEEE80211_BAND_2GHZ]->n_channels;
1451 prTargetChannelEntry = prP2pInfo->wdev.wiphy->bands[IEEE80211_BAND_5GHZ]->channels;
1452 u4TblSize = prP2pInfo->wdev.wiphy->bands[IEEE80211_BAND_5GHZ]->n_channels;
1459 if (prTargetChannelEntry == NULL) {
1465 for (u4Idx = 0; u4Idx < u4TblSize; u4Idx++, prTargetChannelEntry++) {
1466 if (prTargetChannelEntry->hw_value == prChannelInfo->ucChannelNum) {
1473 if (u4Idx == u4TblSize) {
1474 prTargetChannelEntry = NULL;
1481 return prTargetChannelEntry;
1482 } /* kalP2pFuncGetChannelEntry */
1485 /*----------------------------------------------------------------------------*/
1487 * \brief to set the block list of Hotspot
1494 /*----------------------------------------------------------------------------*/
1496 kalP2PSetBlackList (
1497 IN P_GLUE_INFO_T prGlueInfo,
1498 IN PARAM_MAC_ADDRESS rbssid,
1499 IN BOOLEAN fgIsblock
1502 UINT_8 aucNullAddr[] = NULL_MAC_ADDR;
1503 BOOLEAN fgIsValid = FALSE;
1507 ASSERT(prGlueInfo->prP2PInfo);
1510 for(i = 0; i < 8; i++) {
1511 if(UNEQUAL_MAC_ADDR(rbssid, aucNullAddr)) {
1512 if(UNEQUAL_MAC_ADDR(&(prGlueInfo->prP2PInfo->aucblackMACList[i]), rbssid)) {
1513 if(EQUAL_MAC_ADDR (&(prGlueInfo->prP2PInfo->aucblackMACList[i]), aucNullAddr)) {
1514 COPY_MAC_ADDR(&(prGlueInfo->prP2PInfo->aucblackMACList[i]), rbssid);
1523 for(i = 0; i < 8; i++) {
1524 if(EQUAL_MAC_ADDR(&(prGlueInfo->prP2PInfo->aucblackMACList[i]), rbssid)) {
1525 COPY_MAC_ADDR(&(prGlueInfo->prP2PInfo->aucblackMACList[i]), aucNullAddr);
1537 /*----------------------------------------------------------------------------*/
1539 * \brief to compare the black list of Hotspot
1546 /*----------------------------------------------------------------------------*/
1548 kalP2PCmpBlackList (
1549 IN P_GLUE_INFO_T prGlueInfo,
1550 IN PARAM_MAC_ADDRESS rbssid
1553 UINT_8 aucNullAddr[] = NULL_MAC_ADDR;
1554 BOOLEAN fgIsExsit = FALSE;
1558 ASSERT(prGlueInfo->prP2PInfo);
1560 for(i = 0; i < 8; i++) {
1561 if(UNEQUAL_MAC_ADDR(rbssid, aucNullAddr)){
1562 if(EQUAL_MAC_ADDR(&(prGlueInfo->prP2PInfo->aucblackMACList[i]), rbssid)) {
1574 /*----------------------------------------------------------------------------*/
1576 * \brief to return the max clients of Hotspot
1583 /*----------------------------------------------------------------------------*/
1585 kalP2PSetMaxClients (
1586 IN P_GLUE_INFO_T prGlueInfo,
1587 IN UINT_32 u4MaxClient
1591 ASSERT(prGlueInfo->prP2PInfo);
1593 if(u4MaxClient == 0 || prGlueInfo->prP2PInfo->ucMaxClients >= P2P_MAXIMUM_CLIENT_COUNT)
1594 prGlueInfo->prP2PInfo->ucMaxClients = P2P_MAXIMUM_CLIENT_COUNT;
1596 prGlueInfo->prP2PInfo->ucMaxClients = u4MaxClient;
1600 /*----------------------------------------------------------------------------*/
1602 * \brief to return the max clients of Hotspot
1609 /*----------------------------------------------------------------------------*/
1612 IN P_GLUE_INFO_T prGlueInfo,
1613 IN UINT_32 u4NumClient
1617 ASSERT(prGlueInfo->prP2PInfo);
1619 if(prGlueInfo->prP2PInfo->ucMaxClients) {
1620 if((UINT_8)u4NumClient > prGlueInfo->prP2PInfo->ucMaxClients)