Added ICMPv6 Packet Parser and Unittests for different ICMP Packages.
[senf.git] / Packets / DefaultBundle / ICMPv6TypePacket.hh
1 // $Id: main.test.cc 206 2008-06-08 14:20:52Z pug $
2 //
3 // Copyright (C) 2006
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>
7 //
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.
12 //
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.
17 //
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.
22
23 // Definition of non-inline non-template functions
24
25 #ifndef HH_ICMPV6TYPEPacket
26 #define HH_ICMPV6TYPEPacket
27 // Custom includes
28 #include "../../Packets/Packets.hh"
29 #include "ICMPv6Packet.hh"
30
31 namespace senf{
32     //#############################################################
33     //ICMPv6 Echo Request
34     //#############################################################
35     struct ICMPV6EchoRequestParser : public senf::PacketParserBase
36     {
37     #       include SENF_FIXED_PARSER()
38         SENF_PARSER_FIELD    ( identifier, senf::UInt16Parser );
39         SENF_PARSER_FIELD    ( seqNr, senf::UInt16Parser );
40         
41         SENF_PARSER_FINALIZE ( ICMPV6EchoRequestParser );
42     };
43     
44     struct ICMPV6EchoRequestType
45             : public senf::PacketTypeBase,
46             public senf::PacketTypeMixin<ICMPV6EchoRequestType>
47     {
48         typedef senf::PacketTypeMixin<ICMPV6EchoRequestType> mixin;
49         typedef senf::ConcretePacket<ICMPV6EchoRequestType> packet;
50         typedef ICMPV6EchoRequestParser parser;
51         
52         using mixin::nextPacketRange;
53         using mixin::init;
54         using mixin::initSize;
55     };
56     
57     typedef ICMPV6EchoRequestType::packet ICMPv6EchoReq;
58     
59     //#############################################################
60     //ICMPv6 Echo Reply
61     //#############################################################
62     struct ICMPV6EchoReplyParser : public senf::PacketParserBase
63     {
64     #       include SENF_FIXED_PARSER()
65         SENF_PARSER_FIELD    ( identifier, senf::UInt16Parser );
66         SENF_PARSER_FIELD    ( seqNr, senf::UInt16Parser );
67         
68         SENF_PARSER_FINALIZE ( ICMPV6EchoReplyParser );
69     };
70     
71     struct ICMPV6EchoReplyType
72             : public senf::PacketTypeBase,
73             public senf::PacketTypeMixin<ICMPV6EchoReplyType>
74     {
75         typedef senf::PacketTypeMixin<ICMPV6EchoReplyType> mixin;
76         typedef senf::ConcretePacket<ICMPV6EchoReplyType> packet;
77         typedef ICMPV6EchoReplyParser parser;
78         
79         using mixin::nextPacketRange;
80         using mixin::init;
81         using mixin::initSize;
82     };
83     typedef ICMPV6EchoReplyType::packet ICMPv6EchoReply;
84     
85     //#############################################################
86     //ICMPv6 Error Destination Unreachable Message
87     //#############################################################
88     struct ICMPV6ErrDestUnreachableParser : public senf::PacketParserBase
89     {
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 );
93         
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
100                     4 - Port 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;
106         }
107         
108         SENF_PARSER_FINALIZE ( ICMPV6ErrDestUnreachableParser );
109     };
110     
111     struct ICMPV6ErrDestUnreachableType
112             : public senf::PacketTypeBase,
113             public senf::PacketTypeMixin<ICMPV6ErrDestUnreachableType>
114     {
115         typedef senf::PacketTypeMixin<ICMPV6ErrDestUnreachableType> mixin;
116         typedef senf::ConcretePacket<ICMPV6ErrDestUnreachableType> packet;
117         typedef ICMPV6ErrDestUnreachableParser parser;
118         
119         using mixin::nextPacketRange;
120         using mixin::init;
121         using mixin::initSize;
122     };
123     typedef ICMPV6ErrDestUnreachableType::packet ICMPV6ErrDestUnreachable;
124     
125     //#############################################################
126     //ICMPv6 Error Packet Too Big Message
127     //#############################################################
128     struct ICMPV6ErrTooBigParser : public senf::PacketParserBase
129     {
130     #       include SENF_FIXED_PARSER()
131         SENF_PARSER_FIELD    ( MTU, senf::UInt32Parser );
132     
133         /*   Code     static set to 0       */
134     //     SENF_PARSER_INIT() {
135     //         ICMPv6Packet icmpv6 (senf::Packet().rfind<ICMPv6Packet>(senf::nothrow));
136     //         icmpv6->code() = 0;
137     //     }
138         
139         SENF_PARSER_FINALIZE ( ICMPV6ErrTooBigParser );
140     };
141     
142     struct ICMPV6ErrTooBigType
143             : public senf::PacketTypeBase,
144             public senf::PacketTypeMixin<ICMPV6ErrTooBigType>
145     {
146         typedef senf::PacketTypeMixin<ICMPV6ErrTooBigType> mixin;
147         typedef senf::ConcretePacket<ICMPV6ErrTooBigType> packet;
148         typedef ICMPV6ErrTooBigParser parser;
149         
150         using mixin::nextPacketRange;
151         using mixin::init;
152         using mixin::initSize;
153     };
154     typedef ICMPV6ErrTooBigType::packet ICMPV6ErrTooBig;
155     
156     //#############################################################
157     //ICMPv6 Error Time Exceeded Message
158     //#############################################################
159     struct ICMPV6ErrTimeExceededParser : public senf::PacketParserBase
160     {
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;
169         }
170         
171         SENF_PARSER_FINALIZE ( ICMPV6ErrTimeExceededParser );
172     };
173     
174     struct ICMPV6ErrTimeExceededType
175             : public senf::PacketTypeBase,
176             public senf::PacketTypeMixin<ICMPV6ErrTimeExceededType>
177     {
178         typedef senf::PacketTypeMixin<ICMPV6ErrTimeExceededType> mixin;
179         typedef senf::ConcretePacket<ICMPV6ErrTimeExceededType> packet;
180         typedef ICMPV6ErrTimeExceededParser parser;
181         
182         using mixin::nextPacketRange;
183         using mixin::init;
184         using mixin::initSize;
185     };
186     typedef ICMPV6ErrTimeExceededType::packet ICMPV6ErrTimeExceeded;
187     
188     //#############################################################
189     //ICMPv6 Error Parameter Problem Message
190     //#############################################################
191     struct ICMPV6ErrParamProblemParser : public senf::PacketParserBase
192     {
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          */
199         
200         void setErrCode(int code){
201             ICMPv6Packet icmpv6 (senf::Packet().rfind<ICMPv6Packet>(senf::nothrow));
202             icmpv6->code() = code;
203         }
204         SENF_PARSER_FINALIZE ( ICMPV6ErrParamProblemParser );
205     };
206     
207     struct ICMPV6ErrParamProblemType
208             : public senf::PacketTypeBase,
209             public senf::PacketTypeMixin<ICMPV6ErrParamProblemType>
210     {
211         typedef senf::PacketTypeMixin<ICMPV6ErrParamProblemType> mixin;
212         typedef senf::ConcretePacket<ICMPV6ErrParamProblemType> packet;
213         typedef ICMPV6ErrParamProblemParser parser;
214         
215         using mixin::nextPacketRange;
216         using mixin::init;
217         using mixin::initSize;
218     };
219     typedef ICMPV6ErrParamProblemType::packet ICMPV6ErrParamProblem;
220     
221     //#############################################################
222     //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Query
223     //#############################################################
224     struct MLDv2ListenerQueryParser : public senf::PacketParserBase
225     {
226     #   include SENF_PARSER()
227     //need a variant here
228         // a.) maxResponseCode < 32768 =>Interger
229         // b.) maxResponseCode >=32768 => float (is there a float parser???)
230         /* 
231         float value as followed: 
232         0 1 2 3 4 5 6 7 8 9 A B C D E F
233         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
234         |1| exp |          mant         |
235         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
236         
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 );
246         
247         SENF_PARSER_INIT() 
248         { 
249             reserved() = 0; 
250             resv() = 0;
251         }
252         SENF_PARSER_FINALIZE ( MLDv2ListenerQueryParser );
253         
254     };
255     
256     struct MLDv2ListenerQueryType
257             : public senf::PacketTypeBase,
258             public senf::PacketTypeMixin<MLDv2ListenerQueryType>
259     {
260         typedef senf::PacketTypeMixin<MLDv2ListenerQueryType> mixin;
261         typedef senf::ConcretePacket<MLDv2ListenerQueryType> packet;
262         typedef MLDv2ListenerQueryParser parser;
263         
264         using mixin::nextPacketRange;
265         using mixin::init;
266         using mixin::initSize;
267     };
268     typedef MLDv2ListenerQueryType::packet MLDv2ListenerQuery;
269     
270     //#############################################################
271     //ICMPv6 MLDv2 (RFC 3810) Multicast Listener Report Message
272     //#############################################################
273     //First: the Multicast Address Record Parser
274     struct MLDv2AddressRecordParser : public senf::PacketParserBase
275     {
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 );
283         
284         
285         SENF_PARSER_FINALIZE ( MLDv2AddressRecordParser );
286     };
287     
288     struct MLDv2ListenerReportParser : public senf::PacketParserBase
289     {
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 );
294         
295         SENF_PARSER_INIT() { reserved() = 0; }
296         
297         SENF_PARSER_FINALIZE ( MLDv2ListenerReportParser );
298     };
299     
300     struct MLDv2ListenerReportType
301             : public senf::PacketTypeBase,
302             public senf::PacketTypeMixin<MLDv2ListenerReportType>
303     {
304         typedef senf::PacketTypeMixin<MLDv2ListenerReportType> mixin;
305         typedef senf::ConcretePacket<MLDv2ListenerReportType> packet;
306         typedef MLDv2ListenerReportParser parser;
307         
308         using mixin::nextPacketRange;
309         using mixin::init;
310         using mixin::initSize;
311     };
312     typedef MLDv2ListenerReportType::packet MLDv2ListenerReport;
313 }
314 #endif