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