gnunet-service-mesh gnunet-service-mesh_new
lib_LTLIBRARIES = \
- libgnunetmesh.la
+ libgnunetmesh.la \
+ libgnunetmeshblock.la
plugin_LTLIBRARIES = \
libgnunet_plugin_block_mesh.la
$(top_builddir)/src/block/libgnunetblock.la \
$(top_builddir)/src/util/libgnunetutil.la
gnunet_service_mesh_DEPENDENCIES = \
- $(top_builddir)/src/core/libgnunetcore.la\
+ $(top_builddir)/src/core/libgnunetcore.la \
$(top_builddir)/src/dht/libgnunetdht.la \
$(top_builddir)/src/util/libgnunetutil.la
gnunet-service-mesh_new.c \
mesh_tunnel_tree.c mesh_tunnel_tree.h
gnunet_service_mesh_new_LDADD = \
+ libgnunetmeshblock.la \
$(top_builddir)/src/core/libgnunetcore.la\
$(top_builddir)/src/dht/libgnunetdht.la \
$(top_builddir)/src/regex/libgnunetregex.la \
$(GN_LIB_LDFLAGS) $(WINFLAGS) \
-version-info 1:0:0
+libgnunetmeshblock_la_SOURCES = \
+ mesh_block_lib.c
+libgnunetmeshblock_la_LIBADD = \
+ $(top_builddir)/src/util/libgnunetutil.la \
+ $(XLIB) \
+ $(LTLIBINTL)
+libgnunetmeshblock_la_LDFLAGS = \
+ $(GN_LIB_LDFLAGS) $(WINFLAGS) \
+ -version-info 1:0:0
+
+
check_PROGRAMS = \
test_mesh_api \
test_mesh_tree_api \
size_t len;
// FIXME: does proof have to be NULL terminated?
+ ctx->dht_get_handle = NULL;
proof = (char *) &block[1];
if (GNUNET_OK != GNUNET_REGEX_check_proof (proof, key))
{
return;
}
// FIXME complete
+ ctx->n_dht_gets++;
+ ctx->dht_get_handle = GNUNET_realloc (ctx->dht_get_handle,
+ sizeof(struct GNUNET_DHT_GetHandle *)
+ * ctx->n_dht_gets);
+
+ /* Start search in DHT */
+ ctx->dht_get_handle[ctx->n_dht_gets - 1] =
+ GNUNET_DHT_get_start (dht_handle, /* handle */
+ GNUNET_BLOCK_TYPE_MESH_REGEX, /* type */
+ &key, /* key to search */
+ DHT_REPLICATION_LEVEL, /* replication level */
+ GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE,
+ NULL, /* xquery */ // FIXME BLOOMFILTER
+ 0, /* xquery bits */ // FIXME BLOOMFILTER SIZE
+ &dht_get_string_handler, ctx);
return;
}
--- /dev/null
+/*
+ This file is part of GNUnet.
+ (C) 2001 - 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
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ 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.
+*/
+
+/**
+ * @author Bartlomiej Polot
+ * @file mesh/mesh_block_lib.c
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#if 0
+ /* keep Emacsens' auto-indent happy */
+}
+#endif
+#endif
+
+#include "mesh_block_lib.h"
+
+/**
+ * Iterator over edges in a block.
+ *
+ * @param cls Closure.
+ * @param token Token that follows to next state.
+ * @param len Lenght of token.
+ * @param key Hash of next state.
+ */
+static int
+check_edge (void *cls,
+ const char *token,
+ size_t len,
+ const struct GNUNET_HashCode *key)
+{
+ return GNUNET_YES;
+}
+
+
+/**
+ * Check if the regex block is well formed, including all edges
+ *
+ * @param block The start of the block.
+ * @param size The size of the block.
+ *
+ * @return GNUNET_OK in case it's fine, GNUNET_SYSERR otherwise.
+ */
+int
+GNUNET_MESH_regex_block_check (const struct MeshRegexBlock *block,
+ size_t size)
+{
+ return GNUNET_MESH_regex_block_iterate(NULL, block, size, &check_edge);
+}
+
+
+/**
+ * Iterate over all edges of a block of a regex state.
+ *
+ * @param cls Closure for the iterator.
+ * @param block Block to iterate over.
+ * @param size Size of block.
+ * @param iterator Function to call on each edge in the block.
+ *
+ * @return How many bytes of block have been processed
+ */
+int
+GNUNET_MESH_regex_block_iterate (void *cls,
+ const struct MeshRegexBlock *block,
+ size_t size,
+ GNUNET_MESH_EgdeIterator iterator)
+{
+ struct MeshRegexEdge *edge;
+ unsigned int n;
+ unsigned int n_token;
+ unsigned int i;
+ size_t offset;
+ char *aux;
+
+ offset = sizeof (struct MeshRegexBlock);
+ if (offset > size) // Is it safe to access the regex block?
+ return GNUNET_SYSERR;
+ n = ntohl (block->n_proof);
+ offset =+ n;
+ if (offset > size) // Is it safe to access the regex proof?
+ return GNUNET_SYSERR;
+ aux = (char *) &block[1]; // Skip regex block
+ aux = &aux[n]; // Skip regex proof
+ n = ntohl (block->n_edges);
+ for (i = 0; i < n; n++) // aux always points at the end of the previous block
+ {
+ offset += sizeof (struct MeshRegexEdge);
+ if (offset > size) // Is it safe to access the next edge block?
+ return GNUNET_SYSERR;
+ edge = (struct MeshRegexEdge *) aux;
+ n_token = ntohl (edge->n_token);
+ offset += n_token;
+ if (offset > size) // Is it safe to access the edge token?
+ return GNUNET_SYSERR;
+ aux = (char *) &edge[1]; // Skip edge block
+ if (NULL != iterator)
+ if (GNUNET_NO == iterator (cls, aux, n_token, &edge->key))
+ return GNUNET_OK;
+ aux = &aux[n_token]; // Skip edge token
+ }
+ // The total size should be exactly the size of (regex + all edges) blocks
+ return (offset == size) ? GNUNET_OK : GNUNET_SYSERR;
+}
+
+#if 0 /* keep Emacsens' auto-indent happy */
+{
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+/* end of mesh_protocol.h */
--- /dev/null
+/*
+ This file is part of GNUnet.
+ (C) 2012 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
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ 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.
+*/
+
+/**
+ * @author Bartlomiej Polot
+ * @file mesh/mesh_block_lib.h
+ */
+
+#ifndef MESH_BLOCK_LIB_H_
+#define MESH_BLOCK_LIB_H_
+
+#ifdef __cplusplus
+extern "C"
+{
+#if 0
+ /* keep Emacsens' auto-indent happy */
+}
+#endif
+#endif
+
+#include "platform.h"
+#include "block_mesh.h"
+
+/**
+ * Check if the regex block is well formed, including all edges
+ *
+ * @param block The start of the block.
+ * @param size The size of the block.
+ *
+ * @return GNUNET_OK in case it's fine, GNUNET_SYSERR otherwise.
+ */
+int
+GNUNET_MESH_regex_block_check (const struct MeshRegexBlock *block,
+ size_t size);
+
+/**
+ * Iterator over edges in a block.
+ *
+ * @param cls Closure.
+ * @param token Token that follows to next state.
+ * @param len Lenght of token.
+ * @param key Hash of next state.
+ *
+ * @return GNUNET_YES if should keep iterating, GNUNET_NO otherwise.
+ */
+typedef int (*GNUNET_MESH_EgdeIterator)(void *cls,
+ const char *token,
+ size_t len,
+ const struct GNUNET_HashCode *key);
+
+
+/**
+ * Iterate over all edges of a block of a regex state.
+ *
+ * @param cls Closure for the iterator.
+ * @param block Block to iterate over.
+ * @param size Size of block.
+ * @param iterator Function to call on each edge in the block.
+ *
+ * @return GNUNET_SYSERR if an error has been encountered, GNUNET_OK otherwise
+ */
+int
+GNUNET_MESH_regex_block_iterate (void *cls,
+ const struct MeshRegexBlock *block,
+ size_t size,
+ GNUNET_MESH_EgdeIterator iterator);
+
+#if 0 /* keep Emacsens' auto-indent happy */
+{
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+/* ifndef MESH_BLOCK_LIB_H */
+#endif
+/* end of mesh_block_lib.h */
}
#endif
-/* ifndef MES_PROTOCOL_H */
+/* ifndef MESH_PROTOCOL_H */
#endif
/* end of mesh_protocol.h */
#include "platform.h"
#include "gnunet_block_plugin.h"
#include "block_mesh.h"
+#include "mesh_block_lib.h"
/**
* Number of bits we set per entry in the bloomfilter.
#define BLOOMFILTER_K 16
-/**
- * Check if the regex block is well formed, including all edges
- *
- * @param block The start of the block.
- * @param size The size of the block.
- *
- * @return GNUNET_OK in case it's fine, GNUNET_SYSERR otherwise.
- */
-static int
-check_mesh_regex_block (const struct MeshRegexBlock *block, size_t size)
-{
- struct MeshRegexEdge *edge;
- unsigned int n;
- unsigned int n_token;
- unsigned int i;
- size_t offset;
- char *aux;
-
- offset = sizeof (struct MeshRegexBlock);
- if (offset > size) // Is it safe to access the regex block?
- return GNUNET_SYSERR;
- n = ntohl (block->n_proof);
- offset =+ n;
- if (offset > size) // Is it safe to access the regex proof?
- return GNUNET_SYSERR;
- aux = (char *) &block[1]; // Skip regex block
- aux = &aux[n]; // Skip regex proof
- n = ntohl (block->n_edges);
- for (i = 0; i < n; n++) // aux always points at the end of the previous block
- {
- offset += sizeof (struct MeshRegexEdge);
- if (offset > size) // Is it safe to access the next edge block?
- return GNUNET_SYSERR;
- edge = (struct MeshRegexEdge *) aux;
- n_token = ntohl (edge->n_token);
- offset += n_token;
- if (offset > size) // Is it safe to access the edge token?
- return GNUNET_SYSERR;
- aux = (char *) &edge[1]; // Skip edge block
- aux = &aux[n_token]; // Skip edge token
- }
- // The total size should be exactly the size of (regex + all edges) blocks
- return (offset == size) ? GNUNET_OK : GNUNET_SYSERR;
-}
-
-
/**
* Function called to validate a reply or a request. For
* request evaluation, simply pass "NULL" for the reply_block.
}
if (NULL == reply_block)
return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
- if (GNUNET_OK != check_mesh_regex_block (reply_block, reply_block_size))
+ if (GNUNET_OK != GNUNET_MESH_regex_block_check (reply_block,
+ reply_block_size))
return GNUNET_BLOCK_EVALUATION_RESULT_INVALID;
if (NULL != bf)
{