first steps to transport_api cleanup
[oweals/gnunet.git] / src / transport / plugin_transport_wlan.h
1 /*
2  This file is part of GNUnet
3  (C) 2010, 2011 Christian Grothoff (and other contributing authors)
4
5  GNUnet is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published
7  by the Free Software Foundation; either version 3, or (at your
8  option) any later version.
9
10  GNUnet is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  General Public License for more details.
14
15  You should have received a copy of the GNU General Public License
16  along with GNUnet; see the file COPYING.  If not, write to the
17  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  Boston, MA 02111-1307, USA.
19  */
20
21 /**
22  * @file transport/plugin_transport_wlan.h
23  * @brief header for transport plugin and the helper for wlan
24  * @author David Brodski
25  */
26
27 #ifndef PLUGIN_TRANSPORT_WLAN
28 #define PLUGIN_TRANSPORT_WLAN
29
30 #include <stdint.h>
31 #include "gnunet_common.h"
32
33 /**
34  * Number fo bytes in a mac address.
35  */
36 #define MAC_ADDR_SIZE 6
37
38 struct MacAddress
39 {
40   uint8_t mac[MAC_ADDR_SIZE];
41 };
42
43 struct Wlan_Helper_Control_Message
44 {
45   struct GNUNET_MessageHeader hdr;
46   struct MacAddress mac;
47 };
48
49
50 /**
51  * Header for messages which need fragmentation
52  */
53 struct WlanHeader
54 {
55
56   struct GNUNET_MessageHeader header;
57
58   /**
59    * checksum/error correction
60    */
61   uint32_t crc GNUNET_PACKED;
62
63   /**
64    * To whom are we talking to (set to our identity
65    * if we are still waiting for the welcome message)
66    */
67   struct GNUNET_PeerIdentity target;
68
69   /**
70    *  Where the packet came from
71    */
72   struct GNUNET_PeerIdentity source;
73
74 // followed by payload
75
76 };
77
78 /* Wlan IEEE80211 header default */
79 //Informations (in German) http://www.umtslink.at/content/WLAN_macheader-196.html
80 static const uint8_t u8aIeeeHeader[] = { 0x08, 0x01,    // Frame Control 0x08= 00001000 -> | b1,2 = 0 -> Version 0;
81   //      b3,4 = 10 -> Data; b5-8 = 0 -> Normal Data
82   //        0x01 = 00000001 -> | b1 = 1 to DS; b2 = 0 not from DS;
83   0x00, 0x00,                   // Duration/ID
84   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,   // mac1 - in this case receiver
85   0x13, 0x22, 0x33, 0x44, 0x55, 0x66,   // mac2 - in this case sender
86   0x13, 0x22, 0x33, 0x44, 0x55, 0x66,   // mac3 - in this case bssid
87   0x10, 0x86,                   //Sequence Control
88 };
89
90 // gnunet bssid
91 static const struct MacAddress mac_bssid = {
92   {0x13, 0x22, 0x33, 0x44, 0x55, 0x66}
93 };
94
95 // broadcast mac
96 static const struct MacAddress bc_all_mac = {
97   {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
98 };
99
100 /* this is the template radiotap header we send packets out with */
101
102 static const uint8_t u8aRadiotapHeader[] = { 0x00, 0x00,        // <-- radiotap version
103   0x19, 0x00,                   // <- radiotap header length
104   0x6f, 0x08, 0x00, 0x00,       // <-- bitmap
105   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,       // <-- timestamp
106   0x00,                         // <-- flags (Offset +0x10)
107   0x6c,                         // <-- rate (0ffset +0x11)
108   0x71, 0x09, 0xc0, 0x00,       // <-- channel
109   0xde,                         // <-- antsignal
110   0x00,                         // <-- antnoise
111   0x01,                         // <-- antenna
112 };
113
114 struct Radiotap_Send
115 {
116   /**
117    * wlan send rate
118    */
119   uint8_t rate;
120
121   /**
122    * antenna
123    */
124   uint8_t antenna;
125
126   /**
127    * Transmit power expressed as unitless distance from max power set at factory calibration.
128    * 0 is max power. Monotonically nondecreasing with lower power levels.
129    */
130
131   uint16_t tx_power;
132 };
133
134 // bit field defines for ri_present
135
136 #define has_noise 1
137 #define has_power 2
138 #define has_channel 4
139
140 /**
141  * struct to represent infos gathered form the radiotap fields, see RadiotapHeader for more Infos
142  */
143
144 struct Radiotap_rx
145 {
146   uint32_t ri_present;
147   /**
148    * IEEE80211_RADIOTAP_TSFT
149    */
150   uint64_t ri_mactime;
151   /**
152    * from radiotap
153    * either IEEE80211_RADIOTAP_DBM_ANTSIGNAL
154    * or IEEE80211_RADIOTAP_DB_ANTSIGNAL
155    */
156   int32_t ri_power;
157   /**
158    * either IEEE80211_RADIOTAP_DBM_ANTNOISE
159    * or IEEE80211_RADIOTAP_DB_ANTNOISE
160    */
161   int32_t ri_noise;
162   /**
163    * IEEE80211_RADIOTAP_CHANNEL
164    */
165   uint32_t ri_channel;
166
167   uint32_t ri_freq;
168   /**
169    * IEEE80211_RADIOTAP_RATE * 50000
170    */
171   uint32_t ri_rate;
172   /**
173    * IEEE80211_RADIOTAP_ANTENNA
174    */
175   uint32_t ri_antenna;
176 };
177
178 /**
179  * Radiotap Header
180  */
181 struct RadiotapHeader
182 {
183   /**
184    * radiotap version
185    */
186   u_int8_t version;
187
188   u_int8_t pad_version;
189
190   /**
191    * radiotap header length
192    */
193   uint16_t length GNUNET_PACKED;
194
195   /**
196    * bitmap, fields present
197    */
198   uint32_t bitmap GNUNET_PACKED;
199
200   /**
201    * timestamp
202    */
203   uint64_t timestamp GNUNET_PACKED;
204
205   /**
206    * radiotap flags
207    */
208   uint8_t flags;
209
210   /**
211    * wlan send rate
212    */
213   uint8_t rate;
214
215   // FIXME: unaligned here, is this OK?
216   /**
217    * Wlan channel
218    */
219   uint32_t channel GNUNET_PACKED;
220
221   /**
222    * antsignal
223    */
224   uint8_t antsignal;
225
226   /**
227    * antnoise
228    */
229   uint8_t antnoise;
230
231   /**
232    * antenna
233    */
234   uint8_t antenna;
235 };
236
237 #endif