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