Deserializes a chunk from a stream by reading the bytes at the current position of the stream.
The current stream position is updated according to the length of the returned chunk.
354 auto macHeader = makeShared<Ieee80211MacHeader>();
355 uint8_t subType = stream.readUint4();
356 uint8_t frameType = stream.readNBitsToUint64Be(2);
357 uint8_t protocolVersion = stream.readNBitsToUint64Be(2);
358 macHeader->setType(protocolVersion, frameType, subType);
359 bool order = stream.readBit();
360 macHeader->setOrder(order);
361 macHeader->setProtectedFrame(stream.readBit());
362 macHeader->setMoreData(stream.readBit());
363 macHeader->setPowerMgmt(stream.readBit());
364 macHeader->setRetry(stream.readBit());
365 macHeader->setMoreFragments(stream.readBit());
366 macHeader->setFromDS(stream.readBit());
367 macHeader->setToDS(stream.readBit());
382 auto mgmtHeader = makeShared<Ieee80211MgmtHeader>();
383 copyBasicFields(mgmtHeader, macHeader);
384 mgmtHeader->setDurationField(SimTime(stream.readUint16Le(), SIMTIME_US));
385 mgmtHeader->setReceiverAddress(stream.readMacAddress());
386 mgmtHeader->setTransmitterAddress(stream.readMacAddress());
387 mgmtHeader->setAddress3(stream.readMacAddress());
388 mgmtHeader->setFragmentNumber(stream.readUint4());
389 mgmtHeader->setSequenceNumber(SequenceNumberCyclic(stream.readNBitsToUint64Be(12)));
391 stream.readUint32Be();
395 auto actionFrame = makeShared<Ieee80211ActionFrame>();
396 copyBasicFields(actionFrame, macHeader);
397 actionFrame->setDurationField(SimTime(stream.readUint16Le(), SIMTIME_US));
398 actionFrame->setReceiverAddress(stream.readMacAddress());
399 actionFrame->setTransmitterAddress(stream.readMacAddress());
400 actionFrame->setAddress3(stream.readMacAddress());
401 actionFrame->setFragmentNumber(stream.readUint4());
402 actionFrame->setSequenceNumber(SequenceNumberCyclic(stream.readNBitsToUint64Be(12)));
404 stream.readUint32Be();
405 actionFrame->setCategory(stream.readByte());
406 switch (actionFrame->getCategory()) {
408 uint8_t blockAckAction = stream.readByte();
409 switch (blockAckAction) {
411 auto addbaRequest = makeShared<Ieee80211AddbaRequest>();
412 copyBasicFields(addbaRequest, macHeader);
413 copyActionFrameFields(addbaRequest, actionFrame);
414 addbaRequest->setBlockAckAction(blockAckAction);
415 addbaRequest->setDialogToken(stream.readByte());
416 addbaRequest->setAMsduSupported(stream.readBit());
417 addbaRequest->setBlockAckPolicy(stream.readBit());
418 addbaRequest->setTid(stream.readUint4());
419 addbaRequest->setBufferSize(stream.readNBitsToUint64Be(10));
420 addbaRequest->setBlockAckTimeoutValue(SimTime(stream.readUint16Be() * 1024, SIMTIME_US));
421 addbaRequest->set_fragmentNumber(stream.readUint4());
422 addbaRequest->setStartingSequenceNumber(SequenceNumberCyclic(stream.readNBitsToUint64Be(12)));
426 auto addbaResponse = makeShared<Ieee80211AddbaResponse>();
427 copyBasicFields(addbaResponse, macHeader);
428 copyActionFrameFields(addbaResponse, actionFrame);
429 addbaResponse->setBlockAckAction(blockAckAction);
430 addbaResponse->setDialogToken(stream.readByte());
431 addbaResponse->setStatusCode(stream.readUint16Be());
432 addbaResponse->setAMsduSupported(stream.readBit());
433 addbaResponse->setBlockAckPolicy(stream.readBit());
434 addbaResponse->setTid(stream.readUint4());
435 addbaResponse->setBufferSize(stream.readNBitsToUint64Be(10));
436 addbaResponse->setBlockAckTimeoutValue(SimTime(stream.readUint16Be() * 1024, SIMTIME_US));
437 return addbaResponse;
440 auto delba = makeShared<Ieee80211Delba>();
441 copyBasicFields(delba, macHeader);
442 delba->setBlockAckAction(blockAckAction);
443 delba->setReserved(stream.readNBitsToUint64Be(11));
444 delba->setInitiator(stream.readBit());
445 delba->setTid(stream.readUint4());
446 delba->setReasonCode(stream.readUint16Be());
450 actionFrame->markIncorrect();
456 actionFrame->markIncorrect();
462 auto rtsFrame = makeShared<Ieee80211RtsFrame>();
463 copyBasicFields(rtsFrame, macHeader);
464 rtsFrame->setDurationField(SimTime(stream.readUint16Le(), SIMTIME_US));
465 rtsFrame->setReceiverAddress(stream.readMacAddress());
466 rtsFrame->setTransmitterAddress(stream.readMacAddress());
470 auto ctsFrame = makeShared<Ieee80211CtsFrame>();
471 copyBasicFields(ctsFrame, macHeader);
472 ctsFrame->setDurationField(SimTime(stream.readUint16Le(), SIMTIME_US));
473 ctsFrame->setReceiverAddress(stream.readMacAddress());
477 auto ackFrame = makeShared<Ieee80211AckFrame>();
478 copyBasicFields(ackFrame, macHeader);
479 ackFrame->setDurationField(SimTime(stream.readUint16Le(), SIMTIME_US));
480 ackFrame->setReceiverAddress(stream.readMacAddress());
484 auto blockAckReq = makeShared<Ieee80211BlockAckReq>();
485 copyBasicFields(blockAckReq, macHeader);
486 blockAckReq->setDurationField(SimTime(stream.readUint16Le(), SIMTIME_US));
487 blockAckReq->setReceiverAddress(stream.readMacAddress());
488 blockAckReq->setTransmitterAddress(stream.readMacAddress());
489 blockAckReq->setBarAckPolicy(stream.readBit());
490 bool multiTid = stream.readBit();
491 bool compressedBitmap = stream.readBit();
492 blockAckReq->setMultiTid(multiTid);
493 blockAckReq->setCompressedBitmap(compressedBitmap);
494 blockAckReq->setReserved(stream.readNBitsToUint64Be(9));
495 if (!multiTid && !compressedBitmap) {
496 auto basicBlockAckReq = makeShared<Ieee80211BasicBlockAckReq>();
497 copyBasicFields(basicBlockAckReq, macHeader);
498 copyBlockAckReqFrameFields(basicBlockAckReq, blockAckReq);
499 basicBlockAckReq->setTidInfo(stream.readUint4());
500 basicBlockAckReq->setFragmentNumber(stream.readUint32Be());
501 stream.readUint64Be();
502 basicBlockAckReq->setStartingSequenceNumber(SequenceNumberCyclic(stream.readUint64Be()));
503 return basicBlockAckReq;
505 else if (!multiTid && compressedBitmap) {
506 auto compressedBlockAckReq = makeShared<Ieee80211CompressedBlockAckReq>();
507 copyBasicFields(compressedBlockAckReq, macHeader);
508 copyBlockAckReqFrameFields(compressedBlockAckReq, blockAckReq);
509 compressedBlockAckReq->setTidInfo(stream.readUint4());
510 compressedBlockAckReq->setFragmentNumber(stream.readUint32Be());
511 stream.readUint64Be();
512 compressedBlockAckReq->setStartingSequenceNumber(SequenceNumberCyclic(stream.readUint64Be()));
513 return compressedBlockAckReq;
516 blockAckReq->markIncorrect();
520 auto blockAck = makeShared<Ieee80211BlockAck>();
521 copyBasicFields(blockAck, macHeader);
522 blockAck->setDurationField(SimTime(stream.readUint16Le(), SIMTIME_US));
523 blockAck->setReceiverAddress(stream.readMacAddress());
524 blockAck->setTransmitterAddress(stream.readMacAddress());
525 blockAck->setBlockAckPolicy(stream.readBit());
526 bool multiTid = stream.readBit();
527 bool compressedBitmap = stream.readBit();
528 blockAck->setMultiTid(multiTid);
529 blockAck->setCompressedBitmap(compressedBitmap);
530 blockAck->setReserved(stream.readNBitsToUint64Be(9));
531 if (!multiTid && !compressedBitmap) {
532 auto basicBlockAck = makeShared<Ieee80211BasicBlockAck>();
533 copyBasicFields(basicBlockAck, macHeader);
534 copyBlockAckFrameFields(basicBlockAck, blockAck);
535 basicBlockAck->setTidInfo(stream.readUint4());
536 basicBlockAck->setStartingSequenceNumber(SequenceNumberCyclic(stream.readUint16Be()));
537 for (
size_t i = 0; i < 64; ++i) {
538 std::vector<uint8_t> bytes;
539 bytes.push_back(stream.readByte());
540 bytes.push_back(stream.readByte());
541 BitVector *blockAckBitmap =
new BitVector(bytes);
542 basicBlockAck->setBlockAckBitmap(i, *blockAckBitmap);
544 return basicBlockAck;
546 else if (!multiTid && compressedBitmap) {
547 auto compressedBlockAck = makeShared<Ieee80211CompressedBlockAck>();
548 copyBasicFields(compressedBlockAck, macHeader);
549 copyBlockAckFrameFields(compressedBlockAck, blockAck);
551 compressedBlockAck->setTidInfo(stream.readUint4());
552 compressedBlockAck->setStartingSequenceNumber(SequenceNumberCyclic(stream.readUint16Be()));
553 std::vector<uint8_t> bytes;
554 for (
size_t i = 0; i < 8; ++i) {
555 bytes.push_back(stream.readByte());
557 compressedBlockAck->setBlockAckBitmap(*(
new BitVector(bytes)));
558 return compressedBlockAck;
561 blockAck->markIncorrect();
569 auto dataHeader = makeShared<Ieee80211DataHeader>();
570 copyBasicFields(dataHeader, macHeader);
571 dataHeader->setDurationField(SimTime(stream.readUint16Le(), SIMTIME_US));
572 dataHeader->setReceiverAddress(stream.readMacAddress());
573 dataHeader->setTransmitterAddress(stream.readMacAddress());
574 dataHeader->setAddress3(stream.readMacAddress());
575 dataHeader->setFragmentNumber(stream.readUint4());
576 dataHeader->setSequenceNumber(SequenceNumberCyclic(stream.readNBitsToUint64Be(12)));
577 if (dataHeader->getFromDS() && dataHeader->getToDS())
578 dataHeader->setAddress4(stream.readMacAddress());
580 dataHeader->setTid(stream.readUint4());
582 dataHeader->setAckPolicy(
static_cast<AckPolicy>(stream.readNBitsToUint64Be(2)));
583 dataHeader->setAMsduPresent(stream.readBit());
594 macHeader->markIncorrect();