Search:

SENF Extensible Network Framework

  • Home
  • Download
  • Wiki
  • BerliOS
  • ChangeLog
  • Browse SVN
  • Bug Tracker
  • Overview
  • Examples
  • HowTos
  • Glossary
  • PPI
  • Packets
  • Scheduler
  • Socket
  • Utils
  • Console
  • Daemon
  • Logger
  • Termlib
  • Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

DefaultBundle/ICMPv6TypePacket.hh

Go to the documentation of this file.
00001 // $Id: ICMPv6TypePacket.hh 1754 2010-12-09 15:45:42Z tho $
00002 //
00003 // Copyright (C) 2008
00004 // Fraunhofer (FOKUS)
00005 // Competence Center NETwork research (NET), St. Augustin, GERMANY
00006 //     Philipp Batroff <pug@berlios.de>
00007 //
00008 // This program is free software; you can redistribute it and/or modify
00009 // it under the terms of the GNU General Public License as published by
00010 // the Free Software Foundation; either version 2 of the License, or
00011 // (at your option) any later version.
00012 //
00013 // This program is distributed in the hope that it will be useful,
00014 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 // GNU General Public License for more details.
00017 //
00018 // You should have received a copy of the GNU General Public License
00019 // along with this program; if not, write to the
00020 // Free Software Foundation, Inc.,
00021 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00022 
00023 // Definition of non-inline non-template functions
00024 
00025 #ifndef HH_SENF_Packets_DefaultBundle_ICMPv6TypePacket_
00026 #define HH_SENF_Packets_DefaultBundle_ICMPv6TypePacket_ 1
00027 
00028 // Custom includes
00029 #include <senf/Packets/Packets.hh>
00030 #include "NDPOptions.hh"
00031 #include "ICMPv6Packet.hh"
00032 
00033 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00034 namespace senf {
00035 
00036     //#############################################################
00037     //ICMPv6 Echo Request
00038     //#############################################################
00039     struct ICMPv6EchoRequestParser : public PacketParserBase
00040     {
00041 #       include SENF_FIXED_PARSER()
00042         SENF_PARSER_FIELD ( identifier, UInt16Parser );
00043         SENF_PARSER_FIELD ( seqNr,      UInt16Parser );
00044 
00045         SENF_PARSER_FINALIZE ( ICMPv6EchoRequestParser );
00046     };
00047 
00059     struct ICMPv6EchoRequestType
00060         : public PacketTypeBase,
00061           public PacketTypeMixin<ICMPv6EchoRequestType>
00062     {
00063         typedef PacketTypeMixin<ICMPv6EchoRequestType> mixin;
00064         typedef ConcretePacket<ICMPv6EchoRequestType> packet;
00065         typedef ICMPv6EchoRequestParser parser;
00066 
00067         using mixin::nextPacketRange;
00068         using mixin::init;
00069         using mixin::initSize;
00070 
00071         static void dump(packet p, std::ostream & os);
00072     };
00073 
00074     typedef ConcretePacket<ICMPv6EchoRequestType> ICMPv6EchoRequest;
00075 
00076     //#############################################################
00077     //ICMPv6 Echo Reply
00078     //#############################################################
00079     struct ICMPv6EchoReplyParser : public PacketParserBase
00080     {
00081 #       include SENF_FIXED_PARSER()
00082         SENF_PARSER_FIELD ( identifier, UInt16Parser );
00083         SENF_PARSER_FIELD ( seqNr,      UInt16Parser );
00084 
00085         SENF_PARSER_FINALIZE ( ICMPv6EchoReplyParser );
00086     };
00087 
00099     struct ICMPv6EchoReplyType
00100         : public PacketTypeBase,
00101           public PacketTypeMixin<ICMPv6EchoReplyType>
00102     {
00103         typedef PacketTypeMixin<ICMPv6EchoReplyType> mixin;
00104         typedef ConcretePacket<ICMPv6EchoReplyType> packet;
00105         typedef ICMPv6EchoReplyParser parser;
00106 
00107         using mixin::nextPacketRange;
00108         using mixin::init;
00109         using mixin::initSize;
00110 
00111         static void dump(packet p, std::ostream & os);
00112     };
00113 
00114     typedef ConcretePacket<ICMPv6EchoReplyType> ICMPv6EchoReply;
00115 
00116     //#############################################################
00117     //ICMPv6 Error Destination Unreachable Message
00118     //#############################################################
00119     struct ICMPv6ErrDestUnreachableParser : public PacketParserBase
00120     {
00121 #       include SENF_FIXED_PARSER()
00122 
00123         //should be set static 0 by sender and ignored by receiver
00124         SENF_PARSER_PRIVATE_FIELD ( unused, UInt32Parser );
00125 
00126         SENF_PARSER_INIT() {
00127             unused() = 0;
00128         }
00129         /*   Code     0 - No route to destination
00130                     1 - Communication with destination
00131                             administratively prohibited
00132                     2 - Beyond scope of source address
00133                     3 - Address unreachable
00134                     4 - Port unreachable
00135                     5 - Source address failed ingress/egress policy
00136                     6 - Reject route to destination   */
00137         void setErrCode(int code);
00138 
00139         SENF_PARSER_FINALIZE ( ICMPv6ErrDestUnreachableParser );
00140     };
00141 
00153     struct ICMPv6ErrDestUnreachableType
00154         : public PacketTypeBase,
00155           public PacketTypeMixin<ICMPv6ErrDestUnreachableType>
00156     {
00157         typedef PacketTypeMixin<ICMPv6ErrDestUnreachableType> mixin;
00158         typedef ConcretePacket<ICMPv6ErrDestUnreachableType> packet;
00159         typedef ICMPv6ErrDestUnreachableParser parser;
00160 
00161         using mixin::nextPacketRange;
00162         using mixin::init;
00163         using mixin::initSize;
00164 
00165         static void dump(packet p, std::ostream & os);
00166     };
00167 
00168     typedef ConcretePacket<ICMPv6ErrDestUnreachableType> ICMPv6ErrDestUnreachable;
00169 
00170     //#############################################################
00171     //ICMPv6 Error Packet Too Big Message
00172     //#############################################################
00173     struct ICMPv6ErrTooBigParser : public PacketParserBase
00174     {
00175 #       include SENF_FIXED_PARSER()
00176         SENF_PARSER_FIELD ( mtu, UInt32Parser );
00177 
00178         /*   Code     static set to 0       */
00179         SENF_PARSER_INIT() {
00180             ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
00181             icmpv6->code() = 0;
00182         }
00183 
00184         SENF_PARSER_FINALIZE ( ICMPv6ErrTooBigParser );
00185     };
00186 
00198     struct ICMPv6ErrTooBigType
00199         : public PacketTypeBase,
00200           public PacketTypeMixin<ICMPv6ErrTooBigType>
00201     {
00202         typedef PacketTypeMixin<ICMPv6ErrTooBigType> mixin;
00203         typedef ConcretePacket<ICMPv6ErrTooBigType> packet;
00204         typedef ICMPv6ErrTooBigParser parser;
00205 
00206         using mixin::nextPacketRange;
00207         using mixin::init;
00208         using mixin::initSize;
00209 
00210         static void dump(packet p, std::ostream & os);
00211     };
00212 
00213     typedef ConcretePacket<ICMPv6ErrTooBigType> ICMPv6ErrTooBig;
00214 
00215     //#############################################################
00216     //ICMPv6 Error Time Exceeded Message
00217     //#############################################################
00218     struct ICMPv6ErrTimeExceededParser : public PacketParserBase
00219     {
00220 #       include SENF_FIXED_PARSER()
00221         //should be set static 0 by sender and ignored by receiver
00222         SENF_PARSER_FIELD    ( unused, UInt32Parser );
00223         /*  Code    0 - Hop limit exceeded in transit
00224                     1 - Fragment reassembly time exceeded   */
00225         void setErrCode(int code);
00226 
00227         SENF_PARSER_FINALIZE ( ICMPv6ErrTimeExceededParser );
00228     };
00229 
00241     struct ICMPv6ErrTimeExceededType
00242         : public PacketTypeBase,
00243           public PacketTypeMixin<ICMPv6ErrTimeExceededType>
00244     {
00245         typedef PacketTypeMixin<ICMPv6ErrTimeExceededType> mixin;
00246         typedef ConcretePacket<ICMPv6ErrTimeExceededType> packet;
00247         typedef ICMPv6ErrTimeExceededParser parser;
00248 
00249         using mixin::nextPacketRange;
00250         using mixin::init;
00251         using mixin::initSize;
00252 
00253         static void dump(packet p, std::ostream & os);
00254     };
00255     typedef ConcretePacket<ICMPv6ErrTimeExceededType> ICMPv6ErrTimeExceeded;
00256 
00257     //#############################################################
00258     //ICMPv6 Error Parameter Problem Message
00259     //#############################################################
00260     struct ICMPv6ErrParamProblemParser : public PacketParserBase
00261     {
00262 #       include SENF_FIXED_PARSER()
00263         //should be set static 0 by sender and ignored by receiver
00264         SENF_PARSER_FIELD ( pointer, UInt32Parser );
00265         /*  Code      0 - Erroneous header field encountered
00266                     1 - Unrecognized Next Header type encountered
00267                     2 - Unrecognized IPv6 option encountered          */
00268 
00269         void setErrCode(int code);
00270 
00271         SENF_PARSER_FINALIZE ( ICMPv6ErrParamProblemParser );
00272     };
00273 
00285     struct ICMPv6ErrParamProblemType
00286         : public PacketTypeBase,
00287           public PacketTypeMixin<ICMPv6ErrParamProblemType>
00288     {
00289         typedef PacketTypeMixin<ICMPv6ErrParamProblemType> mixin;
00290         typedef ConcretePacket<ICMPv6ErrParamProblemType> packet;
00291         typedef ICMPv6ErrParamProblemParser parser;
00292 
00293         using mixin::nextPacketRange;
00294         using mixin::init;
00295         using mixin::initSize;
00296 
00297         static void dump(packet p, std::ostream & os);
00298     };
00299     typedef ConcretePacket<ICMPv6ErrParamProblemType> ICMPv6ErrParamProblem;
00300 
00301     //#############################################################
00302     //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Query
00303     //#############################################################
00304     struct MLDv2ListenerQueryParser : public PacketParserBase
00305     {
00306 #      include SENF_PARSER()
00307         //need a variant here
00308         // a.) maxResponseCode < 32768 =>Interger
00309         // b.) maxResponseCode >=32768 => float (is there a float parser???)
00310         /*
00311         float value as followed:
00312         0 1 2 3 4 5 6 7 8 9 A B C D E F
00313         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
00314         |1| exp |          mant         |
00315         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
00316 
00317         SENF_PARSER_FIELD ( maxResponseCode, UInt16Parser       );
00318         SENF_PARSER_FIELD ( reserved,        UInt16Parser       ); // set to zero by default
00319         SENF_PARSER_FIELD ( mcAddress,       INet6AddressParser );
00320         SENF_PARSER_BITFIELD ( resv,  4, unsigned ); // set to zero by default
00321         SENF_PARSER_BITFIELD ( sFlag, 1, unsigned );
00322         SENF_PARSER_BITFIELD ( qrv,   3, unsigned );
00323         SENF_PARSER_FIELD    ( qqic, UInt8Parser );
00324         SENF_PARSER_PRIVATE_FIELD ( nrSources, UInt16Parser );
00325         SENF_PARSER_VECTOR   (srcAddresses, nrSources, INet6AddressParser );
00326 
00327         SENF_PARSER_FINALIZE ( MLDv2ListenerQueryParser );
00328 
00329         SENF_PARSER_INIT() {
00330             reserved() = 0;
00331             resv() = 0;
00332         }
00333     };
00334 
00346     struct MLDv2ListenerQueryType
00347         : public PacketTypeBase,
00348           public PacketTypeMixin<MLDv2ListenerQueryType>
00349     {
00350         typedef PacketTypeMixin<MLDv2ListenerQueryType> mixin;
00351         typedef ConcretePacket<MLDv2ListenerQueryType> packet;
00352         typedef MLDv2ListenerQueryParser parser;
00353 
00354         using mixin::nextPacketRange;
00355         using mixin::init;
00356         using mixin::initSize;
00357 
00358         static void dump(packet p, std::ostream & os);
00359     };
00360 
00361     typedef ConcretePacket<MLDv2ListenerQueryType> MLDv2ListenerQuery;
00362 
00363     //#############################################################
00364     //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Report Message
00365     //#############################################################
00366     //First: the Multicast Address Record Parser
00367     struct MLDv2AddressRecordParser : public PacketParserBase
00368     {
00369 #       include SENF_PARSER()
00370 
00371         SENF_PARSER_FIELD   ( recordType, UInt8Parser );
00372         SENF_PARSER_PRIVATE_FIELD   ( auxDataLen, UInt8Parser );
00373         SENF_PARSER_PRIVATE_FIELD   ( nrOfSrcs, UInt16Parser );
00374         SENF_PARSER_FIELD   ( mcAddress, INet6AddressParser);
00375         SENF_PARSER_VECTOR  ( srcAddresses, nrOfSrcs, INet6AddressParser );
00376         SENF_PARSER_VECTOR  ( auxData, auxDataLen, UInt32Parser );
00377 
00378         SENF_PARSER_FINALIZE ( MLDv2AddressRecordParser );
00379     };
00380 
00381     struct MLDv2ListenerReportParser : public PacketParserBase
00382     {
00383 #       include SENF_PARSER()
00384 
00385         SENF_PARSER_FIELD   ( reserved, UInt16Parser );   //set to zero by default
00386         SENF_PARSER_PRIVATE_FIELD   ( nrMcastAddrRecords_, UInt16Parser );
00387         SENF_PARSER_LIST    ( mcastAddrRecords, nrMcastAddrRecords_, MLDv2AddressRecordParser );
00388 
00389         SENF_PARSER_FINALIZE ( MLDv2ListenerReportParser );
00390 
00391         SENF_PARSER_INIT() {
00392             reserved() = 0;
00393         }
00394     };
00395 
00408     struct MLDv2ListenerReportType
00409         : public PacketTypeBase,
00410           public PacketTypeMixin<MLDv2ListenerReportType>
00411     {
00412         typedef PacketTypeMixin<MLDv2ListenerReportType> mixin;
00413         typedef ConcretePacket<MLDv2ListenerReportType> packet;
00414         typedef MLDv2ListenerReportParser parser;
00415 
00416         using mixin::nextPacketRange;
00417         using mixin::init;
00418         using mixin::initSize;
00419 
00420         static void dump(packet p, std::ostream & os);
00421     };
00422     typedef ConcretePacket<MLDv2ListenerReportType> MLDv2ListenerReport;
00423 
00424     //#############################################################
00425     //ICMPv6 Router Solicitation (RFC 4861) Message
00426     //#############################################################
00427     struct NDPRouterSolicitationParser : public PacketParserBase
00428     {
00429 #      include SENF_PARSER()
00430         SENF_PARSER_BITFIELD ( reserved, 32, unsigned );// set to zero by default
00431         SENF_PARSER_LIST     ( options, packetSize(), senf::NDPGenericOptionParser );
00432         SENF_PARSER_FINALIZE ( NDPRouterSolicitationParser );
00433 
00434         SENF_PARSER_INIT() {
00435             reserved() = 0;
00436         }
00437     };
00438 
00450     struct NDPRouterSolicitationMessageType
00451         : public PacketTypeBase,
00452           public PacketTypeMixin<NDPRouterSolicitationMessageType>
00453     {
00454         typedef PacketTypeMixin<NDPRouterSolicitationMessageType> mixin;
00455         typedef ConcretePacket<NDPRouterSolicitationMessageType> packet;
00456         typedef NDPRouterSolicitationParser parser;
00457 
00458         using mixin::nextPacketRange;
00459         using mixin::init;
00460         using mixin::initSize;
00461 
00462         static void dump(packet p, std::ostream & os);
00463     };
00464     typedef ConcretePacket<NDPRouterSolicitationMessageType> NDPRouterSolicitationMessage;
00465 
00466     //#############################################################
00467     //ICMPv6 Router Advertisement (RFC 4861) Message
00468     //#############################################################
00469     struct NDPRouterAdvertisementParser : public PacketParserBase
00470     {
00471 #      include SENF_PARSER()
00472         SENF_PARSER_FIELD        ( curHopLimit, UInt8Parser );
00473         SENF_PARSER_BITFIELD     ( m, 1, bool);
00474         SENF_PARSER_BITFIELD     ( o, 1, bool);
00475         SENF_PARSER_BITFIELD     ( reserved, 6, unsigned ); // set to zero by default
00476         SENF_PARSER_FIELD        ( routerLifetime, UInt16Parser );
00477         SENF_PARSER_FIELD        ( reachableTime, UInt32Parser );
00478         SENF_PARSER_FIELD        ( retransTimer, UInt32Parser );
00479         SENF_PARSER_LIST         ( options, packetSize(), senf::NDPGenericOptionParser );
00480         SENF_PARSER_FINALIZE     ( NDPRouterAdvertisementParser );
00481 
00482         SENF_PARSER_INIT() {
00483             reserved() = 0;
00484         }
00485     };
00486 
00498     struct NDPRouterAdvertisementMessageType
00499         : public PacketTypeBase,
00500           public PacketTypeMixin<NDPRouterAdvertisementMessageType>
00501     {
00502         typedef PacketTypeMixin<NDPRouterAdvertisementMessageType> mixin;
00503         typedef ConcretePacket<NDPRouterAdvertisementMessageType> packet;
00504         typedef NDPRouterAdvertisementParser parser;
00505 
00506         using mixin::nextPacketRange;
00507         using mixin::init;
00508         using mixin::initSize;
00509 
00510         static void dump(packet p, std::ostream & os);
00511     };
00512     typedef ConcretePacket<NDPRouterAdvertisementMessageType> NDPRouterAdvertisementMessage;
00513 
00514     //#############################################################
00515     //ICMPv6 Neighbor Solicitation (RFC 4861) Message
00516     //#############################################################
00517     struct NDPNeighborSolicitationParser : public PacketParserBase
00518     {
00519 #      include SENF_PARSER()
00520         SENF_PARSER_BITFIELD  ( reserved, 32, unsigned ); // set to zero by default
00521         SENF_PARSER_FIELD     ( target, INet6AddressParser );
00522         SENF_PARSER_LIST      ( options, packetSize(), senf::NDPGenericOptionParser );
00523         SENF_PARSER_FINALIZE  ( NDPNeighborSolicitationParser );
00524 
00525         SENF_PARSER_INIT() {
00526             reserved() = 0;
00527         }
00528     };
00529 
00541     struct NDPNeighborSolicitationMessageType
00542         : public PacketTypeBase,
00543           public PacketTypeMixin<NDPNeighborSolicitationMessageType>
00544     {
00545         typedef PacketTypeMixin<NDPNeighborSolicitationMessageType> mixin;
00546         typedef ConcretePacket<NDPNeighborSolicitationMessageType> packet;
00547         typedef NDPNeighborSolicitationParser parser;
00548 
00549         using mixin::nextPacketRange;
00550         using mixin::init;
00551         using mixin::initSize;
00552 
00553         static void dump(packet p, std::ostream & os);
00554     };
00555     typedef ConcretePacket<NDPNeighborSolicitationMessageType> NDPNeighborSolicitationMessage;
00556 
00557     //#############################################################
00558     //ICMPv6 Neighbor Advertisement (RFC 4861) Message
00559     //#############################################################
00560     struct NDPNeighborAdvertisementParser : public PacketParserBase
00561     {
00562 #      include SENF_PARSER()
00563         SENF_PARSER_BITFIELD  ( r, 1, bool );
00564         SENF_PARSER_BITFIELD  ( s, 1, bool );
00565         SENF_PARSER_BITFIELD  ( o, 1, bool );
00566         SENF_PARSER_BITFIELD  ( reserved, 29, unsigned ); // set to zero by default
00567         SENF_PARSER_FIELD     ( target, INet6AddressParser );
00568         SENF_PARSER_LIST      ( options, packetSize(), senf::NDPGenericOptionParser );
00569         SENF_PARSER_FINALIZE  ( NDPNeighborAdvertisementParser );
00570 
00571         SENF_PARSER_INIT() {
00572             reserved() = 0;
00573         }
00574     };
00575 
00587     struct NDPNeighborAdvertisementMessageType
00588         : public PacketTypeBase,
00589           public PacketTypeMixin<NDPNeighborAdvertisementMessageType>
00590     {
00591         typedef PacketTypeMixin<NDPNeighborAdvertisementMessageType> mixin;
00592         typedef ConcretePacket<NDPNeighborAdvertisementMessageType> packet;
00593         typedef NDPNeighborAdvertisementParser parser;
00594 
00595         using mixin::nextPacketRange;
00596         using mixin::init;
00597         using mixin::initSize;
00598 
00599         static void dump(packet p, std::ostream & os);
00600     };
00601     typedef ConcretePacket<NDPNeighborAdvertisementMessageType> NDPNeighborAdvertisementMessage;
00602 
00603     //#############################################################
00604     //ICMPv6 Redirect (RFC 4861) Message
00605     //#############################################################
00606     struct  NDPRedirectParser : public PacketParserBase
00607     {
00608 #      include SENF_PARSER()
00609         SENF_PARSER_BITFIELD  ( reserved, 32, unsigned ); // set to zero by default
00610         SENF_PARSER_FIELD     ( target, INet6AddressParser );
00611         SENF_PARSER_FIELD     ( destination, INet6AddressParser );
00612         SENF_PARSER_LIST      ( options, packetSize(), senf::NDPGenericOptionParser );
00613         SENF_PARSER_FINALIZE  ( NDPRedirectParser );
00614 
00615         SENF_PARSER_INIT() {
00616             reserved() = 0;
00617 
00618         }
00619     };
00620 
00632     struct NDPRedirectMessageType
00633         : public PacketTypeBase,
00634           public PacketTypeMixin<NDPRedirectMessageType>
00635     {
00636         typedef PacketTypeMixin<NDPRedirectMessageType> mixin;
00637         typedef ConcretePacket<NDPRedirectMessageType> packet;
00638         typedef NDPRedirectParser parser;
00639 
00640         using mixin::nextPacketRange;
00641         using mixin::init;
00642         using mixin::initSize;
00643 
00644         static void dump(packet p, std::ostream & os);
00645     };
00646     typedef ConcretePacket<NDPRedirectMessageType> NDPRedirectMessage;
00647 }
00648 
00649 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00650 //#include "ICMPv6TypePacket.cci"
00651 //#include "ICMPv6TypePacket.ct"
00652 //#include "ICMPv6TypePacket.cti"
00653 #endif
00654 
00655 
00656 // Local Variables:
00657 // mode: c++
00658 // fill-column: 100
00659 // c-file-style: "senf"
00660 // indent-tabs-mode: nil
00661 // ispell-local-dictionary: "american"
00662 // compile-command: "scons -u test"
00663 // comment-column: 40
00664 // End:

Contact: senf-dev@lists.berlios.de | © 2006-2010 Fraunhofer Institute for Open Communication Systems, Network Research