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"
35 ///////////////////////////////hh.p////////////////////////////////////////
38 //#############################################################
40 //#############################################################
41 struct ICMPv6EchoRequestParser : public PacketParserBase
43 # include SENF_FIXED_PARSER()
44 SENF_PARSER_FIELD ( identifier, UInt16Parser );
45 SENF_PARSER_FIELD ( seqNr, UInt16Parser );
47 SENF_PARSER_FINALIZE ( ICMPv6EchoRequestParser );
50 /** \brief ICMPv6 Echo Request
52 \par Packet type (typedef):
53 \ref ICMPv6EchoRequest
56 \ref ICMPv6EchoRequestParser
57 \image html ICMPv6EchoRequest.png
59 \ingroup protocolbundle_default
61 struct ICMPv6EchoRequestType
62 : public PacketTypeBase,
63 public PacketTypeMixin<ICMPv6EchoRequestType>
65 typedef PacketTypeMixin<ICMPv6EchoRequestType> mixin;
66 typedef ConcretePacket<ICMPv6EchoRequestType> packet;
67 typedef ICMPv6EchoRequestParser parser;
69 using mixin::nextPacketRange;
71 using mixin::initSize;
73 static void dump(packet p, std::ostream & os);
76 typedef ConcretePacket<ICMPv6EchoRequestType> ICMPv6EchoRequest;
78 //#############################################################
80 //#############################################################
81 struct ICMPv6EchoReplyParser : public PacketParserBase
83 # include SENF_FIXED_PARSER()
84 SENF_PARSER_FIELD ( identifier, UInt16Parser );
85 SENF_PARSER_FIELD ( seqNr, UInt16Parser );
87 SENF_PARSER_FINALIZE ( ICMPv6EchoReplyParser );
90 /** \brief ICMPv6 Echo Reply
92 \par Packet type (typedef):
96 \ref ICMPv6EchoReplyParser
97 \image html ICMPv6EchoReply.png
99 \ingroup protocolbundle_default
101 struct ICMPv6EchoReplyType
102 : public PacketTypeBase,
103 public PacketTypeMixin<ICMPv6EchoReplyType>
105 typedef PacketTypeMixin<ICMPv6EchoReplyType> mixin;
106 typedef ConcretePacket<ICMPv6EchoReplyType> packet;
107 typedef ICMPv6EchoReplyParser parser;
109 using mixin::nextPacketRange;
111 using mixin::initSize;
113 static void dump(packet p, std::ostream & os);
116 typedef ConcretePacket<ICMPv6EchoReplyType> ICMPv6EchoReply;
118 //#############################################################
119 //ICMPv6 Error Destination Unreachable Message
120 //#############################################################
121 struct ICMPv6ErrDestUnreachableParser : public PacketParserBase
123 # include SENF_FIXED_PARSER()
125 //should be set static 0 by sender and ignored by receiver
126 SENF_PARSER_PRIVATE_FIELD ( unused, UInt32Parser );
131 /* Code 0 - No route to destination
132 1 - Communication with destination
133 administratively prohibited
134 2 - Beyond scope of source address
135 3 - Address unreachable
137 5 - Source address failed ingress/egress policy
138 6 - Reject route to destination */
139 void setErrCode(int code) {
140 ICMPv6Packet icmpv6 (senf::Packet().rfind<ICMPv6Packet>(senf::nothrow));
141 icmpv6->code() = code;
144 SENF_PARSER_FINALIZE ( ICMPv6ErrDestUnreachableParser );
147 /** \brief ICMPv6 Destination unreachable
149 \par Packet type (typedef):
150 \ref ICMPv6ErrDestUnreachable
153 \ref ICMPv6ErrDestUnreachableParser
154 \image html ICMPv6ErrDestUnreachable.png
156 \ingroup protocolbundle_default
158 struct ICMPv6ErrDestUnreachableType
159 : public PacketTypeBase,
160 public PacketTypeMixin<ICMPv6ErrDestUnreachableType>
162 typedef PacketTypeMixin<ICMPv6ErrDestUnreachableType> mixin;
163 typedef ConcretePacket<ICMPv6ErrDestUnreachableType> packet;
164 typedef ICMPv6ErrDestUnreachableParser parser;
166 using mixin::nextPacketRange;
168 using mixin::initSize;
170 static void dump(packet p, std::ostream & os);
173 typedef ConcretePacket<ICMPv6ErrDestUnreachableType> ICMPv6ErrDestUnreachable;
175 //#############################################################
176 //ICMPv6 Error Packet Too Big Message
177 //#############################################################
178 struct ICMPv6ErrTooBigParser : public PacketParserBase
180 # include SENF_FIXED_PARSER()
181 SENF_PARSER_FIELD ( mtu, UInt32Parser );
183 /* Code static set to 0 */
185 ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
189 SENF_PARSER_FINALIZE ( ICMPv6ErrTooBigParser );
192 /** \brief ICMPv6 Packet to big
194 \par Packet type (typedef):
198 \ref ICMPv6ErrTooBigParser
199 \image html ICMPv6ErrTooBig.png
201 \ingroup protocolbundle_default
203 struct ICMPv6ErrTooBigType
204 : public PacketTypeBase,
205 public PacketTypeMixin<ICMPv6ErrTooBigType>
207 typedef PacketTypeMixin<ICMPv6ErrTooBigType> mixin;
208 typedef ConcretePacket<ICMPv6ErrTooBigType> packet;
209 typedef ICMPv6ErrTooBigParser parser;
211 using mixin::nextPacketRange;
213 using mixin::initSize;
215 static void dump(packet p, std::ostream & os);
218 typedef ConcretePacket<ICMPv6ErrTooBigType> ICMPv6ErrTooBig;
220 //#############################################################
221 //ICMPv6 Error Time Exceeded Message
222 //#############################################################
223 struct ICMPv6ErrTimeExceededParser : public PacketParserBase
225 # include SENF_FIXED_PARSER()
226 //should be set static 0 by sender and ignored by receiver
227 SENF_PARSER_FIELD ( unused, UInt32Parser );
228 /* Code 0 - Hop limit exceeded in transit
229 1 - Fragment reassembly time exceeded */
230 void setErrCode(int code)
232 ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
233 icmpv6->code() = code;
236 SENF_PARSER_FINALIZE ( ICMPv6ErrTimeExceededParser );
239 /** \brief ICMPv6 Time exceeded
241 \par Packet type (typedef):
242 \ref ICMPv6ErrTimeExceeded
245 \ref ICMPv6ErrTimeExceededParser
246 \image html ICMPv6ErrTimeExceeded.png
248 \ingroup protocolbundle_default
250 struct ICMPv6ErrTimeExceededType
251 : public PacketTypeBase,
252 public PacketTypeMixin<ICMPv6ErrTimeExceededType>
254 typedef PacketTypeMixin<ICMPv6ErrTimeExceededType> mixin;
255 typedef ConcretePacket<ICMPv6ErrTimeExceededType> packet;
256 typedef ICMPv6ErrTimeExceededParser parser;
258 using mixin::nextPacketRange;
260 using mixin::initSize;
262 static void dump(packet p, std::ostream & os);
264 typedef ConcretePacket<ICMPv6ErrTimeExceededType> ICMPv6ErrTimeExceeded;
266 //#############################################################
267 //ICMPv6 Error Parameter Problem Message
268 //#############################################################
269 struct ICMPv6ErrParamProblemParser : public PacketParserBase
271 # include SENF_FIXED_PARSER()
272 //should be set static 0 by sender and ignored by receiver
273 SENF_PARSER_FIELD ( pointer, UInt32Parser );
274 /* Code 0 - Erroneous header field encountered
275 1 - Unrecognized Next Header type encountered
276 2 - Unrecognized IPv6 option encountered */
278 void setErrCode(int code)
280 ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
281 icmpv6->code() = code;
283 SENF_PARSER_FINALIZE ( ICMPv6ErrParamProblemParser );
286 /** \brief ICMPv6 Parameter problem
288 \par Packet type (typedef):
289 \ref ICMPv6ErrParamProblem
292 \ref ICMPv6ErrParamProblemParser
293 \image html ICMPv6ErrParamProblem.png
295 \ingroup protocolbundle_default
297 struct ICMPv6ErrParamProblemType
298 : public PacketTypeBase,
299 public PacketTypeMixin<ICMPv6ErrParamProblemType>
301 typedef PacketTypeMixin<ICMPv6ErrParamProblemType> mixin;
302 typedef ConcretePacket<ICMPv6ErrParamProblemType> packet;
303 typedef ICMPv6ErrParamProblemParser parser;
305 using mixin::nextPacketRange;
307 using mixin::initSize;
309 static void dump(packet p, std::ostream & os);
311 typedef ConcretePacket<ICMPv6ErrParamProblemType> ICMPv6ErrParamProblem;
313 //#############################################################
314 //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Query
315 //#############################################################
316 struct MLDv2ListenerQueryParser : public PacketParserBase
318 # include SENF_PARSER()
319 //need a variant here
320 // a.) maxResponseCode < 32768 =>Interger
321 // b.) maxResponseCode >=32768 => float (is there a float parser???)
323 float value as followed:
324 0 1 2 3 4 5 6 7 8 9 A B C D E F
325 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
327 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
329 SENF_PARSER_FIELD ( maxResponseCode, UInt16Parser );
330 SENF_PARSER_FIELD ( reserved, UInt16Parser ); // set to zero by default
331 SENF_PARSER_FIELD ( mcAddress, INet6AddressParser );
332 SENF_PARSER_BITFIELD ( resv, 4, unsigned ); // set to zero by default
333 SENF_PARSER_BITFIELD ( sFlag, 1, unsigned );
334 SENF_PARSER_BITFIELD ( qrv, 3, unsigned );
335 SENF_PARSER_FIELD ( qqic, UInt8Parser );
336 SENF_PARSER_PRIVATE_FIELD ( nrSources, UInt16Parser );
337 SENF_PARSER_VECTOR (srcAddresses, nrSources, INet6AddressParser );
339 SENF_PARSER_FINALIZE ( MLDv2ListenerQueryParser );
347 /** \brief MLDv2 Listener query
349 \par Packet type (typedef):
350 \ref MLDv2ListenerQuery
353 \ref MLDv2ListenerQueryParser
354 \image html MLDv2ListenerQuery.png
356 \ingroup protocolbundle_default
358 struct MLDv2ListenerQueryType
359 : public PacketTypeBase,
360 public PacketTypeMixin<MLDv2ListenerQueryType>
362 typedef PacketTypeMixin<MLDv2ListenerQueryType> mixin;
363 typedef ConcretePacket<MLDv2ListenerQueryType> packet;
364 typedef MLDv2ListenerQueryParser parser;
366 using mixin::nextPacketRange;
368 using mixin::initSize;
370 static void dump(packet p, std::ostream & os);
373 typedef ConcretePacket<MLDv2ListenerQueryType> MLDv2ListenerQuery;
375 //#############################################################
376 //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Report Message
377 //#############################################################
378 //First: the Multicast Address Record Parser
379 struct MLDv2AddressRecordParser : public PacketParserBase
381 # include SENF_PARSER()
383 SENF_PARSER_FIELD ( recordType, UInt8Parser );
384 SENF_PARSER_PRIVATE_FIELD ( auxDataLen, UInt8Parser );
385 SENF_PARSER_PRIVATE_FIELD ( nrOfSrcs, UInt16Parser );
386 SENF_PARSER_FIELD ( mcAddress, INet6AddressParser);
387 SENF_PARSER_VECTOR ( srcAddresses, nrOfSrcs, INet6AddressParser );
388 SENF_PARSER_VECTOR ( auxData, auxDataLen, UInt32Parser );
390 SENF_PARSER_FINALIZE ( MLDv2AddressRecordParser );
393 struct MLDv2ListenerReportParser : public PacketParserBase
395 # include SENF_PARSER()
397 SENF_PARSER_FIELD ( reserved, UInt16Parser ); //set to zero by default
398 SENF_PARSER_PRIVATE_FIELD ( nrMcastAddrRecords_, UInt16Parser );
399 SENF_PARSER_LIST ( mcastAddrRecords, nrMcastAddrRecords_, MLDv2AddressRecordParser );
401 SENF_PARSER_FINALIZE ( MLDv2ListenerReportParser );
408 /** \brief MLDv2 Listener report
410 \par Packet type (typedef):
411 \ref MLDv2ListenerReport
414 \ref MLDv2ListenerReportParser
415 \image html MLDv2ListenerReport.png
416 \image html MLDv2AddressRecord.png
418 \ingroup protocolbundle_default
420 struct MLDv2ListenerReportType
421 : public PacketTypeBase,
422 public PacketTypeMixin<MLDv2ListenerReportType>
424 typedef PacketTypeMixin<MLDv2ListenerReportType> mixin;
425 typedef ConcretePacket<MLDv2ListenerReportType> packet;
426 typedef MLDv2ListenerReportParser parser;
428 using mixin::nextPacketRange;
430 using mixin::initSize;
432 static void dump(packet p, std::ostream & os);
434 typedef ConcretePacket<MLDv2ListenerReportType> MLDv2ListenerReport;
436 //#############################################################
437 //ICMPv6 Router Solicitation (RFC 4861) Message
438 //#############################################################
439 struct NDPRouterSolicitationParser : public PacketParserBase
441 # include SENF_PARSER()
442 SENF_PARSER_BITFIELD ( reserved, 32, unsigned );// set to zero by default
443 SENF_PARSER_LIST ( options, packetSize(), senf::NDPGenericOptionParser );
444 SENF_PARSER_FINALIZE ( NDPRouterSolicitationParser );
451 /** \brief Router Solicitation Message
453 \par Packet type (typedef):
454 \ref NDPRouterSolicitationMessage
457 \ref NDPRouterSolicitationParser
458 \image html NDPRouterSolicitationMessage.png
460 \ingroup protocolbundle_default
462 struct NDPRouterSolicitationMessageType
463 : public PacketTypeBase,
464 public PacketTypeMixin<NDPRouterSolicitationMessageType>
466 typedef PacketTypeMixin<NDPRouterSolicitationMessageType> mixin;
467 typedef ConcretePacket<NDPRouterSolicitationMessageType> packet;
468 typedef NDPRouterSolicitationParser parser;
470 using mixin::nextPacketRange;
472 using mixin::initSize;
474 static void dump(packet p, std::ostream & os);
476 typedef ConcretePacket<NDPRouterSolicitationMessageType> NDPRouterSolicitationMessage;
478 //#############################################################
479 //ICMPv6 Router Advertisement (RFC 4861) Message
480 //#############################################################
481 struct NDPRouterAdvertisementParser : public PacketParserBase
483 # include SENF_PARSER()
484 SENF_PARSER_FIELD ( curHopLimit, UInt8Parser );
485 SENF_PARSER_BITFIELD ( m, 1, bool);
486 SENF_PARSER_BITFIELD ( o, 1, bool);
487 SENF_PARSER_BITFIELD ( reserved, 6, unsigned ); // set to zero by default
488 SENF_PARSER_FIELD ( routerLifetime, UInt16Parser );
489 SENF_PARSER_FIELD ( reachableTime, UInt32Parser );
490 SENF_PARSER_FIELD ( retransTimer, UInt32Parser );
491 SENF_PARSER_LIST ( options, packetSize(), senf::NDPGenericOptionParser );
492 SENF_PARSER_FINALIZE ( NDPRouterAdvertisementParser );
499 /** \brief Router Advertisement Message
501 \par Packet type (typedef):
502 \ref NDPRouterAdvertisementMessage
505 \ref NDPRouterAdvertisementParser
506 \imageMessage html NDPRouterAdvertisementMessage.png
508 \ingroup protocolbundle_default
510 struct NDPRouterAdvertisementMessageType
511 : public PacketTypeBase,
512 public PacketTypeMixin<NDPRouterAdvertisementMessageType>
514 typedef PacketTypeMixin<NDPRouterAdvertisementMessageType> mixin;
515 typedef ConcretePacket<NDPRouterAdvertisementMessageType> packet;
516 typedef NDPRouterAdvertisementParser parser;
518 using mixin::nextPacketRange;
520 using mixin::initSize;
522 static void dump(packet p, std::ostream & os);
524 typedef ConcretePacket<NDPRouterAdvertisementMessageType> NDPRouterAdvertisementMessage;
526 //#############################################################
527 //ICMPv6 Neighbor Solicitation (RFC 4861) Message
528 //#############################################################
529 struct NDPNeighborSolicitationParser : public PacketParserBase
531 # include SENF_PARSER()
532 SENF_PARSER_BITFIELD ( reserved, 32, unsigned ); // set to zero by default
533 SENF_PARSER_FIELD ( target, INet6AddressParser );
534 SENF_PARSER_LIST ( options, packetSize(), senf::NDPGenericOptionParser );
535 SENF_PARSER_FINALIZE ( NDPNeighborSolicitationParser );
542 /** \brief Neighbor Solicitation Message
544 \par Packet type (typedef):
545 \ref NDPNeighborSolicitationMessage
548 \ref NDPNeighborSolicitationParser
549 \imageMessage html NDPNeighborSolicitationMessage.png
551 \ingroup protocolbundle_default
553 struct NDPNeighborSolicitationMessageType
554 : public PacketTypeBase,
555 public PacketTypeMixin<NDPNeighborSolicitationMessageType>
557 typedef PacketTypeMixin<NDPNeighborSolicitationMessageType> mixin;
558 typedef ConcretePacket<NDPNeighborSolicitationMessageType> packet;
559 typedef NDPNeighborSolicitationParser parser;
561 using mixin::nextPacketRange;
563 using mixin::initSize;
565 static void dump(packet p, std::ostream & os);
567 typedef ConcretePacket<NDPNeighborSolicitationMessageType> NDPNeighborSolicitationMessage;
569 //#############################################################
570 //ICMPv6 Neighbor Advertisement (RFC 4861) Message
571 //#############################################################
572 struct NDPNeighborAdvertisementParser : public PacketParserBase
574 # include SENF_PARSER()
575 SENF_PARSER_BITFIELD ( r, 1, bool );
576 SENF_PARSER_BITFIELD ( s, 1, bool );
577 SENF_PARSER_BITFIELD ( o, 1, bool );
578 SENF_PARSER_BITFIELD ( reserved, 29, unsigned ); // set to zero by default
579 SENF_PARSER_FIELD ( target, INet6AddressParser );
580 SENF_PARSER_LIST ( options, packetSize(), senf::NDPGenericOptionParser );
581 SENF_PARSER_FINALIZE ( NDPNeighborAdvertisementParser );
588 /** \brief Neighbor Advertisement Message
590 \par Packet type (typedef):
591 \ref NDPNeighborAdvertisementParser
594 \ref NDPNeighborAdvertisementParser
595 \imageMessage html NDPNeighborAdvertisementMessage.png
597 \ingroup protocolbundle_default
599 struct NDPNeighborAdvertisementMessageType
600 : public PacketTypeBase,
601 public PacketTypeMixin<NDPNeighborAdvertisementMessageType>
603 typedef PacketTypeMixin<NDPNeighborAdvertisementMessageType> mixin;
604 typedef ConcretePacket<NDPNeighborAdvertisementMessageType> packet;
605 typedef NDPNeighborAdvertisementParser parser;
607 using mixin::nextPacketRange;
609 using mixin::initSize;
611 static void dump(packet p, std::ostream & os);
613 typedef ConcretePacket<NDPNeighborAdvertisementMessageType> NDPNeighborAdvertisementMessage;
615 //#############################################################
616 //ICMPv6 Redirect (RFC 4861) Message
617 //#############################################################
618 struct NDPRedirectParser : public PacketParserBase
620 # include SENF_PARSER()
621 SENF_PARSER_BITFIELD ( reserved, 32, unsigned ); // set to zero by default
622 SENF_PARSER_FIELD ( target, INet6AddressParser );
623 SENF_PARSER_FIELD ( destination, INet6AddressParser );
624 SENF_PARSER_LIST ( options, packetSize(), senf::NDPGenericOptionParser );
625 SENF_PARSER_FINALIZE ( NDPRedirectParser );
633 /** \brief Redirect Message
635 \par Packet type (typedef):
636 \ref NDPRedirectParser
639 \ref NDPRedirectParser
640 \imageMessage html NDPRedirectMessage.png
642 \ingroup protocolbundle_default
644 struct NDPRedirectMessageType
645 : public PacketTypeBase,
646 public PacketTypeMixin<NDPRedirectMessageType>
648 typedef PacketTypeMixin<NDPRedirectMessageType> mixin;
649 typedef ConcretePacket<NDPRedirectMessageType> packet;
650 typedef NDPRedirectParser parser;
652 using mixin::nextPacketRange;
654 using mixin::initSize;
656 static void dump(packet p, std::ostream & os);
658 typedef ConcretePacket<NDPRedirectMessageType> NDPRedirectMessage;
661 ///////////////////////////////hh.e////////////////////////////////////////
662 //#include "ICMPv6TypePacket.cci"
663 //#include "ICMPv6TypePacket.ct"
664 //#include "ICMPv6TypePacket.cti"
671 // c-file-style: "senf"
672 // indent-tabs-mode: nil
673 // ispell-local-dictionary: "american"
674 // compile-command: "scons -u test"
675 // comment-column: 40