GNUnet  0.10.x
transport_api_manipulation.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2009-2013, 2016 GNUnet e.V.
4 
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.
9 
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.
14 
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/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 
26 #include "platform.h"
27 #include "gnunet_util_lib.h"
28 #include "gnunet_constants.h"
29 #include "gnunet_arm_service.h"
30 #include "gnunet_hello_lib.h"
31 #include "gnunet_protocols.h"
33 #include "transport.h"
34 
35 #define LOG(kind, ...) GNUNET_log_from(kind, "transport-api", __VA_ARGS__)
36 
37 
47 
52 
57 
62 
67 };
68 
69 
76 static void
78 
79 
89 static void
90 mq_error_handler(void *cls,
91  enum GNUNET_MQ_Error error)
92 {
94 
96  "Error receiving from transport service, disconnecting temporarily.\n");
99 }
100 
101 
107 static void
108 reconnect(void *cls)
109 {
111  struct GNUNET_MQ_MessageHandler handlers[] = {
113  };
114  struct GNUNET_MQ_Envelope *env;
115  struct StartMessage *s;
116 
117  h->reconnect_task = NULL;
119  "Connecting to transport service.\n");
120  GNUNET_assert(NULL == h->mq);
121  h->reconnecting = GNUNET_NO;
122  h->mq = GNUNET_CLIENT_connect(h->cfg,
123  "transport",
124  handlers,
126  h);
127  if (NULL == h->mq)
128  return;
129  env = GNUNET_MQ_msg(s,
131  GNUNET_MQ_send(h->mq,
132  env);
133 }
134 
135 
142 static void
144 {
145  GNUNET_assert(NULL == h->reconnect_task);
146  if (NULL != h->mq)
147  {
148  GNUNET_MQ_destroy(h->mq);
149  h->mq = NULL;
150  }
151  h->reconnect_task =
153  &reconnect,
154  h);
156 }
157 
158 
171 void
173  const struct GNUNET_PeerIdentity *peer,
174  const struct GNUNET_ATS_Properties *prop,
177 {
178  struct GNUNET_MQ_Envelope *env;
179  struct TrafficMetricMessage *msg;
180 
181  if (NULL == handle->mq)
182  return;
183  env = GNUNET_MQ_msg(msg,
185  msg->reserved = htonl(0);
186  msg->peer = *peer;
188  prop);
189  msg->delay_in = GNUNET_TIME_relative_hton(delay_in);
190  msg->delay_out = GNUNET_TIME_relative_hton(delay_out);
191  GNUNET_MQ_send(handle->mq,
192  env);
193 }
194 
195 
205 {
207 
209  h->cfg = cfg;
211  "Connecting to transport service.\n");
212  reconnect(h);
213  if (NULL == h->mq)
214  {
215  GNUNET_free(h);
216  return NULL;
217  }
218  return h;
219 }
220 
221 
227 void
229 {
230  if (NULL == handle->reconnect_task)
232  /* and now we stop trying to connect again... */
233  if (NULL != handle->reconnect_task)
234  {
236  handle->reconnect_task = NULL;
237  }
238  GNUNET_free(handle);
239 }
240 
241 
242 /* end of transport_api_manipulation.c */
struct GNUNET_PeerIdentity peer
The identity of the peer to look up.
Definition: transport.h:494
static struct GNUNET_TIME_Relative delay_in
Inbound delay to apply to all peers.
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
common internal definitions for transport service
struct GNUNET_MQ_Handle * GNUNET_CLIENT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name, const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_ErrorHandler error_handler, void *error_handler_cls)
Create a message queue to connect to a GNUnet service.
Definition: client.c:900
struct GNUNET_TIME_RelativeNBO delay_in
Fake delay to add on inbound traffic.
Definition: transport.h:504
GNUNET_MQ_Error
Error codes for the queue.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
void GNUNET_ATS_properties_hton(struct GNUNET_ATS_PropertiesNBO *nbo, const struct GNUNET_ATS_Properties *hbo)
Convert ATS properties from host to network byte order.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_MESSAGE_TYPE_TRANSPORT_TRAFFIC_METRIC
Message containing traffic metrics for transport service.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
Handle for the transport service (includes all of the state for the transport service).
ATS performance characteristics for an address.
static void disconnect_and_schedule_reconnect(struct GNUNET_TRANSPORT_ManipulationHandle *h)
Function that will schedule the job that will try to connect us again to the client.
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
struct GNUNET_TIME_Relative reconnect_delay
Delay until we try to reconnect.
struct GNUNET_TIME_RelativeNBO delay_out
Fake delay to add on outbound traffic.
Definition: transport.h:509
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1237
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
Generic error handler, called with the appropriate error code and the same closure specified at the c...
struct GNUNET_MQ_Handle * mq
My client connection to the transport service.
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
Message from the library to the transport service asking for binary addresses known for a peer...
Definition: transport.h:480
#define GNUNET_MESSAGE_TYPE_TRANSPORT_START
Message from the core saying that the transport server should start giving it messages.
Message handler for a specific message type.
const struct GNUNET_CONFIGURATION_Handle * cfg
My configuration.
Message from the transport service to the library asking to check if both processes agree about this ...
Definition: transport.h:91
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.
struct GNUNET_ATS_PropertiesNBO properties
Fake properties to generate.
Definition: transport.h:499
struct GNUNET_TIME_RelativeNBO GNUNET_TIME_relative_hton(struct GNUNET_TIME_Relative a)
Convert relative time to network byte order.
Definition: time.c:623
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
#define GNUNET_TIME_STD_BACKOFF(r)
Perform our standard exponential back-off calculation, starting at 1 ms and then going by a factor of...
static struct GNUNET_TIME_Relative delay_out
Outbound delay to apply to all peers.
Handle to a message queue.
Definition: mq.c:84
The identity of the host (wraps the signing key of the peer).
#define LOG(kind,...)
struct GNUNET_TRANSPORT_ManipulationHandle * GNUNET_TRANSPORT_manipulation_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Connect to the transport service.
configuration data
Definition: configuration.c:83
Entry in list of pending tasks.
Definition: scheduler.c:131
void GNUNET_TRANSPORT_manipulation_disconnect(struct GNUNET_TRANSPORT_ManipulationHandle *handle)
Disconnect from the transport service.
static void reconnect(void *cls)
Try again to connect to transport service.
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:821
#define GNUNET_YES
Definition: gnunet_common.h:77
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:351
struct GNUNET_SCHEDULER_Task * reconnect_task
ID of the task trying to reconnect to the service.
void GNUNET_TRANSPORT_manipulation_set(struct GNUNET_TRANSPORT_ManipulationHandle *handle, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_ATS_Properties *prop, struct GNUNET_TIME_Relative delay_in, struct GNUNET_TIME_Relative delay_out)
Set transport metrics for a peer and a direction.
uint32_t reserved
Always zero.
Definition: transport.h:489
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_free(ptr)
Wrapper around free.
Time for relative time used by GNUnet, in microseconds.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:956