summaryrefslogtreecommitdiff
path: root/network/wlan/WDI/COMMON/P2P_Receive.c
diff options
context:
space:
mode:
Diffstat (limited to 'network/wlan/WDI/COMMON/P2P_Receive.c')
-rw-r--r--network/wlan/WDI/COMMON/P2P_Receive.c744
1 files changed, 744 insertions, 0 deletions
diff --git a/network/wlan/WDI/COMMON/P2P_Receive.c b/network/wlan/WDI/COMMON/P2P_Receive.c
new file mode 100644
index 00000000..858e8231
--- /dev/null
+++ b/network/wlan/WDI/COMMON/P2P_Receive.c
@@ -0,0 +1,744 @@
+#include "Mp_Precomp.h"
+
+#if WPP_SOFTWARE_TRACE
+#include "P2P_Receive.tmh"
+#endif
+
+#include "P2P_Internal.h"
+
+#if (P2P_SUPPORT == 1)
+
+//-----------------------------------------------------------------------------
+// Local
+//-----------------------------------------------------------------------------
+
+
+//-----------------------------------------------------------------------------
+// Exported
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// Exported: public
+//-----------------------------------------------------------------------------
+
+BOOLEAN
+p2p_validate_Beacon(
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!FrameBuf_Length(&msg->p2pAttributes))
+ {
+ break;
+ }
+
+ if(!msg->_devId)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dev id attr\n"));
+ break;
+ }
+
+ if(!msg->_capability)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no capability attr\n"));
+ break;
+ }
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_ProbeReq(
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!FrameBuf_Length(&msg->p2pAttributes))
+ {
+ break;
+ }
+
+ if(!msg->_capability)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no capability attr\n"));
+ break;
+ }
+
+ if(!msg->_opChannel && TEST_FLAG(msg->grpCap, P2P_GROUP_CAP_GROUP_OWNER))
+ {
+ // PF #2, some vender don't send ProbeReq with op channel
+ // do not filter
+ }
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_ProbeRsp(
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!FrameBuf_Length(&msg->p2pAttributes))
+ {
+ break;
+ }
+
+ if(!msg->_capability)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no capability attr\n"));
+ break;
+ }
+
+ if(!msg->_devInfo)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dev info attr\n"));
+ break;
+ }
+
+ if(!msg->_dsParam) // from P2P_OnProbersp
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no ds param ie\n"));
+ break;
+ }
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_AssocReq(
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!msg->_capability)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no capability attr\n"));
+ break;
+ }
+
+ if(!msg->_devInfo)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dev info attr\n"));
+ break;
+ }
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_AssocRsp(
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ /*if(!msg->_status)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no status attr\n"));
+ break;
+ }*/
+
+ /*if(!msg->_capability)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no capability attr\n"));
+ break;
+ }*/
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_Deauth(
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ /*if(!msg->_minorReasonCode)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no minor reason code attr\n"));
+ break;
+ }*/
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_GoNegReq(
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!msg->_dialogToken)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dialog token\n"));
+ break;
+ }
+
+ if(!msg->_capability)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no capability attr\n"));
+ break;
+ }
+
+ if(!msg->_goIntent)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no go intent attr\n"));
+ break;
+ }
+
+ if(!msg->_configTimeout)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no config timeout attr\n"));
+ break;
+ }
+
+ if(!msg->_listenChannel)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no listen channel attr\n"));
+ break;
+ }
+
+ if(!msg->_intendedIntfAddr)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no intended interface address attr\n"));
+ break;
+ }
+
+ if(!msg->_channelList)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no channel list attr\n"));
+ break;
+ }
+
+ if(!msg->_devInfo)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dev info attr\n"));
+ break;
+ }
+
+ if(!msg->_opChannel)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no op channel attr\n"));
+ break;
+ }
+
+ if(!msg->_wpsDevPasswordId)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no WPS device password id attr\n"));
+ break;
+ }
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_GoNegRsp(
+ IN const P2P_INFO *info,
+ IN P2P_MESSAGE *msg
+ )
+{
+ int go = 0;
+
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!msg->_dialogToken)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dialog token\n"));
+ break;
+ }
+
+ if(!msg->_status)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no status attr\n"));
+ break;
+ }
+
+ if(!msg->_capability)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no capability attr\n"));
+ break;
+ }
+
+ if(!msg->_goIntent)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no go intent attr\n"));
+ break;
+ }
+
+ go = p2p_go_det(info->GOIntent, msg->goIntent);
+
+ if(!msg->_intendedIntfAddr)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no intended interface address attr\n"));
+ break;
+ }
+
+ if(!msg->_channelList)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no channel list attr\n"));
+ break;
+ }
+
+ if(!msg->_devInfo)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dev info attr\n"));
+ break;
+ }
+
+ if(!msg->_grpId && !go)
+ {// peer is GO and no group id
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no group id attr, self intent: %u, peer intent: %u\n", info->GOIntent, msg->goIntent));
+ break;
+ }
+
+ if(!msg->_opChannel && !go)
+ {// peer is GO and no op channel
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no op channel attr, self intent: %u, peer intent: %u\n", info->GOIntent, msg->goIntent));
+ break;
+ }
+
+ if(P2P_SC_SUCCESS == msg->status && !msg->_wpsDevPasswordId)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("status is success but no WPS device password id attr\n"));
+ break;
+ }
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_GoNegConfirm(
+ IN BOOLEAN go,
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!msg->_dialogToken)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dialog token\n"));
+ break;
+ }
+
+ if(!msg->_status)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no status attr\n"));
+ break;
+ }
+
+ if(!msg->_capability)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no capability attr\n"));
+ break;
+ }
+
+ if(!msg->_channelList)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no channel list attr\n"));
+ break;
+ }
+
+ if(!msg->_grpId && !go)
+ {// peer is GO and no group id
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no group id attr when peer will be go\n"));
+ break;
+ }
+
+ if(!msg->_opChannel)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no op channel attr\n"));
+ break;
+ }
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_InvitationReq(
+ IN P2P_MESSAGE *msg
+ )
+{
+ P2P_ROLE invitorRole;
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!msg->_dialogToken)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dialog token\n"));
+ break;
+ }
+
+ if(!msg->_configTimeout)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no config timeout attr\n"));
+ break;
+ }
+
+ if(!msg->_grpId)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no group id attr\n"));
+ break;
+ }
+
+ invitorRole = (eqMacAddr(msg->grpDevAddr, msg->sa)) ? (P2P_GO) : (P2P_CLIENT);
+
+ if(!msg->_grpBssid && P2P_GO == invitorRole)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no group bssid attr\n"));
+ break;
+ }
+
+ if(!msg->_channelList)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no channel list attr\n"));
+ break;
+ }
+
+ if(!msg->_devInfo)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dev info attr\n"));
+ break;
+ }
+
+ if(!msg->_grpId)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no group id attr\n"));
+ break;
+ }
+
+ if(!msg->_opChannel && P2P_GO == invitorRole)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no op channel attr when invitor role is GO\n"));
+ break;
+ }
+
+ if(!msg->_invitationFlags)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no invitation flags attr\n"));
+ break;
+ }
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_InvitationRsp(
+ IN P2P_ROLE invitorRole,
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!msg->_dialogToken)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dialog token\n"));
+ break;
+ }
+
+ if(!msg->_status)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no status attr\n"));
+ break;
+ }
+
+ if(!msg->_channelList)
+ {
+ // Although the channel list attribute is mandatory for the successful case of
+ // invitation response, actually the information is not important because the
+ // pairing devices can go to next association by the OP channel attribute.
+ // Then, we defined it as optional and this would fix the invitation failure
+ // with Netgear PTV3000 (FW:2.4.12 or later) under Win8.
+ // By Bruce, 2013-09-03.
+ }
+
+ if(!msg->_opChannel && P2P_CLIENT == invitorRole && 0 == msg->status)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no op channel attr when invitor role is GO\n"));
+ break;
+ }
+
+ if(!msg->_grpBssid && P2P_CLIENT == invitorRole && 0 == msg->status)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no group bssid attr when invitor role is GO\n"));
+ break;
+ }
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_DevDiscReq(
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!msg->_dialogToken)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dialog token\n"));
+ break;
+ }
+
+ if(!msg->_devId)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no device id attr\n"));
+ break;
+ }
+
+ if(!msg->_grpId)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no group id attr\n"));
+ break;
+ }
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_DevDiscRsp(
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!msg->_dialogToken)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dialog token\n"));
+ break;
+ }
+
+ if(!msg->_status)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no status attr\n"));
+ break;
+ }
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_PDReq(
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!msg->_dialogToken)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dialog token\n"));
+ break;
+ }
+
+ if(!msg->_capability)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no capability attr\n"));
+ break;
+ }
+
+ if(!msg->_devInfo)
+ {
+ //RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dev info attr\n"));
+ //break;
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dev info attr, use sa as devAddr\n"));
+ msg->devAddr = msg->sa;
+ }
+
+ if(!msg->_wpsConfigMethods)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no WPS config method attr\n"));
+ break;
+ }
+
+ // TODO: if this is a PD req to join our GO, group id is mandatory
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_PDRsp(
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!msg->_dialogToken)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dialog token\n"));
+ break;
+ }
+
+ if(!msg->_wpsConfigMethods)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no WPS config method attr\n"));
+ break;
+ }
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_PresenceReq(
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!msg->_dialogToken)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dialog token\n"));
+ break;
+ }
+
+ if(!msg->_noa)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no noa attr\n"));
+ break;
+ }
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_PresenceRsp(
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!msg->_dialogToken)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dialog token\n"));
+ break;
+ }
+
+ if(!msg->_status)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no status attr\n"));
+ break;
+ }
+
+ if(!msg->_noa)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no noa attr\n"));
+ break;
+ }
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+BOOLEAN
+p2p_validate_GoDiscoverabilityReq(
+ IN P2P_MESSAGE *msg
+ )
+{
+ BOOLEAN bValid = FALSE;
+
+ do
+ {
+ if(!msg->_dialogToken)
+ {
+ RT_TRACE_F(COMP_P2P, DBG_LOUD, ("no dialog token\n"));
+ break;
+ }
+
+ // Thter is no Elements field in a GO Discoverability Request frame
+
+
+ bValid = TRUE;
+ }while(FALSE);
+
+ return bValid;
+}
+
+#endif