GNUnet  0.19.3
gnunet-helper-transport-wlan.c File Reference

mediator between the wlan interface and gnunet; must run as root (SUID will do) This code will work under GNU/Linux only. More...

#include "platform.h"
#include "gnunet_private_config.h"
#include <netpacket/packet.h>
#include <linux/if_ether.h>
#include <linux/wireless.h>
#include "gnunet_protocols.h"
#include "plugin_transport_wlan.h"
Include dependency graph for gnunet-helper-transport-wlan.c:

Go to the source code of this file.

Data Structures

struct  PrismValue
 Values in the 'struct PrismHeader'. More...
 
struct  PrismHeader
 Prism header format ('struct p80211msg' in Linux). More...
 
struct  Ieee80211RadiotapHeader
 Generic header for radiotap messages (receiving and sending). More...
 
struct  RadiotapTransmissionHeader
 Format of the header we need to prepend to messages to be sent to the Kernel. More...
 
struct  Ieee80211RadiotapHeaderIterator
 struct Ieee80211RadiotapHeaderIterator - tracks walk through present radiotap arguments in the radiotap header. More...
 
struct  HardwareInfos
 struct for storing the information of the hardware. More...
 
struct  SendBuffer
 IO buffer used for buffering data in transit (to wireless or to stdout). More...
 
struct  MessageStreamTokenizer
 Handle to a message stream tokenizer. More...
 

Macros

#define ARPHRD_ETHER   1
 Packet format type for the messages we receive from the kernel. More...
 
#define ARPHRD_IEEE80211   801
 Packet format type for the messages we receive from the kernel. More...
 
#define ARPHRD_IEEE80211_PRISM   802
 Packet format type for the messages we receive from the kernel. More...
 
#define ARPHRD_IEEE80211_FULL   803
 Packet format type for the messages we receive from the kernel. More...
 
#define MAXLINE   4096
 Maximum size of a message allowed in either direction (used for our receive and sent buffers). More...
 
#define PRISM_DEVICE_NAME_LENGTH   16
 Device name length in PRISM frames. More...
 
#define PRISM_MSGCODE_MONITOR   0x0041
 Monitor Frame (indicator that we have a 'struct PrismHeader'). More...
 
#define PRISM_DID_MACTIME   0x2041
 Mac time element. More...
 
#define PRISM_DID_CHANNEL   0x3041
 Channel element. More...
 
#define PRISM_DID_SIGNAL   0x6041
 Signal element. More...
 
#define PRISM_DID_NOISE   0x7041
 Noise element. More...
 
#define PRISM_DID_RATE   0x8041
 Rate element, in units/multiples of 500Khz. More...
 
#define PRISM_STATUS_OK   0
 Value is set (supplied) More...
 
#define PRISM_STATUS_NO_VALUE   1
 Value not supplied. More...
 
#define IEEE80211_RADIOTAP_PRESENT_EXTEND_MASK   (1 << IEEE80211_RADIOTAP_EXT)
 Bitmask indicating an extension of the bitmask is used. More...
 
#define IEEE80211_RADIOTAP_F_CFP   0x01
 Bit in IEEE80211_RADIOTAP_FLAGS (which we might get as part of a 'struct Ieee80211RadiotapHeader' extension if the IEEE80211_RADIOTAP_FLAGS bit is set in 'it_present'). More...
 
#define IEEE80211_RADIOTAP_F_SHORTPRE   0x02
 Bit in IEEE80211_RADIOTAP_FLAGS (which we might get as part of a 'struct Ieee80211RadiotapHeader' extension if the IEEE80211_RADIOTAP_FLAGS bit is set in 'it_present'). More...
 
#define IEEE80211_RADIOTAP_F_WEP   0x04
 Bit in IEEE80211_RADIOTAP_FLAGS (which we might get as part of a 'struct Ieee80211RadiotapHeader' extension if the IEEE80211_RADIOTAP_FLAGS bit is set in 'it_present'). More...
 
#define IEEE80211_RADIOTAP_F_FRAG   0x08
 Bit in IEEE80211_RADIOTAP_FLAGS (which we might get as part of a 'struct Ieee80211RadiotapHeader' extension if the IEEE80211_RADIOTAP_FLAGS bit is set in 'it_present'). More...
 
#define IEEE80211_RADIOTAP_F_FCS   0x10
 Bit in IEEE80211_RADIOTAP_FLAGS (which we might get as part of a 'struct Ieee80211RadiotapHeader' extension if the IEEE80211_RADIOTAP_FLAGS bit is set in 'it_present'). More...
 
#define IEEE80211_RADIOTAP_F_DATAPAD   0x20
 Bit in IEEE80211_RADIOTAP_FLAGS (which we might get as part of a 'struct Ieee80211RadiotapHeader' extension if the IEEE80211_RADIOTAP_FLAGS bit is set in 'it_present'). More...
 
#define IEEE80211_RADIOTAP_F_RX_BADFCS   0x0001
 For IEEE80211_RADIOTAP_RX_FLAGS: frame failed crc check. More...
 
#define IEEE80211_RADIOTAP_F_TX_FAIL   0x0001
 For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct RadiotapTransmissionHeader'): failed due to excessive retries. More...
 
#define IEEE80211_RADIOTAP_F_TX_CTS   0x0002
 For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct RadiotapTransmissionHeader'): used cts 'protection'. More...
 
#define IEEE80211_RADIOTAP_F_TX_RTS   0x0004
 For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct RadiotapTransmissionHeader'): used rts/cts handshake. More...
 
#define IEEE80211_RADIOTAP_F_TX_NOACK   0x0008
 For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct RadiotapTransmissionHeader'): frame should not be ACKed. More...
 
#define IEEE80211_RADIOTAP_F_TX_NOSEQ   0x0010
 For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct RadiotapTransmissionHeader'): sequence number handled by userspace. More...
 
#define IEEE80211_RADIOTAP_OUR_TRANSMISSION_HEADER_MASK
 The above 'struct RadiotapTransmissionHeader' should have the following value for 'header.it_present' based on the presence of the 'rate' and 'txflags' in the overall struct. More...
 
#define ALIGN_FACTOR   8
 To what multiple do we align messages? 8 byte should suffice for everyone for now. More...
 
#define MIN_BUFFER_SIZE   sizeof(struct GNUNET_MessageHeader)
 Smallest supported message. More...
 

Typedefs

typedef void(* MessageTokenizerCallback) (void *cls, const struct GNUNET_MessageHeader *message)
 Functions with this signature are called whenever a complete message is received by the tokenizer. More...
 

Enumerations

enum  RadiotapType {
  IEEE80211_RADIOTAP_TSFT = 0 , IEEE80211_RADIOTAP_FLAGS = 1 , IEEE80211_RADIOTAP_RATE = 2 , IEEE80211_RADIOTAP_CHANNEL = 3 ,
  IEEE80211_RADIOTAP_FHSS = 4 , IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5 , IEEE80211_RADIOTAP_DBM_ANTNOISE = 6 , IEEE80211_RADIOTAP_LOCK_QUALITY = 7 ,
  IEEE80211_RADIOTAP_TX_ATTENUATION = 8 , IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9 , IEEE80211_RADIOTAP_DBM_TX_POWER = 10 , IEEE80211_RADIOTAP_ANTENNA = 11 ,
  IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12 , IEEE80211_RADIOTAP_DB_ANTNOISE = 13 , IEEE80211_RADIOTAP_RX_FLAGS = 14 , IEEE80211_RADIOTAP_TX_FLAGS = 15 ,
  IEEE80211_RADIOTAP_RTS_RETRIES = 16 , IEEE80211_RADIOTAP_DATA_RETRIES = 17 , IEEE80211_RADIOTAP_EXT = 31
}
 Bits in the 'it_present' bitmask from the 'struct Ieee80211RadiotapHeader'. More...
 

Functions

struct PrismValue __attribute__ ((packed))
 
static struct MessageStreamTokenizermst_create (MessageTokenizerCallback cb, void *cb_cls)
 Create a message stream tokenizer. More...
 
static int mst_receive (struct MessageStreamTokenizer *mst, const char *buf, size_t size)
 Add incoming data to the receive buffer and call the callback for all complete messages. More...
 
static void mst_destroy (struct MessageStreamTokenizer *mst)
 Destroys a tokenizer. More...
 
static int ieee80211_radiotap_iterator_init (struct Ieee80211RadiotapHeaderIterator *iterator, const struct Ieee80211RadiotapHeader *radiotap_header, size_t max_length)
 Radiotap header iteration. More...
 
static int ieee80211_radiotap_iterator_next (struct Ieee80211RadiotapHeaderIterator *iterator)
 Returns the next radiotap parser iterator arg. More...
 
static unsigned long calc_crc_osdep (const unsigned char *buf, size_t len)
 Calculate crc32, the start of the calculation. More...
 
static int check_crc_buf_osdep (const unsigned char *buf, size_t len)
 Calculate and check crc of the wlan packet. More...
 
static int get_channel_from_frequency (int32_t frequency)
 Return the channel from the frequency (in Mhz) More...
 
static int linux_get_channel (const struct HardwareInfos *dev)
 Get the channel used by our WLAN interface. More...
 
static ssize_t linux_read (struct HardwareInfos *dev, unsigned char *buf, size_t buf_size, struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *ri)
 Read from the raw socket (the wlan card), parse the packet and put the result into the buffer for transmission to 'stdout'. More...
 
static int open_device_raw (struct HardwareInfos *dev)
 Open the wireless network interface for reading/writing. More...
 
static int test_wlan_interface (const char *iface)
 Test if the given interface name really corresponds to a wireless device. More...
 
static int mac_test (const struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *taIeeeHeader, const struct HardwareInfos *dev)
 Test incoming packets mac for being our own. More...
 
static void mac_set (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *taIeeeHeader, const struct HardwareInfos *dev)
 Set the wlan header to sane values to make attacks more difficult. More...
 
static void stdin_send_hw (void *cls, const struct GNUNET_MessageHeader *hdr)
 Process data from the stdin. More...
 
int main (int argc, char *argv[])
 Main function of the helper. More...
 

Variables

uint32_t did
 This has a different ID for each parameter, see PRISM_DID_* constants. More...
 
uint16_t status
 See PRISM_STATUS_*-constants. More...
 
uint16_t len
 length of data (which is always a uint32_t, but presumably this can be used to specify that fewer bytes are used (with values in 'len' from 0-4). More...
 
uint32_t data
 The data value. More...
 
uint32_t msgcode
 We expect this to be a PRISM_MSGCODE_*. More...
 
uint32_t msglen
 The length of the entire header. More...
 
char devname [16]
 Name of the device that captured the packet. More...
 
enum RadiotapType __attribute__
 
static struct SendBuffer write_pout
 Buffer for data read from stdin to be transmitted to the wirless card. More...
 
static struct SendBuffer write_std
 Buffer for data read from the wireless card to be transmitted to stdout. More...
 

Detailed Description

mediator between the wlan interface and gnunet; must run as root (SUID will do) This code will work under GNU/Linux only.

Author
David Brodski
Christian Grothoff

This program will allow receiving and sending traffic from the WLAN interface. It will force traffic to be in 'ad-hoc' mode, use the proper MAC address of the WLAN interface and use a GNUnet-specific SSID (and a GNUnet-specific SNAP header). It only takes a single argument, which is the name of the WLAN interface to use. The program detects if the interface is not a WLAN interface and exits with an error in that case.

Once initialized, the program will first send a 'struct GNUNET_TRANSPORT_WLAN_HelperControlMessage' to 'stdout'. That message contains the MAC address of the WLAN interface. It will then read messages from the WLAN interface and send them together with performance information as 'struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage' messages to 'stdout'. Furthermore, it will read a stream of messages from 'stdin' that have the format from 'struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage'. Those messages will then be sent via the WLAN interface; however, the sender MAC address will be forced to be the correct address from our WLAN card. If 'stdin' closes, receiving from the WLAN interface will continue. If 'stdout' causes a SIGPIPE, the process dies from the signal. Errors cause an error message to be reported to 'stderr', in most cases the process also exits (with status code '1'). The program never terminates normally; it is safe to kill the process with SIGTERM or SIGKILL at any time.

Since it uses RAW sockets, the binary must be installed SUID or run as 'root'. In order to keep the security risk of the resulting SUID binary minimal, the program ONLY opens the RAW socket with root privileges, then drops them and only then starts to process command line arguments. The code also does not link against any shared libraries (except libc) and is strictly minimal (except for checking for errors). The following list of people have reviewed this code and considered it safe since the last modification (if you reviewed it, please have your name added to the list):

  • Christian Grothoff (Apr 3rd 2012)

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

Macro Definition Documentation

◆ ARPHRD_ETHER

#define ARPHRD_ETHER   1

Packet format type for the messages we receive from the kernel.

This is for Ethernet 10Mbps format (no performance information included).

Definition at line 126 of file gnunet-helper-transport-wlan.c.

◆ ARPHRD_IEEE80211

#define ARPHRD_IEEE80211   801

Packet format type for the messages we receive from the kernel.

This is for plain messages (with no performance information included).

Definition at line 134 of file gnunet-helper-transport-wlan.c.

◆ ARPHRD_IEEE80211_PRISM

#define ARPHRD_IEEE80211_PRISM   802

Packet format type for the messages we receive from the kernel.

This is for the PRISM format.

Definition at line 141 of file gnunet-helper-transport-wlan.c.

◆ ARPHRD_IEEE80211_FULL

#define ARPHRD_IEEE80211_FULL   803

Packet format type for the messages we receive from the kernel.

This is for messages with a 'struct Ieee80211RadiotapHeader' (see below).

Definition at line 148 of file gnunet-helper-transport-wlan.c.

◆ MAXLINE

#define MAXLINE   4096

Maximum size of a message allowed in either direction (used for our receive and sent buffers).

Definition at line 155 of file gnunet-helper-transport-wlan.c.

◆ PRISM_DEVICE_NAME_LENGTH

#define PRISM_DEVICE_NAME_LENGTH   16

Device name length in PRISM frames.

(In the kernel, this is "WLAN_DEVNAMELEN_MAX")

Definition at line 164 of file gnunet-helper-transport-wlan.c.

◆ PRISM_MSGCODE_MONITOR

#define PRISM_MSGCODE_MONITOR   0x0041

Monitor Frame (indicator that we have a 'struct PrismHeader').

Definition at line 169 of file gnunet-helper-transport-wlan.c.

◆ PRISM_DID_MACTIME

#define PRISM_DID_MACTIME   0x2041

Mac time element.

In micro-seconds. Drivers appear to use a 64bit counter to hold mactime internal the then fill the prism header with the lower 32 bits

Definition at line 176 of file gnunet-helper-transport-wlan.c.

◆ PRISM_DID_CHANNEL

#define PRISM_DID_CHANNEL   0x3041

Channel element.

Definition at line 181 of file gnunet-helper-transport-wlan.c.

◆ PRISM_DID_SIGNAL

#define PRISM_DID_SIGNAL   0x6041

Signal element.

Should be the signal strength in dbm, some people suggest that instead "100 - (strength in dbm)" is used (to make this a positive integer).

Definition at line 188 of file gnunet-helper-transport-wlan.c.

◆ PRISM_DID_NOISE

#define PRISM_DID_NOISE   0x7041

Noise element.

Definition at line 193 of file gnunet-helper-transport-wlan.c.

◆ PRISM_DID_RATE

#define PRISM_DID_RATE   0x8041

Rate element, in units/multiples of 500Khz.

Definition at line 198 of file gnunet-helper-transport-wlan.c.

◆ PRISM_STATUS_OK

#define PRISM_STATUS_OK   0

Value is set (supplied)

Definition at line 204 of file gnunet-helper-transport-wlan.c.

◆ PRISM_STATUS_NO_VALUE

#define PRISM_STATUS_NO_VALUE   1

Value not supplied.

Definition at line 209 of file gnunet-helper-transport-wlan.c.

◆ IEEE80211_RADIOTAP_PRESENT_EXTEND_MASK

#define IEEE80211_RADIOTAP_PRESENT_EXTEND_MASK   (1 << IEEE80211_RADIOTAP_EXT)

Bitmask indicating an extension of the bitmask is used.

(Mask corresponding to IEEE80211_RADIOTAP_EXT).

Definition at line 443 of file gnunet-helper-transport-wlan.c.

◆ IEEE80211_RADIOTAP_F_CFP

#define IEEE80211_RADIOTAP_F_CFP   0x01

Bit in IEEE80211_RADIOTAP_FLAGS (which we might get as part of a 'struct Ieee80211RadiotapHeader' extension if the IEEE80211_RADIOTAP_FLAGS bit is set in 'it_present').

The radiotap flags are an 8-bit field.

Frame was sent/received during CFP (Contention Free Period)

Definition at line 454 of file gnunet-helper-transport-wlan.c.

◆ IEEE80211_RADIOTAP_F_SHORTPRE

#define IEEE80211_RADIOTAP_F_SHORTPRE   0x02

Bit in IEEE80211_RADIOTAP_FLAGS (which we might get as part of a 'struct Ieee80211RadiotapHeader' extension if the IEEE80211_RADIOTAP_FLAGS bit is set in 'it_present').

The radiotap flags are an 8-bit field.

Frame was sent/received with short preamble

Definition at line 464 of file gnunet-helper-transport-wlan.c.

◆ IEEE80211_RADIOTAP_F_WEP

#define IEEE80211_RADIOTAP_F_WEP   0x04

Bit in IEEE80211_RADIOTAP_FLAGS (which we might get as part of a 'struct Ieee80211RadiotapHeader' extension if the IEEE80211_RADIOTAP_FLAGS bit is set in 'it_present').

The radiotap flags are an 8-bit field.

Frame was sent/received with WEP encryption

Definition at line 474 of file gnunet-helper-transport-wlan.c.

◆ IEEE80211_RADIOTAP_F_FRAG

#define IEEE80211_RADIOTAP_F_FRAG   0x08

Bit in IEEE80211_RADIOTAP_FLAGS (which we might get as part of a 'struct Ieee80211RadiotapHeader' extension if the IEEE80211_RADIOTAP_FLAGS bit is set in 'it_present').

The radiotap flags are an 8-bit field.

Frame was sent/received with fragmentation

Definition at line 484 of file gnunet-helper-transport-wlan.c.

◆ IEEE80211_RADIOTAP_F_FCS

#define IEEE80211_RADIOTAP_F_FCS   0x10

Bit in IEEE80211_RADIOTAP_FLAGS (which we might get as part of a 'struct Ieee80211RadiotapHeader' extension if the IEEE80211_RADIOTAP_FLAGS bit is set in 'it_present').

The radiotap flags are an 8-bit field.

Frame includes FCS (CRC at the end that needs to be removeD).

Definition at line 494 of file gnunet-helper-transport-wlan.c.

◆ IEEE80211_RADIOTAP_F_DATAPAD

#define IEEE80211_RADIOTAP_F_DATAPAD   0x20

Bit in IEEE80211_RADIOTAP_FLAGS (which we might get as part of a 'struct Ieee80211RadiotapHeader' extension if the IEEE80211_RADIOTAP_FLAGS bit is set in 'it_present').

The radiotap flags are an 8-bit field.

Frame has padding between 802.11 header and payload (to 32-bit boundary)

Definition at line 505 of file gnunet-helper-transport-wlan.c.

◆ IEEE80211_RADIOTAP_F_RX_BADFCS

#define IEEE80211_RADIOTAP_F_RX_BADFCS   0x0001

For IEEE80211_RADIOTAP_RX_FLAGS: frame failed crc check.

Definition at line 512 of file gnunet-helper-transport-wlan.c.

◆ IEEE80211_RADIOTAP_F_TX_FAIL

#define IEEE80211_RADIOTAP_F_TX_FAIL   0x0001

For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct RadiotapTransmissionHeader'): failed due to excessive retries.

Definition at line 518 of file gnunet-helper-transport-wlan.c.

◆ IEEE80211_RADIOTAP_F_TX_CTS

#define IEEE80211_RADIOTAP_F_TX_CTS   0x0002

For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct RadiotapTransmissionHeader'): used cts 'protection'.

Definition at line 524 of file gnunet-helper-transport-wlan.c.

◆ IEEE80211_RADIOTAP_F_TX_RTS

#define IEEE80211_RADIOTAP_F_TX_RTS   0x0004

For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct RadiotapTransmissionHeader'): used rts/cts handshake.

Definition at line 530 of file gnunet-helper-transport-wlan.c.

◆ IEEE80211_RADIOTAP_F_TX_NOACK

#define IEEE80211_RADIOTAP_F_TX_NOACK   0x0008

For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct RadiotapTransmissionHeader'): frame should not be ACKed.

Definition at line 536 of file gnunet-helper-transport-wlan.c.

◆ IEEE80211_RADIOTAP_F_TX_NOSEQ

#define IEEE80211_RADIOTAP_F_TX_NOSEQ   0x0010

For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct RadiotapTransmissionHeader'): sequence number handled by userspace.

Definition at line 542 of file gnunet-helper-transport-wlan.c.

◆ IEEE80211_RADIOTAP_OUR_TRANSMISSION_HEADER_MASK

#define IEEE80211_RADIOTAP_OUR_TRANSMISSION_HEADER_MASK
Value:
((1 \
<< \
IEEE80211_RADIOTAP_RATE) \
| (1 \
<< \
@ IEEE80211_RADIOTAP_TX_FLAGS
IEEE80211_RADIOTAP_TX_FLAGS __le16 bitmap.

The above 'struct RadiotapTransmissionHeader' should have the following value for 'header.it_present' based on the presence of the 'rate' and 'txflags' in the overall struct.

Definition at line 623 of file gnunet-helper-transport-wlan.c.

◆ ALIGN_FACTOR

#define ALIGN_FACTOR   8

To what multiple do we align messages? 8 byte should suffice for everyone for now.

Definition at line 755 of file gnunet-helper-transport-wlan.c.

◆ MIN_BUFFER_SIZE

#define MIN_BUFFER_SIZE   sizeof(struct GNUNET_MessageHeader)

Smallest supported message.

Definition at line 760 of file gnunet-helper-transport-wlan.c.

Typedef Documentation

◆ MessageTokenizerCallback

typedef void(* MessageTokenizerCallback) (void *cls, const struct GNUNET_MessageHeader *message)

Functions with this signature are called whenever a complete message is received by the tokenizer.

Parameters
clsclosure
messagethe actual message

Definition at line 770 of file gnunet-helper-transport-wlan.c.

Enumeration Type Documentation

◆ RadiotapType

Bits in the 'it_present' bitmask from the 'struct Ieee80211RadiotapHeader'.

For each value, we give the name, data type, unit and then a description below. Note that the actual size of the extension can be bigger as arguments must be padded so that args of a given length must begin at a boundary of that length. However, note that compound args are allowed (eg, 2 x uint16_t for IEEE80211_RADIOTAP_CHANNEL) so total argument length is not a reliable indicator of alignment requirement. See also 'man 9 ieee80211_radiotap'.

Enumerator
IEEE80211_RADIOTAP_TSFT 

IEEE80211_RADIOTAP_TSFT __le64 microseconds.

 Value in microseconds of the MAC's 64-bit 802.11 Time
 Synchronization Function timer when the first bit of the
 MPDU arrived at the MAC. For received frames, only.
IEEE80211_RADIOTAP_FLAGS 

IEEE80211_RADIOTAP_FLAGS uint8_t bitmap.

 Properties of transmitted and received frames. See flags
 defined below.
IEEE80211_RADIOTAP_RATE 

IEEE80211_RADIOTAP_RATE uint8_t 500kb/s.

 Tx/Rx data rate
IEEE80211_RADIOTAP_CHANNEL 

IEEE80211_RADIOTAP_CHANNEL 2 x __le16 MHz, bitmap.

 Tx/Rx frequency in MHz, followed by flags (see below).
IEEE80211_RADIOTAP_FHSS 

IEEE80211_RADIOTAP_FHSS __le16 see below.

 For frequency-hopping radios, the hop set (first byte)
 and pattern (second byte).
IEEE80211_RADIOTAP_DBM_ANTSIGNAL 

IEEE80211_RADIOTAP_DBM_ANTSIGNAL s8 decibels from one milliwatt (dBm)

RF signal power at the antenna, decibel difference from one milliwatt.

IEEE80211_RADIOTAP_DBM_ANTNOISE 

IEEE80211_RADIOTAP_DBM_ANTNOISE s8 decibels from one milliwatt (dBm)

RF noise power at the antenna, decibel difference from one milliwatt.

IEEE80211_RADIOTAP_LOCK_QUALITY 

IEEE80211_RADIOTAP_LOCK_QUALITY __le16 unitless.

 Quality of Barker code lock. Unitless. Monotonically
 nondecreasing with "better" lock strength. Called "Signal
 Quality" in datasheets.  (Is there a standard way to measure
 this?)
IEEE80211_RADIOTAP_TX_ATTENUATION 

IEEE80211_RADIOTAP_TX_ATTENUATION __le16 unitless.

 Transmit power expressed as unitless distance from max
 power set at factory calibration.  0 is max power.
 Monotonically nondecreasing with lower power levels.
IEEE80211_RADIOTAP_DB_TX_ATTENUATION 

IEEE80211_RADIOTAP_DB_TX_ATTENUATION __le16 decibels (dB)

 Transmit power expressed as decibel distance from max power
 set at factory calibration.  0 is max power.  Monotonically
 nondecreasing with lower power levels.
IEEE80211_RADIOTAP_DBM_TX_POWER 

IEEE80211_RADIOTAP_DBM_TX_POWER s8 decibels from one milliwatt (dBm)

Transmit power expressed as dBm (decibels from a 1 milliwatt reference). This is the absolute power level measured at the antenna port.

IEEE80211_RADIOTAP_ANTENNA 

IEEE80211_RADIOTAP_ANTENNA uint8_t antenna index.

 Unitless indication of the Rx/Tx antenna for this packet.
 The first antenna is antenna 0.
IEEE80211_RADIOTAP_DB_ANTSIGNAL 

IEEE80211_RADIOTAP_DB_ANTSIGNAL uint8_t decibel (dB)

 RF signal power at the antenna, decibel difference from an
 arbitrary, fixed reference.
IEEE80211_RADIOTAP_DB_ANTNOISE 

IEEE80211_RADIOTAP_DB_ANTNOISE uint8_t decibel (dB)

 RF noise power at the antenna, decibel difference from an
 arbitrary, fixed reference point.
IEEE80211_RADIOTAP_RX_FLAGS 

IEEE80211_RADIOTAP_RX_FLAGS __le16 bitmap.

Properties of received frames. See flags defined below.
IEEE80211_RADIOTAP_TX_FLAGS 

IEEE80211_RADIOTAP_TX_FLAGS __le16 bitmap.

Properties of transmitted frames. See flags defined below.
IEEE80211_RADIOTAP_RTS_RETRIES 

IEEE80211_RADIOTAP_RTS_RETRIES uint8_t data.

Number of rts retries a transmitted frame used.
IEEE80211_RADIOTAP_DATA_RETRIES 

IEEE80211_RADIOTAP_DATA_RETRIES uint8_t data.

Number of unicast retries a transmitted frame used.
IEEE80211_RADIOTAP_EXT 

Extension bit, used to indicate that more bits are needed for the bitmask.

Definition at line 284 of file gnunet-helper-transport-wlan.c.

285 {
294 
302 
309 
323 
332 
341 
351 
360 
369 
379 
387 
395 
403 
410 
417 
424 
431 
437 };
@ IEEE80211_RADIOTAP_DB_TX_ATTENUATION
IEEE80211_RADIOTAP_DB_TX_ATTENUATION __le16 decibels (dB)
@ IEEE80211_RADIOTAP_EXT
Extension bit, used to indicate that more bits are needed for the bitmask.
@ IEEE80211_RADIOTAP_DATA_RETRIES
IEEE80211_RADIOTAP_DATA_RETRIES uint8_t data.
@ IEEE80211_RADIOTAP_DBM_TX_POWER
IEEE80211_RADIOTAP_DBM_TX_POWER s8 decibels from one milliwatt (dBm)
@ IEEE80211_RADIOTAP_RTS_RETRIES
IEEE80211_RADIOTAP_RTS_RETRIES uint8_t data.
@ IEEE80211_RADIOTAP_LOCK_QUALITY
IEEE80211_RADIOTAP_LOCK_QUALITY __le16 unitless.
@ IEEE80211_RADIOTAP_CHANNEL
IEEE80211_RADIOTAP_CHANNEL 2 x __le16 MHz, bitmap.
@ IEEE80211_RADIOTAP_FLAGS
IEEE80211_RADIOTAP_FLAGS uint8_t bitmap.
@ IEEE80211_RADIOTAP_TX_ATTENUATION
IEEE80211_RADIOTAP_TX_ATTENUATION __le16 unitless.
@ IEEE80211_RADIOTAP_DB_ANTNOISE
IEEE80211_RADIOTAP_DB_ANTNOISE uint8_t decibel (dB)
@ IEEE80211_RADIOTAP_DB_ANTSIGNAL
IEEE80211_RADIOTAP_DB_ANTSIGNAL uint8_t decibel (dB)
@ IEEE80211_RADIOTAP_TSFT
IEEE80211_RADIOTAP_TSFT __le64 microseconds.
@ IEEE80211_RADIOTAP_RATE
IEEE80211_RADIOTAP_RATE uint8_t 500kb/s.
@ IEEE80211_RADIOTAP_FHSS
IEEE80211_RADIOTAP_FHSS __le16 see below.
@ IEEE80211_RADIOTAP_DBM_ANTNOISE
IEEE80211_RADIOTAP_DBM_ANTNOISE s8 decibels from one milliwatt (dBm)
@ IEEE80211_RADIOTAP_ANTENNA
IEEE80211_RADIOTAP_ANTENNA uint8_t antenna index.
@ IEEE80211_RADIOTAP_DBM_ANTSIGNAL
IEEE80211_RADIOTAP_DBM_ANTSIGNAL s8 decibels from one milliwatt (dBm)
@ IEEE80211_RADIOTAP_RX_FLAGS
IEEE80211_RADIOTAP_RX_FLAGS __le16 bitmap.

Function Documentation

◆ __attribute__()

struct PrismValue __attribute__ ( (packed)  )

◆ mst_create()

static struct MessageStreamTokenizer* mst_create ( MessageTokenizerCallback  cb,
void *  cb_cls 
)
static

Create a message stream tokenizer.

Parameters
cbfunction to call on completed messages
cb_clsclosure for cb
Returns
handle to tokenizer

Definition at line 820 of file gnunet-helper-transport-wlan.c.

822 {
823  struct MessageStreamTokenizer *ret;
824 
825  ret = malloc (sizeof(struct MessageStreamTokenizer));
826  if (NULL == ret)
827  {
828  fprintf (stderr, "Failed to allocate buffer for tokenizer\n");
829  exit (1);
830  }
831  ret->hdr = malloc (MIN_BUFFER_SIZE);
832  if (NULL == ret->hdr)
833  {
834  fprintf (stderr, "Failed to allocate buffer for alignment\n");
835  exit (1);
836  }
837  ret->curr_buf = MIN_BUFFER_SIZE;
838  ret->cb = cb;
839  ret->cb_cls = cb_cls;
840  return ret;
841 }
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
#define MIN_BUFFER_SIZE
Smallest supported message.
Handle to a message stream tokenizer.
MessageTokenizerCallback cb
Function to call on completed messages.

References MessageStreamTokenizer::cb, MessageStreamTokenizer::cb_cls, MIN_BUFFER_SIZE, and ret.

Referenced by main().

Here is the caller graph for this function:

◆ mst_receive()

static int mst_receive ( struct MessageStreamTokenizer mst,
const char *  buf,
size_t  size 
)
static

Add incoming data to the receive buffer and call the callback for all complete messages.

Parameters
msttokenizer to use
bufinput data to add
sizenumber of bytes in buf
Returns
GNUNET_OK if we are done processing (need more data) GNUNET_SYSERR if the data stream is corrupt

Definition at line 855 of file gnunet-helper-transport-wlan.c.

857 {
858  const struct GNUNET_MessageHeader *hdr;
859  size_t delta;
860  uint16_t want;
861  char *ibuf;
862  int need_align;
863  unsigned long offset;
864  int ret;
865 
866  ret = GNUNET_OK;
867  ibuf = (char *) mst->hdr;
868  while (mst->pos > 0)
869  {
870 do_align:
871  if ((mst->curr_buf - mst->off < sizeof(struct GNUNET_MessageHeader)) ||
872  (0 != (mst->off % ALIGN_FACTOR)))
873  {
874  /* need to align or need more space */
875  mst->pos -= mst->off;
876  memmove (ibuf, &ibuf[mst->off], mst->pos);
877  mst->off = 0;
878  }
879  if (mst->pos - mst->off < sizeof(struct GNUNET_MessageHeader))
880  {
881  delta =
882  GNUNET_MIN (sizeof(struct GNUNET_MessageHeader)
883  - (mst->pos - mst->off), size);
884  GNUNET_memcpy (&ibuf[mst->pos], buf, delta);
885  mst->pos += delta;
886  buf += delta;
887  size -= delta;
888  }
889  if (mst->pos - mst->off < sizeof(struct GNUNET_MessageHeader))
890  {
891  return GNUNET_OK;
892  }
893  hdr = (const struct GNUNET_MessageHeader *) &ibuf[mst->off];
894  want = ntohs (hdr->size);
895  if (want < sizeof(struct GNUNET_MessageHeader))
896  {
897  fprintf (stderr,
898  "Received invalid message from stdin\n");
899  exit (1);
900  }
901  if (mst->curr_buf - mst->off < want)
902  {
903  /* need more space */
904  mst->pos -= mst->off;
905  memmove (ibuf, &ibuf[mst->off], mst->pos);
906  mst->off = 0;
907  }
908  if (want > mst->curr_buf)
909  {
910  mst->hdr = realloc (mst->hdr, want);
911  if (NULL == mst->hdr)
912  {
913  fprintf (stderr, "Failed to allocate buffer for alignment\n");
914  exit (1);
915  }
916  ibuf = (char *) mst->hdr;
917  mst->curr_buf = want;
918  }
919  hdr = (const struct GNUNET_MessageHeader *) &ibuf[mst->off];
920  if (mst->pos - mst->off < want)
921  {
922  delta = GNUNET_MIN (want - (mst->pos - mst->off), size);
923  GNUNET_memcpy (&ibuf[mst->pos], buf, delta);
924  mst->pos += delta;
925  buf += delta;
926  size -= delta;
927  }
928  if (mst->pos - mst->off < want)
929  {
930  return GNUNET_OK;
931  }
932  mst->cb (mst->cb_cls, hdr);
933  mst->off += want;
934  if (mst->off == mst->pos)
935  {
936  /* reset to beginning of buffer, it's free right now! */
937  mst->off = 0;
938  mst->pos = 0;
939  }
940  }
941  while (size > 0)
942  {
943  if (size < sizeof(struct GNUNET_MessageHeader))
944  break;
945  offset = (unsigned long) buf;
946  need_align = (0 != offset % ALIGN_FACTOR) ? GNUNET_YES : GNUNET_NO;
947  if (GNUNET_NO == need_align)
948  {
949  /* can try to do zero-copy and process directly from original buffer */
950  hdr = (const struct GNUNET_MessageHeader *) buf;
951  want = ntohs (hdr->size);
952  if (want < sizeof(struct GNUNET_MessageHeader))
953  {
954  fprintf (stderr,
955  "Received invalid message from stdin\n");
956  exit (1);
957  }
958  if (size < want)
959  break; /* or not, buffer incomplete, so copy to private buffer... */
960  mst->cb (mst->cb_cls, hdr);
961  buf += want;
962  size -= want;
963  }
964  else
965  {
966  /* need to copy to private buffer to align;
967  * yes, we go a bit more spaghetti than usual here */
968  goto do_align;
969  }
970  }
971  if (size > 0)
972  {
973  if (size + mst->pos > mst->curr_buf)
974  {
975  mst->hdr = realloc (mst->hdr, size + mst->pos);
976  if (NULL == mst->hdr)
977  {
978  fprintf (stderr, "Failed to allocate buffer for alignment\n");
979  exit (1);
980  }
981  ibuf = (char *) mst->hdr;
982  mst->curr_buf = size + mst->pos;
983  }
984  if (mst->pos + size > mst->curr_buf)
985  {
986  fprintf (stderr,
987  "Assertion failed\n");
988  exit (1);
989  }
990  GNUNET_memcpy (&ibuf[mst->pos], buf, size);
991  mst->pos += size;
992  }
993  return ret;
994 }
static size_t do_align(size_t start_position, size_t end_position)
Given the start and end position of a block of data, return the end position of that data after align...
Definition: fs_directory.c:488
#define ALIGN_FACTOR
To what multiple do we align messages? 8 byte should suffice for everyone for now.
static char buf[2048]
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_MIN(a, b)
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
static unsigned int size
Size of the "table".
Definition: peer.c:68
static struct GNUNET_TIME_Relative delta
Definition: speedup.c:36
Header for all communications.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
struct GNUNET_MessageHeader * hdr
Beginning of the buffer.
size_t curr_buf
Size of the buffer (starting at 'hdr').
size_t pos
How many bytes in buffer are valid right now?
size_t off
How many bytes in buffer have we already processed?

References ALIGN_FACTOR, buf, MessageStreamTokenizer::cb, MessageStreamTokenizer::cb_cls, MessageStreamTokenizer::curr_buf, delta, do_align(), GNUNET_memcpy, GNUNET_MIN, GNUNET_NO, GNUNET_OK, GNUNET_YES, MessageStreamTokenizer::hdr, MessageStreamTokenizer::off, MessageStreamTokenizer::pos, ret, GNUNET_MessageHeader::size, and size.

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ mst_destroy()

static void mst_destroy ( struct MessageStreamTokenizer mst)
static

Destroys a tokenizer.

Parameters
msttokenizer to destroy

Definition at line 1003 of file gnunet-helper-transport-wlan.c.

1004 {
1005  free (mst->hdr);
1006  free (mst);
1007 }

References MessageStreamTokenizer::hdr.

Referenced by main().

Here is the caller graph for this function:

◆ ieee80211_radiotap_iterator_init()

static int ieee80211_radiotap_iterator_init ( struct Ieee80211RadiotapHeaderIterator iterator,
const struct Ieee80211RadiotapHeader radiotap_header,
size_t  max_length 
)
static

Radiotap header iteration.

call __ieee80211_radiotap_iterator_init() to init a semi-opaque iterator struct Ieee80211RadiotapHeaderIterator (no need to init the struct beforehand) then loop calling __ieee80211_radiotap_iterator_next()... it returns -1 if there are no more args in the header, or the next argument type index that is present. The iterator's this_arg member points to the start of the argument associated with the current argument index that is present, which can be found in the iterator's this_arg_index member. This arg index corresponds to the IEEE80211_RADIOTAP_... defines.

Parameters
iteratoriterator to initialize
radiotap_headermessage to parse
max_lengthnumber of valid bytes in radiotap_header
Returns
0 on success, -1 on error

Definition at line 1033 of file gnunet-helper-transport-wlan.c.

1038 {
1039  if ((iterator == NULL) ||
1040  (radiotap_header == NULL))
1041  return -1;
1042 
1043  /* Linux only supports version 0 radiotap format */
1044  if (0 != radiotap_header->it_version)
1045  return -1;
1046 
1047  /* sanity check for allowed length and radiotap length field */
1048  if ((max_length < sizeof(struct Ieee80211RadiotapHeader)) ||
1049  (max_length < (GNUNET_le16toh (radiotap_header->it_len))))
1050  return -1;
1051 
1052  memset (iterator, 0, sizeof(struct Ieee80211RadiotapHeaderIterator));
1053  iterator->rtheader = radiotap_header;
1054  iterator->max_length = GNUNET_le16toh (radiotap_header->it_len);
1055  iterator->bitmap_shifter = GNUNET_le32toh (radiotap_header->it_present);
1056  iterator->arg = ((uint8_t *) radiotap_header) + sizeof(struct
1058 
1059  /* find payload start allowing for extended bitmap(s) */
1060  if (0 != (iterator->bitmap_shifter & IEEE80211_RADIOTAP_PRESENT_EXTEND_MASK))
1061  {
1062  while (GNUNET_le32toh (*((uint32_t *) iterator->arg))
1064  {
1065  iterator->arg += sizeof(uint32_t);
1066  /*
1067  * check for insanity where the present bitmaps
1068  * keep claiming to extend up to or even beyond the
1069  * stated radiotap header length
1070  */if (iterator->arg - ((uint8_t *) iterator->rtheader) >
1071  iterator->max_length)
1072  return -1;
1073  }
1074  iterator->arg += sizeof(uint32_t);
1075  /*
1076  * no need to check again for blowing past stated radiotap
1077  * header length, because ieee80211_radiotap_iterator_next
1078  * checks it before it is dereferenced
1079  */}
1080  /* we are all initialized happily */
1081  return 0;
1082 }
#define IEEE80211_RADIOTAP_PRESENT_EXTEND_MASK
Bitmask indicating an extension of the bitmask is used.
static int iterator(void *cls, const struct GNUNET_PeerIdentity *key, void *value)
Iterator over hash map entries.
#define GNUNET_le32toh(x)
#define GNUNET_le16toh(x)
struct Ieee80211RadiotapHeaderIterator - tracks walk through present radiotap arguments in the radiot...
Generic header for radiotap messages (receiving and sending).
uint16_t it_len
length of the whole header in bytes, including it_version, it_pad, it_len, and data fields.
uint32_t it_present
A bitmap telling which fields are present.

References GNUNET_le16toh, GNUNET_le32toh, IEEE80211_RADIOTAP_PRESENT_EXTEND_MASK, Ieee80211RadiotapHeader::it_len, Ieee80211RadiotapHeader::it_present, Ieee80211RadiotapHeader::it_version, and iterator().

Referenced by linux_read().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ieee80211_radiotap_iterator_next()

static int ieee80211_radiotap_iterator_next ( struct Ieee80211RadiotapHeaderIterator iterator)
static

Returns the next radiotap parser iterator arg.

This function returns the next radiotap arg index (IEEE80211_RADIOTAP_...) and sets iterator->this_arg to point to the payload for the arg. It takes care of alignment handling and extended present fields. interator->this_arg can be changed by the caller. The args pointed to are in little-endian format.

Parameters
iteratorradiotap_iterator to move to next arg (if any)
Returns
next present arg index on success or -1 if no more or error

Definition at line 1098 of file gnunet-helper-transport-wlan.c.

1100 {
1101  /*
1102  * small length lookup table for all radiotap types we heard of
1103  * starting from b0 in the bitmap, so we can walk the payload
1104  * area of the radiotap header
1105  *
1106  * There is a requirement to pad args, so that args
1107  * of a given length must begin at a boundary of that length
1108  * -- but note that compound args are allowed (eg, 2 x uint16_t
1109  * for IEEE80211_RADIOTAP_CHANNEL) so total arg length is not
1110  * a reliable indicator of alignment requirement.
1111  *
1112  * upper nybble: content alignment for arg
1113  * lower nybble: content length for arg
1114  */static const uint8_t rt_sizes[] = {
1115  [IEEE80211_RADIOTAP_TSFT] = 0x88,
1116  [IEEE80211_RADIOTAP_FLAGS] = 0x11,
1117  [IEEE80211_RADIOTAP_RATE] = 0x11,
1118  [IEEE80211_RADIOTAP_CHANNEL] = 0x24,
1119  [IEEE80211_RADIOTAP_FHSS] = 0x22,
1126  [IEEE80211_RADIOTAP_ANTENNA] = 0x11,
1129  [IEEE80211_RADIOTAP_TX_FLAGS] = 0x22,
1130  [IEEE80211_RADIOTAP_RX_FLAGS] = 0x22,
1133  /*
1134  * add more here as they are defined in
1135  * include/net/ieee80211_radiotap.h
1136  */
1137  };
1138 
1139  /*
1140  * for every radiotap entry we can at
1141  * least skip (by knowing the length)...
1142  */
1143  while (iterator->arg_index < sizeof(rt_sizes))
1144  {
1145  int hit = (0 != (iterator->bitmap_shifter & 1));
1146 
1147  if (hit)
1148  {
1149  unsigned int wanted_alignment;
1150  unsigned int unalignment;
1151  /*
1152  * arg is present, account for alignment padding
1153  * 8-bit args can be at any alignment
1154  * 16-bit args must start on 16-bit boundary
1155  * 32-bit args must start on 32-bit boundary
1156  * 64-bit args must start on 64-bit boundary
1157  *
1158  * note that total arg size can differ from alignment of
1159  * elements inside arg, so we use upper nybble of length table
1160  * to base alignment on. First, 'wanted_alignment' is set to be
1161  * 1 for 8-bit, 2 for 16-bit, 4 for 32-bit and 8 for 64-bit
1162  * arguments. Then, we calculate the 'unalignment' (how many
1163  * bytes we are over by taking the difference of 'arg' and the
1164  * overall starting point modulo the desired alignment. As
1165  * desired alignments are powers of two, we can do modulo with
1166  * binary "&" (and also avoid the possibility of a division by
1167  * zero if the 'rt_sizes' table contains bogus entries).
1168  *
1169  * also note: these alignments are relative to the start of the
1170  * radiotap header. There is no guarantee that the radiotap
1171  * header itself is aligned on any kind of boundary, thus we
1172  * need to really look at the delta here.
1173  */wanted_alignment = rt_sizes[iterator->arg_index] >> 4;
1174  unalignment = (((void *) iterator->arg) - ((void *) iterator->rtheader))
1175  & (wanted_alignment - 1);
1176  if (0 != unalignment)
1177  {
1178  /* need padding (by 'wanted_alignment - unalignment') */
1179  iterator->arg_index += wanted_alignment - unalignment;
1180  }
1181 
1182  /*
1183  * this is what we will return to user, but we need to
1184  * move on first so next call has something fresh to test
1185  */
1186  iterator->this_arg_index = iterator->arg_index;
1187  iterator->this_arg = iterator->arg;
1188 
1189  /* internally move on the size of this arg (using lower nybble from
1190  the table) */
1191  iterator->arg += rt_sizes[iterator->arg_index] & 0x0f;
1192 
1193  /*
1194  * check for insanity where we are given a bitmap that
1195  * claims to have more arg content than the length of the
1196  * radiotap section. We will normally end up equalling this
1197  * max_length on the last arg, never exceeding it.
1198  */if ((((void *) iterator->arg) - ((void *) iterator->rtheader)) >
1199  iterator->max_length)
1200  return -1;
1201  }
1202 
1203  /* Now, move on to next bit / next entry */
1204  iterator->arg_index++;
1205 
1206  if (0 == (iterator->arg_index % 32))
1207  {
1208  /* completed current uint32_t bitmap */
1209  if (0 != (iterator->bitmap_shifter & 1))
1210  {
1211  /* bit 31 was set, there is more; move to next uint32_t bitmap */
1212  iterator->bitmap_shifter = GNUNET_le32toh (*iterator->next_bitmap);
1213  iterator->next_bitmap++;
1214  }
1215  else
1216  {
1217  /* no more bitmaps: end (by setting arg_index to high, unsupported value) */
1218  iterator->arg_index = sizeof(rt_sizes);
1219  }
1220  }
1221  else
1222  {
1223  /* just try the next bit (while loop will move on) */
1224  iterator->bitmap_shifter >>= 1;
1225  }
1226 
1227  /* if we found a valid arg earlier, return it now */
1228  if (hit)
1229  return iterator->this_arg_index;
1230  }
1231 
1232  /* we don't know how to handle any more args (or there are no more),
1233  so we're done (this is not an error) */
1234  return -1;
1235 }

References GNUNET_le32toh, IEEE80211_RADIOTAP_ANTENNA, IEEE80211_RADIOTAP_CHANNEL, IEEE80211_RADIOTAP_DATA_RETRIES, IEEE80211_RADIOTAP_DB_ANTNOISE, IEEE80211_RADIOTAP_DB_ANTSIGNAL, IEEE80211_RADIOTAP_DB_TX_ATTENUATION, IEEE80211_RADIOTAP_DBM_ANTNOISE, IEEE80211_RADIOTAP_DBM_ANTSIGNAL, IEEE80211_RADIOTAP_DBM_TX_POWER, IEEE80211_RADIOTAP_FHSS, IEEE80211_RADIOTAP_FLAGS, IEEE80211_RADIOTAP_LOCK_QUALITY, IEEE80211_RADIOTAP_RATE, IEEE80211_RADIOTAP_RTS_RETRIES, IEEE80211_RADIOTAP_RX_FLAGS, IEEE80211_RADIOTAP_TSFT, IEEE80211_RADIOTAP_TX_ATTENUATION, IEEE80211_RADIOTAP_TX_FLAGS, and iterator().

Referenced by linux_read().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ calc_crc_osdep()

static unsigned long calc_crc_osdep ( const unsigned char *  buf,
size_t  len 
)
static

Calculate crc32, the start of the calculation.

Parameters
bufbuffer to calc the crc
lenlen of the buffer
Returns
crc sum

Definition at line 1246 of file gnunet-helper-transport-wlan.c.

1247 {
1248  static const unsigned long int crc_tbl_osdep[256] = {
1249  0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
1250  0xE963A535, 0x9E6495A3,
1251  0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD,
1252  0xE7B82D07, 0x90BF1D91,
1253  0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB,
1254  0xF4D4B551, 0x83D385C7,
1255  0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
1256  0xFA0F3D63, 0x8D080DF5,
1257  0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447,
1258  0xD20D85FD, 0xA50AB56B,
1259  0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75,
1260  0xDCD60DCF, 0xABD13D59,
1261  0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
1262  0xCFBA9599, 0xB8BDA50F,
1263  0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11,
1264  0xC1611DAB, 0xB6662D3D,
1265  0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F,
1266  0x9FBFE4A5, 0xE8B8D433,
1267  0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
1268  0x91646C97, 0xE6635C01,
1269  0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B,
1270  0x8208F4C1, 0xF50FC457,
1271  0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49,
1272  0x8CD37CF3, 0xFBD44C65,
1273  0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
1274  0xA4D1C46D, 0xD3D6F4FB,
1275  0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5,
1276  0xAA0A4C5F, 0xDD0D7CC9,
1277  0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3,
1278  0xB966D409, 0xCE61E49F,
1279  0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
1280  0xB7BD5C3B, 0xC0BA6CAD,
1281  0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF,
1282  0x04DB2615, 0x73DC1683,
1283  0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D,
1284  0x0A00AE27, 0x7D079EB1,
1285  0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
1286  0x196C3671, 0x6E6B06E7,
1287  0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9,
1288  0x17B7BE43, 0x60B08ED5,
1289  0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767,
1290  0x3FB506DD, 0x48B2364B,
1291  0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
1292  0x316E8EEF, 0x4669BE79,
1293  0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703,
1294  0x220216B9, 0x5505262F,
1295  0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31,
1296  0x2CD99E8B, 0x5BDEAE1D,
1297  0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
1298  0x72076785, 0x05005713,
1299  0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D,
1300  0x7CDCEFB7, 0x0BDBDF21,
1301  0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B,
1302  0x6FB077E1, 0x18B74777,
1303  0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
1304  0x616BFFD3, 0x166CCF45,
1305  0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7,
1306  0x4969474D, 0x3E6E77DB,
1307  0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5,
1308  0x47B2CF7F, 0x30B5FFE9,
1309  0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
1310  0x54DE5729, 0x23D967BF,
1311  0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1,
1312  0x5A05DF1B, 0x2D02EF8D
1313  };
1314 
1315  unsigned long crc = 0xFFFFFFFF;
1316 
1317  for (; len > 0; len--, buf++)
1318  crc = crc_tbl_osdep[(crc ^ *buf) & 0xFF] ^ (crc >> 8);
1319  return(~crc);
1320 }
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...

References buf, and len.

Referenced by check_crc_buf_osdep().

Here is the caller graph for this function:

◆ check_crc_buf_osdep()

static int check_crc_buf_osdep ( const unsigned char *  buf,
size_t  len 
)
static

Calculate and check crc of the wlan packet.

Parameters
bufbuffer of the packet, with len + 4 bytes of data, the last 4 bytes being the checksum
lenlength of the payload in data
Returns
0 on success (checksum matches), 1 on error

Definition at line 1332 of file gnunet-helper-transport-wlan.c.

1333 {
1334  unsigned long crc;
1335 
1336  crc = calc_crc_osdep (buf, len);
1337  buf += len;
1338  if ((((crc) & 0xFF) == buf[0]) && (((crc >> 8) & 0xFF) == buf[1]) &&
1339  ( ((crc >> 16) & 0xFF) == buf[2]) && ( ((crc >> 24) & 0xFF) == buf[3]) )
1340  return 0;
1341  return 1;
1342 }
static unsigned long calc_crc_osdep(const unsigned char *buf, size_t len)
Calculate crc32, the start of the calculation.

References buf, calc_crc_osdep(), and len.

Referenced by linux_read().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_channel_from_frequency()

static int get_channel_from_frequency ( int32_t  frequency)
static

Return the channel from the frequency (in Mhz)

Parameters
frequencyof the channel
Returns
number of the channel

Definition at line 1357 of file gnunet-helper-transport-wlan.c.

1358 {
1359  if ((frequency >= 2412) && (frequency <= 2472))
1360  return (frequency - 2407) / 5;
1361  if (frequency == 2484)
1362  return 14;
1363  if ((frequency >= 5000) && (frequency <= 6100))
1364  return (frequency - 5000) / 5;
1365  return -1;
1366 }

Referenced by linux_get_channel().

Here is the caller graph for this function:

◆ linux_get_channel()

static int linux_get_channel ( const struct HardwareInfos dev)
static

Get the channel used by our WLAN interface.

Parameters
devpointer to the dev struct of the card
Returns
channel number, -1 on error

Definition at line 1376 of file gnunet-helper-transport-wlan.c.

1377 {
1378  struct iwreq wrq;
1379  int32_t frequency;
1380 
1381  memset (&wrq, 0, sizeof(struct iwreq));
1382  strncpy (wrq.ifr_name, dev->iface, IFNAMSIZ);
1383  if (0 > ioctl (dev->fd_raw, SIOCGIWFREQ, &wrq))
1384  return -1;
1385  frequency = wrq.u.freq.m; /* 'iw_freq' defines 'm' as '__s32', so we keep it signed */
1386  if (100000000 < frequency)
1387  frequency /= 100000;
1388  else if (1000000 < frequency)
1389  frequency /= 1000;
1390  if (1000 < frequency)
1391  return get_channel_from_frequency (frequency);
1392  return frequency;
1393 }
static int get_channel_from_frequency(int32_t frequency)
Return the channel from the frequency (in Mhz)
char iface[IFNAMSIZ]
Name of the interface, not necessarily 0-terminated (!).
int fd_raw
file descriptor for the raw socket

References HardwareInfos::fd_raw, get_channel_from_frequency(), and HardwareInfos::iface.

Referenced by linux_read().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ linux_read()

static ssize_t linux_read ( struct HardwareInfos dev,
unsigned char *  buf,
size_t  buf_size,
struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage ri 
)
static

Read from the raw socket (the wlan card), parse the packet and put the result into the buffer for transmission to 'stdout'.

Parameters
devpointer to the struct of the wlan card
bufbuffer to read to; first bytes will be the 'struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame', followed by the actual payload
buf_sizesize of the buffer
riwhere to write radiotap_rx info
Returns
number of bytes written to 'buf'

Definition at line 1408 of file gnunet-helper-transport-wlan.c.

1411 {
1412  unsigned char tmpbuf[buf_size];
1413  ssize_t caplen;
1414  size_t n;
1415  int got_signal = 0;
1416  int got_noise = 0;
1417  int got_channel = 0;
1418  int fcs_removed = 0;
1419 
1420  caplen = read (dev->fd_raw, tmpbuf, buf_size);
1421  if (0 > caplen)
1422  {
1423  if (EAGAIN == errno)
1424  return 0;
1425  fprintf (stderr, "Failed to read from RAW socket: %s\n", strerror (errno));
1426  return -1;
1427  }
1428 
1429  memset (ri, 0, sizeof(*ri));
1430  switch (dev->arptype_in)
1431  {
1433  {
1434  const struct PrismHeader *ph;
1435 
1436  ph = (const struct PrismHeader*) tmpbuf;
1437  n = ph->msglen;
1438  if ((n < 8) || (n >= caplen))
1439  return 0; /* invalid format */
1440  if ((PRISM_MSGCODE_MONITOR == ph->msgcode) &&
1441  (n >= sizeof(struct PrismHeader)))
1442  {
1443  const char *pos;
1444  size_t left;
1445  struct PrismValue pv;
1446 
1447  left = n - sizeof(struct PrismHeader);
1448  pos = (const char *) &ph[1];
1449  while (left > sizeof(struct PrismValue))
1450  {
1451  left -= sizeof(struct PrismValue);
1452  GNUNET_memcpy (&pv, pos, sizeof(struct PrismValue));
1453  pos += sizeof(struct PrismValue);
1454 
1455  switch (pv.did)
1456  {
1457  case PRISM_DID_NOISE:
1458  if (PRISM_STATUS_OK == pv.status)
1459  {
1460  ri->ri_noise = pv.data;
1461  /* got_noise = 1; */
1462  }
1463  break;
1464 
1465  case PRISM_DID_RATE:
1466  if (PRISM_STATUS_OK == pv.status)
1467  ri->ri_rate = pv.data * 500000;
1468  break;
1469 
1470  case PRISM_DID_CHANNEL:
1471  if (PRISM_STATUS_OK == pv.status)
1472  {
1473  ri->ri_channel = pv.data;
1474  got_channel = 1;
1475  }
1476  break;
1477 
1478  case PRISM_DID_MACTIME:
1479  if (PRISM_STATUS_OK == pv.status)
1480  ri->ri_mactime = pv.data;
1481  break;
1482 
1483  case PRISM_DID_SIGNAL:
1484  if (PRISM_STATUS_OK == pv.status)
1485  {
1486  ri->ri_power = pv.data;
1487  /* got_signal = 1; */
1488  }
1489  break;
1490  }
1491  }
1492  }
1493  if ((n < 8) || (n >= caplen))
1494  return 0; /* invalid format */
1495  }
1496  break;
1497 
1498  case ARPHRD_IEEE80211_FULL:
1499  {
1501  struct Ieee80211RadiotapHeader *rthdr;
1502 
1503  memset (&iterator, 0, sizeof(iterator));
1504  rthdr = (struct Ieee80211RadiotapHeader *) tmpbuf;
1505  n = GNUNET_le16toh (rthdr->it_len);
1506  if ((n < sizeof(struct Ieee80211RadiotapHeader)) || (n >= caplen))
1507  return 0; /* invalid 'it_len' */
1508  if (0 != ieee80211_radiotap_iterator_init (&iterator, rthdr, caplen))
1509  return 0;
1510  /* go through the radiotap arguments we have been given by the driver */
1512  {
1513  switch (iterator.this_arg_index)
1514  {
1516  ri->ri_mactime = GNUNET_le64toh (*((uint64_t *) iterator.this_arg));
1517  break;
1518 
1520  if (! got_signal)
1521  {
1522  ri->ri_power = *((int8_t *) iterator.this_arg);
1523  got_signal = 1;
1524  }
1525  break;
1526 
1528  if (! got_signal)
1529  {
1530  ri->ri_power = *((int8_t *) iterator.this_arg);
1531  got_signal = 1;
1532  }
1533  break;
1534 
1536  if (! got_noise)
1537  {
1538  ri->ri_noise = *((int8_t *) iterator.this_arg);
1539  got_noise = 1;
1540  }
1541  break;
1542 
1544  if (! got_noise)
1545  {
1546  ri->ri_noise = *((int8_t *) iterator.this_arg);
1547  got_noise = 1;
1548  }
1549  break;
1550 
1552  ri->ri_antenna = *iterator.this_arg;
1553  break;
1554 
1556  ri->ri_channel = *iterator.this_arg;
1557  got_channel = 1;
1558  break;
1559 
1561  ri->ri_rate = (*iterator.this_arg) * 500000;
1562  break;
1563 
1565  {
1566  uint8_t flags = *iterator.this_arg;
1567  /* is the CRC visible at the end? if so, remove */
1568  if (0 != (flags & IEEE80211_RADIOTAP_F_FCS))
1569  {
1570  fcs_removed = 1;
1571  caplen -= sizeof(uint32_t);
1572  }
1573  break;
1574  }
1575 
1577  {
1578  uint16_t flags = ntohs (*((uint16_t *) iterator.this_arg));
1579  if (0 != (flags & IEEE80211_RADIOTAP_F_RX_BADFCS))
1580  return 0;
1581  }
1582  break;
1583  } /* end of 'switch' */
1584  } /* end of the 'while' loop */
1585  }
1586  break;
1587 
1588  case ARPHRD_IEEE80211:
1589  n = 0; /* no header */
1590  break;
1591 
1592  case ARPHRD_ETHER:
1593  {
1594  if (sizeof(struct GNUNET_TRANSPORT_WLAN_Ieee8023Frame) > caplen)
1595  return 0; /* invalid */
1597  tmpbuf + sizeof(struct
1599  caplen - sizeof(struct
1601  - 4 /* 4 byte FCS */);
1602  return caplen - sizeof(struct GNUNET_TRANSPORT_WLAN_Ieee8023Frame) - 4;
1603  }
1604 
1605  default:
1606  errno = ENOTSUP; /* unsupported format */
1607  return -1;
1608  }
1609  caplen -= n;
1610  if (! got_channel)
1611  ri->ri_channel = linux_get_channel (dev);
1612 
1613  /* detect CRC32 at the end, even if the flag wasn't set and remove it */
1614  if ((0 == fcs_removed) &&
1615  (0 == check_crc_buf_osdep (tmpbuf + n, caplen - sizeof(uint32_t))))
1616  {
1617  /* NOTE: this heuristic can of course fail if there happens to
1618  be a matching checksum at the end. Would be good to have
1619  some data to see how often this heuristic actually works. */
1620  caplen -= sizeof(uint32_t);
1621  }
1622  /* copy payload to target buffer */
1623  GNUNET_memcpy (buf, tmpbuf + n, caplen);
1624  return caplen;
1625 }
static struct GNUNET_ATS_PerformanceHandle * ph
ATS performance handle used.
Definition: gnunet-ats.c:116
#define PRISM_DID_CHANNEL
Channel element.
#define IEEE80211_RADIOTAP_F_RX_BADFCS
For IEEE80211_RADIOTAP_RX_FLAGS: frame failed crc check.
#define PRISM_STATUS_OK
Value is set (supplied)
#define ARPHRD_IEEE80211_FULL
Packet format type for the messages we receive from the kernel.
#define PRISM_DID_SIGNAL
Signal element.
#define PRISM_DID_NOISE
Noise element.
static int ieee80211_radiotap_iterator_next(struct Ieee80211RadiotapHeaderIterator *iterator)
Returns the next radiotap parser iterator arg.
static int ieee80211_radiotap_iterator_init(struct Ieee80211RadiotapHeaderIterator *iterator, const struct Ieee80211RadiotapHeader *radiotap_header, size_t max_length)
Radiotap header iteration.
#define ARPHRD_ETHER
Packet format type for the messages we receive from the kernel.
#define ARPHRD_IEEE80211_PRISM
Packet format type for the messages we receive from the kernel.
static int linux_get_channel(const struct HardwareInfos *dev)
Get the channel used by our WLAN interface.
static int check_crc_buf_osdep(const unsigned char *buf, size_t len)
Calculate and check crc of the wlan packet.
#define IEEE80211_RADIOTAP_F_FCS
Bit in IEEE80211_RADIOTAP_FLAGS (which we might get as part of a 'struct Ieee80211RadiotapHeader' ext...
#define ARPHRD_IEEE80211
Packet format type for the messages we receive from the kernel.
#define PRISM_DID_MACTIME
Mac time element.
#define PRISM_MSGCODE_MONITOR
Monitor Frame (indicator that we have a 'struct PrismHeader').
#define PRISM_DID_RATE
Rate element, in units/multiples of 500Khz.
#define GNUNET_le64toh(x)
generic definitions for IEEE 802.11 frames
generic definitions for IEEE 802.3 frames
uint32_t ri_channel
IEEE80211_RADIOTAP_CHANNEL, 0 if unknown.
uint64_t ri_mactime
IEEE80211_RADIOTAP_TSFT, 0 if unknown.
uint32_t ri_antenna
IEEE80211_RADIOTAP_ANTENNA, 0 if unknown.
int32_t ri_noise
either IEEE80211_RADIOTAP_DBM_ANTNOISE or IEEE80211_RADIOTAP_DB_ANTNOISE, 0 if unknown.
uint32_t ri_rate
IEEE80211_RADIOTAP_RATE * 50000, 0 if unknown.
int32_t ri_power
from radiotap either IEEE80211_RADIOTAP_DBM_ANTSIGNAL or IEEE80211_RADIOTAP_DB_ANTSIGNAL,...
int arptype_in
Which format has the header that we're getting when receiving packets? Some ARPHRD_IEEE80211_XXX-valu...
Prism header format ('struct p80211msg' in Linux).
Values in the 'struct PrismHeader'.

References ARPHRD_ETHER, ARPHRD_IEEE80211, ARPHRD_IEEE80211_FULL, ARPHRD_IEEE80211_PRISM, HardwareInfos::arptype_in, buf, check_crc_buf_osdep(), PrismValue::data, PrismValue::did, HardwareInfos::fd_raw, GNUNET_le16toh, GNUNET_le64toh, GNUNET_memcpy, IEEE80211_RADIOTAP_ANTENNA, IEEE80211_RADIOTAP_CHANNEL, IEEE80211_RADIOTAP_DB_ANTNOISE, IEEE80211_RADIOTAP_DB_ANTSIGNAL, IEEE80211_RADIOTAP_DBM_ANTNOISE, IEEE80211_RADIOTAP_DBM_ANTSIGNAL, IEEE80211_RADIOTAP_F_FCS, IEEE80211_RADIOTAP_F_RX_BADFCS, IEEE80211_RADIOTAP_FLAGS, ieee80211_radiotap_iterator_init(), ieee80211_radiotap_iterator_next(), IEEE80211_RADIOTAP_RATE, IEEE80211_RADIOTAP_RX_FLAGS, IEEE80211_RADIOTAP_TSFT, Ieee80211RadiotapHeader::it_len, iterator(), linux_get_channel(), ph, PRISM_DID_CHANNEL, PRISM_DID_MACTIME, PRISM_DID_NOISE, PRISM_DID_RATE, PRISM_DID_SIGNAL, PRISM_MSGCODE_MONITOR, PRISM_STATUS_OK, GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage::ri_antenna, GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage::ri_channel, GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage::ri_mactime, GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage::ri_noise, GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage::ri_power, GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage::ri_rate, and PrismValue::status.

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ open_device_raw()

static int open_device_raw ( struct HardwareInfos dev)
static

Open the wireless network interface for reading/writing.

Parameters
devpointer to the device struct
Returns
0 on success

Definition at line 1640 of file gnunet-helper-transport-wlan.c.

1641 {
1642  struct ifreq ifr;
1643  struct iwreq wrq;
1644  struct packet_mreq mr;
1645  struct sockaddr_ll sll;
1646 
1647  /* find the interface index */
1648  memset (&ifr, 0, sizeof(ifr));
1649  strncpy (ifr.ifr_name, dev->iface, IFNAMSIZ);
1650  if (-1 == ioctl (dev->fd_raw, SIOCGIFINDEX, &ifr))
1651  {
1652  fprintf (stderr, "ioctl(SIOCGIFINDEX) on interface `%.*s' failed: %s\n",
1653  IFNAMSIZ, dev->iface, strerror (errno));
1654  return 1;
1655  }
1656 
1657  /* lookup the hardware type */
1658  memset (&sll, 0, sizeof(sll));
1659  sll.sll_family = AF_PACKET;
1660  sll.sll_ifindex = ifr.ifr_ifindex;
1661  sll.sll_protocol = htons (ETH_P_ALL);
1662  if (-1 == ioctl (dev->fd_raw, SIOCGIFHWADDR, &ifr))
1663  {
1664  fprintf (stderr, "ioctl(SIOCGIFHWADDR) on interface `%.*s' failed: %s\n",
1665  IFNAMSIZ, dev->iface, strerror (errno));
1666  return 1;
1667  }
1668  if (((ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211) &&
1669  (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) &&
1670  (ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_PRISM) &&
1671  (ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_FULL)))
1672  {
1673  fprintf (stderr,
1674  "Error: interface `%.*s' is not using a supported hardware address family (got %d)\n",
1675  IFNAMSIZ, dev->iface,
1676  ifr.ifr_hwaddr.sa_family);
1677  return 1;
1678  }
1679 
1680  /* lookup iw mode */
1681  memset (&wrq, 0, sizeof(struct iwreq));
1682  strncpy (wrq.ifr_name, dev->iface, IFNAMSIZ);
1683  if (-1 == ioctl (dev->fd_raw, SIOCGIWMODE, &wrq))
1684  {
1685  /* most probably not supported (ie for rtap ipw interface) *
1686  * so just assume its correctly set... */
1687  wrq.u.mode = IW_MODE_MONITOR;
1688  }
1689 
1690  if ((wrq.u.mode != IW_MODE_MONITOR) &&
1691  (wrq.u.mode != IW_MODE_ADHOC))
1692  {
1693  fprintf (stderr,
1694  "Error: interface `%.*s' is not in monitor or ad-hoc mode (got %d)\n",
1695  IFNAMSIZ, dev->iface,
1696  wrq.u.mode);
1697  return 1;
1698  }
1699 
1700  /* Is interface st to up, broadcast & running ? */
1701  if ((ifr.ifr_flags | IFF_UP | IFF_BROADCAST | IFF_RUNNING) != ifr.ifr_flags)
1702  {
1703  /* Bring interface up */
1704  ifr.ifr_flags |= IFF_UP | IFF_BROADCAST | IFF_RUNNING;
1705 
1706  if (-1 == ioctl (dev->fd_raw, SIOCSIFFLAGS, &ifr))
1707  {
1708  fprintf (stderr, "ioctl(SIOCSIFFLAGS) on interface `%.*s' failed: %s\n",
1709  IFNAMSIZ, dev->iface, strerror (errno));
1710  return 1;
1711  }
1712  }
1713 
1714  /* bind the raw socket to the interface */
1715  if (-1 == bind (dev->fd_raw, (struct sockaddr *) &sll, sizeof(sll)))
1716  {
1717  fprintf (stderr, "Failed to bind interface `%.*s': %s\n", IFNAMSIZ,
1718  dev->iface, strerror (errno));
1719  return 1;
1720  }
1721 
1722  /* lookup the hardware type */
1723  if (-1 == ioctl (dev->fd_raw, SIOCGIFHWADDR, &ifr))
1724  {
1725  fprintf (stderr, "ioctl(SIOCGIFHWADDR) on interface `%.*s' failed: %s\n",
1726  IFNAMSIZ, dev->iface, strerror (errno));
1727  return 1;
1728  }
1729 
1730  GNUNET_memcpy (&dev->pl_mac, ifr.ifr_hwaddr.sa_data, MAC_ADDR_SIZE);
1731  dev->arptype_in = ifr.ifr_hwaddr.sa_family;
1732  if ((ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) &&
1733  (ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211) &&
1734  (ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_PRISM) &&
1735  (ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_FULL))
1736  {
1737  fprintf (stderr, "Unsupported hardware link type %d on interface `%.*s'\n",
1738  ifr.ifr_hwaddr.sa_family, IFNAMSIZ, dev->iface);
1739  return 1;
1740  }
1741 
1742  /* enable promiscuous mode */
1743  memset (&mr, 0, sizeof(mr));
1744  mr.mr_ifindex = sll.sll_ifindex;
1745  mr.mr_type = PACKET_MR_PROMISC;
1746  if (0 !=
1747  setsockopt (dev->fd_raw, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr,
1748  sizeof(mr)))
1749  {
1750  fprintf (stderr,
1751  "Failed to enable promiscuous mode on interface `%.*s'\n",
1752  IFNAMSIZ,
1753  dev->iface);
1754  return 1;
1755  }
1756  return 0;
1757 }
#define MAC_ADDR_SIZE
Number fo bytes in a mac address.
struct GNUNET_TRANSPORT_WLAN_MacAddress pl_mac
MAC address of our own bluetooth interface.

References ARPHRD_ETHER, ARPHRD_IEEE80211, ARPHRD_IEEE80211_FULL, ARPHRD_IEEE80211_PRISM, HardwareInfos::arptype_in, HardwareInfos::fd_raw, GNUNET_memcpy, HardwareInfos::iface, MAC_ADDR_SIZE, and HardwareInfos::pl_mac.

Referenced by main().

Here is the caller graph for this function:

◆ test_wlan_interface()

static int test_wlan_interface ( const char *  iface)
static

Test if the given interface name really corresponds to a wireless device.

Parameters
ifacename of the interface
Returns
0 on success, 1 on error

Definition at line 1768 of file gnunet-helper-transport-wlan.c.

1769 {
1770  char strbuf[512];
1771  struct stat sbuf;
1772  int ret;
1773 
1774  ret = snprintf (strbuf, sizeof(strbuf),
1775  "/sys/class/net/%s/phy80211/subsystem",
1776  iface);
1777  if ((ret < 0) || (ret >= sizeof(strbuf)) || (0 != stat (strbuf, &sbuf)))
1778  {
1779  fprintf (stderr,
1780  "Did not find 802.11 interface `%s'. Exiting.\n",
1781  iface);
1782  exit (1);
1783  }
1784  return 0;
1785 }

References ret.

Referenced by main().

Here is the caller graph for this function:

◆ mac_test()

static int mac_test ( const struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame taIeeeHeader,
const struct HardwareInfos dev 
)
static

Test incoming packets mac for being our own.

Parameters
taIeeeHeaderbuffer of the packet
devthe Hardware_Infos struct
Returns
0 if mac belongs to us, 1 if mac is for another target

Definition at line 1796 of file gnunet-helper-transport-wlan.c.

1798 {
1800 
1801  if ((0 == memcmp (&taIeeeHeader->addr3, &all_zeros, MAC_ADDR_SIZE)) ||
1802  (0 == memcmp (&taIeeeHeader->addr1, &all_zeros, MAC_ADDR_SIZE)))
1803  return 0; /* some drivers set no Macs, then assume it is all for us! */
1804 
1805  if (0 != memcmp (&taIeeeHeader->addr3, &mac_bssid_gnunet, MAC_ADDR_SIZE))
1806  return 1; /* not a GNUnet ad-hoc package */
1807  if ((0 == memcmp (&taIeeeHeader->addr1, &dev->pl_mac, MAC_ADDR_SIZE)) ||
1808  (0 == memcmp (&taIeeeHeader->addr1, &bc_all_mac, MAC_ADDR_SIZE)))
1809  return 0; /* for us, or broadcast */
1810  return 1; /* not for us */
1811 }
static struct GNUNET_PeerIdentity all_zeros
Peer identity that is all zeros, used as a way to indicate "all peers".
static GNUNET_NETWORK_STRUCT_END const struct GNUNET_TRANSPORT_WLAN_MacAddress mac_bssid_gnunet
GNUnet bssid.
static const struct GNUNET_TRANSPORT_WLAN_MacAddress bc_all_mac
Broadcast MAC.
struct GNUNET_TRANSPORT_WLAN_MacAddress addr1
Address 1: destination address in ad-hoc mode or AP, BSSID if station,.
struct GNUNET_TRANSPORT_WLAN_MacAddress addr3
Address 3: BSSID in ad-hoc mode, Destination if station, source if AP.

References GNUNET_TRANSPORT_WLAN_Ieee80211Frame::addr1, GNUNET_TRANSPORT_WLAN_Ieee80211Frame::addr3, all_zeros, bc_all_mac, MAC_ADDR_SIZE, mac_bssid_gnunet, and HardwareInfos::pl_mac.

Referenced by main().

Here is the caller graph for this function:

◆ mac_set()

static void mac_set ( struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame taIeeeHeader,
const struct HardwareInfos dev 
)
static

Set the wlan header to sane values to make attacks more difficult.

Parameters
taIeeeHeaderpointer to the header of the packet
devpointer to the Hardware_Infos struct

Definition at line 1821 of file gnunet-helper-transport-wlan.c.

1823 {
1824  taIeeeHeader->frame_control = htons (IEEE80211_FC0_TYPE_DATA);
1825  taIeeeHeader->addr2 = dev->pl_mac;
1826  taIeeeHeader->addr3 = mac_bssid_gnunet;
1827 }
#define IEEE80211_FC0_TYPE_DATA
uint16_t frame_control
802.11 Frame Control field.
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::addr2, GNUNET_TRANSPORT_WLAN_Ieee80211Frame::addr3, GNUNET_TRANSPORT_WLAN_Ieee80211Frame::frame_control, IEEE80211_FC0_TYPE_DATA, mac_bssid_gnunet, and HardwareInfos::pl_mac.

Referenced by stdin_send_hw().

Here is the caller graph for this function:

◆ stdin_send_hw()

static void stdin_send_hw ( void *  cls,
const struct GNUNET_MessageHeader hdr 
)
static

Process data from the stdin.

Takes the message, prepends the radiotap transmission header, forces the sender MAC to be correct and puts it into our buffer for transmission to the kernel.

Parameters
clspointer to the device struct ('struct HardwareInfos*')
hdrpointer to the start of the packet

Definition at line 1839 of file gnunet-helper-transport-wlan.c.

1840 {
1841  struct HardwareInfos *dev = cls;
1843  struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *wlanheader;
1844  size_t sendsize;
1845  struct RadiotapTransmissionHeader rtheader;
1846  struct GNUNET_TRANSPORT_WLAN_Ieee8023Frame etheader;
1847 
1848  sendsize = ntohs (hdr->size);
1849  if ((sendsize <
1852  {
1853  fprintf (stderr, "Received malformed message\n");
1854  exit (1);
1855  }
1856  sendsize -= (sizeof(struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage)
1857  - sizeof(struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame));
1858  if (MAXLINE < sendsize)
1859  {
1860  fprintf (stderr, "Packet too big for buffer\n");
1861  exit (1);
1862  }
1863  header = (const struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *) hdr;
1864  switch (dev->arptype_in)
1865  {
1867  case ARPHRD_IEEE80211_FULL:
1868  case ARPHRD_IEEE80211:
1869  rtheader.header.it_version = 0;
1870  rtheader.header.it_pad = 0;
1871  rtheader.header.it_len = GNUNET_htole16 (sizeof(rtheader));
1872  rtheader.header.it_present = GNUNET_htole16 (
1874  rtheader.rate = header->rate;
1875  rtheader.pad1 = 0;
1876  rtheader.txflags = GNUNET_htole16 (IEEE80211_RADIOTAP_F_TX_NOACK
1878  GNUNET_memcpy (write_pout.buf, &rtheader, sizeof(rtheader));
1879  GNUNET_memcpy (&write_pout.buf[sizeof(rtheader)], &header->frame, sendsize);
1880  wlanheader = (struct
1882  rtheader)
1883  ];
1884 
1885  /* payload contains MAC address, but we don't trust it, so we'll
1886  * overwrite it with OUR MAC address to prevent mischief */
1887  mac_set (wlanheader, dev);
1888  write_pout.size = sendsize + sizeof(rtheader);
1889  break;
1890 
1891  case ARPHRD_ETHER:
1892  etheader.dst = header->frame.addr1;
1893  /* etheader.src = header->frame.addr2; --- untrusted input */
1894  etheader.src = dev->pl_mac;
1895  etheader.type = htons (ETH_P_IP);
1896  GNUNET_memcpy (write_pout.buf, &etheader, sizeof(etheader));
1897  GNUNET_memcpy (&write_pout.buf[sizeof(etheader)], &header[1], sendsize
1898  - sizeof(struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame));
1899  write_pout.size = sendsize - sizeof(struct
1901  + sizeof(etheader);
1902  break;
1903 
1904  default:
1905  fprintf (stderr,
1906  "Unsupported ARPTYPE!\n");
1907  break;
1908  }
1909 }
static struct SendBuffer write_pout
Buffer for data read from stdin to be transmitted to the wirless card.
#define IEEE80211_RADIOTAP_F_TX_NOSEQ
For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct RadiotapTransmissionHeader'): sequence number h...
static void mac_set(struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *taIeeeHeader, const struct HardwareInfos *dev)
Set the wlan header to sane values to make attacks more difficult.
#define MAXLINE
Maximum size of a message allowed in either direction (used for our receive and sent buffers).
#define IEEE80211_RADIOTAP_OUR_TRANSMISSION_HEADER_MASK
The above 'struct RadiotapTransmissionHeader' should have the following value for 'header....
#define IEEE80211_RADIOTAP_F_TX_NOACK
For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct RadiotapTransmissionHeader'): frame should not ...
#define GNUNET_htole16(x)
#define GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER
Type of data messages from the plugin to the gnunet-wlan-helper.
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
Message from the plugin to the WLAN helper: send the given message with the given connection paramete...
struct GNUNET_MessageHeader header
Type is 'GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER'.
struct for storing the information of the hardware.
Format of the header we need to prepend to messages to be sent to the Kernel.
size_t size
How many bytes of data are stored in 'buf' for transmission right now? Data always starts at offset 0...
char buf[4096 *2]
Buffered data; twice the maximum allowed message size as we add some headers.

References ARPHRD_ETHER, ARPHRD_IEEE80211, ARPHRD_IEEE80211_FULL, ARPHRD_IEEE80211_PRISM, HardwareInfos::arptype_in, SendBuffer::buf, GNUNET_TRANSPORT_WLAN_Ieee8023Frame::dst, GNUNET_htole16, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER, RadiotapTransmissionHeader::header, GNUNET_TRANSPORT_WLAN_RadiotapSendMessage::header, IEEE80211_RADIOTAP_F_TX_NOACK, IEEE80211_RADIOTAP_F_TX_NOSEQ, IEEE80211_RADIOTAP_OUR_TRANSMISSION_HEADER_MASK, Ieee80211RadiotapHeader::it_len, Ieee80211RadiotapHeader::it_pad, Ieee80211RadiotapHeader::it_present, Ieee80211RadiotapHeader::it_version, mac_set(), MAXLINE, RadiotapTransmissionHeader::pad1, HardwareInfos::pl_mac, RadiotapTransmissionHeader::rate, GNUNET_MessageHeader::size, SendBuffer::size, GNUNET_TRANSPORT_WLAN_Ieee8023Frame::src, RadiotapTransmissionHeader::txflags, GNUNET_MessageHeader::type, GNUNET_TRANSPORT_WLAN_Ieee8023Frame::type, and write_pout.

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ main()

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

Main function of the helper.

This code accesses a WLAN interface in monitoring mode (layer 2) and then forwards traffic in both directions between the WLAN interface and stdin/stdout of this process. Error messages are written to stdout.

Parameters
argcnumber of arguments, must be 2
argvarguments only argument is the name of the interface (e.g. 'mon0')
Returns
0 on success (never happens, as we don't return unless aborted), 1 on error

Definition at line 1923 of file gnunet-helper-transport-wlan.c.

1924 {
1925  struct HardwareInfos dev;
1926  char readbuf[MAXLINE];
1927  int maxfd;
1928  fd_set rfds;
1929  fd_set wfds;
1930  int stdin_open;
1932  int raw_eno;
1933 
1934  /* assert privs so we can modify the firewall rules! */
1935  {
1936 #ifdef HAVE_SETRESUID
1937  uid_t uid = getuid ();
1938 
1939  if (0 != setresuid (uid, 0, 0))
1940  {
1941  fprintf (stderr,
1942  "Failed to setresuid to root: %s\n",
1943  strerror (errno));
1944  return 254;
1945  }
1946 #else
1947  if (0 != seteuid (0))
1948  {
1949  fprintf (stderr,
1950  "Failed to seteuid back to root: %s\n", strerror (errno));
1951  return 254;
1952  }
1953 #endif
1954  }
1955 
1956  /* make use of SGID capabilities on POSIX */
1957  memset (&dev, 0, sizeof(dev));
1958  dev.fd_raw = socket (PF_PACKET, SOCK_RAW, htons (ETH_P_ALL));
1959  raw_eno = errno; /* remember for later */
1960 
1961  /* now that we've dropped root rights, we can do error checking */
1962  if (2 != argc)
1963  {
1964  fprintf (stderr,
1965  "You must specify the name of the interface as the first and only argument to this program.\n");
1966  if (-1 != dev.fd_raw)
1967  (void) close (dev.fd_raw);
1968  return 1;
1969  }
1970 
1971  if (-1 == dev.fd_raw)
1972  {
1973  fprintf (stderr, "Failed to create raw socket: %s\n", strerror (raw_eno));
1974  return 1;
1975  }
1976  if (dev.fd_raw >= FD_SETSIZE)
1977  {
1978  fprintf (stderr, "File descriptor too large for select (%d > %d)\n",
1979  dev.fd_raw, FD_SETSIZE);
1980  (void) close (dev.fd_raw);
1981  return 1;
1982  }
1983  if (0 != test_wlan_interface (argv[1]))
1984  {
1985  (void) close (dev.fd_raw);
1986  return 1;
1987  }
1988  memcpy (dev.iface, argv[1], IFNAMSIZ);
1989  if (0 != open_device_raw (&dev))
1990  {
1991  (void) close (dev.fd_raw);
1992  return 1;
1993  }
1994 
1995  /* drop privs */
1996  {
1997  uid_t uid = getuid ();
1998 #ifdef HAVE_SETRESUID
1999  if (0 != setresuid (uid, uid, uid))
2000  {
2001  fprintf (stderr, "Failed to setresuid: %s\n", strerror (errno));
2002  if (-1 != dev.fd_raw)
2003  (void) close (dev.fd_raw);
2004  return 1;
2005  }
2006 #else
2007  if (0 != (setuid (uid) | seteuid (uid)))
2008  {
2009  fprintf (stderr, "Failed to setuid: %s\n", strerror (errno));
2010  if (-1 != dev.fd_raw)
2011  (void) close (dev.fd_raw);
2012  return 1;
2013  }
2014 #endif
2015  }
2016 
2017 
2018  /* send MAC address of the WLAN interface to STDOUT first */
2019  {
2021 
2022  macmsg.hdr.size = htons (sizeof(macmsg));
2023  macmsg.hdr.type = htons (GNUNET_MESSAGE_TYPE_WLAN_HELPER_CONTROL);
2024  GNUNET_memcpy (&macmsg.mac, &dev.pl_mac, sizeof(struct
2026  GNUNET_memcpy (write_std.buf, &macmsg, sizeof(macmsg));
2027  write_std.size = sizeof(macmsg);
2028  }
2029 
2030  stdin_mst = mst_create (&stdin_send_hw, &dev);
2031  stdin_open = 1;
2032  while (1)
2033  {
2034  maxfd = -1;
2035  FD_ZERO (&rfds);
2036  if ((0 == write_pout.size) && (1 == stdin_open))
2037  {
2038  FD_SET (STDIN_FILENO, &rfds);
2039  maxfd = MAX (maxfd, STDIN_FILENO);
2040  }
2041  if (0 == write_std.size)
2042  {
2043  FD_SET (dev.fd_raw, &rfds);
2044  maxfd = MAX (maxfd, dev.fd_raw);
2045  }
2046  FD_ZERO (&wfds);
2047  if (0 < write_std.size)
2048  {
2049  FD_SET (STDOUT_FILENO, &wfds);
2050  maxfd = MAX (maxfd, STDOUT_FILENO);
2051  }
2052  if (0 < write_pout.size)
2053  {
2054  FD_SET (dev.fd_raw, &wfds);
2055  maxfd = MAX (maxfd, dev.fd_raw);
2056  }
2057  {
2058  int retval = select (maxfd + 1, &rfds, &wfds, NULL, NULL);
2059  if ((-1 == retval) && (EINTR == errno))
2060  continue;
2061  if (0 > retval)
2062  {
2063  fprintf (stderr, "select failed: %s\n", strerror (errno));
2064  break;
2065  }
2066  }
2067  if (FD_ISSET (STDOUT_FILENO, &wfds))
2068  {
2069  ssize_t ret =
2070  write (STDOUT_FILENO, write_std.buf + write_std.pos,
2072  if (0 > ret)
2073  {
2074  fprintf (stderr, "Failed to write to STDOUT: %s\n", strerror (errno));
2075  break;
2076  }
2077  write_std.pos += ret;
2078  if (write_std.pos == write_std.size)
2079  {
2080  write_std.pos = 0;
2081  write_std.size = 0;
2082  }
2083  }
2084  if (FD_ISSET (dev.fd_raw, &wfds))
2085  {
2086  ssize_t ret =
2087  write (dev.fd_raw, write_pout.buf + write_pout.pos,
2089  if (0 > ret)
2090  {
2091  fprintf (stderr, "Failed to write to WLAN device: %s\n",
2092  strerror (errno));
2093  break;
2094  }
2095  write_pout.pos += ret;
2096  if ((write_pout.pos != write_pout.size) && (0 != ret))
2097  {
2098  /* we should not get partial sends with packet-oriented devices... */
2099  fprintf (stderr, "Write error, partial send: %u/%u\n",
2100  (unsigned int) write_pout.pos,
2101  (unsigned int) write_pout.size);
2102  break;
2103  }
2104  if (write_pout.pos == write_pout.size)
2105  {
2106  write_pout.pos = 0;
2107  write_pout.size = 0;
2108  }
2109  }
2110 
2111  if (FD_ISSET (STDIN_FILENO, &rfds))
2112  {
2113  ssize_t ret =
2114  read (STDIN_FILENO, readbuf, sizeof(readbuf));
2115  if (0 > ret)
2116  {
2117  fprintf (stderr, "Read error from STDIN: %s\n", strerror (errno));
2118  break;
2119  }
2120  if (0 == ret)
2121  {
2122  /* stop reading... */
2123  stdin_open = 0;
2124  }
2125  mst_receive (stdin_mst, readbuf, ret);
2126  }
2127 
2128  if (FD_ISSET (dev.fd_raw, &rfds))
2129  {
2131  ssize_t ret;
2132 
2133  rrm = (struct
2135  ret =
2136  linux_read (&dev, (unsigned char *) &rrm->frame,
2137  sizeof(write_std.buf)
2138  - sizeof(struct
2140  + sizeof(struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame),
2141  rrm);
2142  if (0 > ret)
2143  {
2144  fprintf (stderr, "Read error from raw socket: %s\n", strerror (errno));
2145  break;
2146  }
2147  if ((0 < ret) && (0 == mac_test (&rrm->frame, &dev)))
2148  {
2149  write_std.size = ret
2150  + sizeof(struct
2152  - sizeof(struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame);
2153  rrm->header.size = htons (write_std.size);
2155  }
2156  }
2157  }
2158  /* Error handling, try to clean up a bit at least */
2160  (void) close (dev.fd_raw);
2161  return 1; /* we never exit 'normally' */
2162 }
struct GNUNET_MessageStreamTokenizer * stdin_mst
Tokenizer for the data we get from stdin.
static struct SendBuffer write_std
Buffer for data read from the wireless card to be transmitted to stdout.
static int mac_test(const struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *taIeeeHeader, const struct HardwareInfos *dev)
Test incoming packets mac for being our own.
static int mst_receive(struct MessageStreamTokenizer *mst, const char *buf, size_t size)
Add incoming data to the receive buffer and call the callback for all complete messages.
static void mst_destroy(struct MessageStreamTokenizer *mst)
Destroys a tokenizer.
static int open_device_raw(struct HardwareInfos *dev)
Open the wireless network interface for reading/writing.
static struct MessageStreamTokenizer * mst_create(MessageTokenizerCallback cb, void *cb_cls)
Create a message stream tokenizer.
static void stdin_send_hw(void *cls, const struct GNUNET_MessageHeader *hdr)
Process data from the stdin.
static int test_wlan_interface(const char *iface)
Test if the given interface name really corresponds to a wireless device.
static ssize_t linux_read(struct HardwareInfos *dev, unsigned char *buf, size_t buf_size, struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *ri)
Read from the raw socket (the wlan card), parse the packet and put the result into the buffer for tra...
#define GNUNET_MESSAGE_TYPE_WLAN_HELPER_CONTROL
Control message between the gnunet-wlan-helper and the daemon (with the MAC).
#define GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER
Type of data messages from the gnunet-wlan-helper to the plugin.
struct GNUNET_MessageHeader hdr
Message header.
Message from the WLAN helper to the plugin: we have received the given message with the given perform...
struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame frame
IEEE Frame.
struct GNUNET_MessageHeader header
Type is 'GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER'.
size_t pos
How many bytes that were stored in 'buf' did we already write to the destination? Always smaller than...

References SendBuffer::buf, HardwareInfos::fd_raw, GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage::frame, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER, GNUNET_MESSAGE_TYPE_WLAN_HELPER_CONTROL, GNUNET_TRANSPORT_WLAN_HelperControlMessage::hdr, GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage::header, HardwareInfos::iface, linux_read(), GNUNET_TRANSPORT_WLAN_HelperControlMessage::mac, mac_test(), MAXLINE, mst_create(), mst_destroy(), mst_receive(), open_device_raw(), HardwareInfos::pl_mac, SendBuffer::pos, ret, GNUNET_MessageHeader::size, SendBuffer::size, stdin_mst, stdin_send_hw(), test_wlan_interface(), GNUNET_MessageHeader::type, write_pout, and write_std.

Here is the call graph for this function:

Variable Documentation

◆ did

uint32_t did

This has a different ID for each parameter, see PRISM_DID_* constants.

Definition at line 4 of file gnunet-helper-transport-wlan.c.

◆ status

◆ len

uint16_t len

length of data (which is always a uint32_t, but presumably this can be used to specify that fewer bytes are used (with values in 'len' from 0-4).

We ignore this field.

Definition at line 16 of file gnunet-helper-transport-wlan.c.

Referenced by gnunet-chk.Chk::__init__(), gnunet-chk.AESKey::__init__(), typescriptdomain.LinkingHtmlFormatter::_format_lines(), address_notification(), address_to_regex(), gnunet-chk::aes_pad_(), block_create_ecdsa(), block_create_eddsa(), calc_crc_osdep(), check_crc_buf_osdep(), check_edge(), check_union_p2p_strata_estimator(), clear_from_s5r_rbuf(), client_receive(), client_send_cb(), gnunet-chk::compute_rootchk(), connect_probe_continuation(), create_keys(), create_response(), create_string_array(), curl_upload_cb(), CustomPeerMap_create(), dfa_move(), dfa_state_create(), dht_get_string_handler(), dns_value_to_string(), do_accept(), do_dns_read(), do_write(), gnunet-chk::encode_data_to_string(), encrypt_existing_match(), exchange(), expand_dollar(), gnunet_pyexpect.pexpect::expect(), expect_data_dynamic(), find_typedefs::find_typedefs(), GCP_path_entry_add(), get_cb(), get_message(), gnunet_janitor::get_process_list(), find_typedefs::get_td_from_function_signature(), find_typedefs::get_td_from_simple_type(), gn_crc32(), GNUNET_ABD_delegates_deserialize(), GNUNET_ABD_delegation_chain_deserialize(), GNUNET_ABD_delegation_set_deserialize(), GNUNET_BIO_read(), GNUNET_buffer_write(), GNUNET_buffer_write_path(), GNUNET_buffer_write_str(), GNUNET_CONFIGURATION_expand_dollar(), GNUNET_CONFIGURATION_serialize(), GNUNET_CONTAINER_multihashmap32_create(), GNUNET_CONTAINER_multihashmap_create(), GNUNET_CONTAINER_multipeermap_create(), GNUNET_CONTAINER_multishortmap_create(), GNUNET_CONTAINER_multiuuidmap_create(), GNUNET_CRYPTO_crc16_n(), GNUNET_CRYPTO_crc16_step(), GNUNET_CRYPTO_crc32_n(), GNUNET_CRYPTO_crc8_n(), GNUNET_CRYPTO_rsa_private_key_create(), GNUNET_CRYPTO_rsa_public_key_decode(), GNUNET_DISK_file_map(), GNUNET_DISK_file_read(), GNUNET_DISK_file_read_non_blocking(), GNUNET_DISK_fn_read(), GNUNET_DNSPARSER_builder_add_name(), GNUNET_FS_search_start_probe_(), GNUNET_GNSRECORD_records_deserialize(), GNUNET_GNSRECORD_records_deserialize_get_size(), GNUNET_HELLO_builder_from_url(), GNUNET_IDENTITY_read_private_key_from_buffer(), GNUNET_IDENTITY_read_signature_from_buffer(), GNUNET_IDENTITY_sign_(), GNUNET_IDENTITY_write_private_key_to_buffer(), GNUNET_JSON_from_data64(), GNUNET_memcmp_ct_(), GNUNET_NAT_register(), GNUNET_NAT_stun_handle_packet_(), GNUNET_OS_process_status(), GNUNET_PQ_exec_prepared(), GNUNET_RECLAIM_attribute_list_serialize(), GNUNET_RECLAIM_attribute_list_serialize_get_size(), GNUNET_RECLAIM_credential_list_serialize(), GNUNET_RECLAIM_credential_list_serialize_get_size(), GNUNET_RECLAIM_presentation_list_serialize(), GNUNET_RECLAIM_presentation_list_serialize_get_size(), GNUNET_RECLAIM_write_ticket_to_buffer(), GNUNET_REST_create_response(), GNUNET_STRINGS_base64_decode(), GNUNET_STRINGS_base64_encode(), GNUNET_STRINGS_base64url_decode(), GNUNET_STRINGS_base64url_encode(), GNUNET_STRINGS_check_filename(), GNUNET_STRINGS_conv(), GNUNET_STRINGS_filename_expand(), GNUNET_STRINGS_from_utf8(), GNUNET_STRINGS_parse_ipv4_policy(), GNUNET_STRINGS_parse_ipv6_policy(), GNUNET_STRINGS_to_utf8(), GNUNET_STRINGS_urldecode(), GNUNET_STRINGS_utf8_normalize(), GNUNET_xstrndup_(), httpdomain.httpdomain.HTTPIndex::grouping_prefix(), GST_stats_init(), handle_client_accept(), handle_connection_broken(), handle_connection_create_ack(), handle_connection_destroy(), handle_data(), httpdomain.httpdomain.HTTPResource::handle_signature(), handle_tunnel_encrypted(), handle_tunnel_kx(), handle_tunnel_kx_auth(), handle_union_p2p_strata_estimator(), http_common_address_from_socket(), initialize_key_to_element(), libgnunet_plugin_transport_tcp_init(), libgnunet_plugin_transport_unix_done(), load_list_messages(), load_list_tunnels(), load_member_session_history(), main(), modify_request(), nat_register(), natoi(), needs_parens(), neighbours_connect_notification(), on_appsink_new_sample(), packetizer(), parse_name(), prepare_ipv4_packet(), prepare_ipv6_packet(), print_peer_list(), process_sblock(), put_cb(), httpdomain.autohttp.flask_base::quickref_directive(), read_from_buffer(), read_from_file(), read_from_the_socket(), recv_message(), regex_add(), REGEX_BLOCK_create(), REGEX_BLOCK_get_key(), REGEX_BLOCK_iterate(), regex_combine(), regex_edge_iterator(), REGEX_INTERNAL_construct_dfa(), REGEX_INTERNAL_construct_nfa(), REGEX_INTERNAL_search(), regex_split(), REGEX_TEST_generate_random_string(), REGEX_TEST_read_from_file(), reply_to_dns(), resolver_lookup_get_next_label(), typescriptdomain.TypeScriptDefinition::run(), run(), s2i_full(), find_typedefs::scan_dir(), select_write_cb(), send_icmp_packet_via_tun(), send_lookup_response(), send_tcp_packet_via_tun(), send_udp_packet_via_tun(), setup_data_transfer(), start_insert(), t_ax_hmac_hash(), t_hmac_derive_key(), try_old_ax_keys(), try_top_down_reconstruction(), union_accept(), unix_plugin_get_network(), View_change_len(), View_create(), write_pid_file(), and write_to_buffer().

◆ data

uint32_t data

The data value.

Definition at line 21 of file gnunet-helper-transport-wlan.c.

Referenced by abd_string_to_value(), abd_value_to_string(), add_dns_result(), add_host(), add_record(), add_to_meta_counter(), basic_string_to_value(), basic_value_to_string(), bind_abstime(), bind_fixed_blob(), bind_nbotime(), bind_rsa_pub(), bind_rsa_sig(), bind_string(), bind_u16(), bind_u32(), bind_u64(), buffer_append(), buffer_init(), cadet_reply_proc(), calc_checksum(), check_dht_p2p_hello(), check_dht_p2p_put(), check_phone_ring(), check_pkey(), check_tcp_back(), check_tcp_data(), checkvec(), cleanup_recordinfo(), client_response_handler(), collect_tickets_cb(), configuration_receiver(), consistency_iter(), conversation_string_to_value(), conversation_value_to_string(), copy_from_reader(), count_and_separate_strings(), create_string_array(), d2j(), decoder_ogg_pad_added(), decrypt_block_with_keyword(), dht_get_id_handler(), dht_get_string_accept_handler(), dht_get_string_handler(), DID_resolve(), display_records_from_block(), dns_string_to_value(), dns_value_to_string(), do_read(), do_shutdown(), do_udp_read(), dv_hmac(), ego_sign_data(), ego_sign_data_cb(), expect_data_dynamic(), expect_data_fixed(), expi_proc(), extract_result_cb(), filter_tickets_cb(), find_full_data(), forward_resolution(), full_recursive_download(), gather_uri_data(), gen_topo_from_file(), get_any(), get_cb(), get_resp_callback(), get_result_iterator(), get_typed(), gns_string_to_value(), gns_value_to_string(), GNUNET_ABD_delegate_deserialize(), GNUNET_ABD_delegate_serialize(), GNUNET_buffer_write(), GNUNET_buffer_write_data_encoded(), GNUNET_CONTAINER_bloomfilter_get_raw_data(), GNUNET_CRYPTO_crc8_n(), GNUNET_CRYPTO_ecc_ecdh(), GNUNET_CRYPTO_mpi_scan_unsigned(), GNUNET_CRYPTO_mpi_scan_unsigned_le(), GNUNET_CRYPTO_rsa_public_key_decode(), GNUNET_CRYPTO_rsa_signature_decode(), GNUNET_DATASTORE_put(), GNUNET_DATASTORE_remove(), GNUNET_DHT_put(), GNUNET_DHT_verify_path(), GNUNET_DNSPARSER_bin_to_hex(), GNUNET_DNSPARSER_hex_to_bin(), GNUNET_FRIENDS_parse(), GNUNET_FS_data_reader_copy_(), GNUNET_FS_directory_builder_add(), GNUNET_FS_directory_builder_finish(), GNUNET_FS_directory_list_contents(), GNUNET_FS_file_information_create_from_data(), GNUNET_FS_handle_on_demand_block(), GNUNET_FS_meta_data_delete(), GNUNET_FS_meta_data_deserialize(), GNUNET_FS_meta_data_insert(), GNUNET_GNSRECORD_JSON_from_gnsrecord(), GNUNET_GNSRECORD_records_deserialize(), GNUNET_GNSRECORD_records_get_size(), GNUNET_GNSRECORD_records_serialize(), GNUNET_GNSRECORD_string_to_value(), GNUNET_GNSRECORD_value_to_string(), GNUNET_HELLO_extract_address(), GNUNET_JSON_from_data(), GNUNET_JSON_from_data64(), GNUNET_NAT_stun_handle_packet(), GNUNET_NAT_stun_handle_packet_(), GNUNET_OP_result(), GNUNET_PQ_query_param_absolute_time(), GNUNET_PQ_query_param_bool(), GNUNET_PQ_query_param_null(), GNUNET_PQ_query_param_relative_time(), GNUNET_PQ_query_param_rsa_public_key(), GNUNET_PQ_query_param_rsa_signature(), GNUNET_PQ_query_param_uint16(), GNUNET_PQ_query_param_uint32(), GNUNET_PQ_query_param_uint64(), GNUNET_RECLAIM_attribute_deserialize(), GNUNET_RECLAIM_attribute_list_add(), GNUNET_RECLAIM_attribute_list_deserialize(), GNUNET_RECLAIM_attribute_new(), GNUNET_RECLAIM_attribute_string_to_value(), GNUNET_RECLAIM_attribute_value_to_string(), GNUNET_RECLAIM_credential_deserialize(), GNUNET_RECLAIM_credential_list_deserialize(), GNUNET_RECLAIM_credential_new(), GNUNET_RECLAIM_credential_string_to_value(), GNUNET_RECLAIM_credential_value_to_string(), GNUNET_RECLAIM_presentation_deserialize(), GNUNET_RECLAIM_presentation_list_deserialize(), GNUNET_RECLAIM_presentation_new(), GNUNET_RECLAIM_presentation_string_to_value(), GNUNET_RECLAIM_presentation_value_to_string(), GNUNET_REST_create_response(), GNUNET_SECRETSHARING_share_read(), GNUNET_SQ_bind(), GNUNET_STRINGS_base64_decode(), GNUNET_STRINGS_base64_encode(), GNUNET_STRINGS_base64url_decode(), GNUNET_STRINGS_data_to_string(), GNUNET_STRINGS_urldecode(), GNUNET_STRINGS_urlencode(), GNUNET_TESTBED_controller_link(), GNUNET_TESTBED_extract_config_(), GNUNET_TESTBED_forward_operation_msg_(), GNUNET_TESTBED_get_slave_config_(), GNUNET_TESTBED_hosts_load_from_file(), GNUNET_TESTBED_LOGGER_write(), GNUNET_TESTBED_overlay_connect(), GNUNET_TESTBED_peer_create(), GNUNET_TESTBED_peer_get_information(), GNUNET_TESTBED_peer_manage_service(), GNUNET_TESTBED_peer_start(), GNUNET_TESTBED_peer_stop(), GNUNET_TESTBED_peer_update_configuration(), GNUNET_TESTBED_service_connect(), GNUNET_TESTBED_shutdown_peers(), GNUNET_TESTING_get_topo_from_file(), GNUNET_TESTING_get_topo_from_string(), GNUNET_try_compression(), handle_client_insert(), handle_datastore_reply(), handle_delegate_collection_cb(), handle_dht_p2p_put(), handle_dht_reply(), handle_dht_response(), handle_dht_result(), handle_gns_resolution_result(), handle_link_controllers_result(), handle_op_fail_event(), handle_opsuccess(), handle_p2p_reply(), handle_peer_conevent(), handle_peer_config(), handle_peer_create_success(), handle_peer_event(), handle_results(), handle_tcp_back(), handle_tcp_data(), heap_plugin_put(), heap_plugin_remove_key(), issue_ticket(), item_printer(), iter_finished(), jwt_get_issuer(), jwt_parse_attributes(), jwt_string_to_value(), jwt_value_to_string(), load_search_strings(), lookup_authz_cb(), lookup_records(), lookup_redirect_uri_result(), main(), make_file(), match_full_data(), merge_helper(), merge_with_nick_records(), messenger_string_to_value(), messenger_value_to_string(), meta_printer(), mpi_to_sexp(), mysql_plugin_put(), mysql_plugin_remove_key(), normalize_metadata(), ogg_pad_added(), op_result(), oprelease_link_controllers(), oprelease_manage_service(), oprelease_overlay_connect(), oprelease_peer_getinfo(), oprelease_peer_reconfigure(), oprelease_service_connect(), opstart_get_slave_config(), opstart_link_controllers(), opstart_manage_service(), opstart_overlay_connect(), opstart_peer_create(), opstart_peer_getinfo(), opstart_peer_reconfigure(), opstart_peer_start(), opstart_peer_stop(), opstart_service_connect(), output_vectors(), pabc_get_issuer(), pabc_parse_attributes(), pabc_string_to_value(), pabc_value_to_string(), parse(), parse_attr(), parse_credential(), parse_gnsrecordobject(), parse_jwt(), parse_record(), parse_record_data(), parsehex(), play(), policy_filename_cb(), post_data_iter(), postgres_plugin_put(), postgres_plugin_remove_key(), process_dht_put_content(), process_kblock_for_unindex(), process_local_reply(), process_lookup_result(), process_migration_content(), process_parallel_lookup_result(), process_result(), process_tickets(), put_callback(), put_cb(), record(), recursive_gns2dns_resolution(), repl_proc(), reply_to_dns(), result_processor(), revoke_attrs_cb(), rsa_sign_mpi(), run(), run_zbar(), rvk_move_attr_cb(), rvk_ticket_update(), sign_path(), sqlite_plugin_get_closest(), sqlite_plugin_put(), sqlite_plugin_remove_key(), stdin_receiver(), store_and_free_entries(), stream_read_callback(), string_to_value(), transmit_call_audio(), transmit_item(), try_match_block(), try_reconnect(), try_send_tcp(), try_send_udp(), unindex_process(), update_tickets(), value_to_string(), and write_message().

◆ msgcode

uint32_t msgcode

We expect this to be a PRISM_MSGCODE_*.

Definition at line 3 of file gnunet-helper-transport-wlan.c.

◆ msglen

uint32_t msglen

The length of the entire header.

Definition at line 8 of file gnunet-helper-transport-wlan.c.

◆ devname

char devname[16]

Name of the device that captured the packet.

Definition at line 13 of file gnunet-helper-transport-wlan.c.

◆ __attribute__

struct PrismHeader __attribute__

◆ write_pout

struct SendBuffer write_pout
static

Buffer for data read from stdin to be transmitted to the wirless card.

Definition at line 1 of file gnunet-helper-transport-wlan.c.

Referenced by main(), and stdin_send_hw().

◆ write_std

struct SendBuffer write_std
static

Buffer for data read from the wireless card to be transmitted to stdout.

Definition at line 1 of file gnunet-helper-transport-wlan.c.

Referenced by main().