1 // $Id: main.test.cc 206 2008-06-08 14:20:52Z pug $
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Philipp Batroff <Philipp.Batroff@fokus.fraunhofer.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_ICMPV6TYPEPacket
26 #define HH_ICMPV6TYPEPacket
28 #include "../../Packets/Packets.hh"
29 #include "ICMPv6Packet.hh"
32 //#############################################################
34 //#############################################################
35 struct ICMPV6EchoRequestParser : public senf::PacketParserBase
37 # include SENF_FIXED_PARSER()
38 SENF_PARSER_FIELD ( identifier, senf::UInt16Parser );
39 SENF_PARSER_FIELD ( seqNr, senf::UInt16Parser );
41 SENF_PARSER_FINALIZE ( ICMPV6EchoRequestParser );
44 struct ICMPV6EchoRequestType
45 : public senf::PacketTypeBase,
46 public senf::PacketTypeMixin<ICMPV6EchoRequestType>
48 typedef senf::PacketTypeMixin<ICMPV6EchoRequestType> mixin;
49 typedef senf::ConcretePacket<ICMPV6EchoRequestType> packet;
50 typedef ICMPV6EchoRequestParser parser;
52 using mixin::nextPacketRange;
54 using mixin::initSize;
57 typedef ICMPV6EchoRequestType::packet ICMPv6EchoReq;
59 //#############################################################
61 //#############################################################
62 struct ICMPV6EchoReplyParser : public senf::PacketParserBase
64 # include SENF_FIXED_PARSER()
65 SENF_PARSER_FIELD ( identifier, senf::UInt16Parser );
66 SENF_PARSER_FIELD ( seqNr, senf::UInt16Parser );
68 SENF_PARSER_FINALIZE ( ICMPV6EchoReplyParser );
71 struct ICMPV6EchoReplyType
72 : public senf::PacketTypeBase,
73 public senf::PacketTypeMixin<ICMPV6EchoReplyType>
75 typedef senf::PacketTypeMixin<ICMPV6EchoReplyType> mixin;
76 typedef senf::ConcretePacket<ICMPV6EchoReplyType> packet;
77 typedef ICMPV6EchoReplyParser parser;
79 using mixin::nextPacketRange;
81 using mixin::initSize;
83 typedef ICMPV6EchoReplyType::packet ICMPv6EchoReply;
85 //#############################################################
86 //ICMPv6 Error Destination Unreachable Message
87 //#############################################################
88 struct ICMPV6ErrDestUnreachableParser : public senf::PacketParserBase
90 # include SENF_FIXED_PARSER()
91 //should be set static 0 by sender and ignored by receiver
92 SENF_PARSER_PRIVATE_FIELD ( unused, senf::UInt32Parser );
94 SENF_PARSER_INIT() { unused() = 0; }
95 /* Code 0 - No route to destination
96 1 - Communication with destination
97 administratively prohibited
98 2 - Beyond scope of source address
99 3 - Address unreachable
101 5 - Source address failed ingress/egress policy
102 6 - Reject route to destination */
103 void setErrCode(int code){
104 ICMPv6Packet icmpv6 (senf::Packet().rfind<ICMPv6Packet>(senf::nothrow));
105 icmpv6->code() = code;
108 SENF_PARSER_FINALIZE ( ICMPV6ErrDestUnreachableParser );
111 struct ICMPV6ErrDestUnreachableType
112 : public senf::PacketTypeBase,
113 public senf::PacketTypeMixin<ICMPV6ErrDestUnreachableType>
115 typedef senf::PacketTypeMixin<ICMPV6ErrDestUnreachableType> mixin;
116 typedef senf::ConcretePacket<ICMPV6ErrDestUnreachableType> packet;
117 typedef ICMPV6ErrDestUnreachableParser parser;
119 using mixin::nextPacketRange;
121 using mixin::initSize;
123 typedef ICMPV6ErrDestUnreachableType::packet ICMPV6ErrDestUnreachable;
125 //#############################################################
126 //ICMPv6 Error Packet Too Big Message
127 //#############################################################
128 struct ICMPV6ErrTooBigParser : public senf::PacketParserBase
130 # include SENF_FIXED_PARSER()
131 SENF_PARSER_FIELD ( MTU, senf::UInt32Parser );
133 /* Code static set to 0 */
134 // SENF_PARSER_INIT() {
135 // ICMPv6Packet icmpv6 (senf::Packet().rfind<ICMPv6Packet>(senf::nothrow));
136 // icmpv6->code() = 0;
139 SENF_PARSER_FINALIZE ( ICMPV6ErrTooBigParser );
142 struct ICMPV6ErrTooBigType
143 : public senf::PacketTypeBase,
144 public senf::PacketTypeMixin<ICMPV6ErrTooBigType>
146 typedef senf::PacketTypeMixin<ICMPV6ErrTooBigType> mixin;
147 typedef senf::ConcretePacket<ICMPV6ErrTooBigType> packet;
148 typedef ICMPV6ErrTooBigParser parser;
150 using mixin::nextPacketRange;
152 using mixin::initSize;
154 typedef ICMPV6ErrTooBigType::packet ICMPV6ErrTooBig;
156 //#############################################################
157 //ICMPv6 Error Time Exceeded Message
158 //#############################################################
159 struct ICMPV6ErrTimeExceededParser : public senf::PacketParserBase
161 # include SENF_FIXED_PARSER()
162 //should be set static 0 by sender and ignored by receiver
163 SENF_PARSER_FIELD ( unused, senf::UInt32Parser );
164 /* Code 0 - Hop limit exceeded in transit
165 1 - Fragment reassembly time exceeded */
166 void setErrCode(int code){
167 ICMPv6Packet icmpv6 (senf::Packet().rfind<ICMPv6Packet>(senf::nothrow));
168 icmpv6->code() = code;
171 SENF_PARSER_FINALIZE ( ICMPV6ErrTimeExceededParser );
174 struct ICMPV6ErrTimeExceededType
175 : public senf::PacketTypeBase,
176 public senf::PacketTypeMixin<ICMPV6ErrTimeExceededType>
178 typedef senf::PacketTypeMixin<ICMPV6ErrTimeExceededType> mixin;
179 typedef senf::ConcretePacket<ICMPV6ErrTimeExceededType> packet;
180 typedef ICMPV6ErrTimeExceededParser parser;
182 using mixin::nextPacketRange;
184 using mixin::initSize;
186 typedef ICMPV6ErrTimeExceededType::packet ICMPV6ErrTimeExceeded;
188 //#############################################################
189 //ICMPv6 Error Parameter Problem Message
190 //#############################################################
191 struct ICMPV6ErrParamProblemParser : public senf::PacketParserBase
193 # include SENF_FIXED_PARSER()
194 //should be set static 0 by sender and ignored by receiver
195 SENF_PARSER_FIELD ( pointer, senf::UInt32Parser );
196 /* Code 0 - Erroneous header field encountered
197 1 - Unrecognized Next Header type encountered
198 2 - Unrecognized IPv6 option encountered */
200 void setErrCode(int code){
201 ICMPv6Packet icmpv6 (senf::Packet().rfind<ICMPv6Packet>(senf::nothrow));
202 icmpv6->code() = code;
204 SENF_PARSER_FINALIZE ( ICMPV6ErrParamProblemParser );
207 struct ICMPV6ErrParamProblemType
208 : public senf::PacketTypeBase,
209 public senf::PacketTypeMixin<ICMPV6ErrParamProblemType>
211 typedef senf::PacketTypeMixin<ICMPV6ErrParamProblemType> mixin;
212 typedef senf::ConcretePacket<ICMPV6ErrParamProblemType> packet;
213 typedef ICMPV6ErrParamProblemParser parser;
215 using mixin::nextPacketRange;
217 using mixin::initSize;
219 typedef ICMPV6ErrParamProblemType::packet ICMPV6ErrParamProblem;
221 //#############################################################
222 //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Query
223 //#############################################################
224 struct MLDv2ListenerQueryParser : public senf::PacketParserBase
226 # include SENF_PARSER()
227 //need a variant here
228 // a.) maxResponseCode < 32768 =>Interger
229 // b.) maxResponseCode >=32768 => float (is there a float parser???)
231 float value as followed:
232 0 1 2 3 4 5 6 7 8 9 A B C D E F
233 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
235 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
237 SENF_PARSER_FIELD ( maxResponseCode, senf::UInt16Parser );
238 SENF_PARSER_FIELD ( reserved, senf::UInt16Parser ); //set to zero by default
239 SENF_PARSER_FIELD ( mcAddress, senf::INet6AddressParser);
240 SENF_PARSER_BITFIELD ( resv, 4, unsigned); //set to zero by default
241 SENF_PARSER_BITFIELD ( sFlag, 1, unsigned);
242 SENF_PARSER_BITFIELD ( qrv, 3, unsigned);
243 SENF_PARSER_FIELD ( qqic, senf::UInt8Parser );
244 SENF_PARSER_PRIVATE_FIELD ( nrSources, senf::UInt16Parser );
245 SENF_PARSER_VECTOR (srcAddresses, nrSources, senf::INet6AddressParser );
252 SENF_PARSER_FINALIZE ( MLDv2ListenerQueryParser );
256 struct MLDv2ListenerQueryType
257 : public senf::PacketTypeBase,
258 public senf::PacketTypeMixin<MLDv2ListenerQueryType>
260 typedef senf::PacketTypeMixin<MLDv2ListenerQueryType> mixin;
261 typedef senf::ConcretePacket<MLDv2ListenerQueryType> packet;
262 typedef MLDv2ListenerQueryParser parser;
264 using mixin::nextPacketRange;
266 using mixin::initSize;
268 typedef MLDv2ListenerQueryType::packet MLDv2ListenerQuery;
270 //#############################################################
271 //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Report Message
272 //#############################################################
273 //First: the Multicast Address Record Parser
274 struct MLDv2AddressRecordParser : public senf::PacketParserBase
276 # include SENF_PARSER()
277 SENF_PARSER_FIELD ( recordType, senf::UInt8Parser );
278 SENF_PARSER_PRIVATE_FIELD ( auxDataLen, senf::UInt8Parser );
279 SENF_PARSER_PRIVATE_FIELD ( nrOfSrcs, senf::UInt16Parser );
280 SENF_PARSER_FIELD ( mcAddress, senf::INet6AddressParser);
281 SENF_PARSER_VECTOR ( srcAddresses, nrOfSrcs, senf::INet6AddressParser );
282 SENF_PARSER_VECTOR ( auxData, auxDataLen, senf::UInt32Parser );
285 SENF_PARSER_FINALIZE ( MLDv2AddressRecordParser );
288 struct MLDv2ListenerReportParser : public senf::PacketParserBase
290 # include SENF_PARSER()
291 SENF_PARSER_FIELD ( reserved, senf::UInt16Parser ); //set to zero by default
292 SENF_PARSER_PRIVATE_FIELD ( nrMcastAddrRecords_, senf::UInt16Parser );
293 SENF_PARSER_LIST ( mcastAddrRecords, nrMcastAddrRecords_, MLDv2AddressRecordParser );
295 SENF_PARSER_INIT() { reserved() = 0; }
297 SENF_PARSER_FINALIZE ( MLDv2ListenerReportParser );
300 struct MLDv2ListenerReportType
301 : public senf::PacketTypeBase,
302 public senf::PacketTypeMixin<MLDv2ListenerReportType>
304 typedef senf::PacketTypeMixin<MLDv2ListenerReportType> mixin;
305 typedef senf::ConcretePacket<MLDv2ListenerReportType> packet;
306 typedef MLDv2ListenerReportParser parser;
308 using mixin::nextPacketRange;
310 using mixin::initSize;
312 typedef MLDv2ListenerReportType::packet MLDv2ListenerReport;