Serializes a chunk into a stream by writing all bytes representing the chunk at the end of the stream.
25 const auto& aodvControlPacket = staticPtrCast<const AodvControlPacket>(chunk);
26 switch (aodvControlPacket->getPacketType()) {
28 const auto& aodvRreq =
CHK(dynamicPtrCast<const Rreq>(chunk));
29 stream.writeByte(aodvRreq->getPacketType());
30 stream.writeBit(aodvRreq->getJoinFlag());
31 stream.writeBit(aodvRreq->getRepairFlag());
32 stream.writeBit(aodvRreq->getGratuitousRREPFlag());
33 stream.writeBit(aodvRreq->getDestOnlyFlag());
34 stream.writeBit(aodvRreq->getUnknownSeqNumFlag());
35 stream.writeNBitsOfUint64Be(aodvRreq->getReserved(), 11);
36 stream.writeByte(aodvRreq->getHopCount());
37 stream.writeUint32Be(aodvRreq->getRreqId());
38 stream.writeIpv4Address(aodvRreq->getDestAddr().toIpv4());
39 stream.writeUint32Be(aodvRreq->getDestSeqNum());
40 stream.writeIpv4Address(aodvRreq->getOriginatorAddr().toIpv4());
41 stream.writeUint32Be(aodvRreq->getOriginatorSeqNum());
42 ASSERT(aodvRreq->getChunkLength() ==
B(24));
46 const auto& aodvRreq =
CHK(dynamicPtrCast<const Rreq>(chunk));
47 stream.writeByte(aodvRreq->getPacketType());
48 stream.writeBit(aodvRreq->getJoinFlag());
49 stream.writeBit(aodvRreq->getRepairFlag());
50 stream.writeBit(aodvRreq->getGratuitousRREPFlag());
51 stream.writeBit(aodvRreq->getDestOnlyFlag());
52 stream.writeBit(aodvRreq->getUnknownSeqNumFlag());
53 stream.writeNBitsOfUint64Be(aodvRreq->getReserved(), 11);
54 stream.writeByte(aodvRreq->getHopCount());
55 stream.writeUint32Be(aodvRreq->getRreqId());
56 stream.writeUint32Be(aodvRreq->getDestSeqNum());
57 stream.writeUint32Be(aodvRreq->getOriginatorSeqNum());
58 stream.writeIpv6Address(aodvRreq->getDestAddr().toIpv6());
59 stream.writeIpv6Address(aodvRreq->getOriginatorAddr().toIpv6());
60 ASSERT(aodvRreq->getChunkLength() ==
B(48));
64 const auto& aodvRrep =
CHK(dynamicPtrCast<const Rrep>(chunk));
65 stream.writeByte(aodvRrep->getPacketType());
66 stream.writeBit(aodvRrep->getRepairFlag());
67 stream.writeBit(aodvRrep->getAckRequiredFlag());
68 stream.writeNBitsOfUint64Be(aodvRrep->getReserved(), 9);
69 stream.writeNBitsOfUint64Be(aodvRrep->getPrefixSize(), 5);
70 stream.writeByte(aodvRrep->getHopCount());
71 stream.writeIpv4Address(aodvRrep->getDestAddr().toIpv4());
72 stream.writeUint32Be(aodvRrep->getDestSeqNum());
73 stream.writeIpv4Address(aodvRrep->getOriginatorAddr().toIpv4());
74 stream.writeUint32Be(aodvRrep->getLifeTime().inUnit(SIMTIME_MS));
75 ASSERT(aodvRrep->getChunkLength() ==
B(20));
79 const auto& aodvRrep =
CHK(dynamicPtrCast<const Rrep>(chunk));
80 stream.writeByte(aodvRrep->getPacketType());
81 stream.writeBit(aodvRrep->getRepairFlag());
82 stream.writeBit(aodvRrep->getAckRequiredFlag());
83 stream.writeNBitsOfUint64Be(aodvRrep->getReserved(), 7);
84 stream.writeNBitsOfUint64Be(aodvRrep->getPrefixSize(), 7);
85 stream.writeByte(aodvRrep->getHopCount());
86 stream.writeUint32Be(aodvRrep->getDestSeqNum());
87 stream.writeIpv6Address(aodvRrep->getDestAddr().toIpv6());
88 stream.writeIpv6Address(aodvRrep->getOriginatorAddr().toIpv6());
89 stream.writeUint32Be(aodvRrep->getLifeTime().inUnit(SIMTIME_MS));
90 ASSERT(aodvRrep->getChunkLength() ==
B(44));
94 const auto& aodvRerr =
CHK(dynamicPtrCast<const Rerr>(chunk));
95 stream.writeByte(aodvRerr->getPacketType());
96 stream.writeBit(aodvRerr->getNoDeleteFlag());
97 stream.writeNBitsOfUint64Be(aodvRerr->getReserved(), 15);
98 if (aodvRerr->getUnreachableNodesArraySize() == 0) {
99 throw cRuntimeError(
"Cannot serialize AODV control packet of type %d: DestCount must be at least 1.", aodvControlPacket->getPacketType());
102 stream.writeByte(aodvRerr->getUnreachableNodesArraySize());
103 for (uint8_t index = 0; index < aodvRerr->getUnreachableNodesArraySize(); ++index) {
104 stream.writeIpv4Address(aodvRerr->getUnreachableNodes(aodvRerr->getUnreachableNodesArraySize() - (index + 1)).addr.toIpv4());
105 stream.writeUint32Be(aodvRerr->getUnreachableNodes(aodvRerr->getUnreachableNodesArraySize() - (index + 1)).seqNum);
107 ASSERT(aodvRerr->getChunkLength() ==
B(4 + aodvRerr->getUnreachableNodesArraySize() * 8));
111 const auto& aodvRerr =
CHK(dynamicPtrCast<const Rerr>(chunk));
112 stream.writeByte(aodvRerr->getPacketType());
113 stream.writeBit(aodvRerr->getNoDeleteFlag());
114 stream.writeNBitsOfUint64Be(aodvRerr->getReserved(), 15);
115 if (aodvRerr->getUnreachableNodesArraySize() == 0) {
116 throw cRuntimeError(
"Cannot serialize AODV control packet of type %d: DestCount must be at least 1.", aodvControlPacket->getPacketType());
119 stream.writeByte(aodvRerr->getUnreachableNodesArraySize());
120 for (uint8_t index = 0; index < aodvRerr->getUnreachableNodesArraySize(); ++index) {
121 stream.writeUint32Be(aodvRerr->getUnreachableNodes(aodvRerr->getUnreachableNodesArraySize() - (index + 1)).seqNum);
122 stream.writeIpv6Address(aodvRerr->getUnreachableNodes(aodvRerr->getUnreachableNodesArraySize() - (index + 1)).addr.toIpv6());
124 ASSERT(aodvRerr->getChunkLength() ==
B(4 + aodvRerr->getUnreachableNodesArraySize() * (4 + 16)));
129 const auto& aodvRrepAck =
CHK(dynamicPtrCast<const RrepAck>(chunk));
130 stream.writeByte(aodvRrepAck->getPacketType());
131 stream.writeByte(aodvRrepAck->getReserved());
132 ASSERT(aodvRrepAck->getChunkLength() ==
B(2));
136 throw cRuntimeError(
"Cannot serialize AODV control packet: type %d not supported.", aodvControlPacket->getPacketType());