From 3f945e6798d8d736ceb104b59ea1269a7abdfe8a Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 28 Apr 2019 19:32:10 +0200 Subject: towards flow control in TNG --- src/include/gnunet_protocols.h | 8 + .../gnunet_transport_communication_service.h | 113 +++++----- src/include/gnunet_transport_core_service.h | 85 ++++---- src/include/gnunet_transport_service.h | 232 +++++++++++++++------ 4 files changed, 286 insertions(+), 152 deletions(-) (limited to 'src/include') diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h index 27a7034b0..7a089ad65 100644 --- a/src/include/gnunet_protocols.h +++ b/src/include/gnunet_protocols.h @@ -1089,9 +1089,17 @@ extern "C" { /** * Message telling transport to limit its receive rate. + * (FIXME: was the above comment ever accurate?) + * + * Note: dead in TNG, replaced by RECV_OK! */ #define GNUNET_MESSAGE_TYPE_TRANSPORT_SET_QUOTA 366 +/** + * Message telling transport to limit its receive rate. + */ +#define GNUNET_MESSAGE_TYPE_TRANSPORT_RECV_OK 366 + /** * Request to look addresses of peers in server. */ diff --git a/src/include/gnunet_transport_communication_service.h b/src/include/gnunet_transport_communication_service.h index ca5a86074..ea1ff732e 100644 --- a/src/include/gnunet_transport_communication_service.h +++ b/src/include/gnunet_transport_communication_service.h @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2009-2018 GNUnet e.V. + Copyright (C) 2009-2019 GNUnet e.V. GNUnet is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published @@ -36,9 +36,8 @@ #define GNUNET_TRANSPORT_COMMUNICATION_SERVICE_H #ifdef __cplusplus -extern "C" -{ -#if 0 /* keep Emacsens' auto-indent happy */ +extern "C" { +#if 0 /* keep Emacsens' auto-indent happy */ } #endif #endif @@ -67,12 +66,13 @@ extern "C" * @param peer identity of the other peer * @param address where to send the message, human-readable * communicator-specific format, 0-terminated, UTF-8 - * @return #GNUNET_OK on success, #GNUNET_SYSERR if the provided address is invalid + * @return #GNUNET_OK on success, #GNUNET_SYSERR if the provided address is + * invalid */ -typedef int -(*GNUNET_TRANSPORT_CommunicatorMqInit) (void *cls, - const struct GNUNET_PeerIdentity *peer, - const char *address); +typedef int (*GNUNET_TRANSPORT_CommunicatorMqInit) ( + void *cls, + const struct GNUNET_PeerIdentity *peer, + const char *address); /** @@ -87,7 +87,8 @@ struct GNUNET_TRANSPORT_CommunicatorHandle; * FIXME: may want to distinguish bi-directional as well, * should we define a bit for that? Needed in DV logic (handle_dv_learn)! */ -enum GNUNET_TRANSPORT_CommunicatorCharacteristics { +enum GNUNET_TRANSPORT_CommunicatorCharacteristics +{ /** * Characteristics are unknown (i.e. DV). @@ -122,10 +123,10 @@ enum GNUNET_TRANSPORT_CommunicatorCharacteristics { * @param sender which peer sent the notification * @param msg payload */ -typedef void -(*GNUNET_TRANSPORT_CommunicatorNotify) (void *cls, - const struct GNUNET_PeerIdentity *sender, - const struct GNUNET_MessageHeader *msg); +typedef void (*GNUNET_TRANSPORT_CommunicatorNotify) ( + void *cls, + const struct GNUNET_PeerIdentity *sender, + const struct GNUNET_MessageHeader *msg); /** @@ -145,14 +146,15 @@ typedef void * @return NULL on error */ struct GNUNET_TRANSPORT_CommunicatorHandle * -GNUNET_TRANSPORT_communicator_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, - const char *config_section_name, - const char *addr_prefix, - enum GNUNET_TRANSPORT_CommunicatorCharacteristics cc, - GNUNET_TRANSPORT_CommunicatorMqInit mq_init, - void *mq_init_cls, - GNUNET_TRANSPORT_CommunicatorNotify notify_cb, - void *notify_cb_cls); +GNUNET_TRANSPORT_communicator_connect ( + const struct GNUNET_CONFIGURATION_Handle *cfg, + const char *config_section_name, + const char *addr_prefix, + enum GNUNET_TRANSPORT_CommunicatorCharacteristics cc, + GNUNET_TRANSPORT_CommunicatorMqInit mq_init, + void *mq_init_cls, + GNUNET_TRANSPORT_CommunicatorNotify notify_cb, + void *notify_cb_cls); /** @@ -161,22 +163,23 @@ GNUNET_TRANSPORT_communicator_connect (const struct GNUNET_CONFIGURATION_Handle * @param ch handle returned from connect */ void -GNUNET_TRANSPORT_communicator_disconnect (struct GNUNET_TRANSPORT_CommunicatorHandle *ch); +GNUNET_TRANSPORT_communicator_disconnect ( + struct GNUNET_TRANSPORT_CommunicatorHandle *ch); /* ************************* Receiving *************************** */ /** * Function called to notify communicator that we have received - * and processed the message. + * and processed the message. Used for flow control (if supported + * by the communicator). * * @param cls closure * @param success #GNUNET_SYSERR on failure (try to disconnect/reset connection) * #GNUNET_OK on success */ -typedef void -(*GNUNET_TRANSPORT_MessageCompletedCallback) (void *cls, - int success); +typedef void (*GNUNET_TRANSPORT_MessageCompletedCallback) (void *cls, + int success); /** @@ -200,12 +203,13 @@ typedef void * the tranport service is not yet up */ int -GNUNET_TRANSPORT_communicator_receive (struct GNUNET_TRANSPORT_CommunicatorHandle *handle, - const struct GNUNET_PeerIdentity *sender, - const struct GNUNET_MessageHeader *msg, - struct GNUNET_TIME_Relative expected_addr_validity, - GNUNET_TRANSPORT_MessageCompletedCallback cb, - void *cb_cls); +GNUNET_TRANSPORT_communicator_receive ( + struct GNUNET_TRANSPORT_CommunicatorHandle *handle, + const struct GNUNET_PeerIdentity *sender, + const struct GNUNET_MessageHeader *msg, + struct GNUNET_TIME_Relative expected_addr_validity, + GNUNET_TRANSPORT_MessageCompletedCallback cb, + void *cb_cls); /* ************************* Discovery *************************** */ @@ -220,7 +224,8 @@ struct GNUNET_TRANSPORT_QueueHandle; /** * Possible states of a connection. */ -enum GNUNET_TRANSPORT_ConnectionStatus { +enum GNUNET_TRANSPORT_ConnectionStatus +{ /** * Connection is down. @@ -255,13 +260,14 @@ enum GNUNET_TRANSPORT_ConnectionStatus { * @return API handle identifying the new MQ */ struct GNUNET_TRANSPORT_QueueHandle * -GNUNET_TRANSPORT_communicator_mq_add (struct GNUNET_TRANSPORT_CommunicatorHandle *ch, - const struct GNUNET_PeerIdentity *peer, - const char *address, - uint32_t mtu, - enum GNUNET_NetworkType nt, - enum GNUNET_TRANSPORT_ConnectionStatus cs, - struct GNUNET_MQ_Handle *mq); +GNUNET_TRANSPORT_communicator_mq_add ( + struct GNUNET_TRANSPORT_CommunicatorHandle *ch, + const struct GNUNET_PeerIdentity *peer, + const char *address, + uint32_t mtu, + enum GNUNET_NetworkType nt, + enum GNUNET_TRANSPORT_ConnectionStatus cs, + struct GNUNET_MQ_Handle *mq); /** @@ -291,10 +297,11 @@ struct GNUNET_TRANSPORT_AddressIdentifier; * @param expiration when does the communicator forsee this address expiring? */ struct GNUNET_TRANSPORT_AddressIdentifier * -GNUNET_TRANSPORT_communicator_address_add (struct GNUNET_TRANSPORT_CommunicatorHandle *ch, - const char *address, - enum GNUNET_NetworkType nt, - struct GNUNET_TIME_Relative expiration); +GNUNET_TRANSPORT_communicator_address_add ( + struct GNUNET_TRANSPORT_CommunicatorHandle *ch, + const char *address, + enum GNUNET_NetworkType nt, + struct GNUNET_TIME_Relative expiration); /** @@ -304,7 +311,8 @@ GNUNET_TRANSPORT_communicator_address_add (struct GNUNET_TRANSPORT_CommunicatorH * @param ai address that is no longer provided */ void -GNUNET_TRANSPORT_communicator_address_remove (struct GNUNET_TRANSPORT_AddressIdentifier *ai); +GNUNET_TRANSPORT_communicator_address_remove ( + struct GNUNET_TRANSPORT_AddressIdentifier *ai); /** @@ -326,13 +334,14 @@ GNUNET_TRANSPORT_communicator_address_remove (struct GNUNET_TRANSPORT_AddressIde * notify-API to @a pid's communicator @a comm */ void -GNUNET_TRANSPORT_communicator_notify (struct GNUNET_TRANSPORT_CommunicatorHandle *ch, - const struct GNUNET_PeerIdentity *pid, - const char *comm, - const struct GNUNET_MessageHeader *header); +GNUNET_TRANSPORT_communicator_notify ( + struct GNUNET_TRANSPORT_CommunicatorHandle *ch, + const struct GNUNET_PeerIdentity *pid, + const char *comm, + const struct GNUNET_MessageHeader *header); -#if 0 /* keep Emacsens' auto-indent happy */ +#if 0 /* keep Emacsens' auto-indent happy */ { #endif #ifdef __cplusplus @@ -342,6 +351,6 @@ GNUNET_TRANSPORT_communicator_notify (struct GNUNET_TRANSPORT_CommunicatorHandle /* ifndef GNUNET_TRANSPORT_COMMUNICATOR_SERVICE_H */ #endif -/** @} */ /* end of group */ +/** @} */ /* end of group */ /* end of gnunet_transport_communicator_service.h */ diff --git a/src/include/gnunet_transport_core_service.h b/src/include/gnunet_transport_core_service.h index f442b53c0..076514779 100644 --- a/src/include/gnunet_transport_core_service.h +++ b/src/include/gnunet_transport_core_service.h @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2009-2016 GNUnet e.V. + Copyright (C) 2009-2019 GNUnet e.V. GNUnet is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published @@ -11,7 +11,7 @@ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 . @@ -21,7 +21,7 @@ * @author Christian Grothoff * * @file - * API of the transport service towards the CORE service. + * API of the transport service towards the CORE service (TNG version) * * @defgroup transport TRANSPORT service * Communication with other peers @@ -34,9 +34,8 @@ #define GNUNET_TRANSPORT_CORE_SERVICE_H #ifdef __cplusplus -extern "C" -{ -#if 0 /* keep Emacsens' auto-indent happy */ +extern "C" { +#if 0 /* keep Emacsens' auto-indent happy */ } #endif #endif @@ -62,15 +61,15 @@ struct GNUNET_TRANSPORT_CoreHandle; * @param cls closure * @param peer the identity of the peer that connected; this * pointer will remain valid until the disconnect, hence - * applications do not necessarily have to make a copy + * applications do not necessarily have to make a copy * of the value if they only need it until disconnect * @param mq message queue to use to transmit to @a peer * @return closure to use in MQ handlers */ -typedef void * -(*GNUNET_TRANSPORT_NotifyConnect) (void *cls, - const struct GNUNET_PeerIdentity *peer, - struct GNUNET_MQ_Handle *mq); +typedef void *(*GNUNET_TRANSPORT_NotifyConnect) ( + void *cls, + const struct GNUNET_PeerIdentity *peer, + struct GNUNET_MQ_Handle *mq); /** @@ -84,33 +83,10 @@ typedef void * * @param handlers_cls closure of the handlers, was returned from the * connect notification callback */ -typedef void -(*GNUNET_TRANSPORT_NotifyDisconnect) (void *cls, - const struct GNUNET_PeerIdentity *peer, - void *handler_cls); - - -/** - * Function called if we have "excess" bandwidth to a peer. - * The notification will happen the first time we have excess - * bandwidth, and then only again after the client has performed - * some transmission to the peer. - * - * Excess bandwidth is defined as being allowed (by ATS) to send - * more data, and us reaching the limit of the capacity build-up - * (which, if we go past it, means we don't use available bandwidth). - * See also the "max carry" in `struct GNUNET_BANDWIDTH_Tracker`. - * - * @param cls the closure - * @param neighbour peer that we have excess bandwidth to - * @param handlers_cls closure of the handlers, was returned from the - * connect notification callback - */ -typedef void -(*GNUNET_TRANSPORT_NotifyExcessBandwidth)(void *cls, - const struct GNUNET_PeerIdentity *neighbour, - void *handlers_cls); - +typedef void (*GNUNET_TRANSPORT_NotifyDisconnect) ( + void *cls, + const struct GNUNET_PeerIdentity *peer, + void *handler_cls); /** @@ -136,8 +112,7 @@ GNUNET_TRANSPORT_core_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_MQ_MessageHandler *handlers, void *cls, GNUNET_TRANSPORT_NotifyConnect nc, - GNUNET_TRANSPORT_NotifyDisconnect nd, - GNUNET_TRANSPORT_NotifyExcessBandwidth neb); + GNUNET_TRANSPORT_NotifyDisconnect nd); /** @@ -149,8 +124,34 @@ void GNUNET_TRANSPORT_core_disconnect (struct GNUNET_TRANSPORT_CoreHandle *handle); +/** + * Notification from the CORE service to the TRANSPORT service + * that the CORE service has finished processing a message from + * TRANSPORT (via the @code{handlers} of #GNUNET_TRANSPORT_core_connect()) + * and that it is thus now OK for TRANSPORT to send more messages + * for @a pid. + * + * Used to provide flow control, this is our equivalent to + * #GNUNET_SERVICE_client_continue() of an ordinary service. + * + * Note that due to the use of a window, TRANSPORT may send multiple + * messages destined for the same peer even without an intermediate + * call to this function. However, CORE must still call this function + * once per message received, as otherwise eventually the window will + * be full and TRANSPORT will stop providing messages to CORE for @a + * pid. + * + * @param ch core handle + * @param pid which peer was the message from that was fully processed by CORE + */ +void +GNUNET_TRANSPORT_core_receive_continue (struct GNUNET_TRANSPORT_CoreHandle *ch, + const struct GNUNET_PeerIdentity *pid); + + /** * Checks if a given peer is connected to us and get the message queue. + * Convenience function. * * @param handle connection to transport service * @param peer the peer to check @@ -161,7 +162,7 @@ GNUNET_TRANSPORT_core_get_mq (struct GNUNET_TRANSPORT_CoreHandle *handle, const struct GNUNET_PeerIdentity *peer); -#if 0 /* keep Emacsens' auto-indent happy */ +#if 0 /* keep Emacsens' auto-indent happy */ { #endif #ifdef __cplusplus @@ -171,6 +172,6 @@ GNUNET_TRANSPORT_core_get_mq (struct GNUNET_TRANSPORT_CoreHandle *handle, /* ifndef GNUNET_TRANSPORT_CORE_SERVICE_H */ #endif -/** @} */ /* end of group */ +/** @} */ /* end of group */ /* end of gnunet_transport_core_service.h */ diff --git a/src/include/gnunet_transport_service.h b/src/include/gnunet_transport_service.h index c5cb10ad8..80949b417 100644 --- a/src/include/gnunet_transport_service.h +++ b/src/include/gnunet_transport_service.h @@ -11,7 +11,7 @@ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 . @@ -36,9 +36,8 @@ #define GNUNET_TRANSPORT_SERVICE_H #ifdef __cplusplus -extern "C" -{ -#if 0 /* keep Emacsens' auto-indent happy */ +extern "C" { +#if 0 /* keep Emacsens' auto-indent happy */ } #endif #endif @@ -71,8 +70,8 @@ struct GNUNET_TRANSPORT_OfferHelloHandle; * tc reason #GNUNET_SCHEDULER_REASON_TIMEOUT for fail * tc reasong #GNUNET_SCHEDULER_REASON_READ_READY for success * @param cont_cls closure for @a cont - * @return a `struct GNUNET_TRANSPORT_OfferHelloHandle` handle or NULL on failure, - * in case of failure @a cont will not be called + * @return a `struct GNUNET_TRANSPORT_OfferHelloHandle` handle or NULL on + * failure, in case of failure @a cont will not be called * */ struct GNUNET_TRANSPORT_OfferHelloHandle * @@ -88,7 +87,8 @@ GNUNET_TRANSPORT_offer_hello (const struct GNUNET_CONFIGURATION_Handle *cfg, * @param ohh the `struct GNUNET_TRANSPORT_OfferHelloHandle` to cancel */ void -GNUNET_TRANSPORT_offer_hello_cancel (struct GNUNET_TRANSPORT_OfferHelloHandle *ohh); +GNUNET_TRANSPORT_offer_hello_cancel ( + struct GNUNET_TRANSPORT_OfferHelloHandle *ohh); /* *********************** Address to String ******************* */ @@ -115,10 +115,9 @@ struct GNUNET_TRANSPORT_AddressToStringContext; * if #GNUNET_NO: address was invalid (or not supported) * if #GNUNET_SYSERR: communication error (IPC error) */ -typedef void -(*GNUNET_TRANSPORT_AddressToStringCallback) (void *cls, - const char *address, - int res); +typedef void (*GNUNET_TRANSPORT_AddressToStringCallback) (void *cls, + const char *address, + int res); /** @@ -134,12 +133,13 @@ typedef void * @return handle to cancel the operation, NULL on error */ struct GNUNET_TRANSPORT_AddressToStringContext * -GNUNET_TRANSPORT_address_to_string (const struct GNUNET_CONFIGURATION_Handle *cfg, - const struct GNUNET_HELLO_Address *address, - int numeric, - struct GNUNET_TIME_Relative timeout, - GNUNET_TRANSPORT_AddressToStringCallback aluc, - void *aluc_cls); +GNUNET_TRANSPORT_address_to_string ( + const struct GNUNET_CONFIGURATION_Handle *cfg, + const struct GNUNET_HELLO_Address *address, + int numeric, + struct GNUNET_TIME_Relative timeout, + GNUNET_TRANSPORT_AddressToStringCallback aluc, + void *aluc_cls); /** @@ -148,14 +148,16 @@ GNUNET_TRANSPORT_address_to_string (const struct GNUNET_CONFIGURATION_Handle *cf * @param alc the context handle */ void -GNUNET_TRANSPORT_address_to_string_cancel (struct GNUNET_TRANSPORT_AddressToStringContext *alc); +GNUNET_TRANSPORT_address_to_string_cancel ( + struct GNUNET_TRANSPORT_AddressToStringContext *alc); /* *********************** Monitoring ************************** */ /** - * Possible state of a neighbour. Initially, we are #GNUNET_TRANSPORT_PS_NOT_CONNECTED. + * Possible state of a neighbour. Initially, we are + * #GNUNET_TRANSPORT_PS_NOT_CONNECTED. * * Then, there are two main paths. If we receive a SYN message, we give * the inbound address to ATS. After the check we ask ATS for a suggestion @@ -174,14 +176,14 @@ GNUNET_TRANSPORT_address_to_string_cancel (struct GNUNET_TRANSPORT_AddressToStri * #GNUNET_TRANSPORT_PS_DISCONNECT. * * If the session is in trouble (i.e. transport-level disconnect or - * timeout), we go to #GNUNET_TRANSPORT_PS_RECONNECT_ATS where we ask ATS for a new - * address (we don't notify anyone about the disconnect yet). Once we - * have a new address, we enter #GNUNET_TRANSPORT_PS_RECONNECT_SENT and send a - * SYN message. If we receive a - * SYN_ACK, we go to #GNUNET_TRANSPORT_PS_CONNECTED and nobody noticed that we had - * trouble; we also send a ACK at this time just in case. If - * the operation times out, we go to #GNUNET_TRANSPORT_PS_DISCONNECT (and notify everyone - * about the lost connection). + * timeout), we go to #GNUNET_TRANSPORT_PS_RECONNECT_ATS where we ask ATS for a + * new address (we don't notify anyone about the disconnect yet). Once we have + * a new address, we enter #GNUNET_TRANSPORT_PS_RECONNECT_SENT and send a SYN + * message. If we receive a SYN_ACK, we go to #GNUNET_TRANSPORT_PS_CONNECTED + * and nobody noticed that we had trouble; we also send a ACK at this time just + * in case. If the operation times out, we go to + * #GNUNET_TRANSPORT_PS_DISCONNECT (and notify everyone about the lost + * connection). * * If ATS decides to switch addresses while we have a normal * connection, we go to #GNUNET_TRANSPORT_PS_CONNECTED_SWITCHING_SYN_SENT @@ -189,13 +191,14 @@ GNUNET_TRANSPORT_address_to_string_cancel (struct GNUNET_TRANSPORT_AddressToStri * primary connection to the suggested alternative from ATS, go back * to #GNUNET_TRANSPORT_PS_CONNECTED and send a ACK to the other peer just to be * sure. If the operation times out - * we go to #GNUNET_TRANSPORT_PS_CONNECTED (and notify ATS that the given alternative - * address is "invalid"). + * we go to #GNUNET_TRANSPORT_PS_CONNECTED (and notify ATS that the given + * alternative address is "invalid"). * - * Once a session is in #GNUNET_TRANSPORT_PS_DISCONNECT, it is cleaned up and then goes - * to (#GNUNET_TRANSPORT_PS_DISCONNECT_FINISHED). If we receive an explicit disconnect - * request, we can go from any state to #GNUNET_TRANSPORT_PS_DISCONNECT, possibly after - * generating disconnect notifications. + * Once a session is in #GNUNET_TRANSPORT_PS_DISCONNECT, it is cleaned up and + * then goes to (#GNUNET_TRANSPORT_PS_DISCONNECT_FINISHED). If we receive an + * explicit disconnect request, we can go from any state to + * #GNUNET_TRANSPORT_PS_DISCONNECT, possibly after generating disconnect + * notifications. * * Note that it is quite possible that while we are in any of these * states, we could receive a 'SYN' request from the other peer. @@ -323,12 +326,12 @@ struct GNUNET_TRANSPORT_PeerMonitoringContext; * @param state current state this peer is in * @param state_timeout timeout for the current state of the peer */ -typedef void -(*GNUNET_TRANSPORT_PeerIterateCallback) (void *cls, - const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_HELLO_Address *address, - enum GNUNET_TRANSPORT_PeerState state, - struct GNUNET_TIME_Absolute state_timeout); +typedef void (*GNUNET_TRANSPORT_PeerIterateCallback) ( + void *cls, + const struct GNUNET_PeerIdentity *peer, + const struct GNUNET_HELLO_Address *address, + enum GNUNET_TRANSPORT_PeerState state, + struct GNUNET_TIME_Absolute state_timeout); /** @@ -352,17 +355,18 @@ typedef void * @param cfg configuration to use * @param peer a specific peer identity to obtain information for, * NULL for all peers - * @param one_shot #GNUNET_YES to return the current state and then end (with NULL+NULL), - * #GNUNET_NO to monitor peers continuously + * @param one_shot #GNUNET_YES to return the current state and then end (with + * NULL+NULL), #GNUNET_NO to monitor peers continuously * @param peer_callback function to call with the results * @param peer_callback_cls closure for @a peer_callback */ struct GNUNET_TRANSPORT_PeerMonitoringContext * -GNUNET_TRANSPORT_monitor_peers (const struct GNUNET_CONFIGURATION_Handle *cfg, - const struct GNUNET_PeerIdentity *peer, - int one_shot, - GNUNET_TRANSPORT_PeerIterateCallback peer_callback, - void *peer_callback_cls); +GNUNET_TRANSPORT_monitor_peers ( + const struct GNUNET_CONFIGURATION_Handle *cfg, + const struct GNUNET_PeerIdentity *peer, + int one_shot, + GNUNET_TRANSPORT_PeerIterateCallback peer_callback, + void *peer_callback_cls); /** @@ -371,7 +375,8 @@ GNUNET_TRANSPORT_monitor_peers (const struct GNUNET_CONFIGURATION_Handle *cfg, * @param pic handle for the request to cancel */ void -GNUNET_TRANSPORT_monitor_peers_cancel (struct GNUNET_TRANSPORT_PeerMonitoringContext *pic); +GNUNET_TRANSPORT_monitor_peers_cancel ( + struct GNUNET_TRANSPORT_PeerMonitoringContext *pic); /* *********************** Blacklisting ************************ */ @@ -389,9 +394,9 @@ struct GNUNET_TRANSPORT_Blacklist; * @param pid peer to approve or disapproave * @return #GNUNET_OK if the connection is allowed, #GNUNET_SYSERR if not */ -typedef int -(*GNUNET_TRANSPORT_BlacklistCallback) (void *cls, - const struct GNUNET_PeerIdentity *pid); +typedef int (*GNUNET_TRANSPORT_BlacklistCallback) ( + void *cls, + const struct GNUNET_PeerIdentity *pid); /** @@ -539,11 +544,11 @@ struct GNUNET_TRANSPORT_SessionInfo * NULL with @a session being non-NULL if the monitor * was being cancelled while sessions were active */ -typedef void -(*GNUNET_TRANSPORT_SessionMonitorCallback) (void *cls, - struct GNUNET_TRANSPORT_PluginSession *session, - void **session_ctx, - const struct GNUNET_TRANSPORT_SessionInfo *info); +typedef void (*GNUNET_TRANSPORT_SessionMonitorCallback) ( + void *cls, + struct GNUNET_TRANSPORT_PluginSession *session, + void **session_ctx, + const struct GNUNET_TRANSPORT_SessionInfo *info); /** @@ -569,11 +574,122 @@ GNUNET_TRANSPORT_monitor_plugins (const struct GNUNET_CONFIGURATION_Handle *cfg, * @param pm handle of the request that is to be cancelled */ void -GNUNET_TRANSPORT_monitor_plugins_cancel (struct GNUNET_TRANSPORT_PluginMonitor *pm); +GNUNET_TRANSPORT_monitor_plugins_cancel ( + struct GNUNET_TRANSPORT_PluginMonitor *pm); + + +/** + * Opaque handle to the service. + */ +struct GNUNET_TRANSPORT_CoreHandle; + + +/** + * Function called to notify transport users that another + * peer connected to us. + * + * @param cls closure + * @param peer the identity of the peer that connected; this + * pointer will remain valid until the disconnect, hence + * applications do not necessarily have to make a copy + * of the value if they only need it until disconnect + * @param mq message queue to use to transmit to @a peer + * @return closure to use in MQ handlers + */ +typedef void *(*GNUNET_TRANSPORT_NotifyConnect) ( + void *cls, + const struct GNUNET_PeerIdentity *peer, + struct GNUNET_MQ_Handle *mq); + + +/** + * Function called to notify transport users that another peer + * disconnected from us. The message queue that was given to the + * connect notification will be destroyed and must not be used + * henceforth. + * + * @param cls closure from #GNUNET_TRANSPORT_core_connect + * @param peer the peer that disconnected + * @param handlers_cls closure of the handlers, was returned from the + * connect notification callback + */ +typedef void (*GNUNET_TRANSPORT_NotifyDisconnect) ( + void *cls, + const struct GNUNET_PeerIdentity *peer, + void *handler_cls); + + +/** + * Function called if we have "excess" bandwidth to a peer. + * The notification will happen the first time we have excess + * bandwidth, and then only again after the client has performed + * some transmission to the peer. + * + * Excess bandwidth is defined as being allowed (by ATS) to send + * more data, and us reaching the limit of the capacity build-up + * (which, if we go past it, means we don't use available bandwidth). + * See also the "max carry" in `struct GNUNET_BANDWIDTH_Tracker`. + * + * @param cls the closure + * @param neighbour peer that we have excess bandwidth to + * @param handlers_cls closure of the handlers, was returned from the + * connect notification callback + */ +typedef void (*GNUNET_TRANSPORT_NotifyExcessBandwidth) ( + void *cls, + const struct GNUNET_PeerIdentity *neighbour, + void *handlers_cls); + + +/** + * Connect to the transport service. Note that the connection may + * complete (or fail) asynchronously. + * + * @param cfg configuration to use + * @param self our own identity (API should check that it matches + * the identity found by transport), or NULL (no check) + * @param handlers array of message handlers; note that the + * closures provided will be ignored and replaced + * with the respective return value from @a nc + * @param handlers array with handlers to call when we receive messages, or NULL + * @param cls closure for the @a nc, @a nd and @a neb callbacks + * @param nc function to call on connect events, or NULL + * @param nd function to call on disconnect events, or NULL + * @param neb function to call if we have excess bandwidth to a peer, or NULL + * @return NULL on error + */ +struct GNUNET_TRANSPORT_CoreHandle * +GNUNET_TRANSPORT_core_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, + const struct GNUNET_PeerIdentity *self, + const struct GNUNET_MQ_MessageHandler *handlers, + void *cls, + GNUNET_TRANSPORT_NotifyConnect nc, + GNUNET_TRANSPORT_NotifyDisconnect nd, + GNUNET_TRANSPORT_NotifyExcessBandwidth neb); + + +/** + * Disconnect from the transport service. + * + * @param handle handle returned from connect + */ +void +GNUNET_TRANSPORT_core_disconnect (struct GNUNET_TRANSPORT_CoreHandle *handle); +/** + * Checks if a given peer is connected to us and get the message queue. + * + * @param handle connection to transport service + * @param peer the peer to check + * @return NULL if disconnected, otherwise message queue for @a peer + */ +struct GNUNET_MQ_Handle * +GNUNET_TRANSPORT_core_get_mq (struct GNUNET_TRANSPORT_CoreHandle *handle, + const struct GNUNET_PeerIdentity *peer); + -#if 0 /* keep Emacsens' auto-indent happy */ +#if 0 /* keep Emacsens' auto-indent happy */ { #endif #ifdef __cplusplus @@ -583,6 +699,6 @@ GNUNET_TRANSPORT_monitor_plugins_cancel (struct GNUNET_TRANSPORT_PluginMonitor * /* ifndef GNUNET_TRANSPORT_SERVICE_H */ #endif -/** @} */ /* end of group */ +/** @} */ /* end of group */ /* end of gnunet_transport_service.h */ -- cgit v1.2.3