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.test unit tests */
28 #include "../../Packets/Packets.hh"
29 #include "../../Utils/auto_unit_test.hh"
30 #include <boost/test/test_tools.hpp>
31 #include "WLANPacket.hh"
33 /* test parser with a data frame */
34 BOOST_AUTO_UNIT_TEST(WLANPacket_dataFrame_packet)
36 unsigned char data[] = {
37 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
45 senf::WLANPacket p (senf::WLANPacket::create(data));
47 BOOST_CHECK_EQUAL( p->version(), 0u );
48 BOOST_CHECK_EQUAL( p->type(), 2u );
49 BOOST_CHECK_EQUAL( p->subtype(), 8u );
50 BOOST_CHECK_EQUAL( p->toDS(), true );
51 BOOST_CHECK_EQUAL( p->fromDS(), false );
52 BOOST_CHECK_EQUAL( p->moreFrag(), false );
53 BOOST_CHECK_EQUAL( p->retry(), false );
54 BOOST_CHECK_EQUAL( p->pwrMgt(), false );
55 BOOST_CHECK_EQUAL( p->moreData(), false );
56 BOOST_CHECK_EQUAL( p->protectedFrame(), false );
57 BOOST_CHECK_EQUAL( p->order(), false );
59 BOOST_CHECK_EQUAL( p->duration(), 0u );
62 p->dataFrame().destinationAddress().value(),
63 senf::MACAddress::from_string("00:18:4d:6e:78:48") );
65 p->dataFrame().sourceAddress().value(),
66 senf::MACAddress::from_string("00:0b:6b:57:06:b0") );
68 p->dataFrame().bssid().value(),
69 senf::MACAddress::from_string("00:1a:4d:3e:c7:5c") );
72 p->dataFrame().bssid().value(),
73 p->dataFrame().receiverAddress().value() );
75 p->dataFrame().transmitterAddress().value(),
76 p->dataFrame().sourceAddress().value() );
78 BOOST_CHECK_EQUAL( p->dataFrame().sequenceNumber(), 3u );
79 BOOST_CHECK_EQUAL( p->dataFrame().fragmentNumber(), 0u );
81 std::ostringstream oss (std::ostringstream::out);
82 SENF_CHECK_NO_THROW( p.dump( oss));
86 /* test parser with creating a data frame*/
87 BOOST_AUTO_UNIT_TEST(WLANPacket_dataFrame_create)
89 senf::WLANPacket p (senf::WLANPacket::create());
91 SENF_CHECK_NO_THROW( p->init_dataFrame() );
92 SENF_CHECK_NO_THROW( p->dataFrame().bssid() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c") );
93 BOOST_CHECK_EQUAL( p->type(), 2u );
97 /* test parser with a beacon frame */
98 BOOST_AUTO_UNIT_TEST(WLANPacket_beaconFrame_packet)
100 unsigned char data[] = {
101 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
102 0xff, 0xff, 0x00, 0x1a, 0x4d, 0x3e, 0xc7, 0x5c,
103 0x00, 0x1a, 0x4d, 0x3e, 0xc7, 0x5c, 0xe0, 0x12,
104 0x38, 0xa0, 0x86, 0x01, 0x00, 0x00, 0x00, 0x00,
105 0x64, 0x00, 0x01, 0x05, 0x00, 0x05, 0x62, 0x6f,
106 0x78, 0x43, 0x31, 0x01, 0x08, 0x8c, 0x12, 0x98,
107 0x24, 0xb0, 0x48, 0x60, 0x6c, 0x03, 0x01, 0x40,
108 0x05, 0x04, 0x00, 0x01, 0x00, 0x00, 0x07, 0x2a,
109 0x4e, 0x41, 0x49, 0x24, 0x01, 0x11, 0x28, 0x01,
110 0x11, 0x2c, 0x01, 0x11, 0x30, 0x01, 0x11, 0x34,
111 0x01, 0x17, 0x38, 0x01, 0x17, 0x3c, 0x01, 0x17,
112 0x40, 0x01, 0x17, 0x95, 0x01, 0x1e, 0x99, 0x01,
113 0x1e, 0x9d, 0x01, 0x1e, 0xa1, 0x01, 0x1e, 0xa5,
114 0x01, 0x1e, 0x20, 0x01, 0x00, 0xdd, 0x18, 0x00,
115 0x50, 0xf2, 0x02, 0x01, 0x01, 0x81, 0x00, 0x02,
116 0xa3, 0x40, 0x00, 0x27, 0xa4, 0x00, 0x00, 0x42,
117 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00, 0xa0,
118 0x00, 0xdd, 0x09, 0x00, 0x03, 0x7f, 0x01, 0x01,
119 0x00, 0x24, 0xff, 0x7f, 0x87, 0x07, 0x1f, 0xf5,
122 senf::WLANPacket p (senf::WLANPacket::create(data));
124 BOOST_CHECK_EQUAL( p->version(), 0u );
125 BOOST_CHECK_EQUAL( p->type(), 0u );
126 BOOST_CHECK_EQUAL( p->subtype(), 8u );
127 BOOST_CHECK_EQUAL( p->toDS(), false );
128 BOOST_CHECK_EQUAL( p->fromDS(), false );
129 BOOST_CHECK_EQUAL( p->moreFrag(), false );
130 BOOST_CHECK_EQUAL( p->retry(), false );
131 BOOST_CHECK_EQUAL( p->pwrMgt(), false );
132 BOOST_CHECK_EQUAL( p->moreData(), false );
133 BOOST_CHECK_EQUAL( p->protectedFrame(), false );
134 BOOST_CHECK_EQUAL( p->order(), false );
135 BOOST_CHECK_EQUAL( p->duration(), 0u );
137 BOOST_CHECK_EQUAL( p->is_mgtFrame(), true );
140 p->mgtFrame().destinationAddress().value(),
141 senf::MACAddress::from_string("ff:ff:ff:ff:ff:ff") );
143 p->mgtFrame().sourceAddress().value(),
144 senf::MACAddress::from_string("00:1a:4d:3e:c7:5c") );
146 p->mgtFrame().bssid().value(),
147 senf::MACAddress::from_string("00:1a:4d:3e:c7:5c") );
149 BOOST_CHECK_EQUAL( p->mgtFrame().sequenceNumber(), 302u );
150 BOOST_CHECK_EQUAL( p->mgtFrame().fragmentNumber(), 0u );
152 BOOST_CHECK_EQUAL( p->fcs(), 0x87071ff5 );
156 /* test parser with creating a beacon frame*/
157 BOOST_AUTO_UNIT_TEST(WLANPacket_mgtFrame_create)
159 senf::WLANPacket p (senf::WLANPacket::create());
161 SENF_CHECK_NO_THROW( p->init_mgtFrame() );
163 p->mgtFrame().destinationAddress() = senf::MACAddress::from_string("ff:ff:ff:ff:ff:ff")
166 p->mgtFrame().sourceAddress() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c")
169 p->mgtFrame().bssid() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c")
172 BOOST_CHECK_EQUAL( p->type(), 0u );
176 /* test parser with an ACK frame*/
177 BOOST_AUTO_UNIT_TEST(WLANPacket_ctrlFrame_packet)
179 unsigned char data[] = {
180 0xd4, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x6b, 0x57,
181 0x06, 0xb0, 0x4f, 0xda
184 senf::WLANPacket p (senf::WLANPacket::create(data));
186 BOOST_CHECK_EQUAL( p->version(), 0u );
187 BOOST_CHECK_EQUAL( p->type(), 1u );
188 BOOST_CHECK_EQUAL( p->subtype(), 13u );
189 BOOST_CHECK_EQUAL( p->toDS(), false );
190 BOOST_CHECK_EQUAL( p->fromDS(), false );
191 BOOST_CHECK_EQUAL( p->moreFrag(), false );
192 BOOST_CHECK_EQUAL( p->retry(), false );
193 BOOST_CHECK_EQUAL( p->pwrMgt(), false );
194 BOOST_CHECK_EQUAL( p->moreData(), false );
195 BOOST_CHECK_EQUAL( p->protectedFrame(), false );
196 BOOST_CHECK_EQUAL( p->order(), false );
198 BOOST_CHECK_EQUAL( p->duration(), 0u );
201 p->ctrlFrame().receiverAddress().value(),
202 senf::MACAddress::from_string("00:0b:6b:57:06:b0") );
206 /* test parser with creating an ACK frame*/
207 BOOST_AUTO_UNIT_TEST(WLANPacket_ctrlFrame_create)
209 senf::WLANPacket p (senf::WLANPacket::create()) ;
210 // std::cout << unsigned( senf::init_bytes<senf::WLANPacketParser_CtrlFrameParser>::value ) << "\n";
211 SENF_CHECK_NO_THROW(p->init_ctrlFrame());
212 // std::cout << unsigned( senf::init_bytes<senf::WLANPacketParser_CtrlFrameParser>::value ) << "\n";
213 p->ctrlFrame().receiverAddress() = senf::MACAddress::from_string("00:1a:4d:3e:c7:5c");
214 p->ctrlFrame().set_ack();
215 BOOST_CHECK_EQUAL( p->type(), 1u);
216 BOOST_CHECK_EQUAL( p->subtype(), 13u);