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 RadiotapPacket unit tests */
28 #include "RadiotapPacket.hh"
30 #include <senf/Utils/auto_unit_test.hh>
31 #include <boost/test/test_tools.hpp>
33 ///////////////////////////////cc.p////////////////////////////////////////
34 SENF_AUTO_UNIT_TEST(RadiotapPacket_packet)
36 /* used madwifi 0.9.4 */
37 unsigned char data[] = {
38 0x00 ,0x00 ,0x1a ,0x00, 0x6f, 0x18, 0x00, 0x00,
39 0x02, 0xe6, 0x8a, 0xdf, 0x12, 0x00, 0x00, 0x00,
40 0x12, 0x0c, 0xc8, 0x14, 0x40, 0x01, 0xc3, 0xa0,
42 0x00, 0x00, 0x00, 0x00,
44 senf::RadiotapPacket p (senf::RadiotapPacket::create(data));
47 BOOST_CHECK_EQUAL( p->version(), 0u);
48 BOOST_CHECK_EQUAL( p->length(), 26u);
51 BOOST_CHECK_EQUAL( p->tsftPresent(), true);
52 BOOST_CHECK_EQUAL( p->flagsPresent(), true);
53 BOOST_CHECK_EQUAL( p->extendedBitmaskPresent(), false);
54 BOOST_CHECK_EQUAL( p->ratePresent(), true);
55 BOOST_CHECK_EQUAL( p->channelOptionsPresent(), true);
56 BOOST_CHECK_EQUAL( p->fhssPresent(), false);
57 BOOST_CHECK_EQUAL( p->dbmAntennaSignalPresent(), true);
58 BOOST_CHECK_EQUAL( p->dbmAntennaNoisePresent(), true);
59 BOOST_CHECK_EQUAL( p->lockQualityPresent(), false);
60 BOOST_CHECK_EQUAL( p->txAttenuationPresent(), false);
61 BOOST_CHECK_EQUAL( p->dbmTxAttenuationPresent(), false);
62 BOOST_CHECK_EQUAL( p->dbTxAttenuationPresent(), false);
63 BOOST_CHECK_EQUAL( p->antennaPresent(), true);
64 BOOST_CHECK_EQUAL( p->dbAntennaSignalPresent(), true);
65 BOOST_CHECK_EQUAL( p->dbAntennaNoisePresent(), false);
68 BOOST_CHECK_EQUAL( p->tsft(), 81059833346uLL);
69 BOOST_CHECK_EQUAL( p->rate(), 12u);
70 BOOST_CHECK_EQUAL( p->channelOptions().freq(), 5320u);
71 BOOST_CHECK_EQUAL( p->dbmAntennaSignal(), -61);
72 BOOST_CHECK_EQUAL( p->dbmAntennaNoise(), -96);
73 BOOST_CHECK_EQUAL( p->antenna(), 2u);
74 BOOST_CHECK_EQUAL( p->dbAntennaSignal(), 35u);
77 BOOST_CHECK_EQUAL( p->flags().cfp(), false);
78 BOOST_CHECK_EQUAL( p->flags().shortPreamble(), true);
79 BOOST_CHECK_EQUAL( p->flags().wep(), false);
80 BOOST_CHECK_EQUAL( p->flags().fragmentation(), false);
81 BOOST_CHECK_EQUAL( p->flags().fcsAtEnd(), true);
82 BOOST_CHECK_EQUAL( p->flags().padding(), false);
83 BOOST_CHECK_EQUAL( p->flags().badFCS(), false);
84 BOOST_CHECK_EQUAL( p->flags().shortGI(), false);
87 BOOST_CHECK_EQUAL( p->channelOptions().ofdm(), true);
88 BOOST_CHECK_EQUAL( p->channelOptions().turbo(), false);
89 BOOST_CHECK_EQUAL( p->channelOptions().cck(), false);
90 BOOST_CHECK_EQUAL( p->channelOptions().flag5ghz(), true);
91 BOOST_CHECK_EQUAL( p->channelOptions().passive(), false);
92 BOOST_CHECK_EQUAL( p->channelOptions().cckOfdm(), false);
93 BOOST_CHECK_EQUAL( p->channelOptions().gfsk(), false);
94 BOOST_CHECK_EQUAL( p->channelOptions().gsm(), false);
95 BOOST_CHECK_EQUAL( p->channelOptions().staticTurbo(), false);
96 BOOST_CHECK_EQUAL( p->channelOptions().halfRateChannel(), false);
97 BOOST_CHECK_EQUAL( p->channelOptions().quarterRateChannel(), false);
100 std::stringstream ss;
102 BOOST_CHECK_EQUAL( ss.str(),
106 " MAC timestamp : 81059833346\n"
107 " flags : FCSatEnd ShortPreamble \n"
109 " channel frequency : 5320\n"
110 " channel flags : OFDM 5GHz \n"
111 " antenna signal (dBm) : -61\n"
112 " antenna noise (dBm) : -96\n"
114 " antenna signal (dB) : 35\n"
115 " FCS (at end) : 0\n" );
119 SENF_AUTO_UNIT_TEST(RadiotapPacket_create)
121 unsigned char data[] = {
122 0x00 ,0x00 ,0x1a ,0x00, 0x6f, 0x18, 0x00, 0x00,
123 0x02, 0xe6, 0x8a, 0xdf, 0x12, 0x00, 0x00, 0x00,
124 0x02, 0x0c, 0xc8, 0x14, 0x40, 0x01, 0xc3, 0xa0,
128 senf::RadiotapPacket p (senf::RadiotapPacket::create());
130 SENF_CHECK_NO_THROW( p->init_tsft());
131 SENF_CHECK_NO_THROW( p->tsft()=81059833346uLL);
133 SENF_CHECK_NO_THROW( p->init_rate());
134 SENF_CHECK_NO_THROW( p->rate() = 12u);
135 SENF_CHECK_NO_THROW( p->init_dbmAntennaSignal());
136 SENF_CHECK_NO_THROW( p->dbmAntennaSignal() = -61);
137 SENF_CHECK_NO_THROW( p->init_dbmAntennaNoise());
138 SENF_CHECK_NO_THROW( p->dbmAntennaNoise() = -96);
139 SENF_CHECK_NO_THROW( p->init_antenna());
140 SENF_CHECK_NO_THROW( p->antenna() = 2u);
141 SENF_CHECK_NO_THROW( p->init_dbAntennaSignal());
142 SENF_CHECK_NO_THROW( p->dbAntennaSignal() = 35);
144 SENF_CHECK_NO_THROW( p->init_flags());
145 SENF_CHECK_NO_THROW( p->flags().cfp() = false);
146 SENF_CHECK_NO_THROW( p->flags().shortPreamble() = true);
147 SENF_CHECK_NO_THROW( p->flags().wep() = false);
148 SENF_CHECK_NO_THROW( p->flags().fragmentation() = false);
149 // SENF_CHECK_NO_THROW( p->flags().fcsAtEnd() = true);
150 SENF_CHECK_NO_THROW( p->flags().padding() = false);
151 SENF_CHECK_NO_THROW( p->flags().badFCS() = false);
152 SENF_CHECK_NO_THROW( p->flags().shortGI() = false);
154 SENF_CHECK_NO_THROW( p->init_channelOptions());
155 SENF_CHECK_NO_THROW( p->channelOptions().freq() = 5320u)
156 SENF_CHECK_NO_THROW( p->channelOptions().ofdm() = true);
157 SENF_CHECK_NO_THROW( p->channelOptions().turbo() = false);
158 SENF_CHECK_NO_THROW( p->channelOptions().cck() = false);
159 SENF_CHECK_NO_THROW( p->channelOptions().flag5ghz() = true);
160 SENF_CHECK_NO_THROW( p->channelOptions().passive() = false);
161 SENF_CHECK_NO_THROW( p->channelOptions().cckOfdm() = false);
162 SENF_CHECK_NO_THROW( p->channelOptions().gfsk() = false);
163 SENF_CHECK_NO_THROW( p->channelOptions().gsm() = false);
164 SENF_CHECK_NO_THROW( p->channelOptions().staticTurbo() = false);
165 SENF_CHECK_NO_THROW( p->channelOptions().halfRateChannel() = false);
166 SENF_CHECK_NO_THROW( p->channelOptions().quarterRateChannel() = false);
170 BOOST_CHECK_EQUAL( p->length(), 26u );
171 BOOST_CHECK_EQUAL_COLLECTIONS( p.data().begin(), p.data().end(),
172 data, data+sizeof(data)/sizeof(data[0]) );
176 SENF_AUTO_UNIT_TEST(RadiotapPacket_packet_ath9k)
178 /* radiotap packet from ath9k with atheros card*/
179 unsigned char data[] = {
180 0x00, 0x00, 0x20, 0x00, 0x6f, 0x48, 0x00, 0x00,
181 0x87, 0xbb, 0x91, 0x7c, 0x3b, 0x00, 0x00, 0x00,
182 0x00, 0x04, 0x85, 0x09, 0x80, 0x04, 0xb2, 0xa1,
183 0x00, 0x00, 0x00, 0x00, 0xd5, 0x1a, 0xf7, 0x94,
184 0x00, 0x00, 0x00, 0x00,
186 senf::RadiotapPacket p (senf::RadiotapPacket::create(data));
188 /* mandatory fields*/
189 BOOST_CHECK_EQUAL( p->version(), 0u);
190 BOOST_CHECK_EQUAL( p->length(), 32u);
192 BOOST_CHECK_EQUAL( p->dbmAntennaSignal(), -78);
193 BOOST_CHECK_EQUAL( p->dbmAntennaNoise(), -95);
195 // The standard defines this field as RXFlags / TXFLags, so using the
196 // 'official' radiotap parser, this test fails ...
197 // Why is this field parsed using MSB byteorder ??
198 BOOST_CHECK_EQUAL( p->headerFcs(), 0xd51af794);
200 BOOST_CHECK_EQUAL( p->antenna(), 0u);
208 // c-file-style: "senf"
209 // indent-tabs-mode: nil
210 // ispell-local-dictionary: "american"
211 // compile-command: "scons -u test"
212 // comment-column: 40