From a710e7a806760db7ebec24ca2ae2d81ce3867ceb Mon Sep 17 00:00:00 2001 From: Sree Harsha Totakura Date: Sat, 26 May 2012 15:14:54 +0000 Subject: port reservation - release --- src/testing/test_testing_new_portreservation.c | 15 +++++++++++- src/testing/testing_new.c | 32 +++++++++++++++----------- 2 files changed, 33 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/testing/test_testing_new_portreservation.c b/src/testing/test_testing_new_portreservation.c index a5821edb0..c1382df38 100644 --- a/src/testing/test_testing_new_portreservation.c +++ b/src/testing/test_testing_new_portreservation.c @@ -39,8 +39,10 @@ static void run (void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { - uint16_t new_port1, new_port2; struct GNUNET_TESTING_System *system; + uint16_t new_port1; + uint16_t new_port2; + uint16_t old_port1; system = GNUNET_TESTING_system_create ("/tmp/gnunet-testing-new", "localhost"); @@ -54,6 +56,17 @@ run (void *cls, char *const *args, const char *cfgfile, "Reserved TCP port %u\n", new_port2); GNUNET_assert (0 != new_port2); GNUNET_assert (new_port1 != new_port2); + release_port (system, GNUNET_YES, new_port1); + old_port1 = new_port1; + new_port1 = 0; + new_port1 = reserve_port (system, GNUNET_YES); + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Reserved TCP port %u\n", new_port1); + GNUNET_assert (0 != new_port1); + GNUNET_assert (old_port1 == new_port1); + release_port (system, GNUNET_YES, new_port1); + release_port (system, GNUNET_YES, new_port2); + release_port (system, GNUNET_YES, new_port2 + 1); /* OK to get error :) */ GNUNET_TESTING_system_destroy (system, GNUNET_NO); } diff --git a/src/testing/testing_new.c b/src/testing/testing_new.c index 7a97b3b9c..73b50575b 100644 --- a/src/testing/testing_new.c +++ b/src/testing/testing_new.c @@ -34,6 +34,8 @@ #include "gnunet_network_lib.h" #include "gnunet_testing_lib-new.h" +#define LOG(kind,...) \ + GNUNET_log_from (kind, "testing-new-api", __VA_ARGS__) /** * Handle for a system on which GNUnet peers are executed; @@ -136,17 +138,6 @@ struct GNUNET_TESTING_Peer #define HIGH_PORT 56000 -/** - * The lowest port bucket for ports available for GNUnet testing - */ -#define LOW_PORT_BUCKET (LOW_PORT / 32) - -/** - * The highest port bucket for ports available for GNUNET_testing - */ -#define HIGH_PORT_BUCKET (HIGH_PORT / 32) - - /** * Create a system handle. There must only be one system * handle per operating system. @@ -226,7 +217,7 @@ reserve_port (struct GNUNET_TESTING_System *system, hint.ai_flags = AI_PASSIVE | AI_NUMERICSERV; /* Wild card address */ port_buckets = (GNUNET_YES == is_tcp) ? system->reserved_tcp_ports : system->reserved_udp_ports; - for (index = LOW_PORT_BUCKET + 1; index < HIGH_PORT_BUCKET; index++) + for (index = (LOW_PORT / 32) + 1; index < (HIGH_PORT / 32); index++) { xor_image = (UINT32_MAX ^ port_buckets[index]); if (0 == xor_image) /* Ports in the bucket are full */ @@ -279,7 +270,22 @@ release_port (struct GNUNET_TESTING_System *system, int is_tcp, uint16_t port) { - GNUNET_break (0); + uint32_t *port_buckets; + uint16_t bucket; + uint16_t pos; + + GNUNET_assert (NULL != system); + port_buckets = (GNUNET_YES == is_tcp) ? + system->reserved_tcp_ports : system->reserved_udp_ports; + bucket = port / 32; + pos = port % 32; + LOG (GNUNET_ERROR_TYPE_DEBUG, "Releasing port %u\n", port); + if (0 == (port_buckets[bucket] & (1U << pos))) + { + GNUNET_break(0); /* Port was not reserved by us using reserve_port() */ + return; + } + port_buckets[bucket] &= ~(1U << pos); } -- cgit v1.2.3