From: Bart Polot Date: Wed, 27 Jun 2012 10:41:05 +0000 (+0000) Subject: - move mesh regex block code to a lib X-Git-Tag: initial-import-from-subversion-38251~12780 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=75a13bdcdc851cba3dffd107fefa3b1532f32fa9;p=oweals%2Fgnunet.git - move mesh regex block code to a lib --- diff --git a/src/mesh/Makefile.am b/src/mesh/Makefile.am index d78cf004e..61ef32974 100644 --- a/src/mesh/Makefile.am +++ b/src/mesh/Makefile.am @@ -22,7 +22,8 @@ bin_PROGRAMS = \ gnunet-service-mesh gnunet-service-mesh_new lib_LTLIBRARIES = \ - libgnunetmesh.la + libgnunetmesh.la \ + libgnunetmeshblock.la plugin_LTLIBRARIES = \ libgnunet_plugin_block_mesh.la @@ -47,7 +48,7 @@ gnunet_service_mesh_LDADD = \ $(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 @@ -55,6 +56,7 @@ gnunet_service_mesh_new_SOURCES = \ 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 \ @@ -74,6 +76,17 @@ libgnunetmesh_la_LDFLAGS = \ $(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 \ diff --git a/src/mesh/gnunet-service-mesh_new.c b/src/mesh/gnunet-service-mesh_new.c index d7446bc43..4aee2dc40 100644 --- a/src/mesh/gnunet-service-mesh_new.c +++ b/src/mesh/gnunet-service-mesh_new.c @@ -4029,6 +4029,7 @@ dht_get_string_handler (void *cls, struct GNUNET_TIME_Absolute exp, 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)) { @@ -4050,6 +4051,21 @@ dht_get_string_handler (void *cls, struct GNUNET_TIME_Absolute exp, 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; } diff --git a/src/mesh/mesh_block_lib.c b/src/mesh/mesh_block_lib.c new file mode 100644 index 000000000..e56aa5725 --- /dev/null +++ b/src/mesh/mesh_block_lib.c @@ -0,0 +1,131 @@ +/* + 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 */ diff --git a/src/mesh/mesh_block_lib.h b/src/mesh/mesh_block_lib.h new file mode 100644 index 000000000..47e63289c --- /dev/null +++ b/src/mesh/mesh_block_lib.h @@ -0,0 +1,94 @@ +/* + 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 */ diff --git a/src/mesh/mesh_protocol.h b/src/mesh/mesh_protocol.h index 885f1f344..a699d1897 100644 --- a/src/mesh/mesh_protocol.h +++ b/src/mesh/mesh_protocol.h @@ -287,6 +287,6 @@ GNUNET_NETWORK_STRUCT_END } #endif -/* ifndef MES_PROTOCOL_H */ +/* ifndef MESH_PROTOCOL_H */ #endif /* end of mesh_protocol.h */ diff --git a/src/mesh/plugin_block_mesh.c b/src/mesh/plugin_block_mesh.c index 9dd34f358..6f024845b 100644 --- a/src/mesh/plugin_block_mesh.c +++ b/src/mesh/plugin_block_mesh.c @@ -27,6 +27,7 @@ #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. @@ -35,52 +36,6 @@ #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. @@ -158,7 +113,8 @@ block_plugin_mesh_evaluate (void *cls, enum GNUNET_BLOCK_Type type, } 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) {