X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftransport%2Ftest_transport_api_manipulation_recv_tcp.c;h=40e0b6a4dbd0d0496493b9fa8a8cf9426b569c8c;hb=ad1244d958b76cb249028c7ad87ff84df49293ff;hp=023d5a7143aae1f19d9094cc3f72b2ee9709f6e7;hpb=611a879420bf940dff9039305314489586776896;p=oweals%2Fgnunet.git diff --git a/src/transport/test_transport_api_manipulation_recv_tcp.c b/src/transport/test_transport_api_manipulation_recv_tcp.c index 023d5a714..40e0b6a4d 100644 --- a/src/transport/test_transport_api_manipulation_recv_tcp.c +++ b/src/transport/test_transport_api_manipulation_recv_tcp.c @@ -2,20 +2,18 @@ This file is part of GNUnet. Copyright (C) 2009, 2010, 2016 GNUnet e.V. - 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 free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, + 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., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. + Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ /** * @file transport/test_transport_api_manipulation_recv_tcp.c @@ -36,22 +34,9 @@ */ #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 120) -/** - * How long until we give up on transmitting the message? - */ -#define TIMEOUT_TRANSMIT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) - -#define TEST_MESSAGE_SIZE 2600 - -#define TEST_MESSAGE_TYPE 12345 - static struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc; -static struct GNUNET_TRANSPORT_TransmitHandle *th; - -static struct GNUNET_SCHEDULER_Task *send_task; - static int messages_recv; static struct GNUNET_TIME_Absolute start_normal; @@ -64,30 +49,69 @@ static struct GNUNET_TIME_Relative dur_delayed; static void -custom_shutdown (void *cls) +do_free (void *cls) { - if (NULL != th) + struct GNUNET_TRANSPORT_TESTING_SendClosure *sc = cls; + + GNUNET_free (sc); +} + + +static void +delayed_transmit (void *cls) +{ + struct GNUNET_TRANSPORT_TESTING_SendClosure *sc = cls; + + start_delayed = GNUNET_TIME_absolute_get (); + GNUNET_TRANSPORT_TESTING_large_send (sc); +} + + +static void +sendtask (void *cls) +{ + struct GNUNET_TRANSPORT_TESTING_SendClosure *sc; + struct GNUNET_ATS_Properties prop; + struct GNUNET_TIME_Relative delay; + + sc = GNUNET_new (struct GNUNET_TRANSPORT_TESTING_SendClosure); + sc->num_messages = 1; + sc->ccc = ccc; + sc->cont = &do_free; + sc->cont_cls = sc; + if (0 == messages_recv) { - GNUNET_TRANSPORT_notify_transmit_ready_cancel (th); - th = NULL; + start_normal = GNUNET_TIME_absolute_get(); } - if (NULL != send_task) + if (0 < messages_recv) { - GNUNET_SCHEDULER_cancel (send_task); - send_task = NULL; + memset (&prop, + 0, + sizeof (prop)); + delay = GNUNET_TIME_UNIT_SECONDS; + GNUNET_TRANSPORT_manipulation_set (ccc->p[1]->tmh, + &ccc->p[0]->id, + &prop, + delay, + GNUNET_TIME_UNIT_ZERO); + /* wait 1s to allow manipulation to go into effect */ + if (1 == messages_recv) + { + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, + &delayed_transmit, + sc); + return; + } } + GNUNET_TRANSPORT_TESTING_large_send (sc); } -static void -sendtask (void *cls); - - static void notify_receive (void *cls, struct GNUNET_TRANSPORT_TESTING_PeerContext *receiver, const struct GNUNET_PeerIdentity *sender, - const struct GNUNET_MessageHeader *message) + const struct GNUNET_TRANSPORT_TESTING_TestMessage *message) { { char *ps = GNUNET_strdup (GNUNET_i2s (&receiver->id)); @@ -96,18 +120,13 @@ notify_receive (void *cls, "Peer %u (`%s') received message of type %d and size %u size from peer %s)!\n", receiver->no, ps, - ntohs (message->type), - ntohs (message->size), + ntohs (message->header.type), + ntohs (message->header.size), GNUNET_i2s (sender)); GNUNET_free (ps); } - if ((TEST_MESSAGE_TYPE == ntohs (message->type)) && - (TEST_MESSAGE_SIZE == ntohs (message->size))) - { - if (GNUNET_NO == ccc->global_ret) - ccc->global_ret = GNUNET_OK; - } - else + if ( (GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE != ntohs (message->header.type)) || + (GNUNET_TRANSPORT_TESTING_LARGE_MESSAGE_SIZE != ntohs (message->header.size)) ) { GNUNET_break (0); ccc->global_ret = GNUNET_SYSERR; @@ -115,153 +134,57 @@ notify_receive (void *cls, return; } - if (messages_recv <= 1) + if (messages_recv <= 2) { /* Received non-delayed message */ - dur_normal = GNUNET_TIME_absolute_get_duration(start_normal); + dur_normal = GNUNET_TIME_absolute_get_duration (start_normal); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received non-delayed message %u after %s\n", messages_recv, GNUNET_STRINGS_relative_time_to_string (dur_normal, GNUNET_YES)); - - struct GNUNET_ATS_Properties prop; - struct GNUNET_TIME_Relative delay; - - delay.rel_value_us = 1000 * 1000LL; - memset (&prop, 0, sizeof (prop)); - prop.distance = 10; - GNUNET_TRANSPORT_set_traffic_metric (ccc->p[0]->th, - &ccc->p[1]->id, - &prop, - delay, - GNUNET_TIME_UNIT_ZERO); - send_task = GNUNET_SCHEDULER_add_now (&sendtask, NULL); - } - if (2 == messages_recv) - { - /* Received manipulated message */ - dur_delayed = GNUNET_TIME_absolute_get_duration(start_delayed); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received delayed message %u after %s\n", - messages_recv, - GNUNET_STRINGS_relative_time_to_string (dur_delayed, - GNUNET_YES)); - if (dur_delayed.rel_value_us < GNUNET_TIME_UNIT_SECONDS.rel_value_us) - { - GNUNET_break (0); - ccc->global_ret = GNUNET_SYSERR; - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Delayed message was not delayed correctly: took only %s\n", - GNUNET_STRINGS_relative_time_to_string (dur_delayed, - GNUNET_YES)); - } - /* shutdown */ - GNUNET_SCHEDULER_shutdown (); + GNUNET_SCHEDULER_add_now (&sendtask, + NULL); + messages_recv++; + return; } - messages_recv++; -} - - -static size_t -notify_ready (void *cls, size_t size, void *buf) -{ - struct GNUNET_TRANSPORT_TESTING_PeerContext *p = cls; - struct GNUNET_MessageHeader *hdr; - - th = NULL; - if (NULL == buf) + /* Received manipulated message */ + dur_delayed = GNUNET_TIME_absolute_get_duration(start_delayed); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Received delayed message %u after %s\n", + messages_recv, + GNUNET_STRINGS_relative_time_to_string (dur_delayed, + GNUNET_YES)); + if (dur_delayed.rel_value_us < GNUNET_TIME_UNIT_SECONDS.rel_value_us) { + GNUNET_break (0); + ccc->global_ret = GNUNET_SYSERR; GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Timeout occurred while waiting for transmit_ready\n"); - GNUNET_SCHEDULER_shutdown (); - ccc->global_ret = 42; - return 0; - } - - GNUNET_assert (size >= TEST_MESSAGE_SIZE); - memset (buf, '\0', TEST_MESSAGE_SIZE); - hdr = buf; - hdr->size = htons (TEST_MESSAGE_SIZE); - hdr->type = htons (TEST_MESSAGE_TYPE); - - { - char *ps = GNUNET_strdup (GNUNET_i2s (&ccc->p[1]->id)); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Peer %u (`%s') sending message with type %u and size %u bytes to peer %u (`%s')\n", - ccc->p[1]->no, - ps, - ntohs (hdr->type), - ntohs (hdr->size), - p->no, - GNUNET_i2s (&p->id)); - GNUNET_free (ps); - } - - return TEST_MESSAGE_SIZE; -} - - -static void -sendtask (void *cls) -{ - if (NULL == send_task) - ccc->global_ret = GNUNET_NO; /* first call! */ - send_task = NULL; - { - char *receiver_s = GNUNET_strdup (GNUNET_i2s (&ccc->p[0]->id)); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending message from peer %u (`%4s') -> peer %u (`%s') !\n", - ccc->p[1]->no, GNUNET_i2s (&ccc->p[1]->id), ccc->p[0]->no, receiver_s); - GNUNET_free (receiver_s); - } - if (0 == messages_recv) - { - start_normal = GNUNET_TIME_absolute_get(); - } - if (1 == messages_recv) - { - start_delayed = GNUNET_TIME_absolute_get(); + "Delayed message was not delayed correctly: took only %s\n", + GNUNET_STRINGS_relative_time_to_string (dur_delayed, + GNUNET_YES)); } - - th = GNUNET_TRANSPORT_notify_transmit_ready (ccc->p[1]->th, - &ccc->p[0]->id, - TEST_MESSAGE_SIZE, - TIMEOUT_TRANSMIT, - ¬ify_ready, - ccc->p[0]); -} - - -static void -notify_disconnect (void *cls, - struct GNUNET_TRANSPORT_TESTING_PeerContext *me, - const struct GNUNET_PeerIdentity *other) -{ - GNUNET_TRANSPORT_TESTING_log_disconnect (cls, - me, - other); - if (NULL != th) - { - GNUNET_TRANSPORT_notify_transmit_ready_cancel (th); - th = NULL; + else + { + ccc->global_ret = GNUNET_OK; } + /* shutdown */ + GNUNET_SCHEDULER_shutdown (); } int -main (int argc, char *argv[]) +main (int argc, + char *argv[]) { struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext my_ccc = { .connect_continuation = &sendtask, .config_file = "test_transport_api_data.conf", .rec = ¬ify_receive, .nc = &GNUNET_TRANSPORT_TESTING_log_connect, - .nd = ¬ify_disconnect, - .shutdown_task = &custom_shutdown, - .timeout = TIMEOUT + .nd = &GNUNET_TRANSPORT_TESTING_log_disconnect, + .timeout = TIMEOUT, + .global_ret = GNUNET_NO }; ccc = &my_ccc;