INET Framework for OMNeT++/OMNEST
inet::physicallayer::APSKPhyFrameSerializer Class Reference

#include <APSKPhyFrameSerializer.h>

Public Member Functions

 APSKPhyFrameSerializer ()
 
virtual BitVectorserialize (const APSKPhyFrame *phyFrame) const
 
virtual APSKPhyFramedeserialize (const BitVector *bits) const
 

Constructor & Destructor Documentation

inet::physicallayer::APSKPhyFrameSerializer::APSKPhyFrameSerializer ( )
30 {
31 }

Member Function Documentation

APSKPhyFrame * inet::physicallayer::APSKPhyFrameSerializer::deserialize ( const BitVector bits) const
virtual

Referenced by inet::physicallayer::APSKLayeredReceiver::createPhyFrame().

61 {
62  const std::vector<uint8>& bytes = bits->getBytes();
63  APSKPhyFrame *phyFrame = new APSKPhyFrame();
64  cPacket *macFrame = nullptr;
65  if (bytes.size() < APSK_PHY_FRAME_HEADER_BYTE_LENGTH) {
66  macFrame = new Ieee80211Frame();
67  phyFrame->setBitError(true);
68  macFrame->setBitError(true);
69  }
70  else {
71  uint16_t macFrameLength = (bytes[0] << 8) + bytes[1];
72  uint32_t receivedCrc = (bytes[2] << 24) + (bytes[3] << 16) + (bytes[4] << 8) + bytes[5];
73  if (macFrameLength > bytes.size() - APSK_PHY_FRAME_HEADER_BYTE_LENGTH) {
74  macFrame = new Ieee80211Frame();
75  phyFrame->setBitError(true);
76  macFrame->setBitError(true);
77  }
78  else {
79  unsigned char *buffer = new unsigned char[macFrameLength];
80  for (unsigned int i = 0; i < macFrameLength; i++)
81  buffer[i] = bytes[i + APSK_PHY_FRAME_HEADER_BYTE_LENGTH];
82  uint32_t computedCrc = ethernetCRC(buffer, macFrameLength);
83  if (receivedCrc != computedCrc) {
84  EV_ERROR << "CRC check failed" << endl;
85  macFrame = new Ieee80211Frame();
86  phyFrame->setBitError(true);
87  macFrame->setBitError(true);
88  }
89  else {
90  Ieee80211Serializer deserializer;
91  Buffer b(buffer, macFrameLength);
92  Context c;
93  macFrame = deserializer.deserializePacket(b, c);
94  }
95  delete[] buffer;
96  }
97  }
98  phyFrame->setByteLength(APSK_PHY_FRAME_HEADER_BYTE_LENGTH);
99  phyFrame->encapsulate(macFrame);
100  return phyFrame;
101 }
uint32_t ethernetCRC(const unsigned char *buf, unsigned int bufsize)
Definition: EthernetCRC.cc:67
const value< double, compose< units::m, pow< units::s,-1 > > > c(299792458)
Converts between Ieee802.11Frame and binary (network byte order) Ieee802.11 header.
Definition: Ieee80211Serializer.h:34
Buffer for serializer/deserializer.
Definition: Buffer.h:37
class for data transfer from any serializers to subserializers e.g.
Definition: SerializerBase.h:57
cPacket * deserializePacket(const Buffer &b, Context &context)
Definition: SerializerBase.cc:42
#define APSK_PHY_FRAME_HEADER_BYTE_LENGTH
Definition: APSKPhyFrameSerializer.h:28
value< double, units::m > b
Definition: Units.h:1054
BitVector * inet::physicallayer::APSKPhyFrameSerializer::serialize ( const APSKPhyFrame phyFrame) const
virtual

Referenced by inet::physicallayer::APSKLayeredTransmitter::createPacketModel().

34 {
35  const Ieee80211Frame *macFrame = check_and_cast<const Ieee80211Frame*>(phyFrame->getEncapsulatedPacket());
36  uint16_t macFrameLength = macFrame->getByteLength();
37  // KLUDGE: the serializer sometimes produces more or less bytes than the precomputed macFrameLength
38  unsigned char *buffer = new unsigned char[macFrameLength + 1000];
39  memset(buffer, 0, macFrameLength + 1000);
40  Ieee80211Serializer ieee80211Serializer;
41  Buffer b(buffer, macFrameLength);
42  Context c;
43  ieee80211Serializer.serializePacket(macFrame, b, c);
44  int serializedLength = b.getPos();
45  // TODO: ASSERT(serializedLength == macFrameLength);
46  uint32_t crc = ethernetCRC(buffer, serializedLength);
47  BitVector *bits = new BitVector();
48  bits->appendByte(serializedLength >> 8);
49  bits->appendByte(serializedLength >> 0);
50  bits->appendByte(crc >> 24);
51  bits->appendByte(crc >> 16);
52  bits->appendByte(crc >> 8);
53  bits->appendByte(crc >> 0);
54  for (int i = 0; i < serializedLength; i++)
55  bits->appendByte(buffer[i]);
56  delete[] buffer;
57  return bits;
58 }
uint32_t ethernetCRC(const unsigned char *buf, unsigned int bufsize)
Definition: EthernetCRC.cc:67
const value< double, compose< units::m, pow< units::s,-1 > > > c(299792458)
Converts between Ieee802.11Frame and binary (network byte order) Ieee802.11 header.
Definition: Ieee80211Serializer.h:34
void serializePacket(const cPacket *pkt, Buffer &b, Context &context)
Definition: SerializerBase.cc:34
Buffer for serializer/deserializer.
Definition: Buffer.h:37
class for data transfer from any serializers to subserializers e.g.
Definition: SerializerBase.h:57
value< double, units::m > b
Definition: Units.h:1054

The documentation for this class was generated from the following files: