From 993dc85f8f4321cc9f3b4dc536f53d7d539fd557 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Thu, 28 Jun 2007 11:07:38 +0200 Subject: [PATCH] change default pretty printing output format, add doc to metadata data structures --- src/common/packet-metadata.cc | 5 +-- src/common/packet-metadata.h | 59 +++++++++++++++++++++++++++++--- src/common/packet-printer.cc | 25 ++++++++++---- src/common/packet-printer.h | 11 ++++++ src/internet-node/ipv4-header.cc | 56 +++++++++++++++++------------- src/internet-node/udp-header.cc | 11 +++--- src/node/llc-snap-header.cc | 6 ++-- 7 files changed, 128 insertions(+), 45 deletions(-) diff --git a/src/common/packet-metadata.cc b/src/common/packet-metadata.cc index 4db064d99..120c742f7 100644 --- a/src/common/packet-metadata.cc +++ b/src/common/packet-metadata.cc @@ -953,13 +953,14 @@ PacketMetadata::DoPrint (struct PacketMetadata::SmallItem *item, uint32_t curren // payload. printer.PrintPayload (os, extraItem.packetUid, item->size, extraItem.fragmentStart, - extraItem.fragmentEnd); + item->size - extraItem.fragmentEnd); } else if (extraItem.fragmentStart != 0 || extraItem.fragmentEnd != item->size) { printer.PrintChunkFragment (uid, os, extraItem.packetUid, item->size, - extraItem.fragmentStart, extraItem.fragmentEnd); + extraItem.fragmentStart, + item->size - extraItem.fragmentEnd); } else if (PacketPrinter::IsHeader (uid)) { diff --git a/src/common/packet-metadata.h b/src/common/packet-metadata.h index cb96ddd10..839286950 100644 --- a/src/common/packet-metadata.h +++ b/src/common/packet-metadata.h @@ -66,27 +66,71 @@ public: static void PrintStats (void); private: - /** - head -(next)-> tail - ^ | - \---(prev)---| - */ struct Data { + /* number of references to this struct Data instance. */ uint16_t m_count; + /* size (in bytes) of m_data buffer below */ uint16_t m_size; + /* max of the m_used field over all objects which + * reference this struct Data instance */ uint16_t m_dirtyEnd; + /* variable-sized buffer of bytes */ uint8_t m_data[10]; }; + /* Note that since the next and prev fields are 16 bit integers + and since the value 0xffff is reserved to identify the + fact that the end or the start of the list is reached, + only a limited number of elements can be stored in + a m_data byte buffer. + */ struct SmallItem { + /* offset (in bytes) from start of m_data buffer + to next element in linked list. value is 0xffff + if next element does not exist. + */ uint16_t next; + /* offset (in bytes) from start of m_data buffer + to previous element in linked list. value is 0xffff + if previous element does not exist. + */ uint16_t prev; + /* the high 31 bits of this field identify the + type of the header or trailer represented by + this item: the value zero represents payload. + If the low bit of this uid is one, an ExtraItem + structure follows this SmallItem structure. + */ uint32_t typeUid; + /* the size (in bytes) of the header or trailer represented + by this element. + */ uint32_t size; + /* this field tries to uniquely identify each header or + trailer _instance_ while the typeUid field uniquely + identifies each header or trailer _type_. This field + is used to test whether two items are equal in the sense + that they represent the same header or trailer instance. + That equality test is based on the typeUid and chunkUid + fields so, the likelyhood that two header instances + share the same chunkUid _and_ typeUid is very small + unless they are really representations of the same header + instance. + */ uint16_t chunkUid; }; struct ExtraItem { + /* offset (in bytes) from start of original header to + the start of the fragment still present. + */ uint32_t fragmentStart; + /* offset (in bytes) from start of original header to + the end of the fragment still present. + */ uint32_t fragmentEnd; + /* the packetUid of the packet in which this header or trailer + was first added. It could be different from the m_packetUid + field if the user has aggregated multiple packets into one. + */ uint32_t packetUid; }; @@ -138,6 +182,11 @@ private: static uint16_t m_chunkUid; struct Data *m_data; + /** + head -(next)-> tail + ^ | + \---(prev)---| + */ uint16_t m_head; uint16_t m_tail; uint16_t m_used; diff --git a/src/common/packet-printer.cc b/src/common/packet-printer.cc index 37cddbf59..4dfebf6dc 100644 --- a/src/common/packet-printer.cc +++ b/src/common/packet-printer.cc @@ -78,7 +78,7 @@ PacketPrinter::CreateStaticDefault (void) static PacketPrinter tmp; tmp.PrintForward (); tmp.AddPayloadPrinter (MakeCallback (&PacketPrinter::DoDefaultPrintPayload)); - tmp.SetSeparator ("\n"); + tmp.SetSeparator (" "); return &tmp; } @@ -158,9 +158,15 @@ PacketPrinter::DoDefaultPrintPayload (std::ostream & os, uint32_t size, struct PacketPrinter::FragmentInformation info) { - os << "data "; - os << "[" << info.start << ":" << info.end << "] -> " - << "[0:" << size << "]"; + os << "DATA (" + << "length " << size - (info.end + info.start); + if (info.start != 0 || info.end != 0) + { + os << " " + << "trim_start " << info.start << " " + << "trim_end " << info.end; + } + os << ")"; } void @@ -180,9 +186,14 @@ PacketPrinter::DoDefaultPrintFragment (std::ostream & os, std::string &name, struct PacketPrinter::FragmentInformation info) { - os << name << " "; - os << "[" << info.start << ":" << info.end << "] -> " - << "[0:" << size << "]"; + NS_ASSERT (info.start != 0 || info.end != 0); + os << name << " " + << "(" + << "length " << size - (info.end + info.start) << " " + << "trim_start " << info.start << " " + << "trim_end " << info.end + << ")" + ; } void diff --git a/src/common/packet-printer.h b/src/common/packet-printer.h index 9db70be9c..cd340545d 100644 --- a/src/common/packet-printer.h +++ b/src/common/packet-printer.h @@ -43,9 +43,19 @@ class Chunk; class PacketPrinter { public: + /** + * \brief indicates how many bytes were trimmed from a header + * or a trailer. + */ struct FragmentInformation { + /** + * The number of bytes trimmed from the start of the header or the trailer. + */ uint32_t start; + /** + * The number of bytes trimmed from the end of the header or the trailer. + */ uint32_t end; }; /** @@ -297,6 +307,7 @@ template void PacketPrinter::DoDefaultPrint (std::ostream &os, uint32_t packetUid, uint32_t size, const T *chunk) { + os << chunk->GetName () << " "; chunk->Print (os); } diff --git a/src/internet-node/ipv4-header.cc b/src/internet-node/ipv4-header.cc index 6242bec23..44bc46fd2 100644 --- a/src/internet-node/ipv4-header.cc +++ b/src/internet-node/ipv4-header.cc @@ -28,17 +28,6 @@ NS_DEBUG_COMPONENT_DEFINE ("Ipv4Header"); namespace ns3 { -static uint16_t -UtilsNtoh16 (uint16_t v) -{ - uint16_t val; - uint8_t *array; - array = (uint8_t *)&v; - val = (array[0] << 8) | (array[1] << 0); - return val; -} - - bool Ipv4Header::m_calcChecksum = false; Ipv4Header::Ipv4Header () @@ -193,24 +182,45 @@ Ipv4Header::IsChecksumOk (void) const std::string Ipv4Header::DoGetName (void) const { - return "Ipv4"; + return "IPV4"; } void Ipv4Header::PrintTo (std::ostream &os) const { // ipv4, right ? - os << "(ipv4)" - << " tos=" << (uint32_t)m_tos - << ", payload length=" << UtilsNtoh16 (m_payloadSize) - << ", id=" << m_identification - << ", " << (IsLastFragment ()?"last":"more") - << ", " << (IsDontFragment ()?"dont":"may") - << ", frag offset=" << m_fragmentOffset - << ", ttl=" << m_ttl - << ", protocol=" << m_protocol - << ", source=" << m_source - << ", destination=" << m_destination; + std::string flags; + if (m_flags == 0) + { + flags = "none"; + } + else if (m_flags & MORE_FRAGMENTS && + m_flags & DONT_FRAGMENT) + { + flags = "MF|DF"; + } + else if (m_flags & DONT_FRAGMENT) + { + flags = "DF"; + } + else if (m_flags & MORE_FRAGMENTS) + { + flags = "MF"; + } + else + { + flags = "XX"; + } + os << "(" + << "tos 0x" << std::hex << m_tos << std::dec << " " + << "ttl " << m_ttl << " " + << "id " << m_identification << " " + << "offset " << m_fragmentOffset << " " + << "flags [" << flags << "] " + << "length: " << (m_payloadSize + 5 * 4) + << ") " + << m_source << " > " << m_destination + ; } uint32_t Ipv4Header::GetSerializedSize (void) const diff --git a/src/internet-node/udp-header.cc b/src/internet-node/udp-header.cc index c4ef2642d..a7a95ca49 100644 --- a/src/internet-node/udp-header.cc +++ b/src/internet-node/udp-header.cc @@ -94,16 +94,17 @@ UdpHeader::InitializeChecksum (Ipv4Address source, std::string UdpHeader::DoGetName (void) const { - return "Udp"; + return "UDP"; } void UdpHeader::PrintTo (std::ostream &os) const { - os << "(udp)" - << ", port source=" << m_sourcePort - << ", port destination=" << m_destinationPort - << ", length=" << m_payloadSize; + os << "(" + << "length: " << m_payloadSize + GetSize () + << ") " + << m_sourcePort << " > " << m_destinationPort + ; } uint32_t diff --git a/src/node/llc-snap-header.cc b/src/node/llc-snap-header.cc index b7bd73121..ee37ffecf 100644 --- a/src/node/llc-snap-header.cc +++ b/src/node/llc-snap-header.cc @@ -50,17 +50,17 @@ LlcSnapHeader::GetSerializedSize (void) const std::string LlcSnapHeader::DoGetName (void) const { - return "LlcSnap"; + return "LLCSNAP"; } void LlcSnapHeader::PrintTo (std::ostream &os) const { - os << "(mac)" - << " EtherType: "; + os << "(type 0x"; os.setf (std::ios::hex, std::ios::basefield); os << m_etherType; os.setf (std::ios::dec, std::ios::basefield); + os << ")"; } void