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.cc

Go to the documentation of this file.
00001 // $Id: ICMPv6TypePacket.cc 1772 2011-03-10 12:45:21Z 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 #include "ICMPv6TypePacket.hh"
00026 
00027 // Custom includes
00028 
00029 #define prefix_
00030 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00031 
00032 namespace {
00033     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 1,   senf::ICMPv6ErrDestUnreachable       );
00034     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 2,   senf::ICMPv6ErrTooBig                );
00035     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 3,   senf::ICMPv6ErrTimeExceeded          );
00036     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 4,   senf::ICMPv6ErrParamProblem          );
00037     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 128, senf::ICMPv6EchoRequest              );
00038     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 129, senf::ICMPv6EchoReply                );
00039     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 130, senf::MLDv2ListenerQuery             );
00040     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 133, senf::NDPRouterSolicitationMessage   );
00041     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 134, senf::NDPRouterAdvertisementMessage  );
00042     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 135, senf::NDPNeighborSolicitationMessage );
00043     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 136, senf::NDPNeighborAdvertisementMessage);
00044     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 137, senf::NDPRedirectMessage             );
00045     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 143, senf::MLDv2ListenerReport            );
00046 }
00047 
00048 prefix_ void senf::ICMPv6ErrDestUnreachableParser::setErrCode(int code)
00049 {
00050     ICMPv6Packet icmpv6 (Packet().rfind<ICMPv6Packet>(senf::nothrow));
00051     icmpv6->code() = code;
00052 }
00053 
00054 prefix_ void senf::ICMPv6ErrParamProblemParser::setErrCode(int code)
00055 {
00056     ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
00057     icmpv6->code() = code;
00058 }
00059 
00060 prefix_ void senf::ICMPv6ErrTimeExceededParser::setErrCode(int code)
00061 {
00062     ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
00063     icmpv6->code() = code;
00064 }
00065 
00066 prefix_ void senf::ICMPv6EchoRequestType::dump(packet p, std::ostream & os)
00067 {
00068     os << "ICMPv6 Echo Request:\n"
00069        << senf::fieldName("Identifier")         << unsigned(p->identifier()) << "\n"
00070        << senf::fieldName("SequenceNumber")     << unsigned(p->seqNr() ) << "\n";
00071 }
00072 
00073 prefix_ void senf::ICMPv6EchoReplyType::dump(packet p, std::ostream & os)
00074 {
00075     os << "ICMPv6 Echo Reply:\n"
00076        << senf::fieldName("Identifier")         << unsigned(p->identifier()) << "\n"
00077        << senf::fieldName("SequenceNumber")     << unsigned(p->seqNr()) << "\n";
00078 }
00079 
00080 prefix_ void senf::ICMPv6ErrDestUnreachableType::dump(packet p, std::ostream & os)
00081 {
00082     os << "ICMPv6 Error Destination Unreachable (no further fields available here)\n";
00083 }
00084 
00085 prefix_ void senf::ICMPv6ErrTooBigType::dump(packet p, std::ostream & os)
00086 {
00087     os << "ICMPv6 Error Packet Too Big:\n"
00088        << senf::fieldName("MTU")            << unsigned(p->mtu() ) << "\n";
00089 }
00090 
00091 prefix_ void senf::ICMPv6ErrTimeExceededType::dump(packet p, std::ostream & os)
00092 {
00093     os << "ICMPv6 Error Time Exceeded:\n"
00094        << senf::fieldName("Unused(32Bit)")  << unsigned(p->unused() ) << "\n";
00095 }
00096 
00097 prefix_ void senf::ICMPv6ErrParamProblemType::dump(packet p, std::ostream & os)
00098 {
00099     os << "ICMPv6 Error Parameter Problem:\n"
00100        << senf::fieldName("Pointer")        << unsigned(p->pointer() ) << "\n";
00101 }
00102 
00103 prefix_ void senf::MLDv2ListenerQueryType::dump(packet p, std::ostream & os)
00104 {
00105     os << "ICMPv6 Multicast Listener Query:\n"
00106        << senf::fieldName("Max. ResponseCode")         << unsigned(p->maxResponseCode()) << "\n"
00107        << senf::fieldName("Reserved(16Bit)")           << unsigned(p->reserved()) << "\n"
00108        << senf::fieldName("Multicast Address")         << p->mcAddress() << "\n"
00109        << senf::fieldName("Reserver(4Bit)")            << unsigned(p->resv()) << "\n"
00110        << senf::fieldName("Suppress Router-Side Processing") << unsigned(p->sFlag()) << "\n"
00111        << senf::fieldName("Querier's Robustness Variable") << unsigned(p->qrv()) << "\n"
00112        << senf::fieldName("Querier's Query Interval Code") << unsigned(p->qqic()) << "\n"
00113        << "  Source Addresses:\n";
00114     parser::srcAddresses_t::container c (p->srcAddresses());
00115     parser::srcAddresses_t::container::iterator i (c.begin());
00116     for (unsigned int nr =1; i != c.end(); ++i, ++nr)
00117         os << "    " << nr << ".) " << *i << "\n";
00118     os << "\n";
00119 }
00120 
00121 prefix_ void senf::MLDv2ListenerReportType::dump(packet p, std::ostream & os)
00122 {
00123     os << "ICMPv6 Multicast Listener Report Message:\n"
00124        << senf::fieldName("Reserved")              << unsigned(p->reserved() )
00125        <<"\n  Multicast Address Records:\n";
00126 
00127     MLDv2ListenerReport::Parser::mcastAddrRecords_t::container cAddrR (p->mcastAddrRecords() );
00128     MLDv2ListenerReport::Parser::mcastAddrRecords_t::container::iterator iAddrR (cAddrR.begin() );
00129     for (; iAddrR != cAddrR.end(); ++iAddrR) {
00130         os << senf::fieldName("  Record Type")         << unsigned(iAddrR->recordType()) << "\n"
00131            << senf::fieldName("  Multicast Address")   << iAddrR->mcAddress() << "\n"
00132            << "    Source Addresses\n:";
00133         MLDv2AddressRecordParser::srcAddresses_t::container cSrcAddr (iAddrR->srcAddresses());
00134         MLDv2AddressRecordParser::srcAddresses_t::container::iterator iSrcAddr (cSrcAddr.begin());
00135         for (;iSrcAddr != cSrcAddr.end();++iSrcAddr)
00136             os << "      " << *iSrcAddr << "\n";
00137         os << "    Auxiliary Data:\n";
00138         MLDv2AddressRecordParser::auxData_t::container cAuxD ( iAddrR->auxData() );
00139         MLDv2AddressRecordParser::auxData_t::container::iterator iAuxD (cAuxD.begin() );
00140         for (;iAuxD != cAuxD.end(); ++iAuxD)
00141             os << "      " << *iAuxD << "\n";
00142     }
00143 }
00144 
00145 prefix_ void senf::NDPRouterSolicitationMessageType::dump(packet p, std::ostream & os)
00146 {
00147     os << "ICMPv6 Neighbor Discovery Router Solicitation Message:\n"
00148        << senf::fieldName("Reserved(32Bit)")           << unsigned(p->reserved()) << "\n";
00149     parser::options_t::container optC (p->options());
00150     parser::options_t::container::const_iterator listIter (optC.begin());
00151     for (; listIter != optC.end(); ++listIter) {
00152         listIter->dump(os);
00153     }
00154 }
00155 
00156 prefix_ void senf::NDPRouterAdvertisementMessageType::dump(packet p, std::ostream & os)
00157 {
00158     os << "ICMPv6 Neighbor Discovery Router Advertisement Message:\n"
00159        << senf::fieldName("Current Hop Limit")             << unsigned(p->curHopLimit()) << "\n"
00160        << senf::fieldName("Managed Address Configuration") << unsigned(p->m()) << "\n"
00161        << senf::fieldName("Other Configuration")           << unsigned(p->o()) << "\n"
00162        << senf::fieldName("Reserved(6Bit)")                << unsigned(p->reserved()) << "\n"
00163        << senf::fieldName("Router Lifetime")               << unsigned(p->routerLifetime()) << "\n"
00164        << senf::fieldName("Reachable Time")                << unsigned(p->reachableTime()) << "\n"
00165        << senf::fieldName("Retrans Timer")                 << unsigned(p->retransTimer()) << "\n";
00166     parser::options_t::container optC (p->options());
00167     parser::options_t::container::const_iterator listIter (optC.begin());
00168     for (; listIter != optC.end(); ++listIter) {
00169       listIter->dump(os);
00170     }
00171 }
00172 
00173 prefix_ void senf::NDPNeighborSolicitationMessageType::dump(packet p, std::ostream & os)
00174 {
00175     os << "ICMPv6 Neighbor Discovery Neighbor Solicitation Message:\n"
00176        << senf::fieldName("Reserved(32Bit)")          << unsigned(p->reserved()) << "\n"
00177        << senf::fieldName("Target Address")           << p->target() << "\n";
00178     parser::options_t::container optC (p->options());
00179     parser::options_t::container::const_iterator listIter (optC.begin());
00180     for (; listIter != optC.end(); ++listIter) {
00181         listIter->dump(os);
00182     }
00183 }
00184 
00185 prefix_ void senf::NDPNeighborAdvertisementMessageType::dump(packet p, std::ostream & os)
00186 {
00187     os << "ICMPv6 Neighbor Discovery Neighbor Advertisement Message:\n"
00188        << senf::fieldName("Router Flag")           << unsigned(p->r()) << "\n"
00189        << senf::fieldName("Solicited Flag")        << unsigned(p->s()) << "\n"
00190        << senf::fieldName("Override Flag")         << unsigned(p->o()) << "\n"
00191        << senf::fieldName("Reserved(29Bit)")       << unsigned(p->reserved()) << "\n"
00192        << senf::fieldName("Target Address")        << p->target() << "\n";
00193     parser::options_t::container optC(p->options() );
00194     parser::options_t::container::const_iterator listIter (optC.begin());
00195     for (; listIter != optC.end(); ++listIter) {
00196        listIter->dump(os);
00197     }
00198 }
00199 
00200 prefix_ void senf::NDPRedirectMessageType::dump(packet p, std::ostream & os)
00201 {
00202     os << "ICMPv6 Neighbor Discovery Redirect Message:\n"
00203        << senf::fieldName("Reserved(32Bit)")       << unsigned(p->reserved()) << "\n"
00204        << senf::fieldName("Target Address")        << p->target() << "\n"
00205        << senf::fieldName("Destination Address")   << p->destination() << "\n";
00206     parser::options_t::container optC(p->options() );
00207     parser::options_t::container::const_iterator listIter (optC.begin());
00208     for (; listIter != optC.end(); ++listIter) {
00209         listIter->dump(os);
00210     }
00211 }
00212 //-/////////////////////////////////////////////////////////////////////////////////////////////////
00213 #undef prefix_

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