Added ICMPv6 types for IPv6 Neighbor Discovery
[senf.git] / senf / Packets / DefaultBundle / ICMPv6TypePacket.hh
1 // $Id$
2 //
3 // Copyright (C) 2008
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Philipp Batroff <pug@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 // Definition of non-inline non-template functions
24
25 #ifndef HH_SENF_Packets_DefaultBundle_ICMPv6TypePacket_
26 #define HH_SENF_Packets_DefaultBundle_ICMPv6TypePacket_ 1
27
28 // Custom includes
29 #include <senf/Packets/Packets.hh>
30 #include "IPv6Packet.hh"
31 #include "ICMPv6Packet.hh"
32 #include "ListOptionTypeParser.hh"
33 #include "NDPOptions.hh"
34
35 namespace senf {
36
37     //#############################################################
38     //ICMPv6 Echo Request
39     //#############################################################
40     struct ICMPv6EchoRequestParser : public PacketParserBase
41     {
42 #       include SENF_FIXED_PARSER()
43         SENF_PARSER_FIELD ( identifier, UInt16Parser );
44         SENF_PARSER_FIELD ( seqNr,      UInt16Parser );
45         
46         SENF_PARSER_FINALIZE ( ICMPv6EchoRequestParser );
47     };
48     
49     /** \brief ICMPv6 Echo Request
50
51         \par Packet type (typedef):
52             \ref ICMPv6EchoRequest
53
54         \par Fields:
55             \ref ICMPv6EchoRequestParser
56             \image html ICMPv6EchoRequest.png
57
58         \ingroup protocolbundle_default
59      */
60     struct ICMPv6EchoRequestType
61         : public PacketTypeBase,
62           public PacketTypeMixin<ICMPv6EchoRequestType>
63     {
64         typedef PacketTypeMixin<ICMPv6EchoRequestType> mixin;
65         typedef ConcretePacket<ICMPv6EchoRequestType> packet;
66         typedef ICMPv6EchoRequestParser parser;
67         
68         using mixin::nextPacketRange;
69         using mixin::init;
70         using mixin::initSize;
71
72         static void dump(packet p, std::ostream & os);
73     };
74     
75     typedef ConcretePacket<ICMPv6EchoRequestType> ICMPv6EchoRequest;
76     
77     //#############################################################
78     //ICMPv6 Echo Reply
79     //#############################################################
80     struct ICMPv6EchoReplyParser : public PacketParserBase
81     {
82 #       include SENF_FIXED_PARSER()
83         SENF_PARSER_FIELD ( identifier, UInt16Parser );
84         SENF_PARSER_FIELD ( seqNr,      UInt16Parser );
85         
86         SENF_PARSER_FINALIZE ( ICMPv6EchoReplyParser );
87     };
88     
89     /** \brief ICMPv6 Echo Reply
90
91         \par Packet type (typedef):
92             \ref ICMPv6EchoReply
93
94         \par Fields:
95             \ref ICMPv6EchoReplyParser
96             \image html ICMPv6EchoReply.png
97
98         \ingroup protocolbundle_default
99      */
100     struct ICMPv6EchoReplyType
101         : public PacketTypeBase,
102           public PacketTypeMixin<ICMPv6EchoReplyType>
103     {
104         typedef PacketTypeMixin<ICMPv6EchoReplyType> mixin;
105         typedef ConcretePacket<ICMPv6EchoReplyType> packet;
106         typedef ICMPv6EchoReplyParser parser;
107         
108         using mixin::nextPacketRange;
109         using mixin::init;
110         using mixin::initSize;
111         
112         static void dump(packet p, std::ostream & os);
113     };
114         
115     typedef ConcretePacket<ICMPv6EchoReplyType> ICMPv6EchoReply;
116     
117     //#############################################################
118     //ICMPv6 Error Destination Unreachable Message
119     //#############################################################
120     struct ICMPv6ErrDestUnreachableParser : public PacketParserBase
121     {
122 #       include SENF_FIXED_PARSER()
123         
124         //should be set static 0 by sender and ignored by receiver
125         SENF_PARSER_PRIVATE_FIELD ( unused, UInt32Parser );
126         
127         SENF_PARSER_INIT() { 
128             unused() = 0; 
129         }
130         /*   Code     0 - No route to destination
131                     1 - Communication with destination
132                             administratively prohibited
133                     2 - Beyond scope of source address
134                     3 - Address unreachable
135                     4 - Port unreachable
136                     5 - Source address failed ingress/egress policy
137                     6 - Reject route to destination   */
138         void setErrCode(int code) {
139             ICMPv6Packet icmpv6 (senf::Packet().rfind<ICMPv6Packet>(senf::nothrow));
140             icmpv6->code() = code;
141         }
142         
143         SENF_PARSER_FINALIZE ( ICMPv6ErrDestUnreachableParser );
144     };
145     
146     /** \brief ICMPv6 Destination unreachable
147
148         \par Packet type (typedef):
149             \ref ICMPv6ErrDestUnreachable
150
151         \par Fields:
152             \ref ICMPv6ErrDestUnreachableParser
153             \image html ICMPv6ErrDestUnreachable.png
154  
155         \ingroup protocolbundle_default
156     */
157     struct ICMPv6ErrDestUnreachableType
158         : public PacketTypeBase,
159           public PacketTypeMixin<ICMPv6ErrDestUnreachableType>
160     {
161         typedef PacketTypeMixin<ICMPv6ErrDestUnreachableType> mixin;
162         typedef ConcretePacket<ICMPv6ErrDestUnreachableType> packet;
163         typedef ICMPv6ErrDestUnreachableParser parser;
164         
165         using mixin::nextPacketRange;
166         using mixin::init;
167         using mixin::initSize;
168         
169         static void dump(packet p, std::ostream & os);
170     };
171         
172     typedef ConcretePacket<ICMPv6ErrDestUnreachableType> ICMPv6ErrDestUnreachable;
173     
174     //#############################################################
175     //ICMPv6 Error Packet Too Big Message
176     //#############################################################
177     struct ICMPv6ErrTooBigParser : public PacketParserBase
178     {
179 #       include SENF_FIXED_PARSER()
180         SENF_PARSER_FIELD ( mtu, UInt32Parser );
181     
182         /*   Code     static set to 0       */
183         SENF_PARSER_INIT() {
184             ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
185             icmpv6->code() = 0;
186         }
187         
188         SENF_PARSER_FINALIZE ( ICMPv6ErrTooBigParser );
189     };
190     
191     /** \brief ICMPv6 Packet to big
192
193         \par Packet type (typedef):
194             \ref ICMPv6ErrTooBig
195
196         \par Fields:
197             \ref ICMPv6ErrTooBigParser
198             \image html ICMPv6ErrTooBig.png
199
200         \ingroup protocolbundle_default
201      */
202     struct ICMPv6ErrTooBigType
203         : public PacketTypeBase,
204           public PacketTypeMixin<ICMPv6ErrTooBigType>
205     {
206         typedef PacketTypeMixin<ICMPv6ErrTooBigType> mixin;
207         typedef ConcretePacket<ICMPv6ErrTooBigType> packet;
208         typedef ICMPv6ErrTooBigParser parser;
209         
210         using mixin::nextPacketRange;
211         using mixin::init;
212         using mixin::initSize;
213         
214         static void dump(packet p, std::ostream & os);
215     };
216
217     typedef ConcretePacket<ICMPv6ErrTooBigType> ICMPv6ErrTooBig;
218     
219     //#############################################################
220     //ICMPv6 Error Time Exceeded Message
221     //#############################################################
222     struct ICMPv6ErrTimeExceededParser : public PacketParserBase
223     {
224 #       include SENF_FIXED_PARSER()
225         //should be set static 0 by sender and ignored by receiver
226         SENF_PARSER_FIELD    ( unused, UInt32Parser );
227         /*  Code    0 - Hop limit exceeded in transit
228                     1 - Fragment reassembly time exceeded   */
229         void setErrCode(int code)
230         {
231             ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
232             icmpv6->code() = code;
233         }
234         
235         SENF_PARSER_FINALIZE ( ICMPv6ErrTimeExceededParser );
236     };
237     
238     /** \brief ICMPv6 Time exceeded
239
240         \par Packet type (typedef):
241             \ref ICMPv6ErrTimeExceeded
242
243         \par Fields:
244             \ref ICMPv6ErrTimeExceededParser
245             \image html ICMPv6ErrTimeExceeded.png
246
247         \ingroup protocolbundle_default
248      */
249     struct ICMPv6ErrTimeExceededType
250         : public PacketTypeBase,
251           public PacketTypeMixin<ICMPv6ErrTimeExceededType>
252     {
253         typedef PacketTypeMixin<ICMPv6ErrTimeExceededType> mixin;
254         typedef ConcretePacket<ICMPv6ErrTimeExceededType> packet;
255         typedef ICMPv6ErrTimeExceededParser parser;
256         
257         using mixin::nextPacketRange;
258         using mixin::init;
259         using mixin::initSize;
260         
261         static void dump(packet p, std::ostream & os);
262     };
263     typedef ConcretePacket<ICMPv6ErrTimeExceededType> ICMPv6ErrTimeExceeded;
264     
265     //#############################################################
266     //ICMPv6 Error Parameter Problem Message
267     //#############################################################
268     struct ICMPv6ErrParamProblemParser : public PacketParserBase
269     {
270 #       include SENF_FIXED_PARSER()
271         //should be set static 0 by sender and ignored by receiver
272         SENF_PARSER_FIELD ( pointer, UInt32Parser );
273         /*  Code      0 - Erroneous header field encountered
274                     1 - Unrecognized Next Header type encountered
275                     2 - Unrecognized IPv6 option encountered          */
276         
277         void setErrCode(int code)
278         {
279             ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
280             icmpv6->code() = code;
281         }
282         SENF_PARSER_FINALIZE ( ICMPv6ErrParamProblemParser );
283     };
284     
285     /** \brief ICMPv6 Parameter problem
286
287         \par Packet type (typedef):
288             \ref ICMPv6ErrParamProblem
289
290         \par Fields:
291             \ref ICMPv6ErrParamProblemParser
292             \image html ICMPv6ErrParamProblem.png
293
294         \ingroup protocolbundle_default
295      */
296     struct ICMPv6ErrParamProblemType
297         : public PacketTypeBase,
298           public PacketTypeMixin<ICMPv6ErrParamProblemType>
299     {
300         typedef PacketTypeMixin<ICMPv6ErrParamProblemType> mixin;
301         typedef ConcretePacket<ICMPv6ErrParamProblemType> packet;
302         typedef ICMPv6ErrParamProblemParser parser;
303         
304         using mixin::nextPacketRange;
305         using mixin::init;
306         using mixin::initSize;
307         
308         static void dump(packet p, std::ostream & os);
309     };
310     typedef ConcretePacket<ICMPv6ErrParamProblemType> ICMPv6ErrParamProblem;
311     
312     //#############################################################
313     //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Query
314     //#############################################################
315     struct MLDv2ListenerQueryParser : public PacketParserBase
316     {
317 #      include SENF_PARSER()
318         //need a variant here
319         // a.) maxResponseCode < 32768 =>Interger
320         // b.) maxResponseCode >=32768 => float (is there a float parser???)
321         /* 
322         float value as followed: 
323         0 1 2 3 4 5 6 7 8 9 A B C D E F
324         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
325         |1| exp |          mant         |
326         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
327         
328         SENF_PARSER_FIELD ( maxResponseCode, UInt16Parser       );
329         SENF_PARSER_FIELD ( reserved,        UInt16Parser       ); // set to zero by default
330         SENF_PARSER_FIELD ( mcAddress,       INet6AddressParser );
331         SENF_PARSER_BITFIELD ( resv,  4, unsigned ); // set to zero by default
332         SENF_PARSER_BITFIELD ( sFlag, 1, unsigned );
333         SENF_PARSER_BITFIELD ( qrv,   3, unsigned );
334         SENF_PARSER_FIELD    ( qqic, UInt8Parser );
335         SENF_PARSER_PRIVATE_FIELD ( nrSources, UInt16Parser );
336         SENF_PARSER_VECTOR   (srcAddresses, nrSources, INet6AddressParser );
337         
338         SENF_PARSER_FINALIZE ( MLDv2ListenerQueryParser );
339         
340         SENF_PARSER_INIT() { 
341             reserved() = 0; 
342             resv() = 0;
343         }
344     };
345     
346     /** \brief MLDv2 Listener query
347
348         \par Packet type (typedef):
349             \ref MLDv2ListenerQuery
350
351         \par Fields:
352             \ref MLDv2ListenerQueryParser
353             \image html MLDv2ListenerQuery.png
354
355         \ingroup protocolbundle_default
356      */
357     struct MLDv2ListenerQueryType
358         : public PacketTypeBase,
359           public PacketTypeMixin<MLDv2ListenerQueryType>
360     {
361         typedef PacketTypeMixin<MLDv2ListenerQueryType> mixin;
362         typedef ConcretePacket<MLDv2ListenerQueryType> packet;
363         typedef MLDv2ListenerQueryParser parser;
364         
365         using mixin::nextPacketRange;
366         using mixin::init;
367         using mixin::initSize;
368         
369         static void dump(packet p, std::ostream & os);
370     };
371         
372     typedef ConcretePacket<MLDv2ListenerQueryType> MLDv2ListenerQuery;
373     
374     //#############################################################
375     //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Report Message
376     //#############################################################
377     //First: the Multicast Address Record Parser
378     struct MLDv2AddressRecordParser : public PacketParserBase
379     {
380 #       include SENF_PARSER()
381         
382         SENF_PARSER_FIELD   ( recordType, UInt8Parser );
383         SENF_PARSER_PRIVATE_FIELD   ( auxDataLen, UInt8Parser );
384         SENF_PARSER_PRIVATE_FIELD   ( nrOfSrcs, UInt16Parser );
385         SENF_PARSER_FIELD   ( mcAddress, INet6AddressParser);
386         SENF_PARSER_VECTOR  ( srcAddresses, nrOfSrcs, INet6AddressParser );
387         SENF_PARSER_VECTOR  ( auxData, auxDataLen, UInt32Parser );
388         
389         SENF_PARSER_FINALIZE ( MLDv2AddressRecordParser );
390     };
391     
392     struct MLDv2ListenerReportParser : public PacketParserBase
393     {
394 #       include SENF_PARSER()
395         
396         SENF_PARSER_FIELD   ( reserved, UInt16Parser );   //set to zero by default
397         SENF_PARSER_PRIVATE_FIELD   ( nrMcastAddrRecords_, UInt16Parser );
398         SENF_PARSER_LIST    ( mcastAddrRecords, nrMcastAddrRecords_, MLDv2AddressRecordParser );
399         
400         SENF_PARSER_FINALIZE ( MLDv2ListenerReportParser );
401         
402         SENF_PARSER_INIT() { 
403             reserved() = 0; 
404         }
405     };
406     
407     /** \brief MLDv2 Listener report
408
409         \par Packet type (typedef):
410             \ref MLDv2ListenerReport
411
412         \par Fields:
413             \ref MLDv2ListenerReportParser
414             \image html MLDv2ListenerReport.png
415             \image html MLDv2AddressRecord.png
416
417         \ingroup protocolbundle_default
418      */
419     struct MLDv2ListenerReportType
420         : public PacketTypeBase,
421           public PacketTypeMixin<MLDv2ListenerReportType>
422     {
423         typedef PacketTypeMixin<MLDv2ListenerReportType> mixin;
424         typedef ConcretePacket<MLDv2ListenerReportType> packet;
425         typedef MLDv2ListenerReportParser parser;
426         
427         using mixin::nextPacketRange;
428         using mixin::init;
429         using mixin::initSize;
430         
431         static void dump(packet p, std::ostream & os);
432     };
433     typedef ConcretePacket<MLDv2ListenerReportType> MLDv2ListenerReport;
434
435     //#############################################################
436     //ICMPv6 Router Solicitation (RFC 4861) Message
437     //#############################################################
438     struct NDPRouterSolicitationParser : public PacketParserBase
439     {
440 #      include SENF_PARSER()
441         SENF_PARSER_FIELD    ( reserved, UInt32Parser );// set to zero by default
442         SENF_PARSER_LIST     ( options, packetSize(), senf::NDPGenericOptionParser );
443         SENF_PARSER_FINALIZE ( NDPRouterSolicitationParser );
444
445         SENF_PARSER_INIT() {
446             reserved() = 0;
447         }
448     };
449
450     /** \brief Router Solicitation Message
451
452         \par Packet type (typedef):
453             \ref NDPRouterSolicitationMessage
454
455         \par Fields:
456             \ref NDPRouterSolicitationParser
457             \image html NDPRouterSolicitationMessage.png
458
459         \ingroup protocolbundle_default
460      */
461     struct NDPRouterSolicitationMessageType
462         : public PacketTypeBase,
463           public PacketTypeMixin<NDPRouterSolicitationMessageType>
464     {
465         typedef PacketTypeMixin<NDPRouterSolicitationMessageType> mixin;
466         typedef ConcretePacket<NDPRouterSolicitationMessageType> packet;
467         typedef NDPRouterSolicitationParser parser;
468
469         using mixin::nextPacketRange;
470         using mixin::init;
471         using mixin::initSize;
472
473         static void dump(packet p, std::ostream & os);
474     };
475     typedef ConcretePacket<NDPRouterSolicitationMessageType> NDPRouterSolicitationMessage;
476
477     //#############################################################
478     //ICMPv6 Router Advertisement (RFC 4861) Message
479     //#############################################################
480     struct NDPRouterAdvertisementParser : public PacketParserBase
481     {
482 #      include SENF_PARSER()
483         SENF_PARSER_FIELD        ( curHopLimit, UInt8Parser );
484         SENF_PARSER_BITFIELD     ( m, 1, bool);
485         SENF_PARSER_BITFIELD     ( o, 1, bool);
486         SENF_PARSER_BITFIELD     ( reserved, 6, unsigned ); // set to zero by default
487         SENF_PARSER_FIELD        ( routerLifetime, UInt16Parser );
488         SENF_PARSER_FIELD        ( reachableTime, UInt32Parser );
489         SENF_PARSER_FIELD        ( retransTimer, UInt32Parser );
490         SENF_PARSER_LIST         ( options, packetSize(), senf::NDPGenericOptionParser );
491         SENF_PARSER_FINALIZE     ( NDPRouterAdvertisementParser );
492
493         SENF_PARSER_INIT() {
494             reserved() = 0;
495         }
496     };
497
498     /** \brief Router Advertisement Message
499
500         \par Packet type (typedef):
501             \ref NDPRouterAdvertisementMessage
502
503         \par Fields:
504             \ref NDPRouterAdvertisementParser
505             \imageMessage html NDPRouterAdvertisementMessage.png
506
507         \ingroup protocolbundle_default
508      */
509     struct NDPRouterAdvertisementMessageType
510         : public PacketTypeBase,
511           public PacketTypeMixin<NDPRouterAdvertisementMessageType>
512     {
513         typedef PacketTypeMixin<NDPRouterAdvertisementMessageType> mixin;
514         typedef ConcretePacket<NDPRouterAdvertisementMessageType> packet;
515         typedef NDPRouterAdvertisementParser parser;
516
517         using mixin::nextPacketRange;
518         using mixin::init;
519         using mixin::initSize;
520
521         static void dump(packet p, std::ostream & os);
522     };
523     typedef ConcretePacket<NDPRouterAdvertisementMessageType> NDPRouterAdvertisementMessage;
524
525     //#############################################################
526     //ICMPv6 Neighbor Solicitation (RFC 4861) Message
527     //#############################################################
528     struct NDPNeighborSolicitationParser : public PacketParserBase
529     {
530 #      include SENF_PARSER()
531         SENF_PARSER_BITFIELD  ( reserved, 32, unsigned ); // set to zero by default
532         SENF_PARSER_FIELD     ( target, INet6AddressParser );
533         SENF_PARSER_LIST      ( options, packetSize(), senf::NDPGenericOptionParser );
534         SENF_PARSER_FINALIZE  ( NDPNeighborSolicitationParser );
535
536         SENF_PARSER_INIT() {
537             reserved() = 0;
538         }
539     };
540
541     /** \brief Neighbor Solicitation Message
542
543         \par Packet type (typedef):
544             \ref NDPNeighborSolicitationMessage
545
546         \par Fields:
547             \ref NDPNeighborSolicitationParser
548             \imageMessage html NDPNeighborSolicitationMessage.png
549
550         \ingroup protocolbundle_default
551      */
552     struct NDPNeighborSolicitationMessageType
553         : public PacketTypeBase,
554           public PacketTypeMixin<NDPNeighborSolicitationMessageType>
555     {
556         typedef PacketTypeMixin<NDPNeighborSolicitationMessageType> mixin;
557         typedef ConcretePacket<NDPNeighborSolicitationMessageType> packet;
558         typedef NDPNeighborSolicitationParser parser;
559
560         using mixin::nextPacketRange;
561         using mixin::init;
562         using mixin::initSize;
563
564         static void dump(packet p, std::ostream & os);
565     };
566     typedef ConcretePacket<NDPNeighborSolicitationMessageType> NDPNeighborSolicitationMessage;
567
568     //#############################################################
569     //ICMPv6 Neighbor Advertisement (RFC 4861) Message
570     //#############################################################
571     struct NDPNeighborAdvertisementParser : public PacketParserBase
572     {
573 #      include SENF_PARSER()
574         SENF_PARSER_BITFIELD  ( r, 1, bool );
575         SENF_PARSER_BITFIELD  ( s, 1, bool );
576         SENF_PARSER_BITFIELD  ( o, 1, bool );
577         SENF_PARSER_BITFIELD  ( reserved, 29, unsigned ); // set to zero by default
578         SENF_PARSER_FIELD     ( target, INet6AddressParser );
579         SENF_PARSER_LIST      ( options, packetSize(), senf::NDPGenericOptionParser );
580         SENF_PARSER_FINALIZE  ( NDPNeighborAdvertisementParser );
581
582         SENF_PARSER_INIT() {
583             reserved() = 0;
584         }
585     };
586
587     /** \brief Neighbor Advertisement Message
588
589         \par Packet type (typedef):
590             \ref NDPNeighborAdvertisementParser
591
592         \par Fields:
593             \ref NDPNeighborAdvertisementParser
594             \imageMessage html NDPNeighborAdvertisementMessage.png
595
596         \ingroup protocolbundle_default
597      */
598     struct NDPNeighborAdvertisementMessageType
599         : public PacketTypeBase,
600           public PacketTypeMixin<NDPNeighborAdvertisementMessageType>
601     {
602         typedef PacketTypeMixin<NDPNeighborAdvertisementMessageType> mixin;
603         typedef ConcretePacket<NDPNeighborAdvertisementMessageType> packet;
604         typedef NDPNeighborAdvertisementParser parser;
605
606         using mixin::nextPacketRange;
607         using mixin::init;
608         using mixin::initSize;
609
610         static void dump(packet p, std::ostream & os);
611     };
612     typedef ConcretePacket<NDPNeighborAdvertisementMessageType> NDPNeighborAdvertisementMessage;
613
614     //#############################################################
615     //ICMPv6 Redirect (RFC 4861) Message
616     //#############################################################
617     struct  NDPRedirectParser : public PacketParserBase
618     {
619 #      include SENF_PARSER()
620         SENF_PARSER_BITFIELD  ( reserved, 32, unsigned ); // set to zero by default
621         SENF_PARSER_FIELD     ( target, INet6AddressParser );
622         SENF_PARSER_FIELD     ( destination, INet6AddressParser );
623         SENF_PARSER_LIST      ( options, packetSize(), senf::NDPGenericOptionParser );
624         SENF_PARSER_FINALIZE  ( NDPRedirectParser );
625
626         SENF_PARSER_INIT() {
627             reserved() = 0;
628
629         }
630     };
631
632     /** \brief Redirect Message
633
634         \par Packet type (typedef):
635             \ref NDPRedirectParser
636
637         \par Fields:
638             \ref NDPRedirectParser
639             \imageMessage html NDPRedirectMessage.png
640
641         \ingroup protocolbundle_default
642      */
643     struct NDPRedirectMessageType
644         : public PacketTypeBase,
645           public PacketTypeMixin<NDPRedirectMessageType>
646     {
647         typedef PacketTypeMixin<NDPRedirectMessageType> mixin;
648         typedef ConcretePacket<NDPRedirectMessageType> packet;
649         typedef NDPRedirectParser parser;
650
651         using mixin::nextPacketRange;
652         using mixin::init;
653         using mixin::initSize;
654
655         static void dump(packet p, std::ostream & os);
656     };
657     typedef ConcretePacket<NDPRedirectMessageType> NDPRedirectMessage;
658 }
659
660 #endif
661
662 \f
663 // Local Variables:
664 // mode: c++
665 // fill-column: 100
666 // c-file-style: "senf"
667 // indent-tabs-mode: nil
668 // ispell-local-dictionary: "american"
669 // compile-command: "scons -u test"
670 // comment-column: 40
671 // End: