GNUnet  0.10.x
Typedefs | Functions
gnunet-service-transport_neighbours.h File Reference

neighbour manipulation API, allows manipulation of performance metrics (delay and towards ATS) More...

#include "gnunet_statistics_service.h"
#include "gnunet_transport_service.h"
#include "gnunet_transport_plugin.h"
#include "gnunet-service-transport.h"
#include "transport.h"
#include "gnunet_util_lib.h"
Include dependency graph for gnunet-service-transport_neighbours.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Typedefs

typedef void(* GST_NeighbourSendContinuation) (void *cls, int success, size_t bytes_payload, size_t bytes_on_wire)
 Function called after the transmission is done. More...
 
typedef void(* GST_NeighbourIterator) (void *cls, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_HELLO_Address *address, enum GNUNET_TRANSPORT_PeerState state, struct GNUNET_TIME_Absolute state_timeout, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out)
 Function called for each neighbour. More...
 

Functions

void GST_neighbours_start (unsigned int max_fds)
 Initialize the neighbours subsystem. More...
 
void GST_neighbours_stop (void)
 Cleanup the neighbours subsystem. More...
 
int GST_neighbours_test_connected (const struct GNUNET_PeerIdentity *target)
 Test if we're connected to the given peer. More...
 
void GST_neighbours_send (const struct GNUNET_PeerIdentity *target, const void *msg, size_t msg_size, struct GNUNET_TIME_Relative timeout, GST_NeighbourSendContinuation cont, void *cont_cls)
 Transmit a message to the given target using the active connection. More...
 
struct GNUNET_TIME_Relative GST_neighbours_calculate_receive_delay (const struct GNUNET_PeerIdentity *sender, ssize_t size, int *do_forward)
 We have received a message from the given sender. More...
 
void GST_neighbours_keepalive (const struct GNUNET_PeerIdentity *neighbour, const struct GNUNET_MessageHeader *m)
 Keep the connection to the given neighbour alive longer, we received a KEEPALIVE (or equivalent); send a response. More...
 
void GST_neighbours_keepalive_response (const struct GNUNET_PeerIdentity *neighbour, const struct GNUNET_MessageHeader *m)
 We received a KEEP_ALIVE_RESPONSE message and use this to calculate latency to this peer. More...
 
void GST_neighbours_force_disconnect (const struct GNUNET_PeerIdentity *target)
 If we have an active connection to the given target, it must be shutdown. More...
 
void GST_neighbours_iterate (GST_NeighbourIterator cb, void *cb_cls)
 Iterate over all connected neighbours. More...
 
int GST_neighbours_session_terminated (const struct GNUNET_PeerIdentity *peer, struct GNUNET_ATS_Session *session)
 A session was terminated. More...
 
void GST_neighbours_notify_data_recv (const struct GNUNET_HELLO_Address *address, const struct GNUNET_MessageHeader *message)
 Track information about data we received from the given address (used to notify ATS about our utilization of allocated resources). More...
 
void GST_neighbours_notify_data_sent (const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session, size_t size)
 Track information about data we transmitted using the given address and session (used to notify ATS about our utilization of allocated resources). More...
 
void GST_neighbours_switch_to_address (const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out)
 For an existing neighbour record, set the active connection to use the given address. More...
 
int GST_neighbours_handle_session_syn (const struct GNUNET_MessageHeader *message, const struct GNUNET_PeerIdentity *peer)
 We received a 'SESSION_CONNECT' message from the other peer. More...
 
int GST_neighbours_handle_session_syn_ack (const struct GNUNET_MessageHeader *message, const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
 We received a 'SESSION_CONNECT_ACK' message from the other peer. More...
 
int GST_neighbours_handle_session_ack (const struct GNUNET_MessageHeader *message, const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
 We received a 'SESSION_ACK' message from the other peer. More...
 
const struct GNUNET_HELLO_AddressGST_neighbour_get_current_address (const struct GNUNET_PeerIdentity *peer)
 Obtain current address information for the given neighbour. More...
 
void GST_neighbours_handle_quota_message (const struct GNUNET_PeerIdentity *peer, const struct GNUNET_MessageHeader *msg)
 We received a quoat message from the given peer, validate and process. More...
 
void GST_neighbours_handle_disconnect_message (const struct GNUNET_PeerIdentity *peer, const struct GNUNET_MessageHeader *msg)
 We received a disconnect message from the given peer, validate and process. More...
 

Detailed Description

neighbour manipulation API, allows manipulation of performance metrics (delay and towards ATS)

neighbour management API

Author
Christian Grothoff

Definition in file gnunet-service-transport_neighbours.h.

Typedef Documentation

◆ GST_NeighbourSendContinuation

typedef void(* GST_NeighbourSendContinuation) (void *cls, int success, size_t bytes_payload, size_t bytes_on_wire)

Function called after the transmission is done.

Parameters
clsclosure
successGNUNET_OK on success, GNUNET_NO on failure, GNUNET_SYSERR if we're not connected
bytes_payloadhow much payload was transmitted
bytes_on_wirehow many bytes were used on the wire

Definition at line 72 of file gnunet-service-transport_neighbours.h.

◆ GST_NeighbourIterator

typedef void(* GST_NeighbourIterator) (void *cls, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_HELLO_Address *address, enum GNUNET_TRANSPORT_PeerState state, struct GNUNET_TIME_Absolute state_timeout, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out)

Function called for each neighbour.

Parameters
clsclosure
peeridentity of the neighbour
addressthe address of the neighbour
statecurrent state the peer is in
state_timeouttimeout for this state
bandwidth_ininbound quota in NBO
bandwidth_outoutbound quota in NBO

Definition at line 159 of file gnunet-service-transport_neighbours.h.

Function Documentation

◆ GST_neighbours_start()

void GST_neighbours_start ( unsigned int  max_fds)

Initialize the neighbours subsystem.

Parameters
max_fdsmaximum number of fds to use

Definition at line 3828 of file gnunet-service-transport_neighbours.c.

References GNUNET_CONTAINER_multipeermap_create(), GNUNET_NO, GNUNET_SCHEDULER_add_delayed(), NEIGHBOUR_TABLE_SIZE, UTIL_TRANSMISSION_INTERVAL, and utilization_transmission().

Referenced by run().

3829 {
3830  (void)max_fds;
3832  GNUNET_NO);
3835  NULL);
3836 }
static struct GNUNET_CONTAINER_MultiPeerMap * neighbours
Hash map from peer identities to the respective struct NeighbourMapEntry.
#define GNUNET_NO
Definition: gnunet_common.h:78
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).
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1237
#define UTIL_TRANSMISSION_INTERVAL
Interval to send utilization data.
static struct GNUNET_SCHEDULER_Task * util_transmission_tk
Task transmitting utilization data.
#define NEIGHBOUR_TABLE_SIZE
Size of the neighbour hash map.
static void utilization_transmission(void *cls)
Task transmitting utilization in a regular interval.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_stop()

void GST_neighbours_stop ( void  )

Cleanup the neighbours subsystem.

Definition at line 3868 of file gnunet-service-transport_neighbours.c.

References disconnect_all_neighbours(), GNUNET_CONTAINER_multipeermap_destroy(), GNUNET_CONTAINER_multipeermap_iterate(), and GNUNET_SCHEDULER_cancel().

Referenced by shutdown_task().

3869 {
3870  if (NULL == neighbours)
3871  return;
3872  if (NULL != util_transmission_tk)
3873  {
3875  util_transmission_tk = NULL;
3876  }
3879  NULL);
3881  neighbours = NULL;
3882 }
static struct GNUNET_CONTAINER_MultiPeerMap * neighbours
Hash map from peer identities to the respective struct NeighbourMapEntry.
void GNUNET_CONTAINER_multipeermap_destroy(struct GNUNET_CONTAINER_MultiPeerMap *map)
Destroy a hash map.
static struct GNUNET_SCHEDULER_Task * util_transmission_tk
Task transmitting utilization data.
int GNUNET_CONTAINER_multipeermap_iterate(struct GNUNET_CONTAINER_MultiPeerMap *map, GNUNET_CONTAINER_PeerMapIterator it, void *it_cls)
Iterate over all entries in the map.
static int disconnect_all_neighbours(void *cls, const struct GNUNET_PeerIdentity *key, void *value)
Disconnect from the given neighbour.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:956
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_test_connected()

int GST_neighbours_test_connected ( const struct GNUNET_PeerIdentity target)

Test if we're connected to the given peer.

Parameters
targetpeer to test
Returns
GNUNET_YES if we are connected, GNUNET_NO if not

Definition at line 3549 of file gnunet-service-transport_neighbours.c.

References lookup_neighbour(), and test_connected().

Referenced by handle_client_send(), notify_client_about_neighbour(), process_payload(), send_delayed(), and transmit_our_hello().

3550 {
3551  return test_connected(lookup_neighbour(target));
3552 }
static int test_connected(struct NeighbourMapEntry *n)
Test if we're connected to the given peer.
static struct NeighbourMapEntry * lookup_neighbour(const struct GNUNET_PeerIdentity *pid)
Lookup a neighbour entry in the neighbours hash map.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_send()

void GST_neighbours_send ( const struct GNUNET_PeerIdentity target,
const void *  msg,
size_t  msg_size,
struct GNUNET_TIME_Relative  timeout,
GST_NeighbourSendContinuation  cont,
void *  cont_cls 
)

Transmit a message to the given target using the active connection.

Parameters
targetdestination
msgmessage to send
msg_sizenumber of bytes in msg
timeoutwhen to fail with timeout
contfunction to call when done
cont_clsclosure for cont
targetdestination
msgmessage to send
msg_sizenumber of bytes in msg
timeoutwhen to fail with timeout
contfunction to call when done
cont_clsclosure for cont

Definition at line 1748 of file gnunet-service-transport_neighbours.c.

References bytes_in_send_queue, MessageQueue::cont, MessageQueue::cont_cls, gettext_noop, GNUNET_break, GNUNET_CONTAINER_DLL_insert_tail, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_malloc, GNUNET_memcpy, GNUNET_NO, GNUNET_SCHEDULER_add_now(), GNUNET_SCHEDULER_cancel(), GNUNET_STATISTICS_set(), GNUNET_SYSERR, GNUNET_TIME_relative_to_absolute(), GNUNET_YES, GST_stats, lookup_neighbour(), master_task(), MessageQueue::message_buf, MessageQueue::message_buf_size, NeighbourMapEntry::messages_head, NeighbourMapEntry::messages_tail, mq, NeighbourMapEntry::task, test_connected(), and MessageQueue::timeout.

Referenced by GST_manipulation_send(), send_delayed(), and transmit_our_hello().

1754 {
1755  struct NeighbourMapEntry *n;
1756  struct MessageQueue *mq;
1757 
1758  /* All ove these cases should never happen; they are all API violations.
1759  But we check anyway, just to be sure. */
1760  if (NULL == (n = lookup_neighbour(target)))
1761  {
1762  GNUNET_break(0);
1763  if (NULL != cont)
1764  cont(cont_cls,
1765  GNUNET_SYSERR,
1766  msg_size,
1767  0);
1768  return;
1769  }
1770  if (GNUNET_YES != test_connected(n))
1771  {
1772  GNUNET_break(0);
1773  if (NULL != cont)
1774  cont(cont_cls,
1775  GNUNET_SYSERR,
1776  msg_size,
1777  0);
1778  return;
1779  }
1780  bytes_in_send_queue += msg_size;
1782  gettext_noop
1783  ("# bytes in message queue for other peers"),
1785  mq = GNUNET_malloc(sizeof(struct MessageQueue) + msg_size);
1786  mq->cont = cont;
1787  mq->cont_cls = cont_cls;
1788  GNUNET_memcpy(&mq[1], msg, msg_size);
1789  mq->message_buf = (const char *)&mq[1];
1790  mq->message_buf_size = msg_size;
1792 
1794  "Enqueueing %u bytes to send to peer %s\n",
1795  (unsigned int)msg_size,
1796  GNUNET_i2s(target));
1798  n->messages_tail,
1799  mq);
1800  if (NULL != n->task)
1803 }
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
struct GNUNET_TIME_Absolute GNUNET_TIME_relative_to_absolute(struct GNUNET_TIME_Relative rel)
Convert relative time to an absolute time in the future.
Definition: time.c:246
struct GNUNET_TIME_Absolute timeout
At what time should we fail?
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct MessageQueue * messages_tail
Tail of list of messages we would like to send to this peer; must contain at most one message per cli...
static struct GNUNET_STATISTICS_Handle * GST_stats
Statistics handle.
static int test_connected(struct NeighbourMapEntry *n)
Test if we're connected to the given peer.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1264
void * cont_cls
Closure for cont.
For each neighbour we keep a list of messages that we still want to transmit to the neighbour...
struct MessageQueue * messages_head
Head of list of messages we would like to send to this peer; must contain at most one message per cli...
struct GNUNET_SCHEDULER_Task * task
Main task that drives this peer (timeouts, keepalives, etc.).
void GNUNET_STATISTICS_set(struct GNUNET_STATISTICS_Handle *handle, const char *name, uint64_t value, int make_persistent)
Set statistic value for the peer.
static struct NeighbourMapEntry * lookup_neighbour(const struct GNUNET_PeerIdentity *pid)
Lookup a neighbour entry in the neighbours hash map.
static unsigned long long bytes_in_send_queue
Number of bytes we have currently queued for transmission.
const char * message_buf
The message(s) we want to transmit, GNUNET_MessageHeader(s) stuck together in memory.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
GST_NeighbourSendContinuation cont
Function to call once we're done.
struct GNUNET_MQ_Handle * mq
Definition: 003.c:5
#define GNUNET_log(kind,...)
#define GNUNET_YES
Definition: gnunet_common.h:77
static void master_task(void *cls)
Master task run for every neighbour.
size_t message_buf_size
Size of the message buf.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define GNUNET_malloc(size)
Wrapper around malloc.
#define gettext_noop(String)
Definition: gettext.h:69
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:956
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_calculate_receive_delay()

struct GNUNET_TIME_Relative GST_neighbours_calculate_receive_delay ( const struct GNUNET_PeerIdentity sender,
ssize_t  size,
int *  do_forward 
)

We have received a message from the given sender.

How long should we delay before receiving more? (Also used to keep the peer marked as live).

Parameters
sendersender of the message
sizesize of the message
do_forwardset to GNUNET_YES if the message should be forwarded to clients GNUNET_NO if the neighbour is not connected or violates the quota
Returns
how long to wait before reading more from this sender

How long should we delay before receiving more? (Also used to keep the peer marked as live).

Parameters
sendersender of the message
sizesize of the message
do_forwardset to GNUNET_YES if the message should be forwarded to clients GNUNET_NO if the neighbour is not connected or violates the quota, GNUNET_SYSERR if the connection is not fully up yet
Returns
how long to wait before reading more from this sender

Definition at line 1665 of file gnunet-service-transport_neighbours.c.

References GNUNET_BANDWIDTH_Tracker::available_bytes_per_s__, GNUNET_BANDWIDTH_Tracker::consumption_since_last_update__, gettext_noop, GNUNET_BANDWIDTH_tracker_consume(), GNUNET_BANDWIDTH_tracker_get_delay(), GNUNET_CONSTANTS_QUOTA_VIOLATION_TIMEOUT, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_NO, GNUNET_STATISTICS_update(), GNUNET_STRINGS_relative_time_to_string(), GNUNET_SYSERR, GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_TIME_UNIT_ZERO, GNUNET_YES, GST_stats, NeighbourMapEntry::in_tracker, lookup_neighbour(), NeighbourMapEntry::quota_violation_count, QUOTA_VIOLATION_DROP_THRESHOLD, GNUNET_TIME_Relative::rel_value_us, ret, size, and test_connected().

Referenced by inbound_bw_tracker_update(), and process_payload().

1668 {
1669  struct NeighbourMapEntry *n;
1670  struct GNUNET_TIME_Relative ret;
1671 
1672  if (NULL == neighbours)
1673  {
1674  *do_forward = GNUNET_NO;
1675  return GNUNET_TIME_UNIT_FOREVER_REL; /* This can happen during shutdown */
1676  }
1677  if (NULL == (n = lookup_neighbour(sender)))
1678  {
1680  gettext_noop("# messages discarded due to lack of neighbour record"),
1681  1,
1682  GNUNET_NO);
1683  *do_forward = GNUNET_NO;
1684  return GNUNET_TIME_UNIT_ZERO;
1685  }
1686  if (!test_connected(n))
1687  {
1688  *do_forward = GNUNET_SYSERR;
1689  return GNUNET_TIME_UNIT_ZERO;
1690  }
1692  {
1693  n->quota_violation_count++;
1695  "Bandwidth quota (%u b/s) violation detected (total of %u).\n",
1698  /* Discount 32k per violation */
1700  }
1701  else
1702  {
1703  if (n->quota_violation_count > 0)
1704  {
1705  /* try to add 32k back */
1707  n->quota_violation_count--;
1708  }
1709  }
1711  {
1713  gettext_noop
1714  ("# bandwidth quota violations by other peers"),
1715  1, GNUNET_NO);
1716  *do_forward = GNUNET_NO;
1718  }
1719  *do_forward = GNUNET_YES;
1721  if (ret.rel_value_us > 0)
1722  {
1724  "Throttling read (%lld bytes excess at %u b/s), waiting %s before reading more.\n",
1726  (unsigned int)n->in_tracker.available_bytes_per_s__,
1729  gettext_noop("# ms throttling suggested"),
1730  (int64_t)ret.rel_value_us / 1000LL,
1731  GNUNET_NO);
1732  }
1733  return ret;
1734 }
static struct GNUNET_CONTAINER_MultiPeerMap * neighbours
Hash map from peer identities to the respective struct NeighbourMapEntry.
int GNUNET_BANDWIDTH_tracker_consume(struct GNUNET_BANDWIDTH_Tracker *av, ssize_t size)
Notify the tracker that a certain number of bytes of bandwidth have been consumed.
Definition: bandwidth.c:402
unsigned int quota_violation_count
How often has the other peer (recently) violated the inbound traffic limit? Incremented by 10 per vio...
struct GNUNET_BANDWIDTH_Tracker in_tracker
Tracker for inbound bandwidth.
#define GNUNET_NO
Definition: gnunet_common.h:78
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
static int ret
Final status code.
Definition: gnunet-arm.c:89
static struct GNUNET_STATISTICS_Handle * GST_stats
Statistics handle.
int64_t consumption_since_last_update__
Number of bytes consumed since we last updated the tracker.
static int test_connected(struct NeighbourMapEntry *n)
Test if we're connected to the given peer.
const char * GNUNET_STRINGS_relative_time_to_string(struct GNUNET_TIME_Relative delta, int do_round)
Give relative time in human-readable fancy format.
Definition: strings.c:686
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
#define GNUNET_CONSTANTS_QUOTA_VIOLATION_TIMEOUT
How long do we delay reading more from a peer after a quota violation?
static struct NeighbourMapEntry * lookup_neighbour(const struct GNUNET_PeerIdentity *pid)
Lookup a neighbour entry in the neighbours hash map.
struct GNUNET_TIME_Relative GNUNET_BANDWIDTH_tracker_get_delay(struct GNUNET_BANDWIDTH_Tracker *av, size_t size)
Compute how long we should wait until consuming size bytes of bandwidth in order to stay within the g...
Definition: bandwidth.c:458
#define QUOTA_VIOLATION_DROP_THRESHOLD
How often must a peer violate bandwidth quotas before we start to simply drop its messages...
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
static unsigned int size
Size of the "table".
Definition: peer.c:66
#define GNUNET_TIME_UNIT_ZERO
Relative time zero.
uint32_t available_bytes_per_s__
Bandwidth limit to enforce in bytes per second.
#define GNUNET_log(kind,...)
#define GNUNET_YES
Definition: gnunet_common.h:77
Time for relative time used by GNUnet, in microseconds.
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_keepalive()

void GST_neighbours_keepalive ( const struct GNUNET_PeerIdentity neighbour,
const struct GNUNET_MessageHeader m 
)

Keep the connection to the given neighbour alive longer, we received a KEEPALIVE (or equivalent); send a response.

Parameters
neighbourneighbour to keep alive (by sending keep alive response)
mthe keep alive message containing the nonce to respond to

Definition at line 1495 of file gnunet-service-transport_neighbours.c.

References gettext_noop, GNUNET_break_op, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_KEEPALIVE_RESPONSE, GNUNET_NO, GNUNET_STATISTICS_update(), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, GST_stats, GNUNET_ATS_SessionKeepAliveMessage::header, NeighbourMapEntry::id, lookup_neighbour(), GNUNET_ATS_SessionKeepAliveMessage::nonce, NeighbourMapEntry::primary_address, send_with_session(), NeighbourAddress::session, GNUNET_MessageHeader::size, and GNUNET_MessageHeader::type.

Referenced by GST_receive_callback().

1497 {
1498  struct NeighbourMapEntry *n;
1499  const struct GNUNET_ATS_SessionKeepAliveMessage *msg_in;
1501 
1502  if (sizeof(struct GNUNET_ATS_SessionKeepAliveMessage) != ntohs(m->size))
1503  {
1504  GNUNET_break_op(0);
1505  return;
1506  }
1507 
1508  msg_in = (const struct GNUNET_ATS_SessionKeepAliveMessage *)m;
1509  if (NULL == (n = lookup_neighbour(neighbour)))
1510  {
1512  gettext_noop
1513  ("# KEEPALIVE messages discarded (peer unknown)"),
1514  1, GNUNET_NO);
1515  return;
1516  }
1517  if (NULL == n->primary_address.session)
1518  {
1520  gettext_noop
1521  ("# KEEPALIVE messages discarded (no session)"),
1522  1, GNUNET_NO);
1523  return;
1524  }
1525 
1527  "Received KEEPALIVE request from peer `%s' with nonce %u\n",
1528  GNUNET_i2s(&n->id),
1529  ntohl(msg_in->nonce));
1531  gettext_noop("# KEEPALIVES received in good order"),
1532  1,
1533  GNUNET_NO);
1534 
1535  /* send reply to allow neighbour to measure latency */
1536  msg.header.size = htons(sizeof(struct GNUNET_ATS_SessionKeepAliveMessage));
1538  msg.nonce = msg_in->nonce;
1539  (void)send_with_session(n,
1540  &msg,
1541  sizeof(struct GNUNET_ATS_SessionKeepAliveMessage),
1542  UINT32_MAX /* priority */,
1544  GNUNET_YES,
1545  NULL, NULL);
1546 }
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
#define GNUNET_NO
Definition: gnunet_common.h:78
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
#define GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_KEEPALIVE_RESPONSE
Response to a GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_KEEPALIVE message to measure latency in a regular...
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
static struct GNUNET_STATISTICS_Handle * GST_stats
Statistics handle.
struct NeighbourAddress primary_address
Primary address we currently use to communicate with the neighbour.
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
struct GNUNET_PeerIdentity id
Identity of this neighbour.
struct GNUNET_ATS_Session * session
Active session for this address.
static struct NeighbourMapEntry * lookup_neighbour(const struct GNUNET_PeerIdentity *pid)
Lookup a neighbour entry in the neighbours hash map.
Message a peer sends to another when connected to indicate that a session is in use and the peer is s...
#define GNUNET_log(kind,...)
#define GNUNET_YES
Definition: gnunet_common.h:77
static struct GNUNET_TIME_Relative send_with_session(struct NeighbourMapEntry *n, const void *msgbuf, size_t msgbuf_size, uint32_t priority, struct GNUNET_TIME_Relative timeout, unsigned int use_keepalive_timeout, GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls)
Transmit a message using the current session of the given neighbour.
uint32_t nonce
A nonce to identify the session the keep alive is used for.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_keepalive_response()

void GST_neighbours_keepalive_response ( const struct GNUNET_PeerIdentity neighbour,
const struct GNUNET_MessageHeader m 
)

We received a KEEP_ALIVE_RESPONSE message and use this to calculate latency to this peer.

Pass the updated information (existing ats plus calculated latency) to ATS.

Parameters
neighbourneighbour to keep alive
mthe message containing the keep alive response

Definition at line 1558 of file gnunet-service-transport_neighbours.c.

References NeighbourAddress::address, GNUNET_TRANSPORT_PluginFunctions::cls, NeighbourMapEntry::expect_latency_response, gettext_noop, GNUNET_break, GNUNET_break_op, GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_NO, GNUNET_STATISTICS_update(), GNUNET_STRINGS_relative_time_to_string(), GNUNET_TIME_absolute_get_duration(), GNUNET_TIME_relative_divide(), GNUNET_TIME_relative_to_absolute(), GNUNET_TRANSPORT_PS_CONNECTED, GNUNET_YES, GST_ats_update_delay(), GST_plugins_find(), GST_stats, NeighbourMapEntry::id, NeighbourAddress::keep_alive_nonce, NeighbourMapEntry::last_keep_alive_time, lookup_neighbour(), msg, GNUNET_ATS_SessionKeepAliveMessage::nonce, NeighbourMapEntry::primary_address, NeighbourAddress::session, set_state_and_timeout(), GNUNET_MessageHeader::size, NeighbourMapEntry::state, GNUNET_HELLO_Address::transport_name, and GNUNET_TRANSPORT_PluginFunctions::update_session_timeout.

Referenced by GST_receive_callback().

1560 {
1561  struct NeighbourMapEntry *n;
1563  struct GNUNET_TRANSPORT_PluginFunctions *papi;
1564  struct GNUNET_TIME_Relative latency;
1565 
1566  if (sizeof(struct GNUNET_ATS_SessionKeepAliveMessage) != ntohs(m->size))
1567  {
1568  GNUNET_break_op(0);
1569  return;
1570  }
1571 
1572  msg = (const struct GNUNET_ATS_SessionKeepAliveMessage *)m;
1573  if (NULL == (n = lookup_neighbour(neighbour)))
1574  {
1576  gettext_noop("# KEEPALIVE_RESPONSEs discarded (not connected)"),
1577  1,
1578  GNUNET_NO);
1579  return;
1580  }
1581  if ((GNUNET_TRANSPORT_PS_CONNECTED != n->state) ||
1583  {
1585  gettext_noop("# KEEPALIVE_RESPONSEs discarded (not expected)"),
1586  1,
1587  GNUNET_NO);
1588  return;
1589  }
1590  if (NULL == n->primary_address.address)
1591  {
1593  gettext_noop("# KEEPALIVE_RESPONSEs discarded (address changed)"),
1594  1,
1595  GNUNET_NO);
1596  return;
1597  }
1598  if (n->primary_address.keep_alive_nonce != ntohl(msg->nonce))
1599  {
1600  if (0 == n->primary_address.keep_alive_nonce)
1602  gettext_noop("# KEEPALIVE_RESPONSEs discarded (no nonce)"),
1603  1,
1604  GNUNET_NO);
1605  else
1607  gettext_noop("# KEEPALIVE_RESPONSEs discarded (bad nonce)"),
1608  1,
1609  GNUNET_NO);
1610  return;
1611  }
1613  gettext_noop("# KEEPALIVE_RESPONSEs received (OK)"),
1614  1,
1615  GNUNET_NO);
1616 
1617 
1618  /* Update session timeout here */
1619  if (NULL != (papi = GST_plugins_find(n->primary_address.address->transport_name)))
1620  {
1622  "Updating session for peer `%s' for session %p\n",
1623  GNUNET_i2s(&n->id),
1625  papi->update_session_timeout(papi->cls,
1626  &n->id,
1628  }
1629  else
1630  {
1631  GNUNET_break(0);
1632  }
1633 
1637  n->state,
1639 
1642  "Received KEEPALIVE_RESPONSE from peer `%s', latency is %s\n",
1643  GNUNET_i2s(&n->id),
1645  GNUNET_YES));
1648  2));
1649 }
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
struct GNUNET_TIME_Absolute GNUNET_TIME_relative_to_absolute(struct GNUNET_TIME_Relative rel)
Convert relative time to an absolute time in the future.
Definition: time.c:246
Each plugin is required to return a pointer to a struct of this type as the return value from its ent...
#define GNUNET_NO
Definition: gnunet_common.h:78
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
GNUNET_TRANSPORT_UpdateSessionTimeout update_session_timeout
Function that will be called whenever the transport service wants to notify the plugin that a session...
struct GNUNET_TIME_Absolute last_keep_alive_time
At what time did we sent the last keep-alive message? Used to calculate round-trip time ("latency")...
static struct GNUNET_STATISTICS_Handle * GST_stats
Statistics handle.
void * cls
Closure for all of the callbacks.
struct NeighbourAddress primary_address
Primary address we currently use to communicate with the neighbour.
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
const char * GNUNET_STRINGS_relative_time_to_string(struct GNUNET_TIME_Relative delta, int do_round)
Give relative time in human-readable fancy format.
Definition: strings.c:686
const char * transport_name
Name of the transport plugin enabling the communication using this address.
struct GNUNET_PeerIdentity id
Identity of this neighbour.
struct GNUNET_ATS_Session * session
Active session for this address.
struct GNUNET_TRANSPORT_PluginFunctions * GST_plugins_find(const char *name)
Obtain the plugin API based on a plugin name.
static struct NeighbourMapEntry * lookup_neighbour(const struct GNUNET_PeerIdentity *pid)
Lookup a neighbour entry in the neighbours hash map.
struct GNUNET_HELLO_Address * address
Network-level address information.
Message a peer sends to another when connected to indicate that a session is in use and the peer is s...
enum GNUNET_TRANSPORT_PeerState state
The current state of the peer.
static void set_state_and_timeout(struct NeighbourMapEntry *n, enum GNUNET_TRANSPORT_PeerState s, struct GNUNET_TIME_Absolute timeout)
Set net state and state timeout for this neighbour and notify monitoring.
#define GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT
After how long do we consider a connection to a peer dead if we don't receive messages from the peer...
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_duration(struct GNUNET_TIME_Absolute whence)
Get the duration of an operation as the difference of the current time and the given start time "henc...
Definition: time.c:373
int expect_latency_response
Did we sent an KEEP_ALIVE message and are we expecting a response?
void GST_ats_update_delay(const struct GNUNET_HELLO_Address *address, struct GNUNET_TIME_Relative delay)
Notify ATS about delay changes to properties of an address.
#define GNUNET_log(kind,...)
struct GNUNET_TIME_Relative GNUNET_TIME_relative_divide(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Divide relative time by a given factor.
Definition: time.c:525
#define GNUNET_YES
Definition: gnunet_common.h:77
Got our SYN_ACK/ACK, connection is up.
uint32_t keep_alive_nonce
The current nonce sent in the last keep alive messages.
uint32_t nonce
A nonce to identify the session the keep alive is used for.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
Time for relative time used by GNUnet, in microseconds.
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_force_disconnect()

void GST_neighbours_force_disconnect ( const struct GNUNET_PeerIdentity target)

If we have an active connection to the given target, it must be shutdown.

Parameters
targetpeer to disconnect from

Definition at line 3786 of file gnunet-service-transport_neighbours.c.

References disconnect_neighbour(), gettext_noop, GNUNET_ERROR_TYPE_INFO, GNUNET_i2s(), GNUNET_log, GNUNET_NO, GNUNET_STATISTICS_update(), GNUNET_YES, GST_stats, lookup_neighbour(), and test_connected().

Referenced by ats_request_address_change(), and confirm_or_drop_neighbour().

3787 {
3788  struct NeighbourMapEntry *n;
3789 
3790  if (NULL == (n = lookup_neighbour(target)))
3791  return; /* not active */
3792  if (GNUNET_YES == test_connected(n))
3794  gettext_noop("# disconnected from peer upon explicit request"),
3795  1,
3796  GNUNET_NO);
3798  "Forced disconnect from peer %s\n",
3799  GNUNET_i2s(target));
3801 }
#define GNUNET_NO
Definition: gnunet_common.h:78
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
static struct GNUNET_STATISTICS_Handle * GST_stats
Statistics handle.
static int test_connected(struct NeighbourMapEntry *n)
Test if we're connected to the given peer.
static struct NeighbourMapEntry * lookup_neighbour(const struct GNUNET_PeerIdentity *pid)
Lookup a neighbour entry in the neighbours hash map.
static void disconnect_neighbour(struct NeighbourMapEntry *n)
Disconnect from the given neighbour, clean up the record.
#define GNUNET_log(kind,...)
#define GNUNET_YES
Definition: gnunet_common.h:77
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_iterate()

void GST_neighbours_iterate ( GST_NeighbourIterator  cb,
void *  cb_cls 
)

Iterate over all connected neighbours.

Parameters
cbfunction to call
cb_clsclosure for cb

Definition at line 3765 of file gnunet-service-transport_neighbours.c.

References IteratorContext::cb, IteratorContext::cb_cls, GNUNET_CONTAINER_multipeermap_iterate(), and neighbours_iterate().

Referenced by handle_client_blacklist_init(), handle_client_monitor_peers(), handle_client_start(), and process_hello_update().

3767 {
3768  struct IteratorContext ic;
3769 
3770  if (NULL == neighbours)
3771  return; /* can happen during shutdown */
3772  ic.cb = cb;
3773  ic.cb_cls = cb_cls;
3776  &ic);
3777 }
static struct GNUNET_CONTAINER_MultiPeerMap * neighbours
Hash map from peer identities to the respective struct NeighbourMapEntry.
Closure for the neighbours_iterate() function.
GST_NeighbourIterator cb
Function to call on each connected neighbour.
int GNUNET_CONTAINER_multipeermap_iterate(struct GNUNET_CONTAINER_MultiPeerMap *map, GNUNET_CONTAINER_PeerMapIterator it, void *it_cls)
Iterate over all entries in the map.
static int neighbours_iterate(void *cls, const struct GNUNET_PeerIdentity *key, void *value)
Call the callback from the closure for each neighbour.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_session_terminated()

int GST_neighbours_session_terminated ( const struct GNUNET_PeerIdentity peer,
struct GNUNET_ATS_Session session 
)

A session was terminated.

Take note.

Parameters
peeridentity of the peer where the session died
sessionsession that is gone
Returns
GNUNET_YES if this was a session used, GNUNET_NO if this session was not in use

Take note; if needed, try to get an alternative address from ATS.

Parameters
peeridentity of the peer where the session died
sessionsession that is gone
Returns
GNUNET_YES if this was a session used, GNUNET_NO if this session was not in use

Definition at line 3314 of file gnunet-service-transport_neighbours.c.

References NeighbourAddress::address, NeighbourMapEntry::alternative_address, ATS_RESPONSE_TIMEOUT, NeighbourMapEntry::expect_latency_response, FAST_RECONNECT_TIMEOUT, free_address(), free_neighbour(), GNUNET_assert, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_i2s(), GNUNET_log, GNUNET_NO, GNUNET_SCHEDULER_add_now(), GNUNET_SCHEDULER_cancel(), GNUNET_TIME_relative_to_absolute(), GNUNET_TRANSPORT_ps2s(), GNUNET_TRANSPORT_PS_CONNECTED, GNUNET_TRANSPORT_PS_DISCONNECT, GNUNET_TRANSPORT_PS_DISCONNECT_FINISHED, GNUNET_TRANSPORT_PS_INIT_ATS, GNUNET_TRANSPORT_PS_NOT_CONNECTED, GNUNET_TRANSPORT_PS_RECONNECT_ATS, GNUNET_TRANSPORT_PS_RECONNECT_SENT, GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT, GNUNET_TRANSPORT_PS_SYN_RECV_ACK, GNUNET_TRANSPORT_PS_SYN_RECV_ATS, GNUNET_TRANSPORT_PS_SYN_SENT, GNUNET_YES, GST_ats_is_known(), GST_plugins_a2s(), lookup_neighbour(), master_task(), NeighbourMapEntry::primary_address, NeighbourAddress::session, set_state_and_timeout(), NeighbourMapEntry::state, NeighbourMapEntry::task, NeighbourMapEntry::timeout, and unset_primary_address().

Referenced by plugin_env_session_end().

3316 {
3317  struct NeighbourMapEntry *n;
3318 
3319  if (NULL == (n = lookup_neighbour(peer)))
3320  return GNUNET_NO; /* can't affect us */
3321  if (session != n->primary_address.session)
3322  {
3323  /* Free alternative address */
3324  if (session == n->alternative_address.session)
3325  {
3329  n->timeout);
3331  "Session died, cleaning up alternative address\n");
3333  }
3334  return GNUNET_NO; /* doesn't affect us further */
3335  }
3336 
3338  /* The session for neighbour's primary address died */
3339  switch (n->state)
3340  {
3342  GNUNET_break(0);
3343  free_neighbour(n);
3344  return GNUNET_YES;
3345 
3347  GNUNET_break(0);
3348  free_neighbour(n);
3349  return GNUNET_YES;
3350 
3352  /* The session used to send the SYN terminated:
3353  * this implies a connect error*/
3355  "Failed to send SYN in CONNECT_SENT with `%s' %p: session terminated\n",
3358 
3359  /* Destroy the address since it cannot be used */
3364  break;
3365 
3368  /* error on inbound session; free neighbour entirely */
3369  free_neighbour(n);
3370  return GNUNET_YES;
3371 
3373  /* Our primary connection died, try a fast reconnect */
3378  break;
3379 
3381  /* we don't have an address, how can it go down? */
3382  GNUNET_break(0);
3383  break;
3384 
3387  "Failed to send SYN in RECONNECT_SENT with `%s' %p: session terminated\n",
3390  /* Destroy the address since it cannot be used */
3395  break;
3396 
3398  /* primary went down while we were waiting for SYN_ACK on secondary;
3399  secondary as primary */
3400 
3402  "Connection `%s' %p to peer `%s' was terminated while switching, "
3403  "switching to alternative address `%s' %p\n",
3406  GNUNET_i2s(peer),
3409 
3410  /* Destroy the inbound address since it cannot be used */
3415  n->primary_address.session));
3416  memset(&n->alternative_address,
3417  0,
3418  sizeof(struct NeighbourAddress));
3422  break;
3423 
3426  break;
3427 
3429  /* neighbour was freed and plugins told to terminate session */
3430  return GNUNET_NO;
3431 
3432  default:
3434  "Unhandled state `%s'\n",
3436  GNUNET_break(0);
3437  break;
3438  }
3439  if (NULL != n->task)
3442  return GNUNET_YES;
3443 }
Connection got into trouble, rest of the system still believes it to be up, but we're getting a new a...
We have some primary connection, but ATS suggested we switch to some alternative; we now sent a SYN m...
Sent SYN over new address (either by ATS telling us to switch addresses or from RECONNECT_ATS); if th...
int GST_ats_is_known(const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
Test if ATS knows about this address and session.
struct NeighbourAddress alternative_address
Alternative address currently under consideration for communicating with the neighbour.
We're finished with the disconnect; and are cleaning up the state now! We put the struct into this st...
struct GNUNET_TIME_Absolute GNUNET_TIME_relative_to_absolute(struct GNUNET_TIME_Relative rel)
Convert relative time to an absolute time in the future.
Definition: time.c:246
struct GNUNET_TIME_Absolute timeout
Time where we should cut the connection (timeout) if we don't make progress in the state machine (or ...
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_NO
Definition: gnunet_common.h:78
Received a SYN, asking ATS about address suggestions.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static void free_neighbour(struct NeighbourMapEntry *n)
Free a neighbour map entry.
Fresh peer or completely disconnected.
struct NeighbourAddress primary_address
Primary address we currently use to communicate with the neighbour.
A possible address we could use to communicate with a neighbour.
#define FAST_RECONNECT_TIMEOUT
How long are we willing to wait for a successful reconnect if an existing connection went down...
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1264
struct GNUNET_ATS_Session * session
Active session for this address.
Asked to initiate connection, trying to get address from ATS.
const char * GST_plugins_a2s(const struct GNUNET_HELLO_Address *address)
Convert a given address to a human-readable format.
struct GNUNET_SCHEDULER_Task * task
Main task that drives this peer (timeouts, keepalives, etc.).
static struct NeighbourMapEntry * lookup_neighbour(const struct GNUNET_PeerIdentity *pid)
Lookup a neighbour entry in the neighbours hash map.
const char * GNUNET_TRANSPORT_ps2s(enum GNUNET_TRANSPORT_PeerState state)
Convert a transport state to a human readable string.
struct GNUNET_HELLO_Address * address
Network-level address information.
Sent SYN message to other peer, waiting for SYN_ACK.
enum GNUNET_TRANSPORT_PeerState state
The current state of the peer.
static void set_state_and_timeout(struct NeighbourMapEntry *n, enum GNUNET_TRANSPORT_PeerState s, struct GNUNET_TIME_Absolute timeout)
Set net state and state timeout for this neighbour and notify monitoring.
static void free_address(struct NeighbourAddress *na)
We don't need a given neighbour address any more.
int expect_latency_response
Did we sent an KEEP_ALIVE message and are we expecting a response?
static void unset_primary_address(struct NeighbourMapEntry *n)
Clear the primary address of a neighbour since this address is not valid anymore and notify monitorin...
Disconnect in progress (we're sending the DISCONNECT message to the other peer; after that is finishe...
#define ATS_RESPONSE_TIMEOUT
How long are we willing to wait for a response from ATS before timing out?
#define GNUNET_log(kind,...)
#define GNUNET_YES
Definition: gnunet_common.h:77
Got our SYN_ACK/ACK, connection is up.
static void master_task(void *cls)
Master task run for every neighbour.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
SYN request from other peer was SYN_ACK'ed, waiting for ACK.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:956
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_notify_data_recv()

void GST_neighbours_notify_data_recv ( const struct GNUNET_HELLO_Address address,
const struct GNUNET_MessageHeader message 
)

Track information about data we received from the given address (used to notify ATS about our utilization of allocated resources).

Parameters
addressthe address we got data from
messagethe message we received (really only the size is used)

Definition at line 2923 of file gnunet-service-transport_neighbours.c.

References lookup_neighbour(), GNUNET_HELLO_Address::peer, GNUNET_MessageHeader::size, and NeighbourMapEntry::util_total_bytes_recv.

Referenced by GST_receive_callback().

2925 {
2926  struct NeighbourMapEntry *n;
2927 
2928  n = lookup_neighbour(&address->peer);
2929  if (NULL == n)
2930  return;
2931  n->util_total_bytes_recv += ntohs(message->size);
2932 }
uint32_t util_total_bytes_recv
Tracking utilization of inbound bandwidth.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
static struct NeighbourMapEntry * lookup_neighbour(const struct GNUNET_PeerIdentity *pid)
Lookup a neighbour entry in the neighbours hash map.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_notify_data_sent()

void GST_neighbours_notify_data_sent ( const struct GNUNET_HELLO_Address address,
struct GNUNET_ATS_Session session,
size_t  size 
)

Track information about data we transmitted using the given address and session (used to notify ATS about our utilization of allocated resources).

Parameters
addressthe address we transmitted data to
sessionsession we used to transmit data
messagethe message we sent (really only the size is used)

Definition at line 2945 of file gnunet-service-transport_neighbours.c.

References lookup_neighbour(), GNUNET_HELLO_Address::peer, NeighbourMapEntry::primary_address, NeighbourAddress::session, size, and NeighbourMapEntry::util_total_bytes_sent.

Referenced by GST_validation_handle_ping(), multicast_pong(), send_syn(), send_with_session(), and transmit_ping_if_allowed().

2948 {
2949  struct NeighbourMapEntry *n;
2950 
2951  n = lookup_neighbour(&address->peer);
2952  if (NULL == n)
2953  return;
2954  if (n->primary_address.session != session)
2955  return;
2957 }
struct NeighbourAddress primary_address
Primary address we currently use to communicate with the neighbour.
uint32_t util_total_bytes_sent
Tracking utilization of outbound bandwidth.
struct GNUNET_ATS_Session * session
Active session for this address.
static struct NeighbourMapEntry * lookup_neighbour(const struct GNUNET_PeerIdentity *pid)
Lookup a neighbour entry in the neighbours hash map.
static unsigned int size
Size of the "table".
Definition: peer.c:66
struct GNUNET_PeerIdentity peer
For which peer is this an address?
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_switch_to_address()

void GST_neighbours_switch_to_address ( const struct GNUNET_HELLO_Address address,
struct GNUNET_ATS_Session session,
struct GNUNET_BANDWIDTH_Value32NBO  bandwidth_in,
struct GNUNET_BANDWIDTH_Value32NBO  bandwidth_out 
)

For an existing neighbour record, set the active connection to use the given address.

Parameters
addressaddress of the other peer to start using
sessionsession to use (or NULL)
bandwidth_ininbound quota to be used when connection is up
bandwidth_outoutbound quota to be used when connection is up

For an existing neighbour record, set the active connection to use the given address.

Before accepting this addresses and actively using it, a blacklist check is performed.

If any check fails or the suggestion can somehow not be followed, we MUST call GST_ats_block_address() to tell ATS that the suggestion could not be satisfied and force ATS to do something else.

Parameters
addressaddress of the other peer,
sessionsession to use or NULL if transport should initiate a session
bandwidth_ininbound quota to be used when connection is up, 0 to disconnect from peer
bandwidth_outoutbound quota to be used when connection is up, 0 to disconnect from peer

Definition at line 2785 of file gnunet-service-transport_neighbours.c.

References BlacklistCheckSwitchContext::bandwidth_in, BlacklistCheckSwitchContext::bandwidth_out, BlacklistCheckSwitchContext::blc, GNUNET_assert, GNUNET_break, GNUNET_CONTAINER_DLL_insert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_HELLO_address_check_option(), GNUNET_HELLO_ADDRESS_INFO_INBOUND, GNUNET_i2s(), GNUNET_log, GNUNET_new, GNUNET_OK, GST_ats_block_address(), GST_blacklist_test_allowed(), GST_plugins_a2s(), GST_plugins_find(), GNUNET_HELLO_Address::peer, switch_address_bl_check_cont(), GNUNET_HELLO_Address::transport_name, try_run_fast_ats_update(), and GNUNET_BANDWIDTH_Value32NBO::value__.

Referenced by ats_request_address_change().

2789 {
2790  struct GST_BlacklistCheck *blc;
2791  struct BlacklistCheckSwitchContext *blc_ctx;
2792 
2793  GNUNET_assert(NULL != address->transport_name);
2794  if (GNUNET_OK ==
2795  try_run_fast_ats_update(address,
2796  session,
2797  bandwidth_in,
2798  bandwidth_out))
2799  return;
2800 
2801  /* Check if plugin is available */
2802  if (NULL == (GST_plugins_find(address->transport_name)))
2803  {
2804  /* we don't have the plugin for this address */
2805  GNUNET_break(0);
2806  GST_ats_block_address(address,
2807  session);
2808  return;
2809  }
2810  if ((NULL == session) &&
2813  {
2814  /* This is a inbound address and we do not have a session to use! */
2815  GNUNET_break(0);
2816  GST_ats_block_address(address,
2817  session);
2818  return;
2819  }
2820 
2822  "ATS suggests address '%s' for peer `%s' at %u/%u speed\n",
2823  GST_plugins_a2s(address),
2824  GNUNET_i2s(&address->peer),
2825  (unsigned int)ntohl(bandwidth_in.value__),
2826  (unsigned int)ntohl(bandwidth_out.value__));
2827 
2828  /* Perform blacklist check */
2829  blc_ctx = GNUNET_new(struct BlacklistCheckSwitchContext);
2830  blc_ctx->bandwidth_in = bandwidth_in;
2831  blc_ctx->bandwidth_out = bandwidth_out;
2834  blc_ctx);
2835  if (NULL != (blc = GST_blacklist_test_allowed(&address->peer,
2836  address->transport_name,
2838  blc_ctx,
2839  address,
2840  session)))
2841  {
2842  blc_ctx->blc = blc;
2843  }
2844 }
Context we use when performing a blacklist check.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
struct GST_BlacklistCheck * GST_blacklist_test_allowed(const struct GNUNET_PeerIdentity *peer, const char *transport_name, GST_BlacklistTestContinuation cont, void *cont_cls, const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
Test if a peer/transport combination is blacklisted.
struct GST_BlacklistCheck * blc
Handle to the blacklist check we are performing.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in
Inbound bandwidth that was assigned to address.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_new(type)
Allocate a struct or union of the given type.
Entry in a DLL we use to keep track of pending blacklist checks.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
uint32_t value__
The actual value (bytes per second).
int GNUNET_HELLO_address_check_option(const struct GNUNET_HELLO_Address *address, enum GNUNET_HELLO_AddressInfo option)
Check if an address has a local option set.
Definition: address.c:39
This is an inbound address and cannot be used to initiate an outbound connection to another peer...
const char * transport_name
Name of the transport plugin enabling the communication using this address.
static struct BlacklistCheckSwitchContext * pending_bc_tail
List of pending blacklist checks: tail.
const char * GST_plugins_a2s(const struct GNUNET_HELLO_Address *address)
Convert a given address to a human-readable format.
struct GNUNET_TRANSPORT_PluginFunctions * GST_plugins_find(const char *name)
Obtain the plugin API based on a plugin name.
struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out
Outbound bandwidth that was assigned to address.
static void switch_address_bl_check_cont(void *cls, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session, int result)
We've been asked to switch addresses, and just now got the result from the blacklist check to see if ...
struct GNUNET_PeerIdentity peer
For which peer is this an address?
static struct BlacklistCheckSwitchContext * pending_bc_head
List of pending blacklist checks: head.
#define GNUNET_log(kind,...)
static int try_run_fast_ats_update(const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out)
Check if the given address is the same that we are already using for the respective neighbour...
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
void GST_ats_block_address(const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
Temporarily block a valid address for use by ATS for address suggestions.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_handle_session_syn()

int GST_neighbours_handle_session_syn ( const struct GNUNET_MessageHeader message,
const struct GNUNET_PeerIdentity peer 
)

We received a 'SESSION_CONNECT' message from the other peer.

Consider switching to it.

Parameters
messagepossibly a 'struct GNUNET_ATS_SessionConnectMessage' (check format)
peeridentity of the peer to switch the address for
Returns
GNUNET_OK if the message was fine, GNUNET_SYSERR on serious error

We received a 'SESSION_CONNECT' message from the other peer.

Consider switching to it.

Parameters
messagepossibly a struct TransportSynMessage (check format)
peeridentity of the peer to switch the address for
Returns
GNUNET_OK if the message was fine, GNUNET_SYSERR on serious error

Definition at line 2253 of file gnunet-service-transport_neighbours.c.

References _, ACK_SEND_ACK, ACK_SEND_SYN_ACK, NeighbourMapEntry::ack_state, NeighbourAddress::address, ATS_RESPONSE_TIMEOUT, NeighbourMapEntry::connect_ack_timestamp, free_neighbour(), gettext_noop, GNUNET_assert, GNUNET_break, GNUNET_break_op, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_i2s(), GNUNET_log, GNUNET_NO, GNUNET_OK, GNUNET_STATISTICS_update(), GNUNET_SYSERR, GNUNET_TIME_absolute_ntoh(), GNUNET_TIME_relative_to_absolute(), GNUNET_TRANSPORT_ps2s(), GNUNET_TRANSPORT_PS_CONNECTED, GNUNET_TRANSPORT_PS_DISCONNECT, GNUNET_TRANSPORT_PS_DISCONNECT_FINISHED, GNUNET_TRANSPORT_PS_INIT_ATS, GNUNET_TRANSPORT_PS_NOT_CONNECTED, GNUNET_TRANSPORT_PS_RECONNECT_ATS, GNUNET_TRANSPORT_PS_RECONNECT_SENT, GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT, GNUNET_TRANSPORT_PS_SYN_RECV_ACK, GNUNET_TRANSPORT_PS_SYN_RECV_ATS, GNUNET_TRANSPORT_PS_SYN_SENT, GST_my_identity, GST_stats, lookup_neighbour(), NeighbourMapEntry::primary_address, print_ack_state(), TransportSynMessage::reserved, send_syn_ack_message(), NeighbourAddress::session, set_state_and_timeout(), setup_neighbour(), GNUNET_MessageHeader::size, NeighbourMapEntry::state, and TransportSynMessage::timestamp.

Referenced by connect_bl_check_cont().

2255 {
2256  const struct TransportSynMessage *scm;
2257  struct NeighbourMapEntry *n;
2258  struct GNUNET_TIME_Absolute ts;
2259 
2260  if (ntohs(message->size) != sizeof(struct TransportSynMessage))
2261  {
2262  GNUNET_break_op(0);
2263  return GNUNET_SYSERR;
2264  }
2266  gettext_noop
2267  ("# SYN messages received"),
2268  1, GNUNET_NO);
2269  if (NULL == neighbours)
2270  {
2272  _("SYN request from peer `%s' ignored due impending shutdown\n"),
2273  GNUNET_i2s(peer));
2274  return GNUNET_OK; /* we're shutting down */
2275  }
2276  scm = (const struct TransportSynMessage *)message;
2277  GNUNET_break_op(0 == ntohl(scm->reserved));
2279  if (0 ==
2280  memcmp(&GST_my_identity,
2281  peer,
2282  sizeof(struct GNUNET_PeerIdentity)))
2283  {
2284  /* loopback connection-to-self, ignore */
2285  return GNUNET_SYSERR;
2286  }
2287  n = lookup_neighbour(peer);
2288  if (NULL == n)
2289  {
2290  /* This is a new neighbour and set to not connected */
2291  n = setup_neighbour(peer);
2292  GNUNET_assert(NULL != n);
2293  }
2294 
2295  /* Remember this SYN message in neighbour */
2297  n->connect_ack_timestamp = ts;
2298 
2300  "Received SYN for peer `%s' in state %s/%s\n",
2301  GNUNET_i2s(peer),
2304 
2305  switch (n->state)
2306  {
2308  /* Request an address from ATS to send SYN_ACK to this peer */
2312  break;
2313 
2315  /* SYN message takes priority over us asking ATS for address:
2316  * Wait for ATS to suggest an address and send SYN_ACK */
2320  break;
2321 
2323  /* We already wait for an address to send an SYN_ACK */
2324  break;
2325 
2328  /* Send ACK immediately */
2329  n->ack_state = ACK_SEND_ACK;
2331  ts);
2332  break;
2333 
2335  /* we are already connected and can thus send the ACK immediately */
2338  n->ack_state = ACK_SEND_ACK;
2340  ts);
2341  break;
2342 
2344  /* We wait for ATS address suggestion */
2345  break;
2346 
2348  /* We received a SYN message while waiting for a SYN_ACK in fast
2349  * reconnect. Send SYN_ACK immediately */
2350  n->ack_state = ACK_SEND_ACK;
2353  break;
2354 
2356  /* We are already connected and can thus send the ACK immediately;
2357  still, it can never hurt to have an alternative address, so also
2358  tell ATS about it */
2361  n->ack_state = ACK_SEND_ACK;
2363  ts);
2364  break;
2365 
2367  /* Get rid of remains and re-try */
2368  free_neighbour(n);
2369  n = setup_neighbour(peer);
2370  GNUNET_assert(NULL != n);
2371  /* Remember the SYN time stamp for ACK message */
2373  n->connect_ack_timestamp = ts;
2374  /* Request an address for the peer */
2378  break;
2379 
2381  /* should not be possible */
2382  GNUNET_assert(0);
2383  break;
2384 
2385  default:
2387  "Unhandled state `%s'\n",
2389  GNUNET_break(0);
2390  return GNUNET_SYSERR;
2391  }
2392  return GNUNET_OK;
2393 }
static struct GNUNET_PeerIdentity GST_my_identity
Our public key.
static struct GNUNET_CONTAINER_MultiPeerMap * neighbours
Hash map from peer identities to the respective struct NeighbourMapEntry.
Connection got into trouble, rest of the system still believes it to be up, but we're getting a new a...
We have some primary connection, but ATS suggested we switch to some alternative; we now sent a SYN m...
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:671
Sent SYN over new address (either by ATS telling us to switch addresses or from RECONNECT_ATS); if th...
We're finished with the disconnect; and are cleaning up the state now! We put the struct into this st...
struct GNUNET_TIME_AbsoluteNBO timestamp
Absolute time at the sender.
struct GNUNET_TIME_Absolute GNUNET_TIME_relative_to_absolute(struct GNUNET_TIME_Relative rel)
Convert relative time to an absolute time in the future.
Definition: time.c:246
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_TIME_Absolute connect_ack_timestamp
Timestamp we should include in our next SYN_ACK message.
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
Received a SYN, asking ATS about address suggestions.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
static char * print_ack_state(enum GST_ACK_State s)
Convert the given ACK state to a string.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
Message a peer sends to another to indicate that it intends to setup a connection/session for data ex...
static void free_neighbour(struct NeighbourMapEntry *n)
Free a neighbour map entry.
Fresh peer or completely disconnected.
static struct GNUNET_STATISTICS_Handle * GST_stats
Statistics handle.
struct NeighbourAddress primary_address
Primary address we currently use to communicate with the neighbour.
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
struct GNUNET_ATS_Session * session
Active session for this address.
Asked to initiate connection, trying to get address from ATS.
static struct NeighbourMapEntry * lookup_neighbour(const struct GNUNET_PeerIdentity *pid)
Lookup a neighbour entry in the neighbours hash map.
const char * GNUNET_TRANSPORT_ps2s(enum GNUNET_TRANSPORT_PeerState state)
Convert a transport state to a human readable string.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
struct GNUNET_HELLO_Address * address
Network-level address information.
Sent SYN message to other peer, waiting for SYN_ACK.
enum GNUNET_TRANSPORT_PeerState state
The current state of the peer.
static void set_state_and_timeout(struct NeighbourMapEntry *n, enum GNUNET_TRANSPORT_PeerState s, struct GNUNET_TIME_Absolute timeout)
Set net state and state timeout for this neighbour and notify monitoring.
The neighbour sent a SYN_ACK message and has to send a ACK as reply.
The identity of the host (wraps the signing key of the peer).
static void send_syn_ack_message(struct NeighbourAddress *na, struct GNUNET_TIME_Absolute timestamp)
Send a SYN_ACK message via the given address.
Disconnect in progress (we're sending the DISCONNECT message to the other peer; after that is finishe...
#define ATS_RESPONSE_TIMEOUT
How long are we willing to wait for a response from ATS before timing out?
#define GNUNET_log(kind,...)
enum GST_ACK_State ack_state
When a peer wants to connect we have to reply to the 1st SYN message with a SYN_ACK message...
static struct NeighbourMapEntry * setup_neighbour(const struct GNUNET_PeerIdentity *peer)
Create a fresh entry in the neighbour map for the given peer.
Time for absolute times used by GNUnet, in microseconds.
The neighbour received a SYN message and has to send a SYN_ACK as reply.
Got our SYN_ACK/ACK, connection is up.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
SYN request from other peer was SYN_ACK'ed, waiting for ACK.
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_handle_session_syn_ack()

int GST_neighbours_handle_session_syn_ack ( const struct GNUNET_MessageHeader message,
const struct GNUNET_HELLO_Address address,
struct GNUNET_ATS_Session session 
)

We received a 'SESSION_CONNECT_ACK' message from the other peer.

Consider switching to it.

Parameters
messagepossibly a struct GNUNET_ATS_SessionConnectMessage (check format)
addressaddress of the other peer
sessionsession to use (or NULL)
Returns
GNUNET_OK if the message was fine, GNUNET_SYSERR on serious error

We received a 'SESSION_CONNECT_ACK' message from the other peer.

Consider switching to it.

Parameters
messagepossibly a struct GNUNET_ATS_SessionConnectMessage (check format)
peeridentity of the peer to switch the address for
addressaddress of the other peer, NULL if other peer connected to us
sessionsession to use (or NULL)
Returns
GNUNET_OK if the message was fine, GNUNET_SYSERR on serious error

Definition at line 3161 of file gnunet-service-transport_neighbours.c.

References GNUNET_TIME_Absolute::abs_value_us, NeighbourMapEntry::ack_state, NeighbourAddress::address, NeighbourMapEntry::alternative_address, NeighbourAddress::ats_active, NeighbourAddress::bandwidth_in, NeighbourAddress::bandwidth_out, NeighbourAddress::connect_timestamp, free_neighbour(), gettext_noop, GNUNET_assert, GNUNET_break, GNUNET_break_op, GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_HELLO_address_free, GNUNET_i2s(), GNUNET_log, GNUNET_NO, GNUNET_OK, GNUNET_STATISTICS_update(), GNUNET_SYSERR, GNUNET_TIME_absolute_ntoh(), GNUNET_TIME_relative_to_absolute(), GNUNET_TRANSPORT_ps2s(), GNUNET_TRANSPORT_PS_CONNECTED, GNUNET_TRANSPORT_PS_DISCONNECT, GNUNET_TRANSPORT_PS_DISCONNECT_FINISHED, GNUNET_TRANSPORT_PS_INIT_ATS, GNUNET_TRANSPORT_PS_NOT_CONNECTED, GNUNET_TRANSPORT_PS_RECONNECT_ATS, GNUNET_TRANSPORT_PS_RECONNECT_SENT, GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT, GNUNET_TRANSPORT_PS_SYN_RECV_ACK, GNUNET_TRANSPORT_PS_SYN_RECV_ATS, GNUNET_TRANSPORT_PS_SYN_SENT, GST_stats, lookup_neighbour(), GNUNET_HELLO_Address::peer, NeighbourMapEntry::primary_address, print_ack_state(), TransportSynMessage::reserved, send_session_ack_message(), NeighbourAddress::session, set_primary_address(), set_state_and_timeout(), GNUNET_MessageHeader::size, NeighbourMapEntry::state, and TransportSynMessage::timestamp.

Referenced by GST_receive_callback().

3164 {
3165  const struct TransportSynMessage *scm;
3166  struct GNUNET_TIME_Absolute ts;
3167  struct NeighbourMapEntry *n;
3168 
3169  (void)session;
3170  if (ntohs(message->size) != sizeof(struct TransportSynMessage))
3171  {
3172  GNUNET_break_op(0);
3173  return GNUNET_SYSERR;
3174  }
3176  gettext_noop
3177  ("# SYN_ACK messages received"),
3178  1, GNUNET_NO);
3179  scm = (const struct TransportSynMessage *)message;
3180  GNUNET_break_op(ntohl(scm->reserved) == 0);
3181  if (NULL == (n = lookup_neighbour(&address->peer)))
3182  {
3184  gettext_noop
3185  ("# unexpected SYN_ACK messages (no peer)"),
3186  1, GNUNET_NO);
3187  return GNUNET_SYSERR;
3188  }
3190  "Received SYN_ACK message from peer `%s' in state %s/%s\n",
3191  GNUNET_i2s(&address->peer),
3195  switch (n->state)
3196  {
3198  GNUNET_break(0);
3199  free_neighbour(n);
3200  return GNUNET_SYSERR;
3201 
3204  gettext_noop("# unexpected SYN_ACK messages (not ready)"),
3205  1,
3206  GNUNET_NO);
3207  break;
3208 
3210  if (ts.abs_value_us != n->primary_address.connect_timestamp.abs_value_us)
3211  {
3213  "SYN_ACK ignored as the timestamp does not match our SYN request\n");
3214  return GNUNET_OK;
3215  }
3225  break;
3226 
3230  gettext_noop("# unexpected SYN_ACK messages (not ready)"),
3231  1,
3232  GNUNET_NO);
3233  break;
3234 
3236  /* duplicate SYN_ACK, let's answer by duplicate ACK just in case */
3238  break;
3239 
3241  /* we didn't expect any SYN_ACK, as we are waiting for ATS
3242  to give us a new address... */
3244  gettext_noop("# unexpected SYN_ACK messages (waiting on ATS)"),
3245  1,
3246  GNUNET_NO);
3247  break;
3248 
3250  /* Reconnecting with new address address worked; go back to connected! */
3255  break;
3256 
3258  /* new address worked; adopt it and go back to connected! */
3263 
3264  /* Set primary addresses */
3271  gettext_noop("# Successful attempts to switch addresses"),
3272  1,
3273  GNUNET_NO);
3274 
3276  memset(&n->alternative_address,
3277  0,
3278  sizeof(n->alternative_address));
3280  break;
3281 
3284  gettext_noop
3285  ("# unexpected SYN_ACK messages (disconnecting)"),
3286  1, GNUNET_NO);
3287  return GNUNET_SYSERR;
3288 
3290  GNUNET_assert(0);
3291  break;
3292 
3293  default:
3295  "Unhandled state `%s'\n",
3297  GNUNET_break(0);
3298  return GNUNET_SYSERR;
3299  }
3300  return GNUNET_OK;
3301 }
Connection got into trouble, rest of the system still believes it to be up, but we're getting a new a...
We have some primary connection, but ATS suggested we switch to some alternative; we now sent a SYN m...
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:671
Sent SYN over new address (either by ATS telling us to switch addresses or from RECONNECT_ATS); if th...
struct NeighbourAddress alternative_address
Alternative address currently under consideration for communicating with the neighbour.
We're finished with the disconnect; and are cleaning up the state now! We put the struct into this st...
struct GNUNET_TIME_AbsoluteNBO timestamp
Absolute time at the sender.
struct GNUNET_TIME_Absolute GNUNET_TIME_relative_to_absolute(struct GNUNET_TIME_Relative rel)
Convert relative time to an absolute time in the future.
Definition: time.c:246
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
Received a SYN, asking ATS about address suggestions.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
static char * print_ack_state(enum GST_ACK_State s)
Convert the given ACK state to a string.
uint64_t abs_value_us
The actual value.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
Message a peer sends to another to indicate that it intends to setup a connection/session for data ex...
static void free_neighbour(struct NeighbourMapEntry *n)
Free a neighbour map entry.
Fresh peer or completely disconnected.
static struct GNUNET_STATISTICS_Handle * GST_stats
Statistics handle.
struct NeighbourAddress primary_address
Primary address we currently use to communicate with the neighbour.
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
struct GNUNET_TIME_Absolute connect_timestamp
Timestamp of the 'SESSION_CONNECT' message we sent to the other peer for this address.
struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in
Inbound bandwidth from ATS for this address.
struct GNUNET_ATS_Session * session
Active session for this address.
Asked to initiate connection, trying to get address from ATS.
int ats_active
Did we tell ATS that this is our 'active' address?
static struct NeighbourMapEntry * lookup_neighbour(const struct GNUNET_PeerIdentity *pid)
Lookup a neighbour entry in the neighbours hash map.
const char * GNUNET_TRANSPORT_ps2s(enum GNUNET_TRANSPORT_PeerState state)
Convert a transport state to a human readable string.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
struct GNUNET_HELLO_Address * address
Network-level address information.
Sent SYN message to other peer, waiting for SYN_ACK.
static void set_primary_address(struct NeighbourMapEntry *n, const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out)
Initialize the primary address of a neighbour.
static void send_session_ack_message(struct NeighbourMapEntry *n)
Send a ACK message to the neighbour to confirm that we got its SYN_ACK.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
enum GNUNET_TRANSPORT_PeerState state
The current state of the peer.
static void set_state_and_timeout(struct NeighbourMapEntry *n, enum GNUNET_TRANSPORT_PeerState s, struct GNUNET_TIME_Absolute timeout)
Set net state and state timeout for this neighbour and notify monitoring.
#define GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT
After how long do we consider a connection to a peer dead if we don't receive messages from the peer...
struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out
Outbound bandwidth from ATS for this address.
Disconnect in progress (we're sending the DISCONNECT message to the other peer; after that is finishe...
#define GNUNET_log(kind,...)
enum GST_ACK_State ack_state
When a peer wants to connect we have to reply to the 1st SYN message with a SYN_ACK message...
Time for absolute times used by GNUnet, in microseconds.
Got our SYN_ACK/ACK, connection is up.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
SYN request from other peer was SYN_ACK'ed, waiting for ACK.
#define GNUNET_HELLO_address_free(addr)
Free an address.
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_handle_session_ack()

int GST_neighbours_handle_session_ack ( const struct GNUNET_MessageHeader message,
const struct GNUNET_HELLO_Address address,
struct GNUNET_ATS_Session session 
)

We received a 'SESSION_ACK' message from the other peer.

If we sent a 'CONNECT_ACK' last, this means we are now connected. Otherwise, do nothing.

Parameters
messagepossibly a 'struct GNUNET_ATS_SessionConnectMessage' (check format)
addressaddress of the other peer
sessionsession to use (or NULL)
Returns
GNUNET_OK if the message was fine, GNUNET_SYSERR on serious error

We received a 'SESSION_ACK' message from the other peer.

If we sent a 'SYN_ACK' last, this means we are now connected. Otherwise, do nothing.

Parameters
messagepossibly a 'struct GNUNET_ATS_SessionConnectMessage' (check format)
addressaddress of the other peer
sessionsession to use (or NULL)
Returns
GNUNET_OK if the message was fine, GNUNET_SYSERR on serious error

Definition at line 3457 of file gnunet-service-transport_neighbours.c.

References ACK_SEND_ACK, NeighbourMapEntry::ack_state, NeighbourAddress::address, gettext_noop, GNUNET_break, GNUNET_break_op, GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_i2s(), GNUNET_log, GNUNET_NO, GNUNET_OK, GNUNET_STATISTICS_update(), GNUNET_SYSERR, GNUNET_TIME_relative_to_absolute(), GNUNET_TRANSPORT_ps2s(), GNUNET_TRANSPORT_PS_CONNECTED, GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT, GNUNET_TRANSPORT_PS_SYN_RECV_ACK, GST_ats_block_reset(), GST_stats, lookup_neighbour(), GNUNET_HELLO_Address::peer, NeighbourMapEntry::primary_address, print_ack_state(), NeighbourAddress::session, set_state_and_timeout(), GNUNET_MessageHeader::size, and NeighbourMapEntry::state.

Referenced by GST_receive_callback().

3460 {
3461  struct NeighbourMapEntry *n;
3462 
3463  (void)session;
3464  if (ntohs(message->size) != sizeof(struct GNUNET_MessageHeader))
3465  {
3466  GNUNET_break_op(0);
3467  return GNUNET_SYSERR;
3468  }
3470  gettext_noop("# ACK messages received"),
3471  1,
3472  GNUNET_NO);
3473  if (NULL == (n = lookup_neighbour(&address->peer)))
3474  {
3475  GNUNET_break_op(0);
3476  return GNUNET_SYSERR;
3477  }
3479  "Received ACK for peer `%s' in state %s/%s\n",
3480  GNUNET_i2s(&address->peer),
3483 
3484  /* Check if we are in a plausible state for having sent
3485  a SYN_ACK. If not, return, otherwise break.
3486 
3487  The remote peers sends a ACK as a response for a SYN_ACK
3488  message.
3489 
3490  We expect a ACK:
3491  - If a remote peer has sent a SYN, we responded with a SYN_ACK and
3492  now wait for the ACK to finally be connected
3493  - If we sent a SYN_ACK to this peer before */
3494 
3495  if (((GNUNET_TRANSPORT_PS_SYN_RECV_ACK != n->state) &&
3496  (ACK_SEND_ACK != n->ack_state)) ||
3497  (NULL == n->primary_address.address))
3498  {
3500  "Received unexpected ACK message from peer `%s' in state %s/%s\n",
3501  GNUNET_i2s(&address->peer),
3504 
3506  gettext_noop("# unexpected ACK messages"),
3507  1,
3508  GNUNET_NO);
3509  return GNUNET_OK;
3510  }
3512  {
3513  /* We tried to switch addresses while being connect. We explicitly wait
3514  * for a SYN_ACK before going to GNUNET_TRANSPORT_PS_CONNECTED,
3515  * so we do not want to set the address as in use! */
3516  return GNUNET_OK;
3517  }
3521 
3522  if (NULL == n->primary_address.address)
3523  {
3524  /* See issue #3693.
3525  * We are in state = PSY_SYN_RECV_ACK or ack_state = ACK_SEND_ACK, which
3526  * really means we did try (and succeed) to send a SYN and are waiting for
3527  * an ACK.
3528  * That suggests that the primary_address used to be non-NULL, but maybe it
3529  * got reset to NULL without the state being changed appropriately?
3530  */
3531  GNUNET_break(0);
3532  return GNUNET_OK;
3533  }
3534 
3535  /* Reset backoff for primary address */
3538  return GNUNET_OK;
3539 }
We have some primary connection, but ATS suggested we switch to some alternative; we now sent a SYN m...
struct GNUNET_TIME_Absolute GNUNET_TIME_relative_to_absolute(struct GNUNET_TIME_Relative rel)
Convert relative time to an absolute time in the future.
Definition: time.c:246
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
static char * print_ack_state(enum GST_ACK_State s)
Convert the given ACK state to a string.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static struct GNUNET_STATISTICS_Handle * GST_stats
Statistics handle.
struct NeighbourAddress primary_address
Primary address we currently use to communicate with the neighbour.
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
struct GNUNET_ATS_Session * session
Active session for this address.
static struct NeighbourMapEntry * lookup_neighbour(const struct GNUNET_PeerIdentity *pid)
Lookup a neighbour entry in the neighbours hash map.
const char * GNUNET_TRANSPORT_ps2s(enum GNUNET_TRANSPORT_PeerState state)
Convert a transport state to a human readable string.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
struct GNUNET_HELLO_Address * address
Network-level address information.
struct GNUNET_PeerIdentity peer
For which peer is this an address?
enum GNUNET_TRANSPORT_PeerState state
The current state of the peer.
static void set_state_and_timeout(struct NeighbourMapEntry *n, enum GNUNET_TRANSPORT_PeerState s, struct GNUNET_TIME_Absolute timeout)
Set net state and state timeout for this neighbour and notify monitoring.
#define GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT
After how long do we consider a connection to a peer dead if we don't receive messages from the peer...
The neighbour sent a SYN_ACK message and has to send a ACK as reply.
void GST_ats_block_reset(const struct GNUNET_HELLO_Address *address, struct GNUNET_ATS_Session *session)
Reset address blocking time.
#define GNUNET_log(kind,...)
enum GST_ACK_State ack_state
When a peer wants to connect we have to reply to the 1st SYN message with a SYN_ACK message...
Header for all communications.
Got our SYN_ACK/ACK, connection is up.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
SYN request from other peer was SYN_ACK'ed, waiting for ACK.
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbour_get_current_address()

const struct GNUNET_HELLO_Address* GST_neighbour_get_current_address ( const struct GNUNET_PeerIdentity peer)

Obtain current address information for the given neighbour.

Parameters
peer
Returns
address currently used

Definition at line 3811 of file gnunet-service-transport_neighbours.c.

References NeighbourAddress::address, lookup_neighbour(), and NeighbourMapEntry::primary_address.

Referenced by handle_send_transmit_continuation().

3812 {
3813  struct NeighbourMapEntry *n;
3814 
3815  n = lookup_neighbour(peer);
3816  if (NULL == n)
3817  return NULL;
3818  return n->primary_address.address;
3819 }
struct NeighbourAddress primary_address
Primary address we currently use to communicate with the neighbour.
static struct NeighbourMapEntry * lookup_neighbour(const struct GNUNET_PeerIdentity *pid)
Lookup a neighbour entry in the neighbours hash map.
struct GNUNET_HELLO_Address * address
Network-level address information.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_handle_quota_message()

void GST_neighbours_handle_quota_message ( const struct GNUNET_PeerIdentity peer,
const struct GNUNET_MessageHeader msg 
)

We received a quoat message from the given peer, validate and process.

Parameters
peersender of the message
msgthe quota message

We received a quoat message from the given peer, validate and process.

Parameters
peersender of the message
msgthe quota message

Definition at line 3581 of file gnunet-service-transport_neighbours.c.

References gettext_noop, GNUNET_BANDWIDTH_value_init(), GNUNET_BANDWIDTH_value_max(), GNUNET_break_op, GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_NO, GNUNET_STATISTICS_update(), GST_stats, lookup_neighbour(), NeighbourMapEntry::neighbour_receive_quota, GNUNET_ATS_SessionQuotaMessage::quota, send_outbound_quota_to_clients(), GNUNET_MessageHeader::size, and GNUNET_BANDWIDTH_Value32NBO::value__.

Referenced by GST_receive_callback().

3583 {
3584  struct NeighbourMapEntry *n;
3585  const struct GNUNET_ATS_SessionQuotaMessage *sqm;
3586  struct GNUNET_BANDWIDTH_Value32NBO last;
3587 
3589  "Received QUOTA message from peer `%s'\n",
3590  GNUNET_i2s(peer));
3591  if (ntohs(msg->size) != sizeof(struct GNUNET_ATS_SessionQuotaMessage))
3592  {
3593  GNUNET_break_op(0);
3595  gettext_noop("# quota messages ignored (malformed)"),
3596  1,
3597  GNUNET_NO);
3598  return;
3599  }
3601  gettext_noop
3602  ("# QUOTA messages received"),
3603  1, GNUNET_NO);
3604  sqm = (const struct GNUNET_ATS_SessionQuotaMessage *)msg;
3605  if (NULL == (n = lookup_neighbour(peer)))
3606  {
3607  /* gone already */
3608  return;
3609  }
3611  GNUNET_BANDWIDTH_value_init(ntohl(sqm->quota)));
3612  if (last.value__ != n->neighbour_receive_quota.value__)
3613  {
3614  n->neighbour_receive_quota = last;
3616  }
3617 }
struct GNUNET_BANDWIDTH_Value32NBO GNUNET_BANDWIDTH_value_max(struct GNUNET_BANDWIDTH_Value32NBO b1, struct GNUNET_BANDWIDTH_Value32NBO b2)
Compute the MAX of two bandwidth values.
Definition: bandwidth.c:72
Message a peer sends to another when connected to indicate that the other peer should limit transmiss...
#define GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT
Bandwidth (in/out) to assume initially (before either peer has communicated any particular preference...
#define GNUNET_NO
Definition: gnunet_common.h:78
uint32_t quota
Quota to use (for sending), in bytes per second.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
uint32_t value__
The actual value (bytes per second).
static struct GNUNET_STATISTICS_Handle * GST_stats
Statistics handle.
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
static struct NeighbourMapEntry * lookup_neighbour(const struct GNUNET_PeerIdentity *pid)
Lookup a neighbour entry in the neighbours hash map.
struct GNUNET_BANDWIDTH_Value32NBO GNUNET_BANDWIDTH_value_init(uint32_t bytes_per_second)
Create a new bandwidth value.
Definition: bandwidth.c:39
32-bit bandwidth used for network exchange by GNUnet, in bytes per second.
#define GNUNET_log(kind,...)
struct GNUNET_BANDWIDTH_Value32NBO neighbour_receive_quota
Latest quota the other peer send us in bytes per second.
static void send_outbound_quota_to_clients(struct NeighbourMapEntry *n)
Send information about a new outbound quota to our clients.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GST_neighbours_handle_disconnect_message()

void GST_neighbours_handle_disconnect_message ( const struct GNUNET_PeerIdentity peer,
const struct GNUNET_MessageHeader msg 
)

We received a disconnect message from the given peer, validate and process.

Parameters
peersender of the message
msgthe disconnect message

Definition at line 3628 of file gnunet-service-transport_neighbours.c.

References GNUNET_TIME_Absolute::abs_value_us, NeighbourMapEntry::connect_ack_timestamp, delayed_disconnect(), NeighbourMapEntry::delayed_disconnect_task, gettext_noop, GNUNET_break_op, GNUNET_CRYPTO_eddsa_verify(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_DISCONNECT, GNUNET_NO, GNUNET_OK, GNUNET_SCHEDULER_add_now(), GNUNET_STATISTICS_update(), GNUNET_TIME_absolute_ntoh(), GST_stats, lookup_neighbour(), GNUNET_ATS_SessionDisconnectMessage::public_key, GNUNET_ATS_SessionDisconnectMessage::purpose, GNUNET_ATS_SessionDisconnectMessage::signature, GNUNET_CRYPTO_EccSignaturePurpose::size, GNUNET_MessageHeader::size, and GNUNET_ATS_SessionDisconnectMessage::timestamp.

Referenced by GST_receive_callback().

3630 {
3631  struct NeighbourMapEntry *n;
3632  const struct GNUNET_ATS_SessionDisconnectMessage *sdm;
3633 
3635  "Received DISCONNECT message from peer `%s'\n",
3636  GNUNET_i2s(peer));
3637  if (ntohs(msg->size) != sizeof(struct GNUNET_ATS_SessionDisconnectMessage))
3638  {
3639  GNUNET_break_op(0);
3641  gettext_noop
3642  ("# disconnect messages ignored (malformed)"),
3643  1,
3644  GNUNET_NO);
3645  return;
3646  }
3648  gettext_noop
3649  ("# DISCONNECT messages received"),
3650  1, GNUNET_NO);
3651  sdm = (const struct GNUNET_ATS_SessionDisconnectMessage *)msg;
3652  if (NULL == (n = lookup_neighbour(peer)))
3653  {
3654  /* gone already */
3655  return;
3656  }
3658  {
3660  gettext_noop("# disconnect messages ignored (timestamp)"),
3661  1,
3662  GNUNET_NO);
3663  return;
3664  }
3665  if (0 != memcmp(peer,
3666  &sdm->public_key,
3667  sizeof(struct GNUNET_PeerIdentity)))
3668  {
3669  GNUNET_break_op(0);
3670  return;
3671  }
3672  if (ntohl(sdm->purpose.size) !=
3673  sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose) +
3674  sizeof(struct GNUNET_CRYPTO_EddsaPublicKey) +
3675  sizeof(struct GNUNET_TIME_AbsoluteNBO))
3676  {
3678  "DISCONNECT message from peer `%s' has invalid size\n",
3679  GNUNET_i2s(peer));
3680  GNUNET_break_op(0);
3681  return;
3682  }
3683  if (GNUNET_OK !=
3685  &sdm->purpose,
3686  &sdm->signature,
3687  &sdm->public_key))
3688  {
3690  "DISCONNECT message from peer `%s' cannot be verified \n",
3691  GNUNET_i2s(peer));
3692  GNUNET_break_op(0);
3693  return;
3694  }
3695  if (NULL == n->delayed_disconnect_task)
3696  {
3698  n);
3699  }
3700 }
struct GNUNET_CRYPTO_EddsaPublicKey public_key
Public key of the sender.
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:671
struct GNUNET_TIME_Absolute connect_ack_timestamp
Timestamp we should include in our next SYN_ACK message.
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
Time for absolute time used by GNUnet, in microseconds and in network byte order. ...
uint64_t abs_value_us
The actual value.
header of what an ECC signature signs this must be followed by "size - 8" bytes of the actual signed ...
static void delayed_disconnect(void *cls)
Task to asynchronously run free_neighbour().
struct GNUNET_TIME_AbsoluteNBO timestamp
Absolute time at the sender.
static struct GNUNET_STATISTICS_Handle * GST_stats
Statistics handle.
int GNUNET_CRYPTO_eddsa_verify(uint32_t purpose, const struct GNUNET_CRYPTO_EccSignaturePurpose *validate, const struct GNUNET_CRYPTO_EddsaSignature *sig, const struct GNUNET_CRYPTO_EddsaPublicKey *pub)
Verify EdDSA signature.
Definition: crypto_ecc.c:1116
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1264
struct GNUNET_CRYPTO_EccSignaturePurpose purpose
Purpose of the signature.
uint32_t size
How many bytes does this signature sign? (including this purpose header); in network byte order (!)...
static struct NeighbourMapEntry * lookup_neighbour(const struct GNUNET_PeerIdentity *pid)
Lookup a neighbour entry in the neighbours hash map.
Message we send to the other peer to notify it that we intentionally are disconnecting (to reduce tim...
#define GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_DISCONNECT
Transport DISCONNECT message exchanged between transport services to indicate that a connection shoul...
struct GNUNET_CRYPTO_EddsaSignature signature
Signature of the peer that sends us the disconnect.
The identity of the host (wraps the signing key of the peer).
struct GNUNET_SCHEDULER_Task * delayed_disconnect_task
Task to disconnect neighbour after we received a DISCONNECT message.
#define GNUNET_log(kind,...)
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define gettext_noop(String)
Definition: gettext.h:69
Public ECC key (always for curve Ed25519) encoded in a format suitable for network transmission and E...
Here is the call graph for this function:
Here is the caller graph for this function: