From 9982f58b45230373960cea1fe1fb294602bdd56d Mon Sep 17 00:00:00 2001 From: Julius Bünger Date: Thu, 26 Mar 2015 15:29:39 +0000 Subject: -restructured code --- src/rps/Makefile.am | 9 +- src/rps/gnunet-service-rps.c | 5 +- src/rps/rps.h | 6 + src/rps/rps_api.c | 19 +- src/rps/test_rps_malicious_1.c | 383 ----------------------------------------- src/rps/test_rps_multipeer.c | 2 +- 6 files changed, 30 insertions(+), 394 deletions(-) delete mode 100644 src/rps/test_rps_malicious_1.c (limited to 'src') diff --git a/src/rps/Makefile.am b/src/rps/Makefile.am index fe086e59c..b1e62eb12 100644 --- a/src/rps/Makefile.am +++ b/src/rps/Makefile.am @@ -59,7 +59,8 @@ gnunet_service_rps_LDADD = \ if HAVE_TESTING check_PROGRAMS = \ test_rps_multipeer \ - test_rps_malicious_1 + test_rps_malicious_1 \ + test_rps_malicious_2 endif ld_rps_test_lib = \ @@ -79,9 +80,13 @@ test_rps_multipeer_SOURCES = \ test_rps_multipeer_LDADD = $(ld_rps_test_lib) test_rps_malicious_1_SOURCES = \ - test_rps_malicious_1.c + test_rps_malicious.c test_rps_malicious_1_LDADD = $(ld_rps_test_lib) +test_rps_malicious_2_SOURCES = \ + test_rps_malicious.c +test_rps_malicious_2_LDADD = $(ld_rps_test_lib) + EXTRA_DIST = \ test_rps.conf diff --git a/src/rps/gnunet-service-rps.c b/src/rps/gnunet-service-rps.c index 243d54f7d..08d647781 100644 --- a/src/rps/gnunet-service-rps.c +++ b/src/rps/gnunet-service-rps.c @@ -1056,7 +1056,7 @@ add_peer_array_to_set (const struct GNUNET_PeerIdentity *peer_array, { unsigned int i; if (NULL == peer_map) - peer_map = GNUNET_CONTAINER_multipeermap_create (num_peers, + peer_map = GNUNET_CONTAINER_multipeermap_create (num_peers + 1, GNUNET_NO); for (i = 0 ; i < num_peers ; i++) { @@ -1672,6 +1672,7 @@ handle_client_act_malicious (void *cls, /* Do actual logic */ + // FIXME ingore own id peers = (struct GNUNET_PeerIdentity *) &msg[1]; mal_type = ntohl (in_msg->type); @@ -1721,7 +1722,7 @@ handle_client_act_malicious (void *cls, /* Store the one attacked peer */ memcpy (&attacked_peer, - &peers[num_mal_peers_sent], + &in_msg->attacked_peer, sizeof (struct GNUNET_PeerIdentity)); LOG (GNUNET_ERROR_TYPE_DEBUG, diff --git a/src/rps/rps.h b/src/rps/rps.h index 3c5713bdc..ad255acab 100644 --- a/src/rps/rps.h +++ b/src/rps/rps.h @@ -134,6 +134,12 @@ struct GNUNET_RPS_CS_ActMaliciousMessage */ struct GNUNET_MessageHeader header; + /** + * If the type is 2 this is the attacked peer, + * empty otherwise. + */ + struct GNUNET_PeerIdentity attacked_peer; + /** * Type of malicious behaviour. * diff --git a/src/rps/rps_api.c b/src/rps/rps_api.c index 3afff58e6..c46851fe9 100644 --- a/src/rps/rps_api.c +++ b/src/rps/rps_api.c @@ -311,7 +311,7 @@ GNUNET_RPS_seed_ids (struct GNUNET_RPS_Handle *h, GNUNET_RPS_act_malicious (struct GNUNET_RPS_Handle *h, uint32_t type, uint32_t num_peers, - const struct GNUNET_PeerIdentity *ids) + const struct GNUNET_PeerIdentity *peer_ids) { size_t size_needed; uint32_t num_peers_max; @@ -329,9 +329,9 @@ GNUNET_RPS_act_malicious (struct GNUNET_RPS_Handle *h, LOG (GNUNET_ERROR_TYPE_DEBUG, "%u. peer: %s\n", i, - GNUNET_i2s (&ids[i])); + GNUNET_i2s (&peer_ids[i])); - /* The actual size the message occupies */ + /* The actual size the message would occupy */ size_needed = sizeof (struct GNUNET_RPS_CS_SeedMessage) + num_peers * sizeof (struct GNUNET_PeerIdentity); /* The number of peers that fit in one message together with @@ -339,7 +339,7 @@ GNUNET_RPS_act_malicious (struct GNUNET_RPS_Handle *h, num_peers_max = (GNUNET_SERVER_MAX_MESSAGE_SIZE - sizeof (struct GNUNET_RPS_CS_SeedMessage)) / sizeof (struct GNUNET_PeerIdentity); - tmp_peer_pointer = ids; + tmp_peer_pointer = peer_ids; while (GNUNET_SERVER_MAX_MESSAGE_SIZE < size_needed) { @@ -351,14 +351,19 @@ GNUNET_RPS_act_malicious (struct GNUNET_RPS_Handle *h, GNUNET_MESSAGE_TYPE_RPS_ACT_MALICIOUS); msg->type = htonl (type); msg->num_peers = htonl (num_peers_max); - memcpy (&msg[1], tmp_peer_pointer, num_peers_max * sizeof (struct GNUNET_PeerIdentity)); + if (2 == type) + msg->attacked_peer = peer_ids[num_peers]; + memcpy (&msg[1], + tmp_peer_pointer, + num_peers_max * sizeof (struct GNUNET_PeerIdentity)); + GNUNET_MQ_send (h->mq, ev); num_peers -= num_peers_max; size_needed = sizeof (struct GNUNET_RPS_CS_SeedMessage) + num_peers * sizeof (struct GNUNET_PeerIdentity); /* Set pointer to beginning of next block of num_peers_max peers */ - tmp_peer_pointer = &ids[num_peers_max]; + tmp_peer_pointer = &peer_ids[num_peers_max]; } ev = GNUNET_MQ_msg_extra (msg, @@ -366,6 +371,8 @@ GNUNET_RPS_act_malicious (struct GNUNET_RPS_Handle *h, GNUNET_MESSAGE_TYPE_RPS_ACT_MALICIOUS); msg->type = htonl (type); msg->num_peers = htonl (num_peers); + if (2 == type) + msg->attacked_peer = peer_ids[num_peers]; memcpy (&msg[1], tmp_peer_pointer, num_peers * sizeof (struct GNUNET_PeerIdentity)); GNUNET_MQ_send (h->mq, ev); diff --git a/src/rps/test_rps_malicious_1.c b/src/rps/test_rps_malicious_1.c deleted file mode 100644 index 50ae2ac86..000000000 --- a/src/rps/test_rps_malicious_1.c +++ /dev/null @@ -1,383 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 2009, 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. -*/ -/** - * @file rps/test_rps_multipeer.c - * @brief Testcase for the random peer sampling service. Starts - * a peergroup with a given number of peers, then waits to - * receive size pushes/pulls from each peer. Expects to wait - * for one message from each peer. - */ -#include "platform.h" -#include "gnunet_testbed_service.h" -#include "gnunet_rps_service.h" - -#include - - -/** - * How many peers do we start? - */ -#define NUM_PEERS 10 - -/** - * How long do we run the test? - */ -#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 60) - - -/** - * Portion of malicious peers - */ -static double portion = .1; - - -/** - * Information we track for each peer. - */ -struct RPSPeer -{ - /** - * Index of the peer. - */ - unsigned int index; - - /** - * Handle for RPS connect operation. - */ - struct GNUNET_TESTBED_Operation *op; - - /** - * Handle to RPS service. - */ - struct GNUNET_RPS_Handle *rps_handle; - - /** - * ID of the peer. - */ - struct GNUNET_PeerIdentity *peer_id; -}; - - -/** - * Information for all the peers. - */ -static struct RPSPeer rps_peers[NUM_PEERS]; - -/** - * IDs of the peers. - */ -static struct GNUNET_PeerIdentity rps_peer_ids[NUM_PEERS]; - -/** - * Return value from 'main'. - */ -static int ok; - - -/** - * Task run on timeout to shut everything down. - */ -static void -shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) -{ - unsigned int i; - - for (i=0;irps_handle, 1, handle_reply, NULL); - GNUNET_free (req_handle); -} - - -/** - * Seed peers. - */ - void -seed_peers (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) -{ - unsigned int amount; - struct RPSPeer *peer = (struct RPSPeer *) cls; - unsigned int i; - - GNUNET_assert (1 >= portion - && 0 < portion); - - amount = round (portion * NUM_PEERS); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Seeding peers:\n"); - for (i = 0 ; i < amount ; i++) - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Seeding %u. peer: %s\n", - i, - GNUNET_i2s (&rps_peer_ids[i])); - - GNUNET_RPS_seed_ids (peer->rps_handle, amount, rps_peer_ids); -} - - -/** - * Get the id of peer i. - */ - void -info_cb (void *cb_cls, - struct GNUNET_TESTBED_Operation *op, - const struct GNUNET_TESTBED_PeerInformation *pinfo, - const char *emsg) -{ - unsigned int i = *((unsigned int *) cb_cls); - - if (NULL == pinfo || NULL != emsg) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Got Error: %s\n", emsg); - return; - } - - GNUNET_free (cb_cls); - - rps_peer_ids[i] = *(pinfo->result.id); - rps_peers[i].peer_id = &rps_peer_ids[i]; - -} - - -/** - * Callback to be called when RPS service connect operation is completed - * - * @param cls the callback closure from functions generating an operation - * @param op the operation that has been finished - * @param ca_result the RPS service handle returned from rps_connect_adapter - * @param emsg error message in case the operation has failed; will be NULL if - * operation has executed successfully. - */ -static void -rps_connect_complete_cb (void *cls, - struct GNUNET_TESTBED_Operation *op, - void *ca_result, - const char *emsg) -{ - struct RPSPeer *rps_peer = cls; - struct GNUNET_RPS_Handle *rps = ca_result; - struct GNUNET_RPS_Request_Handle *req_handle; - uint32_t num_mal_peers; - - rps_peer->rps_handle = rps; - - GNUNET_assert (op == rps_peer->op); - if (NULL != emsg) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to connect to RPS service: %s\n", - emsg); - ok = 1; - GNUNET_SCHEDULER_shutdown (); - return; - } - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Started client successfully\n"); - - #ifdef ENABLE_MALICIOUS - GNUNET_assert (1 >= portion - && 0 < portion); - num_mal_peers = round (portion * NUM_PEERS); - - if (rps_peer->index >= num_mal_peers) - { - req_handle = GNUNET_RPS_request_peers (rps, 1, handle_reply, NULL); - GNUNET_free (req_handle); - } - #else /* ENABLE_MALICIOUS */ - req_handle = GNUNET_RPS_request_peers (rps, 1, handle_reply, NULL); - GNUNET_free (req_handle); - #endif /* ENABLE_MALICIOUS */ - - //GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10), - // request_peers, peer); - //GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10), - // seed_peers, peer); - // TODO test seeding > GNUNET_SERVER_MAX_MESSAGE_SIZE peers -} - - -/** - * Adapter function called to establish a connection to - * the RPS service. - * - * @param cls closure - * @param cfg configuration of the peer to connect to; will be available until - * GNUNET_TESTBED_operation_done() is called on the operation returned - * from GNUNET_TESTBED_service_connect() - * @return service handle to return in 'op_result', NULL on error - */ -static void * -rps_connect_adapter (void *cls, - const struct GNUNET_CONFIGURATION_Handle *cfg) -{ - struct GNUNET_RPS_Handle *h; - #ifdef ENABLE_MALICIOUS - uint32_t num_mal_peers; - struct RPSPeer *rps_peer = (struct RPSPeer *) cls; - #endif /* ENABLE_MALICIOUS */ - - h = GNUNET_RPS_connect (cfg); - - #ifdef ENABLE_MALICIOUS - GNUNET_assert (1 >= portion - && 0 < portion); - num_mal_peers = round (portion * NUM_PEERS); - - if (rps_peer->index < num_mal_peers) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%u. peer [%s] of %" PRIu32 " malicious peers turning malicious\n", - rps_peer->index, - GNUNET_i2s (rps_peer->peer_id), - num_mal_peers); - - GNUNET_RPS_act_malicious (h, 1, num_mal_peers, rps_peer_ids); - #endif /* ENABLE_MALICIOUS */ - } - - return h; -} - - -/** - * Adapter function called to destroy connection to - * RPS service. - * - * @param cls closure - * @param op_result service handle returned from the connect adapter - */ -static void -rps_disconnect_adapter (void *cls, - void *op_result) -{ - struct GNUNET_RPS_Handle *h = op_result; - GNUNET_RPS_disconnect (h); -} - - -/** - * Actual "main" function for the testcase. - * - * @param cls closure - * @param h the run handle - * @param num_peers number of peers in 'peers' - * @param peers handle to peers run in the testbed - * @param links_succeeded the number of overlay link connection attempts that - * succeeded - * @param links_failed the number of overlay link connection attempts that - * failed - */ -static void -run (void *cls, - struct GNUNET_TESTBED_RunHandle *h, - unsigned int num_peers, - struct GNUNET_TESTBED_Peer **peers, - unsigned int links_succeeded, - unsigned int links_failed) -{ - unsigned int i; - unsigned int *tmp_i; - - tmp_i = GNUNET_new (unsigned int); - - for (i = 0 ; i < NUM_PEERS ; i++) - { - tmp_i = GNUNET_new (unsigned int); - *tmp_i = i; - - (void) GNUNET_TESTBED_peer_get_information (peers[i], - GNUNET_TESTBED_PIT_IDENTITY, - &info_cb, - tmp_i); - } - - - GNUNET_assert (NUM_PEERS == num_peers); - for (i = 0 ; i < num_peers ; i++) - { - rps_peers[i].index = i; - rps_peers[i].op = - GNUNET_TESTBED_service_connect (&rps_peers[i], - peers[i], - "rps", - &rps_connect_complete_cb, - &rps_peers[i], - &rps_connect_adapter, - &rps_disconnect_adapter, - &rps_peers[i]); - } - GNUNET_SCHEDULER_add_delayed (TIMEOUT, &shutdown_task, NULL); -} - - -/** - * Entry point for the testcase, sets up the testbed. - * - * @param argc unused - * @param argv unused - * @return 0 on success - */ -int -main (int argc, char *argv[]) -{ - ok = 1; - (void) GNUNET_TESTBED_test_run ("test-rps-multipeer", - "test_rps.conf", - NUM_PEERS, - 0, NULL, NULL, - &run, NULL); - return ok; -} - -/* end of test_rps_multipeer.c */ diff --git a/src/rps/test_rps_multipeer.c b/src/rps/test_rps_multipeer.c index df897b13d..94f709595 100644 --- a/src/rps/test_rps_multipeer.c +++ b/src/rps/test_rps_multipeer.c @@ -38,7 +38,7 @@ /** * How long do we run the test? */ -#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 60) +#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) /** -- cgit v1.2.3