From f0b35049f6d9e743d2bc5fcf11664633d130d6fc Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 27 Jan 2019 04:21:27 +0100 Subject: [PATCH] more work towards fixing #5385 --- src/cadet/cadet_api_list_tunnels.c | 81 ++++++++++++------------------ src/cadet/gnunet-cadet.c | 45 +++++++++-------- src/cadet/gnunet-service-cadet.c | 8 +-- src/include/gnunet_cadet_service.h | 44 ++++++++++++---- src/include/gnunet_protocols.h | 9 ++++ 5 files changed, 103 insertions(+), 84 deletions(-) diff --git a/src/cadet/cadet_api_list_tunnels.c b/src/cadet/cadet_api_list_tunnels.c index 631b321b7..a2ba65993 100644 --- a/src/cadet/cadet_api_list_tunnels.c +++ b/src/cadet/cadet_api_list_tunnels.c @@ -71,26 +71,25 @@ struct GNUNET_CADET_ListTunnels /** - * Check that message received from CADET service is well-formed. + * Process a local reply about info on all tunnels, pass info to the user. * - * @param cls the `struct GNUNET_CADET_Handle` - * @param message the message we got - * @return #GNUNET_OK if the message is well-formed, - * #GNUNET_SYSERR otherwise + * @param cls a `struct GNUNET_CADET_ListTunnels *` + * @param info Message itself. */ -static int -check_get_tunnels (void *cls, - const struct GNUNET_MessageHeader *message) +static void +handle_get_tunnels (void *cls, + const struct GNUNET_CADET_LocalInfoTunnel *info) { - size_t esize; - - (void) cls; - esize = ntohs (message->size); - if (sizeof (struct GNUNET_CADET_LocalInfoTunnel) == esize) - return GNUNET_OK; - if (sizeof (struct GNUNET_MessageHeader) == esize) - return GNUNET_OK; - return GNUNET_SYSERR; + struct GNUNET_CADET_ListTunnels *lt = cls; + struct GNUNET_CADET_TunnelDetails td; + + td.peer = info->destination; + td.channels = ntohl (info->channels); + td.connections = ntohl (info->connections); + td.estate = ntohs (info->estate); + td.cstate = ntohs (info->cstate); + lt->tunnels_cb (lt->tunnels_cb_cls, + &td); } @@ -101,31 +100,15 @@ check_get_tunnels (void *cls, * @param message Message itself. */ static void -handle_get_tunnels (void *cls, - const struct GNUNET_MessageHeader *msg) +handle_get_tunnels_end (void *cls, + const struct GNUNET_MessageHeader *msg) { struct GNUNET_CADET_ListTunnels *lt = cls; - const struct GNUNET_CADET_LocalInfoTunnel *info = - (const struct GNUNET_CADET_LocalInfoTunnel *) msg; - - // FIXME: use two message types! - if (sizeof (struct GNUNET_CADET_LocalInfoTunnel) == ntohs (msg->size)) - lt->tunnels_cb (lt->tunnels_cb_cls, - &info->destination, - ntohl (info->channels), - ntohl (info->connections), - ntohs (info->estate), - ntohs (info->cstate)); - else - { - lt->tunnels_cb (lt->tunnels_cb_cls, - NULL, - 0, - 0, - 0, - 0); - GNUNET_CADET_list_tunnels_cancel (lt); - } + (void) msg; + + lt->tunnels_cb (lt->tunnels_cb_cls, + NULL); + GNUNET_CADET_list_tunnels_cancel (lt); } @@ -170,10 +153,14 @@ reconnect (void *cls) { struct GNUNET_CADET_ListTunnels *lt = cls; struct GNUNET_MQ_MessageHandler handlers[] = { - GNUNET_MQ_hd_var_size (get_tunnels, - GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS, - struct GNUNET_MessageHeader, - lt), + GNUNET_MQ_hd_fixed_size (get_tunnels, + GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS, + struct GNUNET_CADET_LocalInfoTunnel, + lt), + GNUNET_MQ_hd_fixed_size (get_tunnels_end, + GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS_END, + struct GNUNET_MessageHeader, + lt), GNUNET_MQ_handler_end () }; struct GNUNET_MessageHeader *msg; @@ -188,7 +175,7 @@ reconnect (void *cls) if (NULL == lt->mq) return; env = GNUNET_MQ_msg (msg, - GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS); + GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_TUNNELS); GNUNET_MQ_send (lt->mq, env); } @@ -199,9 +186,7 @@ reconnect (void *cls) * The callback will be called for every tunnel of the service. * Only one info request (of any kind) can be active at once. * - * WARNING: unstable API, likely to change in the future! - * - * @param h Handle to the cadet peer. + * @param cfg configuration to use * @param callback Function to call with the requested data. * @param callback_cls Closure for @c callback. * @return NULL on error diff --git a/src/cadet/gnunet-cadet.c b/src/cadet/gnunet-cadet.c index 3386f7464..9e2d105b3 100644 --- a/src/cadet/gnunet-cadet.c +++ b/src/cadet/gnunet-cadet.c @@ -109,7 +109,12 @@ static struct GNUNET_CADET_GetPath *gpo; /** * Active peer listing operation. */ -struct GNUNET_CADET_PeersLister *plo; +static struct GNUNET_CADET_PeersLister *plo; + +/** + * Active tunnel listing operation. + */ +static struct GNUNET_CADET_ListTunnels *tio; /** * Channel handle. @@ -231,6 +236,11 @@ shutdown_task (void *cls) GNUNET_CADET_list_peers_cancel (plo); plo = NULL; } + if (NULL != tio) + { + GNUNET_CADET_list_tunnels_cancel (tio); + tio = NULL; + } if (NULL != mh) { GNUNET_CADET_disconnect (mh); @@ -569,32 +579,25 @@ path_callback (void *cls, * Method called to retrieve information about all tunnels in CADET. * * @param cls Closure. - * @param peer Destination peer. - * @param channels Number of channels. - * @param connections Number of connections. - * @param estate Encryption state. - * @param cstate Connectivity state. + * @param td tunnel details */ static void tunnels_callback (void *cls, - const struct GNUNET_PeerIdentity *peer, - unsigned int channels, - unsigned int connections, - uint16_t estate, - uint16_t cstate) + const struct GNUNET_CADET_TunnelDetails *td) { - if (NULL == peer) + if (NULL == td) { + tio = NULL; GNUNET_SCHEDULER_shutdown(); return; } FPRINTF (stdout, "%s [ENC: %s, CON: %s] CHs: %u, CONNs: %u\n", - GNUNET_i2s_full (peer), - enc_2s (estate), - conn_2s (cstate), - channels, - connections); + GNUNET_i2s_full (&td->peer), + enc_2s (td->estate), + conn_2s (td->cstate), + td->channels, + td->connections); } @@ -692,11 +695,9 @@ static void get_tunnels (void *cls) { job = NULL; -#if FIXME5385 - GNUNET_CADET_list_tunnels (my_cfg, - &tunnels_callback, - NULL); -#endif + tio = GNUNET_CADET_list_tunnels (my_cfg, + &tunnels_callback, + NULL); } diff --git a/src/cadet/gnunet-service-cadet.c b/src/cadet/gnunet-service-cadet.c index a62ce4cb0..ef5fa6d7e 100644 --- a/src/cadet/gnunet-service-cadet.c +++ b/src/cadet/gnunet-service-cadet.c @@ -974,7 +974,7 @@ get_all_tunnels_iterator (void *cls, /** - * Handler for client's #GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS request. + * Handler for client's #GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_TUNNELS request. * * @param cls client Identification of the client. * @param message The actual message. @@ -990,7 +990,7 @@ handle_info_tunnels (void *cls, GCP_iterate_all (&get_all_tunnels_iterator, c); env = GNUNET_MQ_msg (reply, - GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS); + GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS_END); GNUNET_MQ_send (c->mq, env); GNUNET_SERVICE_client_continue (c->client); @@ -1036,7 +1036,7 @@ iter_channel (void *cls, /** - * Handler for client's #GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNEL request. + * Handler for client's #GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_TUNNEL request. * * @param cls Identification of the client. * @param msg The actual message. @@ -1435,7 +1435,7 @@ GNUNET_SERVICE_MAIN struct GNUNET_CADET_RequestPathInfoMessage, NULL), GNUNET_MQ_hd_fixed_size (info_tunnels, - GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS, + GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_TUNNELS, struct GNUNET_MessageHeader, NULL), GNUNET_MQ_hd_fixed_size (info_tunnel, diff --git a/src/include/gnunet_cadet_service.h b/src/include/gnunet_cadet_service.h index ce44be88a..82350ed32 100644 --- a/src/include/gnunet_cadet_service.h +++ b/src/include/gnunet_cadet_service.h @@ -571,6 +571,38 @@ void * GNUNET_CADET_get_path_cancel (struct GNUNET_CADET_GetPath *gp); +/** + * Details about a tunnel managed by CADET. + */ +struct GNUNET_CADET_TunnelDetails +{ + /** + * Target of the tunnel. + */ + struct GNUNET_PeerIdentity peer; + + /** + * How many channels use the tunnel. + */ + uint32_t channels; + + /** + * How many connections support the tunnel. + */ + uint32_t connections; + + /** + * What is our encryption state? + */ + uint16_t estate; + + /** + * What is our connectivity state? + */ + uint16_t cstate; +}; + + /** * Method called to retrieve information about all tunnels in CADET, called * once per tunnel. @@ -578,19 +610,11 @@ GNUNET_CADET_get_path_cancel (struct GNUNET_CADET_GetPath *gp); * After last tunnel has been reported, an additional call with NULL is done. * * @param cls Closure. - * @param peer Destination peer, or NULL on "EOF". - * @param channels Number of channels. - * @param connections Number of connections. - * @param estate Encryption state. - * @param cstate Connectivity state. + * @param td tunnel details, NULL for end of list */ typedef void (*GNUNET_CADET_TunnelsCB) (void *cls, - const struct GNUNET_PeerIdentity *peer, - unsigned int channels, - unsigned int connections, - uint16_t estate, - uint16_t cstate); + const struct GNUNET_CADET_TunnelDetails *td); /** diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h index 1b1bdc099..9d3280d36 100644 --- a/src/include/gnunet_protocols.h +++ b/src/include/gnunet_protocols.h @@ -2916,6 +2916,15 @@ extern "C" */ #define GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_PATH 1042 +/** + * End of local information about all tunnels of service. + */ +#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS_END 1043 + +/** + * Request local information about all tunnels of service. + */ +#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_TUNNELS 1044 /******************************** Application *******************************/ -- 2.25.1