eliminating last dependency on util code from wlan helper by inlining
authorChristian Grothoff <christian@grothoff.org>
Tue, 6 Dec 2011 20:07:08 +0000 (20:07 +0000)
committerChristian Grothoff <christian@grothoff.org>
Tue, 6 Dec 2011 20:07:08 +0000 (20:07 +0000)
src/include/gnunet_common.h
src/include/gnunet_network_lib.h
src/include/gnunet_server_lib.h
src/transport/Makefile.am
src/transport/gnunet-transport-wlan-helper.c
src/util/pseudonym.c

index 167187c23e1110df352c65fe6d14c5ad5e8b7a4e..f57c18cb7bfe7cf49709e1fdf3aee80ef4b9a647 100644 (file)
  */
 #define GNUNET_UTIL_VERSION 0x00090000
 
-/**
- * Name used for "services" that are actually command-line
- * programs invoked by the end user.
- */
-#define GNUNET_CLIENT_SERVICE_NAME "client"
-
 /**
  * Named constants for return values.  The following
  * invariants hold: "GNUNET_NO == 0" (to allow "if (GNUNET_NO)")
index 67ff11781d05e53ebd20943ff34092ea7b975f92..a14d5f0bb6fd0d87c2d3287071dfe3a88c2e6084 100644 (file)
@@ -89,7 +89,6 @@ GNUNET_NETWORK_socket_accept (const struct GNUNET_NETWORK_Handle *desc,
                               socklen_t * address_len);
 
 
-#ifdef MINGW
 /**
  * Box a native socket (and check that it is a socket).
  *
@@ -98,7 +97,6 @@ GNUNET_NETWORK_socket_accept (const struct GNUNET_NETWORK_Handle *desc,
  */
 struct GNUNET_NETWORK_Handle *
 GNUNET_NETWORK_socket_box_native (SOCKTYPE fd);
-#endif
 
 
 /**
index c39349c921f81db73ceb1533b57486ecbc9044cd..2856fd8388343495fa1ce21b1b03609df2f85d7c 100644 (file)
@@ -46,7 +46,7 @@ extern "C"
 #define GNUNET_SERVER_MAX_MESSAGE_SIZE 65536
 
 /**
- * Largest supported message.
+ * Smallest supported message.
  */
 #define GNUNET_SERVER_MIN_BUFFER_SIZE sizeof (struct GNUNET_MessageHeader)
 
index 92f3ac8c8ec270608f0ab3aeb822f607f236aea1..6901f6b4db1e3bab359cc348b7b3b5090ea22302 100644 (file)
@@ -109,8 +109,6 @@ gnunet_transport_certificate_creation_LDADD = \
 
 gnunet_transport_wlan_helper_SOURCES = \
  gnunet-transport-wlan-helper.c
-gnunet_transport_wlan_helper_LDADD = \
-  $(top_builddir)/src/util/libgnunetutil.la 
 
 gnunet_transport_wlan_helper_dummy_SOURCES = \
  gnunet-transport-wlan-helper-dummy.c
index f4798c2d93c9f0ac1e0ce5934f1974f2c2aaebc6..28e6b402f98c22edf5cf269faaa0849c3c774ade 100644 (file)
 #include <stdint.h>
 
 #include "gnunet_protocols.h"
-#include "gnunet_server_lib.h"
 #include "plugin_transport_wlan.h"
 
 #define ARPHRD_IEEE80211        801
@@ -446,6 +445,305 @@ struct ieee80211_radiotap_iterator
 };
 
 
+
+/* specialized version of server_mst.c begins here */
+
+#define ALIGN_FACTOR 8
+
+/**
+ * Smallest supported message.
+ */
+#define GNUNET_SERVER_MIN_BUFFER_SIZE sizeof (struct GNUNET_MessageHeader)
+
+
+/**
+ * Functions with this signature are called whenever a
+ * complete message is received by the tokenizer.
+ *
+ * @param cls closure
+ * @param client identification of the client
+ * @param message the actual message
+ */
+typedef void (*GNUNET_SERVER_MessageTokenizerCallback) (void *cls, void *client,
+                                                        const struct
+                                                        GNUNET_MessageHeader *
+                                                        message);
+
+/**
+ * Handle to a message stream tokenizer.
+ */
+struct GNUNET_SERVER_MessageStreamTokenizer
+{
+
+  /**
+   * Function to call on completed messages.
+   */
+  GNUNET_SERVER_MessageTokenizerCallback cb;
+
+  /**
+   * Closure for cb.
+   */
+  void *cb_cls;
+
+  /**
+   * Size of the buffer (starting at 'hdr').
+   */
+  size_t curr_buf;
+
+  /**
+   * How many bytes in buffer have we already processed?
+   */
+  size_t off;
+
+  /**
+   * How many bytes in buffer are valid right now?
+   */
+  size_t pos;
+
+  /**
+   * Beginning of the buffer.  Typed like this to force alignment.
+   */
+  struct GNUNET_MessageHeader *hdr;
+
+};
+
+
+
+/**
+ * Create a message stream tokenizer.
+ *
+ * @param cb function to call on completed messages
+ * @param cb_cls closure for cb
+ * @return handle to tokenizer
+ */
+struct GNUNET_SERVER_MessageStreamTokenizer *
+GNUNET_SERVER_mst_create (GNUNET_SERVER_MessageTokenizerCallback cb,
+                          void *cb_cls)
+{
+  struct GNUNET_SERVER_MessageStreamTokenizer *ret;
+
+  ret = malloc (sizeof (struct GNUNET_SERVER_MessageStreamTokenizer));
+  if (NULL == ret)
+    exit (1);
+  ret->hdr = malloc (GNUNET_SERVER_MIN_BUFFER_SIZE);
+  if (NULL == ret->hdr)
+    exit (2);
+  ret->curr_buf = GNUNET_SERVER_MIN_BUFFER_SIZE;
+  ret->cb = cb;
+  ret->cb_cls = cb_cls;
+  return ret;
+}
+
+
+#define GNUNET_MIN(a,b) (((a) < (b)) ? (a) : (b))
+
+/**
+ * Named constants for return values.  The following
+ * invariants hold: "GNUNET_NO == 0" (to allow "if (GNUNET_NO)")
+ * "GNUNET_OK != GNUNET_SYSERR", "GNUNET_OK != GNUNET_NO", "GNUNET_NO != GNUNET_SYSERR"
+ * and finally "GNUNET_YES != GNUNET_NO".
+ */
+#define GNUNET_OK      1
+#define GNUNET_SYSERR -1
+#define GNUNET_YES     1
+#define GNUNET_NO      0
+
+
+/**
+ * Add incoming data to the receive buffer and call the
+ * callback for all complete messages.
+ *
+ * @param mst tokenizer to use
+ * @param client_identity ID of client for which this is a buffer
+ * @param buf input data to add
+ * @param size number of bytes in buf
+ * @param purge should any excess bytes in the buffer be discarded
+ *       (i.e. for packet-based services like UDP)
+ * @param one_shot only call callback once, keep rest of message in buffer
+ * @return GNUNET_OK if we are done processing (need more data)
+ *         GNUNET_NO if one_shot was set and we have another message ready
+ *         GNUNET_SYSERR if the data stream is corrupt
+ */
+int
+GNUNET_SERVER_mst_receive (struct GNUNET_SERVER_MessageStreamTokenizer *mst,
+                           void *client_identity, const char *buf, size_t size,
+                           int purge, int one_shot)
+{
+  const struct GNUNET_MessageHeader *hdr;
+  size_t delta;
+  uint16_t want;
+  char *ibuf;
+  int need_align;
+  unsigned long offset;
+  int ret;
+
+  ret = GNUNET_OK;
+  ibuf = (char *) mst->hdr;
+  while (mst->pos > 0)
+  {
+do_align:
+    if ((mst->curr_buf - mst->off < sizeof (struct GNUNET_MessageHeader)) ||
+        (0 != (mst->off % ALIGN_FACTOR)))
+    {
+      /* need to align or need more space */
+      mst->pos -= mst->off;
+      memmove (ibuf, &ibuf[mst->off], mst->pos);
+      mst->off = 0;
+    }
+    if (mst->pos - mst->off < sizeof (struct GNUNET_MessageHeader))
+    {
+      delta =
+          GNUNET_MIN (sizeof (struct GNUNET_MessageHeader) -
+                      (mst->pos - mst->off), size);
+      memcpy (&ibuf[mst->pos], buf, delta);
+      mst->pos += delta;
+      buf += delta;
+      size -= delta;
+    }
+    if (mst->pos - mst->off < sizeof (struct GNUNET_MessageHeader))
+    {
+      if (purge)
+      {
+        mst->off = 0;
+        mst->pos = 0;
+      }
+      return GNUNET_OK;
+    }
+    hdr = (const struct GNUNET_MessageHeader *) &ibuf[mst->off];
+    want = ntohs (hdr->size);
+    if (want < sizeof (struct GNUNET_MessageHeader))
+    {
+      // GNUNET_break_op (0);
+      return GNUNET_SYSERR;
+    }
+    if (mst->curr_buf - mst->off < want)
+    {
+      /* need more space */
+      mst->pos -= mst->off;
+      memmove (ibuf, &ibuf[mst->off], mst->pos);
+      mst->off = 0;
+    }
+    if (want > mst->curr_buf)
+    {
+      mst->hdr = realloc (mst->hdr, want);
+      if (NULL == mst->hdr)
+       exit (3);
+      ibuf = (char *) mst->hdr;
+      mst->curr_buf = want;
+    }
+    hdr = (const struct GNUNET_MessageHeader *) &ibuf[mst->off];
+    if (mst->pos - mst->off < want)
+    {
+      delta = GNUNET_MIN (want - (mst->pos - mst->off), size);
+      memcpy (&ibuf[mst->pos], buf, delta);
+      mst->pos += delta;
+      buf += delta;
+      size -= delta;
+    }
+    if (mst->pos - mst->off < want)
+    {
+      if (purge)
+      {
+        mst->off = 0;
+        mst->pos = 0;
+      }
+      return GNUNET_OK;
+    }
+    if (one_shot == GNUNET_SYSERR)
+    {
+      /* cannot call callback again, but return value saying that
+       * we have another full message in the buffer */
+      ret = GNUNET_NO;
+      goto copy;
+    }
+    if (one_shot == GNUNET_YES)
+      one_shot = GNUNET_SYSERR;
+    mst->cb (mst->cb_cls, client_identity, hdr);
+    mst->off += want;
+    if (mst->off == mst->pos)
+    {
+      /* reset to beginning of buffer, it's free right now! */
+      mst->off = 0;
+      mst->pos = 0;
+    }
+  }
+  while (size > 0)
+  {
+    if (size < sizeof (struct GNUNET_MessageHeader))
+      break;
+    offset = (unsigned long) buf;
+    need_align = (0 != offset % ALIGN_FACTOR) ? GNUNET_YES : GNUNET_NO;
+    if (GNUNET_NO == need_align)
+    {
+      /* can try to do zero-copy and process directly from original buffer */
+      hdr = (const struct GNUNET_MessageHeader *) buf;
+      want = ntohs (hdr->size);
+      if (want < sizeof (struct GNUNET_MessageHeader))
+      {
+        // GNUNET_break_op (0);
+        mst->off = 0;
+        return GNUNET_SYSERR;
+      }
+      if (size < want)
+        break;                  /* or not, buffer incomplete, so copy to private buffer... */
+      if (one_shot == GNUNET_SYSERR)
+      {
+        /* cannot call callback again, but return value saying that
+         * we have another full message in the buffer */
+        ret = GNUNET_NO;
+        goto copy;
+      }
+      if (one_shot == GNUNET_YES)
+        one_shot = GNUNET_SYSERR;
+      mst->cb (mst->cb_cls, client_identity, hdr);
+      buf += want;
+      size -= want;
+    }
+    else
+    {
+      /* need to copy to private buffer to align;
+       * yes, we go a bit more spagetti than usual here */
+      goto do_align;
+    }
+  }
+copy:
+  if ((size > 0) && (!purge))
+  {
+    if (size + mst->pos > mst->curr_buf)
+    {
+      mst->hdr = realloc (mst->hdr, size + mst->pos);
+      if (NULL == mst->hdr)
+       exit (4);
+      ibuf = (char *) mst->hdr;
+      mst->curr_buf = size + mst->pos;
+    }
+    // GNUNET_assert (mst->pos + size <= mst->curr_buf);
+    memcpy (&ibuf[mst->pos], buf, size);
+    mst->pos += size;
+  }
+  if (purge)
+    mst->off = 0;
+  return ret;
+}
+
+
+/**
+ * Destroys a tokenizer.
+ *
+ * @param mst tokenizer to destroy
+ */
+void
+GNUNET_SERVER_mst_destroy (struct GNUNET_SERVER_MessageStreamTokenizer *mst)
+{
+  free (mst->hdr);
+  free (mst);
+}
+
+/* end of server_mst.c copy */
+
+
+
+
 /**
  * Radiotap header iteration
  *
@@ -1352,7 +1650,7 @@ main (int argc, char *argv[])
 
   dev.write_pout.size = 0;
   dev.write_pout.pos = 0;
-  stdin_mst = GNUNET_SERVER_mst_create (&stdin_send_hw, &dev);
+  stdin_mst = GNUNET_SERVER_mst_create (&stdin_send_hw, &dev);  
 
   /* send mac to STDOUT first */
   write_std.pos = 0;
index 2a736bc4641aa32133d816b93c5e9d5303179e36..356a83b6b60f18dd26f92c23470029cd07b0176d 100644 (file)
 #define PS_NAMES_DIR    DIR_SEPARATOR_STR "data" DIR_SEPARATOR_STR "pseudonyms" DIR_SEPARATOR_STR "names"    DIR_SEPARATOR_STR
 
 
+/**
+ * Configuration section we use.
+ */
+#define GNUNET_CLIENT_SERVICE_NAME "client"
+
+
+
 /**
  * Registered callbacks for discovery of pseudonyms.
  */