gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r14862 - in gnunet/src/transport: . wlan


From: gnunet
Subject: [GNUnet-SVN] r14862 - in gnunet/src/transport: . wlan
Date: Tue, 5 Apr 2011 11:02:16 +0200

Author: brodski
Date: 2011-04-05 11:02:16 +0200 (Tue, 05 Apr 2011)
New Revision: 14862

Modified:
   gnunet/src/transport/gnunet-transport-wlan-helper.c
   gnunet/src/transport/plugin_transport_wlan.c
   gnunet/src/transport/plugin_transport_wlan.h
   gnunet/src/transport/wlan/loopback_helper.c
Log:
Some fixes

Modified: gnunet/src/transport/gnunet-transport-wlan-helper.c
===================================================================
--- gnunet/src/transport/gnunet-transport-wlan-helper.c 2011-04-05 07:27:16 UTC 
(rev 14861)
+++ gnunet/src/transport/gnunet-transport-wlan-helper.c 2011-04-05 09:02:16 UTC 
(rev 14862)
@@ -259,14 +259,6 @@
   exit(1);
 }
 
-void
-packet_callback(unsigned char *Args, const struct pcap_pkthdr* Pkthdr,
-    unsigned char *Packet)
-{
-  fprintf(stderr, "+");
-  fflush(stderr);
-}
-
 unsigned long
 calc_crc_osdep(unsigned char * buf, int len)
 {
@@ -410,7 +402,7 @@
 
 static int
 linux_read(struct Hardware_Infos * dev, unsigned char *buf, int count,
-    struct rx_info * ri)
+    struct Radiotap_rx * ri)
 {
   unsigned char tmpbuf[4096];
 
@@ -867,12 +859,62 @@
   return 1;
 }
 
+/**
+ * function to test incoming packets mac
+ * @param buf buffer of the packet
+ * @param dev pointer to the Hardware_Infos struct
+ * @return 0 if macs are okay, 1 if macs are wrong
+ */
+
+static int
+mac_test(unsigned char * buf, struct Hardware_Infos * dev)
+{
+  struct ieee80211_frame * u8aIeeeHeader;
+  u8aIeeeHeader = (struct ieee80211_frame *) buf;
+  if (0 == memcmp(u8aIeeeHeader->i_addr3, mac_bssid, 6))
+    {
+      if (0 == memcmp(u8aIeeeHeader->i_addr2, dev->pl_mac, 6))
+        {
+          return 0;
+        }
+
+      if (0 == memcmp(u8aIeeeHeader->i_addr2, bc_all_mac, 6))
+        {
+          return 0;
+        }
+    }
+
+  return 1;
+}
+
+/**
+ * function to set the wlan header to make attacks more difficult
+ * @param buf buffer of the packet
+ * @param dev pointer to the Hardware_Infos struct
+ */
+
 static void
+mac_set(unsigned char * buf, struct Hardware_Infos * dev)
+{
+  struct ieee80211_frame * u8aIeeeHeader;
+  u8aIeeeHeader = (struct ieee80211_frame *) buf;
+
+  u8aIeeeHeader->i_fc[0] = 0x80;
+  u8aIeeeHeader->i_fc[1] = 0x00;
+
+  memcpy(u8aIeeeHeader->i_addr2, dev->pl_mac, 6);
+  memcpy(u8aIeeeHeader->i_addr3, mac_bssid, 6);
+
+}
+
+static void
 stdin_send_hw(void *cls, void *client, const struct GNUNET_MessageHeader *hdr)
 {
   struct Hardware_Infos * dev = cls;
   struct sendbuf *write_pout = dev->write_pout;
   struct Radiotap_Send * header = (struct Radiotap_Send *) &hdr[1];
+  unsigned char * wlanheader;
+
   int sendsize;
 
   unsigned char u8aRadiotap[] =
@@ -899,6 +941,15 @@
       exit(1);
     }
 
+  if (sendsize < sizeof(struct ieee80211_frame) + sizeof(struct WlanHeader)
+      + sizeof(struct FragmentationHeader)
+      + sizeof(struct GNUNET_MessageHeader))
+    {
+      fprintf(stderr, "Function stdin_send: packet too small\n");
+      exit(1);
+    }
+
+  u8aRadiotap[2] = htole16(sizeof(u8aRadiotap));
   u8aRadiotap[8] = header->rate;
 
   switch (dev->drivertype)
@@ -909,9 +960,12 @@
     memcpy(write_pout->buf + sizeof(u8aRadiotap), write_pout->buf
         + sizeof(struct Radiotap_Send) + sizeof(struct GNUNET_MessageHeader),
         sendsize);
+
+    wlanheader =  write_pout->buf + sizeof(u8aRadiotap);
+    mac_set(wlanheader, dev);
+
     sendsize += sizeof(u8aRadiotap);
 
-    //usedrtap = 1;
     break;
   default:
     break;
@@ -956,7 +1010,7 @@
    0x01, // <-- antenna
    };*/
 
-  u8aRadiotap[8] = (rate/500000);
+  u8aRadiotap[8] = (rate / 500000);
   u8aRadiotap[2] = htole16(sizeof(u8aRadiotap));
 
   static struct ieee80211_frame u8aIeeeHeader;
@@ -982,7 +1036,8 @@
     }
 
   tmp16 = (uint16_t*) u8aIeeeHeader.i_dur;
-  *tmp16 = (uint16_t) htole16((sizeof(txt) + sizeof(struct ieee80211_frame) * 
1000000) / rate + 290);
+  *tmp16
+      = (uint16_t) htole16((sizeof(txt) + sizeof(struct ieee80211_frame) * 
1000000) / rate + 290);
   tmp16 = (uint16_t*) u8aIeeeHeader.i_seq;
   *tmp16 = (*tmp16 & IEEE80211_SEQ_FRAG_MASK) | (htole16(seqenz)
       << IEEE80211_SEQ_SEQ_SHIFT);
@@ -1001,7 +1056,7 @@
 
   struct Hardware_Infos dev;
   struct ifreq ifreq;
-  struct rx_info * rxinfo;
+  struct Radiotap_rx * rxinfo;
   uint8_t * mac = dev.pl_mac;
   int fdpin, fdpout;
 
@@ -1019,6 +1074,7 @@
 
   //return 0;
 
+  unsigned char * datastart;
   char readbuf[MAXLINE];
   int readsize = 0;
   struct sendbuf write_std;
@@ -1134,8 +1190,6 @@
         {
 
           ret = linux_write(&dev, write_pout.buf, write_pout.size);
-          //ret = write(fdpout, write_pout.buf + write_pout.pos, 
write_pout.size
-          //    - write_pout.pos);
 
           if (0 > ret)
             {
@@ -1186,14 +1240,15 @@
 
       if (FD_ISSET(fdpin, &rfds))
         {
-          rxinfo = (struct rx_info *) (write_pout.buf
+          rxinfo = (struct Radiotap_rx *) (write_pout.buf
               + sizeof(struct GNUNET_MessageHeader));
-          readsize = linux_read(&dev, (unsigned char *) readbuf
-              + sizeof(struct rx_info) + sizeof(struct GNUNET_MessageHeader),
-              sizeof(readbuf) - sizeof(struct rx_info)
-                  - sizeof(struct GNUNET_MessageHeader), rxinfo);
-          //readsize = read(fdpin, readbuf, sizeof(readbuf));
+          datastart = (unsigned char *) readbuf + sizeof(struct Radiotap_rx)
+              + sizeof(struct GNUNET_MessageHeader);
 
+          readsize = linux_read(&dev, datastart, sizeof(readbuf)
+              - sizeof(struct Radiotap_rx)
+              - sizeof(struct GNUNET_MessageHeader), rxinfo);
+
           if (0 > readsize)
             {
               closeprog = 1;
@@ -1202,7 +1257,12 @@
             }
           else if (0 < readsize)
             {
-
+              if (1 == mac_test(datastart, &dev))
+                {
+                  // mac wrong
+                  write_pout.pos = 0;
+                  write_pout.size = 0;
+                }
             }
           else
             {
@@ -1236,7 +1296,7 @@
     }
   else
     {
-      hardwaremode(argc, argv);
+      return hardwaremode(argc, argv);
     }
 
 #if 0

Modified: gnunet/src/transport/plugin_transport_wlan.c
===================================================================
--- gnunet/src/transport/plugin_transport_wlan.c        2011-04-05 07:27:16 UTC 
(rev 14861)
+++ gnunet/src/transport/plugin_transport_wlan.c        2011-04-05 09:02:16 UTC 
(rev 14862)
@@ -36,6 +36,8 @@
 #include "gnunet_crypto_lib.h"
 #include "wlan/ieee80211.h"
 
+#include <string.h>
+
 #define PROTOCOL_PREFIX "wlan"
 
 /**
@@ -281,6 +283,7 @@
   uint16_t num;
   const char * msg;
   uint16_t size;
+  struct Radiotap_rx rxinfo;
 };
 
 /**
@@ -544,56 +547,6 @@
 /**
  * Header for messages which need fragmentation
  */
-struct WlanHeader
-{
-
-  struct GNUNET_MessageHeader header;
-
-  /**
-   * checksum/error correction
-   */
-  uint32_t crc GNUNET_PACKED;
-
-  /**
-   * To whom are we talking to (set to our identity
-   * if we are still waiting for the welcome message)
-   */
-  struct GNUNET_PeerIdentity target;
-
-// followed by payload
-
-};
-
-/**
- * Header for messages which need fragmentation
- */
-struct FragmentationHeader
-{
-
-  struct GNUNET_MessageHeader header;
-
-  /**
-   * ID of message, to distinguish between the messages, picked randomly.
-   */
-  uint32_t message_id GNUNET_PACKED;
-
-  /**
-   * Offset or number of this fragment, for fragmentation/segmentation (design 
choice, TBD)
-   */
-  uint16_t fragment_off_or_num GNUNET_PACKED;
-
-  /**
-   * CRC of fragment (for error checking)
-   */
-  uint16_t message_crc GNUNET_PACKED;
-
-// followed by payload
-
-};
-
-/**
- * Header for messages which need fragmentation
- */
 struct FragmentationAckHeader
 {
 
@@ -636,7 +589,7 @@
 
 static void
 free_receive_message(struct Plugin* plugin,
-    struct Receive_Message_Queue * rec_message);
+    struct Receive_Message_Queue * rx_message);
 
 struct Receive_Message_Queue *
 get_receive_message_from_session(struct Plugin * plugin,
@@ -644,7 +597,7 @@
 
 static void
 wlan_data_helper(void *cls, struct Session_light * session_light,
-    const struct GNUNET_MessageHeader * hdr);
+    const struct GNUNET_MessageHeader * hdr, const struct Radiotap_rx * 
rxinfo);
 
 static void
 wlan_process_helper(void *cls, void *client,
@@ -994,10 +947,10 @@
     {
       next_send = GNUNET_TIME_absolute_get_remaining(plugin->beacon_time);
       if (fm != NULL)
-       {
-         next_send
-           = GNUNET_TIME_relative_min(next_send, get_next_frag_timeout(fm));
-       }
+        {
+          next_send = GNUNET_TIME_relative_min(next_send,
+              get_next_frag_timeout(fm));
+        }
     }
   plugin->server_write_delay_task = GNUNET_SCHEDULER_add_delayed(next_send,
       &delay_fragment_task, plugin);
@@ -1624,15 +1577,18 @@
     struct Radiotap_Send * header)
 {
 
-  if (session != NULL){
-    header->rate = session->rate;
-    header->tx_power = session->tx_power;
-    header->antenna = session->antenna;
-  } else {
-    header->rate = 255;
-    header->tx_power = 0;
-    header->antenna = 0;
-  }
+  if (session != NULL)
+    {
+      header->rate = session->rate;
+      header->tx_power = session->tx_power;
+      header->antenna = session->antenna;
+    }
+  else
+    {
+      header->rate = 255;
+      header->tx_power = 0;
+      header->antenna = 0;
+    }
 
   return GNUNET_YES;
 }
@@ -1650,6 +1606,8 @@
 getWlanHeader(struct ieee80211_frame * Header, const char * const to_mac_addr,
     struct Plugin * plugin)
 {
+  Header->i_fc[0] = 0x80;
+  Header->i_fc[1] = 0x00;
   memcpy(&Header->i_addr3, mac_bssid, sizeof(mac_bssid));
   memcpy(&Header->i_addr2, plugin->mac_address.mac, 
sizeof(plugin->mac_address));
   memcpy(&Header->i_addr1, to_mac_addr, sizeof(plugin->mac_address));
@@ -2020,25 +1978,20 @@
  * @return string representing the same address 
  */
 static const char*
-wlan_plugin_address_to_string (void *cls, 
-                              const void *addr, 
-                              size_t addrlen)
+wlan_plugin_address_to_string(void *cls, const void *addr, size_t addrlen)
 {
   static char ret[40];
   const struct MacAddress *mac;
 
-  if (addrlen != sizeof (struct MacAddress))
+  if (addrlen != sizeof(struct MacAddress))
     {
       GNUNET_break (0);
       return NULL;
     }
   mac = addr;
-  GNUNET_snprintf(ret, sizeof(ret),
-                 "%s Mac-Address %X:%X:%X:%X:%X:%X", 
-                 PROTOCOL_PREFIX,
-                 mac->mac[0], mac->mac[1],
-                 mac->mac[2], mac->mac[3], 
-                 mac->mac[4], mac->mac[5]);
+  GNUNET_snprintf(ret, sizeof(ret), "%s Mac-Address %X:%X:%X:%X:%X:%X",
+      PROTOCOL_PREFIX, mac->mac[0], mac->mac[1], mac->mac[2], mac->mac[3],
+      mac->mac[4], mac->mac[5]);
   return ret;
 }
 
@@ -2133,10 +2086,10 @@
 
 static void
 free_receive_message(struct Plugin* plugin,
-    struct Receive_Message_Queue * rec_message)
+    struct Receive_Message_Queue * rx_message)
 {
-  GNUNET_assert(rec_message !=NULL);
-  struct Receive_Fragment_Queue * rec_queue = rec_message->frag_head;
+  GNUNET_assert(rx_message !=NULL);
+  struct Receive_Fragment_Queue * rec_queue = rx_message->frag_head;
   struct Receive_Fragment_Queue * rec_queue2;
 
   while (rec_queue != NULL)
@@ -2146,14 +2099,14 @@
       GNUNET_free(rec_queue2);
     }
 
-  
GNUNET_CONTAINER_DLL_remove(plugin->receive_messages_head,plugin->receive_messages_teil,
 rec_message);
+  
GNUNET_CONTAINER_DLL_remove(plugin->receive_messages_head,plugin->receive_messages_teil,
 rx_message);
 
   GNUNET_assert(plugin->pending_receive_messages > 0);
-  GNUNET_assert(rec_message->session->fragment_messages_in_count > 0);
+  GNUNET_assert(rx_message->session->fragment_messages_in_count > 0);
 
   plugin->pending_receive_messages--;
-  rec_message->session->fragment_messages_in_count--;
-  GNUNET_free(rec_message);
+  rx_message->session->fragment_messages_in_count--;
+  GNUNET_free(rx_message);
 }
 
 /**
@@ -2167,12 +2120,12 @@
 static void
 check_rec_finished_msg(struct Plugin* plugin,
     struct Session_light * session_light, struct Session * session,
-    struct Receive_Message_Queue * rec_message)
+    struct Receive_Message_Queue * rx_message)
 {
-  GNUNET_assert(rec_message !=NULL);
+  GNUNET_assert(rx_message !=NULL);
 
-  struct Receive_Fragment_Queue * rec_queue = rec_message->frag_head;
-  int packetsize = rec_message->rec_size;
+  struct Receive_Fragment_Queue * rx_frag = rx_message->frag_head;
+  int packetsize = rx_message->rec_size;
   int sum = 0;
   int aktnum = 0;
   uint64_t bitfield = 0;
@@ -2188,56 +2141,60 @@
       + sizeof(struct GNUNET_MessageHeader))
     {
 #if DEBUG_wlan
-          GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-              "Message not big enough\n");
+      GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Message not big enough\n");
 #endif
-      free_receive_message(plugin, rec_message);
+      free_receive_message(plugin, rx_message);
       return;
     }
 
 #if DEBUG_wlan
-  check_message_fragment_bitfield(rec_message);
+  check_message_fragment_bitfield(rx_message);
 #endif
 
-  bitfield = ~bitfield;
-  bitfield = bitfield >> (63 - rec_message->frag_tail->num);
-  if (rec_message->received_fragments == bitfield)
+  if (rx_message->frag_tail->num == ffsl(rx_message->received_fragments))
     {
-
-      while (rec_queue != NULL)
+      bitfield = ~bitfield;
+      bitfield = bitfield << (63 - ffsl(rx_message->received_fragments));
+      if (rx_message->received_fragments == bitfield)
         {
-          sum += rec_queue->size;
-          rec_queue = rec_queue->next;
-        }
-      //sum should always be smaller or equal of
-      GNUNET_assert(sum <= packetsize);
-      if (sum == packetsize)
-        {
 
+          while (rx_frag != NULL)
+            {
+              sum += rx_frag->size;
+              rx_frag = rx_frag->next;
+            }
+          //sum should always be smaller or equal of
+          GNUNET_assert(sum <= packetsize);
+          if (sum == packetsize)
+            {
+
 #if DEBUG_wlan
-          GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-              "check_rec_finished_msg: A message for %p is complete\n", 
session);
+              GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+                  "check_rec_finished_msg: A message for %p is complete\n",
+                  session);
 #endif
 
-          //TODO use mst
-          //copy fragments together
-          msg = GNUNET_malloc(packetsize);
-          rec_queue = rec_message->frag_head;
-          aktnum = 0;
-          while (rec_queue != NULL)
-            {
-              //TODO SAVE SOME COPY OPS AND CHECK CRC WITHOUT COPY
-              memcpy(msg + aktnum, rec_queue->msg, rec_queue->size);
-              aktnum += rec_queue->size;
-              rec_queue = rec_queue->next;
-            }
-          free_receive_message(plugin, rec_message);
-          //call wlan_process_helper to process the message
-          wlan_data_massage_handler(plugin, session_light,
-              (struct GNUNET_MessageHeader*) msg);
-          //wlan_data_helper (plugin, session_light, (struct 
GNUNET_MessageHeader*) msg);
+              //TODO use mst
+              //copy fragments together
+              msg = GNUNET_malloc(packetsize);
+              rx_frag = rx_message->frag_head;
+              aktnum = 0;
+              while (rx_frag != NULL)
+                {
+                  //TODO SAVE SOME COPY OPS AND CHECK CRC WITHOUT COPY
+                  memcpy(msg + aktnum, rx_frag->msg, rx_frag->size);
+                  aktnum += rx_frag->size;
+                  rx_frag = rx_frag->next;
+                }
 
-          GNUNET_free(msg);
+              free_receive_message(plugin, rx_message);
+              //call wlan_process_helper to process the message
+              wlan_data_massage_handler(plugin, session_light,
+                  (struct GNUNET_MessageHeader*) msg);
+              //wlan_data_helper (plugin, session_light, (struct 
GNUNET_MessageHeader*) msg);
+
+              GNUNET_free(msg);
+            }
         }
     }
 }
@@ -2476,10 +2433,10 @@
 uint64_t
 insert_fragment_in_in_message_queue(struct Plugin * plugin,
     struct Session_light * session_light, struct Session * session,
-    struct FragmentationHeader * fh)
+    struct FragmentationHeader * fh, const struct Radiotap_rx * rxinfo)
 {
-  struct Receive_Fragment_Queue * rec_queue = NULL;
-  struct Receive_Message_Queue * rec_message;
+  struct Receive_Fragment_Queue * rx_frag = NULL;
+  struct Receive_Message_Queue * rx_message;
   const char * tempmsg = (char*) &fh[1];
   uint64_t retval = 0;
 
@@ -2487,23 +2444,23 @@
   //check if message_id is right or it is a new msg
   GNUNET_assert(fh != NULL);
 
-  rec_message = get_receive_message(plugin, session, ntohs(fh->message_id));
+  rx_message = get_receive_message(plugin, session, ntohs(fh->message_id));
 
-  if (rec_message == NULL)
+  if (rx_message == NULL)
     {
       if (session->fragment_messages_in_count < MESSAGES_IN_QUEUE_PER_SESSION)
         {
 
           //new message incoming
-          rec_message = GNUNET_malloc(sizeof (struct Receive_Message_Queue));
-          rec_message->message_id_in = ntohs(fh->message_id);
-          rec_message->rec_size = MESSAGE_LENGHT_UNKNOWN;
-          rec_message->session = session;
-          rec_message->timeout = GNUNET_TIME_absolute_add(
+          rx_message = GNUNET_malloc(sizeof (struct Receive_Message_Queue));
+          rx_message->message_id_in = ntohs(fh->message_id);
+          rx_message->rec_size = MESSAGE_LENGHT_UNKNOWN;
+          rx_message->session = session;
+          rx_message->timeout = GNUNET_TIME_absolute_add(
               GNUNET_TIME_absolute_get(), MESSAGE_IN_TIMEOUT);
-          rec_message->received_fragments = 0;
+          rx_message->received_fragments = 0;
 
-          GNUNET_CONTAINER_DLL_insert(plugin->receive_messages_head, 
plugin->receive_messages_teil, rec_message);
+          GNUNET_CONTAINER_DLL_insert(plugin->receive_messages_head, 
plugin->receive_messages_teil, rx_message);
 
           session->fragment_messages_in_count++;
           plugin->pending_receive_messages++;
@@ -2512,7 +2469,7 @@
           GNUNET_log(
               GNUNET_ERROR_TYPE_DEBUG,
               "New fragmented message started: message id %u, messages in for 
this session %u, messages in %u\n",
-              rec_message->message_id_in, session->fragment_messages_in_count,
+              rx_message->message_id_in, session->fragment_messages_in_count,
               plugin->pending_receive_messages);
 #endif
         }
@@ -2527,36 +2484,37 @@
         }
     }
 
-  if (is_double_msg(rec_message, fh) != GNUNET_YES)
+  if (is_double_msg(rx_message, fh) != GNUNET_YES)
     {
 
       //report size
-      rec_queue = GNUNET_malloc(sizeof (struct Receive_Fragment_Queue) +
+      rx_frag = GNUNET_malloc(sizeof (struct Receive_Fragment_Queue) +
           ntohs(fh->header.size) - sizeof(struct FragmentationHeader));
-      rec_queue->size = ntohs(fh->header.size)
+      rx_frag->size = ntohs(fh->header.size)
           - sizeof(struct FragmentationHeader);
-      rec_queue->num = ntohs(fh->fragment_off_or_num);
-      rec_queue->msg = (char*) &(rec_queue[1]);
+      rx_frag->num = ntohs(fh->fragment_off_or_num);
+      rx_frag->msg = (char*) &(rx_frag[1]);
       //copy msg to buffer
-      memcpy((char *) rec_queue->msg, tempmsg, rec_queue->size);
-      insert_fragment_in_queue(rec_message, rec_queue);
+      memcpy((char *) rx_frag->msg, tempmsg, rx_frag->size);
+      memcpy((char *) &(rx_frag->rxinfo), rxinfo, sizeof(rxinfo));
+      insert_fragment_in_queue(rx_message, rx_frag);
       //save bitfield
-      retval = rec_message->received_fragments;
+      retval = rx_message->received_fragments;
 
 #if DEBUG_wlan
       GNUNET_log(
           GNUNET_ERROR_TYPE_DEBUG,
           "New fragment:  size %u, fragsize %u, message id %u, bitfield %X, 
session %u\n",
-          rec_message->rec_size, rec_queue->size,
-          rec_message->received_fragments, rec_message->message_id_in, 
session);
+          rx_message->rec_size, rx_frag->size, rx_message->received_fragments,
+          rx_message->message_id_in, session);
 #endif
 
-      check_rec_finished_msg(plugin, session_light, session, rec_message);
+      check_rec_finished_msg(plugin, session_light, session, rx_message);
     }
   else
     {
       GNUNET_log(GNUNET_ERROR_TYPE_INFO, "WLAN fragment is a clone\n");
-      retval = rec_message->received_fragments;
+      retval = rx_message->received_fragments;
 
     }
   return retval;
@@ -2572,7 +2530,7 @@
  */
 static void
 wlan_data_helper(void *cls, struct Session_light * session_light,
-    const struct GNUNET_MessageHeader * hdr)
+    const struct GNUNET_MessageHeader * hdr, const struct Radiotap_rx * rxinfo)
 {
   struct Plugin *plugin = cls;
   struct Session * session = NULL;
@@ -2645,7 +2603,7 @@
       if (session != NULL)
         {
           fragment_bitfield = insert_fragment_in_in_message_queue(plugin,
-              session_light, session, fh);
+              session_light, session, fh, rxinfo);
         }
       else
         {
@@ -2722,21 +2680,16 @@
 
 }
 
-
 const char *
 macprinter(const u_int8_t * mac)
 {
   static char macstr[20];
 
-  GNUNET_snprintf (macstr,
-                  sizeof (macstr),
-                  "%X:%X:%X:%X:%X:%X", 
-                  mac[0], mac[1], mac[2],
-                  mac[3], mac[4], mac[5]);
+  GNUNET_snprintf(macstr, sizeof(macstr), "%X:%X:%X:%X:%X:%X", mac[0], mac[1],
+      mac[2], mac[3], mac[4], mac[5]);
   return macstr;
 }
 
-
 /**
  * Function used for to process the data from the suid process
  *
@@ -2745,13 +2698,13 @@
  * @param hdr header of the GNUNET_MessageHeader
  */
 static void
-wlan_process_helper (void *cls, 
-                    void *client,
-                    const struct GNUNET_MessageHeader *hdr)
+wlan_process_helper(void *cls, void *client,
+    const struct GNUNET_MessageHeader *hdr)
 {
   struct Plugin *plugin = cls;
   struct ieee80211_frame * wlanIeeeHeader = NULL;
   struct Session_light * session_light = NULL;
+  struct Radiotap_rx * rxinfo;
   const struct GNUNET_MessageHeader * temp_hdr = NULL;
 
   int datasize = 0;
@@ -2759,109 +2712,108 @@
 
   switch (ntohs(hdr->type))
     {
-    case GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA:
+  case GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA:
 #if DEBUG_wlan
-      GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-                "Func wlan_process_helper got  
GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA size: %u\n",
-                ntohs(hdr->size));
+    GNUNET_log(
+        GNUNET_ERROR_TYPE_DEBUG,
+        "Func wlan_process_helper got  GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA 
size: %u\n",
+        ntohs(hdr->size));
 #endif
 
-      //call wlan_process_helper with the message inside, later with wlan: 
analyze signal
-      if (ntohs(hdr->size) < sizeof(struct ieee80211_frame) + sizeof(struct 
GNUNET_MessageHeader))
-       {
-         GNUNET_break (0);
-         /* FIXME: restart SUID process */
-         return;
-       }
-      wlanIeeeHeader = (struct ieee80211_frame *) &hdr[1];
+    //call wlan_process_helper with the message inside, later with wlan: 
analyze signal
+    if (ntohs(hdr->size) < sizeof(struct ieee80211_frame)
+        + sizeof(struct GNUNET_MessageHeader) + sizeof(struct Radiotap_rx))
+      {
+        GNUNET_break (0);
+        /* FIXME: restart SUID process */
+        return;
+      }
+    rxinfo = (struct Radiotap_rx *) &hdr[1];
+    wlanIeeeHeader = (struct ieee80211_frame *) &rxinfo[1];
 
-      //process only if it is an broadcast or for this computer both with the 
gnunet bssid
+    //process only if it is an broadcast or for this computer both with the 
gnunet bssid
 
-      //check for bssid
-      if (memcmp(&(wlanIeeeHeader->i_addr3), mac_bssid,
-          sizeof(struct MacAddress)) == 0)
-        {
-          //check for broadcast or mac
-          if (memcmp(&(wlanIeeeHeader->i_addr1), bc_all_mac,
-              sizeof(struct MacAddress) == 0) || memcmp(
-              &(wlanIeeeHeader->i_addr1), &(plugin->mac_address),
-              sizeof(struct MacAddress)) == 0)
-            {
+    //check for bssid
+    if (memcmp(&(wlanIeeeHeader->i_addr3), mac_bssid, sizeof(struct 
MacAddress))
+        == 0)
+      {
+        //check for broadcast or mac
+        if (memcmp(&(wlanIeeeHeader->i_addr1), bc_all_mac,
+            sizeof(struct MacAddress) == 0) || memcmp(
+            &(wlanIeeeHeader->i_addr1), &(plugin->mac_address),
+            sizeof(struct MacAddress)) == 0)
+          {
 
-              // process the inner data
+            // process the inner data
 
 
-              datasize = ntohs(hdr->size) - sizeof(struct ieee80211_frame)
-                  - sizeof(struct GNUNET_MessageHeader);
+            datasize = ntohs(hdr->size) - sizeof(struct ieee80211_frame)
+                - sizeof(struct GNUNET_MessageHeader);
 
-              session_light = GNUNET_malloc(sizeof(struct Session_light));
-              memcpy(session_light->addr, &(wlanIeeeHeader->i_addr2),
-                  sizeof(struct MacAddress));
-              //session_light->session = 
search_session(plugin,session_light->addr);
+            session_light = GNUNET_malloc(sizeof(struct Session_light));
+            memcpy(session_light->addr, &(wlanIeeeHeader->i_addr2),
+                sizeof(struct MacAddress));
+            //session_light->session = 
search_session(plugin,session_light->addr);
 
-              pos = 0;
-              temp_hdr = (struct GNUNET_MessageHeader *) &wlanIeeeHeader[1];
-              while (pos < datasize)
-                {
-                  temp_hdr = (struct GNUNET_MessageHeader *) &wlanIeeeHeader[1]
-                      + pos;
+            pos = 0;
+            temp_hdr = (struct GNUNET_MessageHeader *) &wlanIeeeHeader[1];
+            while (pos < datasize)
+              {
+                temp_hdr = (struct GNUNET_MessageHeader *) &wlanIeeeHeader[1]
+                    + pos;
 
-                  wlan_data_helper(plugin, session_light, temp_hdr);
-                  pos += ntohs(temp_hdr->size);
+                wlan_data_helper(plugin, session_light, temp_hdr, rxinfo);
+                pos += ntohs(temp_hdr->size);
 
-                }
+              }
 
-              //clean up
-              GNUNET_free(session_light);
-            }
-          else
-            {
+            //clean up
+            GNUNET_free(session_light);
+          }
+        else
+          {
 #if DEBUG_wlan
-              GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-                  "Func wlan_process_helper got wrong MAC: %s\n", macprinter(
-                      wlanIeeeHeader->i_addr1));
+            GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+                "Func wlan_process_helper got wrong MAC: %s\n", macprinter(
+                    wlanIeeeHeader->i_addr1));
 #endif
-            }
-        }
-      else
-        {
+          }
+      }
+    else
+      {
 #if DEBUG_wlan
-          GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-              "Func wlan_process_helper got wrong BSSID: %s\n", macprinter(
-                  wlanIeeeHeader->i_addr2));
+        GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+            "Func wlan_process_helper got wrong BSSID: %s\n", macprinter(
+                wlanIeeeHeader->i_addr2));
 #endif
-        }
-      break;
-    case GNUNET_MESSAGE_TYPE_WLAN_HELPER_CONTROL:
-      //TODO more control messages
-      //TODO use struct wlan_helper_control
-      if (ntohs(hdr->size) != sizeof(struct Wlan_Helper_Control_Message))
-        {
-         GNUNET_break (0);
-         /* FIXME: restart SUID process */       
-         return;
-       }
-      memcpy (&plugin->mac_address, 
-             &hdr[1], 
-             sizeof(struct MacAddress));
+      }
+    break;
+  case GNUNET_MESSAGE_TYPE_WLAN_HELPER_CONTROL:
+    //TODO more control messages
+    //TODO use struct wlan_helper_control
+    if (ntohs(hdr->size) != sizeof(struct Wlan_Helper_Control_Message))
+      {
+        GNUNET_break (0);
+        /* FIXME: restart SUID process */
+        return;
+      }
+    memcpy(&plugin->mac_address, &hdr[1], sizeof(struct MacAddress));
 #if DEBUG_WLAN
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                 "Received WLAN_HELPER_CONTROL message with transport of 
address %s\n",
-                 wlan_plugin_address_to_string (cls, 
-                                                &plugin->mac_address, 
-                                                sizeof (struct MacAddress)));
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+        "Received WLAN_HELPER_CONTROL message with transport of address %s\n",
+        wlan_plugin_address_to_string (cls,
+            &plugin->mac_address,
+            sizeof (struct MacAddress)));
 #endif
-      plugin->env->notify_address(plugin->env->cls, "wlan",
-                                 &plugin->mac_address, sizeof(struct 
MacAddress),
-                                 GNUNET_TIME_UNIT_FOREVER_REL);
-      break;
-    default:
-      GNUNET_break (0);
-      return;
+    plugin->env->notify_address(plugin->env->cls, "wlan", &plugin->mac_address,
+        sizeof(struct MacAddress), GNUNET_TIME_UNIT_FOREVER_REL);
+    break;
+  default:
+    GNUNET_break (0);
+    return;
     }
 }
 
-
 /**
  * We have been notified that wlan-helper has written something to stdout.
  * Handle the output, then reschedule this function to be called again once

Modified: gnunet/src/transport/plugin_transport_wlan.h
===================================================================
--- gnunet/src/transport/plugin_transport_wlan.h        2011-04-05 07:27:16 UTC 
(rev 14861)
+++ gnunet/src/transport/plugin_transport_wlan.h        2011-04-05 09:02:16 UTC 
(rev 14862)
@@ -43,8 +43,56 @@
   struct MacAddress mac;
 };
 
+/**
+ * Header for messages which need fragmentation
+ */
+struct FragmentationHeader
+{
 
+  struct GNUNET_MessageHeader header;
 
+  /**
+   * ID of message, to distinguish between the messages, picked randomly.
+   */
+  uint32_t message_id GNUNET_PACKED;
+
+  /**
+   * Offset or number of this fragment, for fragmentation/segmentation (design 
choice, TBD)
+   */
+  uint16_t fragment_off_or_num GNUNET_PACKED;
+
+  /**
+   * CRC of fragment (for error checking)
+   */
+  uint16_t message_crc GNUNET_PACKED;
+
+// followed by payload
+
+};
+
+/**
+ * Header for messages which need fragmentation
+ */
+struct WlanHeader
+{
+
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * checksum/error correction
+   */
+  uint32_t crc GNUNET_PACKED;
+
+  /**
+   * To whom are we talking to (set to our identity
+   * if we are still waiting for the welcome message)
+   */
+  struct GNUNET_PeerIdentity target;
+
+// followed by payload
+
+};
+
 /* Wlan IEEE80211 header default */
 //Informations (in German) 
http://www.umtslink.at/content/WLAN_macheader-196.html
 static const uint8_t u8aIeeeHeader[] = 
@@ -104,7 +152,18 @@
     uint16_t tx_power;
 };
 
-struct rx_info {
+// bit field defines for ri_present
+
+#define has_noise 1
+#define has_power 2
+#define has_channel 4
+
+/**
+ * struct to represent infos gathered form the radiotap fields
+ */
+
+struct Radiotap_rx {
+        uint32_t ri_present;
         uint64_t ri_mactime;
         int32_t ri_power;
         int32_t ri_noise;

Modified: gnunet/src/transport/wlan/loopback_helper.c
===================================================================
--- gnunet/src/transport/wlan/loopback_helper.c 2011-04-05 07:27:16 UTC (rev 
14861)
+++ gnunet/src/transport/wlan/loopback_helper.c 2011-04-05 09:02:16 UTC (rev 
14862)
@@ -45,8 +45,12 @@
   struct sendbuf *write_pout = cls;
   int sendsize;
   struct GNUNET_MessageHeader newheader;
-  unsigned char * from;
-  unsigned char * to;
+  unsigned char * from_data;
+  unsigned char * to_data;
+  //unsigned char * from_radiotap;
+  unsigned char * to_radiotap;
+  //unsigned char * from_start;
+  unsigned char * to_start;
 
   sendsize = ntohs(hdr->size) - sizeof(struct Radiotap_Send);
 
@@ -64,14 +68,20 @@
   newheader.size = htons(sendsize);
   newheader.type = htons(GNUNET_MESSAGE_TYPE_WLAN_HELPER_DATA);
 
-  to = write_pout->buf + write_pout->size;
-  memcpy(to, &newheader, sizeof(struct GNUNET_MessageHeader));
+  to_start = write_pout->buf + write_pout->size;
+  to_radiotap = to_start + sizeof(struct GNUNET_MessageHeader);
+  to_data = to_radiotap + sizeof(struct Radiotap_rx);
+
+  from_data = ((unsigned char *) hdr) + sizeof(struct Radiotap_Send)
+        + sizeof(struct GNUNET_MessageHeader);
+
+
+  memcpy(to_start, &newheader, sizeof(struct GNUNET_MessageHeader));
   write_pout->size += sizeof(struct GNUNET_MessageHeader);
 
-  from = ((unsigned char *) hdr) + sizeof(struct Radiotap_Send)
-      + sizeof(struct GNUNET_MessageHeader);
-  to = write_pout->buf + write_pout->size;
-  memcpy(to, from, sendsize - sizeof(struct GNUNET_MessageHeader));
+  write_pout->size += sizeof(struct Radiotap_rx);
+
+  memcpy(to_data, from_data, sendsize - sizeof(struct GNUNET_MessageHeader));
   write_pout->size += sendsize - sizeof(struct GNUNET_MessageHeader);
 }
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]