24 #include "ns3/header.h"
25 #include "ns3/trailer.h"
26 #include "ns3/packet.h"
27 #include "ns3/packet-metadata.h"
36 static TypeId GetTypeId (
void);
38 bool IsOk (
void)
const;
40 void ReportError (
void);
46 HistoryHeaderBase::GetTypeId (
void)
54 HistoryHeaderBase::HistoryHeaderBase ()
78 virtual void Print (std::ostream &os)
const;
94 std::ostringstream oss;
95 oss <<
"ns3::HistoryHeader<"<<N<<
">";
97 .SetParent<HistoryHeaderBase> ()
131 for (
int i = 0; i < N; i++)
146 bool IsOk (
void)
const;
185 virtual void Print (std::ostream &os)
const;
202 std::ostringstream oss;
203 oss <<
"ns3::HistoryTrailer<"<<N<<
">";
205 .SetParent<HistoryTrailerBase> ()
241 for (
int i = 0; i < N; i++)
257 void CheckHistory (
Ptr<Packet> p,
const char *file,
int line, uint32_t n, ...);
258 virtual void DoRun (
void);
275 std::list<int> expected;
278 for (uint32_t j = 0; j < n; j++)
280 int v = va_arg (ap,
int);
281 expected.push_back (v);
290 if (item.
isFragment || item.
type == PacketMetadata::Item::PAYLOAD)
295 if (item.
type == PacketMetadata::Item::HEADER)
298 HistoryHeaderBase *header =
dynamic_cast<HistoryHeaderBase *
> (constructor ());
303 header->Deserialize (item.
current);
304 if (!header->IsOk ())
311 else if (item.
type == PacketMetadata::Item::TRAILER)
314 HistoryTrailerBase *trailer =
dynamic_cast<HistoryTrailerBase *
> (constructor ());
319 trailer->Deserialize (item.
current);
320 if (!trailer->IsOk ())
330 for (std::list<int>::iterator i = got.begin (),
331 j = expected.begin ();
332 i != got.end (); i++, j++)
342 std::ostringstream failure;
343 failure <<
"PacketMetadata error. Got:\"";
344 for (std::list<int>::iterator i = got.begin ();
345 i != got.end (); i++)
347 failure << *i <<
", ";
349 failure <<
"\", expected: \"";
350 for (std::list<int>::iterator j = expected.begin ();
351 j != expected.end (); j++)
353 failure << *j <<
", ";
359 #define ADD_HEADER(p, n) \
361 HistoryHeader<n> header; \
362 p->AddHeader (header); \
364 #define ADD_TRAILER(p, n) \
366 HistoryTrailer<n> trailer; \
367 p->AddTrailer (trailer); \
369 #define REM_HEADER(p, n) \
371 HistoryHeader<n> header; \
372 p->RemoveHeader (header); \
374 #define REM_TRAILER(p, n) \
376 HistoryTrailer<n> trailer; \
377 p->RemoveTrailer (trailer); \
379 #define CHECK_HISTORY(p, ...) \
381 CheckHistory (p, __FILE__, __LINE__, __VA_ARGS__); \
382 uint32_t size = p->GetSerializedSize (); \
383 uint8_t* buffer = new uint8_t[size]; \
384 p->Serialize (buffer, size); \
385 Ptr<Packet> otherPacket = Create<Packet> (buffer, size, true); \
387 CheckHistory (otherPacket, __FILE__, __LINE__, __VA_ARGS__); \
401 PacketMetadata::Enable ();
406 p = Create<Packet> (10);
411 p = Create<Packet> (10);
424 p = Create<Packet> (10);
432 p = Create<Packet> (10);
441 p = Create<Packet> (10);
450 p = Create<Packet> (10);
475 3, 3, 2, 1, 10, 4, 5);
488 p1->RemoveAtStart (3);
491 p1->RemoveAtStart (1);
494 p1->RemoveAtStart (1);
500 p1->RemoveAtStart (1);
503 p = Create<Packet> (10);
507 p->RemoveAtStart (8+10+8);
510 p = Create<Packet> (10);
516 p->RemoveAtStart (5);
520 p = Create<Packet> (10);
527 p->RemoveAtStart (12);
539 p = Create<Packet> (40);
543 p1 = p->CreateFragment (0, 5);
556 p1 = p->CreateFragment (0, 5);
559 p3 = Create<Packet> (50);
571 p1->RemoveAtEnd (60);
577 p3 = Create<Packet> (40);
581 p1 = p3->CreateFragment (0, 5);
588 p = Create<Packet> (0);
591 p3 = Create<Packet> (0);
595 p1 = p3->CreateFragment (0, 4);
603 p = Create<Packet> (2000);
606 p = Create<Packet> ();
609 p1 = p->CreateFragment (0, 8);
614 p = Create<Packet> ();
620 p = Create<Packet> ();
626 p = Create<Packet> ();
631 p = Create<Packet> (10);
635 p->RemoveAtStart (8+10+8);
638 p = Create<Packet> (0);
643 p = Create<Packet> (0);
648 p = Create<Packet> (0);
650 p->RemoveAtStart (8);
653 p = Create<Packet> (0);
660 p = Create<Packet> (0);
667 p = Create<Packet> (0);
671 p->RemoveAtStart (8);
674 p = Create<Packet> (0);
681 p = Create<Packet> (0);
688 p = Create<Packet> (0);
692 p->RemoveAtStart (8);
695 p = Create<Packet> (16383);
696 p = Create<Packet> (16384);
701 p = Create<Packet> (40);
711 p = Create<Packet> (1000);
721 p = Create<Packet> (1510);
726 p1 = p->CreateFragment (0, 1500);
731 p = Create<Packet> (1000);
741 p = Create<Packet> (200);
743 p1 = p->CreateFragment (0, 100);
744 p2 = p->CreateFragment (100, 100);
747 p = Create<Packet> ();
749 p1 = Create<Packet> ();
754 p = Create<Packet> (500);
763 p = Create<Packet> (500);
769 p->RemoveAtStart (10);
774 p = Create<Packet> (500);
779 p1 = p->CreateFragment (0,6);
780 p2 = p->CreateFragment (6,535-6);
785 p = Create<Packet> (
reinterpret_cast<const uint8_t*
> (
"hello world"), 11);
788 p1 = p->CreateFragment (0, 5);
790 p2 = p->CreateFragment (5, 8);
818 uint8_t *buf =
new uint8_t[p3->GetSize ()];
819 p3->CopyData (buf, p3->GetSize ());
820 std::string msg = std::string (reinterpret_cast<const char *>(buf),
823 NS_TEST_EXPECT_MSG_EQ (msg, std::string (
"hello world"),
"Could not find original data in received packet");
TypeId AddConstructor(void)
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
virtual void Serialize(Buffer::Iterator start) const
#define NS_TEST_ASSERT_MSG_EQ_INTERNAL(actual, limit, msg, file, line)
Test that an actual and expected (limit) value are equal and report and abort if not.
iterator in a Buffer instance
Callback< ObjectBase * > GetConstructor(void) const
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
Create a new packet which contains a fragment of the original packet.
void AddAtEnd(Ptr< const Packet > packet)
Concatenate the input packet at the end of the current packet.
void AddTestCase(TestCase *testCase, enum TestDuration duration)
Add an individual child TestCase to this test suite.
void Prev(void)
go backward by one byte
virtual uint32_t Deserialize(Buffer::Iterator start)
virtual TypeId GetInstanceTypeId(void) const
Get the most derived TypeId for this Object.
Protocol trailer serialization and deserialization.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
PacketMetadata::ItemIterator BeginItem(void) const
Returns an iterator which points to the first 'item' stored in this buffer.
virtual uint32_t GetSerializedSize(void) const
void WriteU8(uint8_t data)
virtual void Print(std::ostream &os) const
static TypeId GetTypeId(void)
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
static TypeId GetTypeId(void)