GNUnet 0.27.0
 
Loading...
Searching...
No Matches
gnunet-service-cadet_connection.h File Reference

A connection is a live end-to-end messaging mechanism where the peers are identified by a path and know how to forward along the route using a connection identifier for routing the data. More...

Include dependency graph for gnunet-service-cadet_connection.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  CadetConnectionCreatePS
 Purpose for the signature of a monotime. More...
 
struct  CadetConnectionMetrics
 Performance metrics for a connection. More...
 

Typedefs

typedef void(* GCC_ReadyCallback) (void *cls, int is_ready)
 Function called to notify tunnel about change in our readiness.
 

Functions

void GCC_destroy_without_core (struct CadetConnection *cc)
 Destroy a connection, called when the CORE layer is already done (i.e.
 
void GCC_destroy_without_tunnel (struct CadetConnection *cc)
 Destroy a connection, called if the tunnel association with the connection was already broken, but we still need to notify the CORE layer about the breakage.
 
struct CadetConnectionGCC_lookup (const struct GNUNET_CADET_ConnectionTunnelIdentifier *cid)
 Lookup a connection by its identifier.
 
struct CadetConnectionGCC_create (struct CadetPeer *destination, struct CadetPeerPath *path, unsigned int off, struct CadetTConnection *ct, GCC_ReadyCallback ready_cb, void *ready_cb_cls)
 Create a connection to destination via path and notify cb whenever we are ready for more data.
 
struct CadetConnectionGCC_create_inbound (struct CadetPeer *destination, struct CadetPeerPath *path, struct CadetTConnection *ct, const struct GNUNET_CADET_ConnectionTunnelIdentifier *cid, GCC_ReadyCallback ready_cb, void *ready_cb_cls)
 Create a connection to destination via path and notify cb whenever we are ready for more data.
 
void GCC_transmit (struct CadetConnection *cc, struct GNUNET_MQ_Envelope *env)
 Transmit message msg via connection cc.
 
void GCC_handle_connection_create_ack (struct CadetConnection *cc)
 A GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE_ACK was received for this connection, implying that the end-to-end connection is up.
 
void GCC_handle_duplicate_create (struct CadetConnection *cc)
 We got a GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE for a connection that we already have.
 
void GCC_handle_kx (struct CadetConnection *cc, const struct GNUNET_CADET_TunnelKeyExchangeMessage *msg)
 Handle KX message.
 
void GCC_handle_kx_auth (struct CadetConnection *cc, const struct GNUNET_CADET_TunnelKeyExchangeAuthMessage *msg)
 Handle KX_AUTH message.
 
const struct CadetConnectionMetricsGCC_get_metrics (struct CadetConnection *cc)
 Obtain performance metrics from cc.
 
void GCC_handle_encrypted (struct CadetConnection *cc, const struct GNUNET_CADET_TunnelEncryptedMessage *msg)
 Handle encrypted message.
 
void GCC_ack_expected (const struct GNUNET_CADET_ConnectionTunnelIdentifier *cid)
 We sent a message for which we expect to receive an ACK via the connection identified by cti.
 
void GCC_ack_observed (const struct GNUNET_CADET_ConnectionTunnelIdentifier *cid)
 We observed an ACK for a message that was originally sent via the connection identified by cti.
 
void GCC_latency_observed (const struct GNUNET_CADET_ConnectionTunnelIdentifier *cti, struct GNUNET_TIME_Relative latency)
 We observed some the given latency on the connection identified by cti.
 
struct CadetTConnectionGCC_get_ct (struct CadetConnection *cc)
 Return the tunnel associated with this connection.
 
struct CadetPeerPathGCC_get_path (struct CadetConnection *cc, unsigned int *off)
 Obtain the path used by this connection.
 
const struct GNUNET_CADET_ConnectionTunnelIdentifierGCC_get_id (struct CadetConnection *cc)
 Obtain unique ID for the connection.
 
const char * GCC_2s (const struct CadetConnection *cc)
 Get a (static) string for a connection.
 
void GCC_debug (struct CadetConnection *cc, enum GNUNET_ErrorType level)
 Log connection info.
 

Detailed Description

A connection is a live end-to-end messaging mechanism where the peers are identified by a path and know how to forward along the route using a connection identifier for routing the data.

Author
Bartlomiej Polot
Christian Grothoff

Definition in file gnunet-service-cadet_connection.h.

Typedef Documentation

◆ GCC_ReadyCallback

typedef void(* GCC_ReadyCallback) (void *cls, int is_ready)

Function called to notify tunnel about change in our readiness.

Parameters
clsclosure
is_readyGNUNET_YES if the connection is now ready for transmission, GNUNET_NO if the connection is no longer ready for transmission

Definition at line 46 of file gnunet-service-cadet_connection.h.

Function Documentation

◆ GCC_destroy_without_core()

void GCC_destroy_without_core ( struct CadetConnection cc)

Destroy a connection, called when the CORE layer is already done (i.e.

has received a BROKEN message), but if we still have to communicate the destruction of the connection to the tunnel (if one exists).

Parameters
ccconnection to destroy

Definition at line 303 of file gnunet-service-cadet_connection.c.

304{
305 if (NULL != cc->ct)
306 {
308 cc->ct = NULL;
309 }
310 GCC_destroy (cc);
311}
static void GCC_destroy(struct CadetConnection *cc)
Destroy a connection, part of the internal implementation.
void GCT_connection_lost(struct CadetTConnection *ct)
We lost a connection, remove it from our list and clean up the connection object itself.
struct CadetTConnection * ct
Which tunnel is using this connection?

References CadetConnection::ct, GCC_destroy(), GCT_connection_lost(), and CadetConnection::off.

Referenced by handle_connection_broken(), and handle_connection_destroy().

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

◆ GCC_destroy_without_tunnel()

void GCC_destroy_without_tunnel ( struct CadetConnection cc)

Destroy a connection, called if the tunnel association with the connection was already broken, but we still need to notify the CORE layer about the breakage.

Parameters
ccconnection to destroy

Definition at line 322 of file gnunet-service-cadet_connection.c.

323{
324 cc->ct = NULL;
325 if ((CADET_CONNECTION_SENDING_CREATE != cc->state) && (NULL != cc->mq_man))
326 {
327 struct GNUNET_MQ_Envelope *env;
328 struct GNUNET_CADET_ConnectionDestroyMessage *destroy_msg;
329
330 /* Need to notify next hop that we are down. */
331 env =
333 destroy_msg->cid = cc->cid;
335 cc->mq_man = NULL;
336 }
337 GCC_destroy (cc);
338}
struct GNUNET_MQ_Envelope * env
Definition 005.c:1
@ CADET_CONNECTION_SENDING_CREATE
Connection create message in queue, awaiting transmission by CORE.
void GCP_request_mq_cancel(struct GCP_MessageQueueManager *mqm, struct GNUNET_MQ_Envelope *last_env)
Stops message queue change notifications.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
#define GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY
Request the destruction of a connection.
struct GNUNET_CADET_ConnectionTunnelIdentifier cid
ID of the connection.
enum CadetConnectionState state
State of the connection.
struct GCP_MessageQueueManager * mq_man
Handle for calling GCP_request_mq_cancel() once we are finished.
Message to destroy a connection.
struct GNUNET_CADET_ConnectionTunnelIdentifier cid
ID of the connection.

References CADET_CONNECTION_SENDING_CREATE, GNUNET_CADET_ConnectionDestroyMessage::cid, CadetConnection::cid, CadetConnection::ct, env, GCC_destroy(), GCP_request_mq_cancel(), GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY, GNUNET_MQ_msg, CadetConnection::mq_man, CadetConnection::off, and CadetConnection::state.

Referenced by destroy_t_connection(), and GCC_create_inbound().

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

◆ GCC_lookup()

struct CadetConnection * GCC_lookup ( const struct GNUNET_CADET_ConnectionTunnelIdentifier cid)

Lookup a connection by its identifier.

Parameters
cididentifier to resolve
Returns
NULL if connection was not found

Definition at line 200 of file gnunet-service-cadet_connection.c.

201{
204}
struct GNUNET_CONTAINER_MultiShortmap * connections
Map from struct GNUNET_CADET_ConnectionTunnelIdentifier hash codes to struct CadetConnection objects.
void * GNUNET_CONTAINER_multishortmap_get(const struct GNUNET_CONTAINER_MultiShortmap *map, const struct GNUNET_ShortHashCode *key)
Given a key find a value in the map matching the key.
struct GNUNET_ShortHashCode connection_of_tunnel

References CadetConnection::cid, GNUNET_CADET_ConnectionTunnelIdentifier::connection_of_tunnel, connections, and GNUNET_CONTAINER_multishortmap_get().

Referenced by data_sent_cb(), GCC_ack_expected(), GCC_ack_observed(), GCC_latency_observed(), handle_connection_broken(), handle_connection_create(), handle_connection_create_ack(), handle_connection_destroy(), handle_tunnel_encrypted(), handle_tunnel_kx(), and handle_tunnel_kx_auth().

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

◆ GCC_create()

struct CadetConnection * GCC_create ( struct CadetPeer destination,
struct CadetPeerPath path,
unsigned int  off,
struct CadetTConnection ct,
GCC_ReadyCallback  ready_cb,
void *  ready_cb_cls 
)

Create a connection to destination via path and notify cb whenever we are ready for more data.

Parameters
destinationwhere to go
pathwhich path to take (may not be the full path)
offoffset of destination on path
ctwhich tunnel uses this connection
ready_cbfunction to call when ready to transmit
ready_cb_clsclosure for cb
Returns
handle to the connection

Definition at line 964 of file gnunet-service-cadet_connection.c.

970{
972
974 return connection_create (destination,
975 path,
976 off,
977 ct,
978 &cid,
980 ready_cb,
981 ready_cb_cls);
982}
static struct CadetConnection * connection_create(struct CadetPeer *destination, struct CadetPeerPath *path, unsigned int off, struct CadetTConnection *ct, const struct GNUNET_CADET_ConnectionTunnelIdentifier *cid, enum CadetConnectionState init_state, GCC_ReadyCallback ready_cb, void *ready_cb_cls)
Create a connection to destination via path and notify cb whenever we are ready for more data.
@ CADET_CONNECTION_NEW
Uninitialized status, we have not yet even gotten the message queue.
void GNUNET_CRYPTO_random_block(enum GNUNET_CRYPTO_Quality mode, void *buffer, size_t length)
Fill block with a random values.
@ GNUNET_CRYPTO_QUALITY_NONCE
Randomness for IVs etc.
Hash uniquely identifying a connection below a tunnel.

References CADET_CONNECTION_NEW, connection_create(), GNUNET_CRYPTO_QUALITY_NONCE, and GNUNET_CRYPTO_random_block().

Referenced by consider_path_cb().

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

◆ GCC_create_inbound()

struct CadetConnection * GCC_create_inbound ( struct CadetPeer destination,
struct CadetPeerPath path,
struct CadetTConnection ct,
const struct GNUNET_CADET_ConnectionTunnelIdentifier cid,
GCC_ReadyCallback  ready_cb,
void *  ready_cb_cls 
)

Create a connection to destination via path and notify cb whenever we are ready for more data.

This is an inbound tunnel, so we must use the existing cid

Parameters
destinationwhere to go
pathwhich path to take (may not be the full path)
ctwhich tunnel uses this connection
ready_cbfunction to call when ready to transmit
ready_cb_clsclosure for cb
Returns
handle to the connection, NULL if we already have a connection that takes precedence on path

Definition at line 902 of file gnunet-service-cadet_connection.c.

908{
909 struct CadetConnection *cc;
910 unsigned int off;
911
915 if (NULL != cc)
916 {
917 int cmp;
918
919 cmp = GNUNET_memcmp (cid, &cc->cid);
920 if (0 == cmp)
921 {
922 /* Two peers picked the SAME random connection identifier at the
923 same time for the same path? Must be malicious. Drop
924 connection (existing and inbound), even if it is the only
925 one. */
926 GNUNET_break_op (0);
929 return NULL;
930 }
931 if (0 < cmp)
932 {
933 /* drop existing */
935 "Got two connections on %s, dropping my existing %s\n",
936 GCPP_2s (path),
937 GCC_2s (cc));
940 }
941 else
942 {
943 /* keep existing */
945 "Got two connections on %s, keeping my existing %s\n",
946 GCPP_2s (path),
947 GCC_2s (cc));
948 return NULL;
949 }
950 }
951
953 path,
954 off,
955 ct,
956 cid,
958 ready_cb,
960}
@ CADET_CONNECTION_CREATE_RECEIVED
We are an inbound connection, and received a CREATE.
const char * GCC_2s(const struct CadetConnection *cc)
Get a (static) string for a connection.
void GCC_destroy_without_tunnel(struct CadetConnection *cc)
Destroy a connection, called if the tunnel association with the connection was already broken,...
#define LOG(level,...)
const char * GCPP_2s(struct CadetPeerPath *path)
Convert a path to a human-readable string.
struct CadetConnection * GCPP_get_connection(struct CadetPeerPath *path, struct CadetPeer *destination, unsigned int off)
Return connection to destination using path, or return NULL if no such connection exists.
unsigned int GCPP_find_peer(struct CadetPeerPath *path, struct CadetPeer *cp)
Find peer's offset on path.
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
@ GNUNET_ERROR_TYPE_DEBUG
Low-level connection to a destination.
GCC_ReadyCallback ready_cb
Function to call once we are ready to transmit.
void * ready_cb_cls
Closure for ready_cb.
struct CadetPeerPath * path
Path we are using to our destination.
unsigned int off
Offset of our destination in path.
struct CadetPeer * destination
To which peer does this connection go?

References CADET_CONNECTION_CREATE_RECEIVED, CadetConnection::cid, connection_create(), CadetConnection::ct, CadetConnection::destination, GCC_2s(), GCC_destroy_without_tunnel(), GCPP_2s(), GCPP_find_peer(), GCPP_get_connection(), GCT_connection_lost(), GNUNET_assert, GNUNET_break_op, GNUNET_ERROR_TYPE_DEBUG, GNUNET_memcmp, LOG, CadetConnection::off, CadetConnection::path, CadetConnection::ready_cb, and CadetConnection::ready_cb_cls.

Referenced by GCT_add_inbound_connection().

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

◆ GCC_transmit()

void GCC_transmit ( struct CadetConnection cc,
struct GNUNET_MQ_Envelope env 
)

Transmit message msg via connection cc.

Must only be called (once) after the connection has signalled that it is ready via the ready_cb. Clients can also use #GCC_is_ready() to check if the connection is right now ready for transmission.

Parameters
ccconnection identification
envenvelope with message to transmit; the #GNUNET_MQ_notify_send() must not have yet been used for the envelope. Also, the message better match the connection identifier of this connection...

Must only be called (once) after the connection has signalled that it is ready via the ready_cb. Clients can also use #GCC_is_ready() to check if the connection is right now ready for transmission.

Parameters
ccconnection identification
envenvelope with message to transmit; must NOT yet have a GNUNET_MQ_notify_sent() callback attached to it

Definition at line 996 of file gnunet-service-cadet_connection.c.

997{
999 "Scheduling message for transmission on %s\n",
1000 GCC_2s (cc));
1004 cc->mqm_ready = GNUNET_NO;
1005 if (NULL != cc->task)
1006 {
1008 cc->task = NULL;
1009 }
1010 GCP_send (cc->mq_man, env);
1011}
@ CADET_CONNECTION_READY
Connection confirmed, ready to carry traffic.
void GCP_send(struct GCP_MessageQueueManager *mqm, struct GNUNET_MQ_Envelope *env)
Send the message in env to cp.
@ GNUNET_YES
@ GNUNET_NO
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition scheduler.c:986
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition time.c:111
struct GNUNET_TIME_Absolute last_use
When was this connection last used? (by us sending or receiving a PAYLOAD message on it)
struct CadetConnectionMetrics metrics
Performance metrics for this connection.
struct GNUNET_SCHEDULER_Task * task
Task for connection maintenance.
int mqm_ready
Are we ready to transmit via mq_man right now?

References CADET_CONNECTION_READY, env, GCC_2s(), GCP_send(), GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_NO, GNUNET_SCHEDULER_cancel(), GNUNET_TIME_absolute_get(), GNUNET_YES, CadetConnectionMetrics::last_use, LOG, CadetConnection::metrics, CadetConnection::mq_man, CadetConnection::mqm_ready, CadetConnection::state, and CadetConnection::task.

Referenced by send_kx(), send_kx_auth(), and try_send_normal_payload().

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

◆ GCC_handle_connection_create_ack()

void GCC_handle_connection_create_ack ( struct CadetConnection cc)

A GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE_ACK was received for this connection, implying that the end-to-end connection is up.

Process it.

Parameters
ccthe connection that got the ACK.

Definition at line 499 of file gnunet-service-cadet_connection.c.

500{
502 "Received CADET_CONNECTION_CREATE_ACK for %s in state %d (%s)\n",
503 GCC_2s (cc),
504 cc->state,
505 (GNUNET_YES == cc->mqm_ready) ? "MQM ready" : "MQM busy");
506 if (CADET_CONNECTION_READY == cc->state)
507 return; /* Duplicate ACK, ignore */
508 if (NULL != cc->task)
509 {
511 cc->task = NULL;
512 }
515 if ((NULL == cc->keepalive_qe) && (GNUNET_YES == cc->mqm_ready) &&
516 (NULL == cc->task))
517 cc->task =
519}
struct GNUNET_TIME_Relative keepalive_period
How frequently do we send KEEPALIVE messages on idle connections?
static void update_state(struct CadetConnection *cc, enum CadetConnectionState new_state, int new_mqm_ready)
Update the connection state.
static void send_keepalive(void *cls)
Send a GNUNET_MESSAGE_TYPE_CADET_CHANNEL_KEEPALIVE through the tunnel to prevent it from timing out.
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:1283
struct GNUNET_TIME_Absolute age
When was this connection first established? (by us sending or receiving the CREATE_ACK for the first ...
struct CadetTunnelQueueEntry * keepalive_qe
Queue entry for keepalive messages.

References CadetConnectionMetrics::age, CADET_CONNECTION_READY, GCC_2s(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_SCHEDULER_add_delayed(), GNUNET_SCHEDULER_cancel(), GNUNET_TIME_absolute_get(), GNUNET_YES, keepalive_period, CadetConnection::keepalive_qe, LOG, CadetConnection::metrics, CadetConnection::mqm_ready, CadetConnection::off, send_keepalive(), CadetConnection::state, CadetConnection::task, and update_state().

Referenced by GCC_handle_encrypted(), GCC_handle_kx(), GCC_handle_kx_auth(), and handle_connection_create_ack().

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

◆ GCC_handle_duplicate_create()

void GCC_handle_duplicate_create ( struct CadetConnection cc)

We got a GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE for a connection that we already have.

Either our ACK got lost or something is fishy. Consider retransmitting the ACK.

Parameters
ccconnection that got the duplicate CREATE

Definition at line 727 of file gnunet-service-cadet_connection.c.

728{
729 if (GNUNET_YES == cc->mqm_ready)
730 {
732 "Got duplicate CREATE for %s, scheduling another ACK (%s)\n",
733 GCC_2s (cc),
734 (GNUNET_YES == cc->mqm_ready) ? "MQM ready" : "MQM busy");
735 /* Revert back to the state of having only received the 'CREATE',
736 and immediately proceed to send the CREATE_ACK. */
738 if (NULL != cc->task)
740 cc->task =
742 }
743 else
744 {
745 /* We are currently sending something else back, which
746 can only be an ACK or payload, either of which would
747 do. So actually no need to do anything. */
749 "Got duplicate CREATE for %s. MQ is busy, not queueing another ACK\n",
750 GCC_2s (cc));
751 }
752}
static void send_create_ack(void *cls)
Send a CREATE_ACK message towards the origin.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_at(struct GNUNET_TIME_Absolute at, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run at the specified time.
Definition scheduler.c:1260
struct GNUNET_TIME_Absolute create_ack_at
Earliest time for re-trying CREATE_ACK.

References CADET_CONNECTION_CREATE_RECEIVED, CadetConnection::create_ack_at, GCC_2s(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_SCHEDULER_add_at(), GNUNET_SCHEDULER_cancel(), GNUNET_YES, LOG, CadetConnection::mqm_ready, send_create_ack(), CadetConnection::task, and update_state().

Referenced by handle_connection_create().

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

◆ GCC_handle_kx()

void GCC_handle_kx ( struct CadetConnection cc,
const struct GNUNET_CADET_TunnelKeyExchangeMessage msg 
)

Handle KX message.

Parameters
ccconnection that received encrypted message
msgthe key exchange message

Definition at line 529 of file gnunet-service-cadet_connection.c.

531{
533 "Received KX message with ephermal %s on CC %s in state %d\n",
534 GNUNET_e2s (&msg->ephemeral_key),
536 cc->state);
537 if (CADET_CONNECTION_SENT == cc->state)
538 {
539 /* We didn't get the CADET_CONNECTION_CREATE_ACK, but instead got payload. That's fine,
540 clearly something is working, so pretend we got an ACK. */
542 "Faking connection CADET_CONNECTION_CREATE_ACK for %s due to KX\n",
543 GCC_2s (cc));
545 }
546 GCT_handle_kx (cc->ct, msg);
547}
struct GNUNET_MessageHeader * msg
Definition 005.c:2
void GCC_handle_connection_create_ack(struct CadetConnection *cc)
A GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE_ACK was received for this connection,...
@ CADET_CONNECTION_SENT
Connection create message sent, waiting for ACK.
void GCT_handle_kx(struct CadetTConnection *ct, const struct GNUNET_CADET_TunnelKeyExchangeMessage *msg)
Continue to handle KX message.
const char * GNUNET_e2s(const struct GNUNET_CRYPTO_EcdhePublicKey *p)
Convert a public key value to a string (for printing debug messages).
const char * GNUNET_sh2s(const struct GNUNET_ShortHashCode *shc)
Convert a short hash value to a string (for printing debug messages).

References CADET_CONNECTION_SENT, CadetConnection::cid, GNUNET_CADET_ConnectionTunnelIdentifier::connection_of_tunnel, CadetConnection::ct, GCC_2s(), GCC_handle_connection_create_ack(), GCT_handle_kx(), GNUNET_e2s(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_sh2s(), LOG, msg, and CadetConnection::state.

Referenced by handle_tunnel_kx().

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

◆ GCC_handle_kx_auth()

void GCC_handle_kx_auth ( struct CadetConnection cc,
const struct GNUNET_CADET_TunnelKeyExchangeAuthMessage msg 
)

Handle KX_AUTH message.

Parameters
ccconnection that received encrypted message
msgthe key exchange message

Definition at line 557 of file gnunet-service-cadet_connection.c.

559{
561 "Received KX AUTH message with ephermal %s on CC %s in state %d\n",
562 GNUNET_e2s (&msg->kx.ephemeral_key),
564 cc->state);
565 if (CADET_CONNECTION_SENT == cc->state)
566 {
567 /* We didn't get the CADET_CONNECTION_CREATE_ACK, but instead got payload. That's fine,
568 clearly something is working, so pretend we got an ACK. */
570 "Faking connection CADET_CONNECTION_CREATE_ACK for %s due to KX\n",
571 GCC_2s (cc));
573 }
575}
void GCT_handle_kx_auth(struct CadetTConnection *ct, const struct GNUNET_CADET_TunnelKeyExchangeAuthMessage *msg)
Handle KX_AUTH message.

References CADET_CONNECTION_SENT, CadetConnection::cid, GNUNET_CADET_ConnectionTunnelIdentifier::connection_of_tunnel, CadetConnection::ct, GCC_2s(), GCC_handle_connection_create_ack(), GCT_handle_kx_auth(), GNUNET_e2s(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_sh2s(), LOG, msg, and CadetConnection::state.

Referenced by handle_tunnel_kx_auth().

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

◆ GCC_get_metrics()

const struct CadetConnectionMetrics * GCC_get_metrics ( struct CadetConnection cc)

Obtain performance metrics from cc.

Parameters
ccconnection to query
Returns
the metrics

Definition at line 361 of file gnunet-service-cadet_connection.c.

362{
363 return &cc->metrics;
364}

References CadetConnection::metrics.

Referenced by data_sent_cb(), and evaluate_connection().

Here is the caller graph for this function:

◆ GCC_handle_encrypted()

void GCC_handle_encrypted ( struct CadetConnection cc,
const struct GNUNET_CADET_TunnelEncryptedMessage msg 
)

Handle encrypted message.

Parameters
ccconnection that received encrypted message
msgthe encrypted message to decrypt

Definition at line 585 of file gnunet-service-cadet_connection.c.

587{
588 if (CADET_CONNECTION_SENT == cc->state)
589 {
590 /* We didn't get the CREATE_ACK, but instead got payload. That's fine,
591 clearly something is working, so pretend we got an ACK. */
593 "Faking connection ACK for %s due to ENCRYPTED payload\n",
594 GCC_2s (cc));
596 }
599}
void GCT_handle_encrypted(struct CadetTConnection *ct, const struct GNUNET_CADET_TunnelEncryptedMessage *msg)
Handle encrypted message.

References CADET_CONNECTION_SENT, CadetConnection::ct, GCC_2s(), GCC_handle_connection_create_ack(), GCT_handle_encrypted(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_TIME_absolute_get(), CadetConnectionMetrics::last_use, LOG, CadetConnection::metrics, msg, and CadetConnection::state.

Referenced by handle_tunnel_encrypted().

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

◆ GCC_ack_expected()

void GCC_ack_expected ( const struct GNUNET_CADET_ConnectionTunnelIdentifier cid)

We sent a message for which we expect to receive an ACK via the connection identified by cti.

Parameters
cidconnection identifier where we expect an ACK

Definition at line 440 of file gnunet-service-cadet_connection.c.

441{
442 struct CadetConnection *cc;
443
444 cc = GCC_lookup (cid);
445 if (NULL == cc)
446 return; /* whopise, connection already down? */
448}
struct CadetConnection * GCC_lookup(const struct GNUNET_CADET_ConnectionTunnelIdentifier *cid)
Lookup a connection by its identifier.
unsigned long long num_acked_transmissions
How many packets that ought to generate an ACK did we send via this connection?

References CadetConnection::cid, GCC_lookup(), CadetConnection::metrics, CadetConnectionMetrics::num_acked_transmissions, and CadetConnection::off.

Referenced by data_sent_cb().

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

◆ GCC_ack_observed()

void GCC_ack_observed ( const struct GNUNET_CADET_ConnectionTunnelIdentifier cid)

We observed an ACK for a message that was originally sent via the connection identified by cti.

Parameters
cidconnection identifier where we got an ACK for a message that was originally sent via this connection (the ACK may have gotten back to us via a different connection).

We observed an ACK for a message that was originally sent via the connection identified by cti.

Parameters
cidconnection identifier where we got an ACK for a message that was originally sent via this connection (the ACK may have gotten back to us via a different connection).

Definition at line 460 of file gnunet-service-cadet_connection.c.

461{
462 struct CadetConnection *cc;
463
464 cc = GCC_lookup (cid);
465 if (NULL == cc)
466 return; /* whopise, connection already down? */
468}
unsigned long long num_successes
Number of packets that were sent via this connection did actually receive an ACK? (Note: ACKs may be ...

References CadetConnection::cid, GCC_lookup(), CadetConnection::metrics, CadetConnectionMetrics::num_successes, and CadetConnection::off.

Referenced by handle_matching_ack().

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

◆ GCC_latency_observed()

void GCC_latency_observed ( const struct GNUNET_CADET_ConnectionTunnelIdentifier cti,
struct GNUNET_TIME_Relative  latency 
)

We observed some the given latency on the connection identified by cti.

(The same connection was taken in both directions.)

Parameters
cticonnection identifier where we measured latency
latencythe observed latency

Definition at line 472 of file gnunet-service-cadet_connection.c.

474{
475 struct CadetConnection *cc;
476 double weight;
477 double result;
478
479 cc = GCC_lookup (cid);
480 if (NULL == cc)
481 return; /* whopise, connection already down? */
482 GNUNET_STATISTICS_update (stats, "# latencies observed", 1, GNUNET_NO);
483 cc->latency_datapoints++;
484 if (cc->latency_datapoints >= 7)
485 weight = 7.0;
486 else
487 weight = cc->latency_datapoints;
488 /* Compute weighted average, giving at MOST weight 7 to the
489 existing values, or less if that value is based on fewer than 7
490 measurements. */
491 result = (weight * cc->metrics.aged_latency.rel_value_us)
492 + 1.0 * latency.rel_value_us;
493 result /= (weight + 1.0);
495}
static int result
Global testing status.
static struct GNUNET_STATISTICS_Handle * stats
Handle to the statistics service.
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
struct GNUNET_TIME_Relative aged_latency
Our current best estimate of the latency, based on a weighted average of at least latency_datapoints ...
unsigned int latency_datapoints
How many latency observations did we make for this connection?
uint64_t rel_value_us
The actual value.

References CadetConnectionMetrics::aged_latency, CadetConnection::cid, GCC_lookup(), GNUNET_NO, GNUNET_STATISTICS_update(), CadetConnection::latency_datapoints, CadetConnection::metrics, CadetConnection::off, GNUNET_TIME_Relative::rel_value_us, result, and stats.

Referenced by handle_matching_ack().

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

◆ GCC_get_ct()

struct CadetTConnection * GCC_get_ct ( struct CadetConnection cc)

Return the tunnel associated with this connection.

Parameters
ccconnection to query
Returns
corresponding entry in the tunnel's connection list

Definition at line 348 of file gnunet-service-cadet_connection.c.

349{
350 return cc->ct;
351}

References CadetTConnection::cc, and CadetConnection::ct.

◆ GCC_get_path()

struct CadetPeerPath * GCC_get_path ( struct CadetConnection cc,
unsigned int *  off 
)

Obtain the path used by this connection.

Parameters
ccconnection
[out]offset to offset in this path where the connection cc ends
Returns
path to cc
Parameters
ccconnection
[out]offset to the length of the path we use
Returns
path to cc

Definition at line 1022 of file gnunet-service-cadet_connection.c.

1023{
1024 *off = cc->off;
1025 return cc->path;
1026}

References CadetConnection::off, and CadetConnection::path.

Referenced by evaluate_connection(), handle_connection_broken(), handle_connection_create_ack(), handle_connection_destroy(), handle_tunnel_encrypted(), handle_tunnel_kx(), and handle_tunnel_kx_auth().

Here is the caller graph for this function:

◆ GCC_get_id()

const struct GNUNET_CADET_ConnectionTunnelIdentifier * GCC_get_id ( struct CadetConnection cc)

Obtain unique ID for the connection.

Parameters
ccconnection.
Returns
unique number of the connection

Definition at line 1036 of file gnunet-service-cadet_connection.c.

1037{
1038 return &cc->cid;
1039}

References CadetConnection::cid.

Referenced by connection_create(), GCC_destroy(), GCP_add_connection(), GCP_remove_connection(), handle_plaintext_channel_destroy(), handle_plaintext_channel_open(), handle_plaintext_channel_open_ack(), handle_plaintext_data(), handle_plaintext_data_ack(), send_kx(), send_kx_auth(), and try_send_normal_payload().

Here is the caller graph for this function:

◆ GCC_2s()

const char * GCC_2s ( const struct CadetConnection cc)

Get a (static) string for a connection.

Parameters
ccConnection.

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

1049{
1050 static char buf[128];
1051
1052 if (NULL == cc)
1053 return "Connection(NULL)";
1054
1055 if (NULL != cc->ct)
1056 {
1057 GNUNET_snprintf (buf,
1058 sizeof(buf),
1059 "Connection %s (%s)",
1061 GCT_2s (cc->ct->t));
1062 return buf;
1063 }
1064 GNUNET_snprintf (buf,
1065 sizeof(buf),
1066 "Connection %s",
1068 return buf;
1069}
const char * GCT_2s(const struct CadetTunnel *t)
Get the static string for the peer this tunnel is directed.
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.
struct CadetTunnel * t
Tunnel this connection belongs to.

References CadetConnection::cid, GNUNET_CADET_ConnectionTunnelIdentifier::connection_of_tunnel, CadetConnection::ct, GCT_2s(), GNUNET_sh2s(), GNUNET_snprintf(), and CadetTConnection::t.

Referenced by connection_create(), connection_ready_cb(), consider_path_cb(), cont_send_create(), evaluate_connection(), GCC_create_inbound(), GCC_debug(), GCC_destroy(), GCC_handle_connection_create_ack(), GCC_handle_duplicate_create(), GCC_handle_encrypted(), GCC_handle_kx(), GCC_handle_kx_auth(), GCC_transmit(), GCP_add_connection(), GCP_remove_connection(), GCPP_add_connection(), GCPP_del_connection(), GCT_add_inbound_connection(), GCT_handle_kx(), manage_first_hop_mq(), send_create_ack(), send_keepalive(), and try_send_normal_payload().

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

◆ GCC_debug()

void GCC_debug ( struct CadetConnection cc,
enum GNUNET_ErrorType  level 
)

Log connection info.

Parameters
ccconnection
levelDebug level to use.

Definition at line 1083 of file gnunet-service-cadet_connection.c.

1084{
1085#if ! defined(GNUNET_CULL_LOGGING)
1086 int do_log;
1087
1089 "cadet-con",
1090 __FILE__,
1091 __FUNCTION__,
1092 __LINE__);
1093 if (0 == do_log)
1094 return;
1095 if (NULL == cc)
1096 {
1097 LOG2 (level, "Connection (NULL)\n");
1098 return;
1099 }
1100 LOG2 (level,
1101 "%s to %s via path %s in state %d is %s\n",
1102 GCC_2s (cc),
1103 GCP_2s (cc->destination),
1104 GCPP_2s (cc->path),
1105 cc->state,
1106 (GNUNET_YES == cc->mqm_ready) ? "ready" : "busy");
1107#endif
1108}
#define LOG2(level,...)
const char * GCP_2s(const struct CadetPeer *cp)
Get the static string for a peer ID.
int GNUNET_get_log_call_status(int caller_level, const char *comp, const char *file, const char *function, int line)
Decides whether a particular logging call should or should not be allowed to be made.
@ GNUNET_ERROR_TYPE_BULK

References CadetConnection::destination, GCC_2s(), GCP_2s(), GCPP_2s(), GNUNET_ERROR_TYPE_BULK, GNUNET_get_log_call_status(), GNUNET_YES, LOG2, CadetConnection::mqm_ready, CadetConnection::path, and CadetConnection::state.

Referenced by GCT_debug().

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