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");
"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);
}
#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;
#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.
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 */
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);
}