GNUnet  0.10.x
gnunet-transport-wlan-sender.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet
3  Copyright (C) 2011 GNUnet e.V.
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your 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  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 
26 #include "platform.h"
27 #include "plugin_transport_wlan.h"
28 #include "gnunet_protocols.h"
29 
30 #define WLAN_MTU 1500
31 
35 #define WLAN_LLC_DSAP_FIELD 0x1f
36 #define WLAN_LLC_SSAP_FIELD 0x1f
37 
38 #define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */
39 
40 #define IEEE80211_FC0_VERSION_MASK 0x03
41 #define IEEE80211_FC0_VERSION_SHIFT 0
42 #define IEEE80211_FC0_VERSION_0 0x00
43 #define IEEE80211_FC0_TYPE_MASK 0x0c
44 #define IEEE80211_FC0_TYPE_SHIFT 2
45 #define IEEE80211_FC0_TYPE_MGT 0x00
46 #define IEEE80211_FC0_TYPE_CTL 0x04
47 #define IEEE80211_FC0_TYPE_DATA 0x08
48 
49 
56 static int
58  uint16_t size)
59 {
60  header->header.size = htons(size);
62  header->rate = 255;
63  header->tx_power = 0;
64  header->antenna = 0;
65  return GNUNET_YES;
66 }
67 
76 static int
78  const struct GNUNET_TRANSPORT_WLAN_MacAddress *to_mac_addr,
79  const struct GNUNET_TRANSPORT_WLAN_MacAddress *mac,
80  unsigned int size)
81 {
82  const int rate = 11000000;
83 
84  Header->frame_control = htons(IEEE80211_FC0_TYPE_DATA);
85  Header->addr3 = mac_bssid_gnunet;
86  Header->addr2 = *mac;
87  Header->addr1 = *to_mac_addr;
88  Header->duration = GNUNET_htole16((size * 1000000) / rate + 290);
89  Header->llc[0] = WLAN_LLC_DSAP_FIELD;
90  Header->llc[1] = WLAN_LLC_SSAP_FIELD;
91  Header->llc[2] = 0; // FIXME
92  Header->llc[3] = 0; // FIXME
93  return GNUNET_YES;
94 }
95 
96 
97 int
98 main(int argc, char *argv[])
99 {
100  char msg_buf[WLAN_MTU];
102  unsigned int temp[6];
104  struct GNUNET_TRANSPORT_WLAN_MacAddress outmac;
106  unsigned long long count;
107  double bytes_per_s;
108  time_t start;
109  time_t akt;
110  int i;
111  ssize_t ret;
112  pid_t pid;
113  int commpipe[2]; /* This holds the fd for the input & output of the pipe */
114  int macpipe[2]; /* This holds the fd for the input & output of the pipe */
115 
116  if (4 != argc)
117  {
118  fprintf(
119  stderr,
120  "This program must be started with the interface and the targets and source mac as argument.\n");
121  fprintf(stderr,
122  "Usage: interface-name mac-DST mac-SRC\n"
123  "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n");
124  return 1;
125  }
126  if (6 != sscanf(argv[2],
127  "%x-%x-%x-%x-%x-%x",
128  &temp[0],
129  &temp[1],
130  &temp[2],
131  &temp[3],
132  &temp[4],
133  &temp[5]))
134  {
135  fprintf(stderr,
136  "Usage: interface-name mac-DST mac-SRC\n"
137  "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n");
138  return 1;
139  }
140  for (i = 0; i < 6; i++)
141  outmac.mac[i] = temp[i];
142  if (6 != sscanf(argv[3],
143  "%x-%x-%x-%x-%x-%x",
144  &temp[0],
145  &temp[1],
146  &temp[2],
147  &temp[3],
148  &temp[4],
149  &temp[5]))
150  {
151  fprintf(stderr,
152  "Usage: interface-name mac-DST mac-SRC\n"
153  "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n");
154  return 1;
155  }
156  for (i = 0; i < 6; i++)
157  inmac.mac[i] = temp[i];
158 
159 
160  /* Setup communication pipeline first */
161  if (pipe(commpipe))
162  {
163  fprintf(stderr, "Failed to create pipe: %s\n", strerror(errno));
164  exit(1);
165  }
166  if (pipe(macpipe))
167  {
168  fprintf(stderr, "Failed to create pipe: %s\n", strerror(errno));
169  exit(1);
170  }
171 
172  /* Attempt to fork and check for errors */
173  if ((pid = fork()) == -1)
174  {
175  fprintf(stderr, "Failed to fork: %s\n", strerror(errno));
176  exit(1);
177  }
178  memset(msg_buf, 0x42, sizeof(msg_buf));
179  if (pid)
180  {
181  /* A positive (non-negative) PID indicates the parent process */
182  if (0 != close(commpipe[0])) /* Close unused side of pipe (in side) */
183  fprintf(stderr, "Failed to close fd: %s\n", strerror(errno));
184  setvbuf(stdout,
185  (char *)NULL,
186  _IONBF,
187  0); /* Set non-buffered output on stdout */
188 
189  if (0 != close(macpipe[1]))
190  fprintf(stderr, "Failed to close fd: %s\n", strerror(errno));
191  if (sizeof(hcm) != read(macpipe[0], &hcm, sizeof(hcm)))
192  fprintf(stderr, "Failed to read hcm...\n");
193  fprintf(stderr,
194  "Got MAC %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",
195  hcm.mac.mac[0],
196  hcm.mac.mac[1],
197  hcm.mac.mac[2],
198  hcm.mac.mac[3],
199  hcm.mac.mac[4],
200  hcm.mac.mac[5]);
201  radiotap = (struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *)msg_buf;
202  getRadiotapHeader(radiotap, WLAN_MTU);
203  getWlanHeader(&radiotap->frame, &outmac, &inmac, WLAN_MTU);
204  start = time(NULL);
205  count = 0;
206  while (1)
207  {
208  ret = write(commpipe[1], msg_buf, WLAN_MTU);
209  if (0 > ret)
210  {
211  fprintf(stderr, "write failed: %s\n", strerror(errno));
212  break;
213  }
214  count += ret;
215  akt = time(NULL);
216  if (akt - start > 30)
217  {
218  bytes_per_s = count / (akt - start);
219  bytes_per_s /= 1024;
220  printf("send %f kbytes/s\n", bytes_per_s);
221  start = akt;
222  count = 0;
223  }
224  }
225  }
226  else
227  {
228  /* A zero PID indicates that this is the child process */
229  (void)close(0);
230  (void)close(1);
231  if (-1 ==
232  dup2(commpipe[0], 0)) /* Replace stdin with the in side of the pipe */
233  fprintf(stderr, "dup2 failed: %s\n", strerror(errno));
234  if (-1 ==
235  dup2(macpipe[1], 1)) /* Replace stdout with the out side of the pipe */
236  fprintf(stderr, "dup2 failed: %s\n", strerror(errno));
237  (void)close(commpipe[1]); /* Close unused side of pipe (out side) */
238  (void)close(macpipe[0]); /* Close unused side of pipe (in side) */
239  /* Replace the child fork with a new process */
240  if (execlp("gnunet-helper-transport-wlan",
241  "gnunet-helper-transport-wlan",
242  argv[1],
243  NULL) == -1)
244  {
245  fprintf(stderr, "Could not start gnunet-helper-transport-wlan!");
246  _exit(1);
247  }
248  }
249  return 0;
250 }
#define WLAN_LLC_DSAP_FIELD
LLC fields for better compatibility.
uint8_t antenna
Antenna; the first antenna is 0.
static int start
Set if we are to start default services (including ARM).
Definition: gnunet-arm.c:39
static int getRadiotapHeader(struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *header, uint16_t size)
function to fill the radiotap header
u_int8_t llc[4]
Link layer control (LLC).
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define IEEE80211_FC0_TYPE_DATA
static int ret
Final status code.
Definition: gnunet-arm.c:89
Format of a WLAN Control Message.
struct GNUNET_TRANSPORT_WLAN_MacAddress mac
MAC Address of the local WLAN interface.
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
int main(int argc, char *argv[])
#define WLAN_LLC_SSAP_FIELD
static GNUNET_NETWORK_STRUCT_END const struct GNUNET_TRANSPORT_WLAN_MacAddress mac_bssid_gnunet
GNUnet bssid.
struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame frame
IEEE Frame to transmit (the sender MAC address will be overwritten by the helper as it does not trust...
#define GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER
Type of data messages from the plugin to the gnunet-wlan-helper.
#define GNUNET_htole16(x)
uint16_t frame_control
802.11 Frame Control field.
static unsigned int size
Size of the "table".
Definition: peer.c:66
#define WLAN_MTU
struct GNUNET_MessageHeader header
Type is &#39;GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER&#39;.
uint16_t duration
Microseconds to reserve link (duration), 0 by default.
generic definitions for IEEE 802.11 frames
static int getWlanHeader(struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *Header, const struct GNUNET_TRANSPORT_WLAN_MacAddress *to_mac_addr, const struct GNUNET_TRANSPORT_WLAN_MacAddress *mac, unsigned int size)
function to generate the wlan hardware header for one packet
header for transport plugin and the helper for wlan
#define GNUNET_YES
Definition: gnunet_common.h:77
struct GNUNET_TRANSPORT_WLAN_MacAddress addr3
Address 3: BSSID in ad-hoc mode, Destination if station, source if AP.
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
Message from the plugin to the WLAN helper: send the given message with the given connection paramete...
struct GNUNET_TRANSPORT_WLAN_MacAddress addr2
Address 2: source address if in ad-hoc-mode or station, BSSID if AP.
struct GNUNET_TRANSPORT_WLAN_MacAddress addr1
Address 1: destination address in ad-hoc mode or AP, BSSID if station,.
uint16_t tx_power
Transmit power expressed as unitless distance from max power set at factory calibration.