-fix NPE
[oweals/gnunet.git] / src / transport / plugin_transport_wlan.h
index 8528d984ab6a4208c342345ebe5f439eb5e5b98f..359bae9a7ceb6af40a92a4f57f0fc6cc7b4ced39 100644 (file)
@@ -1,6 +1,6 @@
 /*
  This file is part of GNUnet
(C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Christian Grothoff (and other contributing authors)
Copyright (C) 2010, 2011 Christian Grothoff (and other contributing authors)
 
  GNUnet is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published
@@ -14,8 +14,8 @@
 
  You should have received a copy of the GNU General Public License
  along with GNUnet; see the file COPYING.  If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
  */
 
 /**
  * @brief header for transport plugin and the helper for wlan
  * @author David Brodski
  */
-
 #ifndef PLUGIN_TRANSPORT_WLAN
 #define PLUGIN_TRANSPORT_WLAN
 
-#include <stdint.h>
+#include "gnunet_crypto_lib.h"
 #include "gnunet_common.h"
 
-struct MacAddress
+/**
+ * Number fo bytes in a mac address.
+ */
+#ifdef MINGW
+  #define MAC_ADDR_SIZE 8
+  typedef uint8_t u_int8_t;
+#else
+  #define MAC_ADDR_SIZE 6
+#endif
+
+/**
+ * Value for "Management" in the 'frame_control' field of the
+ * struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame.
+ */
+#define IEEE80211_FC0_TYPE_MGT                  0x00
+
+/**
+ * Value for "Control" in the 'frame_control' field of the
+ * struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame.
+ */
+#define IEEE80211_FC0_TYPE_CTL                  0x04
+
+/**
+ * Value for DATA in the 'frame_control' field of the
+ * struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame.
+ */
+#define IEEE80211_FC0_TYPE_DATA                 0x08
+
+
+GNUNET_NETWORK_STRUCT_BEGIN
+
+/**
+ * A MAC Address.
+ */
+struct GNUNET_TRANSPORT_WLAN_MacAddress
 {
-  u_int8_t mac[6];
+  uint8_t mac[MAC_ADDR_SIZE];
 };
 
-struct Wlan_Helper_Control_Message
+/**
+ * Format of a WLAN Control Message.
+ */
+struct GNUNET_TRANSPORT_WLAN_HelperControlMessage
 {
+  /**
+   * Message header.  Type is
+   * GNUNET_MESSAGE_TYPE_WLAN_HELPER_CONTROL
+   */
   struct GNUNET_MessageHeader hdr;
-  struct MacAddress mac;
+
+  /**
+   * MAC Address of the local WLAN interface.
+   */
+  struct GNUNET_TRANSPORT_WLAN_MacAddress mac;
+};
+
+/**
+ * generic definitions for IEEE 802.3 frames
+ */
+struct GNUNET_TRANSPORT_WLAN_Ieee8023Frame
+{
+
+  /**
+   * Address 1: destination address in ad-hoc mode or AP, BSSID if station,
+   */
+  struct GNUNET_TRANSPORT_WLAN_MacAddress dst;
+
+  /**
+   * Address 2: source address if in ad-hoc-mode or station, BSSID if AP
+   */
+  struct GNUNET_TRANSPORT_WLAN_MacAddress src;
+
+  /**
+   * Packet type ID.
+   */
+  uint16_t type;
+
 };
 
 
 /**
- * Header for messages which need fragmentation
+ * generic definitions for IEEE 802.11 frames
  */
-struct WlanHeader
+struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame
 {
+  /**
+   * 802.11 Frame Control field.  A bitmask.  The overall field is a
+   * 16-bit mask of the respecitve fields.  The lowest two bits should
+   * be 0, then comes the "type" (2 bits, see IEEE80211_FC0_TYPE_*
+   * constants), followed by 4-bit subtype (all zeros for ad-hoc),
+   * followed by various flags (to DS, from DS, more frag, retry,
+   * power management, more data, WEP, strict), all of which we also
+   * keep at zero.
+   */
+  uint16_t frame_control GNUNET_PACKED;
 
-  struct GNUNET_MessageHeader header;
+  /**
+   * Microseconds to reserve link (duration), 0 by default
+   */
+  uint16_t duration GNUNET_PACKED;
 
   /**
-   * checksum/error correction
+   * Address 1: destination address in ad-hoc mode or AP, BSSID if station,
    */
-  uint32_t crc GNUNET_PACKED;
+  struct GNUNET_TRANSPORT_WLAN_MacAddress addr1;
 
   /**
-   * To whom are we talking to (set to our identity
-   * if we are still waiting for the welcome message)
+   * Address 2: source address if in ad-hoc-mode or station, BSSID if AP
    */
-  struct GNUNET_PeerIdentity target;
+  struct GNUNET_TRANSPORT_WLAN_MacAddress addr2;
 
   /**
-   *  Where the packet came from
+   * Address 3: BSSID in ad-hoc mode, Destination if station, source if AP
    */
-  struct GNUNET_PeerIdentity source;
+  struct GNUNET_TRANSPORT_WLAN_MacAddress addr3;
+
+  /**
+   * 802.11 sequence control field; contains fragment number an sequence
+   * number (we set this to all zeros).
+   */
+  uint16_t sequence_control GNUNET_PACKED;
+
+  /**
+   * Link layer control (LLC).  Set to a GNUnet-specific value.
+   */
+  u_int8_t llc[4];
+
+  /* payload */
+
+} GNUNET_PACKED;
 
-// followed by payload
 
-};
 
-/* Wlan IEEE80211 header default */
-//Informations (in German) http://www.umtslink.at/content/WLAN_macheader-196.html
-static const uint8_t u8aIeeeHeader[] =
-  { 0x08, 0x01, // Frame Control 0x08= 00001000 -> | b1,2 = 0 -> Version 0;
-      //      b3,4 = 10 -> Data; b5-8 = 0 -> Normal Data
-      //       0x01 = 00000001 -> | b1 = 1 to DS; b2 = 0 not from DS;
-      0x00, 0x00, // Duration/ID
-      0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // mac1 - in this case receiver
-      0x13, 0x22, 0x33, 0x44, 0x55, 0x66, // mac2 - in this case sender
-      0x13, 0x22, 0x33, 0x44, 0x55, 0x66, // mac3 - in this case bssid
-      0x10, 0x86, //Sequence Control
-    };
-
-// gnunet bssid
-static const struct MacAddress mac_bssid =
-  {
-    { 0x13, 0x22, 0x33, 0x44, 0x55, 0x66 } };
-
-// broadcast mac
-static const struct MacAddress bc_all_mac =
-  {
-    { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } };
-
-/* this is the template radiotap header we send packets out with */
-
-static const uint8_t u8aRadiotapHeader[] =
-  { 0x00, 0x00, // <-- radiotap version
-      0x19, 0x00, // <- radiotap header length
-      0x6f, 0x08, 0x00, 0x00, // <-- bitmap
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // <-- timestamp
-      0x00, // <-- flags (Offset +0x10)
-      0x6c, // <-- rate (0ffset +0x11)
-      0x71, 0x09, 0xc0, 0x00, // <-- channel
-      0xde, // <-- antsignal
-      0x00, // <-- antnoise
-      0x01, // <-- antenna
-    };
-
-struct Radiotap_Send
+/**
+ * Message from the plugin to the WLAN helper: send the given message with the
+ * given connection parameters.
+ */
+struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage
 {
+
+  /**
+   * Type is 'GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER'.
+   */
+  struct GNUNET_MessageHeader header;
+
   /**
    * wlan send rate
    */
   uint8_t rate;
 
   /**
-   * antenna
+   * Antenna; the first antenna is 0.
    */
   uint8_t antenna;
 
@@ -124,89 +188,100 @@ struct Radiotap_Send
    * Transmit power expressed as unitless distance from max power set at factory calibration.
    * 0 is max power. Monotonically nondecreasing with lower power levels.
    */
+  uint16_t tx_power GNUNET_PACKED;
 
-  uint16_t tx_power;
-};
+  /**
+   * IEEE Frame to transmit (the sender MAC address will be overwritten by the helper as it does not
+   * trust the plugin to set it correctly).
+   */
+  struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame frame;
 
-// bit field defines for ri_present
+  /* actual payload follows */
+};
 
-#define has_noise 1
-#define has_power 2
-#define has_channel 4
 
 /**
- * struct to represent infos gathered form the radiotap fields
+ * Message from the WLAN helper to the plugin: we have received the given message with the
+ * given performance characteristics.
  */
-
-struct Radiotap_rx
-{
-  uint32_t ri_present;
-  uint64_t ri_mactime;
-  int32_t ri_power;
-  int32_t ri_noise;
-  uint32_t ri_channel;
-  uint32_t ri_freq;
-  uint32_t ri_rate;
-  uint32_t ri_antenna;
-};
-
 /**
- * Radiotap Header
+ * struct to represent infos gathered form the radiotap fields, see RadiotapHeader for more Infos
  */
-struct RadiotapHeader
+struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage
 {
+
   /**
-   * radiotap version
+   * Type is 'GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER'.
    */
-  u_int8_t version;
-
-  u_int8_t pad_version;
+  struct GNUNET_MessageHeader header;
 
   /**
-   * radiotap header length
+   * Information about which of the fields below are actually valid.
+   * 0 for none.  FIXME: not properly initialized so far (always zero).
    */
-  uint16_t length GNUNET_PACKED;
+  uint32_t ri_present GNUNET_PACKED;
 
   /**
-   * bitmap, fields present
+   * IEEE80211_RADIOTAP_TSFT, 0 if unknown.
    */
-  uint32_t bitmap GNUNET_PACKED;
+  uint64_t ri_mactime GNUNET_PACKED;
 
   /**
-   * timestamp
+   * from radiotap
+   * either IEEE80211_RADIOTAP_DBM_ANTSIGNAL
+   * or IEEE80211_RADIOTAP_DB_ANTSIGNAL, 0 if unknown.
    */
-  uint64_t timestamp GNUNET_PACKED;
+  int32_t ri_power GNUNET_PACKED;
 
   /**
-   * radiotap flags
+   * either IEEE80211_RADIOTAP_DBM_ANTNOISE
+   * or IEEE80211_RADIOTAP_DB_ANTNOISE, 0 if unknown.
    */
-  uint8_t flags;
+  int32_t ri_noise GNUNET_PACKED;
 
   /**
-   * wlan send rate
+   * IEEE80211_RADIOTAP_CHANNEL, 0 if unknown.
    */
-  uint8_t rate;
+  uint32_t ri_channel GNUNET_PACKED;
 
-  // FIXME: unaligned here, is this OK?
   /**
-   * Wlan channel
+   * Frequency we use.  0 if unknown.
    */
-  uint32_t channel GNUNET_PACKED;
+  uint32_t ri_freq GNUNET_PACKED;
 
   /**
-   * antsignal
+   * IEEE80211_RADIOTAP_RATE * 50000, 0 if unknown.
    */
-  uint8_t antsignal;
+  uint32_t ri_rate GNUNET_PACKED;
 
   /**
-   * antnoise
+   * IEEE80211_RADIOTAP_ANTENNA, 0 if unknown.
    */
-  uint8_t antnoise;
+  uint32_t ri_antenna GNUNET_PACKED;
 
   /**
-   * antenna
+   * IEEE Frame.
    */
-  uint8_t antenna;
+  struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame frame;
+
+  /* followed by payload */
+};
+
+GNUNET_NETWORK_STRUCT_END
+
+/**
+ * GNUnet bssid
+ */
+static const struct GNUNET_TRANSPORT_WLAN_MacAddress mac_bssid_gnunet = {
+  {0x13, 0x22, 0x33, 0x44, 0x55, 0x66}
+};
+
+
+/**
+ * Broadcast MAC
+ */
+static const struct GNUNET_TRANSPORT_WLAN_MacAddress bc_all_mac = {
+  {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
 };
 
 #endif