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:66
struct GNUNET_MessageHeader header
Type is 'GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER'.
#define GNUNET_YES
Definition: gnunet_common.h:77
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().

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 }
#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:66
uint16_t duration
Microseconds to reserve link (duration), 0 by default.
#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.
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 98 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, start, and WLAN_MTU.

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 }
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
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
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: