2 This file is part of GNUnet.
3 Copyright (C) 2009-2013, 2016, 2018, 2019 GNUnet e.V.
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
18 SPDX-License-Identifier: AGPL3.0-or-later
22 * @file transport/transport_api2_address.c
23 * @brief library to inform the transport service about addresses to be validated
24 * @author Christian Grothoff
27 #include "gnunet_util_lib.h"
28 #include "gnunet_constants.h"
29 #include "gnunet_protocols.h"
30 #include "gnunet_transport_address_service.h"
31 #include "gnunet_ats_transport_service.h"
32 #include "transport.h"
34 #define LOG(kind,...) GNUNET_log_from (kind, "transport-api-address",__VA_ARGS__)
38 * Handle for the transport service (includes all of the
39 * state for the transport service).
41 struct GNUNET_TRANSPORT_AddressHandle
45 * My client connection to the transport service.
47 struct GNUNET_MQ_Handle *mq;
52 const struct GNUNET_CONFIGURATION_Handle *cfg;
55 * ID of the task trying to reconnect to the service.
57 struct GNUNET_SCHEDULER_Task *reconnect_task;
60 * Delay until we try to reconnect.
62 struct GNUNET_TIME_Relative reconnect_delay;
68 * Function that will schedule the job that will try
69 * to connect us again to the client.
71 * @param h transport service to reconnect
74 disconnect_and_schedule_reconnect (struct GNUNET_TRANSPORT_AddressHandle *h);
78 * Generic error handler, called with the appropriate
79 * error code and the same closure specified at the creation of
81 * Not every message queue implementation supports an error handler.
83 * @param cls closure with the `struct GNUNET_TRANSPORT_AddressHandle *`
84 * @param error error code
87 mq_error_handler (void *cls,
88 enum GNUNET_MQ_Error error)
90 struct GNUNET_TRANSPORT_AddressHandle *h = cls;
92 LOG (GNUNET_ERROR_TYPE_DEBUG,
93 "Error receiving from transport service, disconnecting temporarily.\n");
94 disconnect_and_schedule_reconnect (h);
99 * Try again to connect to transport service.
101 * @param cls the handle to the transport service
104 reconnect (void *cls)
106 struct GNUNET_TRANSPORT_AddressHandle *h = cls;
107 struct GNUNET_MQ_MessageHandler handlers[] = {
108 GNUNET_MQ_handler_end ()
111 h->reconnect_task = NULL;
112 LOG (GNUNET_ERROR_TYPE_DEBUG,
113 "Connecting to transport service.\n");
114 GNUNET_assert (NULL == h->mq);
115 h->mq = GNUNET_CLIENT_connect (h->cfg,
124 * Disconnect from the transport service.
126 * @param h transport service to disconnect
129 disconnect (struct GNUNET_TRANSPORT_AddressHandle *h)
133 GNUNET_MQ_destroy (h->mq);
140 * Function that will schedule the job that will try
141 * to connect us again to the client.
143 * @param h transport service to reconnect
146 disconnect_and_schedule_reconnect (struct GNUNET_TRANSPORT_AddressHandle *h)
148 GNUNET_assert (NULL == h->reconnect_task);
150 LOG (GNUNET_ERROR_TYPE_DEBUG,
151 "Scheduling task to reconnect to transport service in %s.\n",
152 GNUNET_STRINGS_relative_time_to_string (h->reconnect_delay,
155 GNUNET_SCHEDULER_add_delayed (h->reconnect_delay,
158 h->reconnect_delay = GNUNET_TIME_STD_BACKOFF (h->reconnect_delay);
163 * Connect to the transport service.
165 * @param cfg configuration to use
166 * @return NULL on error
168 struct GNUNET_TRANSPORT_AddressHandle *
169 GNUNET_TRANSPORT_address_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
171 struct GNUNET_TRANSPORT_AddressHandle *h;
173 h = GNUNET_new (struct GNUNET_TRANSPORT_AddressHandle);
175 h->reconnect_delay = GNUNET_TIME_UNIT_ZERO;
176 LOG (GNUNET_ERROR_TYPE_DEBUG,
177 "Connecting to transport service\n");
189 * Disconnect from the transport service.
191 * @param handle handle to the service as returned from #GNUNET_TRANSPORT_address_connect()
194 GNUNET_TRANSPORT_address_disconnect (struct GNUNET_TRANSPORT_AddressHandle *handle)
196 LOG (GNUNET_ERROR_TYPE_DEBUG,
197 "Transport disconnect called!\n");
198 /* this disconnects all neighbours... */
200 /* and now we stop trying to connect again... */
201 if (NULL != handle->reconnect_task)
203 GNUNET_SCHEDULER_cancel (handle->reconnect_task);
204 handle->reconnect_task = NULL;
206 GNUNET_free (handle);
211 * The client has learned about a possible address for peer @a pid
212 * (i.e. via broadcast, multicast, DHT, ...). The transport service
213 * should consider validating it. Note that the plugin is NOT expected
214 * to have verified the signature, the transport service must decide
215 * whether to check the signature.
217 * While the notification is sent to @a ch asynchronously, this API
218 * does not return a handle as the delivery of addresses is simply
219 * unreliable, and if @a ch is down, the data provided will simply be
222 * @param ch communicator handle
223 * @param pid peer the address is for
224 * @param raw raw address data
225 * @param raw_size number of bytes in @a raw
228 GNUNET_TRANSPORT_address_try (struct GNUNET_TRANSPORT_AddressHandle *ch,
229 const struct GNUNET_PeerIdentity *pid,
231 const size_t raw_size)
233 struct GNUNET_MQ_Envelope *env;
234 struct GNUNET_TRANSPORT_AddressToVerify *hdr;
236 env = GNUNET_MQ_msg_extra (hdr,
238 GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_CONSIDER_VERIFY);
243 GNUNET_MQ_send (ch->mq,
249 /* end of transport_api2_address.c */