added some documentation
[senf.git] / Packets / Mainpage.dox
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Stefan Bund <g0dil@berlios.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 /** \mainpage The SENF Packet Library
24
25     The SENF Packet library provides facilities to analyze, manipulate and create structured packet
26     oriented data (e.g. network packets).
27
28     \autotoc
29
30     
31     \section packet_intro_arch Introduction
32     \seechapter \ref packet_arch
33
34     The Packet library consists of several components:
35     
36     \li The \ref packet_module manages the packet data and provides the framework for handling the
37         chain of packet headers. The visible interface is provided by the Packet class.
38     \li \ref packetparser provides the framework for interpreting packet data. It handles
39         parsing the packet information into meaningful values.
40     \li The \ref protocolbundles provide concrete implementations for interpreting packets of
41         some protocol. The Protocol Bundles are built on top of the basic packet library.
42
43     All these components work together to provide a hopefully simple and intuitive interface to
44     packet parsing and creation.
45
46
47     \section packet_intro_usage Tutorial
48     \seechapter \ref packet_usage 
49
50     This chapter discusses the usage of the packet library from a high level view. 
51
52     
53     \section packet_intro_api The packet API
54
55     The packet library API is divided into three areas
56
57     \li the \ref senf::PacketData API for accessing the raw data container
58     \li the packet interpreter chain providing \ref packet_module
59     \li and \ref packetparser which provides access to protocol specific packet fields.
60
61    
62     \section protocolbundles Supported packet types (protocols)
63
64     Each protocol bundle provides a collection of related concrete packet classes for a group of
65     related protocols:
66
67     \li \ref protocolbundle_default : Some basic default protocols: Ethernet, Ip, TCP, UDP
68     \li \ref protocolbundle_mpegdvb : MPEG and DVB protocols
69     \li \ref protocolbundle_80211 : 802.11 protocols
70
71     There are two ways to link with a bundle
72     
73     \li If you only work with known packets which you explicitly reference you may just link with
74         the corresponding library.
75     \li If you need to parse unknown packets and want those to be parsed as complete as possible
76         without explicitly referencing the packet type, you will need to link against the combined
77         object file built for every bundle. This way, all packets defined in the bundle will be
78         included whether they are explicitly referenced or not (and they will all automatically be
79         registered).
80
81     
82     \section packet_intro_new Defining new packet types
83     \seechapter \ref packet_new
84
85     The packet library provides the framework which allows to define arbitrary packet types. There
86     is quite some information needed to completely specify a specific type of packet.
87
88  */
89
90 /** \page packet_arch Overall Packet library Architecture
91
92     The packet library handles network packets of a large number of protocols. We work with a packet
93     on three levels
94
95     \autotoc
96
97     
98     \section packet_arch_handle The Packet handle
99
100     Whenever we are using a Packet, we are talking about a senf::Packet (or a
101     senf::ConcretePacket). This class is a \e handle referencing an internally managed packet data
102     structure. So even though we pass senf::Packet instances around by value, they work like
103     references. The packet library automatically manages all required memory resources using
104     reference counting. 
105
106     Different Packet handles may really internally share one Packet data structure if they both
107     point to the same packet.
108
109    
110     \section packet_arch_data The Packet as a 'bunch of bytes'
111
112     From the outside, a packet is just a bunch of bytes just as it is read from (or will be
113     written to) the wire. At this low-level view, we can access the data in it's raw form but
114     have no further information about what kind of packet we have.
115
116     The packet library provides a consistent container interface for this representation.
117
118     \code
119     Packet p = ...;
120
121     // Change first byte of packet to 0
122     p.data()[0] = 1u; 
123
124     // Copy packet data into a vector
125     std::vector<char> data (p.data().size());
126     std::copy(p.data().begin(), p.data().end(), data.begin());
127     \endcode
128
129     This type of access is primarily needed when reading or writing packets (e.g. to/from the
130     network).
131
132     \see senf::Packet::data() \n
133         senf::PacketData
134
135     
136     \section packet_arch_chain The Interpreter Chain
137
138     On the next level, the packet is divided into a nested list of sub-packets (or headers) called
139     interpreters. Each senf::Packet handle internally points to an interpreter or header. This
140     allows us to access one and the same packet in different ways. 
141
142     Consider an Ethernet Packet with an IP payload holding a UDP packet. We may reference either the
143     Ethernet packet as a whole or we may reference the IP or UDP interpreters (sub-packets or
144     headers). All handles really refer to the \e same data structure but provide access to a
145     different (sub-)range of the data in the packet.
146
147     We can navigate around this chained structure using appropriate members:
148
149     \code
150     // eth, ip and udp all reference the same internal packet data albeit at different data ranges
151     Packet eth = ...;
152     Packet ip = eth.next();
153     Packet udp = ip.next();
154
155     eth.next() == ip                   // true
156     eth.next().is<IPv4Packet>()        // true
157     eth.next().next() == udp           // true
158     eth.next().is<UDPPacket>()         // false
159     eth.find<UDPPacket>() == udp       // true
160
161     udp.find<EthernetPacket>()         // throws InvalidPacketChainException
162     udp.find<EthernetPacket>(senf::nothrow) // An in-valid() senf::Packet which tests as 'false'
163     udp.find<UDPPacket> == udp         // true
164     udp.first<IPv4Packet>()            // throws InvalidPacketChainException
165
166     udp.prev() == ip                   // true
167     udp.prev<EthernetPacket>()         // throws InvalidPacketChainException
168     \endcode
169     
170     \see \ref packet_module
171
172
173     \section packet_arch_parser Parsing specific Protocols
174
175     On the next level, the packet library allows us to parse the individual protocols. This gives us
176     access to the protocol specific data members of a packet and allows us to access or manipulate a
177     packet in a protocol specific way.
178
179     To access this information, we need to use a protocol specific handle, the senf::ConcretePacket
180     which takes as a template argument the specific type of packet to be interpreted. This allows us
181     to easily interpret or create packets. Here an example on how to create a new Ethernet / IP / UDP
182     / Payload packet interpreter chain:
183
184     \code
185     // EthernetPacket, IPv4Packet, UDPPacket and DataPacket are typedefs for corresponding
186     // ConcretePacket instantiations
187     senf::EthernetPacket eth      (senf::EthernetPacket::create());
188     senf::IPv4Packet     ip       (senf::IPv4Packet    ::createAfter(eth));
189     senf::UDPPacket      udp      (senf::UDPPacket     ::createAfter(ip));
190     senf::DataPacket     payload  (senf::DataPacket    ::createAfter(udp, 
191                                                                      std::string("Hello, world!")));
192
193     udp->source()      = 2000u;
194     udp->destination() = 2001u;
195     ip->ttl()          = 255u;
196     ip->source()       = senf::INet4Address::from_string("192.168.0.1");
197     ip->destination()  = senf::INet4Address::from_string("192.168.0.2");
198     eth->source()      = senf::MACAddress::from_string("00:11:22:33:44:55");
199     eth->destination() = senf::MACAddress::from_string("00:11:22:33:44:66");
200     
201     eth.finalizeAll();
202     \endcode
203
204     Again, realize, that \a eth, \a ip, \a udp and \a payload share the same internal packet
205     data structure (the respective \c data() members all provide access to the same underlying
206     container however at different byte ranges): The complete packet can be accessed at
207     <tt>eth.data()</tt> whereas <tt>payload.data()</tt> only holds UDP payload (in this case the
208     string "Hello, world!").
209
210     \see \ref packetparser \n
211         \ref protocolbundles
212  */
213
214 /** \page packet_usage Using the packet library
215
216     \autotoc
217
218     \section packet_usage_intro Includes
219
220     To use the library, you need to include the appropriate header files. This will probably happen
221     automatically when including the specific protocol headers. If needed, you may explicitly use
222
223     \code
224     #include "Packets.hh"
225     \endcode
226     
227     explicitly.
228
229     \warning Never include any other Packets library header directly, only include \c
230     Packets.hh or one (or several) protocol headers from the protocol bundles.
231
232     Most every use of the packet library starts with some concrete packet typedef. Some fundamental
233     packet types are provided by \ref protocolbundle_default. 
234
235
236     \section packet_usage_create Creating a new packet
237
238     Building on those packet types, this example will build a complex packet: This will be an
239     Ethernet packet containing an IPv4 UDP packet. We begin by building the raw packet skeleton:
240
241     \code
242     #include "Packets/DefaultBundle/EthernetPacket.hh"
243     #include "Packets/DefaultBundle/IPv4Packet.hh"
244     #include "Packets/DefaultBundle/UDPPacket.hh"
245
246     senf::EthernetPacket eth      (senf::EthernetPacket::create());
247     senf::IPv4Packet     ip       (senf::IPv4Packet    ::createAfter(eth));
248     senf::UDPPacket      udp      (senf::UDPPacket     ::createAfter(ip));
249     senf::DataPacket     payload  (senf::DataPacket    ::createAfter(udp, 
250                                                                      std::string("Hello, world!")));
251     \endcode
252
253     These commands create what is called an interpreter chain. This chain consists of four
254     interpreters. All interpreters reference the same data storage. This data storage is a random
255     access sequence which contains the data bytes of the packet.
256
257     \note The data structures allocated are automatically managed using reference counting. In this
258         example we have four packet references each referencing the same underlying data
259         structure. This data structure will be freed when the last reference to it goes out of
260         scope.
261
262     The packet created above already has the correct UDP payload (The string "Hello, world!")
263     however all protocol fields are empty. We need to set those protocol fields:
264
265     \code
266     udp->source()      = 2000u;
267     udp->destination() = 2001u;
268     ip->ttl()          = 255u;
269     ip->source()       = senf::INet4Address::from_string("192.168.0.1");
270     ip->destination()  = senf::INet4Address::from_string("192.168.0.2");
271     eth->source()      = senf::MACAddress::from_string("00:11:22:33:44:55");
272     eth->destination() = senf::MACAddress::from_string("00:11:22:33:44:66");
273     
274     eth.finalizeAll();
275     \endcode
276
277     As seen above, packet fields are accessed using the <tt>-></tt> operator whereas other packet
278     facilities (like \c finalizeAll()) are directly accessed using the member operator. The field
279     values are simply set using appropriately named accessors. As a last step, the \c finalizeAll()
280     call will update all calculated fields (fields like next-protocol, header or payload length,
281     checksums etc). Now the packet is ready. We may now send it out using a packet socket
282
283     \code
284     senf::PacketSocketHandle sock ("eth0");
285     sock.write(eth.data());
286     \endcode
287
288
289     \section packet_usage_read Reading and parsing packets
290
291     The chain navigation functions are also used to parse a packet. Let's read an Ethernet packet
292     from a packet socket handle:
293     
294     \code
295     senf::PacketSocketHandle sock ("eth0");
296     senf::EthernetPacket packet (senf::EthernetPacket::create(senf::noinit));
297     sock.read(packet.data(),0u);
298     \endcode
299
300     This first creates an uninitialized Ethernet packet and then reads into this packet. We can now
301     parse this packet. Let's find out, whether this is a UDP packet destined to port 2001:
302
303     \code
304     try {
305         senf::UDPPacket udp (packet.find<UDPPacket>());
306         if (udp->destination() == 2001u) {
307             // Voila ...
308         }
309     } catch (senf::TruncatedPacketException &) {
310         std::cerr << "Ooops !! Broken packet received\n";
311     } catch (senf::InvalidPacketChainException &) {
312         std::cerr << "Not a udp packet\n";
313     }
314     \endcode
315
316     TruncatedPacketException is thrown by <tt>udp->destination()</tt> if that field cannot be
317     accessed (that is it would be beyond the data read which means we have read a truncated
318     packet). More generally, whenever a field cannot be accessed because it would be out of bounds
319     of the data read, this exception is generated.
320
321
322     \section packet_usage_container The raw data container
323     
324     Every packet is based internally on a raw data container holding the packet data. This container
325     is accessed via senf::Packet::data() member.
326     
327     This container is a random access container. It can be used like an ordinary STL container and
328     supports all the standard container members.
329
330     \code
331     Packet p = ...;
332
333     // Insert 5 0x01 bytes
334     p.data().insert(p.data().begin()+5, 5, 0x01);
335
336     // Insert data from another container
337     p.data().insert(p.data().end(), other.begin(), other.end());
338
339     // Erase a single byte
340     p.data().erase(p.data().begin()+5);
341
342     // XOR byte 5 with 0xAA
343     p.data()[5] ^= 0xAA;
344     \endcode
345
346     A packet consists of a list of interpreters (packet headers or protocols) which all reference
347     the same data container at different byte ranges. Each packet consists of the protocol header \e
348     plus the packets payload. This means, that the data container ranges of successive packets from
349     a single interpreter chain are nested.
350
351     Example: The packet created above (the Ethernet-IP-UDP packet with payload "Hello, world!") has
352     4 Interpreters: Ethernet, IPv4, UDP and the UDP payload data. The nested data containers lead to
353     the following structure
354
355     \code
356     // The ethernet header has a size of 14 bytes
357     eth.data().begin() + 14 == ip.data().begin()
358     eth.data().end()        == ip.data().end()
359
360     // The IP header has a size of 20 bytes and therefore
361     ip.data().begin()  + 20 == udp.data().begin()
362     ip.data().end()         == udp.data().end()
363
364     // The UDP header has a size of 8 bytes and thus
365     udp.data().begin() +  8 == payload.data().begin()
366     udp.data().end()        == payload.data().end()
367     \endcode
368
369     This nesting will (and must) always hold: The data range of a subsequent packet will always be
370     within the range of it's preceding packet.
371
372     \warning It is forbidden to change the data of a subsequent packet interpreter from the
373         preceding packet even if the data container includes this data. If you do so, you may
374         corrupt the data structure (especially when changing it's size).
375
376     Every operation on a packet is considered to be \e within this packet and \e without and
377     following packet. When inserting or erasing data, the data ranges are all adjusted
378     accordingly. So the following are \e not the same even though \c eth.end(), \c ip.end() and \c
379     udp.end() are identical.
380
381     \code
382     eth.data().insert(eth.data().end(), 5, 0x01);
383     assert(    eth.data().end() == ip.data().end() + 5 
384             && ip.data().end()  == udp.data().end() );
385
386     // Or alternatively: (You could even use eth.data().end() here ... it's the same)
387     ip.data().insert(ip.data().end(), 5, 0x01);
388     assert(    eth.data().end() == ip.data().end()
389             && ip.data().end()  == udp.data().end() + 5 );
390     \endcode
391
392     \warning When accessing the packet data via the container interface, you may easily build
393         invalid packets since the packet will not be validated against it's protocol.
394
395
396     \section packet_usage_fields Field access
397
398     When working with concrete protocols, the packet library provides direct access to all the
399     protocol information.
400
401     \code
402     udp->source()      = 2000u;
403     udp->destination() = 2001u;
404     ip->ttl()          = 255u;
405     ip->source()       = senf::INet4Address::from_string("192.168.0.1");
406     ip->destination()  = senf::INet4Address::from_string("192.168.0.2");
407     eth->source()      = senf::MACAddress::from_string("00:11:22:33:44:55");
408     eth->destination() = senf::MACAddress::from_string("00:11:22:33:44:66");
409     \endcode
410
411     The protocol field members above do \e not return references, they return parser instances.
412     Protocol fields are accessed via parsers. A parser is a very lightweight class which points into
413     the raw packet data and converts between raw data bytes and it's interpreted value: For example
414     a senf::UInt16Parser accesses 2 bytes (in network byte order) and converts them to or from a 16
415     bit integer. There are a few properties about parsers which need to be understood:
416
417     \li Parsers are created only temporarily when needed. They are created when accessing a protocol
418         field and are returned by value.
419
420     \li A parser never contains a value itself, it just references a packets data container.
421
422     \li Parsers can be built using other parsers and may have members which return further parsers.
423
424     The top-level interface to a packets protocol fields is provided by a protocol parser. This
425     protocol parser is a composite parser which has members to access the protocol fields (compare
426     with the example code above). Some protocol fields may be more complex than a simple value. In
427     this case, those accessors may return other composite parsers or collection parsers. Ultimately,
428     a value parser will be returned.
429
430     The simple value parsers which return plain values (integer numbers, network addresses etc) can
431     be used like those values and can also be assigned corresponding values. More complex parsers
432     don't allow simple assignment. However, they can always be copied from another parser <em>of the
433     same type</em> using the generalized parser assignment. This type of assignment also works for
434     simple parsers and is then identical to a normal assignment.
435
436     \code
437     // Copy the complete udp parser from udp packet 2 to packet 1
438     udp1.parser() << udp2.parser();
439     \endcode
440
441     Additionally, the parsers have a parser specific API which allows to manipulate or query the
442     value. 
443
444     This is a very abstract description of the parser structure. For a more concrete description, we
445     need to differentiate between the different parser types
446
447     \subsection packet_usage_fields_value Simple fields (Value parsers)
448
449     We have already seen value parsers: These are the lowest level building blocks witch parse
450     numbers, addresses etc. They return some type of value and can be assigned such a value. More
451     formally, they have a \c value_type typedef member which gives the type of value they accept and
452     they have an overloaded \c value() member which is used to read or set the value. Some parsers
453     have additional functionality: The numeric parser for Example provide conversion and arithmetic
454     operators so they can be used like a numeric value.
455
456     If you have a value parser \c valueParser with type \c ValueParser, the following will always be
457     valid:
458     \code
459     // You can read the value and assign it to a variable of the corresponding value_type
460     ValueParser::value_type v (valueParser.value());
461
462     // You can assign that value to the parser
463     valueParser.value(v);
464
465     // The assignment can also be done using the generic parser assignment
466     valueParser << v;
467     \endcode
468
469
470     \subsection packet_usage_fields_composite Composite and protocol parsers
471
472     A composite parser is a parser which just combines several other parsers into a structure: For
473     example, the senf::EthernetPacketParser has members \c destination(), \c source() and \c
474     type_length(). Those members return parsers again (in this case value parsers) to access the
475     protocol fields.
476
477     Composite parsers can be nested; A composite parser may be returned by another composite
478     parser. The protocol parser is a composite parser which defines the field for a specific
479     protocol header like Ethernet.
480
481     \subsection packet_usage_fields_collection Collection parsers
482
483     Besides simple composites, the packet library has support for more complex collections. 
484
485     \li The senf::ArrayParser allows to repeat an arbitrary parser a fixed number of times.
486     \li senf::VectorParser and senf::ListParser are two different types of lists with variable
487         number of elements
488     \li The senf::VariantParser is a discriminated union: It will select one of several parsers
489         depending on the value of a discriminant.
490
491
492     \subsubsection packet_usage_collection_vector Vector and List Parsers
493
494     Remember, that a parser does \e not contain any data: It only points into the raw data
495     container. This is also true for the collection parsers. VectorParser and ListParser provide an
496     interface which looks like an STL container to access a sequence of elements.
497
498     We will use an \c MLDv2QueryPacket as an example (see <a
499     href="http://tools.ietf.org/html/rfc3810#section-5">RFC 3810</a>). Here an excerpt of the
500     relevant fields:
501
502     <table class="fields">
503     <tr><td>nrOfSources</td><td>Integer</td><td>Number of multicast sources in this packet</td></tr>
504     <tr><td>sources</td><td>Vector of IPv6 Addresses</td><td>Multicast sources</td></tr>
505     </table>
506
507     To demonstrate nested collections, we use the \c MLDv2ReportPacket as an example. The relevant
508     fields of this packet are;
509     
510     <table class="fields">
511     <tr><td>nrOfRecords</td><td>Integer</td><td>Number of multicast address records</td></tr>
512     <tr><td>records</td><td>List of Records</td><td>List of multicast groups and sources</td></tr>
513     </table>
514
515     Each Record is a composite with the following relevant fields:
516
517     <table class="fields">
518     <tr><td>nrOfSources</td><td>Integer</td><td>Number of sources in this record</td></tr>
519     <tr><td>sources</td><td>Vector of IPv6 Addresses</td><td>Multicast sources</td></tr>
520     </table>
521     
522     The first example will iterate over the sources in a \c MLDv2QueryPacket:
523
524     \code
525     MLDv2QueryPacket mld = ...;
526
527     // Instantiate a collection wrapper for the source list
528     MLDv2QueryPacket::Parser::sources_t::container sources (mld->sources());
529
530     // Iterate over all the addresses in that list
531     for (MLDv2QueryPacket::Parser::sources_t::container::iterator i (sources.begin()); 
532          i != sources.end(); ++i)
533         std::cout << *i << std::endl;
534     \endcode
535
536     Beside other fields, the MLDv2Query consists of a list of source addresses. The \c sources()
537     member returns a VectorParser for these addresses. The collection parsers can only be accessed
538     completely using a container wrapper. The container wrapper type is available as the \c
539     container member of the collection parser, here it is \c
540     MLDv2QueryPacket::Parser::sources_t::container.
541
542     Using this wrapper, we can not only read the data, we can also manipulate the source list. Here
543     we copy a list of addresses from an \c std::vector into the packet:
544
545     \code
546     std::vector<senf::INet6Address> addrs (...);
547
548     sources.resize(addrs.size());
549     std::copy(addrs.begin(), addrs.end(), sources.begin())
550     \endcode
551
552     Collection parsers may be nested. To access a nested collection parser, a container wrapper must
553     be allocated for each level. An MLD Report (which is a composite parser) includes a list of
554     multicast address records called \c records(). Each record is again a composite which contains a
555     list of sources called \c sources():
556
557     \code
558     MLDv2ReportPacket report = ...;
559
560     // Instantiate a collection wrapper for the list of records:
561     MLDv2ReportPacket::Parser::records_t::container records (report->records());
562
563     // Iterate over the multicast address records
564     for (MLDv2ReportPacket::Parser::records_t::container::iterator i (records.begin());
565          i != records.end(); ++i) {
566         // Allocate a collection wrapper for the multicast address record
567         typedef MLDv2ReportPacket::Parser::records_t::value_type::sources_t Sources;
568         Sources::container sources (i->sources());
569         
570         // Iterate over the sources in this record
571         for (Sources::container::iterator i (sources.begin());
572              i != sources.end(); ++i)
573             std::cout << *i << std::endl;
574     }
575     \endcode
576
577     In this example we also see how to find the type of a parser or container wrapper.
578     \li Composite parsers have typedefs for each their fields with a \c _t postfix
579     \li The vector or list parsers have a \c value_type typedef which gives the type of the
580         element.
581
582     By traversing this hierarchical structure, the types of all the fields can be found.
583
584     The container wrapper is only temporary (even though it has a longer lifetime than a
585     parser). Any change made to the packet not via the collection wrapper has the potential to
586     invalidate the wrapper if it changes the packets size.
587
588     \see 
589         senf::VectorParser_Container Interface of the vector parser container wrapper \n
590         senf::ListParser_Container Interface of the list parser container wrapper
591     
592
593     \subsubsection packet_usage_collection_variant The Variant Parser
594
595     The senf::VariantParser is a discriminated union of parsers. It is also used for optional fields
596     (using senf::VoidPacketParser as one possible variant which is a parser parsing nothing).  A
597     senf::VariantParser is not really a collection in the strict sense: It only ever contains one
598     element, the \e type of which is determined by the discriminant.
599
600     For Example, we look at the DTCP HELLO Packet as defined in the UDLR Protocol (see <a
601     href="http://tools.ietf.org/html/rfc3077">RFC 3077</a>)
602
603     \code
604     DTCPHelloPacket hello (...);
605
606     if (hello->ipVersion() == 4) {
607         typedef DTCPHelloPacket::Parser::v4fbipList_t FBIPList;
608         FBIPList::container fbips (hello->v4fbipList());
609         for (FBIPList::container::iterator i (fbips.begin()); i != fbips.end(); ++i)
610             std::cout << *i << std::endl;
611     }
612     else { // if (hello->ipVersion() == 6)
613         typedef DTCPHelloPacket::Parser::v6fbipList_t FBIPList;
614         FBIPList::container fbips (hello->v6fbipList());
615         for (FBIPList::container::iterator i (fbips.begin()); i != fbips.end(); ++i)
616             std::cout << *i << std::endl;
617     }
618     \endcode
619
620     This packet has a field \c ipVersion() which has a value of 4 or 6. Depending on the version,
621     the packet contains a list of IPv4 or IPv6 addresses. Only one of the fields \c v4fbipList() and
622     \c v6fbipList() is available at a time. Which one is decided by the value of \c
623     ipVersion(). Trying to access the wrong one will provoke undefined behavior.
624
625     Here we have used the variants discriminant (the \c ipVersion() field) to select, which field to
626     parse. More generically, every variant field should have a corresponding member to test for it's
627     existence:
628     \code
629     if (hello->has_v4fbipList()) {
630         ...
631     }
632     else { // if (hello->has_v6fbipList())
633         ...
634     }
635     \endcode
636
637     A variant can have more than 2 possible types and you can be sure, that exactly one type will be
638     accessible at any time.
639
640     It is not possible to change a variant by simply changing the discriminant:
641     \code
642     // INVALID CODE:
643     hello->ipVersion() = 6;
644     \endcode
645     Instead, for each variant field there is a special member which switches the variant to that
646     type. After switching the type, the field will be in it's initialized (that is mostly zero)
647     state.
648     \code
649     std::vector<senf::INet6Address> addrs (...);
650
651     // Initialize the IPv6 list
652     hello->init_v6fbipList();
653
654     // Copy values into that list
655     DTCPHelloPacket::Parser::v6fbipList_t::container fbips (hello->v6fbipList());
656     fbips.resize(addrs.size());
657     std::copy(addrs.begin(), addrs.end(), fbips.begin());
658     \endcode
659     
660     \note Here we have documented the default variant interface as it is preferred. It is possible
661         to define variants in a different way giving other names to the special members (\c has_\e
662         name or \c init_\e name etc.). This must be documented with the composite or protocol parser
663         which defines the variant.
664
665     \section packet_usage_annotation Annotations
666
667     Sometimes we need to store additional data with a packet. Data, which is not part of the packet
668     itself but gives us some information about the packet: A timestamp, the interface the packet was
669     received on or other processing related information.
670
671     This type of information can be stored using the annotation interface. The following example
672     will read packet data and will store the read timestamp as a packet annotation.
673
674     \code
675     struct Timestamp {
676         senf::ClockService::clock_t value;
677     };
678
679     senf::EthernetPacket packet (senf::EthernetPacket::create(senf::noinit));
680     sock.read(packet.data(), 0u);
681     packet.annotation<Timestamp>().value = senf::ClockService::now();
682     \endcode
683
684     In the same way, the annotation can be used later
685
686     \code
687     if (senf::ClockService::now() - packet.annotation<Timestamp>().value 
688             > senf::ClockService::seconds(1)) {
689         // Ouch ... this packet is to old
690         // ...
691     }
692     \endcode
693
694     It is very important to define a specific structure (or class or enum) type for each type of
695     annotation. \e Never directly store a fundamental type as an annotation: The name of the type is
696     used to look up the annotation, so you can store only one annotation for each built-in type. \c
697     typedef does not help since \c typedef does not introduce new type names, it only defines an
698     alias.
699
700     Of course, the annotation structure can be arbitrary. However, one very important caveat: If the
701     annotation is not a POD type, it needs to inherit from senf::ComplexAnnotation. A type is POD,
702     if it is really just a bunch of bytes: No (non-static) members, no constructor or destructor and
703     no base classes and all it's members must be POD too. So the following annotation is complex
704     since \c std::string is not POD
705
706     \code
707     struct ReadInfo : senf::ComplexAnnotation
708     {
709         std::string interface;
710         senf::ClockService::clock_t timestamp;
711     };
712
713     // ...
714
715     packet.annotation<ReadInfo>().interface = "eth0";
716     packet.annotation<ReadInfo>().timestamp = senf::ClockService::now();
717
718     // Or store a reference to the annotation for easier access
719
720     ReadInfo & info (packet.annotation<ReadInfo>());
721     
722     if (info.interface == "eth0") {
723         // ...
724     }
725     \endcode
726
727     Every annotation is automatically default-initialized, there is no way to query, whether a
728     packet holds a specific annotation -- every packet conceptually always holds all annotations.
729
730     You should use annotations economically: Every annotation type used in your program will
731     allocate an annotation slot in \e all packet data structures. So don't use hundreds of different
732     annotation types if this is not really necessary: Reuse annotation types where possible or
733     aggregate data into larger annotation structures. The best solution is to use annotations only
734     for a small number of packet specific informations. If you really need to manage a train-load of
735     data together with the packet consider some other way (e.g. place the packet into another class
736     which holds that data).
737
738     \see senf::Packet::annotation()
739  */
740
741 /** \page packet_new Defining new Packet types
742
743     Each packet is specified by the following two components:
744
745     \li A protocol parser which defines the protocol specific fields
746     \li A packet type class which is a policy class defining the packet
747
748     \autotoc
749
750     \see <a href="../../../HowTos/NewPacket/doc/html/index.html">NewPacket HowTo</a>
751
752     \section packet_new_parser The protocol parser
753
754     The protocol parser is simply a composite parser. It defines all the protocol
755     fields. Additionally, the protocol parser may have additional members which will then be
756     accessible via the \c -> operator of the packet. Possibilities here are e.g. checksum
757     calculation and validation, packet validation as a whole and so on.
758
759     Defining a protocol parser is quite simple:
760     \code
761     struct EthernetPacketParser : public PacketParserBase
762     {
763     #   include SENF_FIXED_PARSER()
764
765         SENF_PARSER_FIELD( destination, MACAddressParser    );
766         SENF_PARSER_FIELD( source,      MACAddressParser    );
767         SENF_PARSER_FIELD( type_length, UInt16Parser );
768
769         SENF_PARSER_FINALIZE(EthernetPacketParser);
770     };
771     \endcode
772     
773     There are a lot of other possibilities to define fields. See \ref packetparsermacros for a
774     detailed description of the macro language which is used to define composite parsers.
775
776     \see 
777         \ref packetparsermacros
778
779     \section packet_new_type The packet type policy class
780
781     This is a class which provides all the information needed to integrate the new packet type into
782     the packet library:
783
784     \li It provides the type of the protocol parser to use
785     \li It provides information on how the next protocol can be found and where the payload resides
786         in this packet
787     \li It provides methods to initialize a new packet and get information about the packet size
788
789     All this information is provided via static or typedef members. 
790
791     \code
792     struct EthernetPacketType
793         : public PacketTypeBase,
794           public PacketTypeMixin<EthernetPacketType, EtherTypes>
795     {
796         typedef PacketTypeMixin<EthernetPacketType, EtherTypes> mixin;
797         typedef ConcretePacket<EthernetPacketType> packet;
798         typedef EthernetPacketParser parser;
799
800         using mixin::nextPacketRange;
801         using mixin::initSize;
802         using mixin::init;
803
804         static factory_t nextPacketType(packet p);
805         static void dump(packet p, std::ostream & os);
806         static void finalize(packet p);
807     };
808
809     typedef EthernetPacketType::packet EthernetPacket;
810     \endcode
811
812     The definition of senf::EthernetPacket is quite straight forward. This template works for most
813     simple packet types.
814
815     \see \ref senf::PacketTypeMixin \n
816         \ref senf::PacketTypeBase \n
817         \ref senf::PacketRegistry
818  */
819
820 \f
821 // Local Variables:
822 // mode: c++
823 // fill-column: 100
824 // c-file-style: "senf"
825 // indent-tabs-mode: nil
826 // ispell-local-dictionary: "american"
827 // mode: auto-fill
828 // compile-command: "scons -u doc"
829 // End:
830