// set data packet without crc16 static void Dot11BPreparePacket(const Config& config, PVOID pSymbolBuffer, ULONG SymbolBufferSize) { ULONG i; PUCHAR pbIn = DataBuffer; unsigned int dataSize = config.GetPayloadLength(); assert(DataBufferSize >= dataSize + 4); for (i = 0; i < dataSize; i++) { *pbIn = 'B'; pbIn++; } PDOT11RFC1042ENCAP pWlanHeader = (PDOT11RFC1042ENCAP)DataBuffer; pWlanHeader->MacHeader.FrameControl.Type = FRAME_DATA; *(PULONG)pbIn = CalcCRC32(DataBuffer, dataSize); Mdl.Next = NULL; Mdl.StartVa = (PULONG)DataBuffer; Mdl.ByteOffset = 0; Mdl.MappedSystemVa = (PULONG)DataBuffer; Mdl.ByteCount = dataSize; Packet.pMdl = &Mdl; Packet.PacketSize = dataSize; Packet.pReserved = pSymbolBuffer; Packet.Reserved2 = SymbolBufferSize; Packet.Reserved1 = *(PULONG)(DataBuffer + dataSize); TxVector.DateRate = Dot11BDataRate_Kbps2Code(config.GetDataRate()); TxVector.PreambleType = DOT11B_PLCP_IS_LONG_PREAMBLE; }
int TestMod11B(PDOT11_MOD_ARGS pArgs) { MDL Mdl; PACKET_BASE Packet; DOT11B_PLCP_TXVECTOR Dot11BTxVector; Dot11BTxVector.PreambleType = DOT11B_PLCP_IS_LONG_PREAMBLE; Dot11BTxVector.ModSelect = DOT11B_PLCP_IS_CCK; if (!Dot11BRate_KbpsValid(pArgs->nBitRate)) { printf("Data rate %d kbps is not supported by 802.11b mode\n", pArgs->nBitRate); return -1; } Dot11BTxVector.DateRate = Dot11BDataRate_Kbps2Code(pArgs->nBitRate); // Measure modulation speed const int RUN_TIMES = 100; ULONGLONG ts1 = SoraGetCPUTimestamp ( &tsinfo ); for (int ii = 0; ii < RUN_TIMES; ii++) { if (PreparePacket(pArgs->pcInFileName, &Mdl, &Packet, DataBuffer, (PUCHAR)SymbolBuffer, SAMPLE_BUFFER_SIZE) < 0) return -1; // Note: BB11BPMDPacketGenSignal() will modify Packet.pMdl and Packet.pReserved (data crc) // so if run multiple times, please reload these data before calling it. BB11BPMDPacketGenSignal(&Packet, &Dot11BTxVector, (PUCHAR)TempBuffer, sizeof(TempBuffer)/sizeof(COMPLEX8)); } ULONGLONG ts2 = SoraGetCPUTimestamp ( &tsinfo ); printf("Signal data rate: %d kbps\n", Dot11BDataRate_Code2Kbps(Dot11BTxVector.DateRate)); printf("Signal packet size: %d\n", Packet.PacketSize); printf("Signal encoded size: %d\n", Packet.Reserved3); printf("Time cost average: %.3f us \n", SoraTimeElapsed (ts2-ts1, &tsinfo) * 1.0 / 1000 / RUN_TIMES); FILE* pOut = NULL; #pragma warning (push) #pragma warning (disable:4996) pOut = fopen(pArgs->pcOutFileName, "w+b"); #pragma warning (pop) if (!pOut) { printf("Cannot create output file.\n"); return -1; } fwrite(Packet.pReserved, Packet.Reserved3, 1, pOut); fclose(pOut); return 0; }