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 */
27 #include "RadiotapPacket.hh"
29 #include <senf/Utils/auto_unit_test.hh>
30 #include <boost/test/test_tools.hpp>
32 ///////////////////////////////cc.p////////////////////////////////////////
33 SENF_AUTO_UNIT_TEST(RadiotapPacket_packet)
35 /* used madwifi 0.9.4 */
36 unsigned char data[] = {
37 0x00 ,0x00 ,0x1a ,0x00, 0x6f, 0x18, 0x00, 0x00,
38 0x02, 0xe6, 0x8a, 0xdf, 0x12, 0x00, 0x00, 0x00,
39 0x12, 0x0c, 0xc8, 0x14, 0x40, 0x01, 0xc3, 0xa0,
41 0x00, 0x00, 0x00, 0x00,
43 senf::RadiotapPacket p (senf::RadiotapPacket::create(data));
46 BOOST_CHECK_EQUAL( p->version(), 0u);
47 BOOST_CHECK_EQUAL( p->length(), 26u);
50 BOOST_CHECK_EQUAL( p->tsftPresent(), true);
51 BOOST_CHECK_EQUAL( p->flagsPresent(), true);
52 BOOST_CHECK_EQUAL( p->extendedBitmaskPresent(), false);
53 BOOST_CHECK_EQUAL( p->ratePresent(), true);
54 BOOST_CHECK_EQUAL( p->channelOptionsPresent(), true);
55 BOOST_CHECK_EQUAL( p->fhssPresent(), false);
56 BOOST_CHECK_EQUAL( p->dbmAntennaSignalPresent(), true);
57 BOOST_CHECK_EQUAL( p->dbmAntennaNoisePresent(), true);
58 BOOST_CHECK_EQUAL( p->lockQualityPresent(), false);
59 BOOST_CHECK_EQUAL( p->txAttenuationPresent(), false);
60 BOOST_CHECK_EQUAL( p->dbmTxAttenuationPresent(), false);
61 BOOST_CHECK_EQUAL( p->dbTxAttenuationPresent(), false);
62 BOOST_CHECK_EQUAL( p->antennaPresent(), true);
63 BOOST_CHECK_EQUAL( p->dbAntennaSignalPresent(), true);
64 BOOST_CHECK_EQUAL( p->dbAntennaNoisePresent(), false);
67 BOOST_CHECK_EQUAL( p->tsft(), 81059833346uLL);
68 BOOST_CHECK_EQUAL( p->rate(), 12u);
69 BOOST_CHECK_EQUAL( p->channelOptions().freq(), 5320u);
70 BOOST_CHECK_EQUAL( p->dbmAntennaSignal(), -61);
71 BOOST_CHECK_EQUAL( p->dbmAntennaNoise(), -96);
72 BOOST_CHECK_EQUAL( p->antenna(), 2u);
73 BOOST_CHECK_EQUAL( p->dbAntennaSignal(), 35u);
76 BOOST_CHECK_EQUAL( p->flags().cfp(), false);
77 BOOST_CHECK_EQUAL( p->flags().shortPreamble(), true);
78 BOOST_CHECK_EQUAL( p->flags().wep(), false);
79 BOOST_CHECK_EQUAL( p->flags().fragmentation(), false);
80 BOOST_CHECK_EQUAL( p->flags().fcsAtEnd(), true);
81 BOOST_CHECK_EQUAL( p->flags().padding(), false);
82 BOOST_CHECK_EQUAL( p->flags().badFCS(), false);
83 BOOST_CHECK_EQUAL( p->flags().shortGI(), false);
86 BOOST_CHECK_EQUAL( p->channelOptions().ofdm(), true);
87 BOOST_CHECK_EQUAL( p->channelOptions().turbo(), false);
88 BOOST_CHECK_EQUAL( p->channelOptions().cck(), false);
89 BOOST_CHECK_EQUAL( p->channelOptions().flag5ghz(), true);
90 BOOST_CHECK_EQUAL( p->channelOptions().passive(), false);
91 BOOST_CHECK_EQUAL( p->channelOptions().cckOfdm(), false);
92 BOOST_CHECK_EQUAL( p->channelOptions().gfsk(), false);
93 BOOST_CHECK_EQUAL( p->channelOptions().gsm(), false);
94 BOOST_CHECK_EQUAL( p->channelOptions().staticTurbo(), false);
95 BOOST_CHECK_EQUAL( p->channelOptions().halfRateChannel(), false);
96 BOOST_CHECK_EQUAL( p->channelOptions().quarterRateChannel(), false);
98 std::ostringstream oss (std::ostringstream::out);
99 SENF_CHECK_NO_THROW( p.dump( oss));
103 SENF_AUTO_UNIT_TEST(RadiotapPacket_create)
105 unsigned char data[] = {
106 0x00 ,0x00 ,0x1a ,0x00, 0x6f, 0x18, 0x00, 0x00,
107 0x02, 0xe6, 0x8a, 0xdf, 0x12, 0x00, 0x00, 0x00,
108 0x02, 0x0c, 0xc8, 0x14, 0x40, 0x01, 0xc3, 0xa0,
112 senf::RadiotapPacket p (senf::RadiotapPacket::create());
114 SENF_CHECK_NO_THROW( p->init_tsft());
115 SENF_CHECK_NO_THROW( p->tsft()=81059833346uLL);
117 SENF_CHECK_NO_THROW( p->init_rate());
118 SENF_CHECK_NO_THROW( p->rate() = 12u);
119 SENF_CHECK_NO_THROW( p->init_dbmAntennaSignal());
120 SENF_CHECK_NO_THROW( p->dbmAntennaSignal() = -61);
121 SENF_CHECK_NO_THROW( p->init_dbmAntennaNoise());
122 SENF_CHECK_NO_THROW( p->dbmAntennaNoise() = -96);
123 SENF_CHECK_NO_THROW( p->init_antenna());
124 SENF_CHECK_NO_THROW( p->antenna() = 2u);
125 SENF_CHECK_NO_THROW( p->init_dbAntennaSignal());
126 SENF_CHECK_NO_THROW( p->dbAntennaSignal() = 35);
128 SENF_CHECK_NO_THROW( p->init_flags());
129 SENF_CHECK_NO_THROW( p->flags().cfp() = false);
130 SENF_CHECK_NO_THROW( p->flags().shortPreamble() = true);
131 SENF_CHECK_NO_THROW( p->flags().wep() = false);
132 SENF_CHECK_NO_THROW( p->flags().fragmentation() = false);
133 // SENF_CHECK_NO_THROW( p->flags().fcsAtEnd() = true);
134 SENF_CHECK_NO_THROW( p->flags().padding() = false);
135 SENF_CHECK_NO_THROW( p->flags().badFCS() = false);
136 SENF_CHECK_NO_THROW( p->flags().shortGI() = false);
138 SENF_CHECK_NO_THROW( p->init_channelOptions());
139 SENF_CHECK_NO_THROW( p->channelOptions().freq() = 5320u)
140 SENF_CHECK_NO_THROW( p->channelOptions().ofdm() = true);
141 SENF_CHECK_NO_THROW( p->channelOptions().turbo() = false);
142 SENF_CHECK_NO_THROW( p->channelOptions().cck() = false);
143 SENF_CHECK_NO_THROW( p->channelOptions().flag5ghz() = true);
144 SENF_CHECK_NO_THROW( p->channelOptions().passive() = false);
145 SENF_CHECK_NO_THROW( p->channelOptions().cckOfdm() = false);
146 SENF_CHECK_NO_THROW( p->channelOptions().gfsk() = false);
147 SENF_CHECK_NO_THROW( p->channelOptions().gsm() = false);
148 SENF_CHECK_NO_THROW( p->channelOptions().staticTurbo() = false);
149 SENF_CHECK_NO_THROW( p->channelOptions().halfRateChannel() = false);
150 SENF_CHECK_NO_THROW( p->channelOptions().quarterRateChannel() = false);
154 BOOST_CHECK_EQUAL( p->length(), 26u );
155 BOOST_CHECK_EQUAL_COLLECTIONS( p.data().begin(), p.data().end(),
156 data, data+sizeof(data)/sizeof(data[0]) );
160 SENF_AUTO_UNIT_TEST(RadiotapPacket_packet_ath9k)
162 /* radiotap packet from ath9k with atheros card*/
163 unsigned char data[] = {
164 0x00, 0x00, 0x20, 0x00, 0x6f, 0x48, 0x00, 0x00,
165 0x87, 0xbb, 0x91, 0x7c, 0x3b, 0x00, 0x00, 0x00,
166 0x00, 0x04, 0x85, 0x09, 0x80, 0x04, 0xb2, 0xa1,
167 0x00, 0x00, 0x00, 0x00, 0xd5, 0x1a, 0xf7, 0x94,
168 0x00, 0x00, 0x00, 0x00,
170 senf::RadiotapPacket p (senf::RadiotapPacket::create(data));
172 /* mandatory fields*/
173 BOOST_CHECK_EQUAL( p->version(), 0u);
174 BOOST_CHECK_EQUAL( p->length(), 32u);
176 BOOST_CHECK_EQUAL( p->dbmAntennaSignal(), -78);
177 BOOST_CHECK_EQUAL( p->dbmAntennaNoise(), -95);
179 // The standard defines this field as RXFlags / TXFLags, so using the
180 // 'official' radiotap parser, this test fails ...
181 // Why is this field parsed using MSB byteorder ??
182 BOOST_CHECK_EQUAL( p->headerFcs(), 0xd51af794);
184 BOOST_CHECK_EQUAL( p->antenna(), 0u);
192 // c-file-style: "senf"
193 // indent-tabs-mode: nil
194 // ispell-local-dictionary: "american"
195 // compile-command: "scons -u test"
196 // comment-column: 40