gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r24849 - gnunet/src/mesh


From: gnunet
Subject: [GNUnet-SVN] r24849 - gnunet/src/mesh
Date: Thu, 8 Nov 2012 20:25:50 +0100

Author: bartpolot
Date: 2012-11-08 20:25:50 +0100 (Thu, 08 Nov 2012)
New Revision: 24849

Modified:
   gnunet/src/mesh/gnunet-service-mesh.c
   gnunet/src/mesh/mesh_block_lib.c
   gnunet/src/mesh/mesh_block_lib.h
   gnunet/src/mesh/mesh_common.c
   gnunet/src/mesh/plugin_block_mesh.c
Log:
MESH uses DHT xquery to limit the results returned during a regex string search

Modified: gnunet/src/mesh/gnunet-service-mesh.c
===================================================================
--- gnunet/src/mesh/gnunet-service-mesh.c       2012-11-08 16:50:17 UTC (rev 
24848)
+++ gnunet/src/mesh/gnunet-service-mesh.c       2012-11-08 19:25:50 UTC (rev 
24849)
@@ -1431,6 +1431,7 @@
   struct MeshRegexSearchContext *new_ctx;
   struct MeshRegexSearchInfo *info = ctx->info;
   struct GNUNET_DHT_GetHandle *get_h;
+  char *rest;
 
   int result;
 
@@ -1465,14 +1466,17 @@
   GNUNET_STATISTICS_update (stats, "# regex nodes traversed", 1, GNUNET_NO);
 
   /* Start search in DHT */
+  rest = &new_ctx->info->description[new_ctx->position];
   get_h = 
       GNUNET_DHT_get_start (dht_handle,    /* handle */
                             GNUNET_BLOCK_TYPE_MESH_REGEX, /* type */
                             &ctx->hash,     /* key to search */
                             dht_replication_level, /* replication level */
                             GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE,
-                            NULL,       /* xquery */ // FIXME BLOOMFILTER
-                            0,     /* xquery bits */ // FIXME BLOOMFILTER SIZE
+                            rest, /* xquery */
+                            // FIXME add BLOOMFILTER to exclude filtered peers
+                            strlen(rest) + 1,     /* xquery bits */
+                            // FIXME add BLOOMFILTER SIZE
                             &dht_get_string_handler, new_ctx);
   if (GNUNET_OK !=
       GNUNET_CONTAINER_multihashmap_put(info->dht_get_handles,
@@ -1681,8 +1685,10 @@
                                 dht_replication_level, /* replication level */
                                 GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE |
                                 GNUNET_DHT_RO_RECORD_ROUTE,
-                                NULL,       /* xquery */ // FIXME BLOOMFILTER
-                                0,     /* xquery bits */ // FIXME BLOOMFILTER 
SIZE
+                                NULL, /* xquery */
+                                // FIXME add BLOOMFILTER to exclude filtered 
peers
+                                0,     /* xquery bits */
+                                // FIXME add BLOOMFILTER SIZE
                                 &dht_get_string_accept_handler, ctx);
   GNUNET_break (GNUNET_OK ==
                 GNUNET_CONTAINER_multihashmap_put(ctx->info->dht_get_handles,
@@ -7551,7 +7557,7 @@
   string = (const char *) &msg[1];
 
   /* Initialize context */
-  size = GNUNET_REGEX_get_first_key(string, len, &key);
+  size = GNUNET_REGEX_get_first_key (string, len, &key);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "  consumed %u bits out of %u\n", size, len);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -7579,8 +7585,10 @@
                                 &key,     /* key to search */
                                 dht_replication_level, /* replication level */
                                 GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE,
-                                NULL,       /* xquery */ // FIXME BLOOMFILTER
-                                0,     /* xquery bits */ // FIXME BLOOMFILTER 
SIZE
+                                &info->description[size],           /* xquery 
*/
+                                // FIXME add BLOOMFILTER to exclude filtered 
peers
+                                len + 1 - size,                /* xquery bits 
*/
+                                // FIXME add BLOOMFILTER SIZE
                                 &dht_get_string_handler, ctx);
 
   GNUNET_break (GNUNET_OK ==

Modified: gnunet/src/mesh/mesh_block_lib.c
===================================================================
--- gnunet/src/mesh/mesh_block_lib.c    2012-11-08 16:50:17 UTC (rev 24848)
+++ gnunet/src/mesh/mesh_block_lib.c    2012-11-08 19:25:50 UTC (rev 24849)
@@ -24,10 +24,15 @@
 #include "platform.h"
 #include "mesh_block_lib.h"
 
+struct mesh_block_xquery_ctx {
+  const char *xquery;
+  int found;
+};
+
 /**
- * Noop iterator over all edges in a block.
+ * Iterator over all edges in a block, checking for a presence of a given 
query.
  *
- * @param cls Closure, not used.
+ * @param cls Closure, (xquery context).
  * @param token Token that follows to next state.
  * @param len Lenght of token.
  * @param key Hash of next state.
@@ -40,7 +45,28 @@
             size_t len,
             const struct GNUNET_HashCode *key)
 {
-  return GNUNET_YES;
+  struct mesh_block_xquery_ctx *ctx = cls;
+  char *s;
+
+  s = strndup (token, len);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  edge %s [%u]\n", s, len);
+  GNUNET_free (s);
+  if (strlen (ctx->xquery) < len)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  too long!\n");
+    return GNUNET_YES;
+  }
+  if (0 == strncmp (ctx->xquery, token, len))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  OK!\n");
+    ctx->found = GNUNET_OK;
+  }
+  else
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "  KO!\n");
+  }
+
+  return GNUNET_YES; // keep checking for malformed data!
 }
 
 
@@ -49,14 +75,29 @@
  *
  * @param block The start of the block.
  * @param size The size of the block.
+ * @param xquery String describing the edge we are looking for.
  *
- * @return GNUNET_OK in case it's fine, GNUNET_SYSERR otherwise.
+ * @return GNUNET_OK in case it's fine.
+ *         GNUNET_NO in case the xquery is not found.
+ *         GNUNET_SYSERR if the block is invalid.
  */
 int
 GNUNET_MESH_regex_block_check (const struct MeshRegexBlock *block,
-                               size_t size)
+                               size_t size,
+                               const char *xquery)
 {
-  return GNUNET_MESH_regex_block_iterate(block, size, &check_edge, NULL);
+  int res;
+  struct mesh_block_xquery_ctx ctx;
+
+  ctx.xquery = xquery;
+  ctx.found = GNUNET_NO;
+  res = GNUNET_MESH_regex_block_iterate (block, size, &check_edge, &ctx);
+  if (GNUNET_SYSERR == res)
+    return GNUNET_SYSERR;
+
+  if (GNUNET_YES == ntohl(block->accepting) && xquery[0] == '\0')
+    return GNUNET_OK;
+  return ctx.found;
 }
 
 

Modified: gnunet/src/mesh/mesh_block_lib.h
===================================================================
--- gnunet/src/mesh/mesh_block_lib.h    2012-11-08 16:50:17 UTC (rev 24848)
+++ gnunet/src/mesh/mesh_block_lib.h    2012-11-08 19:25:50 UTC (rev 24849)
@@ -43,19 +43,23 @@
  *
  * @param block The start of the block.
  * @param size The size of the block.
+ * @param xquery String describing the edge we are looking for.
  *
- * @return GNUNET_OK in case it's fine, GNUNET_SYSERR otherwise.
+ * @return GNUNET_OK in case it's fine.
+ *         GNUNET_NO in case the xquery is not found.
+ *         GNUNET_SYSERR if the block is invalid.
  */
 int
 GNUNET_MESH_regex_block_check (const struct MeshRegexBlock *block,
-                               size_t size);
+                               size_t size,
+                               const char *xquery);
 
 /**
  * Iterator over edges in a block.
  *
  * @param cls Closure.
  * @param token Token that follows to next state.
- * @param len Lenght of token.
+ * @param len Length of token.
  * @param key Hash of next state.
  *
  * @return GNUNET_YES if should keep iterating, GNUNET_NO otherwise.

Modified: gnunet/src/mesh/mesh_common.c
===================================================================
--- gnunet/src/mesh/mesh_common.c       2012-11-08 16:50:17 UTC (rev 24848)
+++ gnunet/src/mesh/mesh_common.c       2012-11-08 19:25:50 UTC (rev 24849)
@@ -144,6 +144,11 @@
     case 267: return "GNUNET_MESSAGE_TYPE_MESH_ACK"; break;
 
       /**
+       * POLL for ACK.
+       */
+    case 268: return "GNUNET_MESSAGE_TYPE_MESH_POLL"; break;
+
+      /**
        * Connect to the mesh service, specifying subscriptions
        */
     case 272: return "GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT"; break;

Modified: gnunet/src/mesh/plugin_block_mesh.c
===================================================================
--- gnunet/src/mesh/plugin_block_mesh.c 2012-11-08 16:50:17 UTC (rev 24848)
+++ gnunet/src/mesh/plugin_block_mesh.c 2012-11-08 19:25:50 UTC (rev 24849)
@@ -67,108 +67,138 @@
 
   switch (type)
   {
-  case GNUNET_BLOCK_TYPE_MESH_PEER:
-    if (0 != xquery_size)
-    {
-      GNUNET_break_op (0);
-      return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
-    }
-    if (NULL == reply_block)
-      return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
-    if (sizeof (struct PBlock) != reply_block_size)  
-      return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;  
-    return GNUNET_BLOCK_EVALUATION_OK_LAST;
-  case GNUNET_BLOCK_TYPE_MESH_PEER_BY_TYPE:
-    /* FIXME: have an xquery? not sure */
-    if (0 != xquery_size)
-    {
-      GNUNET_break_op (0);
-      return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
-    }
-    if (NULL == reply_block)
-      return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
-    if (sizeof (struct PBlock) != reply_block_size)
-    {
-      GNUNET_break_op(0);
-      return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
-    }
-    if (NULL != bf)
-    {
-      GNUNET_CRYPTO_hash (reply_block, reply_block_size, &chash);
-      GNUNET_BLOCK_mingle_hash (&chash, bf_mutator, &mhash);
-      if (NULL != *bf)
+    case GNUNET_BLOCK_TYPE_MESH_PEER:
+      if (0 != xquery_size)
       {
-        if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test (*bf, &mhash))
-          return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE;
+        GNUNET_break_op (0);
+        return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
       }
-      else
+      if (NULL == reply_block)
+        return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
+      if (sizeof (struct PBlock) != reply_block_size)  
+        return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;  
+      return GNUNET_BLOCK_EVALUATION_OK_LAST;
+
+
+    case GNUNET_BLOCK_TYPE_MESH_PEER_BY_TYPE:
+      /* FIXME: have an xquery? not sure */
+      if (0 != xquery_size)
       {
-        *bf = GNUNET_CONTAINER_bloomfilter_init (NULL, 8, BLOOMFILTER_K);
+        GNUNET_break_op (0);
+        return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
       }
-      GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash);
-    }
-    return GNUNET_BLOCK_EVALUATION_OK_MORE;
-  case GNUNET_BLOCK_TYPE_MESH_REGEX:
-    if (0 != xquery_size)
-    {
-      GNUNET_break_op (0);
-      return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
-    }
-    if (NULL == reply_block)
-      return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
-    if (GNUNET_OK != GNUNET_MESH_regex_block_check (reply_block,
-                                                    reply_block_size))
-    {
-      GNUNET_break_op(0);
-      return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
-    }
-    if (NULL != bf)
-    {
-      GNUNET_CRYPTO_hash (reply_block, reply_block_size, &chash);
-      GNUNET_BLOCK_mingle_hash (&chash, bf_mutator, &mhash);
-      if (NULL != *bf)
+      if (NULL == reply_block)
+        return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
+      if (sizeof (struct PBlock) != reply_block_size)
       {
-        if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test (*bf, &mhash))
-          return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE;
+        GNUNET_break_op(0);
+        return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
       }
-      else
+      if (NULL != bf)
       {
-        *bf = GNUNET_CONTAINER_bloomfilter_init (NULL, 8, BLOOMFILTER_K);
+        GNUNET_CRYPTO_hash (reply_block, reply_block_size, &chash);
+        GNUNET_BLOCK_mingle_hash (&chash, bf_mutator, &mhash);
+        if (NULL != *bf)
+        {
+          if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test (*bf, &mhash))
+            return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE;
+        }
+        else
+        {
+          *bf = GNUNET_CONTAINER_bloomfilter_init (NULL, 8, BLOOMFILTER_K);
+        }
+        GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash);
       }
-      GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash);
-    }
-    return GNUNET_BLOCK_EVALUATION_OK_MORE;
-  case GNUNET_BLOCK_TYPE_MESH_REGEX_ACCEPT:
-    if (0 != xquery_size)
-    {
-      GNUNET_break_op (0);
-      return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
-    }
-    if (NULL == reply_block)
-      return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
-    if (sizeof (struct MeshRegexAccept) != reply_block_size)
-    {
-      GNUNET_break_op(0);
-      return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
-    }
-    if (NULL != bf)
-    {
-      GNUNET_CRYPTO_hash (reply_block, reply_block_size, &chash);
-      GNUNET_BLOCK_mingle_hash (&chash, bf_mutator, &mhash);
-      if (NULL != *bf)
+      return GNUNET_BLOCK_EVALUATION_OK_MORE;
+
+
+    case GNUNET_BLOCK_TYPE_MESH_REGEX:
+      if (NULL == reply_block)
+        return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
+      if (0 != xquery_size)
       {
-        if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test (*bf, &mhash))
-          return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE;
+        char *query;
+
+        query = (char *) xquery;
+        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "BLOCK XQUERY %s\n", query);
+        if ('\0' != query[xquery_size - 1]) // must be valid string
+        {
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Block xquery not a valid string\n");
+          return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
+        }
       }
       else
       {
-        *bf = GNUNET_CONTAINER_bloomfilter_init (NULL, 8, BLOOMFILTER_K);
+        return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
       }
-      GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash);
-    }
-    return GNUNET_BLOCK_EVALUATION_OK_MORE;
-  default:
-    return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED;
+      switch (GNUNET_MESH_regex_block_check (reply_block,
+                                             reply_block_size,
+                                             xquery))
+      {
+        case GNUNET_SYSERR:
+          GNUNET_break_op(0);
+          /* fall thru */
+        case GNUNET_NO:
+          GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                      "BLOCK XQUERY %s not accepted\n", xquery);
+          return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
+        default:
+          GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                      "BLOCK XQUERY %s accepted\n", xquery);
+          break;
+      }
+      if (NULL != bf)
+      {
+        GNUNET_CRYPTO_hash (reply_block, reply_block_size, &chash);
+        GNUNET_BLOCK_mingle_hash (&chash, bf_mutator, &mhash);
+        if (NULL != *bf)
+        {
+          if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test (*bf, &mhash))
+            return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE;
+        }
+        else
+        {
+          *bf = GNUNET_CONTAINER_bloomfilter_init (NULL, 8, BLOOMFILTER_K);
+        }
+        GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash);
+      }
+      return GNUNET_BLOCK_EVALUATION_OK_MORE;
+
+
+    case GNUNET_BLOCK_TYPE_MESH_REGEX_ACCEPT:
+      if (0 != xquery_size)
+      {
+        GNUNET_break_op (0);
+        return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID;
+      }
+      if (NULL == reply_block)
+        return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
+      if (sizeof (struct MeshRegexAccept) != reply_block_size)
+      {
+        GNUNET_break_op(0);
+        return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
+      }
+      if (NULL != bf)
+      {
+        GNUNET_CRYPTO_hash (reply_block, reply_block_size, &chash);
+        GNUNET_BLOCK_mingle_hash (&chash, bf_mutator, &mhash);
+        if (NULL != *bf)
+        {
+          if (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test (*bf, &mhash))
+            return GNUNET_BLOCK_EVALUATION_OK_DUPLICATE;
+        }
+        else
+        {
+          *bf = GNUNET_CONTAINER_bloomfilter_init (NULL, 8, BLOOMFILTER_K);
+        }
+        GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash);
+      }
+      return GNUNET_BLOCK_EVALUATION_OK_MORE;
+
+
+    default:
+      return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED;
   }
 }
 




reply via email to

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