4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Philipp Batroff <pug@berlios.de>
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.
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.
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.
23 // Definition of non-inline non-template functions
25 #ifndef HH_SENF_Packets_DefaultBundle_ICMPv6TypePacket_
26 #define HH_SENF_Packets_DefaultBundle_ICMPv6TypePacket_ 1
29 #include <senf/Packets/Packets.hh>
30 #include "NDPOptions.hh"
31 #include "ICMPv6Packet.hh"
33 //-/////////////////////////////////////////////////////////////////////////////////////////////////
36 //#############################################################
38 //#############################################################
39 struct ICMPv6EchoRequestParser : public PacketParserBase
41 # include SENF_FIXED_PARSER()
42 SENF_PARSER_FIELD ( identifier, UInt16Parser );
43 SENF_PARSER_FIELD ( seqNr, UInt16Parser );
45 SENF_PARSER_FINALIZE ( ICMPv6EchoRequestParser );
48 /** \brief ICMPv6 Echo Request
50 \par Packet type (typedef):
51 \ref ICMPv6EchoRequest
54 \ref ICMPv6EchoRequestParser
55 \image html ICMPv6EchoRequest.png
57 \ingroup protocolbundle_default
59 struct ICMPv6EchoRequestType
60 : public PacketTypeBase,
61 public PacketTypeMixin<ICMPv6EchoRequestType>
63 typedef PacketTypeMixin<ICMPv6EchoRequestType> mixin;
64 typedef ConcretePacket<ICMPv6EchoRequestType> packet;
65 typedef ICMPv6EchoRequestParser parser;
67 using mixin::nextPacketRange;
69 using mixin::initSize;
71 static void dump(packet p, std::ostream & os);
74 typedef ConcretePacket<ICMPv6EchoRequestType> ICMPv6EchoRequest;
76 //#############################################################
78 //#############################################################
79 struct ICMPv6EchoReplyParser : public PacketParserBase
81 # include SENF_FIXED_PARSER()
82 SENF_PARSER_FIELD ( identifier, UInt16Parser );
83 SENF_PARSER_FIELD ( seqNr, UInt16Parser );
85 SENF_PARSER_FINALIZE ( ICMPv6EchoReplyParser );
88 /** \brief ICMPv6 Echo Reply
90 \par Packet type (typedef):
94 \ref ICMPv6EchoReplyParser
95 \image html ICMPv6EchoReply.png
97 \ingroup protocolbundle_default
99 struct ICMPv6EchoReplyType
100 : public PacketTypeBase,
101 public PacketTypeMixin<ICMPv6EchoReplyType>
103 typedef PacketTypeMixin<ICMPv6EchoReplyType> mixin;
104 typedef ConcretePacket<ICMPv6EchoReplyType> packet;
105 typedef ICMPv6EchoReplyParser parser;
107 using mixin::nextPacketRange;
109 using mixin::initSize;
111 static void dump(packet p, std::ostream & os);
114 typedef ConcretePacket<ICMPv6EchoReplyType> ICMPv6EchoReply;
116 //#############################################################
117 //ICMPv6 Error Destination Unreachable Message
118 //#############################################################
119 struct ICMPv6ErrDestUnreachableParser : public PacketParserBase
121 # include SENF_FIXED_PARSER()
123 //should be set static 0 by sender and ignored by receiver
124 SENF_PARSER_PRIVATE_FIELD ( unused, UInt32Parser );
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
135 5 - Source address failed ingress/egress policy
136 6 - Reject route to destination */
137 void setErrCode(int code);
139 SENF_PARSER_FINALIZE ( ICMPv6ErrDestUnreachableParser );
142 /** \brief ICMPv6 Destination unreachable
144 \par Packet type (typedef):
145 \ref ICMPv6ErrDestUnreachable
148 \ref ICMPv6ErrDestUnreachableParser
149 \image html ICMPv6ErrDestUnreachable.png
151 \ingroup protocolbundle_default
153 struct ICMPv6ErrDestUnreachableType
154 : public PacketTypeBase,
155 public PacketTypeMixin<ICMPv6ErrDestUnreachableType>
157 typedef PacketTypeMixin<ICMPv6ErrDestUnreachableType> mixin;
158 typedef ConcretePacket<ICMPv6ErrDestUnreachableType> packet;
159 typedef ICMPv6ErrDestUnreachableParser parser;
161 using mixin::nextPacketRange;
163 using mixin::initSize;
165 static void dump(packet p, std::ostream & os);
168 typedef ConcretePacket<ICMPv6ErrDestUnreachableType> ICMPv6ErrDestUnreachable;
170 //#############################################################
171 //ICMPv6 Error Packet Too Big Message
172 //#############################################################
173 struct ICMPv6ErrTooBigParser : public PacketParserBase
175 # include SENF_FIXED_PARSER()
176 SENF_PARSER_FIELD ( mtu, UInt32Parser );
178 /* Code static set to 0 */
180 ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
184 SENF_PARSER_FINALIZE ( ICMPv6ErrTooBigParser );
187 /** \brief ICMPv6 Packet to big
189 \par Packet type (typedef):
193 \ref ICMPv6ErrTooBigParser
194 \image html ICMPv6ErrTooBig.png
196 \ingroup protocolbundle_default
198 struct ICMPv6ErrTooBigType
199 : public PacketTypeBase,
200 public PacketTypeMixin<ICMPv6ErrTooBigType>
202 typedef PacketTypeMixin<ICMPv6ErrTooBigType> mixin;
203 typedef ConcretePacket<ICMPv6ErrTooBigType> packet;
204 typedef ICMPv6ErrTooBigParser parser;
206 using mixin::nextPacketRange;
208 using mixin::initSize;
210 static void dump(packet p, std::ostream & os);
213 typedef ConcretePacket<ICMPv6ErrTooBigType> ICMPv6ErrTooBig;
215 //#############################################################
216 //ICMPv6 Error Time Exceeded Message
217 //#############################################################
218 struct ICMPv6ErrTimeExceededParser : public PacketParserBase
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);
227 SENF_PARSER_FINALIZE ( ICMPv6ErrTimeExceededParser );
230 /** \brief ICMPv6 Time exceeded
232 \par Packet type (typedef):
233 \ref ICMPv6ErrTimeExceeded
236 \ref ICMPv6ErrTimeExceededParser
237 \image html ICMPv6ErrTimeExceeded.png
239 \ingroup protocolbundle_default
241 struct ICMPv6ErrTimeExceededType
242 : public PacketTypeBase,
243 public PacketTypeMixin<ICMPv6ErrTimeExceededType>
245 typedef PacketTypeMixin<ICMPv6ErrTimeExceededType> mixin;
246 typedef ConcretePacket<ICMPv6ErrTimeExceededType> packet;
247 typedef ICMPv6ErrTimeExceededParser parser;
249 using mixin::nextPacketRange;
251 using mixin::initSize;
253 static void dump(packet p, std::ostream & os);
255 typedef ConcretePacket<ICMPv6ErrTimeExceededType> ICMPv6ErrTimeExceeded;
257 //#############################################################
258 //ICMPv6 Error Parameter Problem Message
259 //#############################################################
260 struct ICMPv6ErrParamProblemParser : public PacketParserBase
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 */
269 void setErrCode(int code);
271 SENF_PARSER_FINALIZE ( ICMPv6ErrParamProblemParser );
274 /** \brief ICMPv6 Parameter problem
276 \par Packet type (typedef):
277 \ref ICMPv6ErrParamProblem
280 \ref ICMPv6ErrParamProblemParser
281 \image html ICMPv6ErrParamProblem.png
283 \ingroup protocolbundle_default
285 struct ICMPv6ErrParamProblemType
286 : public PacketTypeBase,
287 public PacketTypeMixin<ICMPv6ErrParamProblemType>
289 typedef PacketTypeMixin<ICMPv6ErrParamProblemType> mixin;
290 typedef ConcretePacket<ICMPv6ErrParamProblemType> packet;
291 typedef ICMPv6ErrParamProblemParser parser;
293 using mixin::nextPacketRange;
295 using mixin::initSize;
297 static void dump(packet p, std::ostream & os);
299 typedef ConcretePacket<ICMPv6ErrParamProblemType> ICMPv6ErrParamProblem;
301 //#############################################################
302 //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Query
303 //#############################################################
304 struct MLDv2ListenerQueryParser : public PacketParserBase
306 # include SENF_PARSER()
307 //need a variant here
308 // a.) maxResponseCode < 32768 =>Interger
309 // b.) maxResponseCode >=32768 => float (is there a float parser???)
311 float value as followed:
312 0 1 2 3 4 5 6 7 8 9 A B C D E F
313 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
315 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
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 );
327 SENF_PARSER_FINALIZE ( MLDv2ListenerQueryParser );
335 /** \brief MLDv2 Listener query
337 \par Packet type (typedef):
338 \ref MLDv2ListenerQuery
341 \ref MLDv2ListenerQueryParser
342 \image html MLDv2ListenerQuery.png
344 \ingroup protocolbundle_default
346 struct MLDv2ListenerQueryType
347 : public PacketTypeBase,
348 public PacketTypeMixin<MLDv2ListenerQueryType>
350 typedef PacketTypeMixin<MLDv2ListenerQueryType> mixin;
351 typedef ConcretePacket<MLDv2ListenerQueryType> packet;
352 typedef MLDv2ListenerQueryParser parser;
354 using mixin::nextPacketRange;
356 using mixin::initSize;
358 static void dump(packet p, std::ostream & os);
361 typedef ConcretePacket<MLDv2ListenerQueryType> MLDv2ListenerQuery;
363 //#############################################################
364 //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Report Message
365 //#############################################################
366 //First: the Multicast Address Record Parser
367 struct MLDv2AddressRecordParser : public PacketParserBase
369 # include SENF_PARSER()
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 );
378 SENF_PARSER_FINALIZE ( MLDv2AddressRecordParser );
381 struct MLDv2ListenerReportParser : public PacketParserBase
383 # include SENF_PARSER()
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 );
389 SENF_PARSER_FINALIZE ( MLDv2ListenerReportParser );
396 /** \brief MLDv2 Listener report
398 \par Packet type (typedef):
399 \ref MLDv2ListenerReport
402 \ref MLDv2ListenerReportParser
403 \image html MLDv2ListenerReport.png
404 \image html MLDv2AddressRecord.png
406 \ingroup protocolbundle_default
408 struct MLDv2ListenerReportType
409 : public PacketTypeBase,
410 public PacketTypeMixin<MLDv2ListenerReportType>
412 typedef PacketTypeMixin<MLDv2ListenerReportType> mixin;
413 typedef ConcretePacket<MLDv2ListenerReportType> packet;
414 typedef MLDv2ListenerReportParser parser;
416 using mixin::nextPacketRange;
418 using mixin::initSize;
420 static void dump(packet p, std::ostream & os);
422 typedef ConcretePacket<MLDv2ListenerReportType> MLDv2ListenerReport;
424 //#############################################################
425 //ICMPv6 Router Solicitation (RFC 4861) Message
426 //#############################################################
427 struct NDPRouterSolicitationParser : public PacketParserBase
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 );
439 /** \brief Router Solicitation Message
441 \par Packet type (typedef):
442 \ref NDPRouterSolicitationMessage
445 \ref NDPRouterSolicitationParser
446 \image html NDPRouterSolicitationMessage.png
448 \ingroup protocolbundle_default
450 struct NDPRouterSolicitationMessageType
451 : public PacketTypeBase,
452 public PacketTypeMixin<NDPRouterSolicitationMessageType>
454 typedef PacketTypeMixin<NDPRouterSolicitationMessageType> mixin;
455 typedef ConcretePacket<NDPRouterSolicitationMessageType> packet;
456 typedef NDPRouterSolicitationParser parser;
458 using mixin::nextPacketRange;
460 using mixin::initSize;
462 static void dump(packet p, std::ostream & os);
464 typedef ConcretePacket<NDPRouterSolicitationMessageType> NDPRouterSolicitationMessage;
466 //#############################################################
467 //ICMPv6 Router Advertisement (RFC 4861) Message
468 //#############################################################
469 struct NDPRouterAdvertisementParser : public PacketParserBase
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 );
487 /** \brief Router Advertisement Message
489 \par Packet type (typedef):
490 \ref NDPRouterAdvertisementMessage
493 \ref NDPRouterAdvertisementParser
494 \imageMessage html NDPRouterAdvertisementMessage.png
496 \ingroup protocolbundle_default
498 struct NDPRouterAdvertisementMessageType
499 : public PacketTypeBase,
500 public PacketTypeMixin<NDPRouterAdvertisementMessageType>
502 typedef PacketTypeMixin<NDPRouterAdvertisementMessageType> mixin;
503 typedef ConcretePacket<NDPRouterAdvertisementMessageType> packet;
504 typedef NDPRouterAdvertisementParser parser;
506 using mixin::nextPacketRange;
508 using mixin::initSize;
510 static void dump(packet p, std::ostream & os);
512 typedef ConcretePacket<NDPRouterAdvertisementMessageType> NDPRouterAdvertisementMessage;
514 //#############################################################
515 //ICMPv6 Neighbor Solicitation (RFC 4861) Message
516 //#############################################################
517 struct NDPNeighborSolicitationParser : public PacketParserBase
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 );
530 /** \brief Neighbor Solicitation Message
532 \par Packet type (typedef):
533 \ref NDPNeighborSolicitationMessage
536 \ref NDPNeighborSolicitationParser
537 \imageMessage html NDPNeighborSolicitationMessage.png
539 \ingroup protocolbundle_default
541 struct NDPNeighborSolicitationMessageType
542 : public PacketTypeBase,
543 public PacketTypeMixin<NDPNeighborSolicitationMessageType>
545 typedef PacketTypeMixin<NDPNeighborSolicitationMessageType> mixin;
546 typedef ConcretePacket<NDPNeighborSolicitationMessageType> packet;
547 typedef NDPNeighborSolicitationParser parser;
549 using mixin::nextPacketRange;
551 using mixin::initSize;
553 static void dump(packet p, std::ostream & os);
555 typedef ConcretePacket<NDPNeighborSolicitationMessageType> NDPNeighborSolicitationMessage;
557 //#############################################################
558 //ICMPv6 Neighbor Advertisement (RFC 4861) Message
559 //#############################################################
560 struct NDPNeighborAdvertisementParser : public PacketParserBase
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 );
576 /** \brief Neighbor Advertisement Message
578 \par Packet type (typedef):
579 \ref NDPNeighborAdvertisementParser
582 \ref NDPNeighborAdvertisementParser
583 \imageMessage html NDPNeighborAdvertisementMessage.png
585 \ingroup protocolbundle_default
587 struct NDPNeighborAdvertisementMessageType
588 : public PacketTypeBase,
589 public PacketTypeMixin<NDPNeighborAdvertisementMessageType>
591 typedef PacketTypeMixin<NDPNeighborAdvertisementMessageType> mixin;
592 typedef ConcretePacket<NDPNeighborAdvertisementMessageType> packet;
593 typedef NDPNeighborAdvertisementParser parser;
595 using mixin::nextPacketRange;
597 using mixin::initSize;
599 static void dump(packet p, std::ostream & os);
601 typedef ConcretePacket<NDPNeighborAdvertisementMessageType> NDPNeighborAdvertisementMessage;
603 //#############################################################
604 //ICMPv6 Redirect (RFC 4861) Message
605 //#############################################################
606 struct NDPRedirectParser : public PacketParserBase
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 );
621 /** \brief Redirect Message
623 \par Packet type (typedef):
624 \ref NDPRedirectParser
627 \ref NDPRedirectParser
628 \imageMessage html NDPRedirectMessage.png
630 \ingroup protocolbundle_default
632 struct NDPRedirectMessageType
633 : public PacketTypeBase,
634 public PacketTypeMixin<NDPRedirectMessageType>
636 typedef PacketTypeMixin<NDPRedirectMessageType> mixin;
637 typedef ConcretePacket<NDPRedirectMessageType> packet;
638 typedef NDPRedirectParser parser;
640 using mixin::nextPacketRange;
642 using mixin::initSize;
644 static void dump(packet p, std::ostream & os);
646 typedef ConcretePacket<NDPRedirectMessageType> NDPRedirectMessage;
649 //-/////////////////////////////////////////////////////////////////////////////////////////////////
650 //#include "ICMPv6TypePacket.cci"
651 //#include "ICMPv6TypePacket.ct"
652 //#include "ICMPv6TypePacket.cti"
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