switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / Packets / DefaultBundle / ICMPv6TypePacket.cc
1 // $Id$
2 //
3 // Copyright (C) 2008
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 //
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
10 //
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.
14 //
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.
18 //
19 // The Original Code is Fraunhofer FOKUS code.
20 //
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.
24 //
25 // Contributor(s):
26 //   Philipp Batroff <pug@berlios.de>
27
28
29 // Definition of non-inline non-template functions
30
31 #include "ICMPv6TypePacket.hh"
32
33 // Custom includes
34
35 #define prefix_
36 //-/////////////////////////////////////////////////////////////////////////////////////////////////
37
38 namespace {
39     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 1,   senf::ICMPv6ErrDestUnreachable       );
40     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 2,   senf::ICMPv6ErrTooBig                );
41     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 3,   senf::ICMPv6ErrTimeExceeded          );
42     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 4,   senf::ICMPv6ErrParamProblem          );
43     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 128, senf::ICMPv6EchoRequest              );
44     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 129, senf::ICMPv6EchoReply                );
45     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 130, senf::MLDv2ListenerQuery             );
46     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 133, senf::NDPRouterSolicitationMessage   );
47     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 134, senf::NDPRouterAdvertisementMessage  );
48     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 135, senf::NDPNeighborSolicitationMessage );
49     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 136, senf::NDPNeighborAdvertisementMessage);
50     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 137, senf::NDPRedirectMessage             );
51     SENF_PACKET_REGISTRY_REGISTER( senf::ICMPTypes, 143, senf::MLDv2ListenerReport            );
52 }
53
54 prefix_ void senf::ICMPv6ErrDestUnreachableParser::setErrCode(int code)
55 {
56     ICMPv6Packet icmpv6 (Packet().rfind<ICMPv6Packet>(senf::nothrow));
57     icmpv6->code() = code;
58 }
59
60 prefix_ void senf::ICMPv6ErrParamProblemParser::setErrCode(int code)
61 {
62     ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
63     icmpv6->code() = code;
64 }
65
66 prefix_ void senf::ICMPv6ErrTimeExceededParser::setErrCode(int code)
67 {
68     ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
69     icmpv6->code() = code;
70 }
71
72 prefix_ void senf::ICMPv6EchoRequestType::dump(packet p, std::ostream & os)
73 {
74     os << "ICMPv6 Echo Request:\n"
75        << senf::fieldName("Identifier")         << unsigned(p->identifier()) << "\n"
76        << senf::fieldName("SequenceNumber")     << unsigned(p->seqNr() ) << "\n";
77 }
78
79 prefix_ void senf::ICMPv6EchoReplyType::dump(packet p, std::ostream & os)
80 {
81     os << "ICMPv6 Echo Reply:\n"
82        << senf::fieldName("Identifier")         << unsigned(p->identifier()) << "\n"
83        << senf::fieldName("SequenceNumber")     << unsigned(p->seqNr()) << "\n";
84 }
85
86 prefix_ void senf::ICMPv6ErrDestUnreachableType::dump(packet p, std::ostream & os)
87 {
88     os << "ICMPv6 Error Destination Unreachable (no further fields available here)\n";
89 }
90
91 prefix_ void senf::ICMPv6ErrTooBigType::dump(packet p, std::ostream & os)
92 {
93     os << "ICMPv6 Error Packet Too Big:\n"
94        << senf::fieldName("MTU")            << unsigned(p->mtu() ) << "\n";
95 }
96
97 prefix_ void senf::ICMPv6ErrTimeExceededType::dump(packet p, std::ostream & os)
98 {
99     os << "ICMPv6 Error Time Exceeded:\n"
100        << senf::fieldName("Unused(32Bit)")  << unsigned(p->unused() ) << "\n";
101 }
102
103 prefix_ void senf::ICMPv6ErrParamProblemType::dump(packet p, std::ostream & os)
104 {
105     os << "ICMPv6 Error Parameter Problem:\n"
106        << senf::fieldName("Pointer")        << unsigned(p->pointer() ) << "\n";
107 }
108
109 prefix_ void senf::MLDv2ListenerQueryType::dump(packet p, std::ostream & os)
110 {
111     os << "ICMPv6 Multicast Listener Query:\n"
112        << senf::fieldName("Max. ResponseCode")         << unsigned(p->maxResponseCode()) << "\n"
113        << senf::fieldName("Reserved(16Bit)")           << unsigned(p->reserved()) << "\n"
114        << senf::fieldName("Multicast Address")         << p->mcAddress() << "\n"
115        << senf::fieldName("Reserver(4Bit)")            << unsigned(p->resv()) << "\n"
116        << senf::fieldName("Suppress Router-Side Processing") << unsigned(p->sFlag()) << "\n"
117        << senf::fieldName("Querier's Robustness Variable") << unsigned(p->qrv()) << "\n"
118        << senf::fieldName("Querier's Query Interval Code") << unsigned(p->qqic()) << "\n"
119        << "  Source Addresses:\n";
120     parser::srcAddresses_t::container c (p->srcAddresses());
121     parser::srcAddresses_t::container::iterator i (c.begin());
122     for (unsigned int nr =1; i != c.end(); ++i, ++nr)
123         os << "    " << nr << ".) " << *i << "\n";
124     os << "\n";
125 }
126
127 prefix_ void senf::MLDv2ListenerReportType::dump(packet p, std::ostream & os)
128 {
129     os << "ICMPv6 Multicast Listener Report Message:\n"
130        << senf::fieldName("Reserved")              << unsigned(p->reserved() )
131        <<"\n  Multicast Address Records:\n";
132
133     MLDv2ListenerReport::Parser::mcastAddrRecords_t::container cAddrR (p->mcastAddrRecords() );
134     MLDv2ListenerReport::Parser::mcastAddrRecords_t::container::iterator iAddrR (cAddrR.begin() );
135     for (; iAddrR != cAddrR.end(); ++iAddrR) {
136         os << senf::fieldName("  Record Type")         << unsigned(iAddrR->recordType()) << "\n"
137            << senf::fieldName("  Multicast Address")   << iAddrR->mcAddress() << "\n"
138            << "    Source Addresses\n:";
139         MLDv2AddressRecordParser::srcAddresses_t::container cSrcAddr (iAddrR->srcAddresses());
140         MLDv2AddressRecordParser::srcAddresses_t::container::iterator iSrcAddr (cSrcAddr.begin());
141         for (;iSrcAddr != cSrcAddr.end();++iSrcAddr)
142             os << "      " << *iSrcAddr << "\n";
143         os << "    Auxiliary Data:\n";
144         MLDv2AddressRecordParser::auxData_t::container cAuxD ( iAddrR->auxData() );
145         MLDv2AddressRecordParser::auxData_t::container::iterator iAuxD (cAuxD.begin() );
146         for (;iAuxD != cAuxD.end(); ++iAuxD)
147             os << "      " << *iAuxD << "\n";
148     }
149 }
150
151 prefix_ void senf::NDPRouterSolicitationMessageType::dump(packet p, std::ostream & os)
152 {
153     os << "ICMPv6 Neighbor Discovery Router Solicitation Message:\n"
154        << senf::fieldName("Reserved(32Bit)")           << unsigned(p->reserved()) << "\n";
155     parser::options_t::container optC (p->options());
156     parser::options_t::container::const_iterator listIter (optC.begin());
157     for (; listIter != optC.end(); ++listIter) {
158         listIter->dump(os);
159     }
160 }
161
162 prefix_ void senf::NDPRouterAdvertisementMessageType::dump(packet p, std::ostream & os)
163 {
164     os << "ICMPv6 Neighbor Discovery Router Advertisement Message:\n"
165        << senf::fieldName("Current Hop Limit")             << unsigned(p->curHopLimit()) << "\n"
166        << senf::fieldName("Managed Address Configuration") << unsigned(p->m()) << "\n"
167        << senf::fieldName("Other Configuration")           << unsigned(p->o()) << "\n"
168        << senf::fieldName("Reserved(6Bit)")                << unsigned(p->reserved()) << "\n"
169        << senf::fieldName("Router Lifetime")               << unsigned(p->routerLifetime()) << "\n"
170        << senf::fieldName("Reachable Time")                << unsigned(p->reachableTime()) << "\n"
171        << senf::fieldName("Retrans Timer")                 << unsigned(p->retransTimer()) << "\n";
172     parser::options_t::container optC (p->options());
173     parser::options_t::container::const_iterator listIter (optC.begin());
174     for (; listIter != optC.end(); ++listIter) {
175       listIter->dump(os);
176     }
177 }
178
179 prefix_ void senf::NDPNeighborSolicitationMessageType::dump(packet p, std::ostream & os)
180 {
181     os << "ICMPv6 Neighbor Discovery Neighbor Solicitation Message:\n"
182        << senf::fieldName("Reserved(32Bit)")          << unsigned(p->reserved()) << "\n"
183        << senf::fieldName("Target Address")           << p->target() << "\n";
184     parser::options_t::container optC (p->options());
185     parser::options_t::container::const_iterator listIter (optC.begin());
186     for (; listIter != optC.end(); ++listIter) {
187         listIter->dump(os);
188     }
189 }
190
191 prefix_ void senf::NDPNeighborAdvertisementMessageType::dump(packet p, std::ostream & os)
192 {
193     os << "ICMPv6 Neighbor Discovery Neighbor Advertisement Message:\n"
194        << senf::fieldName("Router Flag")           << unsigned(p->r()) << "\n"
195        << senf::fieldName("Solicited Flag")        << unsigned(p->s()) << "\n"
196        << senf::fieldName("Override Flag")         << unsigned(p->o()) << "\n"
197        << senf::fieldName("Reserved(29Bit)")       << unsigned(p->reserved()) << "\n"
198        << senf::fieldName("Target Address")        << p->target() << "\n";
199     parser::options_t::container optC(p->options() );
200     parser::options_t::container::const_iterator listIter (optC.begin());
201     for (; listIter != optC.end(); ++listIter) {
202        listIter->dump(os);
203     }
204 }
205
206 prefix_ void senf::NDPRedirectMessageType::dump(packet p, std::ostream & os)
207 {
208     os << "ICMPv6 Neighbor Discovery Redirect Message:\n"
209        << senf::fieldName("Reserved(32Bit)")       << unsigned(p->reserved()) << "\n"
210        << senf::fieldName("Target Address")        << p->target() << "\n"
211        << senf::fieldName("Destination Address")   << p->destination() << "\n";
212     parser::options_t::container optC(p->options() );
213     parser::options_t::container::const_iterator listIter (optC.begin());
214     for (; listIter != optC.end(); ++listIter) {
215         listIter->dump(os);
216     }
217 }
218 //-/////////////////////////////////////////////////////////////////////////////////////////////////
219 #undef prefix_