X-Git-Url: https://git.exim.org/users/jgh/exim.git/blobdiff_plain/dd7b74e90a96eaf109796d8f9499578571a1572c..611b1961b81552737ae9345dac12a3f1cd914212:/test/src/server.c diff --git a/test/src/server.c b/test/src/server.c index 4a48965e2..d433ebe0e 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; @@ -294,7 +298,15 @@ else printf("IPv6 socket creation failed: %s\n", strerror(errno)); exit(1); } - +#ifdef TCP_FASTOPEN + 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); } +#ifdef TCP_FASTOPEN + 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; } - } } } } @@ -662,7 +681,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 +691,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 +747,7 @@ for (count = 0; count < connection_count; count++) alarm(0); n += offset; - printit(buffer, n); + printit(CS buffer, n); if (data) do { @@ -774,8 +793,10 @@ for (count = 0; count < connection_count; count++) } } - if (sscanf(buffer, "