#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 >.
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.
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. |
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.
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.
TruncatedPacketException | if the raw data container does not hold at least size bytes beginning at i. |
Definition at line 92 of file PacketParser.cci.
bool senf::PacketParserBase:: | ||||
check | ( | size_type | size | ) |
Check size of data container.
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.
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 | () | |||
Default implementation.
This is just an empty default implementation. Re-implement this member in your own parsers if needed.
Reimplemented in senf::MIHTLVLengthParser, senf::MIHGenericTLVParser, senf::MIHFSrcIdTLVParser, senf::MIHFDstIdTLVParser, senf::ArrayParser< elements, ElementParser >, senf::ListParser< ListPolicy >, senf::VectorParser< ElementParser, AuxPolicy >, senf::GenericTLVParserBase< MIHBaseTLVParser >, and senf::GenericTLVParserBase< NDPOptionParser >.
Definition at line 120 of file PacketParser.cci.
senf::Packet senf::PacketParserBase:: | ||||
packet | () | |||
Get packet this parser is parsing from.
Definition at line 128 of file PacketParser.cci.
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.
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.
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.
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.
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.
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.
TruncatedPacketException | if the raw data container does not hold at least size bytes beginning at i(). |
Definition at line 81 of file PacketParser.cci.