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 "IPv6Packet.hh"
31 #include "ICMPv6Packet.hh"
32 #include "ListOptionTypeParser.hh"
33 #include "NDPOptions.hh"
37 //#############################################################
39 //#############################################################
40 struct ICMPv6EchoRequestParser : public PacketParserBase
42 # include SENF_FIXED_PARSER()
43 SENF_PARSER_FIELD ( identifier, UInt16Parser );
44 SENF_PARSER_FIELD ( seqNr, UInt16Parser );
46 SENF_PARSER_FINALIZE ( ICMPv6EchoRequestParser );
49 /** \brief ICMPv6 Echo Request
51 \par Packet type (typedef):
52 \ref ICMPv6EchoRequest
55 \ref ICMPv6EchoRequestParser
56 \image html ICMPv6EchoRequest.png
58 \ingroup protocolbundle_default
60 struct ICMPv6EchoRequestType
61 : public PacketTypeBase,
62 public PacketTypeMixin<ICMPv6EchoRequestType>
64 typedef PacketTypeMixin<ICMPv6EchoRequestType> mixin;
65 typedef ConcretePacket<ICMPv6EchoRequestType> packet;
66 typedef ICMPv6EchoRequestParser parser;
68 using mixin::nextPacketRange;
70 using mixin::initSize;
72 static void dump(packet p, std::ostream & os);
75 typedef ConcretePacket<ICMPv6EchoRequestType> ICMPv6EchoRequest;
77 //#############################################################
79 //#############################################################
80 struct ICMPv6EchoReplyParser : public PacketParserBase
82 # include SENF_FIXED_PARSER()
83 SENF_PARSER_FIELD ( identifier, UInt16Parser );
84 SENF_PARSER_FIELD ( seqNr, UInt16Parser );
86 SENF_PARSER_FINALIZE ( ICMPv6EchoReplyParser );
89 /** \brief ICMPv6 Echo Reply
91 \par Packet type (typedef):
95 \ref ICMPv6EchoReplyParser
96 \image html ICMPv6EchoReply.png
98 \ingroup protocolbundle_default
100 struct ICMPv6EchoReplyType
101 : public PacketTypeBase,
102 public PacketTypeMixin<ICMPv6EchoReplyType>
104 typedef PacketTypeMixin<ICMPv6EchoReplyType> mixin;
105 typedef ConcretePacket<ICMPv6EchoReplyType> packet;
106 typedef ICMPv6EchoReplyParser parser;
108 using mixin::nextPacketRange;
110 using mixin::initSize;
112 static void dump(packet p, std::ostream & os);
115 typedef ConcretePacket<ICMPv6EchoReplyType> ICMPv6EchoReply;
117 //#############################################################
118 //ICMPv6 Error Destination Unreachable Message
119 //#############################################################
120 struct ICMPv6ErrDestUnreachableParser : public PacketParserBase
122 # include SENF_FIXED_PARSER()
124 //should be set static 0 by sender and ignored by receiver
125 SENF_PARSER_PRIVATE_FIELD ( unused, UInt32Parser );
130 /* Code 0 - No route to destination
131 1 - Communication with destination
132 administratively prohibited
133 2 - Beyond scope of source address
134 3 - Address unreachable
136 5 - Source address failed ingress/egress policy
137 6 - Reject route to destination */
138 void setErrCode(int code) {
139 ICMPv6Packet icmpv6 (senf::Packet().rfind<ICMPv6Packet>(senf::nothrow));
140 icmpv6->code() = code;
143 SENF_PARSER_FINALIZE ( ICMPv6ErrDestUnreachableParser );
146 /** \brief ICMPv6 Destination unreachable
148 \par Packet type (typedef):
149 \ref ICMPv6ErrDestUnreachable
152 \ref ICMPv6ErrDestUnreachableParser
153 \image html ICMPv6ErrDestUnreachable.png
155 \ingroup protocolbundle_default
157 struct ICMPv6ErrDestUnreachableType
158 : public PacketTypeBase,
159 public PacketTypeMixin<ICMPv6ErrDestUnreachableType>
161 typedef PacketTypeMixin<ICMPv6ErrDestUnreachableType> mixin;
162 typedef ConcretePacket<ICMPv6ErrDestUnreachableType> packet;
163 typedef ICMPv6ErrDestUnreachableParser parser;
165 using mixin::nextPacketRange;
167 using mixin::initSize;
169 static void dump(packet p, std::ostream & os);
172 typedef ConcretePacket<ICMPv6ErrDestUnreachableType> ICMPv6ErrDestUnreachable;
174 //#############################################################
175 //ICMPv6 Error Packet Too Big Message
176 //#############################################################
177 struct ICMPv6ErrTooBigParser : public PacketParserBase
179 # include SENF_FIXED_PARSER()
180 SENF_PARSER_FIELD ( mtu, UInt32Parser );
182 /* Code static set to 0 */
184 ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
188 SENF_PARSER_FINALIZE ( ICMPv6ErrTooBigParser );
191 /** \brief ICMPv6 Packet to big
193 \par Packet type (typedef):
197 \ref ICMPv6ErrTooBigParser
198 \image html ICMPv6ErrTooBig.png
200 \ingroup protocolbundle_default
202 struct ICMPv6ErrTooBigType
203 : public PacketTypeBase,
204 public PacketTypeMixin<ICMPv6ErrTooBigType>
206 typedef PacketTypeMixin<ICMPv6ErrTooBigType> mixin;
207 typedef ConcretePacket<ICMPv6ErrTooBigType> packet;
208 typedef ICMPv6ErrTooBigParser parser;
210 using mixin::nextPacketRange;
212 using mixin::initSize;
214 static void dump(packet p, std::ostream & os);
217 typedef ConcretePacket<ICMPv6ErrTooBigType> ICMPv6ErrTooBig;
219 //#############################################################
220 //ICMPv6 Error Time Exceeded Message
221 //#############################################################
222 struct ICMPv6ErrTimeExceededParser : public PacketParserBase
224 # include SENF_FIXED_PARSER()
225 //should be set static 0 by sender and ignored by receiver
226 SENF_PARSER_FIELD ( unused, UInt32Parser );
227 /* Code 0 - Hop limit exceeded in transit
228 1 - Fragment reassembly time exceeded */
229 void setErrCode(int code)
231 ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
232 icmpv6->code() = code;
235 SENF_PARSER_FINALIZE ( ICMPv6ErrTimeExceededParser );
238 /** \brief ICMPv6 Time exceeded
240 \par Packet type (typedef):
241 \ref ICMPv6ErrTimeExceeded
244 \ref ICMPv6ErrTimeExceededParser
245 \image html ICMPv6ErrTimeExceeded.png
247 \ingroup protocolbundle_default
249 struct ICMPv6ErrTimeExceededType
250 : public PacketTypeBase,
251 public PacketTypeMixin<ICMPv6ErrTimeExceededType>
253 typedef PacketTypeMixin<ICMPv6ErrTimeExceededType> mixin;
254 typedef ConcretePacket<ICMPv6ErrTimeExceededType> packet;
255 typedef ICMPv6ErrTimeExceededParser parser;
257 using mixin::nextPacketRange;
259 using mixin::initSize;
261 static void dump(packet p, std::ostream & os);
263 typedef ConcretePacket<ICMPv6ErrTimeExceededType> ICMPv6ErrTimeExceeded;
265 //#############################################################
266 //ICMPv6 Error Parameter Problem Message
267 //#############################################################
268 struct ICMPv6ErrParamProblemParser : public PacketParserBase
270 # include SENF_FIXED_PARSER()
271 //should be set static 0 by sender and ignored by receiver
272 SENF_PARSER_FIELD ( pointer, UInt32Parser );
273 /* Code 0 - Erroneous header field encountered
274 1 - Unrecognized Next Header type encountered
275 2 - Unrecognized IPv6 option encountered */
277 void setErrCode(int code)
279 ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
280 icmpv6->code() = code;
282 SENF_PARSER_FINALIZE ( ICMPv6ErrParamProblemParser );
285 /** \brief ICMPv6 Parameter problem
287 \par Packet type (typedef):
288 \ref ICMPv6ErrParamProblem
291 \ref ICMPv6ErrParamProblemParser
292 \image html ICMPv6ErrParamProblem.png
294 \ingroup protocolbundle_default
296 struct ICMPv6ErrParamProblemType
297 : public PacketTypeBase,
298 public PacketTypeMixin<ICMPv6ErrParamProblemType>
300 typedef PacketTypeMixin<ICMPv6ErrParamProblemType> mixin;
301 typedef ConcretePacket<ICMPv6ErrParamProblemType> packet;
302 typedef ICMPv6ErrParamProblemParser parser;
304 using mixin::nextPacketRange;
306 using mixin::initSize;
308 static void dump(packet p, std::ostream & os);
310 typedef ConcretePacket<ICMPv6ErrParamProblemType> ICMPv6ErrParamProblem;
312 //#############################################################
313 //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Query
314 //#############################################################
315 struct MLDv2ListenerQueryParser : public PacketParserBase
317 # include SENF_PARSER()
318 //need a variant here
319 // a.) maxResponseCode < 32768 =>Interger
320 // b.) maxResponseCode >=32768 => float (is there a float parser???)
322 float value as followed:
323 0 1 2 3 4 5 6 7 8 9 A B C D E F
324 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
326 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
328 SENF_PARSER_FIELD ( maxResponseCode, UInt16Parser );
329 SENF_PARSER_FIELD ( reserved, UInt16Parser ); // set to zero by default
330 SENF_PARSER_FIELD ( mcAddress, INet6AddressParser );
331 SENF_PARSER_BITFIELD ( resv, 4, unsigned ); // set to zero by default
332 SENF_PARSER_BITFIELD ( sFlag, 1, unsigned );
333 SENF_PARSER_BITFIELD ( qrv, 3, unsigned );
334 SENF_PARSER_FIELD ( qqic, UInt8Parser );
335 SENF_PARSER_PRIVATE_FIELD ( nrSources, UInt16Parser );
336 SENF_PARSER_VECTOR (srcAddresses, nrSources, INet6AddressParser );
338 SENF_PARSER_FINALIZE ( MLDv2ListenerQueryParser );
346 /** \brief MLDv2 Listener query
348 \par Packet type (typedef):
349 \ref MLDv2ListenerQuery
352 \ref MLDv2ListenerQueryParser
353 \image html MLDv2ListenerQuery.png
355 \ingroup protocolbundle_default
357 struct MLDv2ListenerQueryType
358 : public PacketTypeBase,
359 public PacketTypeMixin<MLDv2ListenerQueryType>
361 typedef PacketTypeMixin<MLDv2ListenerQueryType> mixin;
362 typedef ConcretePacket<MLDv2ListenerQueryType> packet;
363 typedef MLDv2ListenerQueryParser parser;
365 using mixin::nextPacketRange;
367 using mixin::initSize;
369 static void dump(packet p, std::ostream & os);
372 typedef ConcretePacket<MLDv2ListenerQueryType> MLDv2ListenerQuery;
374 //#############################################################
375 //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Report Message
376 //#############################################################
377 //First: the Multicast Address Record Parser
378 struct MLDv2AddressRecordParser : public PacketParserBase
380 # include SENF_PARSER()
382 SENF_PARSER_FIELD ( recordType, UInt8Parser );
383 SENF_PARSER_PRIVATE_FIELD ( auxDataLen, UInt8Parser );
384 SENF_PARSER_PRIVATE_FIELD ( nrOfSrcs, UInt16Parser );
385 SENF_PARSER_FIELD ( mcAddress, INet6AddressParser);
386 SENF_PARSER_VECTOR ( srcAddresses, nrOfSrcs, INet6AddressParser );
387 SENF_PARSER_VECTOR ( auxData, auxDataLen, UInt32Parser );
389 SENF_PARSER_FINALIZE ( MLDv2AddressRecordParser );
392 struct MLDv2ListenerReportParser : public PacketParserBase
394 # include SENF_PARSER()
396 SENF_PARSER_FIELD ( reserved, UInt16Parser ); //set to zero by default
397 SENF_PARSER_PRIVATE_FIELD ( nrMcastAddrRecords_, UInt16Parser );
398 SENF_PARSER_LIST ( mcastAddrRecords, nrMcastAddrRecords_, MLDv2AddressRecordParser );
400 SENF_PARSER_FINALIZE ( MLDv2ListenerReportParser );
407 /** \brief MLDv2 Listener report
409 \par Packet type (typedef):
410 \ref MLDv2ListenerReport
413 \ref MLDv2ListenerReportParser
414 \image html MLDv2ListenerReport.png
415 \image html MLDv2AddressRecord.png
417 \ingroup protocolbundle_default
419 struct MLDv2ListenerReportType
420 : public PacketTypeBase,
421 public PacketTypeMixin<MLDv2ListenerReportType>
423 typedef PacketTypeMixin<MLDv2ListenerReportType> mixin;
424 typedef ConcretePacket<MLDv2ListenerReportType> packet;
425 typedef MLDv2ListenerReportParser parser;
427 using mixin::nextPacketRange;
429 using mixin::initSize;
431 static void dump(packet p, std::ostream & os);
433 typedef ConcretePacket<MLDv2ListenerReportType> MLDv2ListenerReport;
435 //#############################################################
436 //ICMPv6 Router Solicitation (RFC 4861) Message
437 //#############################################################
438 struct NDPRouterSolicitationParser : public PacketParserBase
440 # include SENF_PARSER()
441 SENF_PARSER_FIELD ( reserved, UInt32Parser );// set to zero by default
442 SENF_PARSER_LIST ( options, packetSize(), senf::NDPGenericOptionParser );
443 SENF_PARSER_FINALIZE ( NDPRouterSolicitationParser );
450 /** \brief Router Solicitation Message
452 \par Packet type (typedef):
453 \ref NDPRouterSolicitationMessage
456 \ref NDPRouterSolicitationParser
457 \image html NDPRouterSolicitationMessage.png
459 \ingroup protocolbundle_default
461 struct NDPRouterSolicitationMessageType
462 : public PacketTypeBase,
463 public PacketTypeMixin<NDPRouterSolicitationMessageType>
465 typedef PacketTypeMixin<NDPRouterSolicitationMessageType> mixin;
466 typedef ConcretePacket<NDPRouterSolicitationMessageType> packet;
467 typedef NDPRouterSolicitationParser parser;
469 using mixin::nextPacketRange;
471 using mixin::initSize;
473 static void dump(packet p, std::ostream & os);
475 typedef ConcretePacket<NDPRouterSolicitationMessageType> NDPRouterSolicitationMessage;
477 //#############################################################
478 //ICMPv6 Router Advertisement (RFC 4861) Message
479 //#############################################################
480 struct NDPRouterAdvertisementParser : public PacketParserBase
482 # include SENF_PARSER()
483 SENF_PARSER_FIELD ( curHopLimit, UInt8Parser );
484 SENF_PARSER_BITFIELD ( m, 1, bool);
485 SENF_PARSER_BITFIELD ( o, 1, bool);
486 SENF_PARSER_BITFIELD ( reserved, 6, unsigned ); // set to zero by default
487 SENF_PARSER_FIELD ( routerLifetime, UInt16Parser );
488 SENF_PARSER_FIELD ( reachableTime, UInt32Parser );
489 SENF_PARSER_FIELD ( retransTimer, UInt32Parser );
490 SENF_PARSER_LIST ( options, packetSize(), senf::NDPGenericOptionParser );
491 SENF_PARSER_FINALIZE ( NDPRouterAdvertisementParser );
498 /** \brief Router Advertisement Message
500 \par Packet type (typedef):
501 \ref NDPRouterAdvertisementMessage
504 \ref NDPRouterAdvertisementParser
505 \imageMessage html NDPRouterAdvertisementMessage.png
507 \ingroup protocolbundle_default
509 struct NDPRouterAdvertisementMessageType
510 : public PacketTypeBase,
511 public PacketTypeMixin<NDPRouterAdvertisementMessageType>
513 typedef PacketTypeMixin<NDPRouterAdvertisementMessageType> mixin;
514 typedef ConcretePacket<NDPRouterAdvertisementMessageType> packet;
515 typedef NDPRouterAdvertisementParser parser;
517 using mixin::nextPacketRange;
519 using mixin::initSize;
521 static void dump(packet p, std::ostream & os);
523 typedef ConcretePacket<NDPRouterAdvertisementMessageType> NDPRouterAdvertisementMessage;
525 //#############################################################
526 //ICMPv6 Neighbor Solicitation (RFC 4861) Message
527 //#############################################################
528 struct NDPNeighborSolicitationParser : public PacketParserBase
530 # include SENF_PARSER()
531 SENF_PARSER_BITFIELD ( reserved, 32, unsigned ); // set to zero by default
532 SENF_PARSER_FIELD ( target, INet6AddressParser );
533 SENF_PARSER_LIST ( options, packetSize(), senf::NDPGenericOptionParser );
534 SENF_PARSER_FINALIZE ( NDPNeighborSolicitationParser );
541 /** \brief Neighbor Solicitation Message
543 \par Packet type (typedef):
544 \ref NDPNeighborSolicitationMessage
547 \ref NDPNeighborSolicitationParser
548 \imageMessage html NDPNeighborSolicitationMessage.png
550 \ingroup protocolbundle_default
552 struct NDPNeighborSolicitationMessageType
553 : public PacketTypeBase,
554 public PacketTypeMixin<NDPNeighborSolicitationMessageType>
556 typedef PacketTypeMixin<NDPNeighborSolicitationMessageType> mixin;
557 typedef ConcretePacket<NDPNeighborSolicitationMessageType> packet;
558 typedef NDPNeighborSolicitationParser parser;
560 using mixin::nextPacketRange;
562 using mixin::initSize;
564 static void dump(packet p, std::ostream & os);
566 typedef ConcretePacket<NDPNeighborSolicitationMessageType> NDPNeighborSolicitationMessage;
568 //#############################################################
569 //ICMPv6 Neighbor Advertisement (RFC 4861) Message
570 //#############################################################
571 struct NDPNeighborAdvertisementParser : public PacketParserBase
573 # include SENF_PARSER()
574 SENF_PARSER_BITFIELD ( r, 1, bool );
575 SENF_PARSER_BITFIELD ( s, 1, bool );
576 SENF_PARSER_BITFIELD ( o, 1, bool );
577 SENF_PARSER_BITFIELD ( reserved, 29, unsigned ); // set to zero by default
578 SENF_PARSER_FIELD ( target, INet6AddressParser );
579 SENF_PARSER_LIST ( options, packetSize(), senf::NDPGenericOptionParser );
580 SENF_PARSER_FINALIZE ( NDPNeighborAdvertisementParser );
587 /** \brief Neighbor Advertisement Message
589 \par Packet type (typedef):
590 \ref NDPNeighborAdvertisementParser
593 \ref NDPNeighborAdvertisementParser
594 \imageMessage html NDPNeighborAdvertisementMessage.png
596 \ingroup protocolbundle_default
598 struct NDPNeighborAdvertisementMessageType
599 : public PacketTypeBase,
600 public PacketTypeMixin<NDPNeighborAdvertisementMessageType>
602 typedef PacketTypeMixin<NDPNeighborAdvertisementMessageType> mixin;
603 typedef ConcretePacket<NDPNeighborAdvertisementMessageType> packet;
604 typedef NDPNeighborAdvertisementParser parser;
606 using mixin::nextPacketRange;
608 using mixin::initSize;
610 static void dump(packet p, std::ostream & os);
612 typedef ConcretePacket<NDPNeighborAdvertisementMessageType> NDPNeighborAdvertisementMessage;
614 //#############################################################
615 //ICMPv6 Redirect (RFC 4861) Message
616 //#############################################################
617 struct NDPRedirectParser : public PacketParserBase
619 # include SENF_PARSER()
620 SENF_PARSER_BITFIELD ( reserved, 32, unsigned ); // set to zero by default
621 SENF_PARSER_FIELD ( target, INet6AddressParser );
622 SENF_PARSER_FIELD ( destination, INet6AddressParser );
623 SENF_PARSER_LIST ( options, packetSize(), senf::NDPGenericOptionParser );
624 SENF_PARSER_FINALIZE ( NDPRedirectParser );
632 /** \brief Redirect Message
634 \par Packet type (typedef):
635 \ref NDPRedirectParser
638 \ref NDPRedirectParser
639 \imageMessage html NDPRedirectMessage.png
641 \ingroup protocolbundle_default
643 struct NDPRedirectMessageType
644 : public PacketTypeBase,
645 public PacketTypeMixin<NDPRedirectMessageType>
647 typedef PacketTypeMixin<NDPRedirectMessageType> mixin;
648 typedef ConcretePacket<NDPRedirectMessageType> packet;
649 typedef NDPRedirectParser parser;
651 using mixin::nextPacketRange;
653 using mixin::initSize;
655 static void dump(packet p, std::ostream & os);
657 typedef ConcretePacket<NDPRedirectMessageType> NDPRedirectMessage;
666 // c-file-style: "senf"
667 // indent-tabs-mode: nil
668 // ispell-local-dictionary: "american"
669 // compile-command: "scons -u test"
670 // comment-column: 40