VOID PeerP2pNoaAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PP2P_ACTION_FRAME pFrame = (PP2P_ACTION_FRAME)Elem->Msg; PMAC_TABLE_ENTRY pClient; DBGPRINT(RT_DEBUG_TRACE,("PeerP2pNoaAction %s. \n", decodeP2PState(pAd->P2pCfg.P2PConnectState))); DBGPRINT(RT_DEBUG_TRACE,("Category = %d. Subtype = %d. Token = %d.\n", pFrame->Category, pFrame->Subtype, pFrame->Token)); if (!P2P_CLI_ON(pAd)) { DBGPRINT(RT_DEBUG_TRACE,("PeerP2pNoaAction return %s. \n", decodeP2PState(pAd->P2pCfg.P2PConnectState))); return; } if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE) { DBGPRINT(RT_DEBUG_TRACE,("PeerP2pNoaAction Elem->Wcid %d. return.\n", Elem->Wcid)); return; } pClient = &pAd->MacTab.Content[Elem->Wcid]; pAd->P2pCfg.NoAIndex = Elem->Wcid; DBGPRINT(RT_DEBUG_TRACE,("PeerP2pNoaAction Current NoAToken = %d. \n", pClient->P2pInfo.NoAToken)); if (pFrame->Token != pClient->P2pInfo.NoAToken) { if ((RTMPEqualMemory(&pFrame->Octet[0], P2POUIBYTE, 4)) && (pFrame->Octet[4] == SUBID_P2P_NOA)) { DBGPRINT(RT_DEBUG_TRACE,("PeerP2pNoaAction CTWindow = %d. \n", pFrame->Octet[8])); pClient->P2pInfo.CTWindow = pFrame->Octet[8]; P2pHandleNoAAttri(pAd, pClient, &pFrame->Octet[0]); } } }
INT Set_P2P_State_Proc( IN PRTMP_ADAPTER pAd, IN PSTRING arg) { POS_COOKIE pObj; PRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg; pObj = (POS_COOKIE) pAd->OS_Cookie; if (pObj->ioctl_if_type != INT_P2P) return 0; DBGPRINT(RT_DEBUG_ERROR, ("P2P Current State\n")); DBGPRINT(RT_DEBUG_ERROR, ("=====================================================================\n")); DBGPRINT(RT_DEBUG_ERROR, ("My Rule = %s\n", decodeMyRule(pP2PCtrl->Rule))); DBGPRINT(RT_DEBUG_ERROR, ("p2p_OpStatus = %ld\n", pAd->flg_p2p_OpStatusFlags)); DBGPRINT(RT_DEBUG_ERROR, ("CTRL Machine State = %s.\n", decodeCtrlState(pP2PCtrl->CtrlCurrentState))); DBGPRINT(RT_DEBUG_ERROR, ("DISC Machine State = %s.\n", decodeDiscoveryState(pP2PCtrl->DiscCurrentState))); DBGPRINT(RT_DEBUG_ERROR, ("GO_FORM Machine State = %s.\n", decodeGroupFormationState(pP2PCtrl->GoFormCurrentState))); DBGPRINT(RT_DEBUG_ERROR, ("AutoReconn = %d\n", pAd->StaCfg.bAutoReconnect)); /*DBGPRINT(RT_DEBUG_ERROR, ("P2PDiscoProvState = %s\n", decodeP2PState(pP2PCtrl->P2PDiscoProvState))); */ DBGPRINT(RT_DEBUG_ERROR, ("P2PConnectState = %s\n", decodeP2PState(pP2PCtrl->P2PConnectState))); return TRUE; }
BOOLEAN PeerAssocReqCmmSanity( IN PRTMP_ADAPTER pAd, IN BOOLEAN isReassoc, IN VOID *Msg, IN ULONG MsgLen, OUT PUCHAR pAddr2, OUT USHORT *pCapabilityInfo, OUT USHORT *pListenInterval, OUT PUCHAR pApAddr, OUT UCHAR *pSsidLen, OUT char *Ssid, OUT UCHAR *pRatesLen, OUT UCHAR Rates[], OUT UCHAR *RSN, OUT UCHAR *pRSNLen, OUT BOOLEAN *pbWmmCapable, #ifdef WSC_AP_SUPPORT OUT BOOLEAN *pWscCapable, #endif /* WSC_AP_SUPPORT */ OUT ULONG *pRalinkIe, OUT EXT_CAP_INFO_ELEMENT *pExtCapInfo, #ifdef P2P_SUPPORT OUT ULONG *P2PSubelementLen, OUT PUCHAR pP2pSubelement, #endif /* P2P_SUPPORT */ OUT UCHAR *pHtCapabilityLen, OUT HT_CAPABILITY_IE *pHtCapability) { CHAR *Ptr; PFRAME_802_11 Fr = (PFRAME_802_11)Msg; PEID_STRUCT eid_ptr; UCHAR Sanity = 0; UCHAR WPA1_OUI[4] = { 0x00, 0x50, 0xF2, 0x01 }; UCHAR WPA2_OUI[3] = { 0x00, 0x0F, 0xAC }; MAC_TABLE_ENTRY *pEntry = (MAC_TABLE_ENTRY *)NULL; #ifdef P2P_SUPPORT PRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg; UCHAR P2POUIBYTE[4] = {0x50, 0x6f, 0x9a, 0x9}; #endif /* P2P_SUPPORT */ /* to prevent caller from using garbage output value */ *pSsidLen = 0; *pRatesLen = 0; *pRSNLen = 0; *pbWmmCapable = FALSE; *pRalinkIe = 0; *pHtCapabilityLen= 0; COPY_MAC_ADDR(pAddr2, &Fr->Hdr.Addr2); pEntry = MacTableLookup(pAd, pAddr2); if (pEntry == NULL) return FALSE; Ptr = (PCHAR)Fr->Octet; NdisMoveMemory(pCapabilityInfo, &Fr->Octet[0], 2); NdisMoveMemory(pListenInterval, &Fr->Octet[2], 2); if (isReassoc) { NdisMoveMemory(pApAddr, &Fr->Octet[4], 6); eid_ptr = (PEID_STRUCT) &Fr->Octet[10]; } else { eid_ptr = (PEID_STRUCT) &Fr->Octet[4]; } /* get variable fields from payload and advance the pointer */ while (((UCHAR *)eid_ptr + eid_ptr->Len + 1) < ((UCHAR *)Fr + MsgLen)) { switch(eid_ptr->Eid) { case IE_SSID: if (((Sanity&0x1) == 1)) break; if ((eid_ptr->Len <= MAX_LEN_OF_SSID)) { Sanity |= 0x01; NdisMoveMemory(Ssid, eid_ptr->Octet, eid_ptr->Len); *pSsidLen = eid_ptr->Len; DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocReqSanity - SsidLen = %d \n", *pSsidLen)); } else { DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocReqSanity - wrong IE_SSID\n")); return FALSE; } break; case IE_SUPP_RATES: if ((eid_ptr->Len <= MAX_LEN_OF_SUPPORTED_RATES) && (eid_ptr->Len > 0)) { Sanity |= 0x02; NdisMoveMemory(Rates, eid_ptr->Octet, eid_ptr->Len); DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocReqSanity - IE_SUPP_RATES., Len=%d. " "Rates[0]=%x\n", eid_ptr->Len, Rates[0])); DBGPRINT(RT_DEBUG_TRACE, ("Rates[1]=%x %x %x %x %x %x %x\n", Rates[1], Rates[2], Rates[3], Rates[4], Rates[5], Rates[6], Rates[7])); *pRatesLen = eid_ptr->Len; } else { UCHAR RateDefault[8] = \ { 0x82, 0x84, 0x8b, 0x96, 0x12, 0x24, 0x48, 0x6c }; /* HT rate not ready yet. return true temporarily. rt2860c */ /*DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocReqSanity - wrong IE_SUPP_RATES\n")); */ Sanity |= 0x02; *pRatesLen = 8; NdisMoveMemory(Rates, RateDefault, 8); DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocReqSanity - wrong IE_SUPP_RATES., Len=%d\n", eid_ptr->Len)); } break; case IE_EXT_SUPP_RATES: if (eid_ptr->Len + *pRatesLen <= MAX_LEN_OF_SUPPORTED_RATES) { NdisMoveMemory(&Rates[*pRatesLen], eid_ptr->Octet, eid_ptr->Len); *pRatesLen = (*pRatesLen) + eid_ptr->Len; } else { NdisMoveMemory(&Rates[*pRatesLen], eid_ptr->Octet, MAX_LEN_OF_SUPPORTED_RATES - (*pRatesLen)); *pRatesLen = MAX_LEN_OF_SUPPORTED_RATES; } break; case IE_HT_CAP: if (eid_ptr->Len >= sizeof(HT_CAPABILITY_IE)) { NdisMoveMemory(pHtCapability, eid_ptr->Octet, SIZE_HT_CAP_IE); *(USHORT *)(&pHtCapability->HtCapInfo) = \ cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo)); #ifdef UNALIGNMENT_SUPPORT { EXT_HT_CAP_INFO extHtCapInfo; NdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&pHtCapability->ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO)); *(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo)); NdisMoveMemory((PUCHAR)(&pHtCapability->ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO)); } #else *(USHORT *)(&pHtCapability->ExtHtCapInfo) = \ cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo)); #endif /* UNALIGNMENT_SUPPORT */ *pHtCapabilityLen = SIZE_HT_CAP_IE; Sanity |= 0x10; DBGPRINT(RT_DEBUG_WARN, ("PeerAssocReqSanity - IE_HT_CAP\n")); } else { DBGPRINT(RT_DEBUG_WARN, ("PeerAssocReqSanity - wrong IE_HT_CAP.eid_ptr->Len = %d\n", eid_ptr->Len)); } break; case IE_EXT_CAPABILITY: if (eid_ptr->Len >= sizeof(EXT_CAP_INFO_ELEMENT)) { NdisMoveMemory(pExtCapInfo, eid_ptr->Octet, sizeof(EXT_CAP_INFO_ELEMENT)); DBGPRINT(RT_DEBUG_WARN, ("PeerAssocReqSanity - IE_EXT_CAPABILITY!\n")); } break; case IE_WPA: /* same as IE_VENDOR_SPECIFIC */ case IE_WPA2: #ifdef P2P_SUPPORT if (NdisEqualMemory(eid_ptr->Octet, P2POUIBYTE, sizeof(P2POUIBYTE)) && (eid_ptr->Len >= 4)) { if (*P2PSubelementLen == 0) { RTMPMoveMemory(pP2pSubelement, &eid_ptr->Eid, (eid_ptr->Len+2)); *P2PSubelementLen = (eid_ptr->Len+2); } else if (*P2PSubelementLen > 0) { RTMPMoveMemory(pP2pSubelement + *P2PSubelementLen, &eid_ptr->Eid, (eid_ptr->Len+2)); *P2PSubelementLen += (eid_ptr->Len+2); } DBGPRINT(RT_DEBUG_TRACE, (" ! ===>P2P - PeerAssocReqSanity P2P IE Len becomes = %d. %s\n", *P2PSubelementLen, decodeP2PState(pP2PCtrl->P2PConnectState))); break; } #endif /* P2P_SUPPORT */ if (NdisEqualMemory(eid_ptr->Octet, WPS_OUI, 4)) { #ifdef WSC_AP_SUPPORT #ifdef WSC_V2_SUPPORT if ((pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.WscV2Info.bWpsEnable) || (pAd->ApCfg.MBSSID[pEntry->apidx].WscControl.WscV2Info.bEnableWpsV2 == FALSE)) #endif /* WSC_V2_SUPPORT */ *pWscCapable = TRUE; #endif /* WSC_AP_SUPPORT */ #ifdef EASY_CONFIG_SETUP AutoProvisionCheckEntry(pAd, pEntry, eid_ptr); #endif /* EASY_CONFIG_SETUP */ break; } /* Handle Atheros and Broadcom draft 11n STAs */ if (NdisEqualMemory(eid_ptr->Octet, BROADCOM_OUI, 3)) { switch (eid_ptr->Octet[3]) { case 0x33: if ((eid_ptr->Len-4) == sizeof(HT_CAPABILITY_IE)) { NdisMoveMemory(pHtCapability, &eid_ptr->Octet[4], SIZE_HT_CAP_IE); *(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo)); #ifdef UNALIGNMENT_SUPPORT { EXT_HT_CAP_INFO extHtCapInfo; NdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&pHtCapability->ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO)); *(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo)); NdisMoveMemory((PUCHAR)(&pHtCapability->ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO)); } #else *(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo)); #endif /* UNALIGNMENT_SUPPORT */ *pHtCapabilityLen = SIZE_HT_CAP_IE; } break; default: /* ignore other cases */ break; } } if (NdisEqualMemory(eid_ptr->Octet, RALINK_OUI, 3) && (eid_ptr->Len == 7)) { /**pRalinkIe = eid_ptr->Octet[3]; */ if (eid_ptr->Octet[3] != 0) *pRalinkIe = eid_ptr->Octet[3]; else *pRalinkIe = 0xf0000000; /* Set to non-zero value (can't set bit0-2) to represent this is Ralink Chip. So at linkup, we will set ralinkchip flag. */ break; } /* WMM_IE */ if (NdisEqualMemory(eid_ptr->Octet, WME_INFO_ELEM, 6) && (eid_ptr->Len == 7)) { *pbWmmCapable = TRUE; #ifdef UAPSD_SUPPORT if (pEntry) { UAPSD_AssocParse(pAd, pEntry, (UINT8 *)&eid_ptr->Octet[6], pAd->ApCfg.MBSSID[\ pEntry->apidx].UapsdInfo.bAPSDCapable); } #endif /* UAPSD_SUPPORT */ break; } if (pAd->ApCfg.MBSSID[pEntry->apidx].AuthMode < Ndis802_11AuthModeWPA) break; /* If this IE did not begins with 00:0x50:0xf2:0x01, it would be proprietary. So we ignore it. */ if (!NdisEqualMemory(eid_ptr->Octet, WPA1_OUI, sizeof(WPA1_OUI)) && !NdisEqualMemory(&eid_ptr->Octet[2], WPA2_OUI, sizeof(WPA2_OUI))) { DBGPRINT(RT_DEBUG_TRACE, ("Not RSN IE, maybe WMM IE!!!\n")); break; } if (/*(eid_ptr->Len <= MAX_LEN_OF_RSNIE) &&*/ (eid_ptr->Len >= MIN_LEN_OF_RSNIE)) { hex_dump("Received RSNIE in Assoc-Req", (UCHAR *)eid_ptr, eid_ptr->Len + 2); /* Copy whole RSNIE context */ NdisMoveMemory(RSN, eid_ptr, eid_ptr->Len + 2); *pRSNLen=eid_ptr->Len + 2; } else { *pRSNLen=0; DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocReqSanity - missing IE_WPA(%d)\n",eid_ptr->Len)); return FALSE; } break; #ifdef WAPI_SUPPORT case IE_WAPI: if ((pAd->ApCfg.MBSSID[pEntry->apidx].AuthMode != Ndis802_11AuthModeWAICERT) && (pAd->ApCfg.MBSSID[pEntry->apidx].AuthMode != Ndis802_11AuthModeWAIPSK)) break; /* Sanity check the validity of WIE */ /* Todo - AlbertY */ /* Copy whole WAPI-IE context */ NdisMoveMemory(RSN, eid_ptr, eid_ptr->Len + 2); *pRSNLen=eid_ptr->Len + 2; DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocReqSanity - IE_WAPI(%d)\n",eid_ptr->Len)); break; #endif /* WAPI_SUPPORT */ default: break; } eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len); } if ((Sanity&0x3) != 0x03) { DBGPRINT(RT_DEBUG_WARN, ("PeerAssocReqSanity - missing mandatory field\n")); return FALSE; } else { DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocReqSanity - success\n")); return TRUE; } }