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