4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
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
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.
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.
19 // The Original Code is Fraunhofer FOKUS code.
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.
26 // Philipp Batroff <pug@berlios.de>
29 // Definition of non-inline non-template functions
31 #ifndef HH_SENF_Packets_DefaultBundle_ICMPv6TypePacket_
32 #define HH_SENF_Packets_DefaultBundle_ICMPv6TypePacket_ 1
35 #include <senf/Packets/Packets.hh>
36 #include "NDPOptions.hh"
37 #include "ICMPv6Packet.hh"
39 //-/////////////////////////////////////////////////////////////////////////////////////////////////
42 //#############################################################
44 //#############################################################
45 struct ICMPv6EchoRequestParser : public PacketParserBase
47 # include SENF_FIXED_PARSER()
48 SENF_PARSER_FIELD ( identifier, UInt16Parser );
49 SENF_PARSER_FIELD ( seqNr, UInt16Parser );
51 SENF_PARSER_FINALIZE ( ICMPv6EchoRequestParser );
54 /** \brief ICMPv6 Echo Request
56 \par Packet type (typedef):
57 \ref ICMPv6EchoRequest
60 \ref ICMPv6EchoRequestParser
61 \image html ICMPv6EchoRequest.png
63 \ingroup protocolbundle_default
65 struct ICMPv6EchoRequestType
66 : public PacketTypeBase,
67 public PacketTypeMixin<ICMPv6EchoRequestType>
69 typedef PacketTypeMixin<ICMPv6EchoRequestType> mixin;
70 typedef ConcretePacket<ICMPv6EchoRequestType> packet;
71 typedef ICMPv6EchoRequestParser parser;
73 using mixin::nextPacketRange;
75 using mixin::initSize;
77 static void dump(packet p, std::ostream & os);
80 typedef ConcretePacket<ICMPv6EchoRequestType> ICMPv6EchoRequest;
82 //#############################################################
84 //#############################################################
85 struct ICMPv6EchoReplyParser : public PacketParserBase
87 # include SENF_FIXED_PARSER()
88 SENF_PARSER_FIELD ( identifier, UInt16Parser );
89 SENF_PARSER_FIELD ( seqNr, UInt16Parser );
91 SENF_PARSER_FINALIZE ( ICMPv6EchoReplyParser );
94 /** \brief ICMPv6 Echo Reply
96 \par Packet type (typedef):
100 \ref ICMPv6EchoReplyParser
101 \image html ICMPv6EchoReply.png
103 \ingroup protocolbundle_default
105 struct ICMPv6EchoReplyType
106 : public PacketTypeBase,
107 public PacketTypeMixin<ICMPv6EchoReplyType>
109 typedef PacketTypeMixin<ICMPv6EchoReplyType> mixin;
110 typedef ConcretePacket<ICMPv6EchoReplyType> packet;
111 typedef ICMPv6EchoReplyParser parser;
113 using mixin::nextPacketRange;
115 using mixin::initSize;
117 static void dump(packet p, std::ostream & os);
120 typedef ConcretePacket<ICMPv6EchoReplyType> ICMPv6EchoReply;
122 //#############################################################
123 //ICMPv6 Error Destination Unreachable Message
124 //#############################################################
125 struct ICMPv6ErrDestUnreachableParser : public PacketParserBase
127 # include SENF_FIXED_PARSER()
129 //should be set static 0 by sender and ignored by receiver
130 SENF_PARSER_PRIVATE_FIELD ( unused, UInt32Parser );
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
141 5 - Source address failed ingress/egress policy
142 6 - Reject route to destination */
143 void setErrCode(int code);
145 SENF_PARSER_FINALIZE ( ICMPv6ErrDestUnreachableParser );
148 /** \brief ICMPv6 Destination unreachable
150 \par Packet type (typedef):
151 \ref ICMPv6ErrDestUnreachable
154 \ref ICMPv6ErrDestUnreachableParser
155 \image html ICMPv6ErrDestUnreachable.png
157 \ingroup protocolbundle_default
159 struct ICMPv6ErrDestUnreachableType
160 : public PacketTypeBase,
161 public PacketTypeMixin<ICMPv6ErrDestUnreachableType>
163 typedef PacketTypeMixin<ICMPv6ErrDestUnreachableType> mixin;
164 typedef ConcretePacket<ICMPv6ErrDestUnreachableType> packet;
165 typedef ICMPv6ErrDestUnreachableParser parser;
167 using mixin::nextPacketRange;
169 using mixin::initSize;
171 static void dump(packet p, std::ostream & os);
174 typedef ConcretePacket<ICMPv6ErrDestUnreachableType> ICMPv6ErrDestUnreachable;
176 //#############################################################
177 //ICMPv6 Error Packet Too Big Message
178 //#############################################################
179 struct ICMPv6ErrTooBigParser : public PacketParserBase
181 # include SENF_FIXED_PARSER()
182 SENF_PARSER_FIELD ( mtu, UInt32Parser );
184 /* Code static set to 0 */
186 ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
190 SENF_PARSER_FINALIZE ( ICMPv6ErrTooBigParser );
193 /** \brief ICMPv6 Packet to big
195 \par Packet type (typedef):
199 \ref ICMPv6ErrTooBigParser
200 \image html ICMPv6ErrTooBig.png
202 \ingroup protocolbundle_default
204 struct ICMPv6ErrTooBigType
205 : public PacketTypeBase,
206 public PacketTypeMixin<ICMPv6ErrTooBigType>
208 typedef PacketTypeMixin<ICMPv6ErrTooBigType> mixin;
209 typedef ConcretePacket<ICMPv6ErrTooBigType> packet;
210 typedef ICMPv6ErrTooBigParser parser;
212 using mixin::nextPacketRange;
214 using mixin::initSize;
216 static void dump(packet p, std::ostream & os);
219 typedef ConcretePacket<ICMPv6ErrTooBigType> ICMPv6ErrTooBig;
221 //#############################################################
222 //ICMPv6 Error Time Exceeded Message
223 //#############################################################
224 struct ICMPv6ErrTimeExceededParser : public PacketParserBase
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);
233 SENF_PARSER_FINALIZE ( ICMPv6ErrTimeExceededParser );
236 /** \brief ICMPv6 Time exceeded
238 \par Packet type (typedef):
239 \ref ICMPv6ErrTimeExceeded
242 \ref ICMPv6ErrTimeExceededParser
243 \image html ICMPv6ErrTimeExceeded.png
245 \ingroup protocolbundle_default
247 struct ICMPv6ErrTimeExceededType
248 : public PacketTypeBase,
249 public PacketTypeMixin<ICMPv6ErrTimeExceededType>
251 typedef PacketTypeMixin<ICMPv6ErrTimeExceededType> mixin;
252 typedef ConcretePacket<ICMPv6ErrTimeExceededType> packet;
253 typedef ICMPv6ErrTimeExceededParser parser;
255 using mixin::nextPacketRange;
257 using mixin::initSize;
259 static void dump(packet p, std::ostream & os);
261 typedef ConcretePacket<ICMPv6ErrTimeExceededType> ICMPv6ErrTimeExceeded;
263 //#############################################################
264 //ICMPv6 Error Parameter Problem Message
265 //#############################################################
266 struct ICMPv6ErrParamProblemParser : public PacketParserBase
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 */
275 void setErrCode(int code);
277 SENF_PARSER_FINALIZE ( ICMPv6ErrParamProblemParser );
280 /** \brief ICMPv6 Parameter problem
282 \par Packet type (typedef):
283 \ref ICMPv6ErrParamProblem
286 \ref ICMPv6ErrParamProblemParser
287 \image html ICMPv6ErrParamProblem.png
289 \ingroup protocolbundle_default
291 struct ICMPv6ErrParamProblemType
292 : public PacketTypeBase,
293 public PacketTypeMixin<ICMPv6ErrParamProblemType>
295 typedef PacketTypeMixin<ICMPv6ErrParamProblemType> mixin;
296 typedef ConcretePacket<ICMPv6ErrParamProblemType> packet;
297 typedef ICMPv6ErrParamProblemParser parser;
299 using mixin::nextPacketRange;
301 using mixin::initSize;
303 static void dump(packet p, std::ostream & os);
305 typedef ConcretePacket<ICMPv6ErrParamProblemType> ICMPv6ErrParamProblem;
307 //#############################################################
308 //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Query
309 //#############################################################
310 struct MLDv2ListenerQueryParser : public PacketParserBase
312 # include SENF_PARSER()
313 //need a variant here
314 // a.) maxResponseCode < 32768 =>Interger
315 // b.) maxResponseCode >=32768 => float (is there a float parser???)
317 float value as followed:
318 0 1 2 3 4 5 6 7 8 9 A B C D E F
319 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
321 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
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 );
333 SENF_PARSER_FINALIZE ( MLDv2ListenerQueryParser );
341 /** \brief MLDv2 Listener query
343 \par Packet type (typedef):
344 \ref MLDv2ListenerQuery
347 \ref MLDv2ListenerQueryParser
348 \image html MLDv2ListenerQuery.png
350 \ingroup protocolbundle_default
352 struct MLDv2ListenerQueryType
353 : public PacketTypeBase,
354 public PacketTypeMixin<MLDv2ListenerQueryType>
356 typedef PacketTypeMixin<MLDv2ListenerQueryType> mixin;
357 typedef ConcretePacket<MLDv2ListenerQueryType> packet;
358 typedef MLDv2ListenerQueryParser parser;
360 using mixin::nextPacketRange;
362 using mixin::initSize;
364 static void dump(packet p, std::ostream & os);
367 typedef ConcretePacket<MLDv2ListenerQueryType> MLDv2ListenerQuery;
369 //#############################################################
370 //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Report Message
371 //#############################################################
372 //First: the Multicast Address Record Parser
373 struct MLDv2AddressRecordParser : public PacketParserBase
375 # include SENF_PARSER()
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 );
384 SENF_PARSER_FINALIZE ( MLDv2AddressRecordParser );
387 struct MLDv2ListenerReportParser : public PacketParserBase
389 # include SENF_PARSER()
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 );
395 SENF_PARSER_FINALIZE ( MLDv2ListenerReportParser );
402 /** \brief MLDv2 Listener report
404 \par Packet type (typedef):
405 \ref MLDv2ListenerReport
408 \ref MLDv2ListenerReportParser
409 \image html MLDv2ListenerReport.png
410 \image html MLDv2AddressRecord.png
412 \ingroup protocolbundle_default
414 struct MLDv2ListenerReportType
415 : public PacketTypeBase,
416 public PacketTypeMixin<MLDv2ListenerReportType>
418 typedef PacketTypeMixin<MLDv2ListenerReportType> mixin;
419 typedef ConcretePacket<MLDv2ListenerReportType> packet;
420 typedef MLDv2ListenerReportParser parser;
422 using mixin::nextPacketRange;
424 using mixin::initSize;
426 static void dump(packet p, std::ostream & os);
428 typedef ConcretePacket<MLDv2ListenerReportType> MLDv2ListenerReport;
430 //#############################################################
431 //ICMPv6 Router Solicitation (RFC 4861) Message
432 //#############################################################
433 struct NDPRouterSolicitationParser : public PacketParserBase
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 );
445 /** \brief Router Solicitation Message
447 \par Packet type (typedef):
448 \ref NDPRouterSolicitationMessage
451 \ref NDPRouterSolicitationParser
452 \image html NDPRouterSolicitationMessage.png
454 \ingroup protocolbundle_default
456 struct NDPRouterSolicitationMessageType
457 : public PacketTypeBase,
458 public PacketTypeMixin<NDPRouterSolicitationMessageType>
460 typedef PacketTypeMixin<NDPRouterSolicitationMessageType> mixin;
461 typedef ConcretePacket<NDPRouterSolicitationMessageType> packet;
462 typedef NDPRouterSolicitationParser parser;
464 using mixin::nextPacketRange;
466 using mixin::initSize;
468 static void dump(packet p, std::ostream & os);
470 typedef ConcretePacket<NDPRouterSolicitationMessageType> NDPRouterSolicitationMessage;
472 //#############################################################
473 //ICMPv6 Router Advertisement (RFC 4861) Message
474 //#############################################################
475 struct NDPRouterAdvertisementParser : public PacketParserBase
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 );
493 /** \brief Router Advertisement Message
495 \par Packet type (typedef):
496 \ref NDPRouterAdvertisementMessage
499 \ref NDPRouterAdvertisementParser
500 \imageMessage html NDPRouterAdvertisementMessage.png
502 \ingroup protocolbundle_default
504 struct NDPRouterAdvertisementMessageType
505 : public PacketTypeBase,
506 public PacketTypeMixin<NDPRouterAdvertisementMessageType>
508 typedef PacketTypeMixin<NDPRouterAdvertisementMessageType> mixin;
509 typedef ConcretePacket<NDPRouterAdvertisementMessageType> packet;
510 typedef NDPRouterAdvertisementParser parser;
512 using mixin::nextPacketRange;
514 using mixin::initSize;
516 static void dump(packet p, std::ostream & os);
518 typedef ConcretePacket<NDPRouterAdvertisementMessageType> NDPRouterAdvertisementMessage;
520 //#############################################################
521 //ICMPv6 Neighbor Solicitation (RFC 4861) Message
522 //#############################################################
523 struct NDPNeighborSolicitationParser : public PacketParserBase
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 );
536 /** \brief Neighbor Solicitation Message
538 \par Packet type (typedef):
539 \ref NDPNeighborSolicitationMessage
542 \ref NDPNeighborSolicitationParser
543 \imageMessage html NDPNeighborSolicitationMessage.png
545 \ingroup protocolbundle_default
547 struct NDPNeighborSolicitationMessageType
548 : public PacketTypeBase,
549 public PacketTypeMixin<NDPNeighborSolicitationMessageType>
551 typedef PacketTypeMixin<NDPNeighborSolicitationMessageType> mixin;
552 typedef ConcretePacket<NDPNeighborSolicitationMessageType> packet;
553 typedef NDPNeighborSolicitationParser parser;
555 using mixin::nextPacketRange;
557 using mixin::initSize;
559 static void dump(packet p, std::ostream & os);
561 typedef ConcretePacket<NDPNeighborSolicitationMessageType> NDPNeighborSolicitationMessage;
563 //#############################################################
564 //ICMPv6 Neighbor Advertisement (RFC 4861) Message
565 //#############################################################
566 struct NDPNeighborAdvertisementParser : public PacketParserBase
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 );
582 /** \brief Neighbor Advertisement Message
584 \par Packet type (typedef):
585 \ref NDPNeighborAdvertisementParser
588 \ref NDPNeighborAdvertisementParser
589 \imageMessage html NDPNeighborAdvertisementMessage.png
591 \ingroup protocolbundle_default
593 struct NDPNeighborAdvertisementMessageType
594 : public PacketTypeBase,
595 public PacketTypeMixin<NDPNeighborAdvertisementMessageType>
597 typedef PacketTypeMixin<NDPNeighborAdvertisementMessageType> mixin;
598 typedef ConcretePacket<NDPNeighborAdvertisementMessageType> packet;
599 typedef NDPNeighborAdvertisementParser parser;
601 using mixin::nextPacketRange;
603 using mixin::initSize;
605 static void dump(packet p, std::ostream & os);
607 typedef ConcretePacket<NDPNeighborAdvertisementMessageType> NDPNeighborAdvertisementMessage;
609 //#############################################################
610 //ICMPv6 Redirect (RFC 4861) Message
611 //#############################################################
612 struct NDPRedirectParser : public PacketParserBase
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 );
627 /** \brief Redirect Message
629 \par Packet type (typedef):
630 \ref NDPRedirectParser
633 \ref NDPRedirectParser
634 \imageMessage html NDPRedirectMessage.png
636 \ingroup protocolbundle_default
638 struct NDPRedirectMessageType
639 : public PacketTypeBase,
640 public PacketTypeMixin<NDPRedirectMessageType>
642 typedef PacketTypeMixin<NDPRedirectMessageType> mixin;
643 typedef ConcretePacket<NDPRedirectMessageType> packet;
644 typedef NDPRedirectParser parser;
646 using mixin::nextPacketRange;
648 using mixin::initSize;
650 static void dump(packet p, std::ostream & os);
652 typedef ConcretePacket<NDPRedirectMessageType> NDPRedirectMessage;
655 //-/////////////////////////////////////////////////////////////////////////////////////////////////
656 //#include "ICMPv6TypePacket.cci"
657 //#include "ICMPv6TypePacket.ct"
658 //#include "ICMPv6TypePacket.cti"
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