GNUnet  0.11.x
Functions
gnunet-service-messenger_message_recv.c File Reference

GNUnet MESSENGER service. More...

#include "gnunet-service-messenger_message_recv.h"
#include "gnunet-service-messenger_operation.h"
Include dependency graph for gnunet-service-messenger_message_recv.c:

Go to the source code of this file.

Functions

static void forward_about_members (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct GNUNET_MESSENGER_MemberSession *session, struct GNUNET_CONTAINER_MultiHashMap *map)
 
static int iterate_forward_members (void *cls, const struct GNUNET_IDENTITY_PublicKey *public_key, struct GNUNET_MESSENGER_MemberSession *session)
 
int recv_message_info (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
 Handles a received info message to change the current member id to the one generated by the host connected to. More...
 
int recv_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
 Handles a received peer message to link it to its origin tunnel if the peer identity matches. More...
 
static void callback_found_message (void *cls, struct GNUNET_MESSENGER_SrvRoom *room, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
 
int recv_message_request (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
 Handles a received request message by checking for the requested message and forwarding it back if the message was found. More...
 

Detailed Description

GNUnet MESSENGER service.

Author
Tobias Frisch

Definition in file gnunet-service-messenger_message_recv.c.

Function Documentation

◆ forward_about_members()

static void forward_about_members ( struct GNUNET_MESSENGER_SrvRoom room,
struct GNUNET_MESSENGER_SrvTunnel tunnel,
struct GNUNET_MESSENGER_MemberSession session,
struct GNUNET_CONTAINER_MultiHashMap map 
)
static

Definition at line 31 of file gnunet-service-messenger_message_recv.c.

References forward_tunnel_message(), get_room_message_store(), get_store_message(), GNUNET_CONTAINER_multihashmap_contains(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST, GNUNET_ERROR_TYPE_WARNING, GNUNET_log, GNUNET_OK, GNUNET_YES, GNUNET_MESSENGER_ListMessage::hash, GNUNET_MESSENGER_ListMessages::head, GNUNET_MESSENGER_MemberSession::messages, GNUNET_MESSENGER_ListMessage::next, and GNUNET_MESSENGER_MemberSession::prev.

Referenced by iterate_forward_members().

33 {
34  if (session->prev)
35  forward_about_members (room, tunnel, session->prev, map);
36 
37  struct GNUNET_MESSENGER_MessageStore *message_store = get_room_message_store(room);
38  struct GNUNET_MESSENGER_ListMessage *element;
39 
40  for (element = session->messages.head; element; element = element->next)
41  {
43  continue;
44 
45  if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(map, &(element->hash), NULL,
47  GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Forwarding of session message could be duplicated!\n");
48 
49  const struct GNUNET_MESSENGER_Message *message = get_store_message(message_store, &(element->hash));
50 
51  if (message)
52  forward_tunnel_message(tunnel, message, &(element->hash));
53  }
54 }
struct GNUNET_MESSENGER_MessageStore * get_room_message_store(struct GNUNET_MESSENGER_SrvRoom *room)
Returns the used message store of a given room.
struct GNUNET_MESSENGER_ListMessage * next
struct GNUNET_MESSENGER_ListMessage * head
int GNUNET_CONTAINER_multihashmap_contains(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Check if the map contains any value under the given key (including values that are NULL)...
, ' bother checking if a value already exists (faster than GNUNET_CONTAINER_MULTIHASHMAPOPTION_...
const struct GNUNET_MESSENGER_Message * get_store_message(struct GNUNET_MESSENGER_MessageStore *store, const struct GNUNET_HashCode *hash)
Returns the message from a message store matching a given hash.
struct GNUNET_MESSENGER_ListMessages messages
int GNUNET_CONTAINER_multihashmap_put(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
void forward_tunnel_message(struct GNUNET_MESSENGER_SrvTunnel *tunnel, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
Forwards a given message with a known hash through a tunnel.
static void forward_about_members(struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct GNUNET_MESSENGER_MemberSession *session, struct GNUNET_CONTAINER_MultiHashMap *map)
#define GNUNET_log(kind,...)
struct GNUNET_MESSENGER_MemberSession * prev
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iterate_forward_members()

static int iterate_forward_members ( void *  cls,
const struct GNUNET_IDENTITY_PublicKey public_key,
struct GNUNET_MESSENGER_MemberSession session 
)
static

Definition at line 57 of file gnunet-service-messenger_message_recv.c.

References forward_about_members(), GNUNET_CONTAINER_multihashmap_create(), GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_NO, GNUNET_YES, is_member_session_completed(), map, and GNUNET_MESSENGER_SrvTunnel::room.

Referenced by recv_message_info().

59 {
60  struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls;
61 
63  return GNUNET_YES;
64 
66 
67  forward_about_members (tunnel->room, tunnel, session, map);
68 
70  return GNUNET_YES;
71 }
int is_member_session_completed(const struct GNUNET_MESSENGER_MemberSession *session)
Returns if the given member session has been completed.
Internal representation of the hash map.
static struct GNUNET_CONTAINER_MultiPeerMap * map
Handle to the map used to store old latency values for peers.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
struct GNUNET_MESSENGER_SrvRoom * room
static void forward_about_members(struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct GNUNET_MESSENGER_MemberSession *session, struct GNUNET_CONTAINER_MultiHashMap *map)
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ recv_message_info()

int recv_message_info ( struct GNUNET_MESSENGER_SrvRoom room,
struct GNUNET_MESSENGER_SrvTunnel tunnel,
const struct GNUNET_MESSENGER_Message message,
const struct GNUNET_HashCode hash 
)

Handles a received info message to change the current member id to the one generated by the host connected to.

(all current tunnels will be informed about the id change)

Parameters

Definition at line 74 of file gnunet-service-messenger_message_recv.c.

References GNUNET_MESSENGER_SrvRoom::basement, GNUNET_MESSENGER_Message::body, check_room_peer_status(), contains_list_tunnels(), create_message_info(), disconnect_tunnel(), get_handle_ego(), get_room_member_store(), get_tunnel_messenger_version(), get_tunnel_peer_identity(), GNUNET_NO, GNUNET_OK, GNUNET_YES, GNUNET_MESSENGER_SrvRoom::host, GNUNET_MESSENGER_MessageBody::info, iterate_forward_members(), iterate_store_members(), GNUNET_MESSENGER_MessageInfo::messenger_version, send_tunnel_message(), and update_tunnel_messenger_version().

Referenced by handle_tunnel_message().

76 {
77  const uint32_t version = get_tunnel_messenger_version(tunnel);
78 
80  {
81  disconnect_tunnel(tunnel);
82  return GNUNET_NO;
83  }
84 
85  if (version == get_tunnel_messenger_version(tunnel))
86  return GNUNET_NO;
87 
88  if (room->host)
89  {
90  const struct GNUNET_MESSENGER_Ego *ego = get_handle_ego(room->host);
91 
92  send_tunnel_message (tunnel, room->host, create_message_info(ego));
93  }
94 
97 
98  if (GNUNET_YES != contains_list_tunnels(&(room->basement), &peer))
99  {
100  struct GNUNET_MESSENGER_MemberStore *member_store = get_room_member_store(room);
101 
102  iterate_store_members(member_store, iterate_forward_members, tunnel);
103  }
104 
105  check_room_peer_status(room, tunnel);
106 
107  return GNUNET_NO;
108 }
int contains_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels, const struct GNUNET_PeerIdentity *peer)
Tests linearly if the list of tunnels peer identities contains a specific peer identity and returns G...
void check_room_peer_status(struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel)
Checks the current state of opening a given room from this peer and re-publishes it if necessary to a...
int iterate_store_members(struct GNUNET_MESSENGER_MemberStore *store, GNUNET_MESSENGER_MemberIteratorCallback it, void *cls)
Iterate through all member sessions currently connected to the members of the given member store and ...
uint32_t messenger_version
The version of GNUnet Messenger API.
struct GNUNET_MESSENGER_MemberStore * get_room_member_store(struct GNUNET_MESSENGER_SrvRoom *room)
Returns the used member store of a given room.
uint32_t get_tunnel_messenger_version(const struct GNUNET_MESSENGER_SrvTunnel *tunnel)
Returns the current messenger version the peer connected via a given tunnel has reported to be using ...
void get_tunnel_peer_identity(const struct GNUNET_MESSENGER_SrvTunnel *tunnel, struct GNUNET_PeerIdentity *peer)
Writes the peer identity of the peer connected via tunnel to this peer into the peer parameter...
struct GNUNET_MESSENGER_Message * create_message_info(const struct GNUNET_MESSENGER_Ego *ego)
Creates and allocates a new info message containing the hosts EGO public key and a newly generated un...
struct GNUNET_MESSENGER_MessageBody body
Body.
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.
struct GNUNET_MESSENGER_SrvHandle * host
static int iterate_forward_members(void *cls, const struct GNUNET_IDENTITY_PublicKey *public_key, struct GNUNET_MESSENGER_MemberSession *session)
struct GNUNET_MESSENGER_MessageInfo info
The identity of the host (wraps the signing key of the peer).
int update_tunnel_messenger_version(struct GNUNET_MESSENGER_SrvTunnel *tunnel, uint32_t version)
Updates the messenger version of the tunnel to a given version if it is compatible to the running pee...
struct GNUNET_MESSENGER_ListTunnels basement
int send_tunnel_message(struct GNUNET_MESSENGER_SrvTunnel *tunnel, void *handle, struct GNUNET_MESSENGER_Message *message)
Sends a message by packing it automatically into an envelope and passing it through the tunnel...
void disconnect_tunnel(struct GNUNET_MESSENGER_SrvTunnel *tunnel)
Disconnects and unbinds a channel from a tunnel.
const struct GNUNET_MESSENGER_Ego * get_handle_ego(const struct GNUNET_MESSENGER_SrvHandle *handle)
Returns the EGO used by a given handle.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ recv_message_peer()

int recv_message_peer ( struct GNUNET_MESSENGER_SrvRoom room,
struct GNUNET_MESSENGER_SrvTunnel tunnel,
const struct GNUNET_MESSENGER_Message message,
const struct GNUNET_HashCode hash 
)

Handles a received peer message to link it to its origin tunnel if the peer identity matches.

(the peer message and the member id can potentially be linked to the tunnel)

Parameters

Definition at line 111 of file gnunet-service-messenger_message_recv.c.

References GNUNET_MESSENGER_Message::body, GNUNET_memcmp, GNUNET_memcpy, GNUNET_new, GNUNET_PEER_resolve(), GNUNET_YES, GNUNET_MESSENGER_SrvTunnel::peer, GNUNET_MESSENGER_MessagePeer::peer, GNUNET_MESSENGER_MessageBody::peer, and GNUNET_MESSENGER_SrvTunnel::peer_message.

Referenced by handle_tunnel_message().

113 {
114  struct GNUNET_PeerIdentity peer;
115  GNUNET_PEER_resolve (tunnel->peer, &peer);
116 
117  if (0 == GNUNET_memcmp(&peer, &(message->body.peer.peer)))
118  {
119  if (!tunnel->peer_message)
120  tunnel->peer_message = GNUNET_new(struct GNUNET_HashCode);
121 
122  GNUNET_memcpy(tunnel->peer_message, &hash, sizeof(hash));
123  }
124 
125  return GNUNET_YES;
126 }
struct GNUNET_PeerIdentity peer
The peer identity of the sender opening a room.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
void GNUNET_PEER_resolve(GNUNET_PEER_Id id, struct GNUNET_PeerIdentity *pid)
Convert an interned PID to a normal peer identity.
Definition: peer.c:225
struct GNUNET_MESSENGER_MessageBody body
Body.
A 512-bit hashcode.
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.
struct GNUNET_MESSENGER_MessagePeer peer
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
The identity of the host (wraps the signing key of the peer).
Here is the call graph for this function:
Here is the caller graph for this function:

◆ callback_found_message()

static void callback_found_message ( void *  cls,
struct GNUNET_MESSENGER_SrvRoom room,
const struct GNUNET_MESSENGER_Message message,
const struct GNUNET_HashCode hash 
)
static

Definition at line 129 of file gnunet-service-messenger_message_recv.c.

References forward_tunnel_message(), get_room_operation_store(), GNUNET_MESSENGER_OP_REQUEST, GNUNET_MESSENGER_REQUEST_DELAY, and use_store_operation().

Referenced by recv_message_request().

132 {
133  struct GNUNET_MESSENGER_SrvTunnel *tunnel = tunnel;
134 
135  if (!message)
136  {
137  struct GNUNET_MESSENGER_OperationStore *operation_store = get_room_operation_store(room);
138 
140  operation_store,
141  hash,
144  );
145  }
146  else
147  forward_tunnel_message (tunnel, message, hash);
148 }
struct GNUNET_MESSENGER_OperationStore * get_room_operation_store(struct GNUNET_MESSENGER_SrvRoom *room)
Returns the used operation store of a given room.
#define GNUNET_MESSENGER_REQUEST_DELAY
int use_store_operation(struct GNUNET_MESSENGER_OperationStore *store, const struct GNUNET_HashCode *hash, enum GNUNET_MESSENGER_OperationType type, struct GNUNET_TIME_Relative delay)
Tries to use an operation under a given hash in a specific operation store.
void forward_tunnel_message(struct GNUNET_MESSENGER_SrvTunnel *tunnel, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
Forwards a given message with a known hash through a tunnel.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ recv_message_request()

int recv_message_request ( struct GNUNET_MESSENGER_SrvRoom room,
struct GNUNET_MESSENGER_SrvTunnel tunnel,
const struct GNUNET_MESSENGER_Message message,
const struct GNUNET_HashCode hash 
)

Handles a received request message by checking for the requested message and forwarding it back if the message was found.

(this can also cause this peer to send a new request instead of only forwarding the received one)

Parameters

Definition at line 155 of file gnunet-service-messenger_message_recv.c.

References GNUNET_MESSENGER_Message::body, callback_found_message(), check_member_session_history(), get_member_session_of(), get_room_member_store(), get_store_member_of(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_log, GNUNET_NO, GNUNET_YES, GNUNET_MESSENGER_MessageRequest::hash, GNUNET_MESSENGER_MessageBody::request, and request_room_message().

Referenced by handle_tunnel_message().

157 {
158  struct GNUNET_MESSENGER_MemberStore *member_store = get_room_member_store(room);
159  struct GNUNET_MESSENGER_Member *member = get_store_member_of(member_store, message);
160 
161  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Request for message (%s)\n", GNUNET_h2s (hash));
162 
163  if (!member)
164  return GNUNET_NO;
165 
166  struct GNUNET_MESSENGER_MemberSession *session = get_member_session_of(member, message, hash);
167 
168  if ((!session) || (GNUNET_YES != check_member_session_history(session, hash, GNUNET_NO)))
169  return GNUNET_NO;
170 
171  if (GNUNET_NO == request_room_message(room, &(message->body.request.hash), session, callback_found_message, tunnel))
172  return GNUNET_YES;
173 
174  return GNUNET_NO;
175 }
struct GNUNET_HashCode hash
The hash of the requested message.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
struct GNUNET_MESSENGER_MemberStore * get_room_member_store(struct GNUNET_MESSENGER_SrvRoom *room)
Returns the used member store of a given room.
struct GNUNET_MESSENGER_MessageRequest request
int request_room_message(struct GNUNET_MESSENGER_SrvRoom *room, const struct GNUNET_HashCode *hash, const struct GNUNET_MESSENGER_MemberSession *session, GNUNET_MESSENGER_MessageRequestCallback callback, void *cls)
Requests a message from a room identified by a given hash.
struct GNUNET_MESSENGER_MessageBody body
Body.
int check_member_session_history(const struct GNUNET_MESSENGER_MemberSession *session, const struct GNUNET_HashCode *hash, int ownership)
Checks the history of a session for a specific message which is identified by its hash and if the own...
struct GNUNET_MESSENGER_Member * get_store_member_of(struct GNUNET_MESSENGER_MemberStore *store, const struct GNUNET_MESSENGER_Message *message)
Returns the member of a store using a sender id of a given message.
#define GNUNET_log(kind,...)
static void callback_found_message(void *cls, struct GNUNET_MESSENGER_SrvRoom *room, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
struct GNUNET_MESSENGER_MemberSession * get_member_session_of(struct GNUNET_MESSENGER_Member *member, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
Returns the member session of a member using a public key which can verify the signature of a given m...
Here is the call graph for this function:
Here is the caller graph for this function: