summaryrefslogtreecommitdiff
path: root/toxcore/TCP_server.c
diff options
context:
space:
mode:
authoriphydf <iphydf@users.noreply.github.com>2018-02-27 02:07:59 +0000
committeriphydf <iphydf@users.noreply.github.com>2018-05-20 15:42:42 +0000
commitbe797d4b039b40d2c876f0a71cd1e48454a74065 (patch)
treec759c0f15a3ac0285e0bd941dc3edad06ade015d /toxcore/TCP_server.c
parent291a849a5a0afb4450bcd0d0c50b7aeccaac04f5 (diff)
Move system header includes from network.h to network.c
Diffstat (limited to 'toxcore/TCP_server.c')
-rw-r--r--toxcore/TCP_server.c94
1 files changed, 43 insertions, 51 deletions
diff --git a/toxcore/TCP_server.c b/toxcore/TCP_server.c
index 4541fce0..28a441ad 100644
--- a/toxcore/TCP_server.c
+++ b/toxcore/TCP_server.c
@@ -27,12 +27,20 @@
27 27
28#include "TCP_server.h" 28#include "TCP_server.h"
29 29
30#include "util.h" 30#include <stdio.h>
31 31#include <stdlib.h>
32#include <string.h>
32#if !defined(_WIN32) && !defined(__WIN32__) && !defined (WIN32) 33#if !defined(_WIN32) && !defined(__WIN32__) && !defined (WIN32)
33#include <sys/ioctl.h> 34#include <sys/ioctl.h>
34#endif 35#endif
35 36
37#ifdef TCP_SERVER_USE_EPOLL
38#include <sys/epoll.h>
39#include <unistd.h>
40#endif
41
42#include "util.h"
43
36typedef struct TCP_Secure_Connection { 44typedef struct TCP_Secure_Connection {
37 Socket sock; 45 Socket sock;
38 uint8_t public_key[CRYPTO_PUBLIC_KEY_SIZE]; 46 uint8_t public_key[CRYPTO_PUBLIC_KEY_SIZE];
@@ -231,22 +239,6 @@ static int del_accepted(TCP_Server *TCP_server, int index)
231 return 0; 239 return 0;
232} 240}
233 241
234/* return the amount of data in the tcp recv buffer.
235 * return 0 on failure.
236 */
237unsigned int TCP_socket_data_recv_buffer(Socket sock)
238{
239#if defined(_WIN32) || defined(__WIN32__) || defined (WIN32)
240 unsigned long count = 0;
241 ioctlsocket(sock, FIONREAD, &count);
242#else
243 int count = 0;
244 ioctl(sock, FIONREAD, &count);
245#endif
246
247 return count;
248}
249
250/* Read the next two bytes in TCP stream then convert them to 242/* Read the next two bytes in TCP stream then convert them to
251 * length (host byte order). 243 * length (host byte order).
252 * 244 *
@@ -256,11 +248,11 @@ unsigned int TCP_socket_data_recv_buffer(Socket sock)
256 */ 248 */
257uint16_t read_TCP_length(Socket sock) 249uint16_t read_TCP_length(Socket sock)
258{ 250{
259 unsigned int count = TCP_socket_data_recv_buffer(sock); 251 const unsigned int count = net_socket_data_recv_buffer(sock);
260 252
261 if (count >= sizeof(uint16_t)) { 253 if (count >= sizeof(uint16_t)) {
262 uint16_t length; 254 uint16_t length;
263 int len = recv(sock, (char *)&length, sizeof(uint16_t), MSG_NOSIGNAL); 255 const int len = net_recv(sock, &length, sizeof(uint16_t));
264 256
265 if (len != sizeof(uint16_t)) { 257 if (len != sizeof(uint16_t)) {
266 fprintf(stderr, "FAIL recv packet\n"); 258 fprintf(stderr, "FAIL recv packet\n");
@@ -286,10 +278,10 @@ uint16_t read_TCP_length(Socket sock)
286 */ 278 */
287int read_TCP_packet(Socket sock, uint8_t *data, uint16_t length) 279int read_TCP_packet(Socket sock, uint8_t *data, uint16_t length)
288{ 280{
289 unsigned int count = TCP_socket_data_recv_buffer(sock); 281 unsigned int count = net_socket_data_recv_buffer(sock);
290 282
291 if (count >= length) { 283 if (count >= length) {
292 int len = recv(sock, (char *)data, length, MSG_NOSIGNAL); 284 const int len = net_recv(sock, data, length);
293 285
294 if (len != length) { 286 if (len != length) {
295 fprintf(stderr, "FAIL recv packet\n"); 287 fprintf(stderr, "FAIL recv packet\n");
@@ -356,8 +348,8 @@ static int send_pending_data_nonpriority(TCP_Secure_Connection *con)
356 return 0; 348 return 0;
357 } 349 }
358 350
359 uint16_t left = con->last_packet_length - con->last_packet_sent; 351 const uint16_t left = con->last_packet_length - con->last_packet_sent;
360 int len = send(con->sock, (const char *)(con->last_packet + con->last_packet_sent), left, MSG_NOSIGNAL); 352 const int len = net_send(con->sock, con->last_packet + con->last_packet_sent, left);
361 353
362 if (len <= 0) { 354 if (len <= 0) {
363 return -1; 355 return -1;
@@ -386,8 +378,8 @@ static int send_pending_data(TCP_Secure_Connection *con)
386 TCP_Priority_List *p = con->priority_queue_start; 378 TCP_Priority_List *p = con->priority_queue_start;
387 379
388 while (p) { 380 while (p) {
389 uint16_t left = p->size - p->sent; 381 const uint16_t left = p->size - p->sent;
390 int len = send(con->sock, (const char *)(p->data + p->sent), left, MSG_NOSIGNAL); 382 const int len = net_send(con->sock, p->data + p->sent, left);
391 383
392 if (len != left) { 384 if (len != left) {
393 if (len > 0) { 385 if (len > 0) {
@@ -462,7 +454,7 @@ static int write_packet_TCP_secure_connection(TCP_Secure_Connection *con, const
462 454
463 VLA(uint8_t, packet, sizeof(uint16_t) + length + CRYPTO_MAC_SIZE); 455 VLA(uint8_t, packet, sizeof(uint16_t) + length + CRYPTO_MAC_SIZE);
464 456
465 uint16_t c_length = net_htons(length + CRYPTO_MAC_SIZE); 457 const uint16_t c_length = net_htons(length + CRYPTO_MAC_SIZE);
466 memcpy(packet, &c_length, sizeof(uint16_t)); 458 memcpy(packet, &c_length, sizeof(uint16_t));
467 int len = encrypt_data_symmetric(con->shared_key, con->sent_nonce, data, length, packet + sizeof(uint16_t)); 459 int len = encrypt_data_symmetric(con->shared_key, con->sent_nonce, data, length, packet + sizeof(uint16_t));
468 460
@@ -471,7 +463,7 @@ static int write_packet_TCP_secure_connection(TCP_Secure_Connection *con, const
471 } 463 }
472 464
473 if (priority) { 465 if (priority) {
474 len = sendpriority ? send(con->sock, (const char *)packet, SIZEOF_VLA(packet), MSG_NOSIGNAL) : 0; 466 len = sendpriority ? net_send(con->sock, packet, SIZEOF_VLA(packet)) : 0;
475 467
476 if (len <= 0) { 468 if (len <= 0) {
477 len = 0; 469 len = 0;
@@ -486,7 +478,7 @@ static int write_packet_TCP_secure_connection(TCP_Secure_Connection *con, const
486 return add_priority(con, packet, SIZEOF_VLA(packet), len); 478 return add_priority(con, packet, SIZEOF_VLA(packet), len);
487 } 479 }
488 480
489 len = send(con->sock, (const char *)packet, SIZEOF_VLA(packet), MSG_NOSIGNAL); 481 len = net_send(con->sock, packet, SIZEOF_VLA(packet));
490 482
491 if (len <= 0) { 483 if (len <= 0) {
492 return 0; 484 return 0;
@@ -583,7 +575,7 @@ static int handle_TCP_handshake(TCP_Secure_Connection *con, const uint8_t *data,
583 return -1; 575 return -1;
584 } 576 }
585 577
586 if (TCP_SERVER_HANDSHAKE_SIZE != send(con->sock, (const char *)response, TCP_SERVER_HANDSHAKE_SIZE, MSG_NOSIGNAL)) { 578 if (TCP_SERVER_HANDSHAKE_SIZE != net_send(con->sock, response, TCP_SERVER_HANDSHAKE_SIZE)) {
587 return -1; 579 return -1;
588 } 580 }
589 581
@@ -1005,12 +997,12 @@ static int accept_connection(TCP_Server *TCP_server, Socket sock)
1005 return index; 997 return index;
1006} 998}
1007 999
1008static Socket new_listening_TCP_socket(int family, uint16_t port) 1000static Socket new_listening_TCP_socket(Family family, uint16_t port)
1009{ 1001{
1010 Socket sock = net_socket(family, TOX_SOCK_STREAM, TOX_PROTO_TCP); 1002 Socket sock = net_socket(family, TOX_SOCK_STREAM, TOX_PROTO_TCP);
1011 1003
1012 if (!sock_valid(sock)) { 1004 if (!sock_valid(sock)) {
1013 return ~0; 1005 return net_invalid_socket;
1014 } 1006 }
1015 1007
1016 int ok = set_socket_nonblock(sock); 1008 int ok = set_socket_nonblock(sock);
@@ -1023,11 +1015,11 @@ static Socket new_listening_TCP_socket(int family, uint16_t port)
1023 ok = set_socket_reuseaddr(sock); 1015 ok = set_socket_reuseaddr(sock);
1024 } 1016 }
1025 1017
1026 ok = ok && bind_to_port(sock, family, port) && (listen(sock, TCP_MAX_BACKLOG) == 0); 1018 ok = ok && bind_to_port(sock, family, port) && (net_listen(sock, TCP_MAX_BACKLOG) == 0);
1027 1019
1028 if (!ok) { 1020 if (!ok) {
1029 kill_sock(sock); 1021 kill_sock(sock);
1030 return ~0; 1022 return net_invalid_socket;
1031 } 1023 }
1032 1024
1033 return sock; 1025 return sock;
@@ -1087,9 +1079,9 @@ TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, const uin
1087 if (sock_valid(sock)) { 1079 if (sock_valid(sock)) {
1088#ifdef TCP_SERVER_USE_EPOLL 1080#ifdef TCP_SERVER_USE_EPOLL
1089 ev.events = EPOLLIN | EPOLLET; 1081 ev.events = EPOLLIN | EPOLLET;
1090 ev.data.u64 = sock | ((uint64_t)TCP_SOCKET_LISTENING << 32); 1082 ev.data.u64 = sock.socket | ((uint64_t)TCP_SOCKET_LISTENING << 32);
1091 1083
1092 if (epoll_ctl(temp->efd, EPOLL_CTL_ADD, sock, &ev) == -1) { 1084 if (epoll_ctl(temp->efd, EPOLL_CTL_ADD, sock.socket, &ev) == -1) {
1093 continue; 1085 continue;
1094 } 1086 }
1095 1087
@@ -1119,20 +1111,20 @@ TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, const uin
1119 return temp; 1111 return temp;
1120} 1112}
1121 1113
1114#ifndef TCP_SERVER_USE_EPOLL
1122static void do_TCP_accept_new(TCP_Server *TCP_server) 1115static void do_TCP_accept_new(TCP_Server *TCP_server)
1123{ 1116{
1124 uint32_t i; 1117 uint32_t i;
1125 1118
1126 for (i = 0; i < TCP_server->num_listening_socks; ++i) { 1119 for (i = 0; i < TCP_server->num_listening_socks; ++i) {
1127 struct sockaddr_storage addr;
1128 socklen_t addrlen = sizeof(addr);
1129 Socket sock; 1120 Socket sock;
1130 1121
1131 do { 1122 do {
1132 sock = accept(TCP_server->socks_listening[i], (struct sockaddr *)&addr, &addrlen); 1123 sock = net_accept(TCP_server->socks_listening[i]);
1133 } while (accept_connection(TCP_server, sock) != -1); 1124 } while (accept_connection(TCP_server, sock) != -1);
1134 } 1125 }
1135} 1126}
1127#endif
1136 1128
1137static int do_incoming(TCP_Server *TCP_server, uint32_t i) 1129static int do_incoming(TCP_Server *TCP_server, uint32_t i)
1138{ 1130{
@@ -1208,6 +1200,7 @@ static void do_confirmed_recv(TCP_Server *TCP_server, uint32_t i)
1208 } 1200 }
1209} 1201}
1210 1202
1203#ifndef TCP_SERVER_USE_EPOLL
1211static void do_TCP_incoming(TCP_Server *TCP_server) 1204static void do_TCP_incoming(TCP_Server *TCP_server)
1212{ 1205{
1213 uint32_t i; 1206 uint32_t i;
@@ -1225,6 +1218,7 @@ static void do_TCP_unconfirmed(TCP_Server *TCP_server)
1225 do_unconfirmed(TCP_server, i); 1218 do_unconfirmed(TCP_server, i);
1226 } 1219 }
1227} 1220}
1221#endif
1228 1222
1229static void do_TCP_confirmed(TCP_Server *TCP_server) 1223static void do_TCP_confirmed(TCP_Server *TCP_server)
1230{ 1224{
@@ -1294,8 +1288,9 @@ static void do_TCP_epoll(TCP_Server *TCP_server)
1294 int n; 1288 int n;
1295 1289
1296 for (n = 0; n < nfds; ++n) { 1290 for (n = 0; n < nfds; ++n) {
1297 Socket sock = events[n].data.u64 & 0xFFFFFFFF; 1291 const Socket sock = {(int)(events[n].data.u64 & 0xFFFFFFFF)};
1298 int status = (events[n].data.u64 >> 32) & 0xFF, index = (events[n].data.u64 >> 40); 1292 const int status = (events[n].data.u64 >> 32) & 0xFF;
1293 const int index = events[n].data.u64 >> 40;
1299 1294
1300 if ((events[n].events & EPOLLERR) || (events[n].events & EPOLLHUP) || (events[n].events & EPOLLRDHUP)) { 1295 if ((events[n].events & EPOLLERR) || (events[n].events & EPOLLHUP) || (events[n].events & EPOLLRDHUP)) {
1301 switch (status) { 1296 switch (status) {
@@ -1331,11 +1326,8 @@ static void do_TCP_epoll(TCP_Server *TCP_server)
1331 switch (status) { 1326 switch (status) {
1332 case TCP_SOCKET_LISTENING: { 1327 case TCP_SOCKET_LISTENING: {
1333 //socket is from socks_listening, accept connection 1328 //socket is from socks_listening, accept connection
1334 struct sockaddr_storage addr;
1335 socklen_t addrlen = sizeof(addr);
1336
1337 while (1) { 1329 while (1) {
1338 Socket sock_new = accept(sock, (struct sockaddr *)&addr, &addrlen); 1330 Socket sock_new = net_accept(sock);
1339 1331
1340 if (!sock_valid(sock_new)) { 1332 if (!sock_valid(sock_new)) {
1341 break; 1333 break;
@@ -1349,10 +1341,10 @@ static void do_TCP_epoll(TCP_Server *TCP_server)
1349 1341
1350 struct epoll_event ev = { 1342 struct epoll_event ev = {
1351 .events = EPOLLIN | EPOLLET | EPOLLRDHUP, 1343 .events = EPOLLIN | EPOLLET | EPOLLRDHUP,
1352 .data.u64 = sock_new | ((uint64_t)TCP_SOCKET_INCOMING << 32) | ((uint64_t)index_new << 40) 1344 .data.u64 = sock_new.socket | ((uint64_t)TCP_SOCKET_INCOMING << 32) | ((uint64_t)index_new << 40)
1353 }; 1345 };
1354 1346
1355 if (epoll_ctl(TCP_server->efd, EPOLL_CTL_ADD, sock_new, &ev) == -1) { 1347 if (epoll_ctl(TCP_server->efd, EPOLL_CTL_ADD, sock_new.socket, &ev) == -1) {
1356 kill_TCP_secure_connection(&TCP_server->incoming_connection_queue[index_new]); 1348 kill_TCP_secure_connection(&TCP_server->incoming_connection_queue[index_new]);
1357 continue; 1349 continue;
1358 } 1350 }
@@ -1366,9 +1358,9 @@ static void do_TCP_epoll(TCP_Server *TCP_server)
1366 1358
1367 if ((index_new = do_incoming(TCP_server, index)) != -1) { 1359 if ((index_new = do_incoming(TCP_server, index)) != -1) {
1368 events[n].events = EPOLLIN | EPOLLET | EPOLLRDHUP; 1360 events[n].events = EPOLLIN | EPOLLET | EPOLLRDHUP;
1369 events[n].data.u64 = sock | ((uint64_t)TCP_SOCKET_UNCONFIRMED << 32) | ((uint64_t)index_new << 40); 1361 events[n].data.u64 = sock.socket | ((uint64_t)TCP_SOCKET_UNCONFIRMED << 32) | ((uint64_t)index_new << 40);
1370 1362
1371 if (epoll_ctl(TCP_server->efd, EPOLL_CTL_MOD, sock, &events[n]) == -1) { 1363 if (epoll_ctl(TCP_server->efd, EPOLL_CTL_MOD, sock.socket, &events[n]) == -1) {
1372 kill_TCP_secure_connection(&TCP_server->unconfirmed_connection_queue[index_new]); 1364 kill_TCP_secure_connection(&TCP_server->unconfirmed_connection_queue[index_new]);
1373 break; 1365 break;
1374 } 1366 }
@@ -1382,9 +1374,9 @@ static void do_TCP_epoll(TCP_Server *TCP_server)
1382 1374
1383 if ((index_new = do_unconfirmed(TCP_server, index)) != -1) { 1375 if ((index_new = do_unconfirmed(TCP_server, index)) != -1) {
1384 events[n].events = EPOLLIN | EPOLLET | EPOLLRDHUP; 1376 events[n].events = EPOLLIN | EPOLLET | EPOLLRDHUP;
1385 events[n].data.u64 = sock | ((uint64_t)TCP_SOCKET_CONFIRMED << 32) | ((uint64_t)index_new << 40); 1377 events[n].data.u64 = sock.socket | ((uint64_t)TCP_SOCKET_CONFIRMED << 32) | ((uint64_t)index_new << 40);
1386 1378
1387 if (epoll_ctl(TCP_server->efd, EPOLL_CTL_MOD, sock, &events[n]) == -1) { 1379 if (epoll_ctl(TCP_server->efd, EPOLL_CTL_MOD, sock.socket, &events[n]) == -1) {
1388 //remove from confirmed connections 1380 //remove from confirmed connections
1389 kill_accepted(TCP_server, index_new); 1381 kill_accepted(TCP_server, index_new);
1390 break; 1382 break;