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

Converts between EtherFragmentPhyHeader and binary (network byte order) Ethernet fragment PHY header. More...

#include <EthernetPhyHeaderSerializer.h>

Inheritance diagram for inet::physicallayer::EthernetFragmentPhyHeaderSerializer:
inet::FieldsChunkSerializer inet::ChunkSerializer

Public Member Functions

 EthernetFragmentPhyHeaderSerializer ()
 
- Public Member Functions inherited from inet::FieldsChunkSerializer
virtual void serialize (MemoryOutputStream &stream, const Ptr< const Chunk > &chunk, b offset, b length) const override
 Serializes a chunk into a stream by writing the bytes representing the chunk at the end of the stream. More...
 
virtual const Ptr< Chunkdeserialize (MemoryInputStream &stream, const std::type_info &typeInfo) const override
 Deserializes a chunk from a stream by reading the bytes at the current position of the stream. More...
 

Protected Member Functions

virtual void serialize (MemoryOutputStream &stream, const Ptr< const Chunk > &chunk) const override
 Serializes a chunk into a stream by writing all bytes representing the chunk at the end of the stream. More...
 
virtual const Ptr< Chunkdeserialize (MemoryInputStream &stream) const override
 Deserializes a chunk from a stream by reading the bytes at the current position of the stream. More...
 

Private Attributes

friend EthernetPhyHeaderBaseSerializer
 

Additional Inherited Members

- Static Public Attributes inherited from inet::ChunkSerializer
static b totalSerializedLength = b(0)
 
static b totalDeserializedLength = b(0)
 

Detailed Description

Converts between EtherFragmentPhyHeader and binary (network byte order) Ethernet fragment PHY header.

Constructor & Destructor Documentation

◆ EthernetFragmentPhyHeaderSerializer()

inet::physicallayer::EthernetFragmentPhyHeaderSerializer::EthernetFragmentPhyHeaderSerializer ( )
inline
57 : FieldsChunkSerializer() {}

Member Function Documentation

◆ deserialize()

const Ptr< Chunk > inet::physicallayer::EthernetFragmentPhyHeaderSerializer::deserialize ( MemoryInputStream stream) const
overrideprotectedvirtual

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.

Implements inet::FieldsChunkSerializer.

88 {
89  auto header = makeShared<EthernetFragmentPhyHeader>();
90  bool preambleReadSuccessfully = stream.readByteRepeatedly(0x55, B(PREAMBLE_BYTES).get() - 1);
91  if (!preambleReadSuccessfully)
92  header->markIncorrect();
93  uint8_t value = stream.readByte();
94  if (value == 0x55) {
95  uint8_t value = stream.readByte();
96  if (value == 0xD5)
97  header->setPreambleType(SFD);
98  else {
99  header->setPreambleType(SMD_Sx);
100  int smdSxValues[] = { 0xE6, 0x4C, 0x7F, 0xB3 };
101  int smdNumber = std::distance(smdSxValues, std::find(smdSxValues, smdSxValues + 4, value));
102  header->setSmdNumber(smdNumber);
103  header->setFragmentNumber(0);
104  }
105  }
106  else {
107  header->setPreambleType(SMD_Cx);
108  uint8_t value = stream.readByte();
109  int smdCxValues[] = { 0x61, 0x52, 0x9E, 0x2A };
110  int smdNumber = std::distance(smdCxValues, std::find(smdCxValues, smdCxValues + 4, value));
111  header->setSmdNumber(smdNumber);
112  int fragmentNumberValues[] = { 0xE6, 0x4C, 0x7F, 0xB3 };
113  int fragmentNumber = std::distance(fragmentNumberValues, std::find(fragmentNumberValues, fragmentNumberValues + 4, value));
114  header->setFragmentNumber(fragmentNumber);
115  }
116  return header;
117 }

Referenced by inet::physicallayer::EthernetPhyHeaderBaseSerializer::deserialize().

◆ serialize()

void inet::physicallayer::EthernetFragmentPhyHeaderSerializer::serialize ( MemoryOutputStream stream,
const Ptr< const Chunk > &  chunk 
) const
overrideprotectedvirtual

Serializes a chunk into a stream by writing all bytes representing the chunk at the end of the stream.

Implements inet::FieldsChunkSerializer.

59 {
60  const auto& header = staticPtrCast<const EthernetFragmentPhyHeader>(chunk);
61  stream.writeByteRepeatedly(0x55, B(PREAMBLE_BYTES).get() - (header->getPreambleType() == SMD_Cx ? 1 : 0));
62  switch (header->getPreambleType()) {
63  case SFD:
64  stream.writeByte(0xD5);
65  break;
66  case SMD_Verify:
67  stream.writeByte(0x07);
68  break;
69  case SMD_Respond:
70  stream.writeByte(0x19);
71  break;
72  case SMD_Sx: {
73  int smdSxValues[] = { 0xE6, 0x4C, 0x7F, 0xB3 };
74  stream.writeByte(smdSxValues[header->getSmdNumber()]);
75  break;
76  }
77  case SMD_Cx: {
78  int smdCxValues[] = { 0x61, 0x52, 0x9E, 0x2A };
79  stream.writeByte(smdCxValues[header->getSmdNumber()]);
80  int fragmentNumberValues[] = { 0xE6, 0x4C, 0x7F, 0xB3 };
81  stream.writeByte(fragmentNumberValues[header->getFragmentNumber()]);
82  break;
83  }
84  }
85 }

Member Data Documentation

◆ EthernetPhyHeaderBaseSerializer

friend inet::physicallayer::EthernetFragmentPhyHeaderSerializer::EthernetPhyHeaderBaseSerializer
private

The documentation for this class was generated from the following files:
inet::physicallayer::SMD_Cx
@ SMD_Cx
Definition: EthernetPhyHeader_m.h:153
inet::find
std::vector< T >::iterator find(std::vector< T > &v, const Tk &a)
Definition: stlutils.h:44
inet::physicallayer::SMD_Respond
@ SMD_Respond
Definition: EthernetPhyHeader_m.h:151
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::physicallayer::SFD
@ SFD
Definition: EthernetPhyHeader_m.h:148
inet::physicallayer::SMD_Sx
@ SMD_Sx
Definition: EthernetPhyHeader_m.h:152
inet::physicallayer::SMD_Verify
@ SMD_Verify
Definition: EthernetPhyHeader_m.h:150
inet::PREAMBLE_BYTES
const B PREAMBLE_BYTES
Definition: Ethernet.h:41