Packets/80211Bundle: Read-only radiotap reimplementation
[senf.git] / senf / Packets / 80211Bundle / RadiotapPacket.test.cc
1 // $Id$
2 //
3 // Copyright (C) 2008
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Christian Niephaus <cni@berlios.de>
7 //
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.
12 //
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.
17 //
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.
22
23 /** \file
24     \brief RadiotapPacket unit tests */
25
26 // Custom includes
27 #include "RadiotapPacket.hh"
28
29 #include <senf/Utils/auto_unit_test.hh>
30 #include <boost/test/test_tools.hpp>
31
32 ///////////////////////////////cc.p////////////////////////////////////////
33 SENF_AUTO_UNIT_TEST(RadiotapPacket_packet)
34 {
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,
40             0x02, 0x23,
41             0x00, 0x00, 0x00, 0x00,
42     };
43     senf::RadiotapPacket p (senf::RadiotapPacket::create(data));
44
45     /* mandatory fields*/
46     BOOST_CHECK_EQUAL( p->version(), 0u);
47     BOOST_CHECK_EQUAL( p->length(), 26u);
48
49     /* present flags */
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);
65
66     /* data flieds */
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);
74
75     /* flags */
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);
84
85     /* channel flags */
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);
97
98     std::ostringstream oss (std::ostringstream::out);
99     SENF_CHECK_NO_THROW( p.dump( oss));
100 }
101
102 #if 0
103 SENF_AUTO_UNIT_TEST(RadiotapPacket_create)
104 {
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,
109             0x02, 0x23
110     };
111
112     senf::RadiotapPacket p (senf::RadiotapPacket::create());
113
114     SENF_CHECK_NO_THROW( p->init_tsft());
115     SENF_CHECK_NO_THROW( p->tsft()=81059833346uLL);
116
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);
127
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);
137
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);
151
152     p.finalizeAll();
153
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]) );
157 }
158 #endif
159
160 SENF_AUTO_UNIT_TEST(RadiotapPacket_packet_ath9k)
161 {
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,
169     };
170     senf::RadiotapPacket p (senf::RadiotapPacket::create(data));
171
172     /* mandatory fields*/
173     BOOST_CHECK_EQUAL( p->version(), 0u);
174     BOOST_CHECK_EQUAL( p->length(), 32u);
175
176     BOOST_CHECK_EQUAL( p->dbmAntennaSignal(), -78);
177     BOOST_CHECK_EQUAL( p->dbmAntennaNoise(), -95);
178 #if 0
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);
183 #endif
184     BOOST_CHECK_EQUAL( p->antenna(), 0u);
185 }
186
187
188 \f
189 // Local Variables:
190 // mode: c++
191 // fill-column: 100
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
197 // End: