GNUnet 0.22.2
gnunet-service-cadet.c File Reference

GNUnet CADET service with encryption. More...

Include dependency graph for gnunet-service-cadet.c:

Go to the source code of this file.

Data Structures

struct  CadetClient
 Struct containing information about a client of the service. More...
 

Macros

#define LOG(level, ...)   GNUNET_log (level, __VA_ARGS__)
 

Functions

void GSC_send_to_client (struct CadetClient *c, struct GNUNET_MQ_Envelope *env)
 Send a message to a client. More...
 
const char * GSC_2s (struct CadetClient *c)
 Return identifier for a client as a string. More...
 
static struct CadetChannellookup_channel (struct CadetClient *c, struct GNUNET_CADET_ClientChannelNumber ccn)
 Lookup channel of client c by ccn. More...
 
static struct GNUNET_CADET_ClientChannelNumber client_get_next_ccn (struct CadetClient *c)
 Obtain the next LID to use for incoming connections to the given client. More...
 
struct GNUNET_CADET_ClientChannelNumber GSC_bind (struct CadetClient *c, struct CadetChannel *ch, struct CadetPeer *dest, const struct GNUNET_HashCode *port, uint32_t options)
 Bind incoming channel to this client, and notify client about incoming connection. More...
 
static int destroy_tunnels_now (void *cls, const struct GNUNET_PeerIdentity *pid, void *value)
 Callback invoked on all peers to destroy all tunnels that may still exist. More...
 
static int destroy_paths_now (void *cls, const struct GNUNET_PeerIdentity *pid, void *value)
 Callback invoked on all peers to destroy all tunnels that may still exist. More...
 
static void shutdown_rest ()
 Shutdown everything once the clients have disconnected. More...
 
static void shutdown_task (void *cls)
 Task run during shutdown. More...
 
static int bind_loose_channel (void *cls, const struct GNUNET_HashCode *port, void *value)
 We had a remote connection value to port h_port before client cls opened port port. More...
 
static void handle_port_open (void *cls, const struct GNUNET_CADET_PortMessage *pmsg)
 Handle port open request. More...
 
static void handle_port_close (void *cls, const struct GNUNET_CADET_PortMessage *pmsg)
 Handler for port close requests. More...
 
static void handle_channel_create (void *cls, const struct GNUNET_CADET_LocalChannelCreateMessage *tcm)
 Handler for requests for us creating a new channel to another peer and port. More...
 
static void handle_channel_destroy (void *cls, const struct GNUNET_CADET_LocalChannelDestroyMessage *msg)
 Handler for requests of destroying an existing channel. More...
 
static int check_local_data (void *cls, const struct GNUNET_CADET_LocalData *msg)
 Check for client traffic data message is well-formed. More...
 
static void handle_local_data (void *cls, const struct GNUNET_CADET_LocalData *msg)
 Handler for client payload traffic to be send on a channel to another peer. More...
 
static void handle_local_ack (void *cls, const struct GNUNET_CADET_LocalAck *msg)
 Handler for client's ACKs for payload traffic. More...
 
static int get_all_peers_iterator (void *cls, const struct GNUNET_PeerIdentity *peer, void *value)
 Iterator over all peers to send a monitoring client info about each peer. More...
 
static void handle_get_peers (void *cls, const struct GNUNET_MessageHeader *message)
 Handler for client's INFO PEERS request. More...
 
static int path_info_iterator (void *cls, struct CadetPeerPath *path, unsigned int off)
 Iterator over all paths of a peer to build an InfoPeer message. More...
 
static void handle_show_path (void *cls, const struct GNUNET_CADET_RequestPathInfoMessage *msg)
 Handler for client's GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_PATH request. More...
 
static int get_all_tunnels_iterator (void *cls, const struct GNUNET_PeerIdentity *peer, void *value)
 Iterator over all tunnels to send a monitoring client info about each tunnel. More...
 
static void handle_info_tunnels (void *cls, const struct GNUNET_MessageHeader *message)
 Handler for client's GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_TUNNELS request. More...
 
static void handle_drop_message (void *cls, const struct GNUNET_CADET_RequestDropCadetMessage *message)
 Handler for client's GNUNET_MESSAGE_TYPE_CADET_DROP_CADET_MESSAGE request. More...
 
static void * client_connect_cb (void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
 Callback called when a client connects to the service. More...
 
void GSC_handle_remote_channel_destroy (struct CadetClient *c, struct GNUNET_CADET_ClientChannelNumber ccn, struct CadetChannel *ch)
 A channel was destroyed by the other peer. More...
 
void GSC_drop_loose_channel (const struct GNUNET_HashCode *h_port, struct CadetChannel *ch)
 A client that created a loose channel that was not bound to a port disconnected, drop it from the loose_channels list. More...
 
static int channel_destroy_iterator (void *cls, uint32_t key, void *value)
 Iterator for deleting each channel whose client endpoint disconnected. More...
 
static int client_release_ports (void *cls, const struct GNUNET_HashCode *port, void *value)
 Remove client's ports from the global hashmap on disconnect. More...
 
static void client_disconnect_cb (void *cls, struct GNUNET_SERVICE_Client *client, void *internal_cls)
 Callback called when a client disconnected from the service. More...
 
static void run (void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service)
 Setup CADET internals. More...
 
 GNUNET_SERVICE_MAIN (GNUNET_OS_project_data_gnunet(), "cadet", GNUNET_SERVICE_OPTION_NONE, &run, &client_connect_cb, &client_disconnect_cb, NULL, GNUNET_MQ_hd_fixed_size(port_open, GNUNET_MESSAGE_TYPE_CADET_LOCAL_PORT_OPEN, struct GNUNET_CADET_PortMessage, NULL), GNUNET_MQ_hd_fixed_size(port_close, GNUNET_MESSAGE_TYPE_CADET_LOCAL_PORT_CLOSE, struct GNUNET_CADET_PortMessage, NULL), GNUNET_MQ_hd_fixed_size(channel_create, GNUNET_MESSAGE_TYPE_CADET_LOCAL_CHANNEL_CREATE, struct GNUNET_CADET_LocalChannelCreateMessage, NULL), GNUNET_MQ_hd_fixed_size(channel_destroy, GNUNET_MESSAGE_TYPE_CADET_LOCAL_CHANNEL_DESTROY, struct GNUNET_CADET_LocalChannelDestroyMessage, NULL), GNUNET_MQ_hd_var_size(local_data, GNUNET_MESSAGE_TYPE_CADET_LOCAL_DATA, struct GNUNET_CADET_LocalData, NULL), GNUNET_MQ_hd_fixed_size(local_ack, GNUNET_MESSAGE_TYPE_CADET_LOCAL_ACK, struct GNUNET_CADET_LocalAck, NULL), GNUNET_MQ_hd_fixed_size(get_peers, GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_PEERS, struct GNUNET_MessageHeader, NULL), GNUNET_MQ_hd_fixed_size(show_path, GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_PATH, struct GNUNET_CADET_RequestPathInfoMessage, NULL), GNUNET_MQ_hd_fixed_size(info_tunnels, GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_TUNNELS, struct GNUNET_MessageHeader, NULL), GNUNET_MQ_hd_fixed_size(drop_message, GNUNET_MESSAGE_TYPE_CADET_DROP_CADET_MESSAGE, struct GNUNET_CADET_RequestDropCadetMessage, NULL), GNUNET_MQ_handler_end())
 Define "main" method using service macro. More...
 

Variables

const struct GNUNET_CONFIGURATION_Handlecfg
 Handle to our configuration. More...
 
struct GNUNET_STATISTICS_Handlestats
 Handle to the statistics service. More...
 
struct GNUNET_TRANSPORT_ApplicationHandletransport
 Handle to Transport service. More...
 
struct GNUNET_PeerIdentity my_full_id
 Local peer own ID. More...
 
struct GNUNET_CRYPTO_EddsaPrivateKeymy_private_key
 Own private key. More...
 
int shutting_down
 Signal that shutdown is happening: prevent recovery measures. More...
 
static struct CadetClientclients_head
 DLL with all the clients, head. More...
 
static struct CadetClientclients_tail
 DLL with all the clients, tail. More...
 
static unsigned int next_client_id
 Next ID to assign to a client. More...
 
struct GNUNET_CONTAINER_MultiHashMapopen_ports
 All ports clients of this peer have opened. More...
 
struct GNUNET_CONTAINER_MultiHashMaploose_channels
 Map from ports to channels where the ports were closed at the time we got the inbound connection. More...
 
struct GNUNET_CONTAINER_MultiPeerMappeers
 Map from PIDs to struct CadetPeer entries. More...
 
struct GNUNET_CONTAINER_MultiShortmapconnections
 Map from struct GNUNET_CADET_ConnectionTunnelIdentifier hash codes to struct CadetConnection objects. More...
 
unsigned long long ratchet_messages
 How many messages are needed to trigger an AXOLOTL ratchet advance. More...
 
struct GNUNET_TIME_Relative ratchet_time
 How long until we trigger a ratched advance due to time. More...
 
struct GNUNET_TIME_Relative keepalive_period
 How frequently do we send KEEPALIVE messages on idle connections? More...
 
unsigned long long drop_percent
 Set to non-zero values to create random drops to test retransmissions. More...
 

Detailed Description

GNUnet CADET service with encryption.

Author
Bartlomiej Polot
Christian Grothoff

Dictionary:

  • peer: other cadet instance. If there is direct connection it's a neighbor.
  • path: series of directly connected peer from one peer to another.
  • connection: path which is being used in a tunnel.
  • tunnel: encrypted connection to a peer, neighbor or not.
  • channel: logical link between two clients, on the same or different peers. have properties like reliability.

Definition in file gnunet-service-cadet.c.

Macro Definition Documentation

◆ LOG

#define LOG (   level,
  ... 
)    GNUNET_log (level, __VA_ARGS__)

Definition at line 51 of file gnunet-service-cadet.c.

Function Documentation

◆ GSC_send_to_client()

void GSC_send_to_client ( struct CadetClient c,
struct GNUNET_MQ_Envelope env 
)

Send a message to a client.

Parameters
cclient to get the message
envenvelope with the message

Definition at line 207 of file gnunet-service-cadet.c.

209{
210 GNUNET_MQ_send (c->mq,
211 env);
212}
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
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:305
struct GNUNET_MQ_Handle * mq
Handle to communicate with the client.

References env, GNUNET_MQ_send(), and CadetClient::mq.

Referenced by GCCH_handle_channel_plaintext_data(), GCCH_handle_local_ack(), GCCH_handle_local_data(), GSC_bind(), GSC_handle_remote_channel_destroy(), and send_ack_to_client().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GSC_2s()

const char * GSC_2s ( struct CadetClient c)

Return identifier for a client as a string.

Parameters
cclient to identify
Returns
string for debugging

Definition at line 222 of file gnunet-service-cadet.c.

223{
224 static char buf[32];
225
226 GNUNET_snprintf (buf,
227 sizeof(buf),
228 "Client(%u)",
229 c->id);
230 return buf;
231}
int GNUNET_snprintf(char *buf, size_t size, const char *format,...) __attribute__((format(printf
Like snprintf, just aborts if the buffer is of insufficient size.
unsigned int id
ID of the client, mainly for debug messages.

References GNUNET_snprintf(), and CadetClient::id.

Referenced by channel_destroy_iterator(), client_connect_cb(), client_disconnect_cb(), client_release_ports(), GCCH_bind(), GCCH_channel_local_destroy(), GCCH_channel_local_new(), GCCH_debug(), GCCH_handle_channel_plaintext_data(), GCCH_handle_local_ack(), handle_channel_create(), handle_channel_destroy(), handle_local_ack(), handle_local_data(), handle_port_close(), handle_port_open(), and send_ack_to_client().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ lookup_channel()

static struct CadetChannel * lookup_channel ( struct CadetClient c,
struct GNUNET_CADET_ClientChannelNumber  ccn 
)
static

Lookup channel of client c by ccn.

Parameters
cclient to look in
ccnchannel ID to look up
Returns
NULL if no such channel exists

Definition at line 242 of file gnunet-service-cadet.c.

244{
246 ntohl (ccn.channel_of_client));
247}
void * GNUNET_CONTAINER_multihashmap32_get(const struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key)
Given a key find a value in the map matching the key.
struct GNUNET_CONTAINER_MultiHashMap32 * channels
Tunnels that belong to this client, indexed by local id, value is a struct CadetChannel.
uint32_t channel_of_client
Values for channel numbering.
Definition: cadet.h:109

References GNUNET_CADET_ClientChannelNumber::channel_of_client, CadetClient::channels, and GNUNET_CONTAINER_multihashmap32_get().

Referenced by client_get_next_ccn(), handle_channel_create(), handle_channel_destroy(), handle_drop_message(), handle_local_ack(), and handle_local_data().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ client_get_next_ccn()

static struct GNUNET_CADET_ClientChannelNumber client_get_next_ccn ( struct CadetClient c)
static

Obtain the next LID to use for incoming connections to the given client.

Parameters
cclient handle

Definition at line 257 of file gnunet-service-cadet.c.

258{
260
261 /* increment until we have a free one... */
262 while (NULL !=
264 ccn))
265 {
267 = htonl (1 + (ntohl (ccn.channel_of_client)));
268 if (ntohl (ccn.channel_of_client) >=
270 ccn.channel_of_client = htonl (0);
271 }
273 = htonl (1 + (ntohl (ccn.channel_of_client)));
274 return ccn;
275}
#define GNUNET_CADET_LOCAL_CHANNEL_ID_CLI
Minimum value for channel IDs of local clients.
Definition: cadet.h:70
static struct CadetChannel * lookup_channel(struct CadetClient *c, struct GNUNET_CADET_ClientChannelNumber ccn)
Lookup channel of client c by ccn.
struct GNUNET_CADET_ClientChannelNumber next_ccn
Channel ID to use for the next incoming channel for this client.
Number uniquely identifying a channel of a client.
Definition: cadet.h:101

References GNUNET_CADET_ClientChannelNumber::channel_of_client, GNUNET_CADET_LOCAL_CHANNEL_ID_CLI, and lookup_channel().

Referenced by GSC_bind().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GSC_bind()

struct GNUNET_CADET_ClientChannelNumber GSC_bind ( struct CadetClient c,
struct CadetChannel ch,
struct CadetPeer dest,
const struct GNUNET_HashCode port,
uint32_t  options 
)

Bind incoming channel to this client, and notify client about incoming connection.

Caller is responsible for notifying the other peer about our acceptance of the channel.

Parameters
cclient to bind to
chchannel to be bound
destpeer that establishes the connection
portport number
optionsoptions
Returns
local channel number assigned to the new client

Definition at line 291 of file gnunet-service-cadet.c.

296{
297 struct GNUNET_MQ_Envelope *env;
300
301 ccn = client_get_next_ccn (c);
304 ntohl (
305 ccn.channel_of_client),
306 ch,
309 "Accepting incoming %s from %s on open port %s (%u), assigning ccn %X\n",
310 GCCH_2s (ch),
311 GCP_2s (dest),
313 (uint32_t) ntohl (options),
314 (uint32_t) ntohl (ccn.channel_of_client));
315 /* notify local client about incoming connection! */
316 env = GNUNET_MQ_msg (cm,
318 cm->ccn = ccn;
319 cm->port = *port;
320 cm->opt = htonl (options);
321 cm->peer = *GCP_get_id (dest);
323 env);
324 return ccn;
325}
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
static uint16_t port
Port number.
Definition: gnunet-bcd.c:146
static struct GNUNET_CADET_Channel * ch
Channel handle.
Definition: gnunet-cadet.c:117
void GSC_send_to_client(struct CadetClient *c, struct GNUNET_MQ_Envelope *env)
Send a message to a client.
#define LOG(level,...)
static struct GNUNET_CADET_ClientChannelNumber client_get_next_ccn(struct CadetClient *c)
Obtain the next LID to use for incoming connections to the given client.
const char * GCCH_2s(const struct CadetChannel *ch)
Get the static string for identification of the channel.
const struct GNUNET_PeerIdentity * GCP_get_id(struct CadetPeer *cp)
Obtain the peer identity for a struct CadetPeer.
const char * GCP_2s(const struct CadetPeer *cp)
Get the static string for a peer ID.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap32_put(struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY
There must only be one value per key; storing a value should fail if a value under the same key alrea...
@ GNUNET_YES
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:76
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_CHANNEL_CREATE
Ask the cadet service to create a new channel.
Message for a client to create channels.
Definition: cadet.h:201
struct GNUNET_PeerIdentity peer
Channel's peer.
Definition: cadet.h:217
struct GNUNET_CADET_ClientChannelNumber ccn
ID of a channel controlled by this client.
Definition: cadet.h:212
struct GNUNET_HashCode port
Port of the channel.
Definition: cadet.h:222

References GNUNET_CADET_LocalChannelCreateMessage::ccn, ch, GNUNET_CADET_ClientChannelNumber::channel_of_client, client_get_next_ccn(), warningfilter::dest, env, GCCH_2s(), GCP_2s(), GCP_get_id(), GNUNET_assert, GNUNET_CONTAINER_multihashmap32_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_MESSAGE_TYPE_CADET_LOCAL_CHANNEL_CREATE, GNUNET_MQ_msg, GNUNET_YES, GSC_send_to_client(), LOG, GNUNET_CADET_LocalChannelCreateMessage::opt, options, GNUNET_CADET_LocalChannelCreateMessage::peer, GNUNET_CADET_LocalChannelCreateMessage::port, and port.

Referenced by GCCH_bind().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ destroy_tunnels_now()

static int destroy_tunnels_now ( void *  cls,
const struct GNUNET_PeerIdentity pid,
void *  value 
)
static

Callback invoked on all peers to destroy all tunnels that may still exist.

Parameters
clsNULL
pididentify of a peer
valuea struct CadetPeer that may still have a tunnel
Returns
GNUNET_OK (iterate over all entries)

Definition at line 338 of file gnunet-service-cadet.c.

341{
342 struct CadetPeer *cp = value;
343 struct CadetTunnel *t = GCP_get_tunnel (cp,
344 GNUNET_NO);
345
346 if (NULL != t)
348 return GNUNET_OK;
349}
static char * value
Value of the record to add/remove.
struct CadetTunnel * GCP_get_tunnel(struct CadetPeer *cp, int create)
Get the tunnel towards a peer.
void GCT_destroy_tunnel_now(struct CadetTunnel *t)
Destroys the tunnel t now, without delay.
static struct GNUNET_SCHEDULER_Task * t
Main task.
@ GNUNET_OK
@ GNUNET_NO
Struct containing all information regarding a given peer.
Struct containing all information regarding a tunnel to a peer.

References GCP_get_tunnel(), GCT_destroy_tunnel_now(), GNUNET_NO, GNUNET_OK, t, and value.

Referenced by shutdown_rest().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ destroy_paths_now()

static int destroy_paths_now ( void *  cls,
const struct GNUNET_PeerIdentity pid,
void *  value 
)
static

Callback invoked on all peers to destroy all tunnels that may still exist.

Parameters
clsNULL
pididentify of a peer
valuea struct CadetPeer that may still have a tunnel
Returns
GNUNET_OK (iterate over all entries)

Definition at line 362 of file gnunet-service-cadet.c.

365{
366 struct CadetPeer *cp = value;
367
369 return GNUNET_OK;
370}
void GCP_drop_owned_paths(struct CadetPeer *cp)
Drop all paths owned by this peer, and do not allow new ones to be added: We are shutting down.

References GCP_drop_owned_paths(), GNUNET_OK, and value.

Referenced by shutdown_rest().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ shutdown_rest()

static void shutdown_rest ( )
static

Shutdown everything once the clients have disconnected.

Definition at line 377 of file gnunet-service-cadet.c.

378{
379 if (NULL != stats)
380 {
382 GNUNET_NO);
383 stats = NULL;
384 }
385 /* Destroy tunnels. Note that all channels must be destroyed first! */
387 NULL);
388 /* All tunnels, channels, connections and CORE must be down before this point. */
390 NULL);
391 /* All paths, tunnels, channels, connections and CORE must be down before this point. */
393 if (NULL != open_ports)
394 {
396 open_ports = NULL;
397 }
398 if (NULL != loose_channels)
399 {
401 loose_channels = NULL;
402 }
403 if (NULL != peers)
404 {
406 peers = NULL;
407 }
408 if (NULL != connections)
409 {
411 connections = NULL;
412 }
413 if (NULL != transport)
414 {
416 transport = NULL;
417 }
418 GCD_shutdown ();
419 GCH_shutdown ();
421 my_private_key = NULL;
422}
struct GNUNET_CONTAINER_MultiPeerMap * peers
Map from PIDs to struct CadetPeer entries.
struct GNUNET_CONTAINER_MultiShortmap * connections
Map from struct GNUNET_CADET_ConnectionTunnelIdentifier hash codes to struct CadetConnection objects.
struct GNUNET_STATISTICS_Handle * stats
Handle to the statistics service.
static int destroy_paths_now(void *cls, const struct GNUNET_PeerIdentity *pid, void *value)
Callback invoked on all peers to destroy all tunnels that may still exist.
struct GNUNET_TRANSPORT_ApplicationHandle * transport
Handle to Transport service.
struct GNUNET_CONTAINER_MultiHashMap * open_ports
All ports clients of this peer have opened.
struct GNUNET_CONTAINER_MultiHashMap * loose_channels
Map from ports to channels where the ports were closed at the time we got the inbound connection.
struct GNUNET_CRYPTO_EddsaPrivateKey * my_private_key
Own private key.
static int destroy_tunnels_now(void *cls, const struct GNUNET_PeerIdentity *pid, void *value)
Callback invoked on all peers to destroy all tunnels that may still exist.
void GCD_shutdown(void)
Shut down the DHT subsystem.
void GCH_shutdown()
Shut down the hello subsystem.
void GCP_destroy_all_peers()
Clean up all entries about all peers.
void GCP_iterate_all(GNUNET_CONTAINER_PeerMapIterator iter, void *cls)
Iterate over all known peers.
void GNUNET_TRANSPORT_application_done(struct GNUNET_TRANSPORT_ApplicationHandle *ch)
Shutdown TRANSPORT application client.
void GNUNET_CONTAINER_multipeermap_destroy(struct GNUNET_CONTAINER_MultiPeerMap *map)
Destroy a hash map.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
void GNUNET_CONTAINER_multishortmap_destroy(struct GNUNET_CONTAINER_MultiShortmap *map)
Destroy a hash map.
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_STATISTICS_destroy(struct GNUNET_STATISTICS_Handle *h, int sync_first)
Destroy a handle (free all state associated with it).

References connections, destroy_paths_now(), destroy_tunnels_now(), GCD_shutdown(), GCH_shutdown(), GCP_destroy_all_peers(), GCP_iterate_all(), GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_CONTAINER_multipeermap_destroy(), GNUNET_CONTAINER_multishortmap_destroy(), GNUNET_free, GNUNET_NO, GNUNET_STATISTICS_destroy(), GNUNET_TRANSPORT_application_done(), loose_channels, my_private_key, open_ports, peers, stats, and transport.

Referenced by client_disconnect_cb(), and shutdown_task().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ shutdown_task()

static void shutdown_task ( void *  cls)
static

Task run during shutdown.

Parameters
clsunused

Definition at line 431 of file gnunet-service-cadet.c.

432{
434 "Shutting down\n");
436 GCO_shutdown ();
437 if (NULL == clients_head)
438 shutdown_rest ();
439}
int shutting_down
Signal that shutdown is happening: prevent recovery measures.
static void shutdown_rest()
Shutdown everything once the clients have disconnected.
static struct CadetClient * clients_head
DLL with all the clients, head.
void GCO_shutdown()
Shut down the CORE subsystem.
#define GNUNET_log(kind,...)

References clients_head, GCO_shutdown(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_YES, shutdown_rest(), and shutting_down.

Referenced by run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ bind_loose_channel()

static int bind_loose_channel ( void *  cls,
const struct GNUNET_HashCode port,
void *  value 
)
static

We had a remote connection value to port h_port before client cls opened port port.

Bind them now.

Parameters
clsthe struct CadetClient
portthe hashed port
valuethe struct CadetChannel
Returns
GNUNET_YES (iterate over all such channels)

Definition at line 452 of file gnunet-service-cadet.c.

455{
456 struct OpenPort *op = cls;
457 struct CadetChannel *ch = value;
458
459 GCCH_bind (ch,
460 op->c,
461 &op->port);
464 &op->h_port,
465 ch));
466 return GNUNET_YES;
467}
static struct GNUNET_ARM_Operation * op
Current operation.
Definition: gnunet-arm.c:143
void GCCH_bind(struct CadetChannel *ch, struct CadetClient *c, const struct GNUNET_HashCode *port)
A client is bound to the port that we have a channel open to.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_remove(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, const void *value)
Remove the given key-value pair from the map.
Struct containing all information regarding a channel to a remote client.
Port opened by a client.

References ch, GCCH_bind(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_remove(), GNUNET_YES, loose_channels, op, and value.

Referenced by handle_port_open().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_port_open()

static void handle_port_open ( void *  cls,
const struct GNUNET_CADET_PortMessage pmsg 
)
static

Handle port open request.

Creates a mapping from the port to the respective client and checks whether we have loose channels trying to bind to the port. If so, those are bound.

Parameters
clsIdentification of the client.
pmsgThe actual message.

Definition at line 480 of file gnunet-service-cadet.c.

482{
483 struct CadetClient *c = cls;
484 struct OpenPort *op;
485
487 "Open port %s requested by %s\n",
488 GNUNET_h2s (&pmsg->port),
489 GSC_2s (c));
490 if (NULL == c->ports)
492 GNUNET_NO);
493 op = GNUNET_new (struct OpenPort);
494 op->c = c;
495 op->port = pmsg->port;
496 GCCH_hash_port (&op->h_port,
497 &pmsg->port,
498 &my_full_id);
499 if (GNUNET_OK !=
501 &op->port,
502 op,
504 {
505 GNUNET_break (0);
507 return;
508 }
510 &op->h_port,
511 op,
514 &op->h_port,
516 op);
518}
struct GNUNET_PeerIdentity my_full_id
Local peer own ID.
static int bind_loose_channel(void *cls, const struct GNUNET_HashCode *port, void *value)
We had a remote connection value to port h_port before client cls opened port port.
const char * GSC_2s(struct CadetClient *c)
Return identifier for a client as a string.
void GCCH_hash_port(struct GNUNET_HashCode *h_port, const struct GNUNET_HashCode *port, const struct GNUNET_PeerIdentity *listener)
Hash the port and initiator and listener to calculate the "challenge" h_port we send to the other pee...
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_put(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_get_multiple(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map that match a particular key.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE
Allow multiple values with the same key.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2418
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2389
Struct containing information about a client of the service.
struct GNUNET_SERVICE_Client * client
Client handle.
struct GNUNET_CONTAINER_MultiHashMap * ports
Ports that this client has declared interest in.
struct GNUNET_HashCode port
Port to open/close.
Definition: cadet.h:193
struct CadetClient * c
Client that opened the port.

References bind_loose_channel(), OpenPort::c, CadetClient::client, GCCH_hash_port(), GNUNET_break, GNUNET_CONTAINER_multihashmap_create(), GNUNET_CONTAINER_multihashmap_get_multiple(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_new, GNUNET_NO, GNUNET_OK, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GSC_2s(), LOG, loose_channels, my_full_id, op, open_ports, GNUNET_CADET_PortMessage::port, and CadetClient::ports.

Here is the call graph for this function:

◆ handle_port_close()

static void handle_port_close ( void *  cls,
const struct GNUNET_CADET_PortMessage pmsg 
)
static

Handler for port close requests.

Marks this port as closed (unless of course we have another client with the same port open). Note that existing channels accepted on the port are not affected.

Parameters
clsIdentification of the client.
pmsgThe actual message.

Definition at line 531 of file gnunet-service-cadet.c.

533{
534 struct CadetClient *c = cls;
535 struct OpenPort *op;
536
538 "Closing port %s as requested by %s\n",
539 GNUNET_h2s (&pmsg->port),
540 GSC_2s (c));
541 if (NULL == c->ports)
542 {
543 /* Client closed a port despite _never_ having opened one? */
544 GNUNET_break (0);
546 return;
547 }
549 &pmsg->port);
550 if (NULL == op)
551 {
552 GNUNET_break (0);
554 return;
555 }
558 &op->port,
559 op));
562 &op->h_port,
563 op));
564 GNUNET_free (op);
566}
void * GNUNET_CONTAINER_multihashmap_get(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Given a key find a value in the map matching the key.

References OpenPort::c, CadetClient::client, GNUNET_assert, GNUNET_break, GNUNET_CONTAINER_multihashmap_get(), GNUNET_CONTAINER_multihashmap_remove(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_h2s(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_YES, GSC_2s(), LOG, op, open_ports, GNUNET_CADET_PortMessage::port, and CadetClient::ports.

Here is the call graph for this function:

◆ handle_channel_create()

static void handle_channel_create ( void *  cls,
const struct GNUNET_CADET_LocalChannelCreateMessage tcm 
)
static

Handler for requests for us creating a new channel to another peer and port.

Parameters
clsIdentification of the client.
tcmThe actual message.

Definition at line 576 of file gnunet-service-cadet.c.

578{
579 struct CadetClient *c = cls;
580 struct CadetChannel *ch;
581
583 {
584 /* Channel ID not in allowed range. */
585 LOG (GNUNET_ERROR_TYPE_DEBUG,"Channel ID not in allowed range.");
586 GNUNET_break (0);
588 return;
589 }
590 ch = lookup_channel (c,
591 tcm->ccn);
592 if (NULL != ch)
593 {
594 /* Channel ID already in use. Not allowed. */
595 LOG (GNUNET_ERROR_TYPE_DEBUG,"Channel ID already in use. Not allowed.");
596 GNUNET_break (0);
598 return;
599 }
601 "New channel to %s at port %s requested by %s\n",
602 GNUNET_i2s (&tcm->peer),
603 GNUNET_h2s (&tcm->port),
604 GSC_2s (c));
605
606 /* Create channel */
608 tcm->ccn,
609 GCP_get (&tcm->peer,
610 GNUNET_YES),
611 &tcm->port,
612 ntohl (tcm->opt));
613 if (NULL == ch)
614 {
615 GNUNET_break (0);
617 return;
618 }
621 ntohl (
622 tcm->ccn.
623 channel_of_client),
624 ch,
626
628}
struct CadetChannel * GCCH_channel_local_new(struct CadetClient *owner, struct GNUNET_CADET_ClientChannelNumber ccn, struct CadetPeer *destination, const struct GNUNET_HashCode *port, uint32_t options)
Create a new channel.
struct CadetPeer * GCP_get(const struct GNUNET_PeerIdentity *peer_id, int create)
Retrieve the CadetPeer structure associated with the peer.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).

References GNUNET_CADET_LocalChannelCreateMessage::ccn, ch, GNUNET_CADET_ClientChannelNumber::channel_of_client, CadetClient::channels, CadetClient::client, GCCH_channel_local_new(), GCP_get(), GNUNET_assert, GNUNET_break, GNUNET_CADET_LOCAL_CHANNEL_ID_CLI, GNUNET_CONTAINER_multihashmap32_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_i2s(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_YES, GSC_2s(), LOG, lookup_channel(), GNUNET_CADET_LocalChannelCreateMessage::opt, GNUNET_CADET_LocalChannelCreateMessage::peer, and GNUNET_CADET_LocalChannelCreateMessage::port.

Here is the call graph for this function:

◆ handle_channel_destroy()

static void handle_channel_destroy ( void *  cls,
const struct GNUNET_CADET_LocalChannelDestroyMessage msg 
)
static

Handler for requests of destroying an existing channel.

Parameters
clsclient identification of the client
msgthe actual message

Definition at line 638 of file gnunet-service-cadet.c.

641{
642 struct CadetClient *c = cls;
643 struct CadetChannel *ch;
644
645 ch = lookup_channel (c,
646 msg->ccn);
647 if (NULL == ch)
648 {
649 /* Client attempted to destroy unknown channel.
650 Can happen if the other side went down at the same time.*/
652 "%s tried to destroy unknown channel %X\n",
653 GSC_2s (c),
654 (uint32_t) ntohl (msg->ccn.channel_of_client));
656 return;
657 }
659 "%s is destroying %s\n",
660 GSC_2s (c),
661 GCCH_2s (ch));
664 ntohl (
665 msg->ccn.
666 channel_of_client),
667 ch));
669 c,
670 msg->ccn);
672}
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
void GCCH_channel_local_destroy(struct CadetChannel *ch, struct CadetClient *c, struct GNUNET_CADET_ClientChannelNumber ccn)
Destroy locally created channel.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap32_remove(struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key, const void *value)
Remove the given key-value pair from the map.

References ch, CadetClient::channels, CadetClient::client, GCCH_2s(), GCCH_channel_local_destroy(), GNUNET_assert, GNUNET_CONTAINER_multihashmap32_remove(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_SERVICE_client_continue(), GNUNET_YES, GSC_2s(), LOG, lookup_channel(), and msg.

Here is the call graph for this function:

◆ check_local_data()

static int check_local_data ( void *  cls,
const struct GNUNET_CADET_LocalData msg 
)
static

Check for client traffic data message is well-formed.

Parameters
clsidentification of the client
msgthe actual message
Returns
GNUNET_OK if msg is OK, GNUNET_SYSERR if not

Definition at line 683 of file gnunet-service-cadet.c.

685{
686 size_t payload_size;
687 size_t payload_claimed_size;
688 const char *buf;
689 struct GNUNET_MessageHeader pa;
690
691 /* FIXME: what is the format we shall allow for @a msg?
692 ONE payload item or multiple? Seems current cadet_api
693 at least in theory allows more than one. Next-gen
694 cadet_api will likely no more, so we could then
695 simplify this mess again. *//* Sanity check for message size */payload_size = ntohs (msg->header.size) - sizeof(*msg);
696 buf = (const char *) &msg[1];
697 while (payload_size >= sizeof(struct GNUNET_MessageHeader))
698 {
699 /* need to memcpy() for alignment */
700 GNUNET_memcpy (&pa,
701 buf,
702 sizeof(pa));
703 payload_claimed_size = ntohs (pa.size);
704 if ((payload_size < payload_claimed_size) ||
705 (payload_claimed_size < sizeof(struct GNUNET_MessageHeader)) ||
706 (GNUNET_CONSTANTS_MAX_CADET_MESSAGE_SIZE < payload_claimed_size))
707 {
708 GNUNET_break (0);
710 "Local data of %u total size had sub-message %u at %u with %u bytes\n",
711 ntohs (msg->header.size),
712 ntohs (pa.type),
713 (unsigned int) (buf - (const char *) &msg[1]),
714 (unsigned int) payload_claimed_size);
715 return GNUNET_SYSERR;
716 }
717 payload_size -= payload_claimed_size;
718 buf += payload_claimed_size;
719 }
720 if (0 != payload_size)
721 {
722 GNUNET_break_op (0);
723 return GNUNET_SYSERR;
724 }
725 return GNUNET_OK;
726}
#define GNUNET_CONSTANTS_MAX_CADET_MESSAGE_SIZE
Maximum message size that can be sent on CADET.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
@ GNUNET_SYSERR
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
Header for all communications.

References GNUNET_break, GNUNET_break_op, GNUNET_CONSTANTS_MAX_CADET_MESSAGE_SIZE, GNUNET_ERROR_TYPE_DEBUG, GNUNET_memcpy, GNUNET_OK, GNUNET_SYSERR, LOG, msg, GNUNET_MessageHeader::size, and GNUNET_MessageHeader::type.

◆ handle_local_data()

static void handle_local_data ( void *  cls,
const struct GNUNET_CADET_LocalData msg 
)
static

Handler for client payload traffic to be send on a channel to another peer.

Parameters
clsidentification of the client
msgthe actual message

Definition at line 737 of file gnunet-service-cadet.c.

739{
740 struct CadetClient *c = cls;
741 struct CadetChannel *ch;
742 size_t payload_size;
743 const char *buf;
744
745 ch = lookup_channel (c,
746 msg->ccn);
747 if (NULL == ch)
748 {
749 /* Channel does not exist (anymore) */
751 "Dropping payload for channel %u from client (channel unknown, other endpoint may have disconnected)\n",
752 (unsigned int) ntohl (msg->ccn.channel_of_client));
754 return;
755 }
756 payload_size = ntohs (msg->header.size) - sizeof(*msg);
758 "# payload received from clients",
759 payload_size,
760 GNUNET_NO);
761 buf = (const char *) &msg[1];
763 "Received %u bytes payload from %s for %s\n",
764 (unsigned int) payload_size,
765 GSC_2s (c),
766 GCCH_2s (ch));
767 if (GNUNET_OK !=
769 msg->ccn,
770 buf,
771 payload_size))
772 {
773 GNUNET_break (0);
775 return;
776 }
778}
int GCCH_handle_local_data(struct CadetChannel *ch, struct GNUNET_CADET_ClientChannelNumber sender_ccn, const char *buf, size_t buf_len)
Handle data given by a client.
@ GNUNET_ERROR_TYPE_WARNING
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.

References ch, CadetClient::client, GCCH_2s(), GCCH_handle_local_data(), GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_NO, GNUNET_OK, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_STATISTICS_update(), GSC_2s(), LOG, lookup_channel(), msg, GNUNET_MessageHeader::size, and stats.

Here is the call graph for this function:

◆ handle_local_ack()

static void handle_local_ack ( void *  cls,
const struct GNUNET_CADET_LocalAck msg 
)
static

Handler for client's ACKs for payload traffic.

Parameters
clsidentification of the client.
msgThe actual message.

Definition at line 788 of file gnunet-service-cadet.c.

790{
791 struct CadetClient *c = cls;
792 struct CadetChannel *ch;
793
794 ch = lookup_channel (c,
795 msg->ccn);
796 if (NULL == ch)
797 {
798 /* Channel does not exist (anymore) */
800 "Ignoring local ACK for channel %u from client (channel unknown, other endpoint may have disconnected)\n",
801 (unsigned int) ntohl (msg->ccn.channel_of_client));
803 return;
804 }
806 "Got a local ACK from %s for %s\n",
807 GSC_2s (c),
808 GCCH_2s (ch));
810 msg->ccn);
812}
void GCCH_handle_local_ack(struct CadetChannel *ch, struct GNUNET_CADET_ClientChannelNumber client_ccn)
Handle ACK from client on local channel.

References ch, CadetClient::client, GCCH_2s(), GCCH_handle_local_ack(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_SERVICE_client_continue(), GSC_2s(), LOG, lookup_channel(), and msg.

Here is the call graph for this function:

◆ get_all_peers_iterator()

static int get_all_peers_iterator ( void *  cls,
const struct GNUNET_PeerIdentity peer,
void *  value 
)
static

Iterator over all peers to send a monitoring client info about each peer.

Parameters
clsClosure ().
peerPeer ID (tunnel remote peer).
valuePeer info.
Returns
GNUNET_YES, to keep iterating.

Definition at line 824 of file gnunet-service-cadet.c.

827{
828 struct CadetClient *c = cls;
829 struct CadetPeer *p = value;
830 struct GNUNET_MQ_Envelope *env;
832
835 msg->destination = *peer;
836 msg->paths = htons (GCP_count_paths (p));
837 msg->tunnel = htons (NULL != GCP_get_tunnel (p,
838 GNUNET_NO));
839 msg->best_path_length = htonl (0); // FIXME: get length of shortest known path!
840 GNUNET_MQ_send (c->mq,
841 env);
842 return GNUNET_YES;
843}
unsigned int GCP_count_paths(const struct CadetPeer *cp)
Count the number of known paths toward the peer.
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-uri.c:38
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PEERS
Local information about all peers known to the service.
Message to inform the client about one of the peers in the service.
Definition: cadet.h:424

References env, GCP_count_paths(), GCP_get_tunnel(), GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PEERS, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_NO, GNUNET_YES, CadetClient::mq, msg, p, and value.

Referenced by handle_get_peers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_get_peers()

static void handle_get_peers ( void *  cls,
const struct GNUNET_MessageHeader message 
)
static

Handler for client's INFO PEERS request.

Parameters
clsIdentification of the client.
messageThe actual message.

Definition at line 853 of file gnunet-service-cadet.c.

855{
856 struct CadetClient *c = cls;
857 struct GNUNET_MQ_Envelope *env;
858 struct GNUNET_MessageHeader *reply;
859
861 c);
862 env = GNUNET_MQ_msg (reply,
864 GNUNET_MQ_send (c->mq,
865 env);
867}
static int get_all_peers_iterator(void *cls, const struct GNUNET_PeerIdentity *peer, void *value)
Iterator over all peers to send a monitoring client info about each peer.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PEERS_END
End of local information about all peers known to the service.

References CadetClient::client, env, GCP_iterate_all(), get_all_peers_iterator(), GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PEERS_END, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_SERVICE_client_continue(), and CadetClient::mq.

Here is the call graph for this function:

◆ path_info_iterator()

static int path_info_iterator ( void *  cls,
struct CadetPeerPath path,
unsigned int  off 
)
static

Iterator over all paths of a peer to build an InfoPeer message.

Message contains blocks of peers, first not included.

Parameters
clsmessage queue for transmission
pathPath itself
offoffset of the peer on path
Returns
GNUNET_YES if should keep iterating. GNUNET_NO otherwise.

Definition at line 881 of file gnunet-service-cadet.c.

884{
885 struct GNUNET_MQ_Handle *mq = cls;
886 struct GNUNET_MQ_Envelope *env;
887 struct GNUNET_CADET_LocalInfoPath *resp;
888 struct GNUNET_PeerIdentity *id;
889 size_t path_size;
890 unsigned int path_length;
891
892 path_length = GCPP_get_length (path);
893 path_size = sizeof(struct GNUNET_PeerIdentity) * path_length;
894 if (sizeof(*resp) + path_size > UINT16_MAX)
895 {
896 /* try just giving the relevant path */
897 path_length = GNUNET_MIN ((UINT16_MAX - sizeof(*resp)) / sizeof(struct
899 off);
900 path_size = sizeof(struct GNUNET_PeerIdentity) * path_length;
901 }
902 if (sizeof(*resp) + path_size > UINT16_MAX)
903 {
905 "Path of %u entries is too long for info message\n",
906 path_length);
907 return GNUNET_YES;
908 }
909 env = GNUNET_MQ_msg_extra (resp,
910 path_size,
912 id = (struct GNUNET_PeerIdentity *) &resp[1];
913
914 /* Don't copy first peer. First peer is always the local one. Last
915 * peer is always the destination (leave as 0, EOL).
916 */
917 for (unsigned int i = 0; i < path_length; i++)
918 id[i] = *GCP_get_id (GCPP_get_peer_at_offset (path,
919 i));
920 resp->off = htonl (off);
922 env);
923 return GNUNET_YES;
924}
struct GNUNET_MQ_Handle * mq
Definition: 003.c:5
static struct GNUNET_IDENTITY_Handle * id
Handle to IDENTITY.
unsigned int GCPP_get_length(struct CadetPeerPath *path)
Return the length of the path.
struct CadetPeer * GCPP_get_peer_at_offset(struct CadetPeerPath *path, unsigned int off)
Obtain the peer at offset off in path.
#define GNUNET_MIN(a, b)
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct.
Definition: gnunet_mq_lib.h:61
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PATH
Local information of service about a specific path.
Message to inform the client about one of the paths known to the service.
Definition: cadet.h:407
uint32_t off
Offset of the peer that was requested.
Definition: cadet.h:416
Handle to a message queue.
Definition: mq.c:87
The identity of the host (wraps the signing key of the peer).

References env, GCP_get_id(), GCPP_get_length(), GCPP_get_peer_at_offset(), GNUNET_ERROR_TYPE_WARNING, GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PATH, GNUNET_MIN, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_YES, id, LOG, mq, and GNUNET_CADET_LocalInfoPath::off.

Referenced by handle_show_path().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_show_path()

static void handle_show_path ( void *  cls,
const struct GNUNET_CADET_RequestPathInfoMessage msg 
)
static

Handler for client's GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_PATH request.

Parameters
clsIdentification of the client.
msgThe actual message.

Definition at line 934 of file gnunet-service-cadet.c.

936{
937 struct CadetClient *c = cls;
938 struct CadetPeer *p;
939 struct GNUNET_MQ_Envelope *env;
940 struct GNUNET_MessageHeader *resp;
941
942 p = GCP_get (&msg->peer,
943 GNUNET_NO);
944 if (NULL != p)
947 c->mq);
948 env = GNUNET_MQ_msg (resp,
950 GNUNET_MQ_send (c->mq,
951 env);
953}
static int path_info_iterator(void *cls, struct CadetPeerPath *path, unsigned int off)
Iterator over all paths of a peer to build an InfoPeer message.
unsigned int GCP_iterate_indirect_paths(struct CadetPeer *cp, GCP_PathIterator callback, void *callback_cls)
Iterate over the paths to a peer without direct link.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PATH_END
End of local information of service about a specific path.

References CadetClient::client, env, GCP_get(), GCP_iterate_indirect_paths(), GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PATH_END, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_NO, GNUNET_SERVICE_client_continue(), CadetClient::mq, msg, p, and path_info_iterator().

Here is the call graph for this function:

◆ get_all_tunnels_iterator()

static int get_all_tunnels_iterator ( void *  cls,
const struct GNUNET_PeerIdentity peer,
void *  value 
)
static

Iterator over all tunnels to send a monitoring client info about each tunnel.

Parameters
clsClosure ().
peerPeer ID (tunnel remote peer).
valuea struct CadetPeer
Returns
GNUNET_YES, to keep iterating.

Definition at line 965 of file gnunet-service-cadet.c.

968{
969 struct CadetClient *c = cls;
970 struct CadetPeer *p = value;
971 struct GNUNET_MQ_Envelope *env;
973 struct CadetTunnel *t;
974
975 t = GCP_get_tunnel (p,
976 GNUNET_NO);
977 if (NULL == t)
978 return GNUNET_YES;
981 msg->destination = *peer;
982 msg->channels = htonl (GCT_count_channels (t));
983 msg->connections = htonl (GCT_count_any_connections (t));
984 msg->cstate = htons (0);
985 msg->estate = htons (GCT_get_estate (t));
986 GNUNET_MQ_send (c->mq,
987 env);
988 return GNUNET_YES;
989}
unsigned int GCT_count_any_connections(const struct CadetTunnel *t)
Counts the number of connections created for a tunnel, including busy connections.
unsigned int GCT_count_channels(struct CadetTunnel *t)
Returns the number of channels using a tunnel.
enum CadetTunnelEState GCT_get_estate(struct CadetTunnel *t)
Get the encryption state of a tunnel.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS
Local information about all tunnels of service.
Message to inform the client about one of the tunnels in the service.
Definition: cadet.h:458

References env, GCP_get_tunnel(), GCT_count_any_connections(), GCT_count_channels(), GCT_get_estate(), GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_NO, GNUNET_YES, CadetClient::mq, msg, p, t, and value.

Referenced by handle_info_tunnels().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_info_tunnels()

static void handle_info_tunnels ( void *  cls,
const struct GNUNET_MessageHeader message 
)
static

Handler for client's GNUNET_MESSAGE_TYPE_CADET_LOCAL_REQUEST_INFO_TUNNELS request.

Parameters
clsclient Identification of the client.
messageThe actual message.

Definition at line 999 of file gnunet-service-cadet.c.

1001{
1002 struct CadetClient *c = cls;
1003 struct GNUNET_MQ_Envelope *env;
1004 struct GNUNET_MessageHeader *reply;
1005
1007 c);
1008 env = GNUNET_MQ_msg (reply,
1010 GNUNET_MQ_send (c->mq,
1011 env);
1013}
static int get_all_tunnels_iterator(void *cls, const struct GNUNET_PeerIdentity *peer, void *value)
Iterator over all tunnels to send a monitoring client info about each tunnel.
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS_END
End of local information about all tunnels of service.

References CadetClient::client, env, GCP_iterate_all(), get_all_tunnels_iterator(), GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS_END, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_SERVICE_client_continue(), and CadetClient::mq.

Here is the call graph for this function:

◆ handle_drop_message()

static void handle_drop_message ( void *  cls,
const struct GNUNET_CADET_RequestDropCadetMessage message 
)
static

Handler for client's GNUNET_MESSAGE_TYPE_CADET_DROP_CADET_MESSAGE request.

Parameters
clsclient Identification of the client.
messageThe actual message.

Definition at line 1023 of file gnunet-service-cadet.c.

1025{
1026 struct CadetClient *c = cls;
1027 struct CadetChannel *ch;
1028
1029 ch = lookup_channel (c,
1030 message->ccn);
1031
1032 if (NULL != ch)
1033 GCCH_assign_type_to_drop (ch, message);
1034
1036}
void GCCH_assign_type_to_drop(struct CadetChannel *ch, const struct GNUNET_CADET_RequestDropCadetMessage *message)
Assign type of message to drop.
struct GNUNET_CADET_ClientChannelNumber ccn
ID of the channel we want to drop a message for.
Definition: cadet.h:336

References GNUNET_CADET_RequestDropCadetMessage::ccn, ch, CadetClient::client, GCCH_assign_type_to_drop(), GNUNET_SERVICE_client_continue(), and lookup_channel().

Here is the call graph for this function:

◆ client_connect_cb()

static void * client_connect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
struct GNUNET_MQ_Handle mq 
)
static

Callback called when a client connects to the service.

Parameters
clsclosure for the service
clientthe new client that connected to the service
mqthe message queue used to send messages to the client
Returns
c

Definition at line 1048 of file gnunet-service-cadet.c.

1051{
1052 struct CadetClient *c;
1053
1054 c = GNUNET_new (struct CadetClient);
1055 c->client = client;
1056 c->mq = mq;
1057 c->id = next_client_id++; /* overflow not important: just for debug */
1058 c->channels
1062 c);
1064 "# clients",
1065 +1,
1066 GNUNET_NO);
1068 "%s connected\n",
1069 GSC_2s (c));
1070 return c;
1071}
static struct CadetClient * clients_tail
DLL with all the clients, tail.
static unsigned int next_client_id
Next ID to assign to a client.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
struct GNUNET_CONTAINER_MultiHashMap32 * GNUNET_CONTAINER_multihashmap32_create(unsigned int len)
Create a 32-bit key multi hash map.

References CadetClient::channels, CadetClient::client, clients_head, clients_tail, GNUNET_CONTAINER_DLL_insert, GNUNET_CONTAINER_multihashmap32_create(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_new, GNUNET_NO, GNUNET_STATISTICS_update(), GSC_2s(), CadetClient::id, LOG, mq, CadetClient::mq, next_client_id, and stats.

Here is the call graph for this function:

◆ GSC_handle_remote_channel_destroy()

void GSC_handle_remote_channel_destroy ( struct CadetClient c,
struct GNUNET_CADET_ClientChannelNumber  ccn,
struct CadetChannel ch 
)

A channel was destroyed by the other peer.

Tell our client.

Parameters
cclient that lost a channel
ccnchannel identification number for the client
chthe channel object

Definition at line 1082 of file gnunet-service-cadet.c.

1085{
1086 struct GNUNET_MQ_Envelope *env;
1088
1089 env = GNUNET_MQ_msg (tdm,
1091 tdm->ccn = ccn;
1093 env);
1096 ntohl (
1098 ch));
1099}
#define GNUNET_MESSAGE_TYPE_CADET_LOCAL_CHANNEL_DESTROY
Tell client that a channel was destroyed.
Message for or to a client to destroy tunnel.
Definition: cadet.h:235
struct GNUNET_CADET_ClientChannelNumber ccn
ID of a channel controlled by this client.
Definition: cadet.h:244

References GNUNET_CADET_LocalChannelDestroyMessage::ccn, ch, GNUNET_CADET_ClientChannelNumber::channel_of_client, CadetClient::channels, env, GNUNET_assert, GNUNET_CONTAINER_multihashmap32_remove(), GNUNET_MESSAGE_TYPE_CADET_LOCAL_CHANNEL_DESTROY, GNUNET_MQ_msg, GNUNET_YES, and GSC_send_to_client().

Referenced by GCCH_handle_remote_destroy(), and signal_remote_destroy_cb().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GSC_drop_loose_channel()

void GSC_drop_loose_channel ( const struct GNUNET_HashCode h_port,
struct CadetChannel ch 
)

A client that created a loose channel that was not bound to a port disconnected, drop it from the loose_channels list.

Parameters
h_portthe hashed port the channel was trying to bind to
chthe channel that was lost

Definition at line 1103 of file gnunet-service-cadet.c.

1105{
1108 h_port,
1109 ch));
1110}

References ch, GNUNET_assert, GNUNET_CONTAINER_multihashmap_remove(), GNUNET_YES, and loose_channels.

Referenced by channel_destroy().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ channel_destroy_iterator()

static int channel_destroy_iterator ( void *  cls,
uint32_t  key,
void *  value 
)
static

Iterator for deleting each channel whose client endpoint disconnected.

Parameters
clsClosure (client that has disconnected).
keyThe local channel id in host byte order
valueThe value stored at the key (channel to destroy).
Returns
GNUNET_OK, keep iterating.

Definition at line 1122 of file gnunet-service-cadet.c.

1125{
1126 struct CadetClient *c = cls;
1128 struct CadetChannel *ch = value;
1129
1131 "Destroying %s, due to %s disconnecting.\n",
1132 GCCH_2s (ch),
1133 GSC_2s (c));
1134 ccn.channel_of_client = htonl (key);
1137 key,
1138 ch));
1140 c,
1141 ccn);
1142 return GNUNET_OK;
1143}
struct GNUNET_HashCode key
The key used in the DHT.

References ch, GNUNET_CADET_ClientChannelNumber::channel_of_client, CadetClient::channels, GCCH_2s(), GCCH_channel_local_destroy(), GNUNET_assert, GNUNET_CONTAINER_multihashmap32_remove(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_OK, GNUNET_YES, GSC_2s(), key, LOG, and value.

Referenced by client_disconnect_cb().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ client_release_ports()

static int client_release_ports ( void *  cls,
const struct GNUNET_HashCode port,
void *  value 
)
static

Remove client's ports from the global hashmap on disconnect.

Parameters
clsthe struct CadetClient
portthe port.
valuethe struct OpenPort to remove
Returns
GNUNET_OK, keep iterating.

Definition at line 1155 of file gnunet-service-cadet.c.

1158{
1159 struct CadetClient *c = cls;
1160 struct OpenPort *op = value;
1161
1162 GNUNET_assert (c == op->c);
1164 "Closing port %s due to %s disconnect.\n",
1165 GNUNET_h2s (port),
1166 GSC_2s (c));
1169 &op->h_port,
1170 op));
1173 port,
1174 op));
1175 GNUNET_free (op);
1176 return GNUNET_OK;
1177}

References OpenPort::c, GNUNET_assert, GNUNET_CONTAINER_multihashmap_remove(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_h2s(), GNUNET_OK, GNUNET_YES, GSC_2s(), LOG, op, open_ports, port, CadetClient::ports, and value.

Referenced by client_disconnect_cb().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ client_disconnect_cb()

static void client_disconnect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
void *  internal_cls 
)
static

Callback called when a client disconnected from the service.

Parameters
clsclosure for the service
clientthe client that disconnected
internal_clsshould be equal to c

Definition at line 1188 of file gnunet-service-cadet.c.

1191{
1192 struct CadetClient *c = internal_cls;
1193
1194 GNUNET_assert (c->client == client);
1196 "%s is disconnecting.\n",
1197 GSC_2s (c));
1198 if (NULL != c->channels)
1199 {
1202 c);
1205 }
1206 if (NULL != c->ports)
1207 {
1210 c);
1212 }
1215 c);
1217 "# clients",
1218 -1,
1219 GNUNET_NO);
1220 GNUNET_free (c);
1221 if ((NULL == clients_head) &&
1223 shutdown_rest ();
1224}
static int channel_destroy_iterator(void *cls, uint32_t key, void *value)
Iterator for deleting each channel whose client endpoint disconnected.
static int client_release_ports(void *cls, const struct GNUNET_HashCode *port, void *value)
Remove client's ports from the global hashmap on disconnect.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
unsigned int GNUNET_CONTAINER_multihashmap32_size(const struct GNUNET_CONTAINER_MultiHashMap32 *map)
Get the number of key-value pairs in the map.
void GNUNET_CONTAINER_multihashmap32_destroy(struct GNUNET_CONTAINER_MultiHashMap32 *map)
Destroy a 32-bit key hash map.
int GNUNET_CONTAINER_multihashmap32_iterate(struct GNUNET_CONTAINER_MultiHashMap32 *map, GNUNET_CONTAINER_MultiHashMapIterator32Callback it, void *it_cls)
Iterate over all entries in the map.

References channel_destroy_iterator(), CadetClient::channels, CadetClient::client, client_release_ports(), clients_head, clients_tail, GNUNET_assert, GNUNET_CONTAINER_DLL_remove, GNUNET_CONTAINER_multihashmap32_destroy(), GNUNET_CONTAINER_multihashmap32_iterate(), GNUNET_CONTAINER_multihashmap32_size(), GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_NO, GNUNET_STATISTICS_update(), GNUNET_YES, GSC_2s(), LOG, CadetClient::ports, shutdown_rest(), shutting_down, and stats.

Here is the call graph for this function:

◆ run()

static void run ( void *  cls,
const struct GNUNET_CONFIGURATION_Handle c,
struct GNUNET_SERVICE_Handle service 
)
static

Setup CADET internals.

Parameters
clsclosure
cconfiguration to use

Definition at line 1234 of file gnunet-service-cadet.c.

1237{
1238 cfg = c;
1239 if (GNUNET_OK !=
1241 "CADET",
1242 "RATCHET_MESSAGES",
1244 {
1246 "CADET",
1247 "RATCHET_MESSAGES",
1248 "needs to be a number");
1249 ratchet_messages = 64;
1250 }
1251 if (GNUNET_OK !=
1253 "CADET",
1254 "RATCHET_TIME",
1255 &ratchet_time))
1256 {
1258 "CADET",
1259 "RATCHET_TIME",
1260 "need delay value");
1262 }
1263 if (GNUNET_OK !=
1265 "CADET",
1266 "REFRESH_CONNECTION_TIME",
1268 {
1270 "CADET",
1271 "REFRESH_CONNECTION_TIME",
1272 "need delay value");
1274 }
1275 if (GNUNET_OK !=
1277 "CADET",
1278 "DROP_PERCENT",
1279 &drop_percent))
1280 {
1281 drop_percent = 0;
1282 }
1283 else
1284 {
1285 LOG (GNUNET_ERROR_TYPE_WARNING, "**************************************\n");
1286 LOG (GNUNET_ERROR_TYPE_WARNING, "Cadet is running with DROP enabled.\n");
1287 LOG (GNUNET_ERROR_TYPE_WARNING, "This is NOT a good idea!\n");
1288 LOG (GNUNET_ERROR_TYPE_WARNING, "Remove DROP_PERCENT from config file.\n");
1289 LOG (GNUNET_ERROR_TYPE_WARNING, "**************************************\n");
1290 }
1292 if (NULL == my_private_key)
1293 {
1294 GNUNET_break (0);
1296 return;
1297 }
1301 c);
1303 NULL);
1305 /* FIXME: optimize code to allow GNUNET_YES here! */
1307 GNUNET_NO);
1309 GNUNET_NO);
1311 GNUNET_YES);
1313 GNUNET_YES);
1314 GCH_init (c);
1315 GCD_init (c);
1316 GCO_init (c);
1318 "CADET started for peer %s\n",
1320}
unsigned long long drop_percent
Set to non-zero values to create random drops to test retransmissions.
const struct GNUNET_CONFIGURATION_Handle * cfg
Handle to our configuration.
struct GNUNET_TIME_Relative keepalive_period
How frequently do we send KEEPALIVE messages on idle connections?
static void shutdown_task(void *cls)
Task run during shutdown.
unsigned long long ratchet_messages
How many messages are needed to trigger an AXOLOTL ratchet advance.
struct GNUNET_TIME_Relative ratchet_time
How long until we trigger a ratched advance due to time.
void GCO_init(const struct GNUNET_CONFIGURATION_Handle *c)
Initialize the CORE subsystem.
void GCD_init(const struct GNUNET_CONFIGURATION_Handle *c)
Initialize the DHT subsystem.
void GCH_init(const struct GNUNET_CONFIGURATION_Handle *c)
Initialize the hello subsystem.
struct GNUNET_TRANSPORT_ApplicationHandle * GNUNET_TRANSPORT_application_init(const struct GNUNET_CONFIGURATION_Handle *cfg)
Initialize the TRANSPORT application client handle.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_number(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *number)
Get a configuration value that should be a number.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_time(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, struct GNUNET_TIME_Relative *time)
Get a configuration value that should be a relative time.
void GNUNET_CRYPTO_eddsa_key_get_public(const struct GNUNET_CRYPTO_EddsaPrivateKey *priv, struct GNUNET_CRYPTO_EddsaPublicKey *pub)
Extract the public key for the given private key.
Definition: crypto_ecc.c:201
struct GNUNET_CRYPTO_EddsaPrivateKey * GNUNET_CRYPTO_eddsa_key_create_from_configuration(const struct GNUNET_CONFIGURATION_Handle *cfg)
Create a new private key by reading our peer's key from the file specified in the configuration.
struct GNUNET_CONTAINER_MultiShortmap * GNUNET_CONTAINER_multishortmap_create(unsigned int len, int do_not_copy_keys)
Create a multi peer map (hash map for public keys of peers).
struct GNUNET_CONTAINER_MultiPeerMap * GNUNET_CONTAINER_multipeermap_create(unsigned int len, int do_not_copy_keys)
Create a multi peer map (hash map for public keys of peers).
void GNUNET_log_config_invalid(enum GNUNET_ErrorType kind, const char *section, const char *option, const char *required)
Log error message about invalid configuration option value.
@ GNUNET_ERROR_TYPE_INFO
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:567
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received,...
Definition: scheduler.c:1339
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.
#define GNUNET_TIME_UNIT_HOURS
One hour.
#define GNUNET_TIME_UNIT_MINUTES
One minute.
struct GNUNET_CRYPTO_EddsaPublicKey public_key

References cfg, connections, drop_percent, GCD_init(), GCH_init(), GCO_init(), GNUNET_break, GNUNET_CONFIGURATION_get_value_number(), GNUNET_CONFIGURATION_get_value_time(), GNUNET_CONTAINER_multihashmap_create(), GNUNET_CONTAINER_multipeermap_create(), GNUNET_CONTAINER_multishortmap_create(), GNUNET_CRYPTO_eddsa_key_create_from_configuration(), GNUNET_CRYPTO_eddsa_key_get_public(), GNUNET_ERROR_TYPE_INFO, GNUNET_ERROR_TYPE_WARNING, GNUNET_i2s(), GNUNET_log, GNUNET_log_config_invalid(), GNUNET_NO, GNUNET_OK, GNUNET_SCHEDULER_add_shutdown(), GNUNET_SCHEDULER_shutdown(), GNUNET_STATISTICS_create(), GNUNET_TIME_UNIT_HOURS, GNUNET_TIME_UNIT_MINUTES, GNUNET_TRANSPORT_application_init(), GNUNET_YES, keepalive_period, LOG, loose_channels, my_full_id, my_private_key, open_ports, peers, GNUNET_PeerIdentity::public_key, ratchet_messages, ratchet_time, shutdown_task(), stats, and transport.

Here is the call graph for this function:

◆ GNUNET_SERVICE_MAIN()

Define "main" method using service macro.

Variable Documentation

◆ cfg

const struct GNUNET_CONFIGURATION_Handle* cfg

Handle to our configuration.

Handle to our configuration.

Definition at line 113 of file gnunet-service-cadet.c.

Referenced by run().

◆ stats

struct GNUNET_STATISTICS_Handle* stats

Handle to the statistics service.

Definition at line 118 of file gnunet-service-cadet.c.

Referenced by client_connect_cb(), client_disconnect_cb(), handle_local_data(), run(), and shutdown_rest().

◆ transport

Handle to Transport service.

Definition at line 123 of file gnunet-service-cadet.c.

Referenced by consider_peer_activate(), GCP_set_hello(), print_info(), run(), and shutdown_rest().

◆ my_full_id

struct GNUNET_PeerIdentity my_full_id

Local peer own ID.

Definition at line 128 of file gnunet-service-cadet.c.

Referenced by handle_port_open(), and run().

◆ my_private_key

struct GNUNET_CRYPTO_EddsaPrivateKey* my_private_key

Own private key.

Definition at line 133 of file gnunet-service-cadet.c.

Referenced by run(), and shutdown_rest().

◆ shutting_down

int shutting_down

Signal that shutdown is happening: prevent recovery measures.

Definition at line 138 of file gnunet-service-cadet.c.

Referenced by client_disconnect_cb(), GCT_destroy_tunnel_now(), and shutdown_task().

◆ clients_head

struct CadetClient* clients_head
static

DLL with all the clients, head.

Definition at line 143 of file gnunet-service-cadet.c.

Referenced by client_connect_cb(), client_disconnect_cb(), and shutdown_task().

◆ clients_tail

struct CadetClient* clients_tail
static

DLL with all the clients, tail.

Definition at line 148 of file gnunet-service-cadet.c.

Referenced by client_connect_cb(), and client_disconnect_cb().

◆ next_client_id

unsigned int next_client_id
static

Next ID to assign to a client.

Definition at line 153 of file gnunet-service-cadet.c.

Referenced by client_connect_cb().

◆ open_ports

struct GNUNET_CONTAINER_MultiHashMap* open_ports

All ports clients of this peer have opened.

Maps from a hashed port to a struct OpenPort.

Definition at line 159 of file gnunet-service-cadet.c.

Referenced by client_release_ports(), GCCH_channel_incoming_new(), GCCH_channel_local_new(), handle_port_close(), handle_port_open(), run(), and shutdown_rest().

◆ loose_channels

struct GNUNET_CONTAINER_MultiHashMap* loose_channels

Map from ports to channels where the ports were closed at the time we got the inbound connection.

Indexed by h_port, contains struct CadetChannel.

Definition at line 166 of file gnunet-service-cadet.c.

Referenced by bind_loose_channel(), GCCH_channel_incoming_new(), GCCH_channel_local_new(), GSC_drop_loose_channel(), handle_port_open(), run(), and shutdown_rest().

◆ peers

◆ connections

struct GNUNET_CONTAINER_MultiShortmap* connections

Map from struct GNUNET_CADET_ConnectionTunnelIdentifier hash codes to struct CadetConnection objects.

Definition at line 177 of file gnunet-service-cadet.c.

Referenced by connection_create(), GCC_destroy(), GCC_lookup(), run(), and shutdown_rest().

◆ ratchet_messages

unsigned long long ratchet_messages

How many messages are needed to trigger an AXOLOTL ratchet advance.

Definition at line 182 of file gnunet-service-cadet.c.

Referenced by run().

◆ ratchet_time

struct GNUNET_TIME_Relative ratchet_time

How long until we trigger a ratched advance due to time.

Definition at line 187 of file gnunet-service-cadet.c.

Referenced by run(), t_ax_encrypt(), and update_ax_by_kx().

◆ keepalive_period

struct GNUNET_TIME_Relative keepalive_period

How frequently do we send KEEPALIVE messages on idle connections?

Definition at line 192 of file gnunet-service-cadet.c.

Referenced by GCC_handle_connection_create_ack(), handle_connection_create(), keepalive_done(), manage_first_hop_mq(), run(), send_create_ack(), send_keepalive(), and timeout_cb().

◆ drop_percent

unsigned long long drop_percent

Set to non-zero values to create random drops to test retransmissions.

Definition at line 197 of file gnunet-service-cadet.c.

Referenced by get_channel_weight(), run(), and should_I_drop().