senf::PacketParserBase Class Reference
[The PacketParser facility]

Parser Base class. More...

#include <senf/Packets/PacketParser.hh>

Inherited by
senf::ArrayParser< elements, ElementParser >,
senf::DTCPHelloPacketParser,
senf::DTCPIPv4AddressListParser,
senf::DTCPIPv6AddressListParser,
senf::EthernetPacketParser,
senf::EthVLanPacketParser,
senf::FlagParser< Bit >,
senf::GREChecksumParser,
senf::GREPacketParser,
senf::ICMPv6EchoReplyParser,
senf::ICMPv6EchoRequestParser,
senf::ICMPv6ErrDestUnreachableParser,
senf::ICMPv6ErrParamProblemParser,
senf::ICMPv6ErrTimeExceededParser,
senf::ICMPv6ErrTooBigParser,
senf::ICMPv6PacketParser,
senf::Int16LSBParser,
senf::Int16Parser,
senf::Int24Parser,
senf::Int32Parser,
senf::Int64Parser,
senf::Int8Parser,
senf::IntFieldParser< Start, End >,
senf::IPv4PacketParser,
senf::IPv6DestinationOptionsPacketParser,
senf::IPv6FragmentPacketParser,
senf::IPv6HopByHopOptionsPacketParser,
senf::IPv6OptionParser,
senf::IPv6PacketParser,
senf::IPv6RoutingPacketParser,
senf::ListParser< ListPolicy >,
senf::LlcSnapPacketParser,
senf::MIHBaseTLVParser,
senf::MIHGenericPayloadPacketParser,
senf::MIHPacketParser,
senf::MIHTLVLengthParser,
senf::MLDv2AddressRecordParser,
senf::MLDv2ListenerQueryParser,
senf::MLDv2ListenerReportParser,
senf::MPERealTimeParametersParser,
senf::MPESectionParser,
senf::NDPNeighborAdvertisementParser,
senf::NDPNeighborSolicitationParser,
senf::NDPOptionParser,
senf::NDPRedirectParser,
senf::NDPRouterAdvertisementParser,
senf::NDPRouterSolicitationParser,
senf::RadiotapPacketParser_ChannelOptions,
senf::RadiotapPacketParser_Flags,
senf::RadiotapPacketParser_FrameType,
senf::RadiotapPacketParser_Header,
senf::RadiotapPacketParser_RxFlags,
senf::RadiotapPacketParser_TxFlags,
senf::RTPPacketParser,
senf::SNDUPacketParser,
senf::StringParser< LengthParser >,
senf::TCPPacketParser,
senf::TransportPacketParser,
senf::UDPPacketParser,
senf::UInt16LSBParser,
senf::UInt16Parser,
senf::UInt24Parser,
senf::UInt32LSBParser,
senf::UInt32Parser,
senf::UInt64LSBParser,
senf::UInt64Parser,
senf::UInt8Parser,
senf::UIntFieldParser< Start, End >,
senf::ValueParserBase< Parser, ValueType, FixedBytes >,
senf::VariantParser< AuxPolicy, Parsers >,
senf::VectorParser< ElementParser, AuxPolicy >,
senf::VoidPacketParser,
senf::WLANBeaconPacketParser,
senf::WLANInfoElementParser,
senf::WLANPacketParser,
senf::ValueParserBase< EUI64Parser, EUI64, 8u >,
senf::ValueParserBase< INet4AddressParser, INet4Address, 4u >,
senf::ValueParserBase< INet6AddressParser, INet6Address, 16u >,
senf::ValueParserBase< MACAddressParser, MACAddress, 6u >.

List of all members.


Detailed Description

Parser Base class.

Parsers come in two flavors: fixed and dynamically sized parsers. A fixed size parser has a constant size, it will always parse a fixed number of bytes. The low-level 'final' parsers (like the integer parsers) are fixed size parsers as are composite parsers built up only of fixed-size fields.

A dynamically sized parser on the other hand infers it's size from the contents of the data parsed. Any parser containing at least one dynamically sized sub-parser will itself be dynamically sized.

Both kinds of parser need to derive from PacketParserBase and implement several required members. Which members to implement depends on the parsers flavor. There are two ways how to do this.

  • If the parser just consists of sequence of consecutive fields (sub-parsers), the Helper macros for defining new packet parsers provide a simple yet flexible way to define a packet parser.
  • In more complex cases, you need to implement the necessary members manually.
This documentation is about the manual implementation. You should nevertheless read through this to understand, what above macros are doing.

The following example documents the interface (which must be) provided by a parser:

  struct FooParser : public PacketParserBase
  {
      FooParser(data_iterator i, state_type s) : PacketParserBase(i,s) {}

      // If this parser has a fixed size, you must define this size here This definition
      // allows the parser to be used within the list, vector and array parsers static
      static const size_type fixed_bytes = some_constant_size;

      // If the parser does not have a fixed size, you must implement the bytes() member to
      // return the size. ONLY EVER DEFINE ONE OF fixed_bytes OR bytes().
      size_type bytes() const;

      // If you define bytes(), you also need to define the init_bytes. This is the number
      // of bytes to allocate when creating a new object
      static const size_type init_bytes = some_constant_size;

      // You also may define an init() member. This will be called to initialize a newly
      // created data object. The default implementation just does nothing.
      void init() const;

      //-////////////////////////////////////////////////////////////////////////

      // Add here members returning (sub-)parsers for the fields. The 'parse' member is
      // used to construct the sub-parsers. This member either takes an iterator to the
      // data to be parsed or just an offset in bytes.

      senf::UInt16Parser type() const { return parse<UInt16Parser>( 0 ); }
      senf::UInt16Parser size() const { return parse<UInt16Parser>( 2 ); }
  };

You should never call the bytes() member of a parser directly. Instead you should use the freestanding senf::bytes() function. This function will return the correct size irrespective of the parsers flavor. You may access fixed_bytes directly, however be aware that this will restrict your code to fixed size parsers (which depending on the circumstances may be exactly what you want).

In the same way, don't access init_bytes directly, always use the senf::init_bytes meta-function class which correctly supports fixed size parsers.

Definition at line 238 of file PacketParser.hh.


Classes

struct   ParserProtector

Public Types

typedef detail::packet::iterator  data_iterator
  Raw data iterator type.
typedef detail::packet::size_type  size_type
  Unsigned integral type.
typedef
detail::packet::difference_type 
difference_type
  Signed integral type.
typedef detail::packet::byte  byte
  Unsigned 8bit value, the raw value type.
typedef PacketData state_type
  Type of the 'state' parameter.
typedef PacketParserBase  parser_base_type
  Base type of the next parser.

Public Member Functions

data_iterator  i () const
  Return beginning of data to parse.
data_iterator  i (size_type offset) const
  Return iterator offset bytes from the start.
state_type  state () const
  Return state of this parser.
PacketData data () const
  Access the packets raw data container.
void  init () const
  Default implementation.

Protected Member Functions

ParserProtector  protect () const
  PacketParserBase (data_iterator i, state_type s)
  Standard constructor.
  PacketParserBase (data_iterator i, state_type s, size_type size)
  Size checking constructor.
bool  check (size_type size) const
  Check size of data container.
void  validate (size_type size) const
  Validate size of data container.
template<class Parser >
Parser  parse (data_iterator i) const
  Create sub-parser.
template<class Parser , class Arg >
Parser  parse (Arg const &arg, data_iterator i) const
  Create sub-parser.
template<class Parser >
Parser  parse (size_type n) const
  Create sub-parser.
template<class Parser , class Arg >
Parser  parse (Arg const &arg, size_type n) const
  Create sub-parser.
void  defaultInit () const
  Default implementation.
Packet  packet () const
  Get packet this parser is parsing from.
void  resize (size_type oldSize, size_type newSize)
  Resize data container.

Member Typedef Documentation

typedef detail::packet::byte senf::PacketParserBase::
byte

Unsigned 8bit value, the raw value type.

Definition at line 247 of file PacketParser.hh.

typedef detail::packet::iterator senf::PacketParserBase::
data_iterator

Raw data iterator type.

Definition at line 244 of file PacketParser.hh.

typedef detail::packet::difference_type senf::PacketParserBase::
difference_type

Signed integral type.

Definition at line 246 of file PacketParser.hh.

typedef PacketParserBase senf::PacketParserBase::
parser_base_type

Base type of the next parser.

Definition at line 249 of file PacketParser.hh.

typedef detail::packet::size_type senf::PacketParserBase::
size_type

Unsigned integral type.

Definition at line 245 of file PacketParser.hh.

typedef PacketData* senf::PacketParserBase::
state_type

Type of the 'state' parameter.

Definition at line 248 of file PacketParser.hh.


Constructor & Destructor Documentation

senf::PacketParserBase::
PacketParserBase ( data_iterator  i,
state_type  s )

Standard constructor.

This is the constructor used by most parsers. The parameters are just forwarded from the derived classes constructor parameters.

Definition at line 88 of file PacketParser.cci.

senf::PacketParserBase::
PacketParserBase ( data_iterator  i,
state_type  s,
size_type  size )

Size checking constructor.

In addition to the standard constructor, this constructor will validate, that there is enough data in the raw data container to parse size bytes after i.

This constructor is called by all 'final' parsers (e.g. the integer parsers) and only by those parsers. Most parsers do not check the validity of the iterator, this is delayed until the very last parser. This allows to partial parse truncated packets.

Exceptions:
TruncatedPacketException  if the raw data container does not hold at least size bytes beginning at i.

Definition at line 92 of file PacketParser.cci.


Member Function Documentation

bool senf::PacketParserBase::
check ( size_type  size )

Check size of data container.

Returns:
true, if the data container holds at least size beginning at i(), false otherwise.

Definition at line 75 of file PacketParser.cci.

senf::PacketData & senf::PacketParserBase::
data ()

Access the packets raw data container.

This member will return the raw data container holding the data which is parsed by this parser.

Definition at line 114 of file PacketParser.cci.

void senf::PacketParserBase::
defaultInit ()

Default implementation.

This is just an empty default implementation. Re-implement this member in your own parsers if needed.

Definition at line 124 of file PacketParser.cci.

senf::PacketParserBase::data_iterator senf::PacketParserBase::
i ( size_type  offset )

Return iterator offset bytes from the start.

The return value is the same as i() + offset. However, the parser checks, that the iterator is still within range of the raw data container. Otherwise a TruncatedPacketException is thrown.

Exceptions:
TruncatedPacketException  if the raw data container does not hold at least offset bytes starting at i().

Definition at line 101 of file PacketParser.cci.

senf::PacketParserBase::data_iterator senf::PacketParserBase::
i ()

Return beginning of data to parse.

The parser is expected to interpret the data beginning here. The size of the interpreted is given by senf::bytes(parser instance).

Definition at line 38 of file PacketParser.cci.

void senf::PacketParserBase::
init ()

senf::Packet senf::PacketParserBase::
packet ()

Get packet this parser is parsing from.

Note:
This member should only be used from packet parsers when access to previous or following packets is needed e.g. for calculating checksums etc.

Definition at line 128 of file PacketParser.cci.

template<class Parser , class Arg >
Parser senf::PacketParserBase::
parse ( Arg const &  arg,
size_type  n )

Create sub-parser.

This is like parse(size_type), however it passes the extra argument arg to the Parser constructor.

Definition at line 58 of file PacketParser.cti.

template<class Parser >
Parser senf::PacketParserBase::
parse ( size_type  n )

Create sub-parser.

Creates a new instance of Parser to parse data beginning at i() + n. Automatically passes state() to the new parser.

Definition at line 51 of file PacketParser.cti.

template<class Parser , class Arg >
Parser senf::PacketParserBase::
parse ( Arg const &  arg,
data_iterator  i )

Create sub-parser.

This is like parse(data_iterator), however it passes the extra argument arg to the Parser constructor.

Definition at line 44 of file PacketParser.cti.

template<class Parser >
Parser senf::PacketParserBase::
parse ( data_iterator  i )

Create sub-parser.

Creates a new instance of Parser to parse data beginning at i. Automatically passes state() to the new parser.

Definition at line 37 of file PacketParser.cti.

senf::PacketParserBase::ParserProtector senf::PacketParserBase::
protect ()

Definition at line 69 of file PacketParser.cci.

void senf::PacketParserBase::
resize ( size_type  oldSize,
size_type  newSize )

Resize data container.

This command will erase or insert bytes from/into the data container at the end of the parser (at i() + newSize). If oldSize is > newSize, bytes will be removed, otherwise bytes will be inserted.

Warning:
This may invalidate iterators and other parsers. The current parser itself is automatically updated

Definition at line 35 of file PacketParser.cc.

senf::PacketParserBase::state_type senf::PacketParserBase::
state ()

Return state of this parser.

The value returned should be interpreted as an opaque value provided just to be forwarded to other parsers.

Definition at line 108 of file PacketParser.cci.

void senf::PacketParserBase::
validate ( size_type  size )

Validate size of data container.

Exceptions:
TruncatedPacketException  if the raw data container does not hold at least size bytes beginning at i().

Definition at line 81 of file PacketParser.cci.


The documentation for this class was generated from the following files: