e66acd067dbd9e2fafdeec6a53d2592727e7330c
[senf.git] / Packets / 80211Bundle / WLANPacket.test.cc
1 // $Id: main.test.cc 206 2008-08-06 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 //     Christian Niephaus <christian.niephaus@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 // Custom includes
26
27 #include "../../Packets/Packets.hh"
28 #include "../../Utils/auto_unit_test.hh"
29 #include <boost/test/test_tools.hpp>
30 #include "WLANPacket.hh"
31
32 /* test parser with a data frame */
33 BOOST_AUTO_UNIT_TEST(WLANPacket_dataFrame_packet)
34 {
35
36
37     unsigned char data[] = {0x88, 0x01, 0x00, 0x00, 0x00, 0x1a,             //header
38                             0x4d, 0x3e, 0xc7, 0x5c, 0x00, 0x0b, 0x6b, 0x57,
39                             0x06, 0xb0, 0x00, 0x18, 0x4d, 0x6e, 0x78, 0x48,
40                             0x30, 0x00, 0x01, 0x00,
41                             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //dummy data
42                             0x38, 0x39, 0x30, 0x31                          //trailer
43                             };
44
45
46
47
48     senf::WLANPacket p (senf::WLANPacket::create(data));
49
50     BOOST_CHECK_EQUAL( p->version(), 0u);
51     BOOST_CHECK_EQUAL( p->type(), 2u);
52     BOOST_CHECK_EQUAL( p->subtype(), 8u);
53     BOOST_CHECK_EQUAL( p->toDS(), true);
54     BOOST_CHECK_EQUAL( p->fromDS(), false);
55     BOOST_CHECK_EQUAL( p->moreFrag(), false);
56     BOOST_CHECK_EQUAL( p->retry(), false);
57     BOOST_CHECK_EQUAL( p->pwrMgt(), false);
58     BOOST_CHECK_EQUAL( p->moreData(), false);
59     BOOST_CHECK_EQUAL( p->protectedFrame(), false);
60     BOOST_CHECK_EQUAL( p->order(), false);
61
62     BOOST_CHECK_EQUAL( p->duration(), 0u);
63
64     BOOST_CHECK_EQUAL( p->dataFrame().da()[0], 0x00 );
65     BOOST_CHECK_EQUAL( p->dataFrame().da()[1], 0x18 );
66     BOOST_CHECK_EQUAL( p->dataFrame().da()[2], 0x4d );
67     BOOST_CHECK_EQUAL( p->dataFrame().da()[3], 0x6e );
68     BOOST_CHECK_EQUAL( p->dataFrame().da()[4], 0x78 );
69     BOOST_CHECK_EQUAL( p->dataFrame().da()[5], 0x48 );
70
71     BOOST_CHECK_EQUAL( p->dataFrame().sa()[0], 0x00 );
72     BOOST_CHECK_EQUAL( p->dataFrame().sa()[3], 0x57 );
73     BOOST_CHECK_EQUAL( p->dataFrame().sa()[5], 0xb0 );
74
75     BOOST_CHECK_EQUAL( p->dataFrame().bssid()[0], 0x00 );
76     BOOST_CHECK_EQUAL( p->dataFrame().bssid()[3], 0x3e );
77     BOOST_CHECK_EQUAL( p->dataFrame().bssid()[5], 0x5c );
78
79     BOOST_CHECK_EQUAL( p->dataFrame().bssid()[3],
80                        p->dataFrame().ra()[3]);
81
82     BOOST_CHECK_EQUAL( p->dataFrame().ta()[3],
83                        p->dataFrame().sa()[3]);
84
85     BOOST_CHECK_EQUAL( p->dataFrame().sequenceNumber(), 3u );
86     BOOST_CHECK_EQUAL( p->dataFrame().fragmentNumber(), 0u );
87
88
89
90 }
91
92 /* test parser with creating a data frame*/
93 BOOST_AUTO_UNIT_TEST(WLANPacket_dataFrame_create)
94 {
95     senf::WLANPacket p (senf::WLANPacket::create());
96
97     SENF_CHECK_NO_THROW(p->init_dataFrame());
98     p->dataFrame().bssid()=senf::MACAddress::from_string("00:1a:4d:3e:c7:5c");
99     BOOST_CHECK_EQUAL( p->type(), 2u);
100 }
101
102
103
104 /* test parser with a beacon frame */
105 BOOST_AUTO_UNIT_TEST(WLANPacket_beaconFrame_packet)
106 {
107
108
109     unsigned char data[] = {0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
110                             0xff, 0xff, 0x00, 0x1a, 0x4d, 0x3e, 0xc7, 0x5c,
111                             0x00, 0x1a, 0x4d, 0x3e, 0xc7, 0x5c, 0xe0, 0x12,
112                             0x38, 0xa0, 0x86, 0x01, 0x00, 0x00, 0x00, 0x00,
113                             0x64, 0x00, 0x01, 0x05, 0x00, 0x05, 0x62, 0x6f,
114                             0x78, 0x43, 0x31, 0x01, 0x08, 0x8c, 0x12, 0x98,
115                             0x24, 0xb0, 0x48, 0x60, 0x6c, 0x03, 0x01, 0x40,
116                             0x05, 0x04, 0x00, 0x01, 0x00, 0x00, 0x07, 0x2a,
117                             0x4e, 0x41, 0x49, 0x24, 0x01, 0x11, 0x28, 0x01,
118                             0x11, 0x2c, 0x01, 0x11, 0x30, 0x01, 0x11, 0x34,
119                             0x01, 0x17, 0x38, 0x01, 0x17, 0x3c, 0x01, 0x17,
120                             0x40, 0x01, 0x17, 0x95, 0x01, 0x1e, 0x99, 0x01,
121                             0x1e, 0x9d, 0x01, 0x1e, 0xa1, 0x01, 0x1e, 0xa5,
122                             0x01, 0x1e, 0x20, 0x01, 0x00, 0xdd, 0x18, 0x00,
123                             0x50, 0xf2, 0x02, 0x01, 0x01, 0x81, 0x00, 0x02,
124                             0xa3, 0x40, 0x00, 0x27, 0xa4, 0x00, 0x00, 0x42,
125                             0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, 0xa0,
126                             0x00, 0xdd, 0x09, 0x00, 0x03, 0x7f, 0x01, 0x01,
127                             0x00, 0x24, 0xff, 0x7f, 0x87, 0x07, 0x1f, 0xf5,
128                             };
129
130     senf::WLANPacket p (senf::WLANPacket::create(data));
131
132     BOOST_CHECK_EQUAL( p->version(), 0u);
133     BOOST_CHECK_EQUAL( p->type(), 0u);
134     BOOST_CHECK_EQUAL( p->subtype(), 8u);
135     BOOST_CHECK_EQUAL( p->toDS(), false);
136     BOOST_CHECK_EQUAL( p->fromDS(), false);
137     BOOST_CHECK_EQUAL( p->moreFrag(), false);
138     BOOST_CHECK_EQUAL( p->retry(), false);
139     BOOST_CHECK_EQUAL( p->pwrMgt(), false);
140     BOOST_CHECK_EQUAL( p->moreData(), false);
141     BOOST_CHECK_EQUAL( p->protectedFrame(), false);
142     BOOST_CHECK_EQUAL( p->order(), false);
143
144     BOOST_CHECK_EQUAL( p->duration(), 0u);
145
146     BOOST_CHECK_EQUAL (p->has_mgtFrame(), true);
147
148     BOOST_CHECK_EQUAL( p->mgtFrame().da()[0], 0xff );
149     BOOST_CHECK_EQUAL( p->mgtFrame().da()[3], 0xff );
150     BOOST_CHECK_EQUAL( p->mgtFrame().da()[5], 0xff );
151
152     BOOST_CHECK_EQUAL( p->mgtFrame().sa()[0], 0x00 );
153     BOOST_CHECK_EQUAL( p->mgtFrame().sa()[3], 0x3e );
154     BOOST_CHECK_EQUAL( p->mgtFrame().sa()[5], 0x5c );
155
156     BOOST_CHECK_EQUAL( p->mgtFrame().bssid()[0], 0x00 );
157     BOOST_CHECK_EQUAL( p->mgtFrame().bssid()[3], 0x3e );
158     BOOST_CHECK_EQUAL( p->mgtFrame().bssid()[5], 0x5c );
159
160     BOOST_CHECK_EQUAL( p->mgtFrame().sequenceNumber(), 302u );
161     BOOST_CHECK_EQUAL( p->mgtFrame().fragmentNumber(), 0u );
162
163
164     BOOST_CHECK_EQUAL ( p->fcs(), 0x87071ff5);
165
166 }
167
168 /* test parser with creating a beacon frame*/
169 BOOST_AUTO_UNIT_TEST(WLANPacket_mgtFrame_create)
170 {
171     senf::WLANPacket p (senf::WLANPacket::create());
172
173     SENF_CHECK_NO_THROW(p->init_mgtFrame());
174     SENF_CHECK_NO_THROW(
175             p->mgtFrame().da()=senf::MACAddress::from_string("ff:ff:ff:ff:ff:ff")
176     );
177     SENF_CHECK_NO_THROW(
178             p->mgtFrame().sa()=senf::MACAddress::from_string("00:1a:4d:3e:c7:5c")
179     );
180     SENF_CHECK_NO_THROW(
181             p->mgtFrame().bssid()=senf::MACAddress::from_string("00:1a:4d:3e:c7:5c")
182     );
183
184     BOOST_CHECK_EQUAL( p->type(), 0u);
185 }
186
187 /* test parser with an ACK frame*/
188 BOOST_AUTO_UNIT_TEST(WLANPacket_ctrlFrame_packet)
189 {
190
191
192     unsigned char data[] = {0xd4, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x6b, 0x57,
193                             0x06, 0xb0, 0x4f, 0xda};
194
195     senf::WLANPacket p (senf::WLANPacket::create(data));
196
197     BOOST_CHECK_EQUAL( p->version(), 0u);
198     BOOST_CHECK_EQUAL( p->type(), 1u);
199     BOOST_CHECK_EQUAL( p->subtype(), 13u);
200     BOOST_CHECK_EQUAL( p->toDS(), false);
201     BOOST_CHECK_EQUAL( p->fromDS(), false);
202     BOOST_CHECK_EQUAL( p->moreFrag(), false);
203     BOOST_CHECK_EQUAL( p->retry(), false);
204     BOOST_CHECK_EQUAL( p->pwrMgt(), false);
205     BOOST_CHECK_EQUAL( p->moreData(), false);
206     BOOST_CHECK_EQUAL( p->protectedFrame(), false);
207     BOOST_CHECK_EQUAL( p->order(), false);
208
209     BOOST_CHECK_EQUAL( p->duration(), 0u);
210
211     BOOST_CHECK_EQUAL (p->ctrlFrame().ra()[0], 0x00);
212     BOOST_CHECK_EQUAL (p->ctrlFrame().ra()[3], 0x57);
213     BOOST_CHECK_EQUAL (p->ctrlFrame().ra()[5], 0xb0);
214 }
215
216 /* test parser with creating an ACK frame*/
217 BOOST_AUTO_UNIT_TEST(WLANPacket_ctrlFrame_create)
218 {
219     senf::WLANPacket p (senf::WLANPacket::create()) ;
220 //    std::cout << unsigned( senf::init_bytes<senf::WLANPacketParser_CtrlFrameParser>::value ) << "\n";
221     SENF_CHECK_NO_THROW(p->init_ctrlFrame());
222 //    std::cout << unsigned( senf::init_bytes<senf::WLANPacketParser_CtrlFrameParser>::value ) << "\n";
223     p->ctrlFrame().ra()=senf::MACAddress::from_string("00:1a:4d:3e:c7:5c");
224     p->ctrlFrame().set_ack();
225     BOOST_CHECK_EQUAL( p->type(), 1u);
226     BOOST_CHECK_EQUAL( p->subtype(), 13u);
227 }
228