GNUnet  0.20.0
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 
68 
77 static int
79  const struct GNUNET_TRANSPORT_WLAN_MacAddress *to_mac_addr,
80  const struct GNUNET_TRANSPORT_WLAN_MacAddress *mac,
81  unsigned int size)
82 {
83  const int rate = 11000000;
84 
85  Header->frame_control = htons (IEEE80211_FC0_TYPE_DATA);
86  Header->addr3 = mac_bssid_gnunet;
87  Header->addr2 = *mac;
88  Header->addr1 = *to_mac_addr;
89  Header->duration = GNUNET_htole16 ((size * 1000000) / rate + 290);
90  Header->llc[0] = WLAN_LLC_DSAP_FIELD;
91  Header->llc[1] = WLAN_LLC_SSAP_FIELD;
92  Header->llc[2] = 0; // FIXME
93  Header->llc[3] = 0; // FIXME
94  return GNUNET_YES;
95 }
96 
97 
98 int
99 main (int argc, char *argv[])
100 {
101  char msg_buf[WLAN_MTU];
103  unsigned int temp[6];
105  struct GNUNET_TRANSPORT_WLAN_MacAddress outmac;
107  unsigned long long count;
108  double bytes_per_s;
109  time_t start;
110  time_t akt;
111  int i;
112  ssize_t ret;
113  pid_t pid;
114  int commpipe[2]; /* This holds the fd for the input & output of the pipe */
115  int macpipe[2]; /* This holds the fd for the input & output of the pipe */
116 
117  if (4 != argc)
118  {
119  fprintf (
120  stderr,
121  "This program must be started with the interface and the targets and source mac as argument.\n");
122  fprintf (stderr,
123  "Usage: interface-name mac-DST mac-SRC\n"
124  "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n");
125  return 1;
126  }
127  if (6 != sscanf (argv[2],
128  "%x-%x-%x-%x-%x-%x",
129  &temp[0],
130  &temp[1],
131  &temp[2],
132  &temp[3],
133  &temp[4],
134  &temp[5]))
135  {
136  fprintf (stderr,
137  "Usage: interface-name mac-DST mac-SRC\n"
138  "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n");
139  return 1;
140  }
141  for (i = 0; i < 6; i++)
142  outmac.mac[i] = temp[i];
143  if (6 != sscanf (argv[3],
144  "%x-%x-%x-%x-%x-%x",
145  &temp[0],
146  &temp[1],
147  &temp[2],
148  &temp[3],
149  &temp[4],
150  &temp[5]))
151  {
152  fprintf (stderr,
153  "Usage: interface-name mac-DST mac-SRC\n"
154  "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n");
155  return 1;
156  }
157  for (i = 0; i < 6; i++)
158  inmac.mac[i] = temp[i];
159 
160 
161  /* Setup communication pipeline first */
162  if (pipe (commpipe))
163  {
164  fprintf (stderr, "Failed to create pipe: %s\n", strerror (errno));
165  exit (1);
166  }
167  if (pipe (macpipe))
168  {
169  fprintf (stderr, "Failed to create pipe: %s\n", strerror (errno));
170  exit (1);
171  }
172 
173  /* Attempt to fork and check for errors */
174  if ((pid = fork ()) == -1)
175  {
176  fprintf (stderr, "Failed to fork: %s\n", strerror (errno));
177  exit (1);
178  }
179  memset (msg_buf, 0x42, sizeof(msg_buf));
180  if (pid)
181  {
182  /* A positive (non-negative) PID indicates the parent process */
183  if (0 != close (commpipe[0])) /* Close unused side of pipe (in side) */
184  fprintf (stderr, "Failed to close fd: %s\n", strerror (errno));
185  setvbuf (stdout,
186  (char *) NULL,
187  _IONBF,
188  0); /* Set non-buffered output on stdout */
189 
190  if (0 != close (macpipe[1]))
191  fprintf (stderr, "Failed to close fd: %s\n", strerror (errno));
192  if (sizeof(hcm) != read (macpipe[0], &hcm, sizeof(hcm)))
193  fprintf (stderr, "Failed to read hcm...\n");
194  fprintf (stderr,
195  "Got MAC %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",
196  hcm.mac.mac[0],
197  hcm.mac.mac[1],
198  hcm.mac.mac[2],
199  hcm.mac.mac[3],
200  hcm.mac.mac[4],
201  hcm.mac.mac[5]);
202  radiotap = (struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *) msg_buf;
203  getRadiotapHeader (radiotap, WLAN_MTU);
204  getWlanHeader (&radiotap->frame, &outmac, &inmac, WLAN_MTU);
205  start = time (NULL);
206  count = 0;
207  while (1)
208  {
209  ret = write (commpipe[1], msg_buf, WLAN_MTU);
210  if (0 > ret)
211  {
212  fprintf (stderr, "write failed: %s\n", strerror (errno));
213  break;
214  }
215  count += ret;
216  akt = time (NULL);
217  if (akt - start > 30)
218  {
219  bytes_per_s = count / (akt - start);
220  bytes_per_s /= 1024;
221  printf ("send %f kbytes/s\n", bytes_per_s);
222  start = akt;
223  count = 0;
224  }
225  }
226  }
227  else
228  {
229  /* A zero PID indicates that this is the child process */
230  (void) close (0);
231  (void) close (1);
232  if (-1 ==
233  dup2 (commpipe[0], 0)) /* Replace stdin with the in side of the pipe */
234  fprintf (stderr, "dup2 failed: %s\n", strerror (errno));
235  if (-1 ==
236  dup2 (macpipe[1], 1)) /* Replace stdout with the out side of the pipe */
237  fprintf (stderr, "dup2 failed: %s\n", strerror (errno));
238  (void) close (commpipe[1]); /* Close unused side of pipe (out side) */
239  (void) close (macpipe[0]); /* Close unused side of pipe (in side) */
240  /* Replace the child fork with a new process */
241  if (execlp ("gnunet-helper-transport-wlan",
242  "gnunet-helper-transport-wlan",
243  argv[1],
244  NULL) == -1)
245  {
246  fprintf (stderr, "Could not start gnunet-helper-transport-wlan!");
247  _exit (1);
248  }
249  }
250  return 0;
251 }
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
static int start
Set if we are to start default services (including ARM).
Definition: gnunet-arm.c:39
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
int main(int argc, char *argv[])
#define WLAN_MTU
#define WLAN_LLC_DSAP_FIELD
LLC fields for better compatibility.
static int getRadiotapHeader(struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *header, uint16_t size)
function to fill the radiotap header
#define IEEE80211_FC0_TYPE_DATA
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
#define WLAN_LLC_SSAP_FIELD
Constants for network protocols.
#define GNUNET_htole16(x)
@ GNUNET_YES
#define GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER
Type of data messages from the plugin to the gnunet-wlan-helper.
static unsigned int size
Size of the "table".
Definition: peer.c:68
header for transport plugin and the helper for wlan
static GNUNET_NETWORK_STRUCT_END const struct GNUNET_TRANSPORT_WLAN_MacAddress mac_bssid_gnunet
GNUnet bssid.
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
struct GNUNET_TRANSPORT_WLAN_MacAddress mac
MAC Address of the local WLAN interface.
generic definitions for IEEE 802.11 frames
uint16_t frame_control
802.11 Frame Control field.
struct GNUNET_TRANSPORT_WLAN_MacAddress addr1
Address 1: destination address in ad-hoc mode or AP, BSSID if station,.
uint16_t duration
Microseconds to reserve link (duration), 0 by default.
u_int8_t llc[4]
Link layer control (LLC).
struct GNUNET_TRANSPORT_WLAN_MacAddress addr3
Address 3: BSSID in ad-hoc mode, Destination if station, source if AP.
struct GNUNET_TRANSPORT_WLAN_MacAddress addr2
Address 2: source address if in ad-hoc-mode or station, BSSID if AP.
Message from the plugin to the WLAN helper: send the given message with the given connection paramete...
uint16_t tx_power
Transmit power expressed as unitless distance from max power set at factory calibration.
struct GNUNET_MessageHeader header
Type is 'GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER'.
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...
uint8_t antenna
Antenna; the first antenna is 0.