GNUnet  0.19.4
gnunet-service-core_sessions.h File Reference
Include dependency graph for gnunet-service-core_sessions.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void GSC_SESSIONS_create (const struct GNUNET_PeerIdentity *peer, struct GSC_KeyExchangeInfo *kx)
 Create a session, a key exchange was just completed. More...
 
void GSC_SESSIONS_reinit (const struct GNUNET_PeerIdentity *peer)
 The other peer has indicated that it 'lost' the session (KX down), reinitialize the session on our end, in particular this means to restart the typemap transmission. More...
 
void GSC_SESSIONS_confirm_typemap (const struct GNUNET_PeerIdentity *peer, const struct GNUNET_MessageHeader *msg)
 The other peer has confirmed receiving our type map, check if it is current and if so, stop retransmitting it. More...
 
void GSC_SESSIONS_end (const struct GNUNET_PeerIdentity *pid)
 End the session with the given peer (we are no longer connected). More...
 
void GSC_SESSIONS_solicit (const struct GNUNET_PeerIdentity *pid)
 Traffic is being solicited for the given peer. More...
 
void GSC_SESSIONS_queue_request (struct GSC_ClientActiveRequest *car)
 Queue a request from a client for transmission to a particular peer. More...
 
void GSC_SESSIONS_dequeue_request (struct GSC_ClientActiveRequest *car)
 Dequeue a request from a client from transmission to a particular peer. More...
 
void GSC_SESSIONS_transmit (struct GSC_ClientActiveRequest *car, const struct GNUNET_MessageHeader *msg, enum GNUNET_MQ_PriorityPreferences priority)
 Transmit a message to a particular peer. More...
 
void GSC_SESSIONS_broadcast_typemap (const struct GNUNET_MessageHeader *msg)
 Broadcast an updated typemap message to all neighbours. More...
 
void GSC_SESSIONS_notify_client_about_sessions (struct GSC_Client *client)
 We have a new client, notify it about all current sessions. More...
 
void GSC_SESSIONS_set_typemap (const struct GNUNET_PeerIdentity *peer, const struct GNUNET_MessageHeader *msg)
 We've received a typemap message from a peer, update ours. More...
 
void GSC_SESSIONS_add_to_typemap (const struct GNUNET_PeerIdentity *peer, uint16_t type)
 The given peer send a message of the specified type. More...
 
void GSC_SESSIONS_init (void)
 Initialize sessions subsystem. More...
 
void GSC_SESSIONS_done (void)
 Shutdown sessions subsystem. More...
 

Function Documentation

◆ GSC_SESSIONS_create()

void GSC_SESSIONS_create ( const struct GNUNET_PeerIdentity peer,
struct GSC_KeyExchangeInfo kx 
)

Create a session, a key exchange was just completed.

Parameters
peerpeer that is now connected
kxkey exchange that completed

Definition at line 318 of file gnunet-service-core_sessions.c.

320 {
321  struct Session *session;
322 
324  "Creating session for peer `%s'\n",
325  GNUNET_i2s (peer));
326  session = GNUNET_new (struct Session);
327  session->tmap = GSC_TYPEMAP_create ();
328  session->peer = peer;
329  session->kx = kx;
332  sessions,
333  session->peer,
334  session,
337  gettext_noop ("# peers connected"),
339  GNUNET_NO);
341  start_typemap_task (session);
342 }
#define gettext_noop(String)
Definition: gettext.h:70
struct GNUNET_STATISTICS_Handle * GSC_stats
For creating statistics.
void GSC_CLIENTS_notify_clients_about_neighbour(const struct GNUNET_PeerIdentity *neighbour, const struct GSC_TypeMap *tmap_old, const struct GSC_TypeMap *tmap_new)
Notify all clients about a change to existing session.
static GNUNET_NETWORK_STRUCT_END struct GNUNET_CONTAINER_MultiPeerMap * sessions
Map of peer identities to struct Session.
static void start_typemap_task(struct Session *session)
Restart the typemap task for the given session.
struct GSC_TypeMap * GSC_TYPEMAP_create()
Create an empty type map.
unsigned int GNUNET_CONTAINER_multipeermap_size(const struct GNUNET_CONTAINER_MultiPeerMap *map)
Get the number of key-value pairs in the map.
int GNUNET_CONTAINER_multipeermap_put(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY
There must only be one value per key; storing a value should fail if a value under the same key alrea...
#define GNUNET_log(kind,...)
@ GNUNET_OK
@ GNUNET_NO
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_new(type)
Allocate a struct or union of the given type.
void GNUNET_STATISTICS_set(struct GNUNET_STATISTICS_Handle *handle, const char *name, uint64_t value, int make_persistent)
Set statistic value for the peer.
Data kept per session.
struct GSC_TypeMap * tmap
Current type map for this peer.
const struct GNUNET_PeerIdentity * peer
Identity of the other peer.
struct GSC_KeyExchangeInfo * kx
Key exchange state for this peer.
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.

References gettext_noop, GNUNET_assert, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY, GNUNET_CONTAINER_multipeermap_put(), GNUNET_CONTAINER_multipeermap_size(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_new, GNUNET_NO, GNUNET_OK, GNUNET_STATISTICS_set(), GSC_CLIENTS_notify_clients_about_neighbour(), GSC_stats, GSC_TYPEMAP_create(), Session::kx, Session::peer, peer, sessions, start_typemap_task(), and Session::tmap.

Referenced by handle_pong().

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

◆ GSC_SESSIONS_reinit()

void GSC_SESSIONS_reinit ( const struct GNUNET_PeerIdentity peer)

The other peer has indicated that it 'lost' the session (KX down), reinitialize the session on our end, in particular this means to restart the typemap transmission.

Parameters
peerpeer that is now connected

Definition at line 353 of file gnunet-service-core_sessions.c.

354 {
355  struct Session *session;
356 
357  session = find_session (peer);
358  if (NULL == session)
359  {
360  /* KX/session is new for both sides; thus no need to restart what
361  has not yet begun */
362  return;
363  }
364  start_typemap_task (session);
365 }
static struct Session * find_session(const struct GNUNET_PeerIdentity *peer)
Find the session for the given peer.

References find_session(), peer, and start_typemap_task().

Referenced by handle_ephemeral_key().

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

◆ GSC_SESSIONS_confirm_typemap()

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

The other peer has confirmed receiving our type map, check if it is current and if so, stop retransmitting it.

Parameters
peerpeer that confirmed the type map
msgconfirmation message we received

Definition at line 376 of file gnunet-service-core_sessions.c.

378 {
379  const struct TypeMapConfirmationMessage *cmsg;
380  struct Session *session;
381 
382  session = find_session (peer);
383  if (NULL == session)
384  {
385  GNUNET_break (0);
386  return;
387  }
388  if (ntohs (msg->size) != sizeof(struct TypeMapConfirmationMessage))
389  {
390  GNUNET_break_op (0);
391  return;
392  }
393  cmsg = (const struct TypeMapConfirmationMessage *) msg;
394  if (GNUNET_YES != GSC_TYPEMAP_check_hash (&cmsg->tm_hash))
395  {
396  /* our typemap has changed in the meantime, do not
397  accept confirmation */
399  gettext_noop (
400  "# outdated typemap confirmations received"),
401  1,
402  GNUNET_NO);
404  "Got outdated typemap confirmated from peer `%s'\n",
405  GNUNET_i2s (session->peer));
406  return;
407  }
409  "Got typemap confirmation from peer `%s'\n",
410  GNUNET_i2s (session->peer));
411  if (NULL != session->typemap_task)
412  {
414  session->typemap_task = NULL;
415  }
417  gettext_noop (
418  "# valid typemap confirmations received"),
419  1,
420  GNUNET_NO);
421 }
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
int GSC_TYPEMAP_check_hash(const struct GNUNET_HashCode *hc)
Check if the given hash matches our current type map.
@ GNUNET_YES
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:975
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
struct GNUNET_SCHEDULER_Task * typemap_task
Task to transmit our type map.
Message sent to confirm that a typemap was received.
struct GNUNET_HashCode tm_hash
Hash of the (decompressed) type map that was received.

References find_session(), gettext_noop, GNUNET_break, GNUNET_break_op, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_NO, GNUNET_SCHEDULER_cancel(), GNUNET_STATISTICS_update(), GNUNET_YES, GSC_stats, GSC_TYPEMAP_check_hash(), msg, Session::peer, peer, GNUNET_MessageHeader::size, TypeMapConfirmationMessage::tm_hash, and Session::typemap_task.

Referenced by deliver_message().

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

◆ GSC_SESSIONS_end()

void GSC_SESSIONS_end ( const struct GNUNET_PeerIdentity pid)

End the session with the given peer (we are no longer connected).

Parameters
pididentity of peer to kill session with

Definition at line 211 of file gnunet-service-core_sessions.c.

212 {
213  struct Session *session;
214  struct GSC_ClientActiveRequest *car;
215  struct SessionMessageEntry *sme;
216 
217  session = find_session (pid);
218  if (NULL == session)
219  return;
221  "Destroying session for peer `%s'\n",
222  GNUNET_i2s (session->peer));
223  if (NULL != session->cork_task)
224  {
226  session->cork_task = NULL;
227  }
228  while (NULL != (car = session->active_client_request_head))
229  {
232  car);
234  }
235  while (NULL != (sme = session->sme_head))
236  {
237  GNUNET_CONTAINER_DLL_remove (session->sme_head, session->sme_tail, sme);
238  GNUNET_free (sme);
239  }
240  if (NULL != session->typemap_task)
241  {
243  session->typemap_task = NULL;
244  }
246  session->tmap,
247  NULL);
248  GNUNET_assert (
249  GNUNET_YES ==
250  GNUNET_CONTAINER_multipeermap_remove (sessions, session->peer, session));
252  gettext_noop ("# peers connected"),
254  GNUNET_NO);
255  GSC_TYPEMAP_destroy (session->tmap);
256  session->tmap = NULL;
257  GNUNET_free (session);
258 }
void GSC_CLIENTS_reject_request(struct GSC_ClientActiveRequest *car, int drop_client)
We will never be ready to transmit the given message in (disconnect or invalid request).
void GSC_TYPEMAP_destroy(struct GSC_TypeMap *tmap)
Free the given type map.
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multipeermap_remove(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key, const void *value)
Remove the given key-value pair from the map.
#define GNUNET_free(ptr)
Wrapper around free.
Record kept for each request for transmission issued by a client that is still pending.
Message ready for encryption.
struct SessionMessageEntry * sme_head
Head of list of messages ready for encryption.
struct SessionMessageEntry * sme_tail
Tail of list of messages ready for encryption.
struct GSC_ClientActiveRequest * active_client_request_head
Head of list of requests from clients for transmission to this peer.
struct GNUNET_SCHEDULER_Task * cork_task
Task to transmit corked messages with a delay.
struct GSC_ClientActiveRequest * active_client_request_tail
Tail of list of requests from clients for transmission to this peer.

References Session::active_client_request_head, Session::active_client_request_tail, Session::cork_task, find_session(), gettext_noop, GNUNET_assert, GNUNET_CONTAINER_DLL_remove, GNUNET_CONTAINER_multipeermap_remove(), GNUNET_CONTAINER_multipeermap_size(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_i2s(), GNUNET_log, GNUNET_NO, GNUNET_SCHEDULER_cancel(), GNUNET_STATISTICS_set(), GNUNET_YES, GSC_CLIENTS_notify_clients_about_neighbour(), GSC_CLIENTS_reject_request(), GSC_stats, GSC_TYPEMAP_destroy(), Session::peer, pid, sessions, Session::sme_head, Session::sme_tail, Session::tmap, and Session::typemap_task.

Referenced by free_session_helper(), handle_encrypted(), handle_transport_notify_disconnect(), and send_keep_alive().

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

◆ GSC_SESSIONS_solicit()

void GSC_SESSIONS_solicit ( const struct GNUNET_PeerIdentity pid)

Traffic is being solicited for the given peer.

This means that the message queue on the transport-level (NEIGHBOURS subsystem) is now empty and it is now OK to transmit another (non-control) message.

Parameters
pididentity of peer ready to receive data

Definition at line 844 of file gnunet-service-core_sessions.c.

845 {
846  struct Session *session;
847 
849  "Transport solicits for %s\n",
850  GNUNET_i2s (pid));
851  session = find_session (pid);
852  if (NULL == session)
853  return;
854  try_transmission (session);
855 }
static void try_transmission(struct Session *session)
Try to perform a transmission on the given session.

References find_session(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, pid, and try_transmission().

Referenced by handle_transport_notify_excess_bw().

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

◆ GSC_SESSIONS_queue_request()

void GSC_SESSIONS_queue_request ( struct GSC_ClientActiveRequest car)

Queue a request from a client for transmission to a particular peer.

Parameters
carrequest to queue; this handle is then shared between the caller (CLIENTS subsystem) and SESSIONS and must not be released by either until either 'GNUNET_SESSIONS_dequeue', or 'GNUNET_CLIENTS_failed' have been invoked on it
carrequest to queue; this handle is then shared between the caller (CLIENTS subsystem) and SESSIONS and must not be released by either until either #GSC_SESSIONS_dequeue(), GSC_SESSIONS_transmit() or #GSC_CLIENTS_failed() have been invoked on it

Definition at line 483 of file gnunet-service-core_sessions.c.

484 {
485  struct Session *session;
486 
487  session = find_session (&car->target);
488  if (NULL == session)
489  {
491  "Dropped client request for transmission (am disconnected)\n");
492  GNUNET_break (0); /* should have been rejected earlier */
494  return;
495  }
497  {
498  GNUNET_break (0);
500  return;
501  }
503  "Received client transmission request. queueing\n");
506  car);
507  try_transmission (session);
508 }
#define GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE
What is the maximum size for encrypted messages? Note that this number imposes a clear limit on the m...
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
struct GNUNET_PeerIdentity target
Which peer is the message going to be for?
uint16_t msize
How many bytes does the client intend to send?

References Session::active_client_request_head, Session::active_client_request_tail, find_session(), GNUNET_break, GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE, GNUNET_CONTAINER_DLL_insert_tail, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_NO, GNUNET_YES, GSC_CLIENTS_reject_request(), GSC_ClientActiveRequest::msize, GSC_ClientActiveRequest::target, and try_transmission().

Referenced by handle_client_send_request().

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

◆ GSC_SESSIONS_dequeue_request()

void GSC_SESSIONS_dequeue_request ( struct GSC_ClientActiveRequest car)

Dequeue a request from a client from transmission to a particular peer.

Parameters
carrequest to dequeue; this handle will then be 'owned' by the caller (CLIENTS sysbsystem)

Definition at line 518 of file gnunet-service-core_sessions.c.

519 {
520  struct Session *session;
521 
522  if (0 == memcmp (&car->target,
524  sizeof(struct GNUNET_PeerIdentity)))
525  return;
526  session = find_session (&car->target);
527  GNUNET_assert (NULL != session);
530  car);
531  /* dequeueing of 'high' priority messages may unblock
532  transmission for lower-priority messages, so we also
533  need to try in this case. */
534  try_transmission (session);
535 }
struct GNUNET_PeerIdentity GSC_my_identity
Our identity.
The identity of the host (wraps the signing key of the peer).

References Session::active_client_request_head, Session::active_client_request_tail, find_session(), GNUNET_assert, GNUNET_CONTAINER_DLL_remove, GSC_my_identity, GSC_ClientActiveRequest::target, and try_transmission().

Referenced by destroy_active_client_request(), GSC_CLIENTS_solicit_request(), handle_client_send(), and handle_client_send_request().

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

◆ GSC_SESSIONS_transmit()

void GSC_SESSIONS_transmit ( struct GSC_ClientActiveRequest car,
const struct GNUNET_MessageHeader msg,
enum GNUNET_MQ_PriorityPreferences  priority 
)

Transmit a message to a particular peer.

Parameters
caroriginal request that was queued and then solicited, ownership does not change (dequeue will be called soon).
msgmessage to transmit
priorityhow important is this message

Definition at line 859 of file gnunet-service-core_sessions.c.

862 {
863  struct Session *session;
864  struct SessionMessageEntry *sme;
865  struct SessionMessageEntry *pos;
866  size_t msize;
867 
868  session = find_session (&car->target);
869  if (NULL == session)
870  return;
871  msize = ntohs (msg->size);
872  sme = GNUNET_malloc (sizeof(struct SessionMessageEntry) + msize);
873  GNUNET_memcpy (&sme[1], msg, msize);
874  sme->size = msize;
875  sme->priority = priority;
877  {
878  sme->deadline =
881  "Message corked, delaying transmission\n");
882  }
883  pos = session->sme_head;
884  while ((NULL != pos) && (pos->priority >= sme->priority))
885  pos = pos->next;
886  if (NULL == pos)
888  session->sme_tail,
889  sme);
890  else
892  session->sme_tail,
893  pos->prev,
894  sme);
895  try_transmission (session);
896 }
#define GNUNET_CONSTANTS_MAX_CORK_DELAY
How long do we delay messages to get larger packet sizes (CORKing)?
#define GNUNET_CONTAINER_DLL_insert_after(head, tail, other, element)
Insert an element into a DLL after the given other element.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_malloc(size)
Wrapper around malloc.
@ GNUNET_MQ_PREF_CORK_ALLOWED
Flag to indicate that CORKing is acceptable.
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:316
struct GNUNET_TIME_Absolute deadline
Deadline for transmission, 1s after we received it (if we are not corking), otherwise "now".
size_t size
How long is the message? (number of bytes following the struct MessageEntry, but not including the si...
struct SessionMessageEntry * next
We keep messages in a doubly linked list.
struct SessionMessageEntry * prev
We keep messages in a doubly linked list.
enum GNUNET_MQ_PriorityPreferences priority
How important is this message.

References SessionMessageEntry::deadline, find_session(), GNUNET_CONSTANTS_MAX_CORK_DELAY, GNUNET_CONTAINER_DLL_insert_after, GNUNET_CONTAINER_DLL_insert_tail, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_malloc, GNUNET_memcpy, GNUNET_MQ_PREF_CORK_ALLOWED, GNUNET_TIME_relative_to_absolute(), msg, SessionMessageEntry::next, SessionMessageEntry::prev, SessionMessageEntry::priority, SessionMessageEntry::size, GNUNET_MessageHeader::size, Session::sme_head, Session::sme_tail, GSC_ClientActiveRequest::target, and try_transmission().

Referenced by tokenized_cb().

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

◆ GSC_SESSIONS_broadcast_typemap()

void GSC_SESSIONS_broadcast_typemap ( const struct GNUNET_MessageHeader msg)

Broadcast an updated typemap message to all neighbours.

Restarts the retransmissions until the typemaps are confirmed.

Parameters
msgmessage to transmit

Definition at line 826 of file gnunet-service-core_sessions.c.

827 {
828  if (NULL == sessions)
829  return;
832  (void *) msg);
833 }
static int do_restart_typemap_message(void *cls, const struct GNUNET_PeerIdentity *key, void *value)
Send an updated typemap message to the neighbour now, and restart typemap transmissions.
int GNUNET_CONTAINER_multipeermap_iterate(struct GNUNET_CONTAINER_MultiPeerMap *map, GNUNET_CONTAINER_PeerMapIterator it, void *it_cls)
Iterate over all entries in the map.

References do_restart_typemap_message(), GNUNET_CONTAINER_multipeermap_iterate(), msg, and sessions.

Referenced by broadcast_my_type_map().

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

◆ GSC_SESSIONS_notify_client_about_sessions()

void GSC_SESSIONS_notify_client_about_sessions ( struct GSC_Client client)

We have a new client, notify it about all current sessions.

Parameters
clientthe new client

Definition at line 454 of file gnunet-service-core_sessions.c.

455 {
456  /* notify new client about existing sessions */
459  client);
460 }
static int notify_client_about_session(void *cls, const struct GNUNET_PeerIdentity *key, void *value)
Notify the given client about the session (client is new).

References GNUNET_CONTAINER_multipeermap_iterate(), notify_client_about_session(), and sessions.

Referenced by handle_client_init().

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

◆ GSC_SESSIONS_set_typemap()

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

We've received a typemap message from a peer, update ours.

Notifies clients about the session.

Parameters
peerpeer this is about
msgtypemap update message

Definition at line 900 of file gnunet-service-core_sessions.c.

902 {
903  struct Session *session;
904  struct GSC_TypeMap *nmap;
905  struct SessionMessageEntry *sme;
906  struct TypeMapConfirmationMessage *tmc;
907 
909  if (NULL == nmap)
910  {
911  GNUNET_break_op (0);
912  return; /* malformed */
913  }
914  session = find_session (peer);
915  if (NULL == session)
916  {
917  GSC_TYPEMAP_destroy (nmap);
918  GNUNET_break (0);
919  return;
920  }
922  "Received TYPEMAP from %s\n",
923  GNUNET_i2s (session->peer));
924  for (sme = session->sme_head; NULL != sme; sme = sme->next)
925  {
926  if (GNUNET_YES == sme->is_typemap_confirm)
927  {
928  GNUNET_CONTAINER_DLL_remove (session->sme_head, session->sme_tail, sme);
929  GNUNET_free (sme);
930  break;
931  }
932  }
933  sme = GNUNET_malloc (sizeof(struct SessionMessageEntry)
934  + sizeof(struct TypeMapConfirmationMessage));
936  sme->size = sizeof(struct TypeMapConfirmationMessage);
939  tmc = (struct TypeMapConfirmationMessage *) &sme[1];
940  tmc->header.size = htons (sizeof(struct TypeMapConfirmationMessage));
942  tmc->reserved = htonl (0);
943  GSC_TYPEMAP_hash (nmap, &tmc->tm_hash);
944  GNUNET_CONTAINER_DLL_insert (session->sme_head, session->sme_tail, sme);
945  try_transmission (session);
947  GSC_TYPEMAP_destroy (session->tmap);
948  session->tmap = nmap;
949 }
struct GSC_TypeMap * GSC_TYPEMAP_get_from_message(const struct GNUNET_MessageHeader *msg)
Extract a type map from a TYPE_MAP message.
void GSC_TYPEMAP_hash(const struct GSC_TypeMap *tm, struct GNUNET_HashCode *hc)
Hash the contents of a type map.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
@ GNUNET_MQ_PRIO_CRITICAL_CONTROL
Highest priority, control traffic (e.g.
#define GNUNET_MESSAGE_TYPE_CORE_CONFIRM_TYPE_MAP
Other peer confirms having received the type map.
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:111
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
A type map describing which messages a given neighbour is able to process.
int is_typemap_confirm
Flag set to GNUNET_YES if this is a typemap confirmation message.
uint32_t reserved
Reserved, always zero.
struct GNUNET_MessageHeader header
Header with type GNUNET_MESSAGE_TYPE_CORE_CONFIRM_TYPE_MAP.

References SessionMessageEntry::deadline, find_session(), GNUNET_break, GNUNET_break_op, GNUNET_CONTAINER_DLL_insert, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_i2s(), GNUNET_log, GNUNET_malloc, GNUNET_MESSAGE_TYPE_CORE_CONFIRM_TYPE_MAP, GNUNET_MQ_PRIO_CRITICAL_CONTROL, GNUNET_TIME_absolute_get(), GNUNET_YES, GSC_CLIENTS_notify_clients_about_neighbour(), GSC_TYPEMAP_destroy(), GSC_TYPEMAP_get_from_message(), GSC_TYPEMAP_hash(), TypeMapConfirmationMessage::header, SessionMessageEntry::is_typemap_confirm, msg, SessionMessageEntry::next, Session::peer, peer, SessionMessageEntry::priority, TypeMapConfirmationMessage::reserved, SessionMessageEntry::size, GNUNET_MessageHeader::size, Session::sme_head, Session::sme_tail, TypeMapConfirmationMessage::tm_hash, Session::tmap, try_transmission(), and GNUNET_MessageHeader::type.

Referenced by deliver_message().

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

◆ GSC_SESSIONS_add_to_typemap()

void GSC_SESSIONS_add_to_typemap ( const struct GNUNET_PeerIdentity peer,
uint16_t  type 
)

The given peer send a message of the specified type.

Make sure the respective bit is set in its type-map and that clients are notified about the session.

Parameters
peerpeer this is about
typetype of the message

Definition at line 961 of file gnunet-service-core_sessions.c.

963 {
964  struct Session *session;
965  struct GSC_TypeMap *nmap;
966 
967  if (0 == memcmp (peer, &GSC_my_identity, sizeof(struct GNUNET_PeerIdentity)))
968  return;
969  session = find_session (peer);
970  GNUNET_assert (NULL != session);
971  if (GNUNET_YES == GSC_TYPEMAP_test_match (session->tmap, &type, 1))
972  return; /* already in it */
973  nmap = GSC_TYPEMAP_extend (session->tmap, &type, 1);
975  GSC_TYPEMAP_destroy (session->tmap);
976  session->tmap = nmap;
977 }
struct GSC_TypeMap * GSC_TYPEMAP_extend(const struct GSC_TypeMap *tmap, const uint16_t *types, unsigned int tcnt)
Add additional types to a given typemap.
int GSC_TYPEMAP_test_match(const struct GSC_TypeMap *tmap, const uint16_t *types, unsigned int tcnt)
Test if any of the types from the types array is in the given type map.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model

References find_session(), GNUNET_assert, GNUNET_YES, GSC_CLIENTS_notify_clients_about_neighbour(), GSC_my_identity, GSC_TYPEMAP_destroy(), GSC_TYPEMAP_extend(), GSC_TYPEMAP_test_match(), peer, Session::tmap, and type.

Referenced by GSC_CLIENTS_deliver_message().

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

◆ GSC_SESSIONS_init()

void GSC_SESSIONS_init ( void  )

Initialize sessions subsystem.

Definition at line 984 of file gnunet-service-core_sessions.c.

985 {
987 }
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).

References GNUNET_CONTAINER_multipeermap_create(), GNUNET_YES, and sessions.

Referenced by run().

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

◆ GSC_SESSIONS_done()

void GSC_SESSIONS_done ( void  )

Shutdown sessions subsystem.

Definition at line 1015 of file gnunet-service-core_sessions.c.

1016 {
1017  if (NULL != sessions)
1018  {
1021  NULL);
1023  sessions = NULL;
1024  }
1025 }
static int free_session_helper(void *cls, const struct GNUNET_PeerIdentity *key, void *value)
Helper function for GSC_SESSIONS_done() to free all active sessions.
void GNUNET_CONTAINER_multipeermap_destroy(struct GNUNET_CONTAINER_MultiPeerMap *map)
Destroy a hash map.

References free_session_helper(), GNUNET_CONTAINER_multipeermap_destroy(), GNUNET_CONTAINER_multipeermap_iterate(), and sessions.

Referenced by shutdown_task().

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