summaryrefslogtreecommitdiff
path: root/toxcore/TCP_server.c
diff options
context:
space:
mode:
Diffstat (limited to 'toxcore/TCP_server.c')
-rw-r--r--toxcore/TCP_server.c94
1 files changed, 66 insertions, 28 deletions
diff --git a/toxcore/TCP_server.c b/toxcore/TCP_server.c
index 602d0000..df56f490 100644
--- a/toxcore/TCP_server.c
+++ b/toxcore/TCP_server.c
@@ -118,7 +118,7 @@ static uint16_t read_length(sock_t sock)
118 int count; 118 int count;
119 ioctl(sock, FIONREAD, &count); 119 ioctl(sock, FIONREAD, &count);
120 120
121 if (count >= sizeof(uint16_t)) { 121 if ((unsigned int)count >= sizeof(uint16_t)) {
122 uint16_t length; 122 uint16_t length;
123 int len = recv(sock, &length, sizeof(uint16_t), 0); 123 int len = recv(sock, &length, sizeof(uint16_t), 0);
124 124
@@ -169,7 +169,7 @@ static void kill_TCP_connection(TCP_Secure_Connection *con)
169 memset(con, 0, sizeof(TCP_Secure_Connection)); 169 memset(con, 0, sizeof(TCP_Secure_Connection));
170} 170}
171 171
172/* return 0 if everything went well. 172/* return 1 if everything went well.
173 * return -1 if the connection must be killed. 173 * return -1 if the connection must be killed.
174 */ 174 */
175static int handle_TCP_handshake(TCP_Secure_Connection *con, uint8_t *data, uint16_t length, uint8_t *self_secret_key) 175static int handle_TCP_handshake(TCP_Secure_Connection *con, uint8_t *data, uint16_t length, uint8_t *self_secret_key)
@@ -209,35 +209,23 @@ static int handle_TCP_handshake(TCP_Secure_Connection *con, uint8_t *data, uint1
209 209
210 encrypt_precompute(plain, temp_secret_key, con->shared_key); 210 encrypt_precompute(plain, temp_secret_key, con->shared_key);
211 con->status = TCP_STATUS_UNCONFIRMED; 211 con->status = TCP_STATUS_UNCONFIRMED;
212 return 0; 212 return 1;
213} 213}
214 214
215/* return 0 if everything went well. 215/* return 1 if connection handshake was handled correctly.
216 * return 0 if we didn't get it yet.
216 * return -1 if the connection must be killed. 217 * return -1 if the connection must be killed.
217 */ 218 */
218static int read_connection_handshake(TCP_Secure_Connection *con, uint8_t *self_secret_key) 219static int read_connection_handshake(TCP_Secure_Connection *con, uint8_t *self_secret_key)
219{ 220{
220 while (1) { 221 uint8_t data[TCP_CLIENT_HANDSHAKE_SIZE];
221 if (con->next_packet_length == 0) { 222 int len = 0;
222 uint16_t len = read_length(con->sock);
223
224 if (len == 0)
225 break;
226
227 if (len != TCP_CLIENT_HANDSHAKE_SIZE)
228 return -1;
229 223
230 con->next_packet_length = len; 224 if ((len = read_TCP_packet(con->sock, data, TCP_CLIENT_HANDSHAKE_SIZE)) != -1) {
231 } else { 225 return handle_TCP_handshake(con, data, len, self_secret_key);
232 uint8_t data[con->next_packet_length];
233
234 if (read_TCP_packet(con->sock, data, con->next_packet_length) != -1) {
235 return handle_TCP_handshake(con, data, con->next_packet_length, self_secret_key);
236 } else {
237 break;
238 }
239 }
240 } 226 }
227
228 return 0;
241} 229}
242 230
243/* return 1 on success 231/* return 1 on success
@@ -253,8 +241,17 @@ static int accept_connection(TCP_Server *TCP_server, sock_t sock)
253 return 0; 241 return 0;
254 } 242 }
255 243
256 printf("accepted %u\n", sock); 244 TCP_Secure_Connection *conn =
245 &TCP_server->incomming_connection_queue[TCP_server->incomming_connection_queue_index % MAX_INCOMMING_CONNECTIONS];
257 246
247 if (conn->status != TCP_STATUS_NO_STATUS)
248 kill_TCP_connection(conn);
249
250 conn->status = TCP_STATUS_CONNECTED;
251 conn->sock = sock;
252 conn->next_packet_length = 0;
253
254 ++TCP_server->incomming_connection_queue_index;
258 return 1; 255 return 1;
259} 256}
260 257
@@ -288,7 +285,7 @@ TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, uint16_t
288 if (num_sockets == 0 || ports == NULL) 285 if (num_sockets == 0 || ports == NULL)
289 return NULL; 286 return NULL;
290 287
291 TCP_Server *temp = calloc(1, sizeof(Networking_Core)); 288 TCP_Server *temp = calloc(1, sizeof(TCP_Server));
292 289
293 if (temp == NULL) 290 if (temp == NULL)
294 return NULL; 291 return NULL;
@@ -324,22 +321,63 @@ TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, uint16_t
324 return temp; 321 return temp;
325} 322}
326 323
327void do_TCP_server(TCP_Server *TCP_server) 324static void do_TCP_accept_new(TCP_Server *TCP_server)
328{ 325{
329 uint32_t i; 326 uint32_t i;
330 327
331 for (i = 0; i < TCP_server->num_listening_socks; ++i) { 328 for (i = 0; i < TCP_server->num_listening_socks; ++i) {
332 struct sockaddr_storage addr; 329 struct sockaddr_storage addr;
333 int addrlen = sizeof(addr); 330 unsigned int addrlen = sizeof(addr);
334 sock_t sock; 331 sock_t sock;
335 332
336 do { 333 do {
337 sock = accept(TCP_server->socks_listening[i], (struct sockaddr *)&addr, &addrlen); 334 sock = accept(TCP_server->socks_listening[i], (struct sockaddr *)&addr, &addrlen);
338 //TODO
339 } while (accept_connection(TCP_server, sock)); 335 } while (accept_connection(TCP_server, sock));
340 } 336 }
341} 337}
342 338
339static void do_TCP_incomming(TCP_Server *TCP_server)
340{
341 uint32_t i;
342
343 for (i = 0; i < MAX_INCOMMING_CONNECTIONS; ++i) {
344 if (TCP_server->incomming_connection_queue[i].status != TCP_STATUS_CONNECTED)
345 continue;
346
347 int ret = read_connection_handshake(&TCP_server->incomming_connection_queue[i], TCP_server->secret_key);
348
349 if (ret == -1) {
350 kill_TCP_connection(&TCP_server->incomming_connection_queue[i]);
351 } else if (ret == 1) {
352 TCP_Secure_Connection *conn_old = &TCP_server->incomming_connection_queue[i];
353 TCP_Secure_Connection *conn_new =
354 &TCP_server->unconfirmed_connection_queue[TCP_server->unconfirmed_connection_queue_index % MAX_INCOMMING_CONNECTIONS];
355
356 if (conn_new->status != TCP_STATUS_NO_STATUS)
357 kill_TCP_connection(conn_new);
358
359 memcpy(conn_new, conn_old, sizeof(TCP_Secure_Connection));
360 memset(conn_old, 0, sizeof(TCP_Secure_Connection));
361 ++TCP_server->unconfirmed_connection_queue_index;
362 }
363 }
364}
365
366static void do_TCP_unconfirmed(TCP_Server *TCP_server)
367{
368 uint32_t i;
369
370 for (i = 0; i < MAX_INCOMMING_CONNECTIONS; ++i) {
371 if (TCP_server->incomming_connection_queue[i].status != TCP_STATUS_CONNECTED)
372 continue;
373 }
374}
375void do_TCP_server(TCP_Server *TCP_server)
376{
377 do_TCP_accept_new(TCP_server);
378 do_TCP_incomming(TCP_server);
379}
380
343void kill_TCP_server(TCP_Server *TCP_server) 381void kill_TCP_server(TCP_Server *TCP_server)
344{ 382{
345 uint32_t i; 383 uint32_t i;