X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/dd7b74e90a96eaf109796d8f9499578571a1572c..c26e27d5b81ed5640c00ee87f1d4287fb066dc12:/test/src/server.c?ds=sidebyside diff --git a/test/src/server.c b/test/src/server.c index 4a48965e2..ba731625b 100644 --- a/test/src/server.c +++ b/test/src/server.c @@ -26,6 +26,7 @@ on all interfaces, unless the option -noipv6 is given. */ #include #include #include +#include #ifdef HAVE_NETINET_IP_VAR_H # include @@ -52,6 +53,7 @@ on all interfaces, unless the option -noipv6 is given. */ #ifndef CS # define CS (char *) +# define CCS (const char *) #endif @@ -168,7 +170,7 @@ int connection_count = 1; int count; int on = 1; int timeout = 5; -int initial_pause = 0; +int initial_pause = 0, tfo = 0; int use_ipv4 = 1; int use_ipv6 = 1; int debug = 0; @@ -213,6 +215,7 @@ if (argc > 1 && (!strcmp(argv[1], "--help") || !strcmp(argv[1], "-h"))) "\n\t-noipv6 disable ipv6" "\n\t-oP file write PID to file" "\n\t-t n n seconds timeout" + "\n\t-tfo enable TCP Fast Open" ); exit(0); } @@ -220,6 +223,7 @@ if (argc > 1 && (!strcmp(argv[1], "--help") || !strcmp(argv[1], "-h"))) while (na < argc && argv[na][0] == '-') { if (strcmp(argv[na], "-d") == 0) debug = 1; + else if (strcmp(argv[na], "-tfo") == 0) tfo = 1; else if (strcmp(argv[na], "-t") == 0) { if (tmo_noerror = ((timeout = atoi(argv[++na])) < 0)) timeout = -timeout; @@ -263,7 +267,7 @@ if (na < argc) connection_count = atoi(argv[na]); if (initial_pause > 0) { if (debug) - printf("%d: Inital pause of %d seconds\n", time(NULL), initial_pause); + printf("%ld: Inital pause of %d seconds\n", (long)time(NULL), initial_pause); else printf("Inital pause of %d seconds\n", initial_pause); while (initial_pause > 0) @@ -294,7 +298,15 @@ else printf("IPv6 socket creation failed: %s\n", strerror(errno)); exit(1); } - +#if defined(TCP_FASTOPEN) && !defined(__APPLE__) + if (tfo) + { + int backlog = 5; + if (setsockopt(listen_socket[v6n], IPPROTO_TCP, TCP_FASTOPEN, + &backlog, sizeof(backlog))) + if (debug) printf("setsockopt TCP_FASTOPEN: %s\n", strerror(errno)); + } +#endif /* If this is an IPv6 wildcard socket, set IPV6_V6ONLY if that option is available. */ @@ -318,6 +330,15 @@ else printf("IPv4 socket creation failed: %s\n", strerror(errno)); exit(1); } +#if defined(TCP_FASTOPEN) && !defined(__APPLE__) + if (tfo) + { + int backlog = 5; + if (setsockopt(listen_socket[v4n], IPPROTO_TCP, TCP_FASTOPEN, + &backlog, sizeof(backlog))) + if (debug) printf("setsockopt TCP_FASTOPEN: %s\n", strerror(errno)); + } +#endif } } @@ -380,7 +401,7 @@ else sin6.sin6_addr = anyaddr6; if (bind(listen_socket[i], (struct sockaddr *)&sin6, sizeof(sin6)) < 0) { - printf("IPv6 socket bind() failed: %s\n", strerror(errno)); + printf("IPv6 socket bind(port %d) failed: %s\n", port, strerror(errno)); exit(1); } } @@ -397,10 +418,9 @@ else sin4.sin_addr.s_addr = (S_ADDR_TYPE)INADDR_ANY; sin4.sin_port = htons(port); if (bind(listen_socket[i], (struct sockaddr *)&sin4, sizeof(sin4)) < 0) - { if (listen_socket[v6n] < 0 || errno != EADDRINUSE) { - printf("IPv4 socket bind() failed: %s\n", strerror(errno)); + printf("IPv4 socket bind(port %d) failed: %s\n", port, strerror(errno)); exit(1); } else @@ -408,7 +428,6 @@ else close(listen_socket[i]); listen_socket[i] = -1; } - } } } } @@ -419,16 +438,21 @@ error because it means that the IPv6 socket will handle IPv4 connections. Don't output anything, because it will mess up the test output, which will be different for systems that do this and those that don't. */ -for (i = 0; i <= skn; i++) +for (i = 0; i <= skn; i++) if (listen_socket[i] >= 0) { - if (listen_socket[i] >= 0 && listen(listen_socket[i], 5) < 0) - { + if (listen(listen_socket[i], 5) < 0) if (i != v4n || listen_socket[v6n] < 0 || errno != EADDRINUSE) { printf("listen() failed: %s\n", strerror(errno)); exit(1); } - } + +#if defined(TCP_FASTOPEN) && defined(__APPLE__) + if ( tfo + && setsockopt(listen_socket[v4n], IPPROTO_TCP, TCP_FASTOPEN, &on, sizeof(on)) + && debug) + printf("setsockopt TCP_FASTOPEN: %s\n", strerror(errno)); +#endif } @@ -662,7 +686,7 @@ for (count = 0; count < connection_count; count++) n = dlen < sizeof(buffer) ? dlen : sizeof(buffer); if ((n = read(dup_accept_socket, CS buffer, n)) == 0) { - printf("Unxpected EOF read from client\n"); + printf("Unexpected EOF read from client\n"); s = s->next; goto END_OFF; } @@ -672,7 +696,7 @@ for (count = 0; count < connection_count; count++) while (dlen-- > 0) if (fgetc(in) == EOF) { - printf("Unxpected EOF read from client\n"); + printf("Unexpected EOF read from client\n"); s = s->next; goto END_OFF; } @@ -728,7 +752,7 @@ for (count = 0; count < connection_count; count++) alarm(0); n += offset; - printit(buffer, n); + printit(CS buffer, n); if (data) do { @@ -774,8 +798,10 @@ for (count = 0; count < connection_count; count++) } } - if (sscanf(buffer, "