INET Framework for OMNeT++/OMNEST
inet::PacketPrinter Class Reference

#include <PacketPrinter.h>

Inheritance diagram for inet::PacketPrinter:

Classes

class  Context
 
class  DirectiveResolver
 

Public Member Functions

virtual int getScoreFor (cMessage *msg) const override
 
virtual std::set< std::string > getSupportedTags () const override
 
virtual std::set< std::string > getDefaultEnabledTags () const override
 
virtual std::vector< std::string > getColumnNames (const Options *options) const override
 
virtual void printMessage (std::ostream &stream, cMessage *message) const
 
virtual void printMessage (std::ostream &stream, cMessage *message, const Options *options) const override
 
virtual void printPacket (std::ostream &stream, Packet *packet, const char *format=nullptr) const
 
virtual void printPacket (std::ostream &stream, Packet *packet, const Options *options, const char *format=nullptr) const
 
virtual std::string printPacketToString (Packet *packet, const char *format=nullptr) const
 
virtual std::string printPacketToString (Packet *packet, const Options *options, const char *format=nullptr) const
 

Protected Member Functions

virtual bool isEnabledOption (const Options *options, const char *name) const
 
virtual bool isEnabledInfo (const Options *options, const Protocol *protocol) const
 
virtual const ProtocolPrintergetProtocolPrinter (const Protocol *protocol) const
 
virtual void printContext (std::ostream &stream, const Options *options, Context &context) const
 
virtual void printPacket (Packet *packet, const Options *options, Context &context) const
 
virtual void printPacketInsideOut (const Ptr< const PacketDissector::ProtocolDataUnit > &protocolDataUnit, const Options *options, Context &context) const
 
virtual void printPacketLeftToRight (const Ptr< const PacketDissector::ProtocolDataUnit > &protocolDataUnit, const Options *options, Context &context) const
 
virtual void printSourceColumn (const std::string source, const Protocol *protocol, const Options *options, Context &context) const
 
virtual void printDestinationColumn (const std::string destination, const Protocol *protocol, const Options *options, Context &context) const
 
virtual void printProtocolColumn (const Protocol *protocol, const Options *options, Context &context) const
 
virtual void printLengthColumn (const Ptr< const PacketDissector::ProtocolDataUnit > &protocolDataUnit, const Options *options, Context &context) const
 

Protected Attributes

int numPacket = 0
 

Member Function Documentation

◆ getColumnNames()

std::vector< std::string > inet::PacketPrinter::getColumnNames ( const Options *  options) const
overridevirtual
100 {
101  std::vector<std::string> columnNames;
102  if (isEnabledOption(options, "Show 'Source' column"))
103  columnNames.push_back("Source");
104  if (isEnabledOption(options, "Show 'Destination' column"))
105  columnNames.push_back("Destination");
106  if (isEnabledOption(options, "Show 'Protocol' column"))
107  columnNames.push_back("Protocol");
108  if (isEnabledOption(options, "Show 'Type' column"))
109  columnNames.push_back("Type");
110  if (isEnabledOption(options, "Show 'Length' column"))
111  columnNames.push_back("Length");
112  if (isEnabledOption(options, "Show 'Info' column"))
113  columnNames.push_back("Info");
114  return columnNames;
115 }

◆ getDefaultEnabledTags()

std::set< std::string > inet::PacketPrinter::getDefaultEnabledTags ( ) const
overridevirtual
93 {
94  return { "Print inside out",
95  "Show 'Source' column", "Show 'Destination' column", "Show 'Protocol' column", "Show 'Type' column", "Show 'Length' column", "Show 'Info' column",
96  "Show auto source fields", "Show auto destination fields", "Show auto info" };
97 }

Referenced by printMessage(), and printPacket().

◆ getProtocolPrinter()

const ProtocolPrinter & inet::PacketPrinter::getProtocolPrinter ( const Protocol protocol) const
protectedvirtual
76 {
78  if (protocolPrinter == nullptr)
80  return *protocolPrinter;
81 }

Referenced by printPacketInsideOut(), and printPacketLeftToRight().

◆ getScoreFor()

int inet::PacketPrinter::getScoreFor ( cMessage *  msg) const
overridevirtual
50 {
51  return msg->isPacket() ? 100 : 0;
52 }

◆ getSupportedTags()

std::set< std::string > inet::PacketPrinter::getSupportedTags ( ) const
overridevirtual
84 {
85  return { "Print inside out", "Print left to right",
86  "Show 'Source' column", "Show 'Destination' column", "Show 'Protocol' column", "Show 'Type' column", "Show 'Length' column", "Show 'Info' column",
87  "Show all PDU source fields", "Show all PDU destination fields", "Show all PDU protocols", "Show all PDU lengths",
88  "Show physical layer info", "Show link layer info", "Show network layer info", "Show transport layer info", "Show all info", "Show innermost info",
89  "Show auto source fields", "Show auto destination fields", "Show auto info" };
90 }

◆ isEnabledInfo()

bool inet::PacketPrinter::isEnabledInfo ( const Options *  options,
const Protocol protocol 
) const
protectedvirtual
60 {
61  if (isEnabledOption(options, "Show all info"))
62  return true;
63  if (protocol) {
64  switch (protocol->getLayer()) {
65  case Protocol::PhysicalLayer: return isEnabledOption(options, "Show physical layer info");
66  case Protocol::LinkLayer: return isEnabledOption(options, "Show link layer info");
67  case Protocol::NetworkLayer: return isEnabledOption(options, "Show network layer info");
68  case Protocol::TransportLayer: return isEnabledOption(options, "Show transport layer info");
69  default: break;
70  }
71  }
72  return false;
73 }

Referenced by printPacketInsideOut(), and printPacketLeftToRight().

◆ isEnabledOption()

bool inet::PacketPrinter::isEnabledOption ( const Options *  options,
const char *  name 
) const
protectedvirtual

◆ printContext()

void inet::PacketPrinter::printContext ( std::ostream &  stream,
const Options *  options,
Context context 
) const
protectedvirtual
118 {
119  if (!context.isCorrect)
120  stream << "\x1b[103m";
121  stream << "\x1b[30m";
122  if (isEnabledOption(options, "Show 'Source' column"))
123  stream << context.sourceColumn.str() << "\t";
124  if (isEnabledOption(options, "Show 'Destination' column"))
125  stream << context.destinationColumn.str() << "\t";
126  if (isEnabledOption(options, "Show 'Protocol' column"))
127  stream << "\x1b[34m" << context.protocolColumn.str() << "\x1b[30m\t";
128  if (isEnabledOption(options, "Show 'Type' column"))
129  stream << "\x1b[34m" << context.typeColumn.str() << "\x1b[30m\t";
130  if (isEnabledOption(options, "Show 'Length' column"))
131  stream << context.lengthColumn.str() << "\t";
132  if (isEnabledOption(options, "Show 'Info' column"))
133  stream << context.infoColumn.str();
134  stream << std::endl;
135 }

Referenced by printMessage(), and printPacket().

◆ printDestinationColumn()

void inet::PacketPrinter::printDestinationColumn ( const std::string  destination,
const Protocol protocol,
const Options *  options,
Context context 
) const
protectedvirtual
323 {
324  if (destination.length() != 0) {
325  bool concatenate = isEnabledOption(options, "Show all PDU destination fields") ||
326  (isEnabledOption(options, "Show auto destination fields") && !(protocol && protocol->getLayer() == Protocol::NetworkLayer));
327  if (!concatenate)
328  context.destinationColumn.str("");
329  else if (context.destinationColumn.str().length() != 0)
330  context.destinationColumn << ":";
331  context.destinationColumn << destination;
332  }
333 }

Referenced by printPacketInsideOut(), and printPacketLeftToRight().

◆ printLengthColumn()

void inet::PacketPrinter::printLengthColumn ( const Ptr< const PacketDissector::ProtocolDataUnit > &  protocolDataUnit,
const Options *  options,
Context context 
) const
protectedvirtual
347 {
348  auto lengthColumnLength = context.lengthColumn.str().length();
349  if (lengthColumnLength == 0 || isEnabledOption(options, "Show all PDU lengths")) {
350  if (lengthColumnLength != 0)
351  context.lengthColumn << ", ";
352  context.lengthColumn << protocolDataUnit->getChunkLength();
353  }
354 }

Referenced by printPacketInsideOut(), and printPacketLeftToRight().

◆ printMessage() [1/2]

void inet::PacketPrinter::printMessage ( std::ostream &  stream,
cMessage *  message 
) const
virtual
138 {
139  Options options;
140  options.enabledTags = getDefaultEnabledTags();
141  printMessage(stream, message, &options);
142 }

◆ printMessage() [2/2]

void inet::PacketPrinter::printMessage ( std::ostream &  stream,
cMessage *  message,
const Options *  options 
) const
overridevirtual
145 {
146  Context context;
147  for (auto cpacket = dynamic_cast<cPacket *>(message); cpacket != nullptr; cpacket = cpacket->getEncapsulatedPacket()) {
148  if (false) ;
149 #ifdef INET_WITH_PHYSICALLAYERWIRELESSCOMMON
150  else if (auto signal = dynamic_cast<physicallayer::Signal *>(cpacket))
151  printSignal(signal, options, context);
152 #endif // INET_WITH_PHYSICALLAYERWIRELESSCOMMON
153  else if (auto packet = dynamic_cast<Packet *>(cpacket))
154  printPacket(packet, options, context);
155  else
156  context.infoColumn << cpacket->str();
157  }
158  printContext(stream, options, context);
159 }

◆ printPacket() [1/3]

void inet::PacketPrinter::printPacket ( Packet packet,
const Options *  options,
Context context 
) const
protectedvirtual
204 {
205  PacketDissector::PduTreeBuilder pduTreeBuilder;
206  try {
207  PacketDissector packetDissector(ProtocolDissectorRegistry::globalRegistry, pduTreeBuilder);
208  packetDissector.dissectPacket(packet);
209  }
210  catch (cRuntimeError& e) {
211  // NOTE: don't propagate errors from printPacket, becaue it can break Qtenv for example
212  context.infoColumn << e.what() << ": ";
213  }
214  const auto& protocolDataUnit = pduTreeBuilder.getTopLevelPdu();
215  if (protocolDataUnit != nullptr) {
216  if (pduTreeBuilder.isSimplyEncapsulatedPacket() && isEnabledOption(options, "Print inside out"))
217  const_cast<PacketPrinter *>(this)->printPacketInsideOut(protocolDataUnit, options, context);
218  else
219  const_cast<PacketPrinter *>(this)->printPacketLeftToRight(protocolDataUnit, options, context);
220  }
221 }

Referenced by printMessage(), printPacket(), and printPacketToString().

◆ printPacket() [2/3]

void inet::PacketPrinter::printPacket ( std::ostream &  stream,
Packet packet,
const char *  format = nullptr 
) const
virtual
183 {
184  Options options;
185  options.enabledTags = getDefaultEnabledTags();
186  printPacket(stream, packet, &options, format);
187 }

◆ printPacket() [3/3]

void inet::PacketPrinter::printPacket ( std::ostream &  stream,
Packet packet,
const Options *  options,
const char *  format = nullptr 
) const
virtual
190 {
191  Context context;
192  printPacket(packet, options, context);
193  if (format == nullptr)
194  printContext(stream, options, context);
195  else {
196  DirectiveResolver directiveResolver(context, numPacket++);
197  StringFormat stringFormat;
198  stringFormat.parseFormat(format);
199  stream << stringFormat.formatString(&directiveResolver);
200  }
201 }

◆ printPacketInsideOut()

void inet::PacketPrinter::printPacketInsideOut ( const Ptr< const PacketDissector::ProtocolDataUnit > &  protocolDataUnit,
const Options *  options,
Context context 
) const
protectedvirtual
238 {
239  auto protocol = protocolDataUnit->getProtocol();
240  context.isCorrect &= protocolDataUnit->isCorrect();
241  printLengthColumn(protocolDataUnit, options, context);
242  for (const auto& chunk : protocolDataUnit->getChunks()) {
243  if (auto childLevel = dynamicPtrCast<const PacketDissector::ProtocolDataUnit>(chunk))
244  printPacketInsideOut(childLevel, options, context);
245  else {
246  auto& protocolPrinter = getProtocolPrinter(protocol);
247  ProtocolPrinter::Context protocolContext;
248  protocolPrinter.print(chunk, protocol, options, protocolContext);
249  if (protocolDataUnit->getLevel() > context.infoLevel) {
250  context.infoLevel = protocolDataUnit->getLevel();
251  printSourceColumn(protocolContext.sourceColumn.str(), protocol, options, context);
252  printDestinationColumn(protocolContext.destinationColumn.str(), protocol, options, context);
253  printProtocolColumn(protocol, options, context);
254  // prepend info column
255  bool showAutoInfo = isEnabledOption(options, "Show auto info");
256  bool showInnermostInfo = isEnabledOption(options, "Show innermost info");
257  if (showAutoInfo || showInnermostInfo || isEnabledInfo(options, protocol)) {
258  if (showInnermostInfo && !(showAutoInfo && protocol == nullptr)) {
259  context.typeColumn.str("");
260  context.infoColumn.str("");
261  }
262  if (protocolContext.typeColumn.str().length() != 0) {
263  if (context.typeColumn.str().length() != 0)
264  protocolContext.typeColumn << " | ";
265  context.typeColumn.str(protocolContext.typeColumn.str() + context.typeColumn.str());
266  }
267  if (protocolContext.infoColumn.str().length() != 0) {
268  if (context.infoColumn.str().length() != 0)
269  protocolContext.infoColumn << " | ";
270  context.infoColumn.str(protocolContext.infoColumn.str() + context.infoColumn.str());
271  }
272  }
273  }
274  }
275  }
276 }

Referenced by printPacket().

◆ printPacketLeftToRight()

void inet::PacketPrinter::printPacketLeftToRight ( const Ptr< const PacketDissector::ProtocolDataUnit > &  protocolDataUnit,
const Options *  options,
Context context 
) const
protectedvirtual
279 {
280  auto protocol = protocolDataUnit->getProtocol();
281  context.isCorrect &= protocolDataUnit->isCorrect();
282  printLengthColumn(protocolDataUnit, options, context);
283  for (const auto& chunk : protocolDataUnit->getChunks()) {
284  if (auto childLevel = dynamicPtrCast<const PacketDissector::ProtocolDataUnit>(chunk))
285  printPacketLeftToRight(childLevel, options, context);
286  else {
287  auto& protocolPrinter = getProtocolPrinter(protocol);
288  ProtocolPrinter::Context protocolContext;
289  protocolPrinter.print(chunk, protocol, options, protocolContext);
290  if (protocolDataUnit->getLevel() > context.infoLevel) {
291  context.infoLevel = protocolDataUnit->getLevel();
292  printSourceColumn(protocolContext.sourceColumn.str(), protocol, options, context);
293  printDestinationColumn(protocolContext.destinationColumn.str(), protocol, options, context);
294  printProtocolColumn(protocol, options, context);
295  }
296  // append info column
297  if (isEnabledInfo(options, protocol)) {
298  if (context.typeColumn.str().length() != 0)
299  context.typeColumn << " | ";
300  context.typeColumn << protocolContext.typeColumn.str();
301  if (context.infoColumn.str().length() != 0)
302  context.infoColumn << " | ";
303  context.infoColumn << protocolContext.infoColumn.str();
304  }
305  }
306  }
307 }

Referenced by printPacket().

◆ printPacketToString() [1/2]

std::string inet::PacketPrinter::printPacketToString ( Packet packet,
const char *  format = nullptr 
) const
virtual
224 {
225  std::stringstream stream;
226  printPacket(stream, packet, format);
227  return stream.str();
228 }

Referenced by inet::ExtLowerUdp::processPacketFromLower(), and inet::PcapRecorder::recordPacket().

◆ printPacketToString() [2/2]

std::string inet::PacketPrinter::printPacketToString ( Packet packet,
const Options *  options,
const char *  format = nullptr 
) const
virtual
231 {
232  std::stringstream stream;
233  printPacket(stream, packet, options, format);
234  return stream.str();
235 }

◆ printProtocolColumn()

void inet::PacketPrinter::printProtocolColumn ( const Protocol protocol,
const Options *  options,
Context context 
) const
protectedvirtual
336 {
337  if (protocol != nullptr) {
338  if (!isEnabledOption(options, "Show all PDU protocols"))
339  context.protocolColumn.str("");
340  else if (context.protocolColumn.str().length() != 0)
341  context.protocolColumn << ", ";
342  context.protocolColumn << protocol->getDescriptiveName();
343  }
344 }

Referenced by printPacketInsideOut(), and printPacketLeftToRight().

◆ printSourceColumn()

void inet::PacketPrinter::printSourceColumn ( const std::string  source,
const Protocol protocol,
const Options *  options,
Context context 
) const
protectedvirtual
310 {
311  if (source.length() != 0) {
312  bool concatenate = isEnabledOption(options, "Show all PDU source fields") ||
313  (isEnabledOption(options, "Show auto source fields") && !(protocol && protocol->getLayer() == Protocol::NetworkLayer));
314  if (!concatenate)
315  context.sourceColumn.str("");
316  else if (context.sourceColumn.str().length() != 0)
317  context.sourceColumn << ":";
318  context.sourceColumn << source;
319  }
320 }

Referenced by printPacketInsideOut(), and printPacketLeftToRight().

Member Data Documentation

◆ numPacket

int inet::PacketPrinter::numPacket = 0
mutableprotected

Referenced by printPacket().


The documentation for this class was generated from the following files:
inet::PacketPrinter::getProtocolPrinter
virtual const ProtocolPrinter & getProtocolPrinter(const Protocol *protocol) const
Definition: PacketPrinter.cc:75
protocol
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down protocol
Definition: IUdp-gates.txt:25
inet::PacketPrinter::isEnabledOption
virtual bool isEnabledOption(const Options *options, const char *name) const
Definition: PacketPrinter.cc:54
inet::units::constants::e
const value< double, units::C > e(1.602176487e-19)
inet::PacketPrinter::printPacketLeftToRight
virtual void printPacketLeftToRight(const Ptr< const PacketDissector::ProtocolDataUnit > &protocolDataUnit, const Options *options, Context &context) const
Definition: PacketPrinter.cc:278
inet::Protocol::LinkLayer
@ LinkLayer
Definition: Protocol.h:23
inet::PacketPrinter::numPacket
int numPacket
Definition: PacketPrinter.h:48
inet::PacketPrinter::printPacketInsideOut
virtual void printPacketInsideOut(const Ptr< const PacketDissector::ProtocolDataUnit > &protocolDataUnit, const Options *options, Context &context) const
Definition: PacketPrinter.cc:237
inet::PacketPrinter::printProtocolColumn
virtual void printProtocolColumn(const Protocol *protocol, const Options *options, Context &context) const
Definition: PacketPrinter.cc:335
inet::contains
bool contains(const std::vector< T > &v, const Tk &a)
Definition: stlutils.h:65
inet::PacketPrinter::isEnabledInfo
virtual bool isEnabledInfo(const Options *options, const Protocol *protocol) const
Definition: PacketPrinter.cc:59
inet::PacketPrinter::getDefaultEnabledTags
virtual std::set< std::string > getDefaultEnabledTags() const override
Definition: PacketPrinter.cc:92
inet::Protocol::TransportLayer
@ TransportLayer
Definition: Protocol.h:23
inet::ProtocolPrinterRegistry::globalRegistry
static ProtocolPrinterRegistry globalRegistry
Definition: ProtocolPrinterRegistry.h:21
inet::Protocol::PhysicalLayer
@ PhysicalLayer
Definition: Protocol.h:23
inet::Protocol::NetworkLayer
@ NetworkLayer
Definition: Protocol.h:23
inet::ProtocolPrinterRegistry::findProtocolPrinter
const ProtocolPrinter * findProtocolPrinter(const Protocol *protocol) const
Definition: ProtocolPrinterRegistry.cc:25
inet::PacketPrinter::printPacket
virtual void printPacket(Packet *packet, const Options *options, Context &context) const
Definition: PacketPrinter.cc:203
inet::PacketPrinter::printContext
virtual void printContext(std::ostream &stream, const Options *options, Context &context) const
Definition: PacketPrinter.cc:117
inet::PacketPrinter::printDestinationColumn
virtual void printDestinationColumn(const std::string destination, const Protocol *protocol, const Options *options, Context &context) const
Definition: PacketPrinter.cc:322
inet::ProtocolDissectorRegistry::globalRegistry
static ProtocolDissectorRegistry globalRegistry
Definition: ProtocolDissectorRegistry.h:21
inet::PacketPrinter::printSourceColumn
virtual void printSourceColumn(const std::string source, const Protocol *protocol, const Options *options, Context &context) const
Definition: PacketPrinter.cc:309
inet::PacketPrinter::printMessage
virtual void printMessage(std::ostream &stream, cMessage *message) const
Definition: PacketPrinter.cc:137
inet::PacketPrinter::printLengthColumn
virtual void printLengthColumn(const Ptr< const PacketDissector::ProtocolDataUnit > &protocolDataUnit, const Options *options, Context &context) const
Definition: PacketPrinter.cc:346