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 ()
60 HistoryHeaderBase::IsOk (
void)
const
65 HistoryHeaderBase::ReportError (
void)
76 static TypeId GetTypeId (
void);
78 virtual void Print (std::ostream &os)
const;
92 HistoryHeader<N>::GetTypeId (
void)
94 std::ostringstream oss;
95 oss <<
"ns3::HistoryHeader<"<<N<<
">";
97 .SetParent<HistoryHeaderBase> ()
131 for (
int i = 0; i < N; i++)
144 static TypeId GetTypeId (
void);
146 bool IsOk (
void)
const;
148 void ReportError (
void);
154 HistoryTrailerBase::GetTypeId (
void)
161 HistoryTrailerBase::HistoryTrailerBase ()
166 HistoryTrailerBase::IsOk (
void)
const
171 HistoryTrailerBase::ReportError (
void)
183 static TypeId GetTypeId (
void);
185 virtual void Print (std::ostream &os)
const;
200 HistoryTrailer<N>::GetTypeId (
void)
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);
263 PacketMetadataTest::PacketMetadataTest ()
268 PacketMetadataTest::~PacketMetadataTest ()
273 PacketMetadataTest::CheckHistory (
Ptr<Packet> p,
const char *file,
int line, uint32_t n, ...)
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)
292 got.push_back (item.currentSize);
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 ())
327 got.push_back (item.currentSize);
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 <<
", ";
356 NS_TEST_ASSERT_MSG_EQ_INTERNAL (
false,
true, failure.str (), file, line);
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);
407 ADD_TRAILER (p, 100);
408 CHECK_HISTORY (p, 2, 10, 100);
411 p = Create<Packet> (10);
424 p = Create<Packet> (10);
432 p = Create<Packet> (10);
441 p = Create<Packet> (10);
448 CHECK_HISTORY (p, 1, 10);
450 p = Create<Packet> (10);
458 CHECK_HISTORY (p1, 1, 10);
463 CHECK_HISTORY (p1, 3,
475 3, 3, 2, 1, 10, 4, 5);
486 CHECK_HISTORY (p1, 5,
488 p1->RemoveAtStart (3);
489 CHECK_HISTORY (p1, 4,
491 p1->RemoveAtStart (1);
492 CHECK_HISTORY (p1, 4,
494 p1->RemoveAtStart (1);
495 CHECK_HISTORY (p1, 3,
498 CHECK_HISTORY (p1, 2,
500 p1->RemoveAtStart (1);
501 CHECK_HISTORY (p1, 1, 10);
503 p = Create<Packet> (10);
507 p->RemoveAtStart (8+10+8);
508 CHECK_HISTORY (p, 1, 8);
510 p = Create<Packet> (10);
516 p->RemoveAtStart (5);
518 CHECK_HISTORY (p, 5, 3, 10, 10, 6, 4);
520 p = Create<Packet> (10);
526 CHECK_HISTORY (p, 3, 3, 8, 5);
527 p->RemoveAtStart (12);
528 CHECK_HISTORY (p, 1, 4);
530 CHECK_HISTORY (p, 1, 2);
532 CHECK_HISTORY (p, 2, 10, 2);
534 CHECK_HISTORY (p, 1, 7);
539 p = Create<Packet> (40);
542 CHECK_HISTORY (p, 3, 8, 5, 40);
543 p1 = p->CreateFragment (0, 5);
546 CHECK_HISTORY (p1, 1, 5);
547 CHECK_HISTORY (p2, 2, 3, 2);
548 CHECK_HISTORY (p3, 2, 3, 40);
550 CHECK_HISTORY (p1, 2, 8, 2);
551 CHECK_HISTORY (p2, 2, 3, 2);
553 CHECK_HISTORY (p1, 3, 8, 5, 40);
554 CHECK_HISTORY (p2, 2, 3, 2);
555 CHECK_HISTORY (p3, 2, 3, 40);
556 p1 = p->CreateFragment (0, 5);
557 CHECK_HISTORY (p1, 1, 5);
559 p3 = Create<Packet> (50);
561 CHECK_HISTORY (p3, 2, 8, 50);
562 CHECK_HISTORY (p1, 1, 5);
564 CHECK_HISTORY (p1, 3, 5, 8, 50);
566 CHECK_HISTORY (p1, 4, 5, 5, 8, 50);
568 CHECK_HISTORY (p1, 5, 5, 5, 8, 50, 2);
570 CHECK_HISTORY (p1, 4, 5, 8, 50, 2);
571 p1->RemoveAtEnd (60);
572 CHECK_HISTORY (p1, 1, 5);
574 CHECK_HISTORY (p1, 2, 8, 2);
575 CHECK_HISTORY (p2, 2, 3, 2);
577 p3 = Create<Packet> (40);
580 CHECK_HISTORY (p3, 3, 5, 5, 40);
581 p1 = p3->CreateFragment (0, 5);
583 CHECK_HISTORY (p1, 1, 5);
584 CHECK_HISTORY (p2, 1, 5);
586 CHECK_HISTORY (p1, 2, 5, 5);
588 p = Create<Packet> (0);
589 CHECK_HISTORY (p, 0);
591 p3 = Create<Packet> (0);
594 CHECK_HISTORY (p3, 2, 5, 5);
595 p1 = p3->CreateFragment (0, 4);
597 CHECK_HISTORY (p1, 1, 4);
598 CHECK_HISTORY (p2, 1, 1);
600 CHECK_HISTORY (p1, 2, 4, 1);
603 p = Create<Packet> (2000);
604 CHECK_HISTORY (p, 1, 2000);
606 p = Create<Packet> ();
609 p1 = p->CreateFragment (0, 8);
612 CHECK_HISTORY (p, 2, 5, 10);
614 p = Create<Packet> ();
618 CHECK_HISTORY (p, 1, 10);
620 p = Create<Packet> ();
624 CHECK_HISTORY (p, 1, 10);
626 p = Create<Packet> ();
629 CHECK_HISTORY (p, 2, 10, 10);
631 p = Create<Packet> (10);
635 p->RemoveAtStart (8+10+8);
636 CHECK_HISTORY (p, 1, 8);
638 p = Create<Packet> (0);
641 CHECK_HISTORY (p, 0);
643 p = Create<Packet> (0);
646 CHECK_HISTORY (p, 0);
648 p = Create<Packet> (0);
650 p->RemoveAtStart (8);
651 CHECK_HISTORY (p, 0);
653 p = Create<Packet> (0);
658 CHECK_HISTORY (p, 0);
660 p = Create<Packet> (0);
665 CHECK_HISTORY (p, 0);
667 p = Create<Packet> (0);
671 p->RemoveAtStart (8);
672 CHECK_HISTORY (p, 0);
674 p = Create<Packet> (0);
679 CHECK_HISTORY (p, 0);
681 p = Create<Packet> (0);
686 CHECK_HISTORY (p, 0);
688 p = Create<Packet> (0);
692 p->RemoveAtStart (8);
693 CHECK_HISTORY (p, 0);
695 p = Create<Packet> (16383);
696 p = Create<Packet> (16384);
700 p = Create<Packet> (40);
710 p = Create<Packet> (1000);
717 NS_TEST_EXPECT_MSG_EQ (p->GetSize (), 1015,
"Correct size");
720 p = Create<Packet> (1510);
725 p1 = p->CreateFragment (0, 1500);
728 NS_TEST_EXPECT_MSG_EQ (p->GetSize (), 1519,
"Correct size");
730 p = Create<Packet> (1000);
734 CHECK_HISTORY (p1, 3, 2, 1000, 3);
737 CHECK_HISTORY (p, 3, 1, 1000, 3);
738 CHECK_HISTORY (p1, 3, 2, 1000, 3);
740 p = Create<Packet> (200);
742 p1 = p->CreateFragment (0, 100);
743 p2 = p->CreateFragment (100, 100);
746 p = Create<Packet> ();
748 p1 = Create<Packet> ();
753 p = Create<Packet> (500);
754 CHECK_HISTORY (p, 1, 500);
756 CHECK_HISTORY (p, 2, 10, 500);
758 CHECK_HISTORY (p, 1, 500);
760 CHECK_HISTORY (p, 1, 490);
762 p = Create<Packet> (500);
763 CHECK_HISTORY (p, 1, 500);
765 CHECK_HISTORY (p, 2, 500, 10);
767 CHECK_HISTORY (p, 1, 500);
768 p->RemoveAtStart (10);
769 CHECK_HISTORY (p, 1, 490);
772 p = Create<Packet> (500);
776 CHECK_HISTORY (p, 4, 5, 20, 10, 500);
777 p1 = p->CreateFragment (0,6);
778 p2 = p->CreateFragment (6,535-6);
782 p = Create<Packet> (
reinterpret_cast<const uint8_t*
> (
"hello world"), 11);
784 CHECK_HISTORY (p, 2, 2, 11);
785 p1 = p->CreateFragment (0, 5);
786 CHECK_HISTORY (p1, 2, 2, 3);
787 p2 = p->CreateFragment (5, 8);
788 CHECK_HISTORY (p2, 1, 8);
790 ADD_HEADER (p1, 8+2+2*6);
792 CHECK_HISTORY (p1, 4, 22, 2, 3, 4);
793 ADD_HEADER (p2, 8+2+2*6);
795 CHECK_HISTORY (p2, 3, 22, 8, 4);
798 REM_HEADER (p1, 8+2+2*6);
799 CHECK_HISTORY (p1, 2, 2, 3);
801 REM_HEADER (p2, 8+2+2*6);
802 CHECK_HISTORY (p2, 1, 8);
805 CHECK_HISTORY (p3, 2, 2, 3);
807 CHECK_HISTORY (p3, 2, 2, 11);
809 CHECK_HISTORY (p, 2, 2, 11);
811 CHECK_HISTORY (p, 1, 11);
813 CHECK_HISTORY (p3, 1, 11);
815 uint8_t *buf =
new uint8_t[p3->GetSize ()];
816 p3->CopyData (buf, p3->GetSize ());
817 std::string msg = std::string (reinterpret_cast<const char *>(buf),
820 NS_TEST_EXPECT_MSG_EQ (msg, std::string (
"hello world"),
"Could not find original data in received packet");
829 PacketMetadataTestSuite::PacketMetadataTestSuite ()
TypeId AddConstructor(void)
#define NS_ASSERT(condition)
virtual void Serialize(Buffer::Iterator start) const
iterator in a Buffer instance
Callback< ObjectBase * > GetConstructor(void) const
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
void AddAtEnd(Ptr< const Packet > packet)
virtual uint32_t Deserialize(Buffer::Iterator start)
virtual TypeId GetInstanceTypeId(void) const
Protocol trailer serialization and deserialization.
PacketMetadata::ItemIterator BeginItem(void) const
virtual uint32_t GetSerializedSize(void) const
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual test case to this test suite.
void WriteU8(uint8_t data)
virtual void Print(std::ostream &os) const
a unique identifier for an interface.
TypeId SetParent(TypeId tid)