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"
35 //#############################################################
37 //#############################################################
38 struct ICMPv6EchoRequestParser : public PacketParserBase
40 # include SENF_FIXED_PARSER()
41 SENF_PARSER_FIELD ( identifier, UInt16Parser );
42 SENF_PARSER_FIELD ( seqNr, UInt16Parser );
44 SENF_PARSER_FINALIZE ( ICMPv6EchoRequestParser );
47 /** \brief ICMPv6 Echo Request
49 \par Packet type (typedef):
50 \ref ICMPv6EchoRequest
53 \ref ICMPv6EchoRequestParser
54 \image html ICMPv6EchoRequest.png
56 \ingroup protocolbundle_default
58 struct ICMPv6EchoRequestType
59 : public PacketTypeBase,
60 public PacketTypeMixin<ICMPv6EchoRequestType>
62 typedef PacketTypeMixin<ICMPv6EchoRequestType> mixin;
63 typedef ConcretePacket<ICMPv6EchoRequestType> packet;
64 typedef ICMPv6EchoRequestParser parser;
66 using mixin::nextPacketRange;
68 using mixin::initSize;
70 static void dump(packet p, std::ostream & os);
73 typedef ConcretePacket<ICMPv6EchoRequestType> ICMPv6EchoRequest;
75 //#############################################################
77 //#############################################################
78 struct ICMPv6EchoReplyParser : public PacketParserBase
80 # include SENF_FIXED_PARSER()
81 SENF_PARSER_FIELD ( identifier, UInt16Parser );
82 SENF_PARSER_FIELD ( seqNr, UInt16Parser );
84 SENF_PARSER_FINALIZE ( ICMPv6EchoReplyParser );
87 /** \brief ICMPv6 Echo Reply
89 \par Packet type (typedef):
93 \ref ICMPv6EchoReplyParser
94 \image html ICMPv6EchoReply.png
96 \ingroup protocolbundle_default
98 struct ICMPv6EchoReplyType
99 : public PacketTypeBase,
100 public PacketTypeMixin<ICMPv6EchoReplyType>
102 typedef PacketTypeMixin<ICMPv6EchoReplyType> mixin;
103 typedef ConcretePacket<ICMPv6EchoReplyType> packet;
104 typedef ICMPv6EchoReplyParser parser;
106 using mixin::nextPacketRange;
108 using mixin::initSize;
111 typedef ConcretePacket<ICMPv6EchoReplyType> ICMPv6EchoReply;
113 //#############################################################
114 //ICMPv6 Error Destination Unreachable Message
115 //#############################################################
116 struct ICMPv6ErrDestUnreachableParser : public PacketParserBase
118 # include SENF_FIXED_PARSER()
120 //should be set static 0 by sender and ignored by receiver
121 SENF_PARSER_PRIVATE_FIELD ( unused, UInt32Parser );
126 /* Code 0 - No route to destination
127 1 - Communication with destination
128 administratively prohibited
129 2 - Beyond scope of source address
130 3 - Address unreachable
132 5 - Source address failed ingress/egress policy
133 6 - Reject route to destination */
134 void setErrCode(int code) {
135 ICMPv6Packet icmpv6 (senf::Packet().rfind<ICMPv6Packet>(senf::nothrow));
136 icmpv6->code() = code;
139 SENF_PARSER_FINALIZE ( ICMPv6ErrDestUnreachableParser );
142 /** \brief ICMPv6 Destination unreachable
144 \par Packet type (typedef):
145 \ref ICMPv6ErrDestUnreachable
148 \ref ICMPv6ErrDestUnreachableParser
149 \image html ICMPv6ErrDestUnreachable.png
151 \ingroup protocolbundle_default
153 struct ICMPv6ErrDestUnreachableType
154 : public PacketTypeBase,
155 public PacketTypeMixin<ICMPv6ErrDestUnreachableType>
157 typedef PacketTypeMixin<ICMPv6ErrDestUnreachableType> mixin;
158 typedef ConcretePacket<ICMPv6ErrDestUnreachableType> packet;
159 typedef ICMPv6ErrDestUnreachableParser parser;
161 using mixin::nextPacketRange;
163 using mixin::initSize;
166 typedef ConcretePacket<ICMPv6ErrDestUnreachableType> ICMPv6ErrDestUnreachable;
168 //#############################################################
169 //ICMPv6 Error Packet Too Big Message
170 //#############################################################
171 struct ICMPv6ErrTooBigParser : public PacketParserBase
173 # include SENF_FIXED_PARSER()
174 SENF_PARSER_FIELD ( mtu, UInt32Parser );
176 /* Code static set to 0 */
177 // SENF_PARSER_INIT() {
178 // ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
179 // icmpv6->code() = 0;
182 SENF_PARSER_FINALIZE ( ICMPv6ErrTooBigParser );
185 /** \brief ICMPv6 Packet to big
187 \par Packet type (typedef):
191 \ref ICMPv6ErrTooBigParser
192 \image html ICMPv6ErrTooBig.png
194 \ingroup protocolbundle_default
196 struct ICMPv6ErrTooBigType
197 : public PacketTypeBase,
198 public PacketTypeMixin<ICMPv6ErrTooBigType>
200 typedef PacketTypeMixin<ICMPv6ErrTooBigType> mixin;
201 typedef ConcretePacket<ICMPv6ErrTooBigType> packet;
202 typedef ICMPv6ErrTooBigParser parser;
204 using mixin::nextPacketRange;
206 using mixin::initSize;
209 typedef ConcretePacket<ICMPv6ErrTooBigType> ICMPv6ErrTooBig;
211 //#############################################################
212 //ICMPv6 Error Time Exceeded Message
213 //#############################################################
214 struct ICMPv6ErrTimeExceededParser : public PacketParserBase
216 # include SENF_FIXED_PARSER()
217 //should be set static 0 by sender and ignored by receiver
218 SENF_PARSER_FIELD ( unused, UInt32Parser );
219 /* Code 0 - Hop limit exceeded in transit
220 1 - Fragment reassembly time exceeded */
221 void setErrCode(int code){
222 ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
223 icmpv6->code() = code;
226 SENF_PARSER_FINALIZE ( ICMPv6ErrTimeExceededParser );
229 /** \brief ICMPv6 Time exceeded
231 \par Packet type (typedef):
232 \ref ICMPv6ErrTimeExceeded
235 \ref ICMPv6ErrTimeExceededParser
236 \image html ICMPv6ErrTimeExceeded.png
238 \ingroup protocolbundle_default
240 struct ICMPv6ErrTimeExceededType
241 : public PacketTypeBase,
242 public PacketTypeMixin<ICMPv6ErrTimeExceededType>
244 typedef PacketTypeMixin<ICMPv6ErrTimeExceededType> mixin;
245 typedef ConcretePacket<ICMPv6ErrTimeExceededType> packet;
246 typedef ICMPv6ErrTimeExceededParser parser;
248 using mixin::nextPacketRange;
250 using mixin::initSize;
252 typedef ConcretePacket<ICMPv6ErrTimeExceededType> ICMPv6ErrTimeExceeded;
254 //#############################################################
255 //ICMPv6 Error Parameter Problem Message
256 //#############################################################
257 struct ICMPv6ErrParamProblemParser : public PacketParserBase
259 # include SENF_FIXED_PARSER()
260 //should be set static 0 by sender and ignored by receiver
261 SENF_PARSER_FIELD ( pointer, UInt32Parser );
262 /* Code 0 - Erroneous header field encountered
263 1 - Unrecognized Next Header type encountered
264 2 - Unrecognized IPv6 option encountered */
266 void setErrCode(int code){
267 ICMPv6Packet icmpv6 (packet().rfind<ICMPv6Packet>(senf::nothrow));
268 icmpv6->code() = code;
270 SENF_PARSER_FINALIZE ( ICMPv6ErrParamProblemParser );
273 /** \brief ICMPv6 Parameter problem
275 \par Packet type (typedef):
276 \ref ICMPv6ErrParamProblem
279 \ref ICMPv6ErrParamProblemParser
280 \image html ICMPv6ErrParamProblem.png
282 \ingroup protocolbundle_default
284 struct ICMPv6ErrParamProblemType
285 : public PacketTypeBase,
286 public PacketTypeMixin<ICMPv6ErrParamProblemType>
288 typedef PacketTypeMixin<ICMPv6ErrParamProblemType> mixin;
289 typedef ConcretePacket<ICMPv6ErrParamProblemType> packet;
290 typedef ICMPv6ErrParamProblemParser parser;
292 using mixin::nextPacketRange;
294 using mixin::initSize;
296 typedef ConcretePacket<ICMPv6ErrParamProblemType> ICMPv6ErrParamProblem;
298 //#############################################################
299 //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Query
300 //#############################################################
301 struct MLDv2ListenerQueryParser : public PacketParserBase
303 # include SENF_PARSER()
304 //need a variant here
305 // a.) maxResponseCode < 32768 =>Interger
306 // b.) maxResponseCode >=32768 => float (is there a float parser???)
308 float value as followed:
309 0 1 2 3 4 5 6 7 8 9 A B C D E F
310 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
312 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
314 SENF_PARSER_FIELD ( maxResponseCode, UInt16Parser );
315 SENF_PARSER_FIELD ( reserved, UInt16Parser ); // set to zero by default
316 SENF_PARSER_FIELD ( mcAddress, INet6AddressParser );
317 SENF_PARSER_BITFIELD ( resv, 4, unsigned ); // set to zero by default
318 SENF_PARSER_BITFIELD ( sFlag, 1, unsigned );
319 SENF_PARSER_BITFIELD ( qrv, 3, unsigned );
320 SENF_PARSER_FIELD ( qqic, UInt8Parser );
321 SENF_PARSER_PRIVATE_FIELD ( nrSources, UInt16Parser );
322 SENF_PARSER_VECTOR (srcAddresses, nrSources, INet6AddressParser );
324 SENF_PARSER_FINALIZE ( MLDv2ListenerQueryParser );
332 /** \brief MLDv2 Listener query
334 \par Packet type (typedef):
335 \ref MLDv2ListenerQuery
338 \ref MLDv2ListenerQueryParser
339 \image html MLDv2ListenerQuery.png
341 \ingroup protocolbundle_default
343 struct MLDv2ListenerQueryType
344 : public PacketTypeBase,
345 public PacketTypeMixin<MLDv2ListenerQueryType>
347 typedef PacketTypeMixin<MLDv2ListenerQueryType> mixin;
348 typedef ConcretePacket<MLDv2ListenerQueryType> packet;
349 typedef MLDv2ListenerQueryParser parser;
351 using mixin::nextPacketRange;
353 using mixin::initSize;
356 typedef ConcretePacket<MLDv2ListenerQueryType> MLDv2ListenerQuery;
358 //#############################################################
359 //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Report Message
360 //#############################################################
361 //First: the Multicast Address Record Parser
362 struct MLDv2AddressRecordParser : public PacketParserBase
364 # include SENF_PARSER()
366 SENF_PARSER_FIELD ( recordType, UInt8Parser );
367 SENF_PARSER_PRIVATE_FIELD ( auxDataLen, UInt8Parser );
368 SENF_PARSER_PRIVATE_FIELD ( nrOfSrcs, UInt16Parser );
369 SENF_PARSER_FIELD ( mcAddress, INet6AddressParser);
370 SENF_PARSER_VECTOR ( srcAddresses, nrOfSrcs, INet6AddressParser );
371 SENF_PARSER_VECTOR ( auxData, auxDataLen, UInt32Parser );
373 SENF_PARSER_FINALIZE ( MLDv2AddressRecordParser );
376 struct MLDv2ListenerReportParser : public PacketParserBase
378 # include SENF_PARSER()
380 SENF_PARSER_FIELD ( reserved, UInt16Parser ); //set to zero by default
381 SENF_PARSER_PRIVATE_FIELD ( nrMcastAddrRecords_, UInt16Parser );
382 SENF_PARSER_LIST ( mcastAddrRecords, nrMcastAddrRecords_, MLDv2AddressRecordParser );
384 SENF_PARSER_FINALIZE ( MLDv2ListenerReportParser );
391 /** \brief MLDv2 Listener report
393 \par Packet type (typedef):
394 \ref MLDv2ListenerReport
397 \ref MLDv2ListenerReportParser
398 \image html MLDv2ListenerReport.png
399 \image html MLDv2AddressRecord.png
401 \ingroup protocolbundle_default
403 struct MLDv2ListenerReportType
404 : public PacketTypeBase,
405 public PacketTypeMixin<MLDv2ListenerReportType>
407 typedef PacketTypeMixin<MLDv2ListenerReportType> mixin;
408 typedef ConcretePacket<MLDv2ListenerReportType> packet;
409 typedef MLDv2ListenerReportParser parser;
411 using mixin::nextPacketRange;
413 using mixin::initSize;
416 typedef ConcretePacket<MLDv2ListenerReportType> MLDv2ListenerReport;
425 // c-file-style: "senf"
426 // indent-tabs-mode: nil
427 // ispell-local-dictionary: "american"
428 // compile-command: "scons -u test"
429 // comment-column: 40