aboutsummaryrefslogtreecommitdiff
path: root/src/messenger/gnunet-service-messenger_message_recv.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/messenger/gnunet-service-messenger_message_recv.c')
-rw-r--r--src/messenger/gnunet-service-messenger_message_recv.c121
1 files changed, 75 insertions, 46 deletions
diff --git a/src/messenger/gnunet-service-messenger_message_recv.c b/src/messenger/gnunet-service-messenger_message_recv.c
index 3b545cfa4..e445c4e79 100644
--- a/src/messenger/gnunet-service-messenger_message_recv.c
+++ b/src/messenger/gnunet-service-messenger_message_recv.c
@@ -38,25 +38,31 @@ forward_about_members (struct GNUNET_MESSENGER_SrvRoom *room,
38 if (session->prev) 38 if (session->prev)
39 forward_about_members (room, tunnel, session->prev, map); 39 forward_about_members (room, tunnel, session->prev, map);
40 40
41 struct GNUNET_MESSENGER_MessageStore *message_store = get_srv_room_message_store(room); 41 struct GNUNET_MESSENGER_MessageStore *message_store =
42 get_srv_room_message_store (room);
42 struct GNUNET_MESSENGER_ListMessage *element; 43 struct GNUNET_MESSENGER_ListMessage *element;
43 44
44 for (element = session->messages.head; element; element = element->next) 45 for (element = session->messages.head; element; element = element->next)
45 { 46 {
46 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains(map, &(element->hash))) 47 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (map,
48 &(element->hash)))
47 continue; 49 continue;
48 50
49 if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(map, &(element->hash), NULL, 51 if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (map, &(element->hash),
50 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)) 52 NULL,
51 GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Forwarding of session message could be duplicated!\n"); 53 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
54 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
55 "Forwarding of session message could be duplicated!\n");
52 56
53 const struct GNUNET_MESSENGER_Message *message = get_store_message(message_store, &(element->hash)); 57 const struct GNUNET_MESSENGER_Message *message = get_store_message (
58 message_store, &(element->hash));
54 59
55 if (message) 60 if (message)
56 forward_tunnel_message(tunnel, message, &(element->hash)); 61 forward_tunnel_message (tunnel, message, &(element->hash));
57 } 62 }
58} 63}
59 64
65
60static int 66static int
61iterate_forward_members (void *cls, 67iterate_forward_members (void *cls,
62 const struct GNUNET_IDENTITY_PublicKey *public_key, 68 const struct GNUNET_IDENTITY_PublicKey *public_key,
@@ -64,68 +70,77 @@ iterate_forward_members (void *cls,
64{ 70{
65 struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls; 71 struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls;
66 72
67 if (GNUNET_YES == is_member_session_completed(session)) 73 if (GNUNET_YES == is_member_session_completed (session))
68 return GNUNET_YES; 74 return GNUNET_YES;
69 75
70 struct GNUNET_CONTAINER_MultiHashMap *map = GNUNET_CONTAINER_multihashmap_create(4, GNUNET_NO); 76 struct GNUNET_CONTAINER_MultiHashMap *map =
77 GNUNET_CONTAINER_multihashmap_create (4, GNUNET_NO);
71 78
72 forward_about_members (tunnel->room, tunnel, session, map); 79 forward_about_members (tunnel->room, tunnel, session, map);
73 80
74 GNUNET_CONTAINER_multihashmap_destroy(map); 81 GNUNET_CONTAINER_multihashmap_destroy (map);
75 return GNUNET_YES; 82 return GNUNET_YES;
76} 83}
77 84
85
78int 86int
79recv_message_info (struct GNUNET_MESSENGER_SrvRoom *room, 87recv_message_info (struct GNUNET_MESSENGER_SrvRoom *room,
80 struct GNUNET_MESSENGER_SrvTunnel *tunnel, 88 struct GNUNET_MESSENGER_SrvTunnel *tunnel,
81 const struct GNUNET_MESSENGER_Message *message, 89 const struct GNUNET_MESSENGER_Message *message,
82 const struct GNUNET_HashCode *hash) 90 const struct GNUNET_HashCode *hash)
83{ 91{
84 const uint32_t version = get_tunnel_messenger_version(tunnel); 92 const uint32_t version = get_tunnel_messenger_version (tunnel);
85 93
86 if (GNUNET_OK != update_tunnel_messenger_version(tunnel, message->body.info.messenger_version)) 94 if (GNUNET_OK != update_tunnel_messenger_version (tunnel,
95 message->body.info.
96 messenger_version))
87 { 97 {
88 disconnect_tunnel(tunnel); 98 disconnect_tunnel (tunnel);
89 return GNUNET_NO; 99 return GNUNET_NO;
90 } 100 }
91 101
92 if (version == get_tunnel_messenger_version(tunnel)) 102 if (version == get_tunnel_messenger_version (tunnel))
93 return GNUNET_NO; 103 return GNUNET_NO;
94 104
95 if (room->host) 105 if (room->host)
96 send_tunnel_message (tunnel, room->host, create_message_info (room->service)); 106 send_tunnel_message (tunnel, room->host, create_message_info (
107 room->service));
97 108
98 struct GNUNET_PeerIdentity peer; 109 struct GNUNET_PeerIdentity peer;
99 get_tunnel_peer_identity(tunnel, &peer); 110 get_tunnel_peer_identity (tunnel, &peer);
100 111
101 if (GNUNET_YES != contains_list_tunnels(&(room->basement), &peer)) 112 if (GNUNET_YES != contains_list_tunnels (&(room->basement), &peer))
102 { 113 {
103 struct GNUNET_MESSENGER_MessageStore *message_store = get_srv_room_message_store(room); 114 struct GNUNET_MESSENGER_MessageStore *message_store =
115 get_srv_room_message_store (room);
104 116
105 struct GNUNET_MESSENGER_ListTunnel *element; 117 struct GNUNET_MESSENGER_ListTunnel *element;
106 for (element = room->basement.head; element; element = element->next) 118 for (element = room->basement.head; element; element = element->next)
107 { 119 {
108 if (!element->hash) 120 if (! element->hash)
109 continue; 121 continue;
110 122
111 const struct GNUNET_MESSENGER_Message *message = get_store_message(message_store, element->hash); 123 const struct GNUNET_MESSENGER_Message *message = get_store_message (
124 message_store, element->hash);
112 125
113 if (message) 126 if (message)
114 forward_tunnel_message(tunnel, message, element->hash); 127 forward_tunnel_message (tunnel, message, element->hash);
115 } 128 }
116 } 129 }
117 130
118 if (GNUNET_YES != contains_list_tunnels(&(room->basement), &peer)) 131 if (GNUNET_YES != contains_list_tunnels (&(room->basement), &peer))
119 { 132 {
120 struct GNUNET_MESSENGER_MemberStore *member_store = get_srv_room_member_store(room); 133 struct GNUNET_MESSENGER_MemberStore *member_store =
134 get_srv_room_member_store (room);
121 135
122 iterate_store_members(member_store, iterate_forward_members, tunnel); 136 iterate_store_members (member_store, iterate_forward_members, tunnel);
123 } 137 }
124 138
125 check_srv_room_peer_status(room, tunnel); 139 check_srv_room_peer_status (room, tunnel);
126 return GNUNET_NO; 140 return GNUNET_NO;
127} 141}
128 142
143
129int 144int
130recv_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, 145recv_message_peer (struct GNUNET_MESSENGER_SrvRoom *room,
131 struct GNUNET_MESSENGER_SrvTunnel *tunnel, 146 struct GNUNET_MESSENGER_SrvTunnel *tunnel,
@@ -135,18 +150,19 @@ recv_message_peer (struct GNUNET_MESSENGER_SrvRoom *room,
135 struct GNUNET_PeerIdentity peer; 150 struct GNUNET_PeerIdentity peer;
136 GNUNET_PEER_resolve (tunnel->peer, &peer); 151 GNUNET_PEER_resolve (tunnel->peer, &peer);
137 152
138 if (0 == GNUNET_memcmp(&peer, &(message->body.peer.peer))) 153 if (0 == GNUNET_memcmp (&peer, &(message->body.peer.peer)))
139 { 154 {
140 if (!tunnel->peer_message) 155 if (! tunnel->peer_message)
141 tunnel->peer_message = GNUNET_new(struct GNUNET_HashCode); 156 tunnel->peer_message = GNUNET_new (struct GNUNET_HashCode);
142 157
143 GNUNET_memcpy(tunnel->peer_message, &hash, sizeof(hash)); 158 GNUNET_memcpy (tunnel->peer_message, &hash, sizeof(hash));
144 } 159 }
145 160
146 update_to_list_tunnels(&(room->basement), &(message->body.peer.peer), hash); 161 update_to_list_tunnels (&(room->basement), &(message->body.peer.peer), hash);
147 return GNUNET_YES; 162 return GNUNET_YES;
148} 163}
149 164
165
150static void 166static void
151callback_found_message (void *cls, 167callback_found_message (void *cls,
152 struct GNUNET_MESSENGER_SrvRoom *room, 168 struct GNUNET_MESSENGER_SrvRoom *room,
@@ -155,21 +171,23 @@ callback_found_message (void *cls,
155{ 171{
156 struct GNUNET_MESSENGER_SrvTunnel *tunnel = tunnel; 172 struct GNUNET_MESSENGER_SrvTunnel *tunnel = tunnel;
157 173
158 if (!message) 174 if (! message)
159 { 175 {
160 struct GNUNET_MESSENGER_OperationStore *operation_store = get_srv_room_operation_store(room); 176 struct GNUNET_MESSENGER_OperationStore *operation_store =
161 177 get_srv_room_operation_store (room);
162 use_store_operation( 178
163 operation_store, 179 use_store_operation (
164 hash, 180 operation_store,
165 GNUNET_MESSENGER_OP_REQUEST, 181 hash,
166 GNUNET_MESSENGER_REQUEST_DELAY 182 GNUNET_MESSENGER_OP_REQUEST,
167 ); 183 GNUNET_MESSENGER_REQUEST_DELAY
184 );
168 } 185 }
169 else 186 else
170 forward_tunnel_message (tunnel, message, hash); 187 forward_tunnel_message (tunnel, message, hash);
171} 188}
172 189
190
173/* 191/*
174 * Function returns GNUNET_NO to drop forwarding the request. 192 * Function returns GNUNET_NO to drop forwarding the request.
175 * It will only be forwarded if it can't be answered! 193 * It will only be forwarded if it can't be answered!
@@ -180,20 +198,31 @@ recv_message_request (struct GNUNET_MESSENGER_SrvRoom *room,
180 const struct GNUNET_MESSENGER_Message *message, 198 const struct GNUNET_MESSENGER_Message *message,
181 const struct GNUNET_HashCode *hash) 199 const struct GNUNET_HashCode *hash)
182{ 200{
183 struct GNUNET_MESSENGER_MemberStore *member_store = get_srv_room_member_store(room); 201 struct GNUNET_MESSENGER_MemberStore *member_store =
184 struct GNUNET_MESSENGER_Member *member = get_store_member_of(member_store, message); 202 get_srv_room_member_store (room);
203 struct GNUNET_MESSENGER_Member *member = get_store_member_of (member_store,
204 message);
185 205
186 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Request for message (%s)\n", GNUNET_h2s (hash)); 206 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Request for message (%s)\n",
207 GNUNET_h2s (hash));
187 208
188 if (!member) 209 if (! member)
189 return GNUNET_NO; 210 return GNUNET_NO;
190 211
191 struct GNUNET_MESSENGER_MemberSession *session = get_member_session_of(member, message, hash); 212 struct GNUNET_MESSENGER_MemberSession *session = get_member_session_of (
213 member, message, hash);
192 214
193 if ((!session) || (GNUNET_YES != check_member_session_history(session, &(message->body.request.hash), GNUNET_NO))) 215 if ((! session) || (GNUNET_YES != check_member_session_history (session,
216 &(message->
217 body.request
218 .hash),
219 GNUNET_NO)))
194 return GNUNET_NO; 220 return GNUNET_NO;
195 221
196 if (GNUNET_NO == request_srv_room_message(room, &(message->body.request.hash), session, callback_found_message, tunnel)) 222 if (GNUNET_NO == request_srv_room_message (room,
223 &(message->body.request.hash),
224 session, callback_found_message,
225 tunnel))
197 return GNUNET_YES; 226 return GNUNET_YES;
198 227
199 return GNUNET_NO; 228 return GNUNET_NO;