GNUnet  0.10.x
Macros | Functions
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.

Referenced by main().

◆ 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.

Referenced by getWlanHeader().

◆ WLAN_LLC_SSAP_FIELD

#define WLAN_LLC_SSAP_FIELD   0x1f

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

Referenced by getWlanHeader().

◆ 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.

Referenced by get_wlan_header(), getWlanHeader(), and mac_set().

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.

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, GNUNET_TRANSPORT_WLAN_RadiotapSendMessage::tx_power, and GNUNET_MessageHeader::type.

Referenced by main().

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 }
uint8_t antenna
Antenna; the first antenna is 0.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
#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:67
struct GNUNET_MessageHeader header
Type is 'GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER'.
#define GNUNET_YES
Definition: gnunet_common.h:80
uint16_t tx_power
Transmit power expressed as unitless distance from max power set at factory calibration.
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 77 of file gnunet-transport-wlan-sender.c.

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, WLAN_LLC_DSAP_FIELD, and WLAN_LLC_SSAP_FIELD.

Referenced by main().

80 {
81  const int rate = 11000000;
82 
83  Header->frame_control = htons (IEEE80211_FC0_TYPE_DATA);
84  Header->addr3 = mac_bssid_gnunet;
85  Header->addr2 = *mac;
86  Header->addr1 = *to_mac_addr;
87  Header->duration = GNUNET_htole16 ((size * 1000000) / rate + 290);
88  Header->llc[0] = WLAN_LLC_DSAP_FIELD;
89  Header->llc[1] = WLAN_LLC_SSAP_FIELD;
90  Header->llc[2] = 0; // FIXME
91  Header->llc[3] = 0; // FIXME
92  return GNUNET_YES;
93 }
#define WLAN_LLC_DSAP_FIELD
LLC fields for better compatibility.
u_int8_t llc[4]
Link layer control (LLC).
#define IEEE80211_FC0_TYPE_DATA
#define WLAN_LLC_SSAP_FIELD
static GNUNET_NETWORK_STRUCT_END const struct GNUNET_TRANSPORT_WLAN_MacAddress mac_bssid_gnunet
GNUnet bssid.
#define GNUNET_htole16(x)
uint16_t frame_control
802.11 Frame Control field.
static unsigned int size
Size of the "table".
Definition: peer.c:67
uint16_t duration
Microseconds to reserve link (duration), 0 by default.
#define GNUNET_YES
Definition: gnunet_common.h:80
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.
struct GNUNET_TRANSPORT_WLAN_MacAddress addr1
Address 1: destination address in ad-hoc mode or AP, BSSID if station,.
Here is the caller graph for this function:

◆ main()

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

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

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

98 {
99  char msg_buf[WLAN_MTU];
101  unsigned int temp[6];
103  struct GNUNET_TRANSPORT_WLAN_MacAddress outmac;
105  unsigned long long count;
106  double bytes_per_s;
107  time_t start;
108  time_t akt;
109  int i;
110  ssize_t ret;
111  pid_t pid;
112  int commpipe[2]; /* This holds the fd for the input & output of the pipe */
113  int macpipe[2]; /* This holds the fd for the input & output of the pipe */
114 
115  if (4 != argc)
116  {
117  fprintf (stderr,
118  "This program must be started with the interface and the targets and source mac as argument.\n");
119  fprintf (stderr,
120  "Usage: interface-name mac-DST mac-SRC\n"
121  "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n");
122  return 1;
123  }
124  if (6 !=
125  SSCANF (argv[2], "%x-%x-%x-%x-%x-%x", &temp[0], &temp[1], &temp[2],
126  &temp[3], &temp[4], &temp[5]))
127  {
128  fprintf (stderr,
129  "Usage: interface-name mac-DST mac-SRC\n"
130  "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n");
131  return 1;
132  }
133  for (i = 0; i < 6; i++)
134  outmac.mac[i] = temp[i];
135  if (6 !=
136  SSCANF (argv[3], "%x-%x-%x-%x-%x-%x", &temp[0], &temp[1], &temp[2],
137  &temp[3], &temp[4], &temp[5]))
138  {
139  fprintf (stderr,
140  "Usage: interface-name mac-DST mac-SRC\n"
141  "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n");
142  return 1;
143  }
144  for (i = 0; i < 6; i++)
145  inmac.mac[i] = temp[i];
146 
147 
148  /* Setup communication pipeline first */
149  if (pipe (commpipe))
150  {
151  fprintf (stderr,
152  "Failed to create pipe: %s\n",
153  STRERROR (errno));
154  exit (1);
155  }
156  if (pipe (macpipe))
157  {
158  fprintf (stderr,
159  "Failed to create pipe: %s\n",
160  STRERROR (errno));
161  exit (1);
162  }
163 
164  /* Attempt to fork and check for errors */
165  if ((pid = fork ()) == -1)
166  {
167  fprintf (stderr, "Failed to fork: %s\n",
168  STRERROR (errno));
169  exit (1);
170  }
171  memset (msg_buf, 0x42, sizeof (msg_buf));
172  if (pid)
173  {
174  /* A positive (non-negative) PID indicates the parent process */
175  if (0 != close (commpipe[0])) /* Close unused side of pipe (in side) */
176  fprintf (stderr,
177  "Failed to close fd: %s\n",
178  strerror (errno));
179  setvbuf (stdout, (char *) NULL, _IONBF, 0); /* Set non-buffered output on stdout */
180 
181  if (0 != close (macpipe[1]))
182  fprintf (stderr,
183  "Failed to close fd: %s\n",
184  strerror (errno));
185  if (sizeof (hcm) != read (macpipe[0], &hcm, sizeof (hcm)))
186  fprintf (stderr,
187  "Failed to read hcm...\n");
188  fprintf (stderr,
189  "Got MAC %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",
190  hcm.mac.mac[0], hcm.mac.mac[1],
191  hcm.mac.mac[2], hcm.mac.mac[3], hcm.mac.mac[4], hcm.mac.mac[5]);
192  radiotap = (struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *) msg_buf;
193  getRadiotapHeader (radiotap, WLAN_MTU);
194  getWlanHeader (&radiotap->frame, &outmac, &inmac,
195  WLAN_MTU);
196  start = time (NULL);
197  count = 0;
198  while (1)
199  {
200  ret = write (commpipe[1], msg_buf, WLAN_MTU);
201  if (0 > ret)
202  {
203  fprintf (stderr, "write failed: %s\n", strerror (errno));
204  break;
205  }
206  count += ret;
207  akt = time (NULL);
208  if (akt - start > 30)
209  {
210  bytes_per_s = count / (akt - start);
211  bytes_per_s /= 1024;
212  printf ("send %f kbytes/s\n", bytes_per_s);
213  start = akt;
214  count = 0;
215  }
216  }
217  }
218  else
219  {
220  /* A zero PID indicates that this is the child process */
221  (void) close (0);
222  (void) close (1);
223  if (-1 == dup2 (commpipe[0], 0)) /* Replace stdin with the in side of the pipe */
224  fprintf (stderr, "dup2 failed: %s\n", strerror (errno));
225  if (-1 == dup2 (macpipe[1], 1)) /* Replace stdout with the out side of the pipe */
226  fprintf (stderr, "dup2 failed: %s\n", strerror (errno));
227  (void) close (commpipe[1]); /* Close unused side of pipe (out side) */
228  (void) close (macpipe[0]); /* Close unused side of pipe (in side) */
229  /* Replace the child fork with a new process */
230  if (execlp
231  ("gnunet-helper-transport-wlan", "gnunet-helper-transport-wlan",
232  argv[1], NULL) == -1)
233  {
234  fprintf (stderr, "Could not start gnunet-helper-transport-wlan!");
235  _exit (1);
236  }
237  }
238  return 0;
239 }
static int start
Set if we are to start default services (including ARM).
Definition: gnunet-arm.c:39
#define STRERROR(i)
Definition: plibc.h:676
static int getRadiotapHeader(struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *header, uint16_t size)
function to fill the radiotap header
static int ret
Final status code.
Definition: gnunet-arm.c:89
Format of a WLAN Control Message.
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 WLAN_MTU
#define SSCANF
Definition: plibc.h:691
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
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...
Here is the call graph for this function: