GNUnet 0.28.0-dev.5-89-ga1e177ed4
 
Loading...
Searching...
No Matches
transport_api_monitor.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2018 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_protocols.h"
30#include "transport.h"
31
32
68
69
75static void
77
78
85static void
87{
88 struct GNUNET_MQ_Envelope *env;
90
91 if (NULL == mc->mq)
92 return;
94 smm->one_shot = htonl ((uint32_t) mc->one_shot);
95 smm->peer = mc->peer;
96 GNUNET_MQ_send (mc->mq, env);
97}
98
99
105static void
107{
108 if (NULL == mc->mq)
109 return;
110 GNUNET_MQ_destroy (mc->mq);
111 mc->mq = NULL;
112}
113
114
121static void
122error_handler (void *cls, enum GNUNET_MQ_Error error)
123{
125
127 "MQ failure %d, reconnecting to transport service.\n",
128 error);
129 disconnect (mc);
130 /* TODO: maybe do this with exponential backoff/delay */
131 reconnect (mc);
132}
133
134
143static int
145{
146 (void) cls;
148 return GNUNET_OK;
149}
150
151
158static void
160{
163
164 mi.address = (const char *) &md[1];
165 mi.nt = ntohl (md->nt);
166 mi.cs = ntohl (md->cs);
167 mi.num_msg_pending = ntohl (md->num_msg_pending);
168 mi.num_bytes_pending = ntohl (md->num_bytes_pending);
173 mc->cb (mc->cb_cls, &md->peer, &mi);
174}
175
176
183static void
185{
187
188 if (GNUNET_YES != mc->one_shot)
189 {
190 GNUNET_break (0);
191 disconnect (mc);
192 reconnect (mc);
193 return;
194 }
195 mc->cb (mc->cb_cls, NULL, NULL);
197}
198
199
205static void
207{
209 { GNUNET_MQ_hd_var_size (monitor_data,
212 mc),
213 GNUNET_MQ_hd_fixed_size (monitor_end,
216 mc),
218
219 mc->mq =
220 GNUNET_CLIENT_connect (mc->cfg, "transport", handlers, &error_handler, mc);
221 if (NULL == mc->mq)
222 return;
224}
225
226
255 const struct GNUNET_PeerIdentity *peer,
256 int one_shot,
258 void *cb_cls)
259{
261
263 mc->cfg = cfg;
264 if (NULL != peer)
265 mc->peer = *peer;
266 mc->one_shot = one_shot;
267 mc->cb = cb;
268 mc->cb_cls = cb_cls;
269 reconnect (mc);
270 if (NULL == mc->mq)
271 {
272 GNUNET_free (mc);
273 return NULL;
274 }
275 return mc;
276}
277
278
284void
290
291
292/* ***************** listing virtual links ******************* */
293
294
315
316
322static void
324{
326 void *cb_cls = llc->cb_cls;
327
329 cb (cb_cls, NULL, NULL);
330}
331
332
340static void
342{
344
346 "Transport service disconnected while listing links (%d)\n",
347 (int) error);
349}
350
351
361 void *cls,
362 const struct GNUNET_TRANSPORT_LinkListResponse *resp)
363{
364 const char *ccs = (const char *) &resp[1];
365 uint16_t slen = ntohs (resp->header.size) - sizeof (*resp);
366
367 (void) cls;
368 if ((0 == slen) || ('\0' != ccs[slen - 1]))
369 {
370 GNUNET_break (0);
371 return GNUNET_SYSERR;
372 }
373 return GNUNET_OK;
374}
375
376
383static void
385 void *cls,
386 const struct GNUNET_TRANSPORT_LinkListResponse *resp)
387{
390
391 memset (&li, 0, sizeof (li));
392 li.communicators = (const char *) &resp[1];
393 li.route = (enum GNUNET_TRANSPORT_LinkRoute) ntohl (resp->route);
394 li.confirmed = (int) ntohl (resp->confirmed);
395 li.distance = ntohl (resp->distance);
396 li.num_queues = ntohl (resp->num_queues);
397 li.core_recv_window = (int) (int32_t) ntohl (resp->core_recv_window);
398 li.stalled = ntohl (resp->stalled);
399 li.pending = ntohl (resp->pending);
400 li.fc_retransmit_count = ntohl (resp->fc_retransmit_count);
408 = (int64_t) GNUNET_ntohll ((uint64_t) resp->incoming_fc_window_size_loss);
416 llc->cb (llc->cb_cls, &resp->target, &li);
417}
418
419
426static void
428 const struct GNUNET_MessageHeader *msg)
429{
431
432 (void) msg;
434}
435
436
439 const struct GNUNET_PeerIdentity *peer,
442 void *cb_cls)
443{
447 GNUNET_MQ_hd_var_size (link_list_response,
450 llc),
452 link_list_response_end,
455 llc),
457 };
459 struct GNUNET_MQ_Envelope *env;
460
461 llc->cb = cb;
462 llc->cb_cls = cb_cls;
464 "transport",
465 handlers,
467 llc);
468 if (NULL == llc->mq)
469 {
471 return NULL;
472 }
473 env = GNUNET_MQ_msg (req,
475 req->include_unconfirmed = htonl ((uint32_t) include_unconfirmed);
476 if (NULL != peer)
477 req->peer = *peer;
479 return llc;
480}
481
482
483void
486{
487 if (NULL != llc->mq)
488 {
490 llc->mq = NULL;
491 }
493}
494
495
496/* end of transport_api2_monitor.c */
struct GNUNET_MQ_MessageHandlers handlers[]
Definition 003.c:1
struct GNUNET_MessageHeader * msg
Definition 005.c:2
struct GNUNET_MQ_Envelope * env
Definition 005.c:1
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition gnunet-arm.c:108
static GNUNET_NETWORK_STRUCT_END struct GNUNET_PeerIdentity me
Our own peer identity.
static struct GNUNET_TESTBED_Controller * mc
Handle to the master controller.
static struct GNUNET_TRANSPORT_LinkListContext * llc
Handle to the running listing, NULL once it completed.
static int include_unconfirmed
Option -a: also show links that are not established yet.
Constants for network protocols.
Monitoring / diagnostics API for the transport service.
void(* GNUNET_TRANSPORT_MonitorCallback)(void *cls, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_TRANSPORT_MonitorInformation *mi)
Function to call with information about a peer.
void(* GNUNET_TRANSPORT_LinkCallback)(void *cls, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_TRANSPORT_LinkInformation *li)
Function called once per virtual link, and a final time with peer and li both NULL to signal the end ...
void GNUNET_TRANSPORT_links_list_cancel(struct GNUNET_TRANSPORT_LinkListContext *llc)
Cancel a request to list virtual links.
struct GNUNET_TRANSPORT_MonitorContext * GNUNET_TRANSPORT_monitor(const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_PeerIdentity *peer, int one_shot, GNUNET_TRANSPORT_MonitorCallback cb, void *cb_cls)
Return information about a specific peer or all peers currently known to transport service once or in...
struct GNUNET_TRANSPORT_LinkListContext * GNUNET_TRANSPORT_links_list(const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_PeerIdentity *peer, int include_unconfirmed, GNUNET_TRANSPORT_LinkCallback cb, void *cb_cls)
Ask the transport service for the virtual links it currently has.
void GNUNET_TRANSPORT_monitor_cancel(struct GNUNET_TRANSPORT_MonitorContext *mc)
Cancel request to monitor peers.
GNUNET_TRANSPORT_LinkRoute
How is a virtual link routed?
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:1060
#define GNUNET_log(kind,...)
uint64_t GNUNET_ntohll(uint64_t n)
Convert unsigned 64-bit integer to host byte order.
GNUNET_GenericReturnValue
Named constants for return values.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_SYSERR
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_INFO
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
GNUNET_MQ_Error
Error codes for the queue.
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:337
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_MQ_check_zero_termination(m)
Insert code for a "check_" function that verifies that a given variable-length message received over ...
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition mq.c:732
#define GNUNET_MESSAGE_TYPE_TRANSPORT_LINK_LIST_RESPONSE
Information about a single virtual link, in response to a GNUNET_MESSAGE_TYPE_TRANSPORT_LINK_LIST_REQ...
#define GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_DATA
Message sent to indicate to a monitor about events.
#define GNUNET_MESSAGE_TYPE_TRANSPORT_LINK_LIST_REQUEST
Request a one-shot listing of the virtual links transport currently has, with their flow control stat...
#define GNUNET_MESSAGE_TYPE_TRANSPORT_LINK_LIST_RESPONSE_END
End of the responses to a GNUNET_MESSAGE_TYPE_TRANSPORT_LINK_LIST_REQUEST.
#define GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_START
Message sent to indicate to the transport that a monitor wants to observe certain events.
#define GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_END
Message sent to indicate to a monitor that a one-shot iteration over events is done.
struct GNUNET_TIME_Relative GNUNET_TIME_relative_ntoh(struct GNUNET_TIME_RelativeNBO a)
Convert relative time from network byte order.
Definition time.c:626
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition time.c:737
static void reconnect(void)
Adjust exponential back-off and reconnect to the service.
Handle to a message queue.
Definition mq.c:87
Message handler for a specific message type.
Header for all communications.
The identity of the host (wraps the signing key of the peer).
State of one virtual link, the abstraction CORE sits on top of.
unsigned int pending
Number of messages queued for transmission to the target.
int64_t incoming_fc_window_size_loss
Current estimate of the message loss rate for the sender.
uint64_t outbound_fc_window_size
Window the other peer granted us.
uint64_t incoming_fc_window_size_used
How much of incoming_fc_window_size the other peer used.
uint64_t incoming_fc_window_size_ram
RAM currently held for this link.
uint64_t outbound_fc_window_size_used
How much of outbound_fc_window_size we used.
unsigned int distance
Hops of the shortest DV path, excluding the next hop and the target itself; so 0 already means two ho...
unsigned int num_queues
Number of queues to the neighbour carrying the link.
int core_recv_window
How many more messages we may hand to CORE before it must acknowledge them.
enum GNUNET_TRANSPORT_LinkRoute route
How the link is routed.
struct GNUNET_TIME_Relative other_rtt
RTT over all DV paths, as calculated by the target.
int confirmed
GNUNET_YES if the link is confirmed, i.e.
unsigned int fc_retransmit_count
Number of flow control retransmissions of the running task.
const char * communicators
Comma-separated address prefixes of the communicators currently carrying the link ("tcp",...
uint64_t available_fc_window_size
RAM transport is willing to spend on this link.
unsigned int stalled
Number of messages whose flow control ACK transport is withholding because core_recv_window is exhaus...
struct GNUNET_TIME_Absolute last_fc_transmission
When did we last send a flow control message?
uint64_t incoming_fc_window_size
Window we last granted the other peer.
struct GNUNET_TIME_Relative last_fc_rtt
RTT of the last flow control exchange.
Opaque handle for a GNUNET_TRANSPORT_links_list() operation.
GNUNET_TRANSPORT_LinkCallback cb
Function to call with each link, and once with NULL at the end.
struct GNUNET_MQ_Handle * mq
Queue to talk to the transport service.
Request a one-shot listing of our virtual links.
Definition transport.h:783
struct GNUNET_PeerIdentity peer
Link to report on, all zeros for "all links".
Definition transport.h:797
uint32_t include_unconfirmed
GNUNET_YES to also report links that are not confirmed.
Definition transport.h:792
State of one virtual link.
Definition transport.h:805
uint32_t stalled
Number of messages whose flow control ACK we are withholding because core_recv_window is exhausted.
Definition transport.h:849
struct GNUNET_TIME_AbsoluteNBO last_fc_transmission
When did we last send a flow control message?
Definition transport.h:910
uint32_t fc_retransmit_count
Number of flow control retransmissions of the running task.
Definition transport.h:859
uint32_t num_queues
Number of queues to the neighbour, 0 if route is GNUNET_TRANSPORT_LINK_ROUTE_DV.
Definition transport.h:836
uint64_t incoming_fc_window_size_ram
RAM currently held for this link.
Definition transport.h:869
uint64_t incoming_fc_window_size_used
How much of incoming_fc_window_size the other peer used.
Definition transport.h:879
uint32_t pending
Number of messages queued for transmission to target.
Definition transport.h:854
int64_t incoming_fc_window_size_loss
Current estimate of the message loss rate for the sender.
Definition transport.h:885
struct GNUNET_TIME_RelativeNBO other_rtt
RTT over all DV paths, as calculated by the target.
Definition transport.h:905
uint64_t outbound_fc_window_size
Window the other peer granted us.
Definition transport.h:890
uint64_t outbound_fc_window_size_used
How much of outbound_fc_window_size we used.
Definition transport.h:895
uint64_t incoming_fc_window_size
Window we last granted the other peer.
Definition transport.h:874
uint32_t route
An ‘enum GNUNET_TRANSPORT_LinkRoute’ in NBO.
Definition transport.h:824
uint32_t distance
Distance of the DV path, 0 if route is GNUNET_TRANSPORT_LINK_ROUTE_DIRECT.
Definition transport.h:830
struct GNUNET_PeerIdentity target
Peer at the other end of the link.
Definition transport.h:814
struct GNUNET_TIME_RelativeNBO last_fc_rtt
RTT of the last flow control exchange.
Definition transport.h:900
struct GNUNET_MessageHeader header
Type will be GNUNET_MESSAGE_TYPE_TRANSPORT_LINK_LIST_RESPONSE.
Definition transport.h:809
uint32_t confirmed
GNUNET_YES if the link is confirmed, i.e.
Definition transport.h:819
int32_t core_recv_window
How many more messages we may hand to CORE before it must acknowledge them.
Definition transport.h:843
uint64_t available_fc_window_size
RAM we are willing to spend on this link.
Definition transport.h:864
Opaque handle to the transport service for monitors.
GNUNET_TRANSPORT_MonitorCallback cb
Function to call with monitor data.
struct GNUNET_MQ_Handle * mq
Queue to talk to the transport service.
int one_shot
GNUNET_YES to return the current state and then end.
struct GNUNET_PeerIdentity peer
Peer we monitor, all zeros for "all".
const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
uint32_t num_msg_pending
Messages pending (in NBO).
Definition transport.h:768
struct GNUNET_PeerIdentity peer
Target identifier.
Definition transport.h:746
struct GNUNET_TIME_AbsoluteNBO valid_until
Definition transport.h:752
struct GNUNET_TIME_AbsoluteNBO last_validation
Definition transport.h:751
uint32_t num_bytes_pending
Bytes pending (in NBO).
Definition transport.h:773
struct GNUNET_TIME_AbsoluteNBO next_validation
Definition transport.h:753
uint32_t nt
Network type (an enum GNUNET_NetworkType in NBO).
Definition transport.h:741
struct GNUNET_TIME_RelativeNBO rtt
Current round-trip time estimate.
Definition transport.h:758
uint32_t cs
Connection status (in NBO).
Definition transport.h:763
Information about another peer's address.
struct GNUNET_TIME_Absolute next_validation
Time of the next validation operation.
struct GNUNET_TIME_Absolute last_validation
When was this address last validated.
uint32_t num_msg_pending
Number of messages pending transmission for this address.
enum GNUNET_NetworkType nt
Network type of the address.
const char * address
Address we have for the peer, human-readable, 0-terminated, in UTF-8.
uint32_t num_bytes_pending
Number of bytes pending transmission for this address.
struct GNUNET_TIME_Absolute valid_until
When does this address expire.
struct GNUNET_TIME_Relative rtt
Current estimate of the RTT.
enum GNUNET_TRANSPORT_ConnectionStatus cs
Connection status.
Request to start monitoring.
Definition transport.h:710
uint32_t one_shot
GNUNET_YES for one-shot monitoring, GNUNET_NO for continuous monitoring.
Definition transport.h:719
struct GNUNET_PeerIdentity peer
Target identifier to monitor, all zeros for "all peers".
Definition transport.h:724
common internal definitions for transport service
static void disconnect(struct GNUNET_TRANSPORT_MonitorContext *mc)
Disconnect from the transport service.
static int check_monitor_data(void *cls, const struct GNUNET_TRANSPORT_MonitorData *md)
Transport service sends us information about what is going on.
static void handle_link_list_response_end(void *cls, const struct GNUNET_MessageHeader *msg)
Handle the end of a link listing.
static void error_handler(void *cls, enum GNUNET_MQ_Error error)
Function called on MQ errors.
static void handle_monitor_data(void *cls, const struct GNUNET_TRANSPORT_MonitorData *md)
Transport service sends us information about what is going on.
static void link_list_error_handler(void *cls, enum GNUNET_MQ_Error error)
Function called on MQ errors.
static void handle_link_list_response(void *cls, const struct GNUNET_TRANSPORT_LinkListResponse *resp)
Handle a link listing response.
static void handle_monitor_end(void *cls, const struct GNUNET_MessageHeader *me)
One shot was requested, and transport service is done.
static void link_list_done(struct GNUNET_TRANSPORT_LinkListContext *llc)
Tell the caller we are done and tear the operation down.
static enum GNUNET_GenericReturnValue check_link_list_response(void *cls, const struct GNUNET_TRANSPORT_LinkListResponse *resp)
Validate a link listing response.
static void send_start_monitor(struct GNUNET_TRANSPORT_MonitorContext *mc)
Send message to the transport service about our monitoring desire.