GNUnet  0.20.0
gnunet-transport-wlan-sender.c File Reference

program to send via WLAN as much as possible (to test physical/theoretical throughput) More...

#include "platform.h"
#include "plugin_transport_wlan.h"
#include "gnunet_protocols.h"
Include dependency graph for gnunet-transport-wlan-sender.c:

Go to the source code of this file.

Macros

#define WLAN_MTU   1500
 
#define WLAN_LLC_DSAP_FIELD   0x1f
 LLC fields for better compatibility. More...
 
#define WLAN_LLC_SSAP_FIELD   0x1f
 
#define IEEE80211_ADDR_LEN   6 /* size of 802.11 address */
 
#define IEEE80211_FC0_VERSION_MASK   0x03
 
#define IEEE80211_FC0_VERSION_SHIFT   0
 
#define IEEE80211_FC0_VERSION_0   0x00
 
#define IEEE80211_FC0_TYPE_MASK   0x0c
 
#define IEEE80211_FC0_TYPE_SHIFT   2
 
#define IEEE80211_FC0_TYPE_MGT   0x00
 
#define IEEE80211_FC0_TYPE_CTL   0x04
 
#define IEEE80211_FC0_TYPE_DATA   0x08
 

Functions

static int getRadiotapHeader (struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *header, uint16_t size)
 function to fill the radiotap header More...
 
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 More...
 
int main (int argc, char *argv[])
 

Detailed Description

program to send via WLAN as much as possible (to test physical/theoretical throughput)

Author
David Brodski

Definition in file gnunet-transport-wlan-sender.c.

Macro Definition Documentation

◆ WLAN_MTU

#define WLAN_MTU   1500

Definition at line 30 of file gnunet-transport-wlan-sender.c.

◆ WLAN_LLC_DSAP_FIELD

#define WLAN_LLC_DSAP_FIELD   0x1f

LLC fields for better compatibility.

Definition at line 35 of file gnunet-transport-wlan-sender.c.

◆ WLAN_LLC_SSAP_FIELD

#define WLAN_LLC_SSAP_FIELD   0x1f

Definition at line 36 of file gnunet-transport-wlan-sender.c.

◆ IEEE80211_ADDR_LEN

#define IEEE80211_ADDR_LEN   6 /* size of 802.11 address */

Definition at line 38 of file gnunet-transport-wlan-sender.c.

◆ IEEE80211_FC0_VERSION_MASK

#define IEEE80211_FC0_VERSION_MASK   0x03

Definition at line 40 of file gnunet-transport-wlan-sender.c.

◆ IEEE80211_FC0_VERSION_SHIFT

#define IEEE80211_FC0_VERSION_SHIFT   0

Definition at line 41 of file gnunet-transport-wlan-sender.c.

◆ IEEE80211_FC0_VERSION_0

#define IEEE80211_FC0_VERSION_0   0x00

Definition at line 42 of file gnunet-transport-wlan-sender.c.

◆ IEEE80211_FC0_TYPE_MASK

#define IEEE80211_FC0_TYPE_MASK   0x0c

Definition at line 43 of file gnunet-transport-wlan-sender.c.

◆ IEEE80211_FC0_TYPE_SHIFT

#define IEEE80211_FC0_TYPE_SHIFT   2

Definition at line 44 of file gnunet-transport-wlan-sender.c.

◆ IEEE80211_FC0_TYPE_MGT

#define IEEE80211_FC0_TYPE_MGT   0x00

Definition at line 45 of file gnunet-transport-wlan-sender.c.

◆ IEEE80211_FC0_TYPE_CTL

#define IEEE80211_FC0_TYPE_CTL   0x04

Definition at line 46 of file gnunet-transport-wlan-sender.c.

◆ IEEE80211_FC0_TYPE_DATA

#define IEEE80211_FC0_TYPE_DATA   0x08

Definition at line 47 of file gnunet-transport-wlan-sender.c.

Function Documentation

◆ getRadiotapHeader()

static int getRadiotapHeader ( struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage header,
uint16_t  size 
)
static

function to fill the radiotap header

Parameters
headerpointer to the radiotap header
sizetotal message size
Returns
GNUNET_YES at success

Definition at line 57 of file gnunet-transport-wlan-sender.c.

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 }
@ 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
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.
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'.
uint8_t antenna
Antenna; the first antenna is 0.

References GNUNET_TRANSPORT_WLAN_RadiotapSendMessage::antenna, GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER, GNUNET_YES, GNUNET_TRANSPORT_WLAN_RadiotapSendMessage::header, GNUNET_TRANSPORT_WLAN_RadiotapSendMessage::rate, GNUNET_MessageHeader::size, size, GNUNET_TRANSPORT_WLAN_RadiotapSendMessage::tx_power, and GNUNET_MessageHeader::type.

Referenced by main().

Here is the caller graph for this function:

◆ getWlanHeader()

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 
)
static

function to generate the wlan hardware header for one packet

Parameters
Headeraddress to write the header to
to_mac_addrpointer to the address of the recipient
macpointer to the mac address to send from (normally overwritten over by helper)
sizesize of the whole packet, needed to calculate the time to send the packet
Returns
GNUNET_YES if there was no error

Definition at line 78 of file gnunet-transport-wlan-sender.c.

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 }
#define WLAN_LLC_DSAP_FIELD
LLC fields for better compatibility.
#define IEEE80211_FC0_TYPE_DATA
#define WLAN_LLC_SSAP_FIELD
#define GNUNET_htole16(x)
static GNUNET_NETWORK_STRUCT_END const struct GNUNET_TRANSPORT_WLAN_MacAddress mac_bssid_gnunet
GNUnet bssid.
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.

References GNUNET_TRANSPORT_WLAN_Ieee80211Frame::addr1, GNUNET_TRANSPORT_WLAN_Ieee80211Frame::addr2, GNUNET_TRANSPORT_WLAN_Ieee80211Frame::addr3, GNUNET_TRANSPORT_WLAN_Ieee80211Frame::duration, GNUNET_TRANSPORT_WLAN_Ieee80211Frame::frame_control, GNUNET_htole16, GNUNET_YES, IEEE80211_FC0_TYPE_DATA, GNUNET_TRANSPORT_WLAN_Ieee80211Frame::llc, mac_bssid_gnunet, size, WLAN_LLC_DSAP_FIELD, and WLAN_LLC_SSAP_FIELD.

Referenced by main().

Here is the caller graph for this function:

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 99 of file gnunet-transport-wlan-sender.c.

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.
#define WLAN_MTU
static int getRadiotapHeader(struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *header, uint16_t size)
function to fill the radiotap header
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
Message from the plugin to the WLAN helper: send the given message with the given connection paramete...
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...

References GNUNET_TRANSPORT_WLAN_RadiotapSendMessage::frame, getRadiotapHeader(), getWlanHeader(), GNUNET_TRANSPORT_WLAN_HelperControlMessage::mac, GNUNET_TRANSPORT_WLAN_MacAddress::mac, pid, ret, start, and WLAN_MTU.

Here is the call graph for this function: