46f8a63e933ffce73d5ecde32d1e60aec1a99ba7
[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 <sstream>
28 #include "RadiotapPacket.hh"
29
30 #include <senf/Utils/auto_unit_test.hh>
31 #include <boost/test/test_tools.hpp>
32
33 ///////////////////////////////cc.p////////////////////////////////////////
34 SENF_AUTO_UNIT_TEST(RadiotapPacket_packet)
35 {
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,
41             0x02, 0x23,
42             0x00, 0x00, 0x00, 0x00,
43     };
44     senf::RadiotapPacket p (senf::RadiotapPacket::create(data));
45
46     /* mandatory fields*/
47     BOOST_CHECK_EQUAL( p->version(), 0u);
48     BOOST_CHECK_EQUAL( p->length(), 26u);
49
50     /* present flags */
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);
66
67     /* data flieds */
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);
75
76     /* flags */
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);
85
86     /* channel flags */
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);
98
99     /* dump */
100     std::stringstream ss;
101     p.dump(ss);
102     BOOST_CHECK_EQUAL( ss.str(),
103                        "Radiotap:\n"
104                        "  version                 : 0\n"
105                        "  length                  : 26\n"
106                        "  MAC timestamp           : 81059833346\n"
107                        "  flags                   : FCSatEnd ShortPreamble \n"
108                        "  rate                    : 12\n"
109                        "  channel frequency       : 5320\n"
110                        "  channel flags           : OFDM 5GHz \n"
111                        "  antenna signal (dBm)    : -61\n"
112                        "  antenna noise (dBm)     : -96\n"
113                        "  antenna                 : 2\n"
114                        "  antenna signal (dB)     : 35\n"
115                        "  FCS (at end)            : 0\n" );
116 }
117
118 #if 0
119 SENF_AUTO_UNIT_TEST(RadiotapPacket_create)
120 {
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,
125             0x02, 0x23
126     };
127
128     senf::RadiotapPacket p (senf::RadiotapPacket::create());
129
130     SENF_CHECK_NO_THROW( p->init_tsft());
131     SENF_CHECK_NO_THROW( p->tsft()=81059833346uLL);
132
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);
143
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);
153
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);
167
168     p.finalizeAll();
169
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]) );
173 }
174 #endif
175
176 SENF_AUTO_UNIT_TEST(RadiotapPacket_packet_ath9k)
177 {
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,
185     };
186     senf::RadiotapPacket p (senf::RadiotapPacket::create(data));
187
188     /* mandatory fields*/
189     BOOST_CHECK_EQUAL( p->version(), 0u);
190     BOOST_CHECK_EQUAL( p->length(), 32u);
191
192     BOOST_CHECK_EQUAL( p->dbmAntennaSignal(), -78);
193     BOOST_CHECK_EQUAL( p->dbmAntennaNoise(), -95);
194 #if 0
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);
199 #endif
200     BOOST_CHECK_EQUAL( p->antenna(), 0u);
201 }
202
203
204 \f
205 // Local Variables:
206 // mode: c++
207 // fill-column: 100
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
213 // End: