static unsigned char *setupUdta(mp4Metadata_t *metadata, int bitrate, int mode, int modeQuality, int padding, SInt64 frames, int codecVersion, int *udtaSize) { int tmp; short tmp2; char atomID[4]; variableBuffer udtaBuffer; udtaBuffer.maxSize = DEFAULT_UDTA_SIZE; udtaBuffer.contentSize = 0; udtaBuffer.buffer = (unsigned char *)malloc(DEFAULT_UDTA_SIZE); /* udta atom */ tmp = 0; memcpy(atomID,"udta",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); /* meta atom */ tmp = 0; memcpy(atomID,"meta",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); appendBytes(&udtaBuffer,&tmp,4); /* hdlr atom */ tmp = 0x22; tmp = SWAP32(tmp); memcpy(atomID,"hdlr",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 0; appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,&tmp,4); memcpy(atomID,"mdir",4); appendBytes(&udtaBuffer,atomID,4); memcpy(atomID,"appl",4); appendBytes(&udtaBuffer,atomID,4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,&tmp,4); tmp2 = 0; tmp2 = SWAP16(tmp2); appendBytes(&udtaBuffer,&tmp2,2); /* ilst atom */ tmp = 0; memcpy(atomID,"ilst",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); /* encoder info */ char attr[128]; char str[256]; long version = 0; Gestalt(gestaltQuickTime,&version); attr[0] = 0; if(mode > 3) strcpy_s(attr,128,"High Efficiency, "); switch(mode) { case kConfigCBR: case kConfigCBR_HE: sprintf_s(attr,128,"%sCBR %d kbps",attr,modeQuality); break; case kConfigABR: case kConfigABR_HE: sprintf_s(attr,128,"%sABR %d kbps",attr,modeQuality); break; case kConfigConstrainedVBR: case kConfigConstrainedVBR_HE: sprintf_s(attr,128,"%sConstrained VBR %d kbps",attr,modeQuality); break; case kConfigTrueVBR: sprintf_s(attr,128,"%sTrue VBR Quality %d",attr,modeQuality); break; } sprintf_s(str,256,"qtaacenc %d, QuickTime %d.%d.%d, %s",VERSION,(version>>24)&0xF,(version>>20)&0xF,(version>>16)&0xF,attr); tmp = 24 + strlen(str); tmp = SWAP32(tmp); atomID[0] = (char)0xa9; memcpy(atomID+1,"too",3); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 16 + strlen(str); tmp = SWAP32(tmp); memcpy(atomID,"data",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 1; tmp = SWAP32(tmp); appendBytes(&udtaBuffer,&tmp,4); tmp = 0; appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,str,strlen(str)); /* gapless info */ tmp = 0xBC; tmp = SWAP32(tmp); memcpy(atomID,"----",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 0x1C; tmp = SWAP32(tmp); memcpy(atomID,"mean",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 0; appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,"com.apple.iTunes",16); tmp = 0x14; tmp = SWAP32(tmp); memcpy(atomID,"name",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 0; appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,"iTunSMPB",8); tmp = 0x84; tmp = SWAP32(tmp); memcpy(atomID,"data",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 1; tmp = SWAP32(tmp); appendBytes(&udtaBuffer,&tmp,4); tmp = 0; appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer," 00000000 00000840 ",19); char gaplessInfo[32]; sprintf_s(gaplessInfo,32,"%08X %016llX",(unsigned int)padding,(unsigned long long)frames); appendBytes(&udtaBuffer,gaplessInfo,25); appendBytes(&udtaBuffer," 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000",72); /* bitrate info */ tmp = 0x6f; tmp = SWAP32(tmp); memcpy(atomID,"----",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 0x1C; tmp = SWAP32(tmp); memcpy(atomID,"mean",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 0; appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,"com.apple.iTunes",16); tmp = 0x1B; tmp = SWAP32(tmp); memcpy(atomID,"name",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 0; appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,"Encoding Params",15); tmp = 0x30; tmp = SWAP32(tmp); memcpy(atomID,"data",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 0; appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,&tmp,4); tmp = 1; tmp = SWAP32(tmp); appendBytes(&udtaBuffer,"vers",4); appendBytes(&udtaBuffer,&tmp,4); mode = (mode<4) ? mode : mode-4; tmp = SWAP32(mode); appendBytes(&udtaBuffer,"acbf",4); appendBytes(&udtaBuffer,&tmp,4); tmp = SWAP32(bitrate); appendBytes(&udtaBuffer,"brat",4); appendBytes(&udtaBuffer,&tmp,4); tmp = SWAP32(codecVersion); appendBytes(&udtaBuffer,"cdcv",4); appendBytes(&udtaBuffer,&tmp,4); /* title */ if(metadata->title) { atomID[0] = (char)0xa9; memcpy(atomID+1,"nam",3); appendTextMetadata(&udtaBuffer,metadata->title,atomID); } /* artist */ if(metadata->artist) { atomID[0] = (char)0xa9; memcpy(atomID+1,"ART",3); appendTextMetadata(&udtaBuffer,metadata->artist,atomID); } /* album */ if(metadata->album) { atomID[0] = (char)0xa9; memcpy(atomID+1,"alb",3); appendTextMetadata(&udtaBuffer,metadata->album,atomID); } /* album artist */ if(metadata->albumArtist) { memcpy(atomID,"aART",4); appendTextMetadata(&udtaBuffer,metadata->albumArtist,atomID); } /* composer */ if(metadata->composer) { atomID[0] = (char)0xa9; memcpy(atomID+1,"wrt",3); appendTextMetadata(&udtaBuffer,metadata->composer,atomID); } /* group */ if(metadata->group) { atomID[0] = (char)0xa9; memcpy(atomID+1,"grp",3); appendTextMetadata(&udtaBuffer,metadata->group,atomID); } /* genre */ if(metadata->genre) { atomID[0] = (char)0xa9; memcpy(atomID+1,"gen",3); appendTextMetadata(&udtaBuffer,metadata->genre,atomID); } /* date */ if(metadata->date) { atomID[0] = (char)0xa9; memcpy(atomID+1,"day",3); appendTextMetadata(&udtaBuffer,metadata->date,atomID); } /* comment */ if(metadata->comment) { atomID[0] = (char)0xa9; memcpy(atomID+1,"cmt",3); appendTextMetadata(&udtaBuffer,metadata->comment,atomID); } /* track */ if(metadata->track > 0 || metadata->totalTrack > 0) { tmp = 0x20; tmp = SWAP32(tmp); memcpy(atomID,"trkn",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 0x18; tmp = SWAP32(tmp); memcpy(atomID,"data",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 0; appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,&tmp,4); tmp2 = 0; appendBytes(&udtaBuffer,&tmp2,2); if(metadata->track > 0) { tmp2 = metadata->track; tmp2 = SWAP16(tmp2); } appendBytes(&udtaBuffer,&tmp2,2); tmp2 = 0; if(metadata->totalTrack > 0) { tmp2 = metadata->totalTrack; tmp2 = SWAP16(tmp2); } appendBytes(&udtaBuffer,&tmp2,2); tmp2 = 0; appendBytes(&udtaBuffer,&tmp2,2); } /* disc */ if(metadata->disc > 0 || metadata->totalDisc > 0) { tmp = 0x20; tmp = SWAP32(tmp); memcpy(atomID,"disk",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 0x18; tmp = SWAP32(tmp); memcpy(atomID,"data",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 0; appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,&tmp,4); tmp2 = 0; appendBytes(&udtaBuffer,&tmp2,2); if(metadata->disc > 0) { tmp2 = metadata->disc; tmp2 = SWAP16(tmp2); } appendBytes(&udtaBuffer,&tmp2,2); tmp2 = 0; if(metadata->totalDisc > 0) { tmp2 = metadata->totalDisc; tmp2 = SWAP16(tmp2); } appendBytes(&udtaBuffer,&tmp2,2); tmp2 = 0; appendBytes(&udtaBuffer,&tmp2,2); } /* compilation */ if(metadata->compilation) { tmp = 0x19; tmp = SWAP32(tmp); memcpy(atomID,"cpil",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 0x11; tmp = SWAP32(tmp); memcpy(atomID,"data",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); tmp = 0x15; tmp = SWAP32(tmp); appendBytes(&udtaBuffer,&tmp,4); tmp = 0; appendBytes(&udtaBuffer,&tmp,4); char tmp3 = 1; appendBytes(&udtaBuffer,&tmp3,1); } /* update length of ilst atom */ tmp = SWAP32(udtaBuffer.contentSize-54); memcpy(udtaBuffer.buffer+54,&tmp,4); /* padding */ memset(udtaBuffer.buffer+udtaBuffer.contentSize,0,udtaBuffer.maxSize-udtaBuffer.contentSize); tmp = SWAP32(udtaBuffer.maxSize-udtaBuffer.contentSize); memcpy(atomID,"free",4); appendBytes(&udtaBuffer,&tmp,4); appendBytes(&udtaBuffer,atomID,4); /* update length of udta atom */ tmp = SWAP32(udtaBuffer.maxSize); memcpy(udtaBuffer.buffer,&tmp,4); /* update length of meta atom */ tmp = SWAP32(udtaBuffer.maxSize-8); memcpy(udtaBuffer.buffer+8,&tmp,4); *udtaSize = udtaBuffer.maxSize; return udtaBuffer.buffer; }
int swap16(int val) { return(host_endian != target_endian ? SWAP16(val) : val); }
void CPacket::Write(short Data) { *(short *)(m_Data + m_WritePosition) = SWAP16(Data); m_WritePosition += 2; }
/* ========================================================================== Description: Process the received ProbeRequest from clients Parameters: Elem - msg containing the ProbeReq frame ========================================================================== */ VOID APPeerProbeReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR Addr2[MAC_ADDR_LEN]; CHAR Ssid[MAX_LEN_OF_SSID]; UCHAR SsidLen; //, Rates[MAX_LEN_OF_SUPPORTED_RATES], RatesLen; HEADER_802_11 ProbeRspHdr; NDIS_STATUS NStatus; PUCHAR pOutBuffer = NULL; ULONG FrameLen = 0, TmpLen; LARGE_INTEGER FakeTimestamp; UCHAR DsLen = 1;//, IbssLen = 2, TimLen=1, //BitmapControl=0, VirtualBitmap=0; UCHAR ErpIeLen = 1; UCHAR apidx = 0, PhyMode, SupRateLen; UCHAR RSNIe=IE_WPA, RSNIe2=IE_WPA2;//, RSN_Len=22; BOOLEAN bRequestRssi=FALSE; #ifdef WSC_AP_SUPPORT UCHAR Addr3[MAC_ADDR_LEN]; PFRAME_802_11 pFrame = (PFRAME_802_11)Elem->Msg; COPY_MAC_ADDR(Addr3, pFrame->Hdr.Addr3); #endif // WSC_AP_SUPPORT // #ifdef WDS_SUPPORT // if in bridge mode, no need to reply probe req. if (pAd->WdsTab.Mode == WDS_BRIDGE_MODE) return; #endif // WDS_SUPPORT // if (! PeerProbeReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, Ssid, &SsidLen, &bRequestRssi)) return; for(apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++) { RSNIe = IE_WPA; if ((pAd->ApCfg.MBSSID[apidx].MSSIDDev != NULL) && !(RTMP_OS_NETDEV_STATE_RUNNING(pAd->ApCfg.MBSSID[apidx].MSSIDDev))) { /* the interface is down, so we can not send probe response */ continue; } /* End of if */ PhyMode = pAd->ApCfg.MBSSID[apidx].PhyMode; if (((SsidLen == 0) && (! pAd->ApCfg.MBSSID[apidx].bHideSsid)) || #ifdef WSC_AP_SUPPORT /* buffalo WPS testbed STA send ProbrRequest ssid length = 32 and ssid are not AP , but DA are AP. for WPS test send ProbeResponse */ ((SsidLen == 32) && MAC_ADDR_EQUAL(Addr3, pAd->ApCfg.MBSSID[apidx].Bssid) && (pAd->ApCfg.MBSSID[apidx].bHideSsid == 0)) || #endif // WSC_AP_SUPPORT // ((SsidLen == pAd->ApCfg.MBSSID[apidx].SsidLen) && NdisEqualMemory(Ssid, pAd->ApCfg.MBSSID[apidx].Ssid, (ULONG) SsidLen))) ; else continue; /* check next BSS */ // allocate and send out ProbeRsp frame NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); if (NStatus != NDIS_STATUS_SUCCESS) return; MgtMacHeaderInit(pAd, &ProbeRspHdr, SUBTYPE_PROBE_RSP, 0, Addr2, pAd->ApCfg.MBSSID[apidx].Bssid); if ((pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA) || (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPAPSK)) RSNIe = IE_WPA; else if ((pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA2) || (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA2PSK)) RSNIe = IE_WPA2; #ifdef WAPI_SUPPORT else if ((pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWAICERT) || (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWAIPSK)) RSNIe = IE_WAPI; #endif // WAPI_SUPPORT // SupRateLen = pAd->CommonCfg.SupRateLen; if (PhyMode == PHY_11B) SupRateLen = 4; MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), &ProbeRspHdr, TIMESTAMP_LEN, &FakeTimestamp, 2, &pAd->CommonCfg.BeaconPeriod, 2, &pAd->ApCfg.MBSSID[apidx].CapabilityInfo, 1, &SsidIe, 1, &pAd->ApCfg.MBSSID[apidx].SsidLen, pAd->ApCfg.MBSSID[apidx].SsidLen, pAd->ApCfg.MBSSID[apidx].Ssid, 1, &SupRateIe, 1, &SupRateLen, SupRateLen, pAd->CommonCfg.SupRate, 1, &DsIe, 1, &DsLen, 1, &pAd->CommonCfg.Channel, END_OF_ARGS); if ((pAd->CommonCfg.ExtRateLen) && (PhyMode != PHY_11B)) { MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &ErpIe, 1, &ErpIeLen, 1, &pAd->ApCfg.ErpIeContent, 1, &ExtRateIe, 1, &pAd->CommonCfg.ExtRateLen, pAd->CommonCfg.ExtRateLen, pAd->CommonCfg.ExtRate, END_OF_ARGS); FrameLen += TmpLen; } #ifdef A_BAND_SUPPORT // add Channel switch announcement IE if ((pAd->CommonCfg.Channel > 14) && (pAd->CommonCfg.bIEEE80211H == 1) && (pAd->CommonCfg.RadarDetect.RDMode == RD_SWITCHING_MODE)) { UCHAR CSAIe=IE_CHANNEL_SWITCH_ANNOUNCEMENT; UCHAR CSALen=3; UCHAR CSAMode=1; MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &CSAIe, 1, &CSALen, 1, &CSAMode, 1, &pAd->CommonCfg.Channel, 1, &pAd->CommonCfg.RadarDetect.CSCount, END_OF_ARGS); FrameLen += TmpLen; } #endif // A_BAND_SUPPORT // #ifdef DOT11_N_SUPPORT if ((PhyMode >= PHY_11ABGN_MIXED) && (pAd->ApCfg.MBSSID[apidx].DesiredHtPhyInfo.bHtEnable)) { ULONG TmpLen; UCHAR HtLen, AddHtLen, NewExtLen; #ifdef RT_BIG_ENDIAN HT_CAPABILITY_IE HtCapabilityTmp; ADD_HT_INFO_IE addHTInfoTmp; #endif #ifdef A_BAND_SUPPORT if (pAd->CommonCfg.bExtChannelSwitchAnnouncement && (pAd->CommonCfg.Channel > 14)) { HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE HtExtChannelSwitchIe; build_ext_channel_switch_ie(pAd, &HtExtChannelSwitchIe); MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE), &HtExtChannelSwitchIe, END_OF_ARGS); FrameLen += TmpLen; } #endif // A_BAND_SUPPORT // HtLen = sizeof(pAd->CommonCfg.HtCapability); AddHtLen = sizeof(pAd->CommonCfg.AddHTInfo); NewExtLen = 1; //New extension channel offset IE is included in Beacon, Probe Rsp or channel Switch Announcement Frame #ifndef RT_BIG_ENDIAN MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &HtCapIe, 1, &HtLen, sizeof(HT_CAPABILITY_IE), &pAd->CommonCfg.HtCapability, 1, &AddHtInfoIe, 1, &AddHtLen, sizeof(ADD_HT_INFO_IE), &pAd->CommonCfg.AddHTInfo, 1, &NewExtChanIe, 1, &NewExtLen, sizeof(NEW_EXT_CHAN_IE), &pAd->CommonCfg.NewExtChanOffset, END_OF_ARGS); #else NdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, HtLen); *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); #ifdef UNALIGNMENT_SUPPORT { EXT_HT_CAP_INFO extHtCapInfo; NdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO)); *(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo)); NdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO)); } #else *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = cpu2le16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); #endif // UNALIGNMENT_SUPPORT // NdisMoveMemory(&addHTInfoTmp, &pAd->CommonCfg.AddHTInfo, AddHtLen); *(USHORT *)(&addHTInfoTmp.AddHtInfo2) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2)); *(USHORT *)(&addHTInfoTmp.AddHtInfo3) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3)); MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &HtCapIe, 1, &HtLen, HtLen, &HtCapabilityTmp, 1, &AddHtInfoIe, 1, &AddHtLen, AddHtLen, &addHTInfoTmp, 1, &NewExtChanIe, 1, &NewExtLen, sizeof(NEW_EXT_CHAN_IE), &pAd->CommonCfg.NewExtChanOffset, END_OF_ARGS); #endif FrameLen += TmpLen; } #endif // DOT11_N_SUPPORT // // Append RSN_IE when WPA OR WPAPSK, if (pAd->ApCfg.MBSSID[apidx].AuthMode < Ndis802_11AuthModeWPA) ; // enough information else if ((pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1WPA2) || (pAd->ApCfg.MBSSID[apidx].AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)) { MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &RSNIe, 1, &pAd->ApCfg.MBSSID[apidx].RSNIE_Len[0], pAd->ApCfg.MBSSID[apidx].RSNIE_Len[0], pAd->ApCfg.MBSSID[apidx].RSN_IE[0], 1, &RSNIe2, 1, &pAd->ApCfg.MBSSID[apidx].RSNIE_Len[1], pAd->ApCfg.MBSSID[apidx].RSNIE_Len[1], pAd->ApCfg.MBSSID[apidx].RSN_IE[1], END_OF_ARGS); FrameLen += TmpLen; } else { MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &RSNIe, 1, &pAd->ApCfg.MBSSID[apidx].RSNIE_Len[0], pAd->ApCfg.MBSSID[apidx].RSNIE_Len[0], pAd->ApCfg.MBSSID[apidx].RSN_IE[0], END_OF_ARGS); FrameLen += TmpLen; } // add WMM IE here if (pAd->ApCfg.MBSSID[apidx].bWmmCapable) { UCHAR i; UCHAR WmeParmIe[26] = {IE_VENDOR_SPECIFIC, 24, 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0, 0}; WmeParmIe[8] = pAd->ApCfg.BssEdcaParm.EdcaUpdateCount & 0x0f; #ifdef UAPSD_AP_SUPPORT UAPSD_MR_IE_FILL(WmeParmIe[8], pAd); #endif // UAPSD_AP_SUPPORT // for (i=QID_AC_BE; i<=QID_AC_VO; i++) { WmeParmIe[10+ (i*4)] = (i << 5) + // b5-6 is ACI ((UCHAR)pAd->ApCfg.BssEdcaParm.bACM[i] << 4) + // b4 is ACM (pAd->ApCfg.BssEdcaParm.Aifsn[i] & 0x0f); // b0-3 is AIFSN WmeParmIe[11+ (i*4)] = (pAd->ApCfg.BssEdcaParm.Cwmax[i] << 4) + // b5-8 is CWMAX (pAd->ApCfg.BssEdcaParm.Cwmin[i] & 0x0f); // b0-3 is CWMIN WmeParmIe[12+ (i*4)] = (UCHAR)(pAd->ApCfg.BssEdcaParm.Txop[i] & 0xff); // low byte of TXOP WmeParmIe[13+ (i*4)] = (UCHAR)(pAd->ApCfg.BssEdcaParm.Txop[i] >> 8); // high byte of TXOP } MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 26, WmeParmIe, END_OF_ARGS); FrameLen += TmpLen; } #ifdef AP_QLOAD_SUPPORT if (pAd->FlgQloadEnable != 0) { FrameLen += QBSS_LoadElementAppend(pAd, pOutBuffer+FrameLen); } #endif // AP_QLOAD_SUPPORT // #ifdef DOT11_N_SUPPORT #ifdef DOT11N_DRAFT3 // P802.11n_D3.03 // 7.3.2.60 Overlapping BSS Scan Parameters IE if ((PhyMode >= PHY_11ABGN_MIXED) && (pAd->CommonCfg.Channel <= 14) && (pAd->ApCfg.MBSSID[apidx].DesiredHtPhyInfo.bHtEnable) && (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == 1)) { OVERLAP_BSS_SCAN_IE OverlapScanParam; ULONG TmpLen; UCHAR OverlapScanIE, ScanIELen; OverlapScanIE = IE_OVERLAPBSS_SCAN_PARM; ScanIELen = 14; OverlapScanParam.ScanPassiveDwell = cpu2le16(pAd->CommonCfg.Dot11OBssScanPassiveDwell); OverlapScanParam.ScanActiveDwell = cpu2le16(pAd->CommonCfg.Dot11OBssScanActiveDwell); OverlapScanParam.TriggerScanInt = cpu2le16(pAd->CommonCfg.Dot11BssWidthTriggerScanInt); OverlapScanParam.PassiveTalPerChannel = cpu2le16(pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel); OverlapScanParam.ActiveTalPerChannel = cpu2le16(pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel); OverlapScanParam.DelayFactor = cpu2le16(pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor); OverlapScanParam.ScanActThre = cpu2le16(pAd->CommonCfg.Dot11OBssScanActivityThre); MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &OverlapScanIE, 1, &ScanIELen, ScanIELen, &OverlapScanParam, END_OF_ARGS); FrameLen += TmpLen; } // 7.3.2.27 Extended Capabilities IE { ULONG TmpLen; EXT_CAP_INFO_ELEMENT extCapInfo; UCHAR extInfoLen; extInfoLen = sizeof(EXT_CAP_INFO_ELEMENT); NdisZeroMemory(&extCapInfo, extInfoLen); // P802.11n_D1.10 // HT Information Exchange Support if ((PhyMode >= PHY_11ABGN_MIXED) && (pAd->CommonCfg.Channel <= 14) && (pAd->ApCfg.MBSSID[apidx].DesiredHtPhyInfo.bHtEnable) && (pAd->CommonCfg.bBssCoexEnable == TRUE)) { extCapInfo.BssCoexistMgmtSupport = 1; MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &ExtCapIe, 1, &extInfoLen, extInfoLen, &extCapInfo, END_OF_ARGS); FrameLen += TmpLen; } } #endif // DOT11N_DRAFT3 // #endif // DOT11_N_SUPPORT // /* add Ralink-specific IE here - Byte0.b0=1 for aggregation, Byte0.b1=1 for piggy-back Byte0.b3=1 for rssi-feedback */ { ULONG TmpLen; UCHAR RalinkSpecificIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x00, 0x00, 0x00, 0x00}; if (pAd->CommonCfg.bAggregationCapable) RalinkSpecificIe[5] |= 0x1; if (pAd->CommonCfg.bPiggyBackCapable) RalinkSpecificIe[5] |= 0x2; #ifdef DOT11_N_SUPPORT if (pAd->CommonCfg.bRdg) RalinkSpecificIe[5] |= 0x4; #endif // DOT11_N_SUPPORT // #ifdef RSSI_FEEDBACK if (bRequestRssi == TRUE) { MAC_TABLE_ENTRY *pEntry=NULL; DBGPRINT(RT_DEBUG_ERROR, ("SYNC - Send PROBE_RSP to %02x:%02x:%02x:%02x:%02x:%02x...\n", Addr2[0],Addr2[1],Addr2[2],Addr2[3],Addr2[4],Addr2[5] )); RalinkSpecificIe[5] |= 0x8; pEntry = MacTableLookup(pAd, Addr2); if (pEntry != NULL) { RalinkSpecificIe[6] = (UCHAR)pEntry->RssiSample.AvgRssi0; RalinkSpecificIe[7] = (UCHAR)pEntry->RssiSample.AvgRssi1; RalinkSpecificIe[8] = (UCHAR)pEntry->RssiSample.AvgRssi2; } } #endif // RSSI_FEEDBACK // MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 9, RalinkSpecificIe, END_OF_ARGS); FrameLen += TmpLen; } #ifdef A_BAND_SUPPORT // add Channel switch announcement IE if ((pAd->CommonCfg.Channel > 14) && (pAd->CommonCfg.bIEEE80211H == 1) && (pAd->CommonCfg.RadarDetect.RDMode == RD_SWITCHING_MODE)) { UCHAR CSAIe=IE_CHANNEL_SWITCH_ANNOUNCEMENT; UCHAR CSALen=3; UCHAR CSAMode=1; MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &CSAIe, 1, &CSALen, 1, &CSAMode, 1, &pAd->CommonCfg.Channel, 1, &pAd->CommonCfg.RadarDetect.CSCount, END_OF_ARGS); FrameLen += TmpLen; #ifdef DOT11_N_SUPPORT if (pAd->CommonCfg.bExtChannelSwitchAnnouncement) { HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE HtExtChannelSwitchIe; build_ext_channel_switch_ie(pAd, &HtExtChannelSwitchIe); MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE), &HtExtChannelSwitchIe, END_OF_ARGS); } #endif // DOT11_N_SUPPORT // FrameLen += TmpLen; } #endif // A_BAND_SUPPORT // // add country IE, power constraint IE if (pAd->CommonCfg.bCountryFlag) { ULONG TmpLen2=0; UCHAR TmpFrame[256]; UCHAR CountryIe = IE_COUNTRY; UCHAR MaxTxPower=16; #ifdef A_BAND_SUPPORT // Only 802.11a APs that comply with 802.11h are required to include a Power Constrint Element(IE=32) // in beacons and probe response frames if (pAd->CommonCfg.Channel > 14 && pAd->CommonCfg.bIEEE80211H == TRUE) { // prepare power constraint IE MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 3, PowerConstraintIE, END_OF_ARGS); FrameLen += TmpLen; } #endif // A_BAND_SUPPORT // NdisZeroMemory(TmpFrame, sizeof(TmpFrame)); // prepare channel information MakeOutgoingFrame(TmpFrame+TmpLen2, &TmpLen, 1, &pAd->ChannelList[0].Channel, 1, &pAd->ChannelListNum, 1, &MaxTxPower, END_OF_ARGS); TmpLen2 += TmpLen; // need to do the padding bit check, and concatenate it if ((TmpLen2%2) == 0) { UCHAR TmpLen3 = TmpLen2+4; MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &CountryIe, 1, &TmpLen3, 3, pAd->CommonCfg.CountryCode, TmpLen2+1, TmpFrame, END_OF_ARGS); } else { UCHAR TmpLen3 = TmpLen2+3; MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &CountryIe, 1, &TmpLen3, 3, pAd->CommonCfg.CountryCode, TmpLen2, TmpFrame, END_OF_ARGS); } FrameLen += TmpLen; }// Country IE - #ifdef DOT11_N_SUPPORT if ((PhyMode >= PHY_11ABGN_MIXED) && (pAd->ApCfg.MBSSID[apidx].DesiredHtPhyInfo.bHtEnable)) { ULONG TmpLen; UCHAR HtLen, AddHtLen;//, NewExtLen; #ifdef RT_BIG_ENDIAN HT_CAPABILITY_IE HtCapabilityTmp; ADD_HT_INFO_IE addHTInfoTmp; #endif HtLen = sizeof(pAd->CommonCfg.HtCapability); AddHtLen = sizeof(pAd->CommonCfg.AddHTInfo); if (pAd->bBroadComHT == TRUE) { UCHAR epigram_ie_len; UCHAR BROADCOM_HTC[4] = {0x0, 0x90, 0x4c, 0x33}; UCHAR BROADCOM_AHTINFO[4] = {0x0, 0x90, 0x4c, 0x34}; epigram_ie_len = HtLen + 4; #ifndef RT_BIG_ENDIAN MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &WpaIe, 1, &epigram_ie_len, 4, &BROADCOM_HTC[0], HtLen, &pAd->CommonCfg.HtCapability, END_OF_ARGS); #else NdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, HtLen); *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); #ifdef UNALIGNMENT_SUPPORT { EXT_HT_CAP_INFO extHtCapInfo; NdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO)); *(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo)); NdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO)); } #else *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = cpu2le16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); #endif // UNALIGNMENT_SUPPORT // MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &WpaIe, 1, &epigram_ie_len, 4, &BROADCOM_HTC[0], HtLen, &HtCapabilityTmp, END_OF_ARGS); #endif FrameLen += TmpLen; epigram_ie_len = AddHtLen + 4; #ifndef RT_BIG_ENDIAN MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &WpaIe, 1, &epigram_ie_len, 4, &BROADCOM_AHTINFO[0], AddHtLen, &pAd->CommonCfg.AddHTInfo, END_OF_ARGS); #else NdisMoveMemory(&addHTInfoTmp, &pAd->CommonCfg.AddHTInfo, AddHtLen); *(USHORT *)(&addHTInfoTmp.AddHtInfo2) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2)); *(USHORT *)(&addHTInfoTmp.AddHtInfo3) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3)); MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &WpaIe, 1, &epigram_ie_len, 4, &BROADCOM_AHTINFO[0], AddHtLen, &addHTInfoTmp, END_OF_ARGS); #endif FrameLen += TmpLen; } } #endif // DOT11_N_SUPPORT // #ifdef WSC_AP_SUPPORT /* for windows 7 logo test */ if ((pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode != WSC_DISABLE) && #ifdef DOT1X_SUPPORT (pAd->ApCfg.MBSSID[apidx].IEEE8021X == FALSE) && #endif // DOT1X_SUPPORT // (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11WEPEnabled)) { /* Non-WPS Windows XP and Vista PCs are unable to determine if a WEP enalbed network is static key based or 802.1X based. If the legacy station gets an EAP-Rquest/Identity from the AP, it assume the WEP network is 802.1X enabled & will prompt the user for 802.1X credentials. If the legacy station doesn't receive anything after sending an EAPOL-Start, it will assume the WEP network is static key based and prompt user for the WEP key. <<from "WPS and Static Key WEP Networks">> A WPS enabled AP should include this IE in the beacon when the AP is hosting a static WEP key network. The IE would be 7 bytes long with the Extended Capability field set to 0 (all bits zero) http://msdn.microsoft.com/library/default.asp?url=/library/en-us/randz/protocol/securing_public_wi-fi_hotspots.asp */ ULONG TempLen1 = 0; UCHAR PROVISION_SERVICE_IE[7] = {0xDD, 0x05, 0x00, 0x50, 0xF2, 0x05, 0x00}; MakeOutgoingFrame(pOutBuffer+FrameLen, &TempLen1, 7, PROVISION_SERVICE_IE, END_OF_ARGS); FrameLen += TempLen1; } /* add Simple Config Information Element */ if (pAd->ApCfg.MBSSID[apidx].WscControl.bWscFragment && ((pAd->ApCfg.MBSSID[apidx].WscIEProbeResp.ValueLen-6) > pAd->ApCfg.MBSSID[apidx].WscControl.WscFragSize)) { ULONG WscTmpLen = 0; UCHAR *pIeBuf = NULL; WSC_IE_HEADER *pIeHeader = NULL; USHORT IeBufLen = 0, RemainingLen = 0, cnt = 0; USHORT WscFragSize = pAd->ApCfg.MBSSID[apidx].WscControl.WscFragSize; USHORT WscIeTotalLen = pAd->ApCfg.MBSSID[apidx].WscIEProbeResp.ValueLen; RemainingLen = WscIeTotalLen - 6; os_alloc_mem(NULL, &pIeBuf, 512); if (pIeBuf) { BOOLEAN bDone = FALSE; pIeHeader = pIeBuf; pIeHeader->elemId = 221; pIeHeader->oui[0] = 0x00; pIeHeader->oui[1] = 0x50; pIeHeader->oui[2] = 0xF2; pIeHeader->oui[3] = 0x04; for (;;) { if (RemainingLen > WscFragSize) { IeBufLen = WscFragSize; RemainingLen -= WscFragSize; } else { IeBufLen = RemainingLen; bDone = TRUE; } pIeHeader->length = 4 + IeBufLen; NdisMoveMemory(pIeBuf + sizeof(WSC_IE_HEADER), pAd->ApCfg.MBSSID[apidx].WscIEProbeResp.Value + 6 + (cnt*WscFragSize), IeBufLen); MakeOutgoingFrame(pOutBuffer+FrameLen, &WscTmpLen, (IeBufLen+6), pIeBuf, END_OF_ARGS); FrameLen += WscTmpLen; cnt++; if (bDone) break; } os_free_mem(NULL, pIeBuf); } else { MakeOutgoingFrame(pOutBuffer+FrameLen, &WscTmpLen, pAd->ApCfg.MBSSID[apidx].WscIEProbeResp.ValueLen, pAd->ApCfg.MBSSID[apidx].WscIEProbeResp.Value, END_OF_ARGS); FrameLen += WscTmpLen; } } else if ((pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode > WSC_DISABLE) && (pAd->ApCfg.MBSSID[apidx].WscIEProbeResp.ValueLen)) { ULONG WscTmpLen = 0; MakeOutgoingFrame(pOutBuffer+FrameLen, &WscTmpLen, pAd->ApCfg.MBSSID[apidx].WscIEProbeResp.ValueLen, pAd->ApCfg.MBSSID[apidx].WscIEProbeResp.Value, END_OF_ARGS); FrameLen += WscTmpLen; } #endif // WSC_AP_SUPPORT // // 802.11n 11.1.3.2.2 active scanning. sending probe response with MCS rate is MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); MlmeFreeMemory(pAd, pOutBuffer); }
INT NfcBuildWscProfileTLV( IN PRTMP_ADAPTER pAd, IN PWSC_CTRL pWscCtrl, OUT UCHAR *pbuf, OUT USHORT *pBufLen) { INT Status = NDIS_STATUS_SUCCESS; PWSC_CREDENTIAL pCredential = NULL; UCHAR apidx = pWscCtrl->EntryIfIdx; UCHAR *TB = NULL; UCHAR *pData = NULL, *pSrcData = NULL; INT CerLen = 0; USHORT AuthType = 0; USHORT EncrType = 0; PWSC_REG_DATA pReg = (PWSC_REG_DATA) &pWscCtrl->RegData; INT Len = 0, templen = 0; struct wifi_dev *wdev; BSS_STRUCT *pMbss; #ifdef WSC_V2_SUPPORT PWSC_TLV pWscTLV = &pWscCtrl->WscV2Info.ExtraTlv; #endif /* WSC_V2_SUPPORT */ os_alloc_mem(pAd, (UCHAR **)&pData, (NFC_WSC_TLV_SIZE*sizeof(UCHAR))); if (pData == NULL) { return NDIS_STATUS_RESOURCES; } os_alloc_mem(pAd, (UCHAR **)&TB, (256*sizeof(UCHAR))); if (TB == NULL) { os_free_mem(NULL, pData); return NDIS_STATUS_RESOURCES; } pMbss = &pAd->ApCfg.MBSSID[apidx]; wdev = &pMbss->wdev; pSrcData = pData; NdisZeroMemory(pData, NFC_WSC_TLV_SIZE); NdisZeroMemory(&TB[0], 256); WscCreateProfileFromCfg(pAd, REGISTRAR_ACTION | AP_MODE, pWscCtrl, &pWscCtrl->WscProfile); pCredential = &pAd->ApCfg.MBSSID[apidx].WscControl.WscProfile.Profile[0]; // Credential CerLen += AppendWSCTLV(WSC_ID_NW_INDEX, &TB[0], (PUCHAR)"1", 0); AuthType = cpu2be16(pCredential->AuthType); EncrType = cpu2be16(pCredential->EncrType); CerLen += AppendWSCTLV(WSC_ID_SSID, &TB[CerLen], pCredential->SSID.Ssid, pCredential->SSID.SsidLength); CerLen += AppendWSCTLV(WSC_ID_AUTH_TYPE, &TB[CerLen], (UINT8 *)&AuthType, 0); CerLen += AppendWSCTLV(WSC_ID_ENCR_TYPE, &TB[CerLen], (UINT8 *)&EncrType, 0); CerLen += AppendWSCTLV(WSC_ID_NW_KEY_INDEX, &TB[CerLen], &pCredential->KeyIndex, 0); CerLen += AppendWSCTLV(WSC_ID_NW_KEY, &TB[CerLen], pCredential->Key, pCredential->KeyLength); CerLen += AppendWSCTLV(WSC_ID_MAC_ADDR, &TB[CerLen], wdev->bssid, 0); // Prepare plain text // Reguired attribute item in M8 if Enrollee is STA. templen = AppendWSCTLV(WSC_ID_CREDENTIAL, pData, TB, CerLen); pData += templen; Len += templen; /* Optional items. RF_Band, AP_Channel, MAC_Address */ UCHAR RF_Band; if (pAd->CommonCfg.Channel > 14) RF_Band = 0x02; /* 5.0GHz */ else RF_Band = 0x01; /* 2.4GHz */ templen = AppendWSCTLV(WSC_ID_RF_BAND, pData, &RF_Band, 0); pData += templen; Len += templen; USHORT Channel = 0; Channel = pAd->CommonCfg.Channel; #ifdef RT_BIG_ENDIAN Channel = SWAP16(Channel); #endif /* RT_BIG_ENDIAN */ templen = AppendWSCTLV(WSC_ID_AP_CHANNEL, pData, (UINT8 *)&Channel, 0); pData += templen; Len += templen; templen = AppendWSCTLV(WSC_ID_MAC_ADDR, pData, wdev->bssid, 0); pData += templen; Len += templen; #ifdef WSC_V2_SUPPORT if (pWscCtrl->WscV2Info.bEnableWpsV2) { /* Version2 */ WscGenV2Msg(pWscCtrl, FALSE, NULL, 0, &pData, &Len); /* Extra attribute that is not defined in WSC Sepc. */ if (pWscTLV->pTlvData && pWscTLV->TlvLen) { templen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen); pData += templen; Len += templen; } } #endif // WSC_V2_SUPPORT // hex_dump("NfcBuildWscProfileTLV - pData", pSrcData, Len); if (pbuf && (Len < NFC_WSC_TLV_SIZE)) { NdisMoveMemory(pbuf, pSrcData, Len); *pBufLen = (USHORT)Len; hex_dump("NfcBuildWscProfileTLV", pbuf, *pBufLen); } else { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: (Len=%d)\n", __FUNCTION__, Len)); Status = NDIS_STATUS_RESOURCES; } os_free_mem(NULL, pSrcData); os_free_mem(NULL, TB); return Status; }
/* Defined in IEEE 802.11AC Appeared in Beacon, (Re)AssocResp, ProbResp frames */ INT build_vht_op_ie(RTMP_ADAPTER *pAd, UCHAR *buf) { VHT_OP_IE vht_op; #ifdef RT_BIG_ENDIAN UINT16 tmp; #endif /* RT_BIG_ENDIAN */ NdisZeroMemory((UCHAR *)&vht_op, sizeof(VHT_OP_IE)); vht_op.vht_op_info.ch_width = (pAd->CommonCfg.vht_bw == VHT_BW_80 ? 1: 0); switch (vht_op.vht_op_info.ch_width) { case 0: vht_op.vht_op_info.center_freq_1 = 0; vht_op.vht_op_info.center_freq_2 = 0; break; case 1: case 2: vht_op.vht_op_info.center_freq_1 = pAd->CommonCfg.vht_cent_ch; vht_op.vht_op_info.center_freq_2 = 0; break; case 3: vht_op.vht_op_info.center_freq_1 = pAd->CommonCfg.vht_cent_ch; vht_op.vht_op_info.center_freq_2 = pAd->CommonCfg.vht_cent_ch2; break; } vht_op.basic_mcs_set.mcs_ss1 = 3; vht_op.basic_mcs_set.mcs_ss2 = 3; vht_op.basic_mcs_set.mcs_ss3 = 3; vht_op.basic_mcs_set.mcs_ss4 = 3; vht_op.basic_mcs_set.mcs_ss5 = 3; vht_op.basic_mcs_set.mcs_ss6 = 3; vht_op.basic_mcs_set.mcs_ss7 = 3; vht_op.basic_mcs_set.mcs_ss8 = 3; switch (pAd->CommonCfg.RxStream) { case 2: vht_op.basic_mcs_set.mcs_ss2 = VHT_MCS_CAP_7; case 1: #ifdef MT76x0 if (IS_MT76x0(pAd)) { /* MT7650E2 support VHT_MCS8 & VHT_MCS9. */ vht_op.basic_mcs_set.mcs_ss1 = pAd->CommonCfg.vht_max_mcs_cap; } else #endif /* MT76x0 */ vht_op.basic_mcs_set.mcs_ss1 = VHT_MCS_CAP_7; break; } #ifdef RT_BIG_ENDIAN //SWAP16((UINT16)vht_op.basic_mcs_set); NdisCopyMemory(&tmp,&vht_op.basic_mcs_set, 2); tmp=SWAP16(tmp); NdisCopyMemory(&vht_op.basic_mcs_set,&tmp, 2); #endif /* RT_BIG_ENDIAN */ NdisMoveMemory((UCHAR *)buf, (UCHAR *)&vht_op, sizeof(VHT_OP_IE)); return sizeof(VHT_OP_IE); }
int image_get_jpeg_resolution(const char * path, int * width, int * height) { FILE *img; unsigned char buf[8]; uint16_t offset, h, w; int ret = 1; size_t nread; long size; img = fopen(path, "r"); if( !img ) return -1; fseek(img, 0, SEEK_END); size = ftell(img); rewind(img); nread = fread(&buf, 2, 1, img); if( (nread < 1) || (buf[0] != 0xFF) || (buf[1] != 0xD8) ) { fclose(img); return -1; } memset(&buf, 0, sizeof(buf)); while( ftell(img) < size ) { while( nread > 0 && buf[0] != 0xFF && !feof(img) ) nread = fread(&buf, 1, 1, img); while( nread > 0 && buf[0] == 0xFF && !feof(img) ) nread = fread(&buf, 1, 1, img); if( (buf[0] >= 0xc0) && (buf[0] <= 0xc3) ) { nread = fread(&buf, 7, 1, img); *width = 0; *height = 0; if( nread < 1 ) break; memcpy(&h, buf+3, 2); *height = SWAP16(h); memcpy(&w, buf+5, 2); *width = SWAP16(w); ret = 0; break; } else { offset = 0; nread = fread(&buf, 2, 1, img); if( nread < 1 ) break; memcpy(&offset, buf, 2); offset = SWAP16(offset) - 2; if( fseek(img, offset, SEEK_CUR) == -1 ) break; } } fclose(img); return ret; }
/** * Start payload rx */ int // -1 = abort, 0 = continue UBX::payload_rx_init() { int ret = 0; _rx_state = UBX_RXMSG_HANDLE; // handle by default switch (_rx_msg) { case UBX_MSG_NAV_PVT: if ( (_rx_payload_length != UBX_PAYLOAD_RX_NAV_PVT_SIZE_UBX7) /* u-blox 7 msg format */ && (_rx_payload_length != UBX_PAYLOAD_RX_NAV_PVT_SIZE_UBX8)) /* u-blox 8+ msg format */ _rx_state = UBX_RXMSG_ERROR_LENGTH; else if (!_configured) _rx_state = UBX_RXMSG_IGNORE; // ignore if not _configured else if (!_use_nav_pvt) _rx_state = UBX_RXMSG_DISABLE; // disable if not using NAV-PVT break; case UBX_MSG_NAV_POSLLH: if (_rx_payload_length != sizeof(ubx_payload_rx_nav_posllh_t)) _rx_state = UBX_RXMSG_ERROR_LENGTH; else if (!_configured) _rx_state = UBX_RXMSG_IGNORE; // ignore if not _configured else if (_use_nav_pvt) _rx_state = UBX_RXMSG_DISABLE; // disable if using NAV-PVT instead break; case UBX_MSG_NAV_SOL: if (_rx_payload_length != sizeof(ubx_payload_rx_nav_sol_t)) _rx_state = UBX_RXMSG_ERROR_LENGTH; else if (!_configured) _rx_state = UBX_RXMSG_IGNORE; // ignore if not _configured else if (_use_nav_pvt) _rx_state = UBX_RXMSG_DISABLE; // disable if using NAV-PVT instead break; case UBX_MSG_NAV_TIMEUTC: if (_rx_payload_length != sizeof(ubx_payload_rx_nav_timeutc_t)) _rx_state = UBX_RXMSG_ERROR_LENGTH; else if (!_configured) _rx_state = UBX_RXMSG_IGNORE; // ignore if not _configured else if (_use_nav_pvt) _rx_state = UBX_RXMSG_DISABLE; // disable if using NAV-PVT instead break; case UBX_MSG_NAV_SVINFO: if (_satellite_info == nullptr) _rx_state = UBX_RXMSG_DISABLE; // disable if sat info not requested else if (!_configured) _rx_state = UBX_RXMSG_IGNORE; // ignore if not _configured else memset(_satellite_info, 0, sizeof(*_satellite_info)); // initialize sat info break; case UBX_MSG_NAV_VELNED: if (_rx_payload_length != sizeof(ubx_payload_rx_nav_velned_t)) _rx_state = UBX_RXMSG_ERROR_LENGTH; else if (!_configured) _rx_state = UBX_RXMSG_IGNORE; // ignore if not _configured else if (_use_nav_pvt) _rx_state = UBX_RXMSG_DISABLE; // disable if using NAV-PVT instead break; case UBX_MSG_MON_VER: break; // unconditionally handle this message case UBX_MSG_MON_HW: if ( (_rx_payload_length != sizeof(ubx_payload_rx_mon_hw_ubx6_t)) /* u-blox 6 msg format */ && (_rx_payload_length != sizeof(ubx_payload_rx_mon_hw_ubx7_t))) /* u-blox 7+ msg format */ _rx_state = UBX_RXMSG_ERROR_LENGTH; else if (!_configured) _rx_state = UBX_RXMSG_IGNORE; // ignore if not _configured break; case UBX_MSG_ACK_ACK: if (_rx_payload_length != sizeof(ubx_payload_rx_ack_ack_t)) _rx_state = UBX_RXMSG_ERROR_LENGTH; else if (_configured) _rx_state = UBX_RXMSG_IGNORE; // ignore if _configured break; case UBX_MSG_ACK_NAK: if (_rx_payload_length != sizeof(ubx_payload_rx_ack_nak_t)) _rx_state = UBX_RXMSG_ERROR_LENGTH; else if (_configured) _rx_state = UBX_RXMSG_IGNORE; // ignore if _configured break; default: _rx_state = UBX_RXMSG_DISABLE; // disable all other messages break; } switch (_rx_state) { case UBX_RXMSG_HANDLE: // handle message case UBX_RXMSG_IGNORE: // ignore message but don't report error ret = 0; break; case UBX_RXMSG_DISABLE: // disable unexpected messages UBX_WARN("ubx msg 0x%04x len %u unexpected", SWAP16((unsigned)_rx_msg), (unsigned)_rx_payload_length); { hrt_abstime t = hrt_absolute_time(); if (t > _disable_cmd_last + DISABLE_MSG_INTERVAL) { /* don't attempt for every message to disable, some might not be disabled */ _disable_cmd_last = t; UBX_WARN("ubx disabling msg 0x%04x", SWAP16((unsigned)_rx_msg)); configure_message_rate(_rx_msg, 0); } } ret = -1; // return error, abort handling this message break; case UBX_RXMSG_ERROR_LENGTH: // error: invalid length UBX_WARN("ubx msg 0x%04x invalid len %u", SWAP16((unsigned)_rx_msg), (unsigned)_rx_payload_length); ret = -1; // return error, abort handling this message break; default: // invalid message state UBX_WARN("ubx internal err1"); ret = -1; // return error, abort handling this message break; } return ret; }
static int scan_active(RTMP_ADAPTER *pAd, UCHAR OpMode, UCHAR ScanType) { UCHAR *frm_buf = NULL; HEADER_802_11 Hdr80211; ULONG FrameLen = 0; UCHAR SsidLen = 0; if (MlmeAllocateMemory(pAd, &frm_buf) != NDIS_STATUS_SUCCESS) { DBGPRINT(RT_DEBUG_TRACE, ("SYNC - ScanNextChannel() allocate memory fail\n")); #ifdef CONFIG_AP_SUPPORT if (OpMode == OPMODE_AP) pAd->Mlme.ApSyncMachine.CurrState = AP_SYNC_IDLE; #endif /* CONFIG_AP_SUPPORT */ return FALSE; } #ifdef DOT11_N_SUPPORT #ifdef DOT11N_DRAFT3 if (ScanType == SCAN_2040_BSS_COEXIST) { DBGPRINT(RT_DEBUG_INFO, ("SYNC - SCAN_2040_BSS_COEXIST !! Prepare to send Probe Request\n")); } #endif /* DOT11N_DRAFT3 */ #endif /* DOT11_N_SUPPORT */ /* There is no need to send broadcast probe request if active scan is in effect.*/ SsidLen = 0; if ((ScanType == SCAN_ACTIVE) || (ScanType == FAST_SCAN_ACTIVE) ) SsidLen = pAd->MlmeAux.SsidLen; { #ifdef CONFIG_AP_SUPPORT /*IF_DEV_CONFIG_OPMODE_ON_AP(pAd) */ if (OpMode == OPMODE_AP) { MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR, pAd->ApCfg.MBSSID[0].Bssid); } #endif /* CONFIG_AP_SUPPORT */ MakeOutgoingFrame(frm_buf, &FrameLen, sizeof(HEADER_802_11), &Hdr80211, 1, &SsidIe, 1, &SsidLen, SsidLen, pAd->MlmeAux.Ssid, 1, &SupRateIe, 1, &pAd->CommonCfg.SupRateLen, pAd->CommonCfg.SupRateLen, pAd->CommonCfg.SupRate, END_OF_ARGS); if (pAd->CommonCfg.ExtRateLen) { ULONG Tmp; MakeOutgoingFrame(frm_buf + FrameLen, &Tmp, 1, &ExtRateIe, 1, &pAd->CommonCfg.ExtRateLen, pAd->CommonCfg.ExtRateLen, pAd->CommonCfg.ExtRate, END_OF_ARGS); FrameLen += Tmp; } } #ifdef DOT11_N_SUPPORT if (WMODE_CAP_N(pAd->CommonCfg.PhyMode)) { ULONG Tmp; UCHAR HtLen; UCHAR BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33}; #ifdef RT_BIG_ENDIAN HT_CAPABILITY_IE HtCapabilityTmp; #endif if (pAd->bBroadComHT == TRUE) { HtLen = pAd->MlmeAux.HtCapabilityLen + 4; #ifdef RT_BIG_ENDIAN NdisMoveMemory(&HtCapabilityTmp, &pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE); *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); #ifdef UNALIGNMENT_SUPPORT { EXT_HT_CAP_INFO extHtCapInfo; NdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO)); *(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo)); NdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO)); } #else *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = cpu2le16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); #endif /* UNALIGNMENT_SUPPORT */ MakeOutgoingFrame(frm_buf + FrameLen, &Tmp, 1, &WpaIe, 1, &HtLen, 4, &BROADCOM[0], pAd->MlmeAux.HtCapabilityLen, &HtCapabilityTmp, END_OF_ARGS); #else MakeOutgoingFrame(frm_buf + FrameLen, &Tmp, 1, &WpaIe, 1, &HtLen, 4, &BROADCOM[0], pAd->MlmeAux.HtCapabilityLen, &pAd->MlmeAux.HtCapability, END_OF_ARGS); #endif /* RT_BIG_ENDIAN */ } else { HtLen = sizeof(HT_CAPABILITY_IE); #ifdef RT_BIG_ENDIAN NdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, SIZE_HT_CAP_IE); *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); #ifdef UNALIGNMENT_SUPPORT { EXT_HT_CAP_INFO extHtCapInfo; NdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO)); *(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo)); NdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO)); } #else *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = cpu2le16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); #endif /* UNALIGNMENT_SUPPORT */ MakeOutgoingFrame(frm_buf + FrameLen, &Tmp, 1, &HtCapIe, 1, &HtLen, HtLen, &HtCapabilityTmp, END_OF_ARGS); #else MakeOutgoingFrame(frm_buf + FrameLen, &Tmp, 1, &HtCapIe, 1, &HtLen, HtLen, &pAd->CommonCfg.HtCapability, END_OF_ARGS); #endif /* RT_BIG_ENDIAN */ } FrameLen += Tmp; #ifdef DOT11N_DRAFT3 if ((pAd->MlmeAux.Channel <= 14) && (pAd->CommonCfg.bBssCoexEnable == TRUE)) { ULONG Tmp; HtLen = 1; MakeOutgoingFrame(frm_buf + FrameLen, &Tmp, 1, &ExtHtCapIe, 1, &HtLen, 1, &pAd->CommonCfg.BSSCoexist2040.word, END_OF_ARGS); FrameLen += Tmp; } #endif /* DOT11N_DRAFT3 */ } #endif /* DOT11_N_SUPPORT */ #ifdef DOT11_VHT_AC if (WMODE_CAP_AC(pAd->CommonCfg.PhyMode) && (pAd->MlmeAux.Channel > 14)) { FrameLen += build_vht_ies(pAd, (UCHAR *)(frm_buf + FrameLen), SUBTYPE_PROBE_REQ); } #endif /* DOT11_VHT_AC */ MiniportMMRequest(pAd, 0, frm_buf, FrameLen); MlmeFreeMemory(pAd, frm_buf); return TRUE; }
/* ========================================================================== Description: Update the BEACON frame in the shared memory. Because TIM IE is variable length. other IEs after TIM has to shift and total frame length may change for each BEACON period. Output: pAd->ApCfg.MBSSID[apidx].CapabilityInfo pAd->ApCfg.ErpIeContent ========================================================================== */ VOID APUpdateBeaconFrame( IN PRTMP_ADAPTER pAd, IN INT apidx) { /*PTXWI_STRUC pTxWI = &pAd->BeaconTxWI; */ PUCHAR pBeaconFrame = (PUCHAR)pAd->ApCfg.MBSSID[apidx].BeaconBuf; UCHAR *ptr; ULONG FrameLen = pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon; ULONG UpdatePos = pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon; /*ULONG CapInfoPos = pAd->ApCfg.MBSSID[apidx].CapabilityInfoLocationInBeacon; */ UCHAR RSNIe=IE_WPA, RSNIe2=IE_WPA2; UCHAR ID_1B, TimFirst, TimLast, *pTim; MULTISSID_STRUCT *pMbss; COMMON_CONFIG *pComCfg; UCHAR PhyMode; BOOLEAN bHasWpsIE = FALSE; UINT i; HTTRANSMIT_SETTING BeaconTransmit; /* MGMT frame PHY rate setting when operatin at Ht rate. */ pMbss = &pAd->ApCfg.MBSSID[apidx]; pComCfg = &pAd->CommonCfg; PhyMode = pMbss->PhyMode; if(!BeaconTransmitRequired(pAd, apidx, pMbss)) return; /* */ /* step 1 - update BEACON's Capability */ /* */ ptr = pBeaconFrame + pMbss->CapabilityInfoLocationInBeacon; *ptr = (UCHAR)(pMbss->CapabilityInfo & 0x00ff); *(ptr+1) = (UCHAR)((pMbss->CapabilityInfo & 0xff00) >> 8); /* */ /* step 2 - update TIM IE */ /* TODO: enlarge TIM bitmap to support up to 64 STAs */ /* TODO: re-measure if RT2600 TBTT interrupt happens faster than BEACON sent out time */ /* */ ptr = pBeaconFrame + pMbss->TimIELocationInBeacon; *ptr = IE_TIM; *(ptr + 2) = pAd->ApCfg.DtimCount; *(ptr + 3) = pAd->ApCfg.DtimPeriod; /* find the smallest AID (PS mode) */ TimFirst = 0; /* record first TIM byte != 0x00 */ TimLast = 0; /* record last TIM byte != 0x00 */ pTim = pMbss->TimBitmaps; for(ID_1B=0; ID_1B<WLAN_MAX_NUM_OF_TIM; ID_1B++) { /* get the TIM indicating PS packets for 8 stations */ UCHAR tim_1B = pTim[ID_1B]; if (ID_1B == 0) tim_1B &= 0xfe; /* skip bit0 bc/mc */ /* End of if */ if (tim_1B == 0) continue; /* find next 1B */ /* End of if */ if (TimFirst == 0) TimFirst = ID_1B; /* End of if */ TimLast = ID_1B; } /* End of for */ /* fill TIM content to beacon buffer */ if (TimFirst & 0x01) TimFirst --; /* find the even offset byte */ /* End of if */ *(ptr + 1) = 3+(TimLast-TimFirst+1); /* TIM IE length */ *(ptr + 4) = TimFirst; for(i=TimFirst; i<=TimLast; i++) *(ptr + 5 + i - TimFirst) = pTim[i]; /* End of for */ /* bit0 means backlogged mcast/bcast */ if (pAd->ApCfg.DtimCount == 0) *(ptr + 4) |= (pMbss->TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] & 0x01); /* adjust BEACON length according to the new TIM */ FrameLen += (2 + *(ptr+1)); #ifdef HOSTAPD_SUPPORT if ( pAd->ApCfg.MBSSID[apidx].HostapdWPS && (pAd->ApCfg.MBSSID[apidx].WscIEBeacon.ValueLen)) bHasWpsIE = TRUE; #endif if ((pMbss->AuthMode == Ndis802_11AuthModeWPA) || (pMbss->AuthMode == Ndis802_11AuthModeWPAPSK)) RSNIe = IE_WPA; else if ((pMbss->AuthMode == Ndis802_11AuthModeWPA2) || (pMbss->AuthMode == Ndis802_11AuthModeWPA2PSK)) RSNIe = IE_WPA2; #ifdef WAPI_SUPPORT else if ((pMbss->AuthMode == Ndis802_11AuthModeWAICERT) || (pMbss->AuthMode == Ndis802_11AuthModeWAIPSK)) RSNIe = IE_WAPI; #endif /* WAPI_SUPPORT */ /* Append RSN_IE when WPA OR WPAPSK, */ if ((pMbss->AuthMode == Ndis802_11AuthModeWPA1WPA2) || (pMbss->AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)) { ULONG TmpLen; MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen, 1, &RSNIe, 1, &pMbss->RSNIE_Len[0], pMbss->RSNIE_Len[0], pMbss->RSN_IE[0], 1, &RSNIe2, 1, &pMbss->RSNIE_Len[1], pMbss->RSNIE_Len[1], pMbss->RSN_IE[1], END_OF_ARGS); FrameLen += TmpLen; } else if (pMbss->AuthMode >= Ndis802_11AuthModeWPA) { ULONG TmpLen; MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen, 1, &RSNIe, 1, &pMbss->RSNIE_Len[0], pMbss->RSNIE_Len[0], pMbss->RSN_IE[0], END_OF_ARGS); FrameLen += TmpLen; } #ifdef WSC_AP_SUPPORT /* add Simple Config Information Element */ if (((pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode >= 1) && (pAd->ApCfg.MBSSID[apidx].WscIEBeacon.ValueLen))) { bHasWpsIE = TRUE; } #endif /* WSC_AP_SUPPORT */ if (bHasWpsIE) { ULONG WscTmpLen = 0; MakeOutgoingFrame(pBeaconFrame+FrameLen, &WscTmpLen, pAd->ApCfg.MBSSID[apidx].WscIEBeacon.ValueLen, pAd->ApCfg.MBSSID[apidx].WscIEBeacon.Value, END_OF_ARGS); FrameLen += WscTmpLen; } #ifdef WSC_AP_SUPPORT if ((pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode != WSC_DISABLE) && #ifdef DOT1X_SUPPORT (pAd->ApCfg.MBSSID[apidx].IEEE8021X == FALSE) && #endif /* DOT1X_SUPPORT */ (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11WEPEnabled)) { /* Non-WPS Windows XP and Vista PCs are unable to determine if a WEP enalbed network is static key based or 802.1X based. If the legacy station gets an EAP-Rquest/Identity from the AP, it assume the WEP network is 802.1X enabled & will prompt the user for 802.1X credentials. If the legacy station doesn't receive anything after sending an EAPOL-Start, it will assume the WEP network is static key based and prompt user for the WEP key. <<from "WPS and Static Key WEP Networks">> A WPS enabled AP should include this IE in the beacon when the AP is hosting a static WEP key network. The IE would be 7 bytes long with the Extended Capability field set to 0 (all bits zero) http:msdn.microsoft.com/library/default.asp?url=/library/en-us/randz/protocol/securing_public_wi-fi_hotspots.asp */ ULONG TempLen = 0; UCHAR PROVISION_SERVICE_IE[7] = {0xDD, 0x05, 0x00, 0x50, 0xF2, 0x05, 0x00}; MakeOutgoingFrame(pBeaconFrame+FrameLen, &TempLen, 7, PROVISION_SERVICE_IE, END_OF_ARGS); FrameLen += TempLen; } #endif /* WSC_AP_SUPPORT */ /* Update ERP */ if ((pComCfg->ExtRateLen) && (PhyMode != PHY_11B)) { /* fill ERP IE */ ptr = (UCHAR *)pBeaconFrame + FrameLen; /* pTxD->DataByteCnt; */ *ptr = IE_ERP; *(ptr + 1) = 1; *(ptr + 2) = pAd->ApCfg.ErpIeContent; FrameLen += 3; } #ifdef A_BAND_SUPPORT /* fill up Channel Switch Announcement Element */ if ((pComCfg->Channel > 14) && (pComCfg->bIEEE80211H == 1) && (pAd->Dot11_H.RDMode == RD_SWITCHING_MODE)) { ptr = pBeaconFrame + FrameLen; *ptr = IE_CHANNEL_SWITCH_ANNOUNCEMENT; *(ptr + 1) = 3; *(ptr + 2) = 1; *(ptr + 3) = pComCfg->Channel; *(ptr + 4) = (pAd->Dot11_H.CSPeriod - pAd->Dot11_H.CSCount - 1); ptr += 5; FrameLen += 5; #ifdef DOT11_N_SUPPORT /* Extended Channel Switch Announcement Element */ if (pComCfg->bExtChannelSwitchAnnouncement) { HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE HtExtChannelSwitchIe; build_ext_channel_switch_ie(pAd, &HtExtChannelSwitchIe); NdisMoveMemory(ptr, &HtExtChannelSwitchIe, sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE)); ptr += sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE); FrameLen += sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE); } #endif /* DOT11_N_SUPPORT */ } #endif /* A_BAND_SUPPORT */ #ifdef DOT11_N_SUPPORT /* step 5. Update HT. Since some fields might change in the same BSS. */ if ((PhyMode >= PHY_11ABGN_MIXED) && (pMbss->DesiredHtPhyInfo.bHtEnable)) { ULONG TmpLen; UCHAR HtLen, HtLen1; /*UCHAR i; */ #ifdef RT_BIG_ENDIAN HT_CAPABILITY_IE HtCapabilityTmp; ADD_HT_INFO_IE addHTInfoTmp; /* USHORT b2lTmp, b2lTmp2; // no use */ #endif /* add HT Capability IE */ HtLen = sizeof(pComCfg->HtCapability); HtLen1 = sizeof(pComCfg->AddHTInfo); #ifndef RT_BIG_ENDIAN MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen, 1, &HtCapIe, 1, &HtLen, HtLen, &pComCfg->HtCapability, 1, &AddHtInfoIe, 1, &HtLen1, HtLen1, &pComCfg->AddHTInfo, END_OF_ARGS); #else NdisMoveMemory(&HtCapabilityTmp, &pComCfg->HtCapability, HtLen); *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); #ifdef UNALIGNMENT_SUPPORT { EXT_HT_CAP_INFO extHtCapInfo; NdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO)); *(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo)); NdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO)); } #else *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); #endif /* UNALIGNMENT_SUPPORT */ NdisMoveMemory(&addHTInfoTmp, &pComCfg->AddHTInfo, HtLen1); *(USHORT *)(&addHTInfoTmp.AddHtInfo2) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2)); *(USHORT *)(&addHTInfoTmp.AddHtInfo3) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3)); MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen, 1, &HtCapIe, 1, &HtLen, HtLen, &HtCapabilityTmp, 1, &AddHtInfoIe, 1, &HtLen1, HtLen1, &addHTInfoTmp, END_OF_ARGS); #endif FrameLen += TmpLen; } #ifdef DOT11N_DRAFT3 /* P802.11n_D3.03, 7.3.2.60 Overlapping BSS Scan Parameters IE */ if ((PhyMode >= PHY_11ABGN_MIXED) && (pComCfg->Channel <= 14) && (pMbss->DesiredHtPhyInfo.bHtEnable) && (pComCfg->HtCapability.HtCapInfo.ChannelWidth == 1)) { OVERLAP_BSS_SCAN_IE OverlapScanParam; ULONG TmpLen; UCHAR OverlapScanIE, ScanIELen; OverlapScanIE = IE_OVERLAPBSS_SCAN_PARM; ScanIELen = 14; OverlapScanParam.ScanPassiveDwell = cpu2le16(pComCfg->Dot11OBssScanPassiveDwell); OverlapScanParam.ScanActiveDwell = cpu2le16(pComCfg->Dot11OBssScanActiveDwell); OverlapScanParam.TriggerScanInt = cpu2le16(pComCfg->Dot11BssWidthTriggerScanInt); OverlapScanParam.PassiveTalPerChannel = cpu2le16(pComCfg->Dot11OBssScanPassiveTotalPerChannel); OverlapScanParam.ActiveTalPerChannel = cpu2le16(pComCfg->Dot11OBssScanActiveTotalPerChannel); OverlapScanParam.DelayFactor = cpu2le16(pComCfg->Dot11BssWidthChanTranDelayFactor); OverlapScanParam.ScanActThre = cpu2le16(pComCfg->Dot11OBssScanActivityThre); MakeOutgoingFrame(pBeaconFrame + FrameLen, &TmpLen, 1, &OverlapScanIE, 1, &ScanIELen, ScanIELen, &OverlapScanParam, END_OF_ARGS); FrameLen += TmpLen; } #endif /* DOT11N_DRAFT3 */ #endif /* DOT11_N_SUPPORT */ #if defined(DOT11N_DRAFT3) || defined(DOT11V_WNM_SUPPORT) /* 7.3.2.27 Extended Capabilities IE */ { ULONG TmpLen, infoPos; PUCHAR pInfo; UCHAR extInfoLen; BOOLEAN bNeedAppendExtIE = FALSE; EXT_CAP_INFO_ELEMENT extCapInfo; extInfoLen = sizeof(EXT_CAP_INFO_ELEMENT); NdisZeroMemory(&extCapInfo, extInfoLen); #ifdef DOT11_N_SUPPORT #ifdef DOT11N_DRAFT3 /* P802.11n_D1.10, HT Information Exchange Support */ if ((PhyMode >= PHY_11ABGN_MIXED) && (pComCfg->Channel <= 14) && (pMbss->DesiredHtPhyInfo.bHtEnable) && (pComCfg->bBssCoexEnable == TRUE) ) { extCapInfo.BssCoexistMgmtSupport = 1; } #endif /* DOT11N_DRAFT3 */ #endif /* DOT11_N_SUPPORT */ pInfo = (PUCHAR)(&extCapInfo); for (infoPos = 0; infoPos < extInfoLen; infoPos++) { if (pInfo[infoPos] != 0) { bNeedAppendExtIE = TRUE; break; } } if (bNeedAppendExtIE == TRUE) { MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen, 1, &ExtCapIe, 1, &extInfoLen, extInfoLen, &extCapInfo, END_OF_ARGS); FrameLen += TmpLen; } } #endif /* defined(DOT11N_DRAFT3) || defined(DOT11V_WNM_SUPPORT) */ /* add WMM IE here */ if (pMbss->bWmmCapable) { ULONG TmpLen; UCHAR i; UCHAR WmeParmIe[26] = {IE_VENDOR_SPECIFIC, 24, 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0, 0}; UINT8 AIFSN[4]; WmeParmIe[8] = pAd->ApCfg.BssEdcaParm.EdcaUpdateCount & 0x0f; #ifdef UAPSD_SUPPORT UAPSD_MR_IE_FILL(WmeParmIe[8], &pMbss->UapsdInfo); #endif /* UAPSD_SUPPORT */ NdisMoveMemory(AIFSN, pAd->ApCfg.BssEdcaParm.Aifsn, sizeof(AIFSN)); for (i=QID_AC_BE; i<=QID_AC_VO; i++) { WmeParmIe[10+ (i*4)] = (i << 5) + /* b5-6 is ACI */ ((UCHAR)pAd->ApCfg.BssEdcaParm.bACM[i] << 4) + /* b4 is ACM */ (AIFSN[i] & 0x0f); /* b0-3 is AIFSN */ WmeParmIe[11+ (i*4)] = (pAd->ApCfg.BssEdcaParm.Cwmax[i] << 4) + /* b5-8 is CWMAX */ (pAd->ApCfg.BssEdcaParm.Cwmin[i] & 0x0f); /* b0-3 is CWMIN */ WmeParmIe[12+ (i*4)] = (UCHAR)(pAd->ApCfg.BssEdcaParm.Txop[i] & 0xff); /* low byte of TXOP */ WmeParmIe[13+ (i*4)] = (UCHAR)(pAd->ApCfg.BssEdcaParm.Txop[i] >> 8); /* high byte of TXOP */ } MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen, 26, WmeParmIe, END_OF_ARGS); FrameLen += TmpLen; }
/* ========================================================================== Description: Update the BEACON frame in the shared memory. Because TIM IE is variable length. other IEs after TIM has to shift and total frame length may change for each BEACON period. Output: pAd->ApCfg.MBSSID[apidx].CapabilityInfo pAd->ApCfg.ErpIeContent ========================================================================== */ VOID APUpdateBeaconFrame( IN PRTMP_ADAPTER pAd, IN INT apidx) { //PTXWI_STRUC pTxWI = &pAd->BeaconTxWI; PUCHAR pBeaconFrame = (PUCHAR)pAd->ApCfg.MBSSID[apidx].BeaconBuf; UCHAR *ptr; ULONG FrameLen = pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon; ULONG UpdatePos = pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon; //ULONG CapInfoPos = pAd->ApCfg.MBSSID[apidx].CapabilityInfoLocationInBeacon; UCHAR RSNIe=IE_WPA, RSNIe2=IE_WPA2; UCHAR ID_1B, TimFirst, TimLast, *pTim; MULTISSID_STRUCT *pMbss; COMMON_CONFIG *pComCfg; UINT i; HTTRANSMIT_SETTING BeaconTransmit; // MGMT frame PHY rate setting when operatin at Ht rate. pMbss = &pAd->ApCfg.MBSSID[apidx]; pComCfg = &pAd->CommonCfg; if(!BeaconTransmitRequired(pAd, apidx, pMbss)) return; // // step 1 - update BEACON's Capability // ptr = pBeaconFrame + pMbss->CapabilityInfoLocationInBeacon; *ptr = (UCHAR)(pMbss->CapabilityInfo & 0x00ff); *(ptr+1) = (UCHAR)((pMbss->CapabilityInfo & 0xff00) >> 8); // // step 2 - update TIM IE // TODO: enlarge TIM bitmap to support up to 64 STAs // TODO: re-measure if RT2600 TBTT interrupt happens faster than BEACON sent out time // ptr = pBeaconFrame + pMbss->TimIELocationInBeacon; *ptr = IE_TIM; *(ptr + 2) = pAd->ApCfg.DtimCount; *(ptr + 3) = pAd->ApCfg.DtimPeriod; /* find the smallest AID (PS mode) */ TimFirst = 0; /* record first TIM byte != 0x00 */ TimLast = 0; /* record last TIM byte != 0x00 */ pTim = pMbss->TimBitmaps; for(ID_1B=0; ID_1B<WLAN_MAX_NUM_OF_TIM; ID_1B++) { /* get the TIM indicating PS packets for 8 stations */ UCHAR tim_1B = pTim[ID_1B]; if (ID_1B == 0) tim_1B &= 0xfe; /* skip bit0 bc/mc */ /* End of if */ if (tim_1B == 0) continue; /* find next 1B */ /* End of if */ if (TimFirst == 0) TimFirst = ID_1B; /* End of if */ TimLast = ID_1B; } /* End of for */ /* fill TIM content to beacon buffer */ if (TimFirst & 0x01) TimFirst --; /* find the even offset byte */ /* End of if */ *(ptr + 1) = 3+(TimLast-TimFirst+1); /* TIM IE length */ *(ptr + 4) = TimFirst; for(i=TimFirst; i<=TimLast; i++) *(ptr + 5 + i - TimFirst) = pTim[i]; /* End of for */ // bit0 means backlogged mcast/bcast if (pAd->ApCfg.DtimCount == 0) *(ptr + 4) |= (pMbss->TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] & 0x01); // adjust BEACON length according to the new TIM FrameLen += (2 + *(ptr+1)); // Update ERP if (pComCfg->ExtRateLen) { // // fill ERP IE // ptr = (UCHAR *)pBeaconFrame + FrameLen; // pTxD->DataByteCnt; *ptr = IE_ERP; *(ptr + 1) = 1; *(ptr + 2) = pAd->ApCfg.ErpIeContent; FrameLen += 3; } #ifdef A_BAND_SUPPORT // // fill up Channel Switch Announcement Element // if ((pComCfg->Channel > 14) && (pComCfg->bIEEE80211H == 1) && (pComCfg->RadarDetect.RDMode == RD_SWITCHING_MODE)) { ptr = pBeaconFrame + FrameLen; *ptr = IE_CHANNEL_SWITCH_ANNOUNCEMENT; *(ptr + 1) = 3; *(ptr + 2) = 1; *(ptr + 3) = pComCfg->Channel; *(ptr + 4) = (pComCfg->RadarDetect.CSPeriod - pComCfg->RadarDetect.CSCount - 1); ptr += 5; FrameLen += 5; #ifdef DOT11_N_SUPPORT // Extended Channel Switch Announcement Element if (pComCfg->bExtChannelSwitchAnnouncement) { HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE HtExtChannelSwitchIe; build_ext_channel_switch_ie(pAd, &HtExtChannelSwitchIe); NdisMoveMemory(ptr, &HtExtChannelSwitchIe, sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE)); ptr += sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE); FrameLen += sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE); } #endif // DOT11_N_SUPPORT // } #endif // A_BAND_SUPPORT // #ifdef DOT11_N_SUPPORT // // step 5. Update HT. Since some fields might change in the same BSS. // if ((pComCfg->PhyMode >= PHY_11ABGN_MIXED) && (pMbss->DesiredHtPhyInfo.bHtEnable)) { ULONG TmpLen; UCHAR HtLen, HtLen1; //UCHAR i; #ifdef RT_BIG_ENDIAN HT_CAPABILITY_IE HtCapabilityTmp; ADD_HT_INFO_IE addHTInfoTmp; USHORT b2lTmp, b2lTmp2; #endif // add HT Capability IE HtLen = sizeof(pComCfg->HtCapability); HtLen1 = sizeof(pComCfg->AddHTInfo); #ifndef RT_BIG_ENDIAN MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen, 1, &HtCapIe, 1, &HtLen, HtLen, &pComCfg->HtCapability, 1, &AddHtInfoIe, 1, &HtLen1, HtLen1, &pComCfg->AddHTInfo, END_OF_ARGS); #else NdisMoveMemory(&HtCapabilityTmp, &pComCfg->HtCapability, HtLen); *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); #ifdef UNALIGNMENT_SUPPORT { EXT_HT_CAP_INFO extHtCapInfo; NdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO)); *(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo)); NdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO)); } #else *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); #endif // UNALIGNMENT_SUPPORT // NdisMoveMemory(&addHTInfoTmp, &pComCfg->AddHTInfo, HtLen1); *(USHORT *)(&addHTInfoTmp.AddHtInfo2) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2)); *(USHORT *)(&addHTInfoTmp.AddHtInfo3) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3)); MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen, 1, &HtCapIe, 1, &HtLen, HtLen, &HtCapabilityTmp, 1, &AddHtInfoIe, 1, &HtLen1, HtLen1, &addHTInfoTmp, END_OF_ARGS); #endif FrameLen += TmpLen; } #ifdef DOT11N_DRAFT3 // P802.11n_D3.03 // 7.3.2.60 Overlapping BSS Scan Parameters IE if ((pComCfg->PhyMode >= PHY_11ABGN_MIXED) && (pMbss->DesiredHtPhyInfo.bHtEnable) && (pComCfg->HtCapability.HtCapInfo.ChannelWidth == 1)) { OVERLAP_BSS_SCAN_IE OverlapScanParam; ULONG TmpLen; UCHAR OverlapScanIE, ScanIELen; OverlapScanIE = IE_OVERLAPBSS_SCAN_PARM; ScanIELen = 14; OverlapScanParam.ScanPassiveDwell = cpu2le16(pComCfg->Dot11OBssScanPassiveDwell); OverlapScanParam.ScanActiveDwell = cpu2le16(pComCfg->Dot11OBssScanActiveDwell); OverlapScanParam.TriggerScanInt = cpu2le16(pComCfg->Dot11BssWidthTriggerScanInt); OverlapScanParam.PassiveTalPerChannel = cpu2le16(pComCfg->Dot11OBssScanPassiveTotalPerChannel); OverlapScanParam.ActiveTalPerChannel = cpu2le16(pComCfg->Dot11OBssScanActiveTotalPerChannel); OverlapScanParam.DelayFactor = cpu2le16(pComCfg->Dot11BssWidthChanTranDelayFactor); OverlapScanParam.ScanActThre = cpu2le16(pComCfg->Dot11OBssScanActivityThre); MakeOutgoingFrame(pBeaconFrame + FrameLen, &TmpLen, 1, &OverlapScanIE, 1, &ScanIELen, ScanIELen, &OverlapScanParam, END_OF_ARGS); FrameLen += TmpLen; } #endif // DOT11N_DRAFT3 // #endif // DOT11_N_SUPPORT // #if defined(DOT11N_DRAFT3) || defined(DOT11V_WNM_SUPPORT) // 7.3.2.27 Extended Capabilities IE { ULONG TmpLen, infoPos; PUCHAR pInfo; UCHAR extInfoLen; BOOLEAN bNeedAppendExtIE = FALSE; EXT_CAP_INFO_ELEMENT extCapInfo; extInfoLen = sizeof(EXT_CAP_INFO_ELEMENT); NdisZeroMemory(&extCapInfo, extInfoLen); #ifdef DOT11_N_SUPPORT #ifdef DOT11N_DRAFT3 // P802.11n_D1.10 // HT Information Exchange Support if ((pComCfg->PhyMode >= PHY_11ABGN_MIXED) && (pComCfg->Channel <= 14) && (pMbss->DesiredHtPhyInfo.bHtEnable) && (pComCfg->bBssCoexEnable == TRUE) ) { extCapInfo.BssCoexistMgmtSupport = 1; } #endif // DOT11N_DRAFT3 // #endif // DOT11_N_SUPPORT // pInfo = (PUCHAR)(&extCapInfo); for (infoPos = 0; infoPos < extInfoLen; infoPos++) { if (pInfo[infoPos] != 0) { bNeedAppendExtIE = TRUE; break; } } if (bNeedAppendExtIE == TRUE) { MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen, 1, &ExtCapIe, 1, &extInfoLen, extInfoLen, &extCapInfo, END_OF_ARGS); FrameLen += TmpLen; } } #endif // defined(DOT11N_DRAFT3) || defined(DOT11V_WNM_SUPPORT) // if ((pMbss->AuthMode == Ndis802_11AuthModeWPA) || (pMbss->AuthMode == Ndis802_11AuthModeWPAPSK)) RSNIe = IE_WPA; else if ((pMbss->AuthMode == Ndis802_11AuthModeWPA2) || (pMbss->AuthMode == Ndis802_11AuthModeWPA2PSK)) RSNIe = IE_WPA2; #ifdef WAPI_SUPPORT else if ((pMbss->AuthMode == Ndis802_11AuthModeWAICERT) || (pMbss->AuthMode == Ndis802_11AuthModeWAIPSK)) RSNIe = IE_WAPI; #endif // WAPI_SUPPORT // // Append RSN_IE when WPA OR WPAPSK, if ((pMbss->AuthMode == Ndis802_11AuthModeWPA1WPA2) || (pMbss->AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)) { ULONG TmpLen; MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen, 1, &RSNIe, 1, &pMbss->RSNIE_Len[0], pMbss->RSNIE_Len[0], pMbss->RSN_IE[0], 1, &RSNIe2, 1, &pMbss->RSNIE_Len[1], pMbss->RSNIE_Len[1], pMbss->RSN_IE[1], END_OF_ARGS); FrameLen += TmpLen; } else if (pMbss->AuthMode >= Ndis802_11AuthModeWPA) { ULONG TmpLen; MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen, 1, &RSNIe, 1, &pMbss->RSNIE_Len[0], pMbss->RSNIE_Len[0], pMbss->RSN_IE[0], END_OF_ARGS); FrameLen += TmpLen; } // add WMM IE here if (pMbss->bWmmCapable) { ULONG TmpLen; UCHAR i; UCHAR WmeParmIe[26] = {IE_VENDOR_SPECIFIC, 24, 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0, 0}; UINT8 AIFSN[4]; WmeParmIe[8] = pAd->ApCfg.BssEdcaParm.EdcaUpdateCount & 0x0f; #ifdef UAPSD_AP_SUPPORT UAPSD_MR_IE_FILL(WmeParmIe[8], pAd); #endif // UAPSD_AP_SUPPORT // NdisMoveMemory(AIFSN, pAd->ApCfg.BssEdcaParm.Aifsn, sizeof(AIFSN)); #ifdef WMM_ACM_SUPPORT ACM_TG_CMT_WMMAC_SUPPORT_SIGNALLING; ACMP_NullTspecSupportSignal(pAd, WmeParmIe); ACMP_NonAcmAdjustParamUpdate(pAd, AIFSN); #endif // WMM_ACM_SUPPORT // for (i=QID_AC_BE; i<=QID_AC_VO; i++) { WmeParmIe[10+ (i*4)] = (i << 5) + // b5-6 is ACI ((UCHAR)pAd->ApCfg.BssEdcaParm.bACM[i] << 4) + // b4 is ACM (AIFSN[i] & 0x0f); // b0-3 is AIFSN WmeParmIe[11+ (i*4)] = (pAd->ApCfg.BssEdcaParm.Cwmax[i] << 4) + // b5-8 is CWMAX (pAd->ApCfg.BssEdcaParm.Cwmin[i] & 0x0f); // b0-3 is CWMIN WmeParmIe[12+ (i*4)] = (UCHAR)(pAd->ApCfg.BssEdcaParm.Txop[i] & 0xff); // low byte of TXOP WmeParmIe[13+ (i*4)] = (UCHAR)(pAd->ApCfg.BssEdcaParm.Txop[i] >> 8); // high byte of TXOP } MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen, 26, WmeParmIe, END_OF_ARGS); FrameLen += TmpLen; }
int Load(const char *ExePath) { FILE *tmpFile; EXE_HEADER tmpHead; FILHDR coffHead; AOUTHDR optHead; SCNHDR section; int type, i; int retval = 0; u8 opcode; u32 section_address, section_size; strncpy(CdromId, "SLUS99999", 9); strncpy(CdromLabel, "SLUS_999.99", 11); tmpFile = fopen(ExePath, "rb"); if (tmpFile == NULL) { SysPrintf(_("Error opening file: %s.\n"), ExePath); retval = -1; } else { LoadLibPS(); type = PSXGetFileType(tmpFile); switch (type) { case PSX_EXE: fread(&tmpHead, sizeof(EXE_HEADER), 1, tmpFile); fseek(tmpFile, 0x800, SEEK_SET); fread(PSXM(SWAP32(tmpHead.t_addr)), SWAP32(tmpHead.t_size), 1, tmpFile); fclose(tmpFile); psxRegs.pc = SWAP32(tmpHead.pc0); psxRegs.GPR.n.gp = SWAP32(tmpHead.gp0); psxRegs.GPR.n.sp = SWAP32(tmpHead.s_addr); if (psxRegs.GPR.n.sp == 0) psxRegs.GPR.n.sp = 0x801fff00; retval = 0; break; case CPE_EXE: fseek(tmpFile, 6, SEEK_SET); /* Something tells me we should go to 4 and read the "08 00" here... */ do { fread(&opcode, 1, 1, tmpFile); switch (opcode) { case 1: /* Section loading */ fread(§ion_address, 4, 1, tmpFile); fread(§ion_size, 4, 1, tmpFile); section_address = SWAPu32(section_address); section_size = SWAPu32(section_size); #ifdef EMU_LOG EMU_LOG("Loading %08X bytes from %08X to %08X\n", section_size, ftell(tmpFile), section_address); #endif fread(PSXM(section_address), section_size, 1, tmpFile); break; case 3: /* register loading (PC only?) */ fseek(tmpFile, 2, SEEK_CUR); /* unknown field */ fread(&psxRegs.pc, 4, 1, tmpFile); psxRegs.pc = SWAPu32(psxRegs.pc); break; case 0: /* End of file */ break; default: SysPrintf(_("Unknown CPE opcode %02x at position %08x.\n"), opcode, ftell(tmpFile) - 1); retval = -1; break; } } while (opcode != 0 && retval == 0); break; case COFF_EXE: fread(&coffHead, sizeof(coffHead), 1, tmpFile); fread(&optHead, sizeof(optHead), 1, tmpFile); psxRegs.pc = SWAP32(optHead.entry); psxRegs.GPR.n.sp = 0x801fff00; for (i = 0; i < SWAP16(coffHead.f_nscns); i++) { fseek(tmpFile, sizeof(FILHDR) + SWAP16(coffHead.f_opthdr) + sizeof(section) * i, SEEK_SET); fread(§ion, sizeof(section), 1, tmpFile); if (section.s_scnptr != 0) { fseek(tmpFile, SWAP32(section.s_scnptr), SEEK_SET); fread(PSXM(SWAP32(section.s_paddr)), SWAP32(section.s_size), 1, tmpFile); } else { memset(PSXM(SWAP32(section.s_paddr)), 0, SWAP32(section.s_size)); } } break; case INVALID_EXE: SysPrintf(_("This file does not appear to be a valid PSX file.\n")); retval = -1; break; } } if (retval != 0) { CdromId[0] = '\0'; CdromLabel[0] = '\0'; } return retval; }
/* Defined in IEEE 802.11AC Appeared in Beacon, (Re)AssocResp, ProbResp frames */ INT build_vht_op_ie(RTMP_ADAPTER *pAd, UCHAR *buf) { VHT_OP_IE vht_op; UCHAR cent_ch; #ifdef RT_BIG_ENDIAN UINT16 tmp; #endif /* RT_BIG_ENDIAN */ NdisZeroMemory((UCHAR *)&vht_op, sizeof(VHT_OP_IE)); vht_op.vht_op_info.ch_width = (pAd->CommonCfg.vht_bw == VHT_BW_80 ? 1: 0); #ifdef CONFIG_AP_SUPPORT if (pAd->CommonCfg.Channel > 14 && (pAd->CommonCfg.bIEEE80211H == 1) && (pAd->Dot11_H.RDMode == RD_SWITCHING_MODE)) cent_ch = vht_cent_ch_freq(pAd, pAd->Dot11_H.org_ch); else #endif /* CONFIG_AP_SUPPORT */ cent_ch = vht_cent_ch_freq(pAd, pAd->CommonCfg.Channel); switch (vht_op.vht_op_info.ch_width) { case 0: vht_op.vht_op_info.center_freq_1 = 0; vht_op.vht_op_info.center_freq_2 = 0; break; case 1: case 2: vht_op.vht_op_info.center_freq_1 = cent_ch; vht_op.vht_op_info.center_freq_2 = 0; break; case 3: vht_op.vht_op_info.center_freq_1 = cent_ch; vht_op.vht_op_info.center_freq_2 = pAd->CommonCfg.vht_cent_ch2; break; } vht_op.basic_mcs_set.mcs_ss1 = VHT_MCS_CAP_NA; vht_op.basic_mcs_set.mcs_ss2 = VHT_MCS_CAP_NA; vht_op.basic_mcs_set.mcs_ss3 = VHT_MCS_CAP_NA; vht_op.basic_mcs_set.mcs_ss4 = VHT_MCS_CAP_NA; vht_op.basic_mcs_set.mcs_ss5 = VHT_MCS_CAP_NA; vht_op.basic_mcs_set.mcs_ss6 = VHT_MCS_CAP_NA; vht_op.basic_mcs_set.mcs_ss7 = VHT_MCS_CAP_NA; vht_op.basic_mcs_set.mcs_ss8 = VHT_MCS_CAP_NA; switch (pAd->CommonCfg.RxStream) { case 2: #ifdef MT76x2 if (IS_MT76x2(pAd)) { vht_op.basic_mcs_set.mcs_ss2 = (((pAd->CommonCfg.vht_bw == VHT_BW_2040) && (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_20)) ? VHT_MCS_CAP_8 : VHT_MCS_CAP_9); printk("2SS vht_op.basic_mcs_set.mcs_ss2: %d", vht_op.basic_mcs_set.mcs_ss2); } else #endif /* MT76x2 */ vht_op.basic_mcs_set.mcs_ss2 = VHT_MCS_CAP_7; case 1: #if defined(MT76x0) || defined(MT76x2) if (IS_MT76x0(pAd) || IS_MT76x2(pAd)) vht_op.basic_mcs_set.mcs_ss1 = (((pAd->CommonCfg.vht_bw == VHT_BW_2040) && (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_20)) ? VHT_MCS_CAP_8 : VHT_MCS_CAP_9); else #endif vht_op.basic_mcs_set.mcs_ss1 = VHT_MCS_CAP_7; break; } #ifdef RT_BIG_ENDIAN //SWAP16((UINT16)vht_op.basic_mcs_set); NdisCopyMemory(&tmp,&vht_op.basic_mcs_set, 2); tmp=SWAP16(tmp); NdisCopyMemory(&vht_op.basic_mcs_set,&tmp, 2); #endif /* RT_BIG_ENDIAN */ NdisMoveMemory((UCHAR *)buf, (UCHAR *)&vht_op, sizeof(VHT_OP_IE)); return sizeof(VHT_OP_IE); }
static int parse_settings (unsigned char *prop, long unsigned int bytes, struct xsettings *settings) { Lisp_Object byteorder = Fbyteorder (); int my_bo = XFASTINT (byteorder) == 'B' ? MSBFirst : LSBFirst; int that_bo = prop[0]; CARD32 n_settings; int bytes_parsed = 0; int settings_seen = 0; int i = 0; /* First 4 bytes is a serial number, skip that. */ if (bytes < 12) return BadLength; memcpy (&n_settings, prop+8, 4); if (my_bo != that_bo) n_settings = SWAP32 (n_settings); bytes_parsed = 12; memset (settings, 0, sizeof (*settings)); while (bytes_parsed+4 < bytes && settings_seen < 7 && i < n_settings) { int type = prop[bytes_parsed++]; CARD16 nlen; CARD32 vlen, ival = 0; char name[128]; /* The names we are looking for are not this long. */ char sval[128]; /* The values we are looking for are not this long. */ int want_this; int to_cpy; sval[0] = '\0'; ++i; ++bytes_parsed; /* Padding */ memcpy (&nlen, prop+bytes_parsed, 2); bytes_parsed += 2; if (my_bo != that_bo) nlen = SWAP16 (nlen); if (bytes_parsed+nlen > bytes) return BadLength; to_cpy = nlen > 127 ? 127 : nlen; memcpy (name, prop+bytes_parsed, to_cpy); name[to_cpy] = '\0'; bytes_parsed += nlen; bytes_parsed = PAD (bytes_parsed); bytes_parsed += 4; /* Skip serial for this value */ if (bytes_parsed > bytes) return BadLength; want_this = #ifdef HAVE_XFT (nlen > 6 && strncmp (name, "Xft/", 4) == 0) || strcmp (XSETTINGS_FONT_NAME, name) == 0 || #endif strcmp (XSETTINGS_TOOL_BAR_STYLE, name) == 0; switch (type) { case 0: /* Integer */ if (bytes_parsed+4 > bytes) return BadLength; if (want_this) { memcpy (&ival, prop+bytes_parsed, 4); if (my_bo != that_bo) ival = SWAP32 (ival); } bytes_parsed += 4; break; case 1: /* String */ if (bytes_parsed+4 > bytes) return BadLength; memcpy (&vlen, prop+bytes_parsed, 4); bytes_parsed += 4; if (my_bo != that_bo) vlen = SWAP32 (vlen); if (want_this) { to_cpy = vlen > 127 ? 127 : vlen; memcpy (sval, prop+bytes_parsed, to_cpy); sval[to_cpy] = '\0'; } bytes_parsed += vlen; bytes_parsed = PAD (bytes_parsed); break; case 2: /* RGB value */ /* No need to parse this */ if (bytes_parsed+8 > bytes) return BadLength; bytes_parsed += 8; /* 4 values (r, b, g, alpha), 2 bytes each. */ break; default: /* Parse Error */ return BadValue; } if (want_this) { ++settings_seen; if (strcmp (name, XSETTINGS_TOOL_BAR_STYLE) == 0) { settings->tb_style = xstrdup (sval); settings->seen |= SEEN_TB_STYLE; } #ifdef HAVE_XFT else if (strcmp (name, XSETTINGS_FONT_NAME) == 0) { settings->font = xstrdup (sval); settings->seen |= SEEN_FONT; } else if (strcmp (name, "Xft/Antialias") == 0) { settings->seen |= SEEN_AA; settings->aa = ival != 0; } else if (strcmp (name, "Xft/Hinting") == 0) { settings->seen |= SEEN_HINTING; settings->hinting = ival != 0; } # ifdef FC_HINT_STYLE else if (strcmp (name, "Xft/HintStyle") == 0) { settings->seen |= SEEN_HINTSTYLE; if (strcmp (sval, "hintnone") == 0) settings->hintstyle = FC_HINT_NONE; else if (strcmp (sval, "hintslight") == 0) settings->hintstyle = FC_HINT_SLIGHT; else if (strcmp (sval, "hintmedium") == 0) settings->hintstyle = FC_HINT_MEDIUM; else if (strcmp (sval, "hintfull") == 0) settings->hintstyle = FC_HINT_FULL; else settings->seen &= ~SEEN_HINTSTYLE; } # endif else if (strcmp (name, "Xft/RGBA") == 0) { settings->seen |= SEEN_RGBA; if (strcmp (sval, "none") == 0) settings->rgba = FC_RGBA_NONE; else if (strcmp (sval, "rgb") == 0) settings->rgba = FC_RGBA_RGB; else if (strcmp (sval, "bgr") == 0) settings->rgba = FC_RGBA_BGR; else if (strcmp (sval, "vrgb") == 0) settings->rgba = FC_RGBA_VRGB; else if (strcmp (sval, "vbgr") == 0) settings->rgba = FC_RGBA_VBGR; else settings->seen &= ~SEEN_RGBA; } else if (strcmp (name, "Xft/DPI") == 0) { settings->seen |= SEEN_DPI; settings->dpi = (double)ival/1024.0; } else if (strcmp (name, "Xft/lcdfilter") == 0) { settings->seen |= SEEN_LCDFILTER; if (strcmp (sval, "none") == 0) settings->lcdfilter = FC_LCD_NONE; else if (strcmp (sval, "lcddefault") == 0) settings->lcdfilter = FC_LCD_DEFAULT; else settings->seen &= ~SEEN_LCDFILTER; } #endif /* HAVE_XFT */ } } return settings_seen; }
int image_get_jpeg_date_xmp(const char * path, char ** date) { FILE *img; unsigned char buf[8]; char *data = NULL, *newdata; uint16_t offset; struct NameValueParserData xml; char * exif; int ret = 1; size_t nread; img = fopen(path, "r"); if( !img ) return(-1); nread = fread(&buf, 2, 1, img); if( (nread < 1) || (buf[0] != 0xFF) || (buf[1] != 0xD8) ) { fclose(img); return(-1); } memset(&buf, 0, sizeof(buf)); while( !feof(img) ) { while( nread > 0 && buf[0] != 0xFF && !feof(img) ) nread = fread(&buf, 1, 1, img); while( nread > 0 && buf[0] == 0xFF && !feof(img) ) nread = fread(&buf, 1, 1, img); if( feof(img) ) break; if( buf[0] == 0xE1 ) // APP1 marker { offset = 0; nread = fread(&buf, 2, 1, img); if( nread < 1 ) break; memcpy(&offset, buf, 2); offset = SWAP16(offset) - 2; if( offset < 30 ) { fseek(img, offset, SEEK_CUR); continue; } newdata = realloc(data, 30); if( !newdata ) break; data = newdata; nread = fread(data, 29, 1, img); if( nread < 1 ) break; offset -= 29; if( strcmp(data, "http://ns.adobe.com/xap/1.0/") != 0 ) { fseek(img, offset, SEEK_CUR); continue; } newdata = realloc(data, offset+1); if( !newdata ) break; data = newdata; nread = fread(data, offset, 1, img); if( nread < 1 ) break; ParseNameValue(data, offset, &xml, 0); exif = GetValueFromNameValueList(&xml, "DateTimeOriginal"); if( !exif ) { ClearNameValueList(&xml); break; } *date = realloc(*date, strlen(exif)+1); strcpy(*date, exif); ClearNameValueList(&xml); ret = 0; break; } else { offset = 0; nread = fread(&buf, 2, 1, img); if( nread < 1 ) break; memcpy(&offset, buf, 2); offset = SWAP16(offset) - 2; fseek(img, offset, SEEK_CUR); } } fclose(img); free(data); return ret; }
/* ========================================================================== Description: mlme assoc req handling procedure Parameters: Adapter - Adapter pointer Elem - MLME Queue Element Pre: the station has been authenticated and the following information is stored in the config -# SSID -# supported rates and their length Post : -# An association request frame is generated and sent to the air -# Association timer starts -# Association state -> ASSOC_WAIT_RSP ========================================================================== */ static VOID ApCliMlmeAssocReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { NDIS_STATUS NStatus; BOOLEAN Cancelled; UCHAR ApAddr[6]; HEADER_802_11 AssocHdr; UCHAR WmeIe[9] = {IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; USHORT ListenIntv; ULONG Timeout; USHORT CapabilityInfo; PUCHAR pOutBuffer = NULL; ULONG FrameLen = 0; ULONG tmp; UCHAR SsidIe = IE_SSID; UCHAR SupRateIe = IE_SUPP_RATES; UCHAR ExtRateIe = IE_EXT_SUPP_RATES; APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = NULL; PAPCLI_STRUCT pApCliEntry = NULL; #ifdef APCLI_WPA_SUPPLICANT_SUPPORT USHORT VarIesOffset = 0; #endif /* APCLI_WPA_SUPPLICANT_SUPPORT */ UCHAR RSNIe = IE_WPA; #ifdef MAC_REPEATER_SUPPORT UCHAR CliIdx = 0xFF; #endif /* MAC_REPEATER_SUPPORT */ if ((ifIndex >= MAX_APCLI_NUM) #ifdef MAC_REPEATER_SUPPORT && (ifIndex < 64) #endif /* MAC_REPEATER_SUPPORT */ ) return; #ifdef MAC_REPEATER_SUPPORT if (ifIndex >= 64) { CliIdx = ((ifIndex - 64) % 16); ifIndex = ((ifIndex - 64) / 16); pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].AssocCurrState; } else #endif /* MAC_REPEATER_SUPPORT */ pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; /* Block all authentication request durning WPA block period */ if (pApCliEntry->bBlockAssoc == TRUE) { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - Block Auth request durning WPA block period!\n")); *pCurrState = APCLI_ASSOC_IDLE; ApCliCtrlMsg.Status = MLME_STATE_MACHINE_REJECT; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } else if(MlmeAssocReqSanity(pAd, Elem->Msg, Elem->MsgLen, ApAddr, &CapabilityInfo, &Timeout, &ListenIntv)) { //RTMPCancelTimer(&pAd->ApCliMlmeAux.ApCliAssocTimer, &Cancelled); #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) RTMPCancelTimer(&pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].ApCliAssocTimer, &Cancelled); else #endif /* MAC_REPEATER_SUPPORT */ RTMPCancelTimer(&pApCliEntry->ApCliMlmeAux.ApCliAssocTimer, &Cancelled); /* allocate and send out AssocRsp frame */ NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); /*Get an unused nonpaged memory */ if (NStatus != NDIS_STATUS_SUCCESS) { DBGPRINT(RT_DEBUG_ERROR, ("APCLI_ASSOC - ApCliMlmeAssocReqAction() allocate memory failed \n")); *pCurrState = APCLI_ASSOC_IDLE; ApCliCtrlMsg.Status = MLME_FAIL_NO_RESOURCE; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); return; } #ifdef APCLI_WPA_SUPPLICANT_SUPPORT pApCliEntry->AssocInfo.Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); pApCliEntry->AssocInfo.AvailableRequestFixedIEs = NDIS_802_11_AI_REQFI_CAPABILITIES | NDIS_802_11_AI_REQFI_LISTENINTERVAL; pApCliEntry->AssocInfo.RequestFixedIEs.Capabilities = CapabilityInfo; pApCliEntry->AssocInfo.RequestFixedIEs.ListenInterval = ListenIntv; pApCliEntry->AssocInfo.OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); NdisZeroMemory(pApCliEntry->ReqVarIEs, MAX_VIE_LEN); /*First add SSID*/ VarIesOffset = 0; NdisMoveMemory(pApCliEntry->ReqVarIEs + VarIesOffset, &SsidIe, 1); VarIesOffset += 1; NdisMoveMemory(pApCliEntry->ReqVarIEs + VarIesOffset, &pAd->MlmeAux.SsidLen, 1); VarIesOffset += 1; NdisMoveMemory(pApCliEntry->ReqVarIEs + VarIesOffset, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen); VarIesOffset += pAd->MlmeAux.SsidLen; /*Second add Supported rates*/ NdisMoveMemory(pApCliEntry->ReqVarIEs + VarIesOffset, &SupRateIe, 1); VarIesOffset += 1; NdisMoveMemory(pApCliEntry->ReqVarIEs + VarIesOffset, &pAd->MlmeAux.SupRateLen, 1); VarIesOffset += 1; NdisMoveMemory(pApCliEntry->ReqVarIEs + VarIesOffset, pAd->MlmeAux.SupRate, pAd->MlmeAux.SupRateLen); VarIesOffset += pAd->MlmeAux.SupRateLen; #endif /* APCLI_WPA_SUPPLICANT_SUPPORT */ DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - Send ASSOC request...\n")); ApCliMgtMacHeaderInit(pAd, &AssocHdr, SUBTYPE_ASSOC_REQ, 0, ApAddr, ApAddr, ifIndex); #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) COPY_MAC_ADDR(AssocHdr.Addr2, pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].CurrentAddress); #endif /* MAC_REPEATER_SUPPORT */ /* Build basic frame first */ MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), &AssocHdr, 2, &CapabilityInfo, 2, &ListenIntv, 1, &SsidIe, 1, &pApCliEntry->ApCliMlmeAux.SsidLen, pApCliEntry->ApCliMlmeAux.SsidLen, pApCliEntry->ApCliMlmeAux.Ssid, 1, &SupRateIe, 1, &pApCliEntry->ApCliMlmeAux.SupRateLen, pApCliEntry->ApCliMlmeAux.SupRateLen, pApCliEntry->ApCliMlmeAux.SupRate, END_OF_ARGS); if(pApCliEntry->ApCliMlmeAux.ExtRateLen != 0) { MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 1, &ExtRateIe, 1, &pApCliEntry->ApCliMlmeAux.ExtRateLen, pApCliEntry->ApCliMlmeAux.ExtRateLen, pApCliEntry->ApCliMlmeAux.ExtRate, END_OF_ARGS); FrameLen += tmp; } #ifdef DOT11_N_SUPPORT /* HT */ if ((pApCliEntry->ApCliMlmeAux.HtCapabilityLen > 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) { ULONG TmpLen; HT_CAPABILITY_IE HtCapabilityTmp; NdisZeroMemory(&HtCapabilityTmp, sizeof(HT_CAPABILITY_IE)); NdisMoveMemory(&HtCapabilityTmp, &pApCliEntry->ApCliMlmeAux.HtCapability, pApCliEntry->ApCliMlmeAux.HtCapabilityLen); #ifdef DOT11N_SS3_SUPPORT HtCapabilityTmp.MCSSet[2] = (pApCliEntry->ApCliMlmeAux.HtCapability.MCSSet[2] & pApCliEntry->RxMcsSet[2]); #endif /* DOT11N_SS3_SUPPORT */ #ifdef RT_BIG_ENDIAN *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); #endif /* RT_BIG_ENDINA */ MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &HtCapIe, 1, &pApCliEntry->ApCliMlmeAux.HtCapabilityLen, pApCliEntry->ApCliMlmeAux.HtCapabilityLen, &HtCapabilityTmp, END_OF_ARGS); FrameLen += TmpLen; } #ifdef DOT11N_DRAFT3 #ifdef APCLI_CERT_SUPPORT if (pAd->bApCliCertTest == TRUE) { ULONG TmpLen; EXT_CAP_INFO_ELEMENT extCapInfo; UCHAR extInfoLen; extInfoLen = sizeof (EXT_CAP_INFO_ELEMENT); NdisZeroMemory(&extCapInfo, extInfoLen); if ((pAd->CommonCfg.bBssCoexEnable == TRUE) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (pAd->CommonCfg.Channel <= 14) ) { extCapInfo.BssCoexistMgmtSupport = 1; DBGPRINT(RT_DEBUG_TRACE, ("%s: BssCoexistMgmtSupport = 1\n", __FUNCTION__)); } MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &ExtCapIe, 1, &extInfoLen, extInfoLen, &extCapInfo, END_OF_ARGS); FrameLen += TmpLen; } #endif /* APCLI_CERT_SUPPORT */ #endif /* DOT11N_DRAFT3 */ #endif /* DOT11_N_SUPPORT */ #ifdef AGGREGATION_SUPPORT /* add Ralink proprietary IE to inform AP this STA is going to use AGGREGATION or PIGGY-BACK+AGGREGATION Case I: (Aggregation + Piggy-Back) 1. user enable aggregation, AND 2. Mac support piggy-back 3. AP annouces it's PIGGY-BACK+AGGREGATION-capable in BEACON Case II: (Aggregation) 1. user enable aggregation, AND 2. AP annouces it's AGGREGATION-capable in BEACON */ if (pAd->CommonCfg.bAggregationCapable) { #ifdef PIGGYBACK_SUPPORT if ((pAd->CommonCfg.bPiggyBackCapable) && ((pApCliEntry->ApCliMlmeAux.APRalinkIe & 0x00000003) == 3)) { ULONG TmpLen; UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x03, 0x00, 0x00, 0x00}; MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 9, RalinkIe, END_OF_ARGS); FrameLen += TmpLen; } else #endif /* PIGGYBACK_SUPPORT */ if (pApCliEntry->ApCliMlmeAux.APRalinkIe & 0x00000001) { ULONG TmpLen; UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x01, 0x00, 0x00, 0x00}; MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 9, RalinkIe, END_OF_ARGS); FrameLen += TmpLen; } } else { ULONG TmpLen; UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x06, 0x00, 0x00, 0x00}; MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 9, RalinkIe, END_OF_ARGS); FrameLen += TmpLen; } #endif /* AGGREGATION_SUPPORT */ if (pApCliEntry->ApCliMlmeAux.APEdcaParm.bValid) { if (pApCliEntry->UapsdInfo.bAPSDCapable && pApCliEntry->ApCliMlmeAux.APEdcaParm.bAPSDCapable) { QBSS_STA_INFO_PARM QosInfo; NdisZeroMemory(&QosInfo, sizeof(QBSS_STA_INFO_PARM)); QosInfo.UAPSD_AC_BE = pAd->CommonCfg.bAPSDAC_BE; QosInfo.UAPSD_AC_BK = pAd->CommonCfg.bAPSDAC_BK; QosInfo.UAPSD_AC_VI = pAd->CommonCfg.bAPSDAC_VI; QosInfo.UAPSD_AC_VO = pAd->CommonCfg.bAPSDAC_VO; QosInfo.MaxSPLength = pAd->CommonCfg.MaxSPLength; WmeIe[8] |= *(PUCHAR)&QosInfo; } else { /* The Parameter Set Count is set to бз0би in the association request frames */ /* WmeIe[8] |= (pAd->MlmeAux.APEdcaParm.EdcaUpdateCount & 0x0f); */ } MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 9, &WmeIe[0], END_OF_ARGS); FrameLen += tmp; } /* Append RSN_IE when WPAPSK OR WPA2PSK, */ if (((pApCliEntry->AuthMode == Ndis802_11AuthModeWPAPSK) || (pApCliEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)) #ifdef APCLI_WPA_SUPPLICANT_SUPPORT || (pApCliEntry->AuthMode >= Ndis802_11AuthModeWPA) #endif /* APCLI_WPA_SUPPLICANT_SUPPORT */ #ifdef WSC_AP_SUPPORT && ((pApCliEntry->WscControl.WscConfMode == WSC_DISABLE) || ((pApCliEntry->WscControl.WscConfMode != WSC_DISABLE) && !(pApCliEntry->WscControl.bWscTrigger))) #endif /* WSC_AP_SUPPORT */ ) { RSNIe = IE_WPA; if ((pApCliEntry->AuthMode == Ndis802_11AuthModeWPA2PSK) #ifdef APCLI_WPA_SUPPLICANT_SUPPORT ||(pApCliEntry->AuthMode == Ndis802_11AuthModeWPA2) #endif/*APCLI_WPA_SUPPLICANT_SUPPORT*/ ) RSNIe = IE_WPA2; #ifdef APCLI_WPA_SUPPLICANT_SUPPORT if (pApCliEntry->AuthMode == Ndis802_11AuthModeWPA2) { INT idx; BOOLEAN FoundPMK = FALSE; /* Search chched PMKID, append it if existed */ for (idx = 0; idx < PMKID_NO; idx++) { if (NdisEqualMemory(ApAddr, &pApCliEntry->SavedPMK[idx].BSSID, 6)) { FoundPMK = TRUE; break; } } /* When AuthMode is WPA2-Enterprise and AP reboot or STA lost AP, AP would not do PMK cache with STA after STA re-connect to AP again. In this case, driver doesn't need to send PMKID to AP and WpaSupplicant. */ if ((pApCliEntry->AuthMode == Ndis802_11AuthModeWPA2) && (NdisEqualMemory(pAd->MlmeAux.Bssid, pAd->CommonCfg.LastBssid, MAC_ADDR_LEN))) { FoundPMK = FALSE; } if (FoundPMK) { // Set PMK number *(PUSHORT) &pApCliEntry->RSN_IE[pApCliEntry->RSNIE_Len] = 1; NdisMoveMemory(&pApCliEntry->RSN_IE[pApCliEntry->RSNIE_Len + 2], &pApCliEntry->SavedPMK[idx].PMKID, 16); pApCliEntry->RSNIE_Len += 18; } } #ifdef SIOCSIWGENIE if ((pApCliEntry->WpaSupplicantUP & WPA_SUPPLICANT_ENABLE) && (pApCliEntry->bRSN_IE_FromWpaSupplicant == TRUE)) { ; } else #endif #endif /*APCLI_WPA_SUPPLICANT_SUPPORT*/ MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 1, &RSNIe, 1, &pApCliEntry->RSNIE_Len, pApCliEntry->RSNIE_Len, pApCliEntry->RSN_IE, END_OF_ARGS); FrameLen += tmp; } #ifdef APCLI_WPA_SUPPLICANT_SUPPORT #ifdef SIOCSIWGENIE if (((pApCliEntry->WpaSupplicantUP & 0x7F) != WPA_SUPPLICANT_ENABLE) || (pApCliEntry->bRSN_IE_FromWpaSupplicant == FALSE)) #endif { // Append Variable IE NdisMoveMemory(pApCliEntry->ReqVarIEs + VarIesOffset, &RSNIe, 1); VarIesOffset += 1; NdisMoveMemory(pApCliEntry->ReqVarIEs + VarIesOffset, &pApCliEntry->RSNIE_Len, 1); VarIesOffset += 1; NdisMoveMemory(pApCliEntry->ReqVarIEs + VarIesOffset, pApCliEntry->RSN_IE, pApCliEntry->RSNIE_Len); VarIesOffset += pAd->ApCfg.ApCliTab[ifIndex].RSNIE_Len; // Set Variable IEs Length pApCliEntry->ReqVarIELen = VarIesOffset; } #ifdef SIOCSIWGENIE if ((pApCliEntry->WpaSupplicantUP & WPA_SUPPLICANT_ENABLE) && (pApCliEntry->bRSN_IE_FromWpaSupplicant == TRUE)) { ULONG TmpWpaAssocIeLen = 0; MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpWpaAssocIeLen, pApCliEntry->WpaAssocIeLen, pApCliEntry->pWpaAssocIe, END_OF_ARGS); FrameLen += TmpWpaAssocIeLen; NdisMoveMemory(pApCliEntry->ReqVarIEs + VarIesOffset, pApCliEntry->pWpaAssocIe, pApCliEntry->WpaAssocIeLen); VarIesOffset += pApCliEntry->WpaAssocIeLen; // Set Variable IEs Length pApCliEntry->ReqVarIELen = VarIesOffset; } #endif #endif /* APCLI_WPA_SUPPLICANT_SUPPORT */ #ifdef WSC_AP_SUPPORT /* Add WSC IE if we are connecting to WSC AP */ if ((pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscConfMode != WSC_DISABLE) && (pAd->ApCfg.ApCliTab[ifIndex].WscControl.bWscTrigger)) { UCHAR *pWscBuf = NULL, WscIeLen = 0; ULONG WscTmpLen = 0; os_alloc_mem(pAd, (UCHAR **) & pWscBuf, 512); /* if( (pWscBuf = kmalloc(512, GFP_ATOMIC)) != NULL) */ if (pWscBuf != NULL) { NdisZeroMemory(pWscBuf, 512); WscBuildAssocReqIE(&pAd->ApCfg.ApCliTab[ifIndex].WscControl, pWscBuf, &WscIeLen); MakeOutgoingFrame(pOutBuffer + FrameLen, &WscTmpLen, WscIeLen, pWscBuf, END_OF_ARGS); FrameLen += WscTmpLen; /* kfree(pWscBuf); */ os_free_mem(NULL, pWscBuf); } else DBGPRINT(RT_DEBUG_WARN, ("%s:: WscBuf Allocate failed!\n", __FUNCTION__)); } #endif /* WSC_AP_SUPPORT */ MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); MlmeFreeMemory(pAd, pOutBuffer); #ifdef MAC_REPEATER_SUPPORT if (CliIdx != 0xFF) RTMPSetTimer(&pAd->ApCfg.ApCliTab[ifIndex].RepeaterCli[CliIdx].ApCliAssocTimer, Timeout); else #endif /* MAC_REPEATER_SUPPORT */ RTMPSetTimer(&pApCliEntry->ApCliMlmeAux.ApCliAssocTimer, Timeout); *pCurrState = APCLI_ASSOC_WAIT_RSP; } else { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - ApCliMlmeAssocReqAction() sanity check failed. BUG!!!!!! \n")); *pCurrState = APCLI_ASSOC_IDLE; ApCliCtrlMsg.Status = MLME_INVALID_FORMAT; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } return; }
/* * load bias frame from file */ int BiasData::file(char *file, int nr) { FitsIO* fits = NULL; double bzero, bitpix; // if not '-' (stdin) check that it is a file if (strcmp(file, "-") != 0) { struct stat buf; if (stat(file, &buf) != 0 || S_ISREG(buf.st_mode) == 0) { error("expected a file, but got: ", file); return 1; } } int on = biasinfo_.on; clear(nr); // read the FITS image fits = FitsIO::read(file, O_RDONLY | S_IRUSR); if (!fits || fits->status() != 0) return 1; biasinfo_.usingNetBO = 1; /* * ushort images are a special case since FitsIO writes them * as short image with BZERO=32768. For bias subtraction we need * the true type back. */ fits->get("BITPIX", bitpix); fits->get("BZERO", bzero); if (bitpix == 16 && bzero == 32768) { int width, height; // copy the fits object fits->get("NAXIS1", width); fits->get("NAXIS2", height); int length = width * height * 2; Mem data(length, 0), header; if (data.status() != 0) return 1; FitsIO* fits2 = new FitsIO(width, height, -16, 0.0, 1.0, header, data); if (!fits2 || fits2->status() != 0) return 1; fits2->usingNetBO(BIGENDIAN); memcpy((char *)data.ptr(), (char *)fits->data().ptr(), length); delete fits; // convert short's to ushort's (native byte order) int i = width * height; unsigned short *pus = (unsigned short *)data.ptr(), us; short *pss = (short *)data.ptr(), ss; if (BIGENDIAN) { // native byte order? while (i--) { us = *pus++; *pss++ = (short)(us - 32768); } } else { while (i--) { us = *pus++; *pss++ = SWAP16(us) - 32768; } } biasImages_[nr] = ImageData::makeImage(BIASNAME, fits2 , &biasinfo_, 0); // Remember the byte order (=native) for the image. biasinfo_.usingNetBO = BIGENDIAN; } else { biasImages_[nr] = ImageData::makeImage(BIASNAME, fits , &biasinfo_, 0); } if (! biasImages_[nr]) return 1; if (nr == idxBias_) { biasinfo_.on = on; select(nr); } strcpy(&files_[nr][0], file); return 0; }
VOID RIX_FillBuffer( LPBYTE stream, INT len ) /*++ Purpose: Fill the background music into the sound buffer. Called by the SDL sound callback function only (sound.c: SOUND_FillAudio). Parameters: [OUT] stream - pointer to the stream buffer. [IN] len - Length of the buffer. Return value: None. --*/ { INT i, l, oldlen, volume = SDL_MIX_MAXVOLUME / 2; UINT t = SDL_GetTicks(); #ifdef __SYMBIAN32__ volume = g_iVolume / 2; #endif oldlen = len; if (gpRixPlayer == NULL) { // // Not initialized // return; } // // fading in or fading out // if (gpRixPlayer->dwEndFadeTime > 0) { switch (gpRixPlayer->FadeType) { case RIXPLAYER::FADE_IN: if (t >= gpRixPlayer->dwEndFadeTime) { gpRixPlayer->dwEndFadeTime = 0; } else { volume = (INT)(volume * (t - gpRixPlayer->dwStartFadeTime) / (FLOAT)(gpRixPlayer->dwEndFadeTime - gpRixPlayer->dwStartFadeTime)); } break; case RIXPLAYER::FADE_OUT: if (gpRixPlayer->iCurrentMusic == -1) { // // There is no current playing music. Just start playing the next one. // gpRixPlayer->iCurrentMusic = gpRixPlayer->iNextMusic; gpRixPlayer->fLoop = gpRixPlayer->fNextLoop; gpRixPlayer->FadeType = RIXPLAYER::FADE_IN; gpRixPlayer->dwEndFadeTime = t + (gpRixPlayer->dwEndFadeTime - gpRixPlayer->dwStartFadeTime); gpRixPlayer->dwStartFadeTime = t; gpRixPlayer->rix->rewind(gpRixPlayer->iCurrentMusic); return; } else if (t >= gpRixPlayer->dwEndFadeTime) { if (gpRixPlayer->iNextMusic <= 0) { gpRixPlayer->iCurrentMusic = -1; gpRixPlayer->dwEndFadeTime = 0; } else { // // Fade to the next music // gpRixPlayer->iCurrentMusic = gpRixPlayer->iNextMusic; gpRixPlayer->fLoop = gpRixPlayer->fNextLoop; gpRixPlayer->FadeType = RIXPLAYER::FADE_IN; gpRixPlayer->dwEndFadeTime = t + (gpRixPlayer->dwEndFadeTime - gpRixPlayer->dwStartFadeTime); gpRixPlayer->dwStartFadeTime = t; gpRixPlayer->rix->rewind(gpRixPlayer->iCurrentMusic); } return; } volume = (INT)(volume * (1.0f - (t - gpRixPlayer->dwStartFadeTime) / (FLOAT)(gpRixPlayer->dwEndFadeTime - gpRixPlayer->dwStartFadeTime))); break; } } if (gpRixPlayer->iCurrentMusic <= 0) { // // No current playing music // return; } // // Fill the buffer with sound data // while (len > 0) { if (gpRixPlayer->pos == NULL || gpRixPlayer->pos - gpRixPlayer->buf >= (int)sizeof(gpRixPlayer->buf)) { gpRixPlayer->pos = gpRixPlayer->buf; if (!gpRixPlayer->rix->update()) { if (!gpRixPlayer->fLoop) { // // Not loop, simply terminate the music // gpRixPlayer->iCurrentMusic = -1; return; } gpRixPlayer->rix->rewind(gpRixPlayer->iCurrentMusic); if (!gpRixPlayer->rix->update()) { // // Something must be wrong // gpRixPlayer->iCurrentMusic = -1; return; } } gpRixPlayer->opl->update((short *)(gpRixPlayer->buf), PAL_SAMPLE_RATE / 70); } l = sizeof(gpRixPlayer->buf) - (gpRixPlayer->pos - gpRixPlayer->buf); if (len < l) { l = len; } // // Put audio data into buffer and adjust volume // WARNING: for signed 16-bit little-endian only // for (i = 0; i < (int)(l / sizeof(SHORT)); i++) { SHORT s = SWAP16((int)(*(SHORT *)(gpRixPlayer->pos)) * volume / SDL_MIX_MAXVOLUME); #if !USE_SURROUNDOPL for (int j = 0; j < PAL_CHANNELS; j++) #endif { *(SHORT *)(stream) = s; stream += sizeof(SHORT); } gpRixPlayer->pos += sizeof(SHORT); } len -= l; } stream -= oldlen; }
void HDMITest::loadFpgaFirmware(const uint8_t *bfr, ssize_t size) { #ifdef linux int i; uint16_t length; // Skip first three sections for (i=0; i<3; i++) { memcpy(&length, bfr, sizeof(length)); length = SWAP16(length); bfr += sizeof(length); size -= sizeof(length); bfr += length; size -= length; } if (*bfr != 'b') { QString *str = new QString(); str->sprintf("Unexpected key: wanted 'b', got '%c' (0x%02x)", *bfr, *bfr); emit testStateUpdated(TEST_ERROR, 0, str); return; } bfr++; size--; memcpy(&length, bfr, sizeof(length)); length = SWAP16(length); bfr += sizeof(length); size -= sizeof(length); char fpga_name[length+1]; bzero(fpga_name, sizeof(fpga_name)); memcpy(fpga_name, bfr, length); bfr += length; size -= length; if (*bfr != 'c') { QString *str = new QString(); str->sprintf("Unexpected key: wanted 'c', got '%c' (0x%02x)", *bfr, *bfr); emit testStateUpdated(TEST_ERROR, 0, str); return; } bfr++; size--; memcpy(&length, bfr, sizeof(length)); length = SWAP16(length); bfr += sizeof(length); size -= sizeof(length); char date_code[length+1]; bzero(date_code, sizeof(date_code)); memcpy(date_code, bfr, length); bfr += length; size -= length; if (*bfr != 'd') { QString *str = new QString(); str->sprintf("Unexpected key: wanted 'd', got '%c' (0x%02x)", *bfr, *bfr); emit testStateUpdated(TEST_ERROR, 0, str); return; } bfr++; size--; memcpy(&length, bfr, sizeof(length)); length = SWAP16(length); bfr += sizeof(length); size -= sizeof(length); char time_code[length+1]; bzero(time_code, sizeof(time_code)); memcpy(time_code, bfr, length); bfr += length; size -= length; if (*bfr != 'e') { QString *str = new QString(); str->sprintf("Unexpected key: wanted 'e', got '%c' (0x%02x)", *bfr, *bfr); emit testStateUpdated(TEST_ERROR, 0, str); return; } bfr++; size--; memcpy(&length, bfr, sizeof(length)); length = SWAP16(length); bfr += sizeof(length); size -= sizeof(length); int fd = open("/dev/fpga", O_RDWR); if (-1 == fd) { emit testStateUpdated(TEST_ERROR, 0, new QString("Unable to open /dev/fpga")); return; } if (ioctl(fd, FPGA_IOCRESET, NULL) < 0) { emit testStateUpdated(TEST_ERROR, 0, new QString("Unable to reset FPGA")); close(fd); return; } if (write(fd, bfr, size) != size) { emit testStateUpdated(TEST_ERROR, 0, new QString("Unable to write firmware")); close(fd); return; } close(fd); emit testStateUpdated(TEST_INFO, 0, new QString("HDMI FPGA firmware loaded")); #endif return; }
INT NfcBuildOOBDevPasswdTLV( IN PRTMP_ADAPTER pAd, IN PWSC_CTRL pWscCtrl, IN UCHAR HandoverType, OUT UCHAR *pbuf, OUT USHORT *pBufLen) { INT Status = NDIS_STATUS_SUCCESS; UCHAR *TB = NULL;; PUCHAR pData = NULL, pSrcData = NULL; USHORT PasswdID = 0, len; PWSC_REG_DATA pReg = (PWSC_REG_DATA) &pWscCtrl->RegData; INT Len = 0, templen = 0; INT DH_Len = 0, idx; UCHAR HashData[SHA256_DIGEST_SIZE]; INT nfc_dev_passwd_len=0; #ifdef WSC_V2_SUPPORT PWSC_TLV pWscTLV = &pWscCtrl->WscV2Info.ExtraTlv; #endif /* WSC_V2_SUPPORT */ os_alloc_mem(pAd, (UCHAR **)&pData, (NFC_WSC_TLV_SIZE*sizeof(UCHAR))); if (pData == NULL) { return NDIS_STATUS_RESOURCES; } os_alloc_mem(pAd, (UCHAR **)&TB, (128*sizeof(UCHAR))); if (pData == NULL) { os_free_mem(NULL, pData); return NDIS_STATUS_RESOURCES; } DH_Len = sizeof(pWscCtrl->RegData.Pke); /* Enrollee 192 random bytes for DH key generation */ for (idx = 0; idx < 192; idx++) pWscCtrl->RegData.EnrolleeRandom[idx] = RandomByte(pAd); NdisZeroMemory(pWscCtrl->RegData.Pke, sizeof(pWscCtrl->RegData.Pke)); RT_DH_PublicKey_Generate ( WPS_DH_G_VALUE, sizeof(WPS_DH_G_VALUE), WPS_DH_P_VALUE, sizeof(WPS_DH_P_VALUE), pWscCtrl->RegData.EnrolleeRandom, sizeof(pWscCtrl->RegData.EnrolleeRandom), pWscCtrl->RegData.Pke, (UINT *) &DH_Len); /* Need to prefix zero padding */ if((DH_Len != sizeof(pWscCtrl->RegData.Pke)) && (DH_Len < sizeof(pWscCtrl->RegData.Pke))) { UCHAR TempKey[192]; INT DiffCnt; DiffCnt = sizeof(pWscCtrl->RegData.Pke) - DH_Len; NdisFillMemory(&TempKey, DiffCnt, 0); NdisCopyMemory(&TempKey[DiffCnt], pWscCtrl->RegData.Pke, DH_Len); NdisCopyMemory(pWscCtrl->RegData.Pke, TempKey, sizeof(TempKey)); DH_Len += DiffCnt; MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: Do zero padding!\n", __FUNCTION__)); } /* For Handover case, We may as Registrar So keep the same public key for Registrar */ RTMPMoveMemory(pWscCtrl->RegData.Pkr, pWscCtrl->RegData.Pke, DH_Len); hex_dump("Pkr", pWscCtrl->RegData.Pkr, DH_Len); hex_dump("Pke", pWscCtrl->RegData.Pkr, DH_Len); RT_SHA256(&pWscCtrl->RegData.Pke[0], 192, &HashData[0]); RTMPMoveMemory(&pWscCtrl->NfcPasswdHash[0], &HashData[0], NFC_DEV_PASSWD_HASH_LEN); hex_dump("NfcBuildOOBDevPasswdTLV - Public Key HashData", &HashData[0], 20); if (HandoverType == TYPE_PASSWDHO_S || HandoverType == TYPE_PASSWDHO_R) { PasswdID = DEV_PASS_ID_NFC_HANDOVER; pWscCtrl->NfcPasswdID = cpu2be16(PasswdID); NdisZeroMemory(&pWscCtrl->NfcPasswd[0], 32); pWscCtrl->NfcPasswdLen = NFC_DEV_PASSWD_LEN; } else { PasswdID = (RandomByte(pAd) << 8) + RandomByte(pAd); if (PasswdID < 0x10) PasswdID = 0x10; pWscCtrl->NfcPasswdID = cpu2be16(PasswdID); NfcGenRandomPasswd(pAd, pWscCtrl); hex_dump("NfcBuildOOBDevPasswdTLV - NfcPasswd", &pWscCtrl->NfcPasswd[0], NFC_DEV_PASSWD_LEN); } pSrcData = pData; NdisZeroMemory(pData, NFC_WSC_TLV_SIZE); NdisZeroMemory(&TB[0], 128); if (HandoverType == TYPE_PASSWDHO_R || HandoverType == TYPE_PASSWDHO_S) { /* Reserv for "Length of WSC attribute" */ pData += 2; } hex_dump("NfcBuildOOBDevPasswdTLV - 1 pSrcData", pSrcData, Len); NdisMoveMemory(&TB[0], &HashData[0], NFC_DEV_PASSWD_HASH_LEN); NdisMoveMemory(&TB[20], &pWscCtrl->NfcPasswdID, sizeof(pWscCtrl->NfcPasswdID)); if (HandoverType == TYPE_PASSWORD) { /* New SPEC Handover remove this part. */ NdisMoveMemory(&TB[22], &pWscCtrl->NfcPasswd[0], NFC_DEV_PASSWD_LEN); nfc_dev_passwd_len = NFC_DEV_PASSWD_LEN; } templen = AppendWSCTLV(WSC_ID_OOB_DEV_PWD, pData, &TB[0], NFC_DEV_PASSWD_HASH_LEN+sizeof(PasswdID)+nfc_dev_passwd_len); pData += templen; Len += templen; hex_dump("NfcBuildOOBDevPasswdTLV - 2 pSrcData", pSrcData, Len); if (HandoverType == TYPE_PASSWDHO_S) /* Build for Handover Select Message */ { templen = AppendWSCTLV(WSC_ID_SSID, pData, pAd->ApCfg.MBSSID[0].Ssid, pAd->ApCfg.MBSSID[0].SsidLen); pData += templen; Len += templen; /* Optional items. RF_Band, AP_Channel and MAC_Address */ UCHAR RF_Band; if (pAd->CommonCfg.Channel > 14) RF_Band = 0x02; /* 5.0GHz */ else RF_Band = 0x01; /* 2.4GHz */ templen = AppendWSCTLV(WSC_ID_RF_BAND, pData, &RF_Band, 0); pData += templen; Len += templen; USHORT Channel = 0; Channel = pAd->CommonCfg.Channel; #ifdef RT_BIG_ENDIAN Channel = SWAP16(Channel); #endif /* RT_BIG_ENDIAN */ templen = AppendWSCTLV(WSC_ID_AP_CHANNEL, pData, (UINT8 *)&Channel, 0); pData += templen; Len += templen; templen = AppendWSCTLV(WSC_ID_MAC_ADDR, pData, pAd->CommonCfg.Bssid, 0); pData += templen; Len += templen; } else if (HandoverType == TYPE_PASSWDHO_R) /* Build for Handover Request Message */ { templen = AppendWSCTLV(WSC_ID_UUID_E, pData, &pWscCtrl->Wsc_Uuid_E[0], 0); pData += templen; Len += templen; } #ifdef WSC_V2_SUPPORT if (pWscCtrl->WscV2Info.bEnableWpsV2) { /* Version2 */ WscGenV2Msg(pWscCtrl, FALSE, NULL, 0, &pData, &Len); /* Extra attribute that is not defined in WSC Sepc. */ if (pWscTLV->pTlvData && pWscTLV->TlvLen) { templen = AppendWSCTLV(pWscTLV->TlvTag, pData, (UINT8 *)pWscTLV->pTlvData, pWscTLV->TlvLen); pData += templen; Len += templen; } } #endif // WSC_V2_SUPPORT // if (HandoverType == TYPE_PASSWDHO_R || HandoverType == TYPE_PASSWDHO_S) { /*Assign for "Length of WSC attribute" */ len = cpu2be16(Len); memcpy(pSrcData, &len, 2); hex_dump("NfcBuildOOBDevPasswdTLV - pSrcData", pSrcData, Len+2); } else hex_dump("NfcBuildOOBDevPasswdTLV - pSrcData", pSrcData, Len); if (pbuf && (Len < NFC_WSC_TLV_SIZE)) { if (HandoverType == TYPE_PASSWDHO_R || HandoverType == TYPE_PASSWDHO_S) { NdisMoveMemory(pbuf, pSrcData, Len+2); *pBufLen = (USHORT)Len+2; } else { NdisMoveMemory(pbuf, pSrcData, Len); *pBufLen = (USHORT)Len; } hex_dump("NfcBuildOOBDevPasswdTLV", pbuf, *pBufLen); } else { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s: (Len=%d)\n", __FUNCTION__, Len)); Status = NDIS_STATUS_RESOURCES; } os_free_mem(NULL, pSrcData); os_free_mem(NULL, TB); return Status; }
void CALLBACK NULL_SPUwriteRegister(unsigned long reg, unsigned short val) { unsigned long r=reg&0xfff; regArea[(r-0xc00)>>1] = val; if(r>=0x0c00 && r<0x0d80) { //int ch=(r>>4)-0xc0; switch(r&0x0f) { //------------------------------------------------// l volume case 0: //SetVolumeL(ch,val); return; //------------------------------------------------// r volume case 2: //SetVolumeR(ch,val); return; //------------------------------------------------// pitch case 4: //SetPitch(ch,val); return; //------------------------------------------------// start case 6: //s_chan[ch].pStart=spuMemC+((unsigned long) val<<3); return; //------------------------------------------------// adsr level case 8: return; //------------------------------------------------// adsr rate case 10: return; //------------------------------------------------// adsr volume case 12: return; //------------------------------------------------// loop adr case 14: return; //------------------------------------------------// } return; } switch(r) { //-------------------------------------------------// case H_SPUaddr: spuAddr = (unsigned long) val<<3; return; //-------------------------------------------------// case H_SPUdata: spuMem[spuAddr>>1] = SWAP16(val); spuAddr+=2; if(spuAddr>0x7ffff) spuAddr=0; return; //-------------------------------------------------// case H_SPUctrl: spuCtrl=val; return; //-------------------------------------------------// case H_SPUstat: spuStat=val & 0xf800; return; //-------------------------------------------------// case H_SPUirqAddr: spuIrq = val; pSpuIrq=spuMemC+((unsigned long) val<<3); return; //-------------------------------------------------// case H_SPUon1: //SoundOn(0,16,val); return; //-------------------------------------------------// case H_SPUon2: //SoundOn(16,24,val); return; //-------------------------------------------------// case H_SPUoff1: //SoundOff(0,16,val); return; //-------------------------------------------------// case H_SPUoff2: //SoundOff(16,24,val); return; //-------------------------------------------------// case H_CDLeft: if(cddavCallback) cddavCallback(0,val); return; case H_CDRight: if(cddavCallback) cddavCallback(1,val); return; //-------------------------------------------------// case H_FMod1: //FModOn(0,16,val); return; //-------------------------------------------------// case H_FMod2: //FModOn(16,24,val); return; //-------------------------------------------------// case H_Noise1: //NoiseOn(0,16,val); return; //-------------------------------------------------// case H_Noise2: //NoiseOn(16,24,val); return; //-------------------------------------------------// case H_RVBon1: //ReverbOn(0,16,val); return; //-------------------------------------------------// case H_RVBon2: //ReverbOn(16,24,val); return; //-------------------------------------------------// case H_Reverb: return; } }
short CPacket::ReadShort() { short Data = *(short *)(m_Data + m_ReadPosition); m_ReadPosition += 2; return SWAP16(Data); }
static void dump_erase_units(void) { int i, j; unsigned long ofs; for (i = MedHead[0].FirstPhysicalEUN; i < MedHead[0].FirstPhysicalEUN + MedHead[0].NumEraseUnits; i++) { /* For each Erase Unit */ ofs = i * meminfo.erasesize; /* read the Unit Control Information */ for (j = 0; j < 3; j++) { oob.start = ofs + (j * 512); if (ioctl(fd, MEMREADOOB, &oob)) printf("MEMREADOOB at %lx: %s\n", (unsigned long) oob.start, strerror(errno)); memcpy(&UCItable[i][j], &oobbuf.u, 8); } if (UCItable[i][1].b.EraseMark != cpu_to_le16(0x3c69)) { printf("EraseMark not present in unit %d: %x\n", i, UCItable[i][1].b.EraseMark); } else { /* a properly formatted unit */ SWAP16(UCItable[i][0].a.VirtUnitNum); SWAP16(UCItable[i][0].a.ReplUnitNum); SWAP16(UCItable[i][0].a.SpareVirtUnitNum); SWAP16(UCItable[i][0].a.SpareReplUnitNum); SWAP32(UCItable[i][1].b.WearInfo); SWAP16(UCItable[i][1].b.EraseMark); SWAP16(UCItable[i][1].b.EraseMark1); SWAP16(UCItable[i][2].c.FoldMark); SWAP16(UCItable[i][2].c.FoldMark1); if (!(UCItable[i][0].a.VirtUnitNum & 0x8000)) { /* If this is the first in a chain, store the EUN in the VUC table */ if (VUCtable[UCItable[i][0].a.VirtUnitNum & 0x7fff]) { printf("Duplicate start of chain for VUC %d: " "Unit %d replaces Unit %d\n", UCItable[i][0].a.VirtUnitNum & 0x7fff, i, VUCtable[UCItable[i][0].a.VirtUnitNum & 0x7fff]); } VUCtable[UCItable[i][0].a.VirtUnitNum & 0x7fff] = i; } } switch (BadUnitTable[i]) { case ZONE_BAD_ORIGINAL: printf("Unit %d is marked as ZONE_BAD_ORIGINAL\n", i); continue; case ZONE_BAD_MARKED: printf("Unit %d is marked as ZONE_BAD_MARKED\n", i); continue; } /* ZONE_GOOD */ if (UCItable[i][0].a.VirtUnitNum == 0xffff) printf("Unit %d is free\n", i); else printf("Unit %d is in chain %d and %s a replacement\n", i, UCItable[i][0].a.VirtUnitNum & 0x7fff, UCItable[i][0].a.VirtUnitNum & 0x8000 ? "is" : "is not"); } }
int main(int argc, char* argv[]){ u32 romsize; char* rom_path = argv[1]; char* output_directory = argv[2]; char* rom = loadfile(rom_path, &romsize); LevelEntry* entries = &rom[0x122390]; M64Entry* m64entries = &rom[0xBC5F64]; u16 m64count = getU16BE(rom, 0xBC5F62); char output_filename_f3d[60]; char output_filename_mesh[60]; char output_filename_unk[60]; char output_filename_pdlist[60]; mkdir(output_directory, 0700); // dump data referenced by course table: for(int i = 0; i < 20; i++){ void* mio0_block_f3d = &rom[SWAP32(entries[i].mio0_f3d_start)]; void* mio0_block_mesh = &rom[SWAP32(entries[i].mio0_mesh_start)]; void* block_unk = &rom[SWAP32(entries[i].unk_start)]; u32 pdlist_addr = SWAP32(entries[i].mio0_mesh_start) + (SWAP32(entries[i].unk3) & 0x00FFFFFF); void* pdlist = &rom[pdlist_addr]; u32 decoded_f3d_size; u32 decoded_mesh_size; u32 raw_unk_size = SWAP32(entries[i].unk_end) - SWAP32(entries[i].unk_start); u32 pdlist_size = SWAP32(entries[i].mio0_mesh_end) - pdlist_addr; void* decoded_f3d = mio0decode(mio0_block_f3d, &decoded_f3d_size); void* decoded_mesh = mio0decode(mio0_block_mesh, &decoded_mesh_size); sprintf(output_filename_f3d, "%s\\%02d_%s_SEG06.bin\0", output_directory, i, levelnames[i]); sprintf(output_filename_mesh, "%s\\%02d_%s_SEG04.bin\0", output_directory, i, levelnames[i]); sprintf(output_filename_unk, "%s\\%02d_%s_REFS.bin\0", output_directory, i, levelnames[i]); sprintf(output_filename_pdlist, "%s\\%02d_%s_SEG07.bin\0", output_directory, i, levelnames[i]); writefile(output_filename_f3d, decoded_f3d, decoded_f3d_size); writefile(output_filename_mesh, decoded_mesh, decoded_mesh_size); writefile(output_filename_unk, block_unk, raw_unk_size); writefile(output_filename_pdlist, pdlist, pdlist_size); printf( "%02d %-16s\n F3D %08X : %08X (mio0)\n MESH %08X : %08X (mio0)\n REFS %08X : %08X\n 1 %08X\n 2 %08X\n 3 %08X\n 4 %08X\n 5 %08X\n 6 %04X\n\n", i, levelnames[i], SWAP32(entries[i].mio0_f3d_start), SWAP32(entries[i].mio0_f3d_end), SWAP32(entries[i].mio0_mesh_start), SWAP32(entries[i].mio0_mesh_end), SWAP32(entries[i].unk_start), SWAP32(entries[i].unk_end), SWAP32(entries[i].unk1), SWAP32(entries[i].unk2), SWAP32(entries[i].unk3), SWAP32(entries[i].unk4), SWAP32(entries[i].unk5), SWAP16(entries[i].unk6) ); free(decoded_f3d); free(decoded_mesh); } // dump m64 data: char output_filename[60]; for(int i = 0; i < m64count; i++){ sprintf(output_filename, "%s\\TUNE%02d.m64", output_directory, i); printf("%s\n", output_filename, SWAP32(m64entries[i].offset)); writefile(output_filename, &rom[0xBC5F60] + SWAP32(m64entries[i].offset), SWAP32(m64entries[i].size)); } // full mio0 dump: printf("Full MIO0 dump...\n"); sprintf(output_filename, "%s\\mio0", output_directory); mkdir(output_filename); u32 MIO0_MAGIC_LE = 0x304F494D; // 4D494F30 for(u32 i = 0; i < romsize; i += 4){ if(*(u32*)(rom + i) == MIO0_MAGIC_LE){ sprintf(output_filename, "%s\\mio0\\%08X.bin", output_directory, i); u32 decoded_size; void* decoded_data = mio0decode(rom + i, &decoded_size); writefile(output_filename, decoded_data, decoded_size); free(decoded_data); } } }
/* ========================================================================== Description: Process the received ProbeRequest from clients Parameters: Elem - msg containing the ProbeReq frame ========================================================================== */ VOID APPeerProbeReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PEER_PROBE_REQ_PARAM ProbeReqParam; HEADER_802_11 ProbeRspHdr; NDIS_STATUS NStatus; PUCHAR pOutBuffer = NULL; ULONG FrameLen = 0, TmpLen; LARGE_INTEGER FakeTimestamp; UCHAR DsLen = 1; UCHAR ErpIeLen = 1; UCHAR apidx = 0, PhyMode, SupRateLen; UCHAR RSNIe=IE_WPA, RSNIe2=IE_WPA2; MULTISSID_STRUCT *mbss; struct wifi_dev *wdev; CHAR rssi = 0, idx = 0; if (! PeerProbeReqSanity(pAd, Elem->Msg, Elem->MsgLen, &ProbeReqParam)) return; for(apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++) { mbss = &pAd->ApCfg.MBSSID[apidx]; wdev = &mbss->wdev; RSNIe = IE_WPA; if ((wdev->if_dev == NULL) || ((wdev->if_dev != NULL) && !(RTMP_OS_NETDEV_STATE_RUNNING(wdev->if_dev)))) { /* the interface is down, so we can not send probe response */ continue; } PhyMode = wdev->PhyMode; if ( ((((ProbeReqParam.SsidLen == 0) && (!mbss->bHideSsid)) || ((ProbeReqParam.SsidLen == mbss->SsidLen) && NdisEqualMemory(ProbeReqParam.Ssid, mbss->Ssid, (ULONG) ProbeReqParam.SsidLen))) ) ) ; else continue; /* check next BSS */ rssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, (CHAR)Elem->Rssi0, RSSI_0), ConvertToRssi(pAd, (CHAR)Elem->Rssi1, RSSI_1), ConvertToRssi(pAd, (CHAR)Elem->Rssi2, RSSI_2)); if ((mbss->ProbeRspRssiThreshold != 0) && (rssi < mbss->ProbeRspRssiThreshold)) { DBGPRINT(RT_DEBUG_INFO, ("%s: PROBE_RSP Threshold = %d , PROBE RSSI = %d\n", wdev->if_dev->name, mbss->ProbeRspRssiThreshold, rssi)); continue; } /* allocate and send out ProbeRsp frame */ NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); if (NStatus != NDIS_STATUS_SUCCESS) return; MgtMacHeaderInit(pAd, &ProbeRspHdr, SUBTYPE_PROBE_RSP, 0, ProbeReqParam.Addr2, wdev->if_addr, wdev->bssid); if ((wdev->AuthMode == Ndis802_11AuthModeWPA) || (wdev->AuthMode == Ndis802_11AuthModeWPAPSK)) RSNIe = IE_WPA; else if ((wdev->AuthMode == Ndis802_11AuthModeWPA2) ||(wdev->AuthMode == Ndis802_11AuthModeWPA2PSK)) RSNIe = IE_WPA2; { SupRateLen = pAd->CommonCfg.SupRateLen; if (PhyMode == WMODE_B) SupRateLen = 4; MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), &ProbeRspHdr, TIMESTAMP_LEN, &FakeTimestamp, 2, &pAd->CommonCfg.BeaconPeriod, 2, &mbss->CapabilityInfo, 1, &SsidIe, 1, &mbss->SsidLen, mbss->SsidLen, mbss->Ssid, 1, &SupRateIe, 1, &SupRateLen, SupRateLen, pAd->CommonCfg.SupRate, 1, &DsIe, 1, &DsLen, 1, &pAd->CommonCfg.Channel, END_OF_ARGS); } if ((pAd->CommonCfg.ExtRateLen) && (PhyMode != WMODE_B)) { MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &ErpIe, 1, &ErpIeLen, 1, &pAd->ApCfg.ErpIeContent, 1, &ExtRateIe, 1, &pAd->CommonCfg.ExtRateLen, pAd->CommonCfg.ExtRateLen, pAd->CommonCfg.ExtRate, END_OF_ARGS); FrameLen += TmpLen; } #ifdef A_BAND_SUPPORT /* add Channel switch announcement IE */ if ((pAd->CommonCfg.Channel > 14) && (pAd->CommonCfg.bIEEE80211H == 1) && (pAd->Dot11_H.RDMode == RD_SWITCHING_MODE)) { UCHAR CSAIe=IE_CHANNEL_SWITCH_ANNOUNCEMENT; UCHAR CSALen=3; UCHAR CSAMode=1; MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &CSAIe, 1, &CSALen, 1, &CSAMode, 1, &pAd->CommonCfg.Channel, 1, &pAd->Dot11_H.CSCount, END_OF_ARGS); FrameLen += TmpLen; } #endif /* A_BAND_SUPPORT */ #ifdef DOT11_N_SUPPORT if (WMODE_CAP_N(PhyMode) && (wdev->DesiredHtPhyInfo.bHtEnable)) { ULONG TmpLen; UCHAR HtLen, AddHtLen, NewExtLen; #ifdef RT_BIG_ENDIAN HT_CAPABILITY_IE HtCapabilityTmp; ADD_HT_INFO_IE addHTInfoTmp; #endif /* YF@20120419: Fix IOT Issue with Atheros STA on Windows 7 When IEEE80211H flag turn on. */ HtLen = sizeof(pAd->CommonCfg.HtCapability); AddHtLen = sizeof(pAd->CommonCfg.AddHTInfo); NewExtLen = 1; /*New extension channel offset IE is included in Beacon, Probe Rsp or channel Switch Announcement Frame */ #ifndef RT_BIG_ENDIAN MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &HtCapIe, 1, &HtLen, sizeof(HT_CAPABILITY_IE), &pAd->CommonCfg.HtCapability, 1, &AddHtInfoIe, 1, &AddHtLen, sizeof(ADD_HT_INFO_IE), &pAd->CommonCfg.AddHTInfo, END_OF_ARGS); #else NdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, HtLen); *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); #ifdef UNALIGNMENT_SUPPORT { EXT_HT_CAP_INFO extHtCapInfo; NdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO)); *(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo)); NdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO)); } #else *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = cpu2le16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); #endif /* UNALIGNMENT_SUPPORT */ NdisMoveMemory(&addHTInfoTmp, &pAd->CommonCfg.AddHTInfo, AddHtLen); *(USHORT *)(&addHTInfoTmp.AddHtInfo2) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2)); *(USHORT *)(&addHTInfoTmp.AddHtInfo3) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3)); MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &HtCapIe, 1, &HtLen, HtLen, &HtCapabilityTmp, 1, &AddHtInfoIe, 1, &AddHtLen, AddHtLen, &addHTInfoTmp, END_OF_ARGS); #endif FrameLen += TmpLen; } #endif /* DOT11_N_SUPPORT */ /* Append RSN_IE when WPA OR WPAPSK, */ if (wdev->AuthMode < Ndis802_11AuthModeWPA) ; /* enough information */ else if ((wdev->AuthMode == Ndis802_11AuthModeWPA1WPA2) || (wdev->AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)) { MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &RSNIe, 1, &mbss->RSNIE_Len[0], mbss->RSNIE_Len[0], mbss->RSN_IE[0], 1, &RSNIe2, 1, &mbss->RSNIE_Len[1], mbss->RSNIE_Len[1], mbss->RSN_IE[1], END_OF_ARGS); FrameLen += TmpLen; } else { MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &RSNIe, 1, &mbss->RSNIE_Len[0], mbss->RSNIE_Len[0], mbss->RSN_IE[0], END_OF_ARGS); FrameLen += TmpLen; } /* Extended Capabilities IE */ { ULONG TmpLen; EXT_CAP_INFO_ELEMENT extCapInfo; UCHAR extInfoLen = sizeof(EXT_CAP_INFO_ELEMENT); NdisZeroMemory(&extCapInfo, extInfoLen); #ifdef DOT11_N_SUPPORT #ifdef DOT11N_DRAFT3 /* P802.11n_D1.10, HT Information Exchange Support */ if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (pAd->CommonCfg.Channel <= 14) && (pAd->ApCfg.MBSSID[apidx].wdev.DesiredHtPhyInfo.bHtEnable) && (pAd->CommonCfg.bBssCoexEnable == TRUE)) { extCapInfo.BssCoexistMgmtSupport = 1; } #endif /* DOT11N_DRAFT3 */ #endif /* DOT11_N_SUPPORT */ MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &ExtCapIe, 1, &extInfoLen, extInfoLen, &extCapInfo, END_OF_ARGS); FrameLen += TmpLen; } #ifdef AP_QLOAD_SUPPORT if (pAd->phy_ctrl.FlgQloadEnable != 0) { FrameLen += QBSS_LoadElementAppend(pAd, pOutBuffer+FrameLen); } #endif /* AP_QLOAD_SUPPORT */ /* add WMM IE here */ if (mbss->wdev.bWmmCapable) { UCHAR i; UCHAR WmeParmIe[26] = {IE_VENDOR_SPECIFIC, 24, 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01, 0, 0}; WmeParmIe[8] = pAd->ApCfg.BssEdcaParm.EdcaUpdateCount & 0x0f; #ifdef UAPSD_SUPPORT UAPSD_MR_IE_FILL(WmeParmIe[8], &mbss->UapsdInfo); #endif /* UAPSD_SUPPORT */ for (i=QID_AC_BE; i<=QID_AC_VO; i++) { WmeParmIe[10+ (i*4)] = (i << 5) + /* b5-6 is ACI */ ((UCHAR)pAd->ApCfg.BssEdcaParm.bACM[i] << 4) + /* b4 is ACM */ (pAd->ApCfg.BssEdcaParm.Aifsn[i] & 0x0f); /* b0-3 is AIFSN */ WmeParmIe[11+ (i*4)] = (pAd->ApCfg.BssEdcaParm.Cwmax[i] << 4) + /* b5-8 is CWMAX */ (pAd->ApCfg.BssEdcaParm.Cwmin[i] & 0x0f); /* b0-3 is CWMIN */ WmeParmIe[12+ (i*4)] = (UCHAR)(pAd->ApCfg.BssEdcaParm.Txop[i] & 0xff); /* low byte of TXOP */ WmeParmIe[13+ (i*4)] = (UCHAR)(pAd->ApCfg.BssEdcaParm.Txop[i] >> 8); /* high byte of TXOP */ } MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 26, WmeParmIe, END_OF_ARGS); FrameLen += TmpLen; } /* add country IE, power constraint IE */ if (pAd->CommonCfg.bCountryFlag) { ULONG TmpLen, TmpLen2=0; UCHAR *TmpFrame = NULL; os_alloc_mem(NULL, (UCHAR **)&TmpFrame, 256); if (TmpFrame != NULL) { NdisZeroMemory(TmpFrame, 256); /* prepare channel information */ #ifdef EXT_BUILD_CHANNEL_LIST BuildBeaconChList(pAd, TmpFrame, &TmpLen2); #else { UCHAR MaxTxPower = GetCuntryMaxTxPwr(pAd, pAd->CommonCfg.Channel); MakeOutgoingFrame(TmpFrame+TmpLen2, &TmpLen, 1, &pAd->ChannelList[0].Channel, 1, &pAd->ChannelListNum, 1, &MaxTxPower, END_OF_ARGS); TmpLen2 += TmpLen; } #endif /* EXT_BUILD_CHANNEL_LIST */ os_free_mem(NULL, TmpFrame); } else DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__)); } #ifdef DOT11_N_SUPPORT #ifdef DOT11N_DRAFT3 /* P802.11n_D3.03, 7.3.2.60 Overlapping BSS Scan Parameters IE */ if (WMODE_CAP_N(PhyMode) && (pAd->CommonCfg.Channel <= 14) && (wdev->DesiredHtPhyInfo.bHtEnable) && (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == 1)) { OVERLAP_BSS_SCAN_IE OverlapScanParam; ULONG TmpLen; UCHAR OverlapScanIE, ScanIELen; OverlapScanIE = IE_OVERLAPBSS_SCAN_PARM; ScanIELen = 14; OverlapScanParam.ScanPassiveDwell = cpu2le16(pAd->CommonCfg.Dot11OBssScanPassiveDwell); OverlapScanParam.ScanActiveDwell = cpu2le16(pAd->CommonCfg.Dot11OBssScanActiveDwell); OverlapScanParam.TriggerScanInt = cpu2le16(pAd->CommonCfg.Dot11BssWidthTriggerScanInt); OverlapScanParam.PassiveTalPerChannel = cpu2le16(pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel); OverlapScanParam.ActiveTalPerChannel = cpu2le16(pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel); OverlapScanParam.DelayFactor = cpu2le16(pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor); OverlapScanParam.ScanActThre = cpu2le16(pAd->CommonCfg.Dot11OBssScanActivityThre); MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &OverlapScanIE, 1, &ScanIELen, ScanIELen, &OverlapScanParam, END_OF_ARGS); FrameLen += TmpLen; } /* 7.3.2.27 Extended Capabilities IE */ { ULONG TmpLen; EXT_CAP_INFO_ELEMENT extCapInfo; UCHAR extInfoLen; extInfoLen = sizeof(EXT_CAP_INFO_ELEMENT); NdisZeroMemory(&extCapInfo, extInfoLen); /* P802.11n_D1.10, HT Information Exchange Support */ if (WMODE_CAP_N(PhyMode) && (pAd->CommonCfg.Channel <= 14) && (pAd->ApCfg.MBSSID[apidx].wdev.DesiredHtPhyInfo.bHtEnable) && (pAd->CommonCfg.bBssCoexEnable == TRUE)) { extCapInfo.BssCoexistMgmtSupport = 1; MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &ExtCapIe, 1, &extInfoLen, extInfoLen, &extCapInfo, END_OF_ARGS); FrameLen += TmpLen; } } #endif /* DOT11N_DRAFT3 */ #endif /* DOT11_N_SUPPORT */ /* add country IE, power constraint IE */ if (pAd->CommonCfg.bCountryFlag) { ULONG TmpLen2=0; UCHAR TmpFrame[256]; UCHAR CountryIe = IE_COUNTRY; UCHAR MaxTxPower=16; #ifdef A_BAND_SUPPORT /* Only 802.11a APs that comply with 802.11h are required to include a Power Constrint Element(IE=32) in beacons and probe response frames */ if (pAd->CommonCfg.Channel > 14 && pAd->CommonCfg.bIEEE80211H == TRUE) { /* prepare power constraint IE */ MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 3, PowerConstraintIE, END_OF_ARGS); FrameLen += TmpLen; #ifdef DOT11_VHT_AC if (WMODE_CAP_AC(PhyMode)) { ULONG TmpLen; UINT8 vht_txpwr_env_ie = IE_VHT_TXPWR_ENV; UINT8 ie_len; VHT_TXPWR_ENV_IE txpwr_env; ie_len = build_vht_txpwr_envelope(pAd, (UCHAR *)&txpwr_env); MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &vht_txpwr_env_ie, 1, &ie_len, ie_len, &txpwr_env, END_OF_ARGS); FrameLen += TmpLen; } #endif /* DOT11_VHT_AC */ } #endif /* A_BAND_SUPPORT */ NdisZeroMemory(TmpFrame, sizeof(TmpFrame)); /* prepare channel information */ MakeOutgoingFrame(TmpFrame+TmpLen2, &TmpLen, 1, &pAd->ChannelList[0].Channel, 1, &pAd->ChannelListNum, 1, &MaxTxPower, END_OF_ARGS); TmpLen2 += TmpLen; /* need to do the padding bit check, and concatenate it */ if ((TmpLen2%2) == 0) { UCHAR TmpLen3 = TmpLen2+4; MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &CountryIe, 1, &TmpLen3, 3, pAd->CommonCfg.CountryCode, TmpLen2+1, TmpFrame, END_OF_ARGS); } else { UCHAR TmpLen3 = TmpLen2+3; MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &CountryIe, 1, &TmpLen3, 3, pAd->CommonCfg.CountryCode, TmpLen2, TmpFrame, END_OF_ARGS); } FrameLen += TmpLen; }/* Country IE - */ #ifdef A_BAND_SUPPORT /* add Channel switch announcement IE */ if ((pAd->CommonCfg.Channel > 14) && (pAd->CommonCfg.bIEEE80211H == 1) && (pAd->Dot11_H.RDMode == RD_SWITCHING_MODE)) { UCHAR CSAIe=IE_CHANNEL_SWITCH_ANNOUNCEMENT; UCHAR CSALen=3; UCHAR CSAMode=1; MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 1, &CSAIe, 1, &CSALen, 1, &CSAMode, 1, &pAd->CommonCfg.Channel, 1, &pAd->Dot11_H.CSCount, END_OF_ARGS); FrameLen += TmpLen; #ifdef DOT11_N_SUPPORT if (pAd->CommonCfg.bExtChannelSwitchAnnouncement) { HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE HtExtChannelSwitchIe; build_ext_channel_switch_ie(pAd, &HtExtChannelSwitchIe); MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, sizeof(HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE), &HtExtChannelSwitchIe, END_OF_ARGS); } #endif /* DOT11_N_SUPPORT */ FrameLen += TmpLen; } #endif /* A_BAND_SUPPORT */ #ifdef DOT11_N_SUPPORT if (WMODE_CAP_N(PhyMode) && (wdev->DesiredHtPhyInfo.bHtEnable)) { ULONG TmpLen; UCHAR HtLen, AddHtLen;/*, NewExtLen; */ #ifdef RT_BIG_ENDIAN HT_CAPABILITY_IE HtCapabilityTmp; ADD_HT_INFO_IE addHTInfoTmp; #endif HtLen = sizeof(pAd->CommonCfg.HtCapability); AddHtLen = sizeof(pAd->CommonCfg.AddHTInfo); if (pAd->bBroadComHT == TRUE) { UCHAR epigram_ie_len; UCHAR BROADCOM_HTC[4] = {0x0, 0x90, 0x4c, 0x33}; UCHAR BROADCOM_AHTINFO[4] = {0x0, 0x90, 0x4c, 0x34}; epigram_ie_len = HtLen + 4; #ifndef RT_BIG_ENDIAN MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &WpaIe, 1, &epigram_ie_len, 4, &BROADCOM_HTC[0], HtLen, &pAd->CommonCfg.HtCapability, END_OF_ARGS); #else NdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, HtLen); *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); #ifdef UNALIGNMENT_SUPPORT { EXT_HT_CAP_INFO extHtCapInfo; NdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO)); *(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo)); NdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO)); } #else *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = cpu2le16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); #endif /* UNALIGNMENT_SUPPORT */ MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &WpaIe, 1, &epigram_ie_len, 4, &BROADCOM_HTC[0], HtLen, &HtCapabilityTmp, END_OF_ARGS); #endif FrameLen += TmpLen; epigram_ie_len = AddHtLen + 4; #ifndef RT_BIG_ENDIAN MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &WpaIe, 1, &epigram_ie_len, 4, &BROADCOM_AHTINFO[0], AddHtLen, &pAd->CommonCfg.AddHTInfo, END_OF_ARGS); #else NdisMoveMemory(&addHTInfoTmp, &pAd->CommonCfg.AddHTInfo, AddHtLen); *(USHORT *)(&addHTInfoTmp.AddHtInfo2) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2)); *(USHORT *)(&addHTInfoTmp.AddHtInfo3) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3)); MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &WpaIe, 1, &epigram_ie_len, 4, &BROADCOM_AHTINFO[0], AddHtLen, &addHTInfoTmp, END_OF_ARGS); #endif FrameLen += TmpLen; } #ifdef DOT11_VHT_AC if (WMODE_CAP_AC(PhyMode) && (pAd->CommonCfg.Channel > 14)) { FrameLen += build_vht_ies(pAd, (UCHAR *)(pOutBuffer+FrameLen), SUBTYPE_PROBE_RSP); } #endif /* DOT11_VHT_AC */ } #endif /* DOT11_N_SUPPORT */ /* add Ralink-specific IE here - Byte0.b0=1 for aggregation, Byte0.b1=1 for piggy-back Byte0.b3=1 for rssi-feedback */ { ULONG TmpLen; UCHAR RalinkSpecificIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x00, 0x00, 0x00, 0x00}; if (pAd->CommonCfg.bAggregationCapable) RalinkSpecificIe[5] |= 0x1; if (pAd->CommonCfg.bPiggyBackCapable) RalinkSpecificIe[5] |= 0x2; #ifdef DOT11_N_SUPPORT if (pAd->CommonCfg.bRdg) RalinkSpecificIe[5] |= 0x4; #endif /* DOT11_N_SUPPORT */ #ifdef DOT11_VHT_AC if (pAd->CommonCfg.b256QAM_2G && WMODE_2G_ONLY(pAd->CommonCfg.PhyMode)) RalinkSpecificIe[5] |= 0x8; #endif /* DOT11_VHT_AC */ #ifdef RSSI_FEEDBACK if (ProbeReqParam.bRequestRssi == TRUE) { MAC_TABLE_ENTRY *pEntry=NULL; DBGPRINT(RT_DEBUG_ERROR, ("SYNC - Send PROBE_RSP to %02x:%02x:%02x:%02x:%02x:%02x...\n", PRINT_MAC(Addr2))); RalinkSpecificIe[5] |= 0x8; pEntry = MacTableLookup(pAd, Addr2); if (pEntry != NULL) { RalinkSpecificIe[6] = (UCHAR)pEntry->RssiSample.AvgRssi0; RalinkSpecificIe[7] = (UCHAR)pEntry->RssiSample.AvgRssi1; RalinkSpecificIe[8] = (UCHAR)pEntry->RssiSample.AvgRssi2; } } #endif /* RSSI_FEEDBACK */ MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 9, RalinkSpecificIe, END_OF_ARGS); FrameLen += TmpLen; } /* 802.11n 11.1.3.2.2 active scanning. sending probe response with MCS rate is */ for (idx = 0; idx < mbss->ProbeRspTimes; idx++) MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); MlmeFreeMemory(pAd, pOutBuffer); }