diff options
author | Christian Grothoff <christian@grothoff.org> | 2010-09-18 19:10:12 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2010-09-18 19:10:12 +0000 |
commit | 3756b235a8ef6a680a1bc7197c1ce45d778af09c (patch) | |
tree | ec506ec28427cfc7813711b938fccbbbb6d1d728 /src/block | |
parent | d24bc034571753884f63bdb9c45ec53ef289121c (diff) |
plane hacking
Diffstat (limited to 'src/block')
-rw-r--r-- | src/block/Makefile.am | 21 | ||||
-rw-r--r-- | src/block/plugin_block_dht.c | 163 | ||||
-rw-r--r-- | src/block/plugin_block_fs.c | 35 | ||||
-rw-r--r-- | src/block/plugin_block_test.c | 154 | ||||
-rw-r--r-- | src/block/test_block.c | 8 |
5 files changed, 359 insertions, 22 deletions
diff --git a/src/block/Makefile.am b/src/block/Makefile.am index 2fc0c0081c..b37c7705e8 100644 --- a/src/block/Makefile.am +++ b/src/block/Makefile.am @@ -13,8 +13,19 @@ endif lib_LTLIBRARIES = libgnunetblock.la plugin_LTLIBRARIES = \ + libgnunet_plugin_block_dht.la \ libgnunet_plugin_block_fs.la \ - libgnunet_plugin_block_template.la + libgnunet_plugin_block_template.la \ + libgnunet_plugin_block_test.la + +libgnunet_plugin_block_dht_la_SOURCES = \ + plugin_block_dht.c +libgnunet_plugin_block_dht_la_LIBADD = \ + $(top_builddir)/src/hello/libgnunethello.la \ + $(top_builddir)/src/block/libgnunetblock.la \ + $(top_builddir)/src/util/libgnunetutil.la +libgnunet_plugin_block_dht_la_LDFLAGS = \ + $(GN_PLUGIN_LDFLAGS) libgnunet_plugin_block_fs_la_SOURCES = \ plugin_block_fs.c @@ -31,6 +42,14 @@ libgnunet_plugin_block_template_la_LIBADD = \ libgnunet_plugin_block_template_la_LDFLAGS = \ $(GN_PLUGIN_LDFLAGS) +libgnunet_plugin_block_test_la_SOURCES = \ + plugin_block_test.c +libgnunet_plugin_block_test_la_LIBADD = \ + $(top_builddir)/src/block/libgnunetblock.la \ + $(top_builddir)/src/util/libgnunetutil.la +libgnunet_plugin_block_test_la_LDFLAGS = \ + $(GN_PLUGIN_LDFLAGS) + libgnunetblock_la_SOURCES = \ block.c plugin_block.h diff --git a/src/block/plugin_block_dht.c b/src/block/plugin_block_dht.c new file mode 100644 index 0000000000..8312a69b53 --- /dev/null +++ b/src/block/plugin_block_dht.c @@ -0,0 +1,163 @@ +/* + This file is part of GNUnet + (C) 2010 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. +*/ + +/** + * @file block/plugin_block_dht.c + * @brief block plugin for DHT internals (right now, find-peer requests only); + * other plugins should be used to store "useful" data in the + * DHT (see fs block plugin) + * @author Christian Grothoff + */ + +#include "platform.h" +#include "gnunet_hello_lib.h" +#include "plugin_block.h" + +#define DEBUG_DHT GNUNET_NO + + +/** + * Function called to validate a reply or a request. For + * request evaluation, simply pass "NULL" for the reply_block. + * + * @param cls closure + * @param type block type + * @param query original query (hash) + * @param bf pointer to bloom filter associated with query; possibly updated (!) + * @param bf_mutator mutation value for bf + * @param xquery extrended query data (can be NULL, depending on type) + * @param xquery_size number of bytes in xquery + * @param reply_block response to validate + * @param reply_block_size number of bytes in reply block + * @return characterization of result + */ +static enum GNUNET_BLOCK_EvaluationResult +block_plugin_dht_evaluate (void *cls, + enum GNUNET_BLOCK_Type type, + const GNUNET_HashCode *query, + struct GNUNET_CONTAINER_BloomFilter **bf, + int32_t bf_mutator, + const void *xquery, + size_t xquery_size, + const void *reply_block, + size_t reply_block_size) +{ + if (type != GNUNET_BLOCK_TYPE_DHT_HELLO) + return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED; + if (xquery_size != 0) + return GNUNET_BLOCK_EVALUATION_REQUEST_INVALID; + if (reply_block_size == 0) + return GNUNET_BLOCK_EVALUATION_REQUEST_VALID; + GNUNET_break (NULL == *bf); + return GNUNET_BLOCK_EVALUATION_OK_LAST; +} + + +/** + * Function called to obtain the key for a block. + * + * @param cls closure + * @param type block type + * @param block block to get the key for + * @param block_size number of bytes in block + * @param key set to the key (query) for the given block + * @return GNUNET_OK on success, GNUNET_SYSERR if type not supported + * (or if extracting a key from a block of this type does not work) + */ +static int +block_plugin_dht_get_key (void *cls, + enum GNUNET_BLOCK_Type type, + const void *block, + size_t block_size, + GNUNET_HashCode *key) +{ + const struct GNUNET_MessageHeader *msg; + const struct GNUNET_HELLO_Message *hello; + struct GNUNET_PeerIdentity *pid; + + if (type != GNUNET_BLOCK_TYPE_DHT_HELLO) + return GNUNET_SYSERR; + if (block_size < sizeof (struct GNUNET_MessageHeader)) + { + GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, + "block-dht", + _("Block not of type %u\n"), + GNUNET_BLOCK_TYPE_DHT_HELLO); + return GNUNET_SYSERR; + } + msg = block; + if (block_size != ntohs (msg->size)) + { + GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, + "block-dht", + _("Size mismatch for block\n"), + GNUNET_BLOCK_TYPE_DHT_HELLO); + return GNUNET_SYSERR; + } + hello = block; + pid = (struct GNUNET_PeerIdentity*) key; + if (GNUNET_OK != + GNUNET_HELLO_get_id (hello, + pid)) + { + GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, + "block-dht", + _("Block of type %u is malformed\n"), + GNUNET_BLOCK_TYPE_DHT_HELLO); + return GNUNET_SYSERR; + } + return GNUNET_OK; +} + + +/** + * Entry point for the plugin. + */ +void * +gnunet_plugin_block_dht_init (void *cls) +{ + static enum GNUNET_BLOCK_Type types[] = + { + GNUNET_BLOCK_TYPE_DHT_HELLO, + GNUNET_BLOCK_TYPE_ANY /* end of list */ + }; + struct GNUNET_BLOCK_PluginFunctions *api; + + api = GNUNET_malloc (sizeof (struct GNUNET_BLOCK_PluginFunctions)); + api->evaluate = &block_plugin_dht_evaluate; + api->get_key = &block_plugin_dht_get_key; + api->types = types; + return api; +} + + +/** + * Exit point from the plugin. + */ +void * +gnunet_plugin_block_dht_done (void *cls) +{ + struct GNUNET_TRANSPORT_PluginFunctions *api = cls; + + GNUNET_free (api); + return NULL; +} + +/* end of plugin_block_dht.c */ diff --git a/src/block/plugin_block_fs.c b/src/block/plugin_block_fs.c index 3ad15a0c66..d4e510abe8 100644 --- a/src/block/plugin_block_fs.c +++ b/src/block/plugin_block_fs.c @@ -74,8 +74,8 @@ block_plugin_fs_evaluate (void *cls, switch (type) { - case GNUNET_BLOCK_TYPE_DBLOCK: - case GNUNET_BLOCK_TYPE_IBLOCK: + case GNUNET_BLOCK_TYPE_FS_DBLOCK: + case GNUNET_BLOCK_TYPE_FS_IBLOCK: if (xquery_size != 0) { GNUNET_break_op (0); @@ -84,8 +84,8 @@ block_plugin_fs_evaluate (void *cls, if (reply_block == NULL) return GNUNET_BLOCK_EVALUATION_REQUEST_VALID; return GNUNET_BLOCK_EVALUATION_OK_LAST; - case GNUNET_BLOCK_TYPE_KBLOCK: - case GNUNET_BLOCK_TYPE_NBLOCK: + case GNUNET_BLOCK_TYPE_FS_KBLOCK: + case GNUNET_BLOCK_TYPE_FS_NBLOCK: if (xquery_size != 0) { GNUNET_break_op (0); @@ -111,7 +111,7 @@ block_plugin_fs_evaluate (void *cls, } GNUNET_CONTAINER_bloomfilter_add (*bf, &mhash); return GNUNET_BLOCK_EVALUATION_OK_MORE; - case GNUNET_BLOCK_TYPE_SBLOCK: + case GNUNET_BLOCK_TYPE_FS_SBLOCK: if (xquery_size != sizeof (GNUNET_HashCode)) { GNUNET_break_op (0); @@ -133,8 +133,9 @@ block_plugin_fs_evaluate (void *cls, &sh, sizeof (GNUNET_HashCode))) { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - _("Reply mismatched in terms of namespace. Discarded.\n")); + GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING, + "block-fs", + _("Reply mismatched in terms of namespace. Discarded.\n")); return GNUNET_BLOCK_EVALUATION_RESULT_INVALID; } GNUNET_CRYPTO_hash (reply_block, @@ -185,11 +186,11 @@ block_plugin_fs_get_key (void *cls, switch (type) { - case GNUNET_BLOCK_TYPE_DBLOCK: - case GNUNET_BLOCK_TYPE_IBLOCK: + case GNUNET_BLOCK_TYPE_FS_DBLOCK: + case GNUNET_BLOCK_TYPE_FS_IBLOCK: GNUNET_CRYPTO_hash (block, block_size, key); return GNUNET_OK; - case GNUNET_BLOCK_TYPE_KBLOCK: + case GNUNET_BLOCK_TYPE_FS_KBLOCK: if (block_size < sizeof (struct KBlock)) { GNUNET_break_op (0); @@ -218,7 +219,7 @@ block_plugin_fs_get_key (void *cls, sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), key); return GNUNET_OK; - case GNUNET_BLOCK_TYPE_SBLOCK: + case GNUNET_BLOCK_TYPE_FS_SBLOCK: if (block_size < sizeof (struct SBlock)) { GNUNET_break_op (0); @@ -243,7 +244,7 @@ block_plugin_fs_get_key (void *cls, if (key != NULL) *key = sb->identifier; return GNUNET_OK; - case GNUNET_BLOCK_TYPE_NBLOCK: + case GNUNET_BLOCK_TYPE_FS_NBLOCK: if (block_size < sizeof (struct NBlock)) { GNUNET_break_op (0); @@ -303,11 +304,11 @@ libgnunet_plugin_block_fs_init (void *cls) { static enum GNUNET_BLOCK_Type types[] = { - GNUNET_BLOCK_TYPE_DBLOCK, - GNUNET_BLOCK_TYPE_IBLOCK, - GNUNET_BLOCK_TYPE_KBLOCK, - GNUNET_BLOCK_TYPE_SBLOCK, - GNUNET_BLOCK_TYPE_NBLOCK, + GNUNET_BLOCK_TYPE_FS_DBLOCK, + GNUNET_BLOCK_TYPE_FS_IBLOCK, + GNUNET_BLOCK_TYPE_FS_KBLOCK, + GNUNET_BLOCK_TYPE_FS_SBLOCK, + GNUNET_BLOCK_TYPE_FS_NBLOCK, GNUNET_BLOCK_TYPE_ANY /* end of list */ }; struct GNUNET_BLOCK_PluginFunctions *api; diff --git a/src/block/plugin_block_test.c b/src/block/plugin_block_test.c new file mode 100644 index 0000000000..1cf8c701dc --- /dev/null +++ b/src/block/plugin_block_test.c @@ -0,0 +1,154 @@ +/* + This file is part of GNUnet + (C) 2010 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. +*/ + +/** + * @file block/plugin_block_test.c + * @brief block plugin to test the DHT as a simple key-value store; + * this plugin simply accepts any (new) response for any key + * @author Christian Grothoff + */ + +#include "platform.h" +#include "plugin_block.h" + +#define DEBUG_TEST GNUNET_NO + + +/** + * Number of bits we set per entry in the bloomfilter. + * Do not change! + */ +#define BLOOMFILTER_K 16 + +/** + * Function called to validate a reply or a request. For + * request evaluation, simply pass "NULL" for the reply_block. + * + * @param cls closure + * @param type block type + * @param query original query (hash) + * @param bf pointer to bloom filter associated with query; possibly updated (!) + * @param bf_mutator mutation value for bf + * @param xquery extrended query data (can be NULL, depending on type) + * @param xquery_size number of bytes in xquery + * @param reply_block response to validate + * @param reply_block_size number of bytes in reply block + * @return characterization of result + */ +static enum GNUNET_BLOCK_EvaluationResult +block_plugin_test_evaluate (void *cls, + enum GNUNET_BLOCK_Type type, + const GNUNET_HashCode *query, + struct GNUNET_CONTAINER_BloomFilter **bf, + int32_t bf_mutator, + const void *xquery, + size_t xquery_size, + const void *reply_block, + size_t reply_block_size) +{ + GNUNET_HashCode chash; + GNUNET_HashCode mhash; + + if (type != GNUNET_BLOCK_TYPE_TEST) + return GNUNET_BLOCK_EVALUATION_TYPE_NOT_SUPPORTED; + if (xquery_size != 0) + GNUNET_BLOCK_EVALUATION_REQUEST_INVALID; + if (reply_block_size == 0) + GNUNET_BLOCK_EVALUATION_REQUEST_VALID; + + 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; +} + + +/** + * Function called to obtain the key for a block. + * + * @param cls closure + * @param type block type + * @param block block to get the key for + * @param block_size number of bytes in block + * @param key set to the key (query) for the given block + * @return GNUNET_OK on success, GNUNET_SYSERR if type not supported + * (or if extracting a key from a block of this type does not work) + */ +static int +block_plugin_test_get_key (void *cls, + enum GNUNET_BLOCK_Type type, + const void *block, + size_t block_size, + GNUNET_HashCode *key) +{ + /* always fails since there is no fixed relationship between + keys and values for test values */ + return GNUNET_SYSERR; +} + + +/** + * Entry point for the plugin. + */ +void * +gnunet_plugin_block_test_init (void *cls) +{ + static enum GNUNET_BLOCK_Type types[] = + { + GNUNET_BLOCK_TYPE_TEST, + GNUNET_BLOCK_TYPE_ANY /* end of list */ + }; + struct GNUNET_BLOCK_PluginFunctions *api; + + api = GNUNET_malloc (sizeof (struct GNUNET_BLOCK_PluginFunctions)); + api->evaluate = &block_plugin_test_evaluate; + api->get_key = &block_plugin_test_get_key; + api->types = types; + return api; +} + + +/** + * Exit point from the plugin. + */ +void * +gnunet_plugin_block_test_done (void *cls) +{ + struct GNUNET_TRANSPORT_PluginFunctions *api = cls; + + GNUNET_free (api); + return NULL; +} + +/* end of plugin_block_test.c */ diff --git a/src/block/test_block.c b/src/block/test_block.c index 02719e5aa5..bb9a1f01b8 100644 --- a/src/block/test_block.c +++ b/src/block/test_block.c @@ -38,14 +38,14 @@ test_fs (struct GNUNET_BLOCK_Context *ctx) memset (block, 1, sizeof (block)); if (GNUNET_OK != GNUNET_BLOCK_get_key (ctx, - GNUNET_BLOCK_TYPE_DBLOCK, + GNUNET_BLOCK_TYPE_FS_DBLOCK, block, sizeof (block), &key)) return 1; if (GNUNET_BLOCK_EVALUATION_OK_LAST != GNUNET_BLOCK_evaluate (ctx, - GNUNET_BLOCK_TYPE_DBLOCK, + GNUNET_BLOCK_TYPE_FS_DBLOCK, &key, NULL, 0, NULL, 0, @@ -53,7 +53,7 @@ test_fs (struct GNUNET_BLOCK_Context *ctx) return 2; if (GNUNET_BLOCK_EVALUATION_REQUEST_VALID != GNUNET_BLOCK_evaluate (ctx, - GNUNET_BLOCK_TYPE_DBLOCK, + GNUNET_BLOCK_TYPE_FS_DBLOCK, &key, NULL, 0, NULL, 0, @@ -62,7 +62,7 @@ test_fs (struct GNUNET_BLOCK_Context *ctx) GNUNET_log_skip (1, GNUNET_NO); if (GNUNET_BLOCK_EVALUATION_REQUEST_INVALID != GNUNET_BLOCK_evaluate (ctx, - GNUNET_BLOCK_TYPE_DBLOCK, + GNUNET_BLOCK_TYPE_FS_DBLOCK, &key, NULL, 0, "bogus", 5, |