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
);
1044 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
1045 cfg80211_ready_on_channel(&prGlueInfo
->prP2PInfo
->wdev
, //struct wireless_dev,
1046 u8SeqNum
, //u64 cookie,
1047 prIEEE80211ChnlStruct
, //struct ieee80211_channel * chan,
1048 u4Duration
, //unsigned int duration,
1049 GFP_KERNEL
); //gfp_t gfp /* allocation flags */
1051 cfg80211_ready_on_channel(prGlueInfo
->prP2PInfo
->prDevHandler
, //struct net_device * dev,
1052 u8SeqNum
, //u64 cookie,
1053 prIEEE80211ChnlStruct
, //struct ieee80211_channel * chan,
1054 eChnlType
, //enum nl80211_channel_type channel_type,
1055 u4Duration
, //unsigned int duration,
1056 GFP_KERNEL
); //gfp_t gfp /* allocation flags */
1060 } /* kalP2PIndicateChannelReady */
1063 kalP2PIndicateChannelExpired (
1064 IN P_GLUE_INFO_T prGlueInfo
,
1065 IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo
1069 P_GL_P2P_INFO_T prGlueP2pInfo
= (P_GL_P2P_INFO_T
)NULL
;
1070 struct ieee80211_channel
*prIEEE80211ChnlStruct
= (struct ieee80211_channel
*)NULL
;
1071 enum nl80211_channel_type eChnlType
= NL80211_CHAN_NO_HT
;
1072 RF_CHANNEL_INFO_T rRfChannelInfo
;
1075 if ((prGlueInfo
== NULL
) || (prChnlReqInfo
== NULL
)) {
1081 prGlueP2pInfo
= prGlueInfo
->prP2PInfo
;
1083 if (prGlueP2pInfo
== NULL
) {
1089 DBGLOG(P2P
, TRACE
, ("kalP2PIndicateChannelExpired\n"));
1091 rRfChannelInfo
.eBand
= prChnlReqInfo
->eBand
;
1092 rRfChannelInfo
.ucChannelNum
= prChnlReqInfo
->ucReqChnlNum
;
1094 prIEEE80211ChnlStruct
= kalP2pFuncGetChannelEntry(prGlueP2pInfo
, &rRfChannelInfo
);
1097 kalP2pFuncGetChannelType(prChnlReqInfo
->eChnlSco
,
1100 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
1101 cfg80211_remain_on_channel_expired(&prGlueP2pInfo
->wdev
, //struct wireless_dev,
1102 prChnlReqInfo
->u8Cookie
,
1103 prIEEE80211ChnlStruct
,
1106 cfg80211_remain_on_channel_expired(prGlueP2pInfo
->prDevHandler
, //struct net_device * dev,
1107 prChnlReqInfo
->u8Cookie
,
1108 prIEEE80211ChnlStruct
,
1114 } /* kalP2PIndicateChannelExpired */
1117 kalP2PIndicateScanDone (
1118 IN P_GLUE_INFO_T prGlueInfo
,
1119 IN BOOLEAN fgIsAbort
1122 P_GL_P2P_INFO_T prGlueP2pInfo
= (P_GL_P2P_INFO_T
)NULL
;
1123 struct cfg80211_scan_request
*prScanRequest
= NULL
;
1124 GLUE_SPIN_LOCK_DECLARATION();
1127 if (prGlueInfo
== NULL
) {
1133 prGlueP2pInfo
= prGlueInfo
->prP2PInfo
;
1135 if (prGlueP2pInfo
== NULL
) {
1140 DBGLOG(INIT
, TRACE
, ("[p2p] scan complete %p\n", prGlueP2pInfo
->prScanRequest
));
1142 GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo
, SPIN_LOCK_NET_DEV
);
1143 if(prGlueP2pInfo
->prScanRequest
!= NULL
) {
1144 prScanRequest
= prGlueP2pInfo
->prScanRequest
;
1145 prGlueP2pInfo
->prScanRequest
= NULL
;
1147 GLUE_RELEASE_SPIN_LOCK(prGlueInfo
, SPIN_LOCK_NET_DEV
);
1149 /* 2. then CFG80211 Indication */
1151 if(prScanRequest
!= NULL
) {
1153 /* report all queued beacon/probe response frames to upper layer */
1154 scanReportBss2Cfg80211(prGlueInfo
->prAdapter
,BSS_TYPE_P2P_DEVICE
,NULL
);
1156 DBGLOG(INIT
, TRACE
, ("DBG:p2p_cfg_scan_done\n"));
1157 cfg80211_scan_done(prScanRequest
, fgIsAbort
);
1163 } /* kalP2PIndicateScanDone */
1166 kalP2PIndicateBssInfo (
1167 IN P_GLUE_INFO_T prGlueInfo
,
1168 IN PUINT_8 pucFrameBuf
,
1169 IN UINT_32 u4BufLen
,
1170 IN P_RF_CHANNEL_INFO_T prChannelInfo
,
1171 IN INT_32 i4SignalStrength
1174 P_GL_P2P_INFO_T prGlueP2pInfo
= (P_GL_P2P_INFO_T
)NULL
;
1175 struct ieee80211_channel
*prChannelEntry
= (struct ieee80211_channel
*)NULL
;
1176 struct ieee80211_mgmt
*prBcnProbeRspFrame
= (struct ieee80211_mgmt
*)pucFrameBuf
;
1177 struct cfg80211_bss
*prCfg80211Bss
= (struct cfg80211_bss
*)NULL
;
1180 if ((prGlueInfo
== NULL
) || (pucFrameBuf
== NULL
) || (prChannelInfo
== NULL
)) {
1185 prGlueP2pInfo
= prGlueInfo
->prP2PInfo
;
1187 if (prGlueP2pInfo
== NULL
) {
1193 prChannelEntry
= kalP2pFuncGetChannelEntry(prGlueP2pInfo
, prChannelInfo
);
1195 if (prChannelEntry
== NULL
) {
1196 DBGLOG(P2P
, TRACE
, ("Unknown channel info\n"));
1201 //rChannelInfo.center_freq = nicChannelNum2Freq((UINT_32)prChannelInfo->ucChannelNum) / 1000;
1203 prCfg80211Bss
= cfg80211_inform_bss_frame(prGlueP2pInfo
->wdev
.wiphy
, //struct wiphy * wiphy,
1211 /* Return this structure. */
1212 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
1213 cfg80211_put_bss(prGlueP2pInfo
->wdev
.wiphy
, prCfg80211Bss
);
1215 cfg80211_put_bss(prCfg80211Bss
);
1217 DBGLOG(REQ
, INFO
, ("indicate ok 0x%p\n", prCfg80211Bss
));
1223 } /* kalP2PIndicateBssInfo */
1226 kalP2PIndicateMgmtTxStatus (
1227 IN P_GLUE_INFO_T prGlueInfo
,
1228 IN UINT_64 u8Cookie
,
1230 IN PUINT_8 pucFrameBuf
,
1231 IN UINT_32 u4FrameLen
1234 P_GL_P2P_INFO_T prGlueP2pInfo
= (P_GL_P2P_INFO_T
)NULL
;
1237 if ((prGlueInfo
== NULL
) ||
1238 (pucFrameBuf
== NULL
) ||
1239 (u4FrameLen
== 0)) {
1240 DBGLOG(P2P
, TRACE
, ("Unexpected pointer PARAM. %p, %p, %u.",
1241 prGlueInfo
, pucFrameBuf
, u4FrameLen
));
1246 prGlueP2pInfo
= prGlueInfo
->prP2PInfo
;
1248 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
1249 cfg80211_mgmt_tx_status(&prGlueP2pInfo
->wdev
, //struct net_device * dev,
1251 cfg80211_mgmt_tx_status(prGlueP2pInfo
->prDevHandler
, //struct net_device * dev,
1252 #endif /* LINUX_VERSION_CODE */
1261 } /* kalP2PIndicateMgmtTxStatus */
1264 kalP2PIndicateRxMgmtFrame (
1265 IN P_GLUE_INFO_T prGlueInfo
,
1266 IN P_SW_RFB_T prSwRfb
1269 #define DBG_P2P_MGMT_FRAME_INDICATION 0
1270 P_GL_P2P_INFO_T prGlueP2pInfo
= (P_GL_P2P_INFO_T
)NULL
;
1272 UINT_8 ucChnlNum
= 0;
1273 #if DBG_P2P_MGMT_FRAME_INDICATION
1274 P_WLAN_MAC_HEADER_T prWlanHeader
= (P_WLAN_MAC_HEADER_T
)NULL
;
1279 if ((prGlueInfo
== NULL
) || (prSwRfb
== NULL
)) {
1284 prGlueP2pInfo
= prGlueInfo
->prP2PInfo
;
1286 ucChnlNum
= prSwRfb
->prHifRxHdr
->ucHwChannelNum
;
1288 #if DBG_P2P_MGMT_FRAME_INDICATION
1290 prWlanHeader
= (P_WLAN_MAC_HEADER_T
)prSwRfb
->pvHeader
;
1292 switch (prWlanHeader
->u2FrameCtrl
) {
1293 case MAC_FRAME_PROBE_REQ
:
1294 DBGLOG(P2P
, TRACE
, ("RX Probe Req at channel %d ", ucChnlNum
));
1296 case MAC_FRAME_PROBE_RSP
:
1297 DBGLOG(P2P
, TRACE
, ("RX Probe Rsp at channel %d ", ucChnlNum
));
1299 case MAC_FRAME_ACTION
:
1300 DBGLOG(P2P
, TRACE
, ("RX Action frame at channel %d ", ucChnlNum
));
1303 DBGLOG(P2P
, TRACE
, ("RX Packet:%d at channel %d ", prWlanHeader
->u2FrameCtrl
, ucChnlNum
));
1307 DBGLOG(P2P
, TRACE
, ("from: "MACSTR
"\n", MAC2STR(prWlanHeader
->aucAddr2
)));
1309 i4Freq
= nicChannelNum2Freq(ucChnlNum
) / 1000;
1311 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
1312 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
1313 cfg80211_rx_mgmt(&prGlueP2pInfo
->wdev
, //struct net_device * dev,
1315 cfg80211_rx_mgmt(prGlueP2pInfo
->prDevHandler
, //struct net_device * dev,
1316 #endif /* LINUX_VERSION_CODE */
1318 RCPI_TO_dBm(prSwRfb
->prHifRxHdr
->ucRcpi
),
1320 prSwRfb
->u2PacketLen
,
1323 cfg80211_rx_mgmt(prGlueP2pInfo
->prDevHandler
, //struct net_device * dev,
1326 prSwRfb
->u2PacketLen
,
1332 } /* kalP2PIndicateRxMgmtFrame */
1335 kalP2PGCIndicateConnectionStatus (
1336 IN P_GLUE_INFO_T prGlueInfo
,
1337 IN P_P2P_CONNECTION_REQ_INFO_T prP2pConnInfo
,
1338 IN PUINT_8 pucRxIEBuf
,
1339 IN UINT_16 u2RxIELen
,
1340 IN UINT_16 u2StatusReason
1343 P_GL_P2P_INFO_T prGlueP2pInfo
= (P_GL_P2P_INFO_T
)NULL
;
1346 if (prGlueInfo
== NULL
) {
1352 prGlueP2pInfo
= prGlueInfo
->prP2PInfo
;
1354 if (prP2pConnInfo
) {
1355 cfg80211_connect_result(prGlueP2pInfo
->prDevHandler
, //struct net_device * dev,
1356 prP2pConnInfo
->aucBssid
,
1357 prP2pConnInfo
->aucIEBuf
,
1358 prP2pConnInfo
->u4BufLength
,
1362 GFP_KERNEL
); //gfp_t gfp /* allocation flags */
1363 prP2pConnInfo
->fgIsConnRequest
= FALSE
;
1366 /* Disconnect, what if u2StatusReason == 0? */
1367 cfg80211_disconnected(prGlueP2pInfo
->prDevHandler
, //struct net_device * dev,
1379 } /* kalP2PGCIndicateConnectionStatus */
1383 kalP2PGOStationUpdate (
1384 IN P_GLUE_INFO_T prGlueInfo
,
1385 IN P_STA_RECORD_T prCliStaRec
,
1389 P_GL_P2P_INFO_T prP2pGlueInfo
= (P_GL_P2P_INFO_T
)NULL
;
1390 struct station_info rStationInfo
;
1393 if ((prGlueInfo
== NULL
) || (prCliStaRec
== NULL
)) {
1398 prP2pGlueInfo
= prGlueInfo
->prP2PInfo
;
1401 rStationInfo
.filled
= STATION_INFO_ASSOC_REQ_IES
;
1402 rStationInfo
.generation
= ++prP2pGlueInfo
->i4Generation
;
1404 rStationInfo
.assoc_req_ies
= prCliStaRec
->pucAssocReqIe
;
1405 rStationInfo
.assoc_req_ies_len
= prCliStaRec
->u2AssocReqIeLen
;
1406 // rStationInfo.filled |= STATION_INFO_ASSOC_REQ_IES;
1408 cfg80211_new_sta(prGlueInfo
->prP2PInfo
->prDevHandler
, //struct net_device * dev,
1409 prCliStaRec
->aucMacAddr
,
1414 ++prP2pGlueInfo
->i4Generation
;
1416 cfg80211_del_sta(prGlueInfo
->prP2PInfo
->prDevHandler
, //struct net_device * dev,
1417 prCliStaRec
->aucMacAddr
,
1426 } /* kalP2PGOStationUpdate */
1432 kalP2pFuncGetChannelType(
1433 IN ENUM_CHNL_EXT_T rChnlSco
,
1434 OUT
enum nl80211_channel_type
*channel_type
1437 BOOLEAN fgIsValid
= FALSE
;
1444 *channel_type
= NL80211_CHAN_NO_HT
;
1447 *channel_type
= NL80211_CHAN_HT40MINUS
;
1450 *channel_type
= NL80211_CHAN_HT40PLUS
;
1454 *channel_type
= NL80211_CHAN_NO_HT
;
1464 } /* kalP2pFuncGetChannelType */
1469 struct ieee80211_channel
*
1470 kalP2pFuncGetChannelEntry (
1471 IN P_GL_P2P_INFO_T prP2pInfo
,
1472 IN P_RF_CHANNEL_INFO_T prChannelInfo
1475 struct ieee80211_channel
*prTargetChannelEntry
= (struct ieee80211_channel
*)NULL
;
1476 UINT_32 u4TblSize
= 0, u4Idx
= 0;
1479 if ((prP2pInfo
== NULL
) || (prChannelInfo
== NULL
)) {
1484 switch (prChannelInfo
->eBand
) {
1486 prTargetChannelEntry
= prP2pInfo
->wdev
.wiphy
->bands
[IEEE80211_BAND_2GHZ
]->channels
;
1487 u4TblSize
= prP2pInfo
->wdev
.wiphy
->bands
[IEEE80211_BAND_2GHZ
]->n_channels
;
1490 prTargetChannelEntry
= prP2pInfo
->wdev
.wiphy
->bands
[IEEE80211_BAND_5GHZ
]->channels
;
1491 u4TblSize
= prP2pInfo
->wdev
.wiphy
->bands
[IEEE80211_BAND_5GHZ
]->n_channels
;
1498 if (prTargetChannelEntry
== NULL
) {
1504 for (u4Idx
= 0; u4Idx
< u4TblSize
; u4Idx
++, prTargetChannelEntry
++) {
1505 if (prTargetChannelEntry
->hw_value
== prChannelInfo
->ucChannelNum
) {
1512 if (u4Idx
== u4TblSize
) {
1513 prTargetChannelEntry
= NULL
;
1520 return prTargetChannelEntry
;
1521 } /* kalP2pFuncGetChannelEntry */
1524 /*----------------------------------------------------------------------------*/
1526 * \brief to set the block list of Hotspot
1533 /*----------------------------------------------------------------------------*/
1535 kalP2PSetBlackList (
1536 IN P_GLUE_INFO_T prGlueInfo
,
1537 IN PARAM_MAC_ADDRESS rbssid
,
1538 IN BOOLEAN fgIsblock
1541 UINT_8 aucNullAddr
[] = NULL_MAC_ADDR
;
1545 ASSERT(prGlueInfo
->prP2PInfo
);
1547 if(EQUAL_MAC_ADDR(rbssid
, aucNullAddr
))
1551 for(i
= 0; i
< 8; i
++) {
1552 if(EQUAL_MAC_ADDR(&(prGlueInfo
->prP2PInfo
->aucblackMACList
[i
]), rbssid
)) {
1555 else if(EQUAL_MAC_ADDR(&(prGlueInfo
->prP2PInfo
->aucblackMACList
[i
]), aucNullAddr
)) {
1556 COPY_MAC_ADDR(&(prGlueInfo
->prP2PInfo
->aucblackMACList
[i
]), rbssid
);
1561 DBGLOG(P2P
, ERROR
, ("AP black list is full, cannot block more STA!!\n"));
1566 for(i
= 0; i
< 8; i
++) {
1567 if(EQUAL_MAC_ADDR(&(prGlueInfo
->prP2PInfo
->aucblackMACList
[i
]), rbssid
)) {
1568 COPY_MAC_ADDR(&(prGlueInfo
->prP2PInfo
->aucblackMACList
[i
]), aucNullAddr
);
1573 DBGLOG(P2P
, ERROR
, ("The STA is not found in black list!!\n"));
1581 /*----------------------------------------------------------------------------*/
1583 * \brief to compare the black list of Hotspot
1590 /*----------------------------------------------------------------------------*/
1592 kalP2PCmpBlackList (
1593 IN P_GLUE_INFO_T prGlueInfo
,
1594 IN PARAM_MAC_ADDRESS rbssid
1597 UINT_8 aucNullAddr
[] = NULL_MAC_ADDR
;
1598 BOOLEAN fgIsExsit
= FALSE
;
1602 ASSERT(prGlueInfo
->prP2PInfo
);
1604 for(i
= 0; i
< 8; i
++) {
1605 if(UNEQUAL_MAC_ADDR(rbssid
, aucNullAddr
)){
1606 if(EQUAL_MAC_ADDR(&(prGlueInfo
->prP2PInfo
->aucblackMACList
[i
]), rbssid
)) {
1618 /*----------------------------------------------------------------------------*/
1620 * \brief to return the max clients of Hotspot
1627 /*----------------------------------------------------------------------------*/
1629 kalP2PSetMaxClients (
1630 IN P_GLUE_INFO_T prGlueInfo
,
1631 IN UINT_32 u4MaxClient
1635 ASSERT(prGlueInfo
->prP2PInfo
);
1637 if(u4MaxClient
== 0 || prGlueInfo
->prP2PInfo
->ucMaxClients
>= P2P_MAXIMUM_CLIENT_COUNT
)
1638 prGlueInfo
->prP2PInfo
->ucMaxClients
= P2P_MAXIMUM_CLIENT_COUNT
;
1640 prGlueInfo
->prP2PInfo
->ucMaxClients
= u4MaxClient
;
1644 /*----------------------------------------------------------------------------*/
1646 * \brief to return the max clients of Hotspot
1653 /*----------------------------------------------------------------------------*/
1656 IN P_GLUE_INFO_T prGlueInfo
,
1657 IN UINT_32 u4NumClient
1661 ASSERT(prGlueInfo
->prP2PInfo
);
1663 if(prGlueInfo
->prP2PInfo
->ucMaxClients
) {
1664 if((UINT_8
)u4NumClient
> prGlueInfo
->prP2PInfo
->ucMaxClients
)