[Top][All Lists]
[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;
}
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r24849 - gnunet/src/mesh,
gnunet <=