From 1c9f269ea5cadb20bb5f7fc209274ba5d6af4749 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 27 Jan 2019 04:29:52 +0100 Subject: [PATCH] in principle finished with #5385, could use some testing... --- doc/man/gnunet-cadet.1 | 5 +- src/cadet/Makefile.am | 1 - src/cadet/cadet_api_get_tunnel.c | 279 ----------------------------- src/cadet/gnunet-cadet.c | 90 ---------- src/cadet/gnunet-service-cadet.c | 107 ----------- src/include/gnunet_cadet_service.h | 59 ------ src/include/gnunet_protocols.h | 48 ++--- 7 files changed, 18 insertions(+), 571 deletions(-) delete mode 100644 src/cadet/cadet_api_get_tunnel.c diff --git a/doc/man/gnunet-cadet.1 b/doc/man/gnunet-cadet.1 index 3551a335d..9c84066bc 100644 --- a/doc/man/gnunet-cadet.1 +++ b/doc/man/gnunet-cadet.1 @@ -17,7 +17,7 @@ and using "\fBgnunet\-cadet\fP \fIPEER_ID SHARED_SECRET\fR" to establish one circuit to that peer from any other peer. The receiving process will only accept one incoming circuit, but several commands using the same \fI-o\fR can be issued to satisfy multiple requests. -For one-to-many communication \fBgnunet\-social\fP may be better +For one\-to\-many communication \fBgnunet\-social\fP may be better suited, however. .SH SPECIFIC OPTIONS @@ -40,9 +40,6 @@ Provide information about a patricular peer. .IP "\-P, \-\-peers" Provide information about all peers. .B -.IP "\-t TUNNEL_ID, \-\-tunnel=TUNNEL_ID" -Provide information about a patricular tunnel. -.B .IP "\-T, \-\-tunnels" Provide information about all tunnels. diff --git a/src/cadet/Makefile.am b/src/cadet/Makefile.am index 80ad76737..e7d42f60f 100644 --- a/src/cadet/Makefile.am +++ b/src/cadet/Makefile.am @@ -36,7 +36,6 @@ libgnunetcadet_la_SOURCES = \ cadet_api.c \ cadet_api_get_channel.c \ cadet_api_get_path.c \ - cadet_api_get_tunnel.c \ cadet_api_list_peers.c \ cadet_api_list_tunnels.c \ cadet_api_helper.c diff --git a/src/cadet/cadet_api_get_tunnel.c b/src/cadet/cadet_api_get_tunnel.c deleted file mode 100644 index 1d2776352..000000000 --- a/src/cadet/cadet_api_get_tunnel.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 2011, 2017 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 - by the Free Software Foundation, either version 3 of the License, - or (at your option) any later version. - - GNUnet is distributed in the hope that it will be useful, but - 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 . - - SPDX-License-Identifier: AGPL3.0-or-later -*/ -/** - * @file cadet/cadet_api_get_tunnel.c - * @brief cadet api: client implementation of cadet service - * @author Bartlomiej Polot - * @author Christian Grothoff - */ -#include "platform.h" -#include "gnunet_util_lib.h" -#include "gnunet_constants.h" -#include "gnunet_cadet_service.h" -#include "cadet.h" -#include "cadet_protocol.h" - - -/** - * Operation handle. - */ -struct GNUNET_CADET_GetTunnel -{ - - /** - * Monitor callback - */ - GNUNET_CADET_TunnelCB callback; - - /** - * Closure for @e callback. - */ - void *callback_cls; - - /** - * Message queue to talk to CADET service. - */ - struct GNUNET_MQ_Handle *mq; - - /** - * Configuration we use. - */ - const struct GNUNET_CONFIGURATION_Handle *cfg; - - /** - * Task to reconnect. - */ - struct GNUNET_SCHEDULER_Task *reconnect_task; - - /** - * Backoff for reconnect attempts. - */ - struct GNUNET_TIME_Relative backoff; - - /** - * Peer we want information about. - */ - struct GNUNET_PeerIdentity id; -}; - - - -/** - * Check that message received from CADET service is well-formed. - * - * @param cls the `struct GNUNET_CADET_Handle` - * @param msg the message we got - * @return #GNUNET_OK if the message is well-formed, - * #GNUNET_SYSERR otherwise - */ -static int -check_get_tunnel (void *cls, - const struct GNUNET_CADET_LocalInfoTunnel *msg) -{ - unsigned int ch_n; - unsigned int c_n; - size_t esize; - size_t msize; - - (void) cls; - /* Verify message sanity */ - msize = ntohs (msg->header.size); - esize = sizeof (struct GNUNET_CADET_LocalInfoTunnel); - if (esize > msize) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - ch_n = ntohl (msg->channels); - c_n = ntohl (msg->connections); - esize += ch_n * sizeof (struct GNUNET_CADET_ChannelTunnelNumber); - esize += c_n * sizeof (struct GNUNET_CADET_ConnectionTunnelIdentifier); - if (msize != esize) - { - GNUNET_break_op (0); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "m:%u, e: %u (%u ch, %u conn)\n", - (unsigned int) msize, - (unsigned int) esize, - ch_n, - c_n); - return GNUNET_SYSERR; - } - return GNUNET_OK; -} - - -/** - * Process a local tunnel info reply, pass info to the user. - * - * @param cls a `struct GNUNET_CADET_GetTunnel *` - * @param msg Message itself. - */ -static void -handle_get_tunnel (void *cls, - const struct GNUNET_CADET_LocalInfoTunnel *msg) -{ - struct GNUNET_CADET_GetTunnel *gt = cls; - unsigned int ch_n; - unsigned int c_n; - const struct GNUNET_CADET_ConnectionTunnelIdentifier *conns; - const struct GNUNET_CADET_ChannelTunnelNumber *chns; - - ch_n = ntohl (msg->channels); - c_n = ntohl (msg->connections); - - /* Call Callback with tunnel info. */ - conns = (const struct GNUNET_CADET_ConnectionTunnelIdentifier *) &msg[1]; - chns = (const struct GNUNET_CADET_ChannelTunnelNumber *) &conns[c_n]; - gt->callback (gt->callback_cls, - &msg->destination, - ch_n, - c_n, - chns, - conns, - ntohs (msg->estate), - ntohs (msg->cstate)); - GNUNET_CADET_get_tunnel_cancel (gt); -} - - -/** - * Reconnect to the service and try again. - * - * @param cls a `struct GNUNET_CADET_GetTunnel` operation - */ -static void -reconnect (void *cls); - - -/** - * Function called on connection trouble. Reconnects. - * - * @param cls a `struct GNUNET_CADET_GetTunnel` - * @param error error code from MQ - */ -static void -error_handler (void *cls, - enum GNUNET_MQ_Error error) -{ - struct GNUNET_CADET_GetTunnel *gt = cls; - - GNUNET_MQ_destroy (gt->mq); - gt->mq = NULL; - gt->backoff = GNUNET_TIME_randomized_backoff (gt->backoff, - GNUNET_TIME_UNIT_MINUTES); - gt->reconnect_task = GNUNET_SCHEDULER_add_delayed (gt->backoff, - &reconnect, - gt); -} - - -/** - * Reconnect to the service and try again. - * - * @param cls a `struct GNUNET_CADET_GetTunnel` operation - */ -static void -reconnect (void *cls) -{ - struct GNUNET_CADET_GetTunnel *gt = cls; - struct GNUNET_MQ_MessageHandler handlers[] = { - GNUNET_MQ_hd_var_size (get_tunnel, - GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNEL, - struct GNUNET_CADET_LocalInfoTunnel, - gt), - GNUNET_MQ_handler_end () - }; - struct GNUNET_MQ_Envelope *env; - struct GNUNET_CADET_LocalInfo *msg; - - gt->reconnect_task = NULL; - gt->mq = GNUNET_CLIENT_connect (gt->cfg, - "cadet", - handlers, - &error_handler, - gt); - if (NULL == gt->mq) - return; - env = GNUNET_MQ_msg (msg, - GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNEL); - msg->peer = gt->id; - GNUNET_MQ_send (gt->mq, - env); -} - -/** - * Request information about a tunnel of the running cadet peer. - * The callback will be called for the tunnel once. - * - * @param cfg configuration to use - * @param id Peer whose tunnel to examine. - * @param callback Function to call with the requested data. - * @param callback_cls Closure for @c callback. - * @return NULL on error - */ -struct GNUNET_CADET_GetTunnel * -GNUNET_CADET_get_tunnel (const struct GNUNET_CONFIGURATION_Handle *cfg, - const struct GNUNET_PeerIdentity *id, - GNUNET_CADET_TunnelCB callback, - void *callback_cls) -{ - struct GNUNET_CADET_GetTunnel *gt; - - if (NULL == callback) - { - GNUNET_break (0); - return NULL; - } - gt = GNUNET_new (struct GNUNET_CADET_GetTunnel); - gt->callback = callback; - gt->callback_cls = callback_cls; - gt->cfg = cfg; - gt->id = *id; - reconnect (gt); - if (NULL == gt->mq) - { - GNUNET_free (gt); - return NULL; - } - return gt; -} - - -/** - * Cancel a monitor request. The monitor callback will not be called. - * - * @param lt operation handle - * @return Closure given to #GNUNET_CADET_get_tunnel(), if any. - */ -void * -GNUNET_CADET_get_tunnel_cancel (struct GNUNET_CADET_GetTunnel *gt) -{ - void *ret = gt->callback_cls; - - if (NULL != gt->mq) - GNUNET_MQ_destroy (gt->mq); - if (NULL != gt->reconnect_task) - GNUNET_SCHEDULER_cancel (gt->reconnect_task); - GNUNET_free (gt); - return ret; -} - -/* end of cadet_api_get_tunnel.c */ diff --git a/src/cadet/gnunet-cadet.c b/src/cadet/gnunet-cadet.c index 9e2d105b3..dba517a7b 100644 --- a/src/cadet/gnunet-cadet.c +++ b/src/cadet/gnunet-cadet.c @@ -46,11 +46,6 @@ static char *peer_id; */ static int request_tunnels; -/** - * Option --tunnel - */ -static char *tunnel_id; - /** * Option --connection */ @@ -601,47 +596,6 @@ tunnels_callback (void *cls, } -/** - * Method called to retrieve information about a specific tunnel the cadet peer - * has established, o`r is trying to establish. - * - * @param cls Closure. - * @param peer Peer towards whom the tunnel is directed. - * @param n_channels Number of channels. - * @param n_connections Number of connections. - * @param channels Channels. - * @param connections Connections. - * @param estate Encryption status. - * @param cstate Connectivity status. - */ -static void -tunnel_callback (void *cls, - const struct GNUNET_PeerIdentity *peer, - unsigned int n_channels, - unsigned int n_connections, - const struct GNUNET_CADET_ChannelTunnelNumber *channels, - const struct GNUNET_CADET_ConnectionTunnelIdentifier *connections, - unsigned int estate, - unsigned int cstate) -{ - unsigned int i; - - if (NULL != peer) - { - FPRINTF (stdout, "Tunnel %s\n", GNUNET_i2s_full (peer)); - FPRINTF (stdout, "\t%u channels\n", n_channels); - for (i = 0; i < n_channels; i++) - FPRINTF (stdout, "\t\t%X\n", ntohl (channels[i].cn)); - FPRINTF (stdout, "\t%u connections\n", n_connections); - for (i = 0; i < n_connections; i++) - FPRINTF (stdout, "\t\t%s\n", GNUNET_sh2s (&connections[i].connection_of_tunnel)); - FPRINTF (stdout, "\tencryption state: %s\n", enc_2s (estate)); - FPRINTF (stdout, "\tconnection state: %s\n", conn_2s (cstate)); - } - GNUNET_SCHEDULER_shutdown (); -} - - /** * Call CADET's meta API, get all peers known to a peer. * @@ -701,37 +655,6 @@ get_tunnels (void *cls) } -/** - * Call CADET's monitor API, get info of one tunnel. - * - * @param cls Closure (unused). - */ -static void -show_tunnel (void *cls) -{ - struct GNUNET_PeerIdentity pid; - - job = NULL; - if (GNUNET_OK != - GNUNET_CRYPTO_eddsa_public_key_from_string (tunnel_id, - strlen (tunnel_id), - &pid.public_key)) - { - fprintf (stderr, - _("Invalid tunnel owner `%s'\n"), - tunnel_id); - GNUNET_SCHEDULER_shutdown (); - return; - } -#if FIXME5385 - GNUNET_CADET_get_tunnel (my_cfg, - &pid, - &tunnel_callback, - NULL); -#endif -} - - /** * Call CADET's monitor API, get info of one channel. * @@ -787,7 +710,6 @@ run (void *cls, target_port = args[1]; if ( (0 != (request_peers | request_tunnels) - || NULL != tunnel_id || NULL != conn_id || NULL != channel_id) && target_id != NULL) @@ -805,13 +727,6 @@ run (void *cls, job = GNUNET_SCHEDULER_add_now (&show_peer, NULL); } - else if (NULL != tunnel_id) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Show tunnel\n"); - job = GNUNET_SCHEDULER_add_now (&show_tunnel, - NULL); - } else if (NULL != channel_id) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -959,11 +874,6 @@ main (int argc, "peers", gettext_noop ("Provide information about all peers"), &request_peers), - GNUNET_GETOPT_option_string ('t', - "tunnel", - "TUNNEL_ID", - gettext_noop ("Provide information about a particular tunnel"), - &tunnel_id), GNUNET_GETOPT_option_flag ('T', "tunnels", gettext_noop ("Provide information about all tunnels"), diff --git a/src/cadet/gnunet-service-cadet.c b/src/cadet/gnunet-service-cadet.c index ef5fa6d7e..97950a18a 100644 --- a/src/cadet/gnunet-service-cadet.c +++ b/src/cadet/gnunet-service-cadet.c @@ -997,109 +997,6 @@ handle_info_tunnels (void *cls, } -/** - * Update the message with information about the connection. - * - * @param cls a `struct GNUNET_CADET_LocalInfoTunnel` message to update - * @param ct a connection about which we should store information in @a cls - */ -static void -iter_connection (void *cls, - struct CadetTConnection *ct) -{ - struct GNUNET_CADET_LocalInfoTunnel *msg = cls; - struct CadetConnection *cc = ct->cc; - struct GNUNET_CADET_ConnectionTunnelIdentifier *h; - - h = (struct GNUNET_CADET_ConnectionTunnelIdentifier *) &msg[1]; - h[msg->connections++] = *(GCC_get_id (cc)); -} - - -/** - * Update the message with information about the channel. - * - * @param cls a `struct GNUNET_CADET_LocalInfoTunnel` message to update - * @param ch a channel about which we should store information in @a cls - */ -static void -iter_channel (void *cls, - struct CadetChannel *ch) -{ - struct GNUNET_CADET_LocalInfoTunnel *msg = cls; - struct GNUNET_CADET_ConnectionTunnelIdentifier *h = (struct GNUNET_CADET_ConnectionTunnelIdentifier *) &msg[1]; - struct GNUNET_CADET_ChannelTunnelNumber *chn - = (struct GNUNET_CADET_ChannelTunnelNumber *) &h[msg->connections]; - - chn[msg->channels++] = GCCH_get_id (ch); -} - - -/** - * Handler for client's #GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_TUNNEL request. - * - * @param cls Identification of the client. - * @param msg The actual message. - */ -static void -handle_info_tunnel (void *cls, - const struct GNUNET_CADET_LocalInfo *msg) -{ - struct CadetClient *c = cls; - struct GNUNET_MQ_Envelope *env; - struct GNUNET_CADET_LocalInfoTunnel *resp; - struct CadetTunnel *t; - struct CadetPeer *p; - unsigned int ch_n; - unsigned int c_n; - - p = GCP_get (&msg->peer, - GNUNET_NO); - t = GCP_get_tunnel (p, - GNUNET_NO); - if (NULL == t) - { - /* We don't know the tunnel */ - struct GNUNET_MQ_Envelope *env; - struct GNUNET_CADET_LocalInfoTunnel *warn; - - LOG (GNUNET_ERROR_TYPE_INFO, - "Tunnel to %s unknown\n", - GNUNET_i2s_full (&msg->peer)); - env = GNUNET_MQ_msg (warn, - GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNEL); - warn->destination = msg->peer; - GNUNET_MQ_send (c->mq, - env); - GNUNET_SERVICE_client_continue (c->client); - return; - } - - /* Initialize context */ - ch_n = GCT_count_channels (t); - c_n = GCT_count_any_connections (t); - env = GNUNET_MQ_msg_extra (resp, - c_n * sizeof (struct GNUNET_CADET_ConnectionTunnelIdentifier) + - ch_n * sizeof (struct GNUNET_CADET_ChannelTunnelNumber), - GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNEL); - resp->destination = msg->peer; - /* Do not reorder! #iter_channel needs counters in HBO! */ - GCT_iterate_connections (t, - &iter_connection, - resp); - GCT_iterate_channels (t, - &iter_channel, - resp); - resp->connections = htonl (resp->connections); - resp->channels = htonl (resp->channels); - resp->cstate = htons (0); - resp->estate = htons (GCT_get_estate (t)); - GNUNET_MQ_send (c->mq, - env); - GNUNET_SERVICE_client_continue (c->client); -} - - /** * Callback called when a client connects to the service. * @@ -1438,10 +1335,6 @@ GNUNET_SERVICE_MAIN GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_TUNNELS, struct GNUNET_MessageHeader, NULL), - GNUNET_MQ_hd_fixed_size (info_tunnel, - GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNEL, - struct GNUNET_CADET_LocalInfo, - NULL), GNUNET_MQ_handler_end ()); /* end of gnunet-service-cadet-new.c */ diff --git a/src/include/gnunet_cadet_service.h b/src/include/gnunet_cadet_service.h index 82350ed32..ac3d11216 100644 --- a/src/include/gnunet_cadet_service.h +++ b/src/include/gnunet_cadet_service.h @@ -649,65 +649,6 @@ void * GNUNET_CADET_list_tunnels_cancel (struct GNUNET_CADET_ListTunnels *lt); - -/** - * Method called to retrieve information about a specific tunnel the cadet peer - * has established, o`r is trying to establish. - * - * @param cls Closure. - * @param peer Peer towards whom the tunnel is directed. - * @param n_channels Number of channels. - * @param n_connections Number of connections. - * @param channels Channels. - * @param connections Connections. - * @param estate Encryption state. - * @param cstate Connectivity state. - */ -typedef void -(*GNUNET_CADET_TunnelCB) (void *cls, - const struct GNUNET_PeerIdentity *peer, - unsigned int n_channels, - unsigned int n_connections, - const struct GNUNET_CADET_ChannelTunnelNumber *channels, - const struct GNUNET_CADET_ConnectionTunnelIdentifier *connections, - unsigned int estate, - unsigned int cstate); - - -/** - * Operation handle. - */ -struct GNUNET_CADET_GetTunnel; - - -/** - * Request information about a tunnel of the running cadet peer. - * The callback will be called for the tunnel once. - * Only one info request (of any kind) can be active at once. - * - * @param cfg configuration to use - * @param id Peer whose tunnel to examine. - * @param callback Function to call with the requested data. - * @param callback_cls Closure for @c callback. - * @return NULL on error - */ -struct GNUNET_CADET_GetTunnel * -GNUNET_CADET_get_tunnel (const struct GNUNET_CONFIGURATION_Handle *cfg, - const struct GNUNET_PeerIdentity *id, - GNUNET_CADET_TunnelCB callback, - void *callback_cls); - - -/** - * Cancel a monitor request. The monitor callback will not be called. - * - * @param lt operation handle - * @return Closure given to #GNUNET_CADET_get_tunnel(), if any. - */ -void * -GNUNET_CADET_get_tunnel_cancel (struct GNUNET_CADET_GetTunnel *gt); - - #if 0 /* keep Emacsens' auto-indent happy */ { #endif diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h index 9d3280d36..1cd06de8d 100644 --- a/src/include/gnunet_protocols.h +++ b/src/include/gnunet_protocols.h @@ -2862,29 +2862,29 @@ extern "C" #define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_CHANNEL 1031 /** - * Local information about all tunnels of service. + * End of local information of service about channels. */ -#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS 1032 +#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_CHANNEL_END 1032 /** - * Local information of service about a specific tunnel. + * Request local information about all peers known to the service. */ -#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNEL 1033 +#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_PEERS 1033 /** - * Local information about all connections of service. + * Local information about all peers known to the service. */ -#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_CONNECTIONS 1034 +#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PEERS 1034 /** - * Local information of service about a specific connection. + * End of local information about all peers known to the service. */ -#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_CONNECTION 1035 +#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PEERS_END 1035 /** - * Local information about all peers known to the service. + * Request local information of service about paths to specific peer. */ -#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PEERS 1036 +#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_PATH 1036 /** * Local information of service about a specific path. @@ -2892,39 +2892,25 @@ extern "C" #define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PATH 1037 /** - * End of local information of service about channels. - */ -#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_CHANNEL_END 1038 - -/** - * End of local information about all peers known to the service. - */ -#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PEERS_END 1039 - -/** - * Request local information about all peers known to the service. + * End of local information of service about a specific path. */ -#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_PEERS 1040 +#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PATH_END 1038 /** - * End of local information of service about a specific path. + * Request local information about all tunnels of service. */ -#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PATH_END 1041 +#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_TUNNELS 1039 /** - * Request local information of service about paths to specific peer. + * Local information about all tunnels of service. */ -#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_PATH 1042 +#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS 1040 /** * End of local information about all tunnels of service. */ -#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS_END 1043 +#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS_END 1041 -/** - * Request local information about all tunnels of service. - */ -#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_TUNNELS 1044 /******************************** Application *******************************/ -- 2.25.1