diff options
Diffstat (limited to 'network/wlan/WDI/COMMON/P2P_Receive.c')
| -rw-r--r-- | network/wlan/WDI/COMMON/P2P_Receive.c | 744 |
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 |
