4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Christian Niephaus <cni@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.
24 \brief WLANPacket unit tests */
27 #include "WLANPacket.hh"
28 #include "../../Packets/Packets.hh"
30 #include "../../Utils/auto_unit_test.hh"
31 #include <boost/test/test_tools.hpp>
33 ///////////////////////////////cc.p////////////////////////////////////////
34 /* test parser with a data frame */
35 BOOST_AUTO_UNIT_TEST(WLANPacket_dataFrame_packet)
37 unsigned char data[] = {
38 0x88, 0x01, 0x00, 0x00, 0x00, 0x1a, //header
39 0x4d, 0x3e, 0xc7, 0x5c, 0x00, 0x0b, 0x6b, 0x57,
40 0x06, 0xb0, 0x00, 0x18, 0x4d, 0x6e, 0x78, 0x48,
41 0x30, 0x00, 0x01, 0x00,
42 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //dummy data
43 0x38, 0x39, 0x30, 0x31 //trailer
46 senf::WLANPacket p (senf::WLANPacket::create(data));
48 BOOST_CHECK_EQUAL( p->version(), 0u );
49 BOOST_CHECK_EQUAL( p->type(), 2u );
50 BOOST_CHECK_EQUAL( p->subtype(), 8u );
51 BOOST_CHECK_EQUAL( p->toDS(), true );
52 BOOST_CHECK_EQUAL( p->fromDS(), false );
53 BOOST_CHECK_EQUAL( p->moreFrag(), false );
54 BOOST_CHECK_EQUAL( p->retry(), false );
55 BOOST_CHECK_EQUAL( p->pwrMgt(), false );
56 BOOST_CHECK_EQUAL( p->moreData(), false );
57 BOOST_CHECK_EQUAL( p->protectedFrame(), false );
58 BOOST_CHECK_EQUAL( p->order(), false );
60 BOOST_CHECK_EQUAL( p->duration(), 0u );
63 p->dataFrame().destinationAddress().value(),
64 senf::MACAddress::from_string("00:18:4d:6e:78:48") );
66 p->dataFrame().sourceAddress().value(),
67 senf::MACAddress::from_string("00:0b:6b:57:06:b0") );
69 p->dataFrame().bssid().value(),
70 senf::MACAddress::from_string("00:1a:4d:3e:c7:5c") );
73 p->dataFrame().bssid().value(),
74 p->dataFrame().receiverAddress().value() );
76 p->dataFrame().transmitterAddress().value(),
77 p->dataFrame().sourceAddress().value() );
79 BOOST_CHECK_EQUAL( p->dataFrame().sequenceNumber(), 3u );
80 BOOST_CHECK_EQUAL( p->dataFrame().fragmentNumber(), 0u );
82 std::ostringstream oss (std::ostringstream::out);
83 SENF_CHECK_NO_THROW( p.dump( oss));
87 /* test parser with creating a data frame*/
88 BOOST_AUTO_UNIT_TEST(WLANPacket_dataFrame_create)
90 senf::WLANPacket p (senf::WLANPacket::create());
92 SENF_CHECK_NO_THROW( p->init_dataFrame() );
93 SENF_CHECK_NO_THROW( p->dataFrame().bssid() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c") );
94 BOOST_CHECK_EQUAL( p->type(), 2u );
98 /* test parser with a beacon frame */
99 BOOST_AUTO_UNIT_TEST(WLANPacket_beaconFrame_packet)
101 unsigned char data[] = {
102 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
103 0xff, 0xff, 0x00, 0x1a, 0x4d, 0x3e, 0xc7, 0x5c,
104 0x00, 0x1a, 0x4d, 0x3e, 0xc7, 0x5c, 0xe0, 0x12,
105 0x38, 0xa0, 0x86, 0x01, 0x00, 0x00, 0x00, 0x00,
106 0x64, 0x00, 0x01, 0x05, 0x00, 0x05, 0x62, 0x6f,
107 0x78, 0x43, 0x31, 0x01, 0x08, 0x8c, 0x12, 0x98,
108 0x24, 0xb0, 0x48, 0x60, 0x6c, 0x03, 0x01, 0x40,
109 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, 0x07, 0x2a,
110 0x4e, 0x41, 0x49, 0x24, 0x01, 0x11, 0x28, 0x01,
111 0x11, 0x2c, 0x01, 0x11, 0x30, 0x01, 0x11, 0x34,
112 0x01, 0x17, 0x38, 0x01, 0x17, 0x3c, 0x01, 0x17,
113 0x40, 0x01, 0x17, 0x95, 0x01, 0x1e, 0x99, 0x01,
114 0x1e, 0x9d, 0x01, 0x1e, 0xa1, 0x01, 0x1e, 0xa5,
115 0x01, 0x1e, 0x20, 0x01, 0x00, 0xdd, 0x18, 0x00,
116 0x50, 0xf2, 0x02, 0x01, 0x01, 0x81, 0x00, 0x02,
117 0xa3, 0x40, 0x00, 0x27, 0xa4, 0x00, 0x00, 0x42,
118 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, 0xa0,
119 0x00, 0xdd, 0x09, 0x00, 0x03, 0x7f, 0x01, 0x01,
120 0x00, 0x24, 0xff, 0x7f, 0x87, 0x07, 0x1f, 0xf5,
123 senf::WLANPacket p (senf::WLANPacket::create(data));
125 BOOST_CHECK_EQUAL( p->version(), 0u );
126 BOOST_CHECK_EQUAL( p->type(), 0u );
127 BOOST_CHECK_EQUAL( p->subtype(), 8u );
128 BOOST_CHECK_EQUAL( p->toDS(), false );
129 BOOST_CHECK_EQUAL( p->fromDS(), false );
130 BOOST_CHECK_EQUAL( p->moreFrag(), false );
131 BOOST_CHECK_EQUAL( p->retry(), false );
132 BOOST_CHECK_EQUAL( p->pwrMgt(), false );
133 BOOST_CHECK_EQUAL( p->moreData(), false );
134 BOOST_CHECK_EQUAL( p->protectedFrame(), false );
135 BOOST_CHECK_EQUAL( p->order(), false );
136 BOOST_CHECK_EQUAL( p->duration(), 0u );
138 BOOST_CHECK_EQUAL( p->is_mgtFrame(), true );
141 p->mgtFrame().destinationAddress().value(),
142 senf::MACAddress::from_string("ff:ff:ff:ff:ff:ff") );
144 p->mgtFrame().sourceAddress().value(),
145 senf::MACAddress::from_string("00:1a:4d:3e:c7:5c") );
147 p->mgtFrame().bssid().value(),
148 senf::MACAddress::from_string("00:1a:4d:3e:c7:5c") );
150 BOOST_CHECK_EQUAL( p->mgtFrame().sequenceNumber(), 302u );
151 BOOST_CHECK_EQUAL( p->mgtFrame().fragmentNumber(), 0u );
153 BOOST_CHECK_EQUAL( p->fcs(), 0x87071ff5 );
157 /* test parser with creating a beacon frame*/
158 BOOST_AUTO_UNIT_TEST(WLANPacket_mgtFrame_create)
160 senf::WLANPacket p (senf::WLANPacket::create());
162 SENF_CHECK_NO_THROW( p->init_mgtFrame() );
164 p->mgtFrame().destinationAddress() = senf::MACAddress::from_string("ff:ff:ff:ff:ff:ff")
167 p->mgtFrame().sourceAddress() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c")
170 p->mgtFrame().bssid() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c")
173 BOOST_CHECK_EQUAL( p->type(), 0u );
177 /* test parser with an ACK frame*/
178 BOOST_AUTO_UNIT_TEST(WLANPacket_ctrlFrame_packet)
180 unsigned char data[] = {
181 0xd4, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x6b, 0x57,
182 0x06, 0xb0, 0x4f, 0xda
185 senf::WLANPacket p (senf::WLANPacket::create(data));
187 BOOST_CHECK_EQUAL( p->version(), 0u );
188 BOOST_CHECK_EQUAL( p->type(), 1u );
189 BOOST_CHECK_EQUAL( p->subtype(), 13u );
190 BOOST_CHECK_EQUAL( p->toDS(), false );
191 BOOST_CHECK_EQUAL( p->fromDS(), false );
192 BOOST_CHECK_EQUAL( p->moreFrag(), false );
193 BOOST_CHECK_EQUAL( p->retry(), false );
194 BOOST_CHECK_EQUAL( p->pwrMgt(), false );
195 BOOST_CHECK_EQUAL( p->moreData(), false );
196 BOOST_CHECK_EQUAL( p->protectedFrame(), false );
197 BOOST_CHECK_EQUAL( p->order(), false );
199 BOOST_CHECK_EQUAL( p->duration(), 0u );
202 p->ctrlFrame().receiverAddress().value(),
203 senf::MACAddress::from_string("00:0b:6b:57:06:b0") );
207 /* test parser with creating an ACK frame*/
208 BOOST_AUTO_UNIT_TEST(WLANPacket_ctrlFrame_create)
210 senf::WLANPacket p (senf::WLANPacket::create()) ;
211 // std::cout << unsigned( senf::init_bytes<senf::WLANPacketParser_CtrlFrameParser>::value ) << "\n";
212 SENF_CHECK_NO_THROW(p->init_ctrlFrame());
213 // std::cout << unsigned( senf::init_bytes<senf::WLANPacketParser_CtrlFrameParser>::value ) << "\n";
214 p->ctrlFrame().receiverAddress() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c");
215 p->ctrlFrame().set_ack();
216 BOOST_CHECK_EQUAL( p->type(), 1u);
217 BOOST_CHECK_EQUAL( p->subtype(), 13u);