From c55971f17dc99f9833af48e078c8f681be771cb7 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 5 Feb 2015 12:52:20 +0000 Subject: big ATS refactoring, no serious semantic changes should stem from this --- src/ats/gnunet-service-ats_connectivity.c | 148 ++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) (limited to 'src/ats/gnunet-service-ats_connectivity.c') diff --git a/src/ats/gnunet-service-ats_connectivity.c b/src/ats/gnunet-service-ats_connectivity.c index da943f984..4aee2ddb8 100644 --- a/src/ats/gnunet-service-ats_connectivity.c +++ b/src/ats/gnunet-service-ats_connectivity.c @@ -34,8 +34,124 @@ #include "gnunet-service-ats.h" #include "gnunet-service-ats_addresses.h" #include "gnunet-service-ats_connectivity.h" +#include "gnunet-service-ats_plugins.h" #include "ats.h" + +/** + * Pending Address suggestion requests + */ +struct GAS_Addresses_Suggestion_Requests +{ + /** + * Next in DLL + */ + struct GAS_Addresses_Suggestion_Requests *next; + + /** + * Previous in DLL + */ + struct GAS_Addresses_Suggestion_Requests *prev; + + /** + * Peer ID + */ + struct GNUNET_PeerIdentity id; +}; + + +/** + * Address suggestion requests DLL head. + * FIXME: This must become a Multipeermap! O(n) operations + * galore instead of O(1)!!! + */ +static struct GAS_Addresses_Suggestion_Requests *pending_requests_head; + +/** + * Address suggestion requests DLL tail + */ +static struct GAS_Addresses_Suggestion_Requests *pending_requests_tail; + + + + +/** + * Cancel address suggestions for a peer + * + * @param peer the peer id + */ +void +GAS_addresses_request_address_cancel (const struct GNUNET_PeerIdentity *peer) +{ + struct GAS_Addresses_Suggestion_Requests *cur = pending_requests_head; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Received request: `%s' for peer %s\n", + "request_address_cancel", + GNUNET_i2s (peer)); + + while (NULL != cur) + { + if (0 == memcmp (peer, &cur->id, sizeof(cur->id))) + break; /* found */ + cur = cur->next; + } + + if (NULL == cur) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "No address requests pending for peer `%s', cannot remove!\n", + GNUNET_i2s (peer)); + return; + } + GAS_plugin_request_connect_stop (peer); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Removed request pending for peer `%s\n", + GNUNET_i2s (peer)); + GNUNET_CONTAINER_DLL_remove (pending_requests_head, + pending_requests_tail, + cur); + GNUNET_free (cur); +} + + +/** + * Request address suggestions for a peer + * + * @param peer the peer id + */ +void +GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer) +{ + struct GAS_Addresses_Suggestion_Requests *cur = pending_requests_head; + + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, + "Received `%s' for peer `%s'\n", + "REQUEST ADDRESS", + GNUNET_i2s (peer)); + + while (NULL != cur) + { + if (0 == memcmp (peer, &cur->id, sizeof(cur->id))) + break; /* already suggesting */ + cur = cur->next; + } + if (NULL == cur) + { + cur = GNUNET_new (struct GAS_Addresses_Suggestion_Requests); + cur->id = *peer; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Adding new address suggestion request for `%s'\n", + GNUNET_i2s (peer)); + GNUNET_CONTAINER_DLL_insert (pending_requests_head, + pending_requests_tail, + cur); + } + GAS_plugin_request_connect_start (peer); +} + + + /** * Handle 'request address' messages from clients. * @@ -83,4 +199,36 @@ GAS_handle_request_address_cancel (void *cls, GNUNET_SERVER_receive_done (client, GNUNET_OK); } + +/** + * Unregister a client (which may have been a connectivity client, + * but this is not assured). + * + * @param client handle of the (now dead) client + */ +void +GAS_connectivity_remove_client (struct GNUNET_SERVER_Client *client) +{ + // FIXME +} + + +/** + * Shutdown connectivity subsystem. + */ +void +GAS_connectivity_done () +{ + struct GAS_Addresses_Suggestion_Requests *cur; + + while (NULL != (cur = pending_requests_head)) + { + GNUNET_CONTAINER_DLL_remove (pending_requests_head, + pending_requests_tail, + cur); + GNUNET_free(cur); + } +} + + /* end of gnunet-service-ats_connectivity.c */ -- cgit v1.2.3