diff options
Diffstat (limited to 'toxcore/TCP_server.c')
-rw-r--r-- | toxcore/TCP_server.c | 94 |
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 | */ |
175 | static int handle_TCP_handshake(TCP_Secure_Connection *con, uint8_t *data, uint16_t length, uint8_t *self_secret_key) | 175 | static 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 | */ |
218 | static int read_connection_handshake(TCP_Secure_Connection *con, uint8_t *self_secret_key) | 219 | static 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 | ||
327 | void do_TCP_server(TCP_Server *TCP_server) | 324 | static 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 | ||
339 | static 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 | |||
366 | static 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 | } | ||
375 | void do_TCP_server(TCP_Server *TCP_server) | ||
376 | { | ||
377 | do_TCP_accept_new(TCP_server); | ||
378 | do_TCP_incomming(TCP_server); | ||
379 | } | ||
380 | |||
343 | void kill_TCP_server(TCP_Server *TCP_server) | 381 | void kill_TCP_server(TCP_Server *TCP_server) |
344 | { | 382 | { |
345 | uint32_t i; | 383 | uint32_t i; |