1 // $Id: main.test.cc 206 2008-08-06 14:20:52Z pug $
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>
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
27 #include "../../Packets/Packets.hh"
28 #include "../../Utils/auto_unit_test.hh"
29 #include <boost/test/test_tools.hpp>
30 #include "WLANPacket.hh"
32 /* test parser with a data frame */
33 BOOST_AUTO_UNIT_TEST(WLANPacket_dataFrame_packet)
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
48 senf::WLANPacket p (senf::WLANPacket::create(data));
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);
62 BOOST_CHECK_EQUAL( p->duration(), 0u);
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 );
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 );
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 );
79 BOOST_CHECK_EQUAL( p->dataFrame().bssid()[3],
80 p->dataFrame().ra()[3]);
82 BOOST_CHECK_EQUAL( p->dataFrame().ta()[3],
83 p->dataFrame().sa()[3]);
85 BOOST_CHECK_EQUAL( p->dataFrame().sequenceNumber(), 3u );
86 BOOST_CHECK_EQUAL( p->dataFrame().fragmentNumber(), 0u );
92 /* test parser with creating a data frame*/
93 BOOST_AUTO_UNIT_TEST(WLANPacket_dataFrame_create)
95 senf::WLANPacket p (senf::WLANPacket::create());
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);
104 /* test parser with a beacon frame */
105 BOOST_AUTO_UNIT_TEST(WLANPacket_beaconFrame_packet)
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,
130 senf::WLANPacket p (senf::WLANPacket::create(data));
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);
144 BOOST_CHECK_EQUAL( p->duration(), 0u);
146 BOOST_CHECK_EQUAL (p->has_mgtFrame(), true);
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 );
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 );
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 );
160 BOOST_CHECK_EQUAL( p->mgtFrame().sequenceNumber(), 302u );
161 BOOST_CHECK_EQUAL( p->mgtFrame().fragmentNumber(), 0u );
164 BOOST_CHECK_EQUAL ( p->fcs(), 0x87071ff5);
168 /* test parser with creating a beacon frame*/
169 BOOST_AUTO_UNIT_TEST(WLANPacket_mgtFrame_create)
171 senf::WLANPacket p (senf::WLANPacket::create());
173 SENF_CHECK_NO_THROW(p->init_mgtFrame());
175 p->mgtFrame().da()=senf::MACAddress::from_string("ff:ff:ff:ff:ff:ff")
178 p->mgtFrame().sa()=senf::MACAddress::from_string("00:1a:4d:3e:c7:5c")
181 p->mgtFrame().bssid()=senf::MACAddress::from_string("00:1a:4d:3e:c7:5c")
184 BOOST_CHECK_EQUAL( p->type(), 0u);
187 /* test parser with an ACK frame*/
188 BOOST_AUTO_UNIT_TEST(WLANPacket_ctrlFrame_packet)
192 unsigned char data[] = {0xd4, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x6b, 0x57,
193 0x06, 0xb0, 0x4f, 0xda};
195 senf::WLANPacket p (senf::WLANPacket::create(data));
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);
209 BOOST_CHECK_EQUAL( p->duration(), 0u);
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);
216 /* test parser with creating an ACK frame*/
217 BOOST_AUTO_UNIT_TEST(WLANPacket_ctrlFrame_create)
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);