struct GNUNET_CORE_PeerRequestHandle *ret;
struct ControlMessage *cm;
struct ConnectMessage *msg;
+
+ if (NULL != GNUNET_CONTAINER_multihashmap_get (h->peers,
+ &peer->hashPubKey))
+ GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING, "core_api", "Received CONNECT requests for already connected peer!\n");
cm = GNUNET_malloc (sizeof (struct ControlMessage) +
sizeof (struct ConnectMessage));
if (err_msg != NULL)
{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _("Error in communication with PEERINFO service\n"));
- /* return; */
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ _("Error in communication with PEERINFO service\n"));
+ /* return; */
}
if (peer == NULL)
&end_badly, "didn't generate all hostkeys within a reasonable amount of time!!!");
pg = GNUNET_TESTING_daemons_start (cfg,
- peers_left,
- peers_left,
+ peers_left, /* Total number of peers */
+ peers_left, /* Number of outstanding connections */
+ peers_left, /* Number of parallel ssh connections, or peers being started at once */
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, SECONDS_PER_PEER_START * num_peers),
&hostkey_callback,
NULL,
pg = GNUNET_TESTING_daemons_start (cfg,
num_peers,
10,
+ num_peers,
TIMEOUT,
NULL, NULL,
&peers_started_callback,
/* Start num_peers peers, call peers_started_callback on peer start, topology_callback on peer connect */
/* Read the API documentation for other parameters! */
pg = GNUNET_TESTING_daemons_start (cfg,
- num_peers,
- num_peers,
+ peers_left, /* Total number of peers */
+ peers_left, /* Number of outstanding connections */
+ peers_left, /* Number of parallel ssh connections, or peers being started at once */
TIMEOUT,
NULL,
NULL,
pg = GNUNET_TESTING_daemons_start (cfg,
num_peers,
2,
+ 2,
TIMEOUT,
NULL,
NULL,
peer_daemon_hash = GNUNET_CONTAINER_multihashmap_create(peers_left);
pg = GNUNET_TESTING_daemons_start (cfg,
- peers_left,
- peers_left,
+ peers_left, /* Total number of peers */
+ peers_left, /* Number of outstanding connections */
+ peers_left, /* Number of parallel ssh connections, or peers being started at once */
TIMEOUT,
&hostkey_callback,
NULL,
sctx->group = GNUNET_TESTING_daemons_start (sctx->cfg,
total,
total, /* Outstanding connections */
+ total, /* Outstanding ssh connections */
timeout,
NULL,
NULL,
* @param cfg configuration template to use
* @param total number of daemons to start
* @param max_concurrent_connections for testing, how many peers can
- * we connect to simultaneously
+* we connect to simultaneously
+ * @param max_concurrent_ssh when starting with ssh, how many ssh
+ * connections will we allow at once (based on remote hosts allowed!)
* @param timeout total time allowed for peers to start
* @param hostkey_callback function to call on each peers hostkey generation
* if NULL, peers will be started by this call, if non-null,
GNUNET_TESTING_daemons_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
unsigned int total,
unsigned int max_concurrent_connections,
+ unsigned int max_concurrent_ssh,
struct GNUNET_TIME_Relative timeout,
GNUNET_TESTING_NotifyHostkeyCreated
hostkey_callback, void *hostkey_cls,
#endif
peers_left = NUM_PEERS;
pg = GNUNET_TESTING_daemons_start (cfg,
- peers_left,
- NUM_PEERS,
+ peers_left, /* Total number of peers */
+ peers_left, /* Number of outstanding connections */
+ peers_left, /* Number of parallel ssh connections, or peers being started at once */
TIMEOUT,
NULL, NULL,
&my_cb, NULL, NULL, NULL, NULL);
peers_left = num_peers;
pg = GNUNET_TESTING_daemons_start (cfg,
- peers_left,
- peers_left,
+ peers_left, /* Total number of peers */
+ peers_left, /* Number of outstanding connections */
+ peers_left, /* Number of parallel ssh connections, or peers being started at once */
TIMEOUT,
NULL,
NULL, &my_cb, NULL, NULL, NULL, hosts);
pg = GNUNET_TESTING_daemons_start (cfg,
peers_left,
peers_left / 2,
+ peers_left,
timeout,
&hostkey_callback, NULL,
&peers_started_callback, NULL,
pg = GNUNET_TESTING_daemons_start (cfg,
peers_left,
peers_left / 2,
+ peers_left,
GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_SECONDS,
SECONDS_PER_PEER_START * num_peers),
"didn't start all daemons in reasonable amount of time!!!");
pg = GNUNET_TESTING_daemons_start (cfg,
- peers_left, peers_left,
+ peers_left, peers_left, peers_left,
TIMEOUT, &hostkey_callback,
NULL, &peers_started_callback, NULL,
&topology_callback, NULL, NULL);
pg = GNUNET_TESTING_daemons_start (cfg,
peers_left,
- peers_left, TIMEOUT, NULL, NULL,
+ peers_left,
+ peers_left,
+ TIMEOUT, NULL, NULL,
&peers_started_callback, NULL, NULL,
NULL, NULL);
#endif
peers_left = NUM_PEERS;
pg = GNUNET_TESTING_daemons_start (cfg,
+ peers_left,
peers_left,
peers_left,
TIMEOUT,
};
+struct RetryList
+{
+ /**
+ * Pointer to next element.
+ */
+ struct RetryList *next;
+
+ /**
+ * Pointer to previous element.
+ */
+ struct RetryList *prev;
+
+ /**
+ * The actual retry context.
+ */
+ struct RetrySendContext *retry_ctx;
+};
+
/**
* Network format for IPv4 addresses.
*/
* The priority of the message.
*/
unsigned int priority;
+
+ /**
+ * Entry in the DLL of retry items.
+ */
+ struct RetryList *retry_list_entry;
};
/**
};
+/**
+ * Head of retry DLL.
+ */
+static struct RetryList *retry_list_head;
+
+/**
+ * Tail of retry DLL.
+ */
+static struct RetryList *retry_list_tail;
+
/**
* Disconnect from a remote node. Clean up session if we have one for this peer
unix_transport_server_stop (void *cls)
{
struct Plugin *plugin = cls;
+ struct RetryList *pos;
+
+ pos = retry_list_head;
+
+ while(NULL != (pos = retry_list_head))
+ {
+ GNUNET_CONTAINER_DLL_remove(retry_list_head, retry_list_tail, pos);
+ if (GNUNET_SCHEDULER_NO_TASK != pos->retry_ctx->retry_task)
+ {
+ GNUNET_SCHEDULER_cancel(pos->retry_ctx->retry_task);
+ }
+ GNUNET_free(pos->retry_ctx->msg);
+ GNUNET_free(pos->retry_ctx->addr);
+ GNUNET_free(pos->retry_ctx);
+ GNUNET_free(pos);
+ }
if (plugin->select_task != GNUNET_SCHEDULER_NO_TASK)
{
struct RetrySendContext *retry_ctx = cls;
if (tc->reason == GNUNET_SCHEDULER_REASON_SHUTDOWN)
- return;
+ {
+ GNUNET_free(retry_ctx->msg);
+ GNUNET_free(retry_ctx->addr);
+ GNUNET_free(retry_ctx);
+ return;
+ }
+
unix_real_send (retry_ctx->plugin,
retry_ctx,
retry_ctx->send_handle,
size_t sbs;
struct sockaddr_un un;
size_t slen;
+ struct RetryList *retry_list_entry;
if (send_handle == NULL)
{
{
if (incoming_retry_context == NULL)
{
+ retry_list_entry = GNUNET_malloc(sizeof(struct RetryList));
retry_ctx = GNUNET_malloc(sizeof(struct RetrySendContext));
retry_ctx->addr = GNUNET_malloc(addrlen);
retry_ctx->msg = GNUNET_malloc(msgbuf_size);
retry_ctx->timeout = GNUNET_TIME_relative_to_absolute(timeout);
memcpy(&retry_ctx->target, target, sizeof(struct GNUNET_PeerIdentity));
retry_ctx->delay = GNUNET_TIME_UNIT_MILLISECONDS;
+ retry_ctx->retry_list_entry = retry_list_entry;
+ retry_list_entry->retry_ctx = retry_ctx;
+ GNUNET_CONTAINER_DLL_insert(retry_list_head, retry_list_tail, retry_list_entry);
}
else
{
if (incoming_retry_context != NULL)
{
+ GNUNET_CONTAINER_DLL_remove(retry_list_head, retry_list_tail, incoming_retry_context->retry_list_entry);
+ GNUNET_free(incoming_retry_context->retry_list_entry);
GNUNET_free(incoming_retry_context->msg);
GNUNET_free(incoming_retry_context->addr);
GNUNET_free(incoming_retry_context);