1 /* 2 * Copyright (c) 2014-2016 Oracle and/or its affiliates. All Rights Reserved. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License as 6 * published by the Free Software Foundation; either version 2 of 7 * the License, or (at your option) any later version. 8 * 9 * This program is distributed in the hope that it would be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <http://www.gnu.org/licenses/>. 16 * 17 * Author: Alexey Kodanev <alexey.kodanev (at) oracle.com> 18 * 19 */ 20 21 #include <pthread.h> 22 #include <stdlib.h> 23 #include <limits.h> 24 #include <linux/dccp.h> 25 #include <sys/types.h> 26 #include <sys/socket.h> 27 #include <netdb.h> 28 #include <netinet/in.h> 29 #include <netinet/tcp.h> 30 #include <arpa/inet.h> 31 #include <poll.h> 32 #include <time.h> 33 #include <string.h> 34 #include <unistd.h> 35 #include <errno.h> 36 37 #include "lapi/udp.h" 38 #include "lapi/dccp.h" 39 #include "lapi/netinet_in.h" 40 #include "lapi/posix_clocks.h" 41 #include "lapi/socket.h" 42 #include "lapi/tcp.h" 43 #include "tst_safe_stdio.h" 44 #include "tst_safe_pthread.h" 45 #include "tst_test.h" 46 47 static const int max_msg_len = (1 << 16) - 1; 48 static const int min_msg_len = 5; 49 50 enum { 51 SERVER_HOST = 0, 52 CLIENT_HOST, 53 }; 54 static char *client_mode; 55 56 enum { 57 TFO_DISABLED = 0, 58 TFO_ENABLED, 59 }; 60 static int tfo_value = -1; 61 static char *fastopen_api, *fastopen_sapi; 62 63 static const char tfo_cfg[] = "/proc/sys/net/ipv4/tcp_fastopen"; 64 static const char tcp_tw_reuse[] = "/proc/sys/net/ipv4/tcp_tw_reuse"; 65 static int tw_reuse_changed; 66 static int tfo_cfg_value; 67 static int tfo_cfg_changed; 68 static int tfo_queue_size = 100; 69 static int max_queue_len = 100; 70 static const int client_byte = 0x43; 71 static const int server_byte = 0x53; 72 static const int start_byte = 0x24; 73 static const int start_fin_byte = 0x25; 74 static const int end_byte = 0x0a; 75 static int init_cln_msg_len = 32; 76 static int init_srv_msg_len = 128; 77 static int max_rand_msg_len; 78 79 /* 80 * The number of requests from client after 81 * which server has to close the connection. 82 */ 83 static int server_max_requests = 3; 84 static int client_max_requests = 10; 85 static int clients_num; 86 static char *tcp_port; 87 static char *server_addr = "localhost"; 88 static char *source_addr; 89 static char *server_bg; 90 static int busy_poll = -1; 91 static int max_etime_cnt = 12; /* ~30 sec max timeout if no connection */ 92 static int max_pmtu_err = 10; 93 94 enum { 95 TYPE_TCP = 0, 96 TYPE_UDP, 97 TYPE_UDP_LITE, 98 TYPE_DCCP, 99 TYPE_SCTP 100 }; 101 static uint proto_type; 102 static char *type; 103 static char *dev; 104 static int sock_type = SOCK_STREAM; 105 static int protocol; 106 static int family = AF_INET6; 107 108 static uint32_t service_code = 0xffff; 109 110 /* server socket */ 111 static int sfd; 112 113 /* how long a client must wait for the server's reply */ 114 static int wait_timeout = 60000; 115 116 /* in the end test will save time result in this file */ 117 static char *rpath = "tfo_result"; 118 static char *port_path = "netstress_port"; 119 static char *log_path = "netstress.log"; 120 121 static char *narg, *Narg, *qarg, *rarg, *Rarg, *aarg, *Targ, *barg, *targ, 122 *Aarg; 123 124 /* common structure for TCP/UDP server and TCP/UDP client */ 125 struct net_func { 126 void (*init)(void); 127 void (*run)(void); 128 void (*cleanup)(void); 129 }; 130 static struct net_func net; 131 132 #define MAX_THREADS 10000 133 static pthread_attr_t attr; 134 static pthread_t *thread_ids; 135 136 static struct addrinfo *remote_addrinfo; 137 static struct addrinfo *local_addrinfo; 138 139 struct sock_info { 140 int fd; 141 struct sockaddr_storage raddr; 142 socklen_t raddr_len; 143 int etime_cnt; 144 int pmtu_err_cnt; 145 int timeout; 146 }; 147 148 static char *zcopy; 149 static int send_flags = MSG_NOSIGNAL; 150 151 static void init_socket_opts(int sd) 152 { 153 if (busy_poll >= 0) 154 SAFE_SETSOCKOPT_INT(sd, SOL_SOCKET, SO_BUSY_POLL, busy_poll); 155 156 if (dev) 157 SAFE_SETSOCKOPT(sd, SOL_SOCKET, SO_BINDTODEVICE, dev, 158 strlen(dev) + 1); 159 160 switch (proto_type) { 161 case TYPE_TCP: 162 if (client_mode && fastopen_sapi) { 163 SAFE_SETSOCKOPT_INT(sd, IPPROTO_TCP, 164 TCP_FASTOPEN_CONNECT, 1); 165 } 166 if (client_mode && zcopy) 167 SAFE_SETSOCKOPT_INT(sd, SOL_SOCKET, SO_ZEROCOPY, 1); 168 break; 169 case TYPE_DCCP: 170 SAFE_SETSOCKOPT_INT(sd, SOL_DCCP, DCCP_SOCKOPT_SERVICE, 171 service_code); 172 break; 173 case TYPE_UDP_LITE: { 174 int cscov = init_srv_msg_len >> 1; 175 176 if (cscov < 8) 177 cscov = 8; 178 tst_res(TINFO, "UDP-Lite send cscov is %d", cscov); 179 /* set checksum for header and partially for payload */ 180 SAFE_SETSOCKOPT_INT(sd, SOL_UDPLITE, UDPLITE_SEND_CSCOV, cscov); 181 SAFE_SETSOCKOPT_INT(sd, SOL_UDPLITE, UDPLITE_RECV_CSCOV, 8); 182 } break; 183 } 184 } 185 186 static void do_cleanup(void) 187 { 188 if (net.cleanup) 189 net.cleanup(); 190 191 if (tfo_cfg_changed) { 192 tst_res(TINFO, "unset '%s' back to '%d'", 193 tfo_cfg, tfo_cfg_value); 194 SAFE_FILE_PRINTF(tfo_cfg, "%d", tfo_cfg_value); 195 } 196 197 if (tw_reuse_changed) { 198 SAFE_FILE_PRINTF(tcp_tw_reuse, "0"); 199 tst_res(TINFO, "unset '%s' back to '0'", tcp_tw_reuse); 200 } 201 } 202 TST_DECLARE_ONCE_FN(cleanup, do_cleanup) 203 204 static int sock_recv_poll(char *buf, int size, struct sock_info *i) 205 { 206 struct pollfd pfd; 207 pfd.fd = i->fd; 208 pfd.events = POLLIN; 209 int len = -1; 210 211 while (1) { 212 errno = 0; 213 int ret = poll(&pfd, 1, i->timeout); 214 if (ret == -1) { 215 if (errno == EINTR) 216 continue; 217 break; 218 } 219 220 if (ret != 1) { 221 if (!errno) 222 errno = ETIME; 223 break; 224 } 225 226 if (!(pfd.revents & POLLIN)) { 227 if (pfd.revents & POLLERR) { 228 int err = 0; 229 socklen_t err_len = sizeof(err); 230 231 getsockopt(i->fd, SOL_SOCKET, SO_ERROR, 232 &err, &err_len); 233 if (!err) 234 continue; 235 errno = err; 236 } 237 break; 238 } 239 240 errno = 0; 241 len = recvfrom(i->fd, buf, size, MSG_DONTWAIT, 242 (struct sockaddr *)&i->raddr, 243 &i->raddr_len); 244 245 if (len == -1 && errno == EINTR) 246 continue; 247 248 if (len == 0) 249 errno = ESHUTDOWN; 250 251 break; 252 } 253 254 return len; 255 } 256 257 static int client_recv(char *buf, int srv_msg_len, struct sock_info *i) 258 { 259 int len, offset = 0; 260 261 while (1) { 262 errno = 0; 263 len = sock_recv_poll(buf + offset, srv_msg_len - offset, i); 264 265 /* socket closed or msg is not valid */ 266 if (len < 1 || (offset + len) > srv_msg_len || 267 (buf[0] != start_byte && buf[0] != start_fin_byte)) { 268 /* packet too big message, resend with new pmtu */ 269 if (errno == EMSGSIZE) { 270 if (++(i->pmtu_err_cnt) < max_pmtu_err) 271 return 0; 272 tst_brk(TFAIL, "too many pmtu errors %d", 273 i->pmtu_err_cnt); 274 } else if (!errno) { 275 errno = ENOMSG; 276 } 277 break; 278 } 279 offset += len; 280 if (buf[offset - 1] != end_byte) 281 continue; 282 283 /* recv last msg, close socket */ 284 if (buf[0] == start_fin_byte) 285 break; 286 return 0; 287 } 288 289 if (errno == ETIME && sock_type != SOCK_STREAM) { 290 if (++(i->etime_cnt) > max_etime_cnt) 291 tst_brk(TFAIL, "client requests timeout %d times, last timeout %dms", 292 i->etime_cnt, i->timeout); 293 /* Increase timeout in poll up to 3.2 sec */ 294 if (i->timeout < 3000) 295 i->timeout <<= 1; 296 return 0; 297 } 298 299 SAFE_CLOSE(i->fd); 300 return (errno) ? -1 : 0; 301 } 302 303 static int bind_no_port; 304 static void bind_before_connect(int sd) 305 { 306 if (!local_addrinfo) 307 return; 308 309 if (bind_no_port) 310 SAFE_SETSOCKOPT_INT(sd, SOL_IP, IP_BIND_ADDRESS_NO_PORT, 1); 311 312 SAFE_BIND(sd, local_addrinfo->ai_addr, local_addrinfo->ai_addrlen); 313 314 if (bind_no_port && proto_type != TYPE_SCTP) { 315 int port = TST_GETSOCKPORT(sd); 316 317 if (port) 318 tst_brk(TFAIL, "port not zero after bind(): %d", port); 319 } 320 } 321 322 static int client_connect_send(const char *msg, int size) 323 { 324 int cfd = SAFE_SOCKET(family, sock_type, protocol); 325 326 init_socket_opts(cfd); 327 328 if (fastopen_api) { 329 /* Replaces connect() + send()/write() */ 330 SAFE_SENDTO(1, cfd, msg, size, send_flags | MSG_FASTOPEN, 331 remote_addrinfo->ai_addr, remote_addrinfo->ai_addrlen); 332 } else { 333 bind_before_connect(cfd); 334 /* old TCP API */ 335 SAFE_CONNECT(cfd, remote_addrinfo->ai_addr, 336 remote_addrinfo->ai_addrlen); 337 SAFE_SEND(1, cfd, msg, size, send_flags); 338 } 339 return cfd; 340 } 341 342 union net_size_field { 343 char bytes[2]; 344 uint16_t value; 345 }; 346 347 static void make_client_request(char client_msg[], int *cln_len, int *srv_len) 348 { 349 if (max_rand_msg_len) 350 *cln_len = *srv_len = min_msg_len + rand() % max_rand_msg_len; 351 352 memset(client_msg, client_byte, *cln_len); 353 client_msg[0] = start_byte; 354 355 /* set size for reply */ 356 union net_size_field net_size; 357 358 net_size.value = htons(*srv_len); 359 client_msg[1] = net_size.bytes[0]; 360 client_msg[2] = net_size.bytes[1]; 361 362 client_msg[*cln_len - 1] = end_byte; 363 } 364 365 void *client_fn(LTP_ATTRIBUTE_UNUSED void *arg) 366 { 367 int cln_len = init_cln_msg_len, 368 srv_len = init_srv_msg_len; 369 struct sock_info inf; 370 char buf[max_msg_len]; 371 char client_msg[max_msg_len]; 372 int i = 0; 373 intptr_t err = 0; 374 375 inf.raddr_len = sizeof(inf.raddr); 376 inf.etime_cnt = 0; 377 inf.timeout = wait_timeout; 378 inf.pmtu_err_cnt = 0; 379 380 make_client_request(client_msg, &cln_len, &srv_len); 381 382 /* connect & send requests */ 383 inf.fd = client_connect_send(client_msg, cln_len); 384 if (inf.fd == -1) { 385 err = errno; 386 goto out; 387 } 388 389 if (client_recv(buf, srv_len, &inf)) { 390 err = errno; 391 goto out; 392 } 393 394 for (i = 1; i < client_max_requests; ++i) { 395 if (inf.fd == -1) { 396 inf.fd = client_connect_send(client_msg, cln_len); 397 if (inf.fd == -1) { 398 err = errno; 399 goto out; 400 } 401 402 if (client_recv(buf, srv_len, &inf)) { 403 err = errno; 404 break; 405 } 406 continue; 407 } 408 409 if (max_rand_msg_len) 410 make_client_request(client_msg, &cln_len, &srv_len); 411 412 SAFE_SEND(1, inf.fd, client_msg, cln_len, send_flags); 413 414 if (client_recv(buf, srv_len, &inf)) { 415 err = errno; 416 break; 417 } 418 } 419 420 if (inf.fd != -1) 421 SAFE_CLOSE(inf.fd); 422 423 out: 424 if (i != client_max_requests) 425 tst_res(TWARN, "client exit on '%d' request", i); 426 427 return (void *) err; 428 } 429 430 static int parse_client_request(const char *msg) 431 { 432 union net_size_field net_size; 433 net_size.bytes[0] = msg[1]; 434 net_size.bytes[1] = msg[2]; 435 int size = ntohs(net_size.value); 436 if (size < 2 || size > max_msg_len) 437 return -1; 438 439 return size; 440 } 441 442 static struct timespec tv_client_start; 443 static struct timespec tv_client_end; 444 445 static void setup_addrinfo(const char *src_addr, const char *port, 446 const struct addrinfo *hints, 447 struct addrinfo **addr_info) 448 { 449 int err = getaddrinfo(src_addr, port, hints, addr_info); 450 451 if (err) 452 tst_brk(TBROK, "getaddrinfo failed, %s", gai_strerror(err)); 453 454 if (!*addr_info) 455 tst_brk(TBROK, "failed to get the address"); 456 } 457 458 static void client_init(void) 459 { 460 if (clients_num >= MAX_THREADS) { 461 tst_brk(TBROK, "Unexpected num of clients '%d'", 462 clients_num); 463 } 464 465 thread_ids = SAFE_MALLOC(sizeof(pthread_t) * clients_num); 466 467 struct addrinfo hints; 468 memset(&hints, 0, sizeof(struct addrinfo)); 469 hints.ai_family = AF_UNSPEC; 470 hints.ai_socktype = sock_type; 471 hints.ai_flags = 0; 472 hints.ai_protocol = 0; 473 474 if (source_addr) 475 setup_addrinfo(source_addr, NULL, &hints, &local_addrinfo); 476 setup_addrinfo(server_addr, tcp_port, &hints, &remote_addrinfo); 477 478 tst_res(TINFO, "Running the test over IPv%s", 479 (remote_addrinfo->ai_family == AF_INET6) ? "6" : "4"); 480 481 family = remote_addrinfo->ai_family; 482 483 clock_gettime(CLOCK_MONOTONIC_RAW, &tv_client_start); 484 int i; 485 for (i = 0; i < clients_num; ++i) 486 SAFE_PTHREAD_CREATE(&thread_ids[i], 0, client_fn, NULL); 487 } 488 489 static void client_run(void) 490 { 491 void *res = NULL; 492 long clnt_time = 0; 493 int i; 494 for (i = 0; i < clients_num; ++i) { 495 pthread_join(thread_ids[i], &res); 496 if (res) { 497 tst_brk(TBROK, "client[%d] failed: %s", 498 i, strerror((intptr_t)res)); 499 } 500 } 501 502 clock_gettime(CLOCK_MONOTONIC_RAW, &tv_client_end); 503 clnt_time = (tv_client_end.tv_sec - tv_client_start.tv_sec) * 1000 + 504 (tv_client_end.tv_nsec - tv_client_start.tv_nsec) / 1000000; 505 506 tst_res(TINFO, "total time '%ld' ms", clnt_time); 507 508 char client_msg[min_msg_len]; 509 int msg_len = min_msg_len; 510 511 max_rand_msg_len = 0; 512 make_client_request(client_msg, &msg_len, &msg_len); 513 /* ask server to terminate */ 514 client_msg[0] = start_fin_byte; 515 int cfd = client_connect_send(client_msg, msg_len); 516 if (cfd != -1) { 517 shutdown(cfd, SHUT_WR); 518 SAFE_CLOSE(cfd); 519 } 520 /* the script tcp_fastopen_run.sh will remove it */ 521 SAFE_FILE_PRINTF(rpath, "%ld", clnt_time); 522 523 tst_res(TPASS, "test completed"); 524 } 525 526 static void client_cleanup(void) 527 { 528 free(thread_ids); 529 530 if (remote_addrinfo) 531 freeaddrinfo(remote_addrinfo); 532 } 533 534 static void make_server_reply(char *send_msg, int size) 535 { 536 memset(send_msg, server_byte, size - 1); 537 send_msg[0] = start_byte; 538 send_msg[size - 1] = end_byte; 539 } 540 541 void *server_fn(void *cfd) 542 { 543 int num_requests = 0, offset = 0; 544 char send_msg[max_msg_len], end[] = { end_byte }; 545 int start_send_type = (sock_type == SOCK_DGRAM) ? 1 : 0; 546 int send_msg_len, send_type = start_send_type; 547 char recv_msg[max_msg_len]; 548 struct sock_info inf; 549 ssize_t recv_len; 550 struct iovec iov[2]; 551 struct msghdr msg; 552 553 inf.fd = (intptr_t) cfd; 554 inf.raddr_len = sizeof(inf.raddr); 555 inf.timeout = wait_timeout; 556 557 iov[0].iov_base = send_msg; 558 iov[1].iov_base = end; 559 iov[1].iov_len = 1; 560 memset(&msg, 0, sizeof(msg)); 561 msg.msg_name = &inf.raddr; 562 msg.msg_iov = iov; 563 msg.msg_iovlen = 2; 564 565 init_socket_opts(inf.fd); 566 567 while (1) { 568 recv_len = sock_recv_poll(recv_msg + offset, 569 max_msg_len - offset, &inf); 570 571 if (recv_len == 0) 572 break; 573 574 if (recv_len < 0 || (offset + recv_len) > max_msg_len || 575 (recv_msg[0] != start_byte && 576 recv_msg[0] != start_fin_byte)) { 577 tst_res(TFAIL, "recv failed, sock '%d'", inf.fd); 578 goto out; 579 } 580 581 offset += recv_len; 582 583 if (recv_msg[offset - 1] != end_byte) { 584 /* msg is not complete, continue recv */ 585 continue; 586 } 587 588 /* client asks to terminate */ 589 if (recv_msg[0] == start_fin_byte) 590 goto out; 591 592 send_msg_len = parse_client_request(recv_msg); 593 if (send_msg_len < 0) { 594 tst_res(TFAIL, "wrong msg size '%d'", 595 send_msg_len); 596 goto out; 597 } 598 make_server_reply(send_msg, send_msg_len); 599 600 offset = 0; 601 602 /* 603 * It will tell client that server is going 604 * to close this connection. 605 */ 606 if (sock_type == SOCK_STREAM && 607 ++num_requests >= server_max_requests) 608 send_msg[0] = start_fin_byte; 609 610 switch (send_type) { 611 case 0: 612 SAFE_SEND(1, inf.fd, send_msg, send_msg_len, 613 send_flags); 614 if (proto_type != TYPE_SCTP) 615 ++send_type; 616 break; 617 case 1: 618 SAFE_SENDTO(1, inf.fd, send_msg, send_msg_len, 619 send_flags, (struct sockaddr *)&inf.raddr, 620 inf.raddr_len); 621 ++send_type; 622 break; 623 default: 624 iov[0].iov_len = send_msg_len - 1; 625 msg.msg_namelen = inf.raddr_len; 626 SAFE_SENDMSG(send_msg_len, inf.fd, &msg, send_flags); 627 send_type = start_send_type; 628 break; 629 } 630 631 if (sock_type == SOCK_STREAM && 632 num_requests >= server_max_requests) { 633 /* max reqs, close socket */ 634 shutdown(inf.fd, SHUT_WR); 635 break; 636 } 637 } 638 639 SAFE_CLOSE(inf.fd); 640 return NULL; 641 642 out: 643 SAFE_CLOSE(inf.fd); 644 tst_brk(TBROK, "Server closed"); 645 return NULL; 646 } 647 648 static pthread_t server_thread_add(intptr_t client_fd) 649 { 650 pthread_t id; 651 SAFE_PTHREAD_CREATE(&id, &attr, server_fn, (void *) client_fd); 652 return id; 653 } 654 655 static void server_init(void) 656 { 657 char *src_addr = NULL; 658 struct addrinfo hints; 659 660 memset(&hints, 0, sizeof(struct addrinfo)); 661 hints.ai_family = AF_INET6; 662 hints.ai_socktype = sock_type; 663 hints.ai_flags = AI_PASSIVE; 664 665 if (!source_addr && !tcp_port) 666 tcp_port = "0"; 667 668 if (source_addr && !strchr(source_addr, ':')) 669 SAFE_ASPRINTF(&src_addr, "::ffff:%s", source_addr); 670 setup_addrinfo(src_addr ? src_addr : source_addr, tcp_port, 671 &hints, &local_addrinfo); 672 free(src_addr); 673 674 /* IPv6 socket is also able to access IPv4 protocol stack */ 675 sfd = SAFE_SOCKET(family, sock_type, protocol); 676 SAFE_SETSOCKOPT_INT(sfd, SOL_SOCKET, SO_REUSEADDR, 1); 677 678 tst_res(TINFO, "assigning a name to the server socket..."); 679 SAFE_BIND(sfd, local_addrinfo->ai_addr, local_addrinfo->ai_addrlen); 680 681 freeaddrinfo(local_addrinfo); 682 683 int port = TST_GETSOCKPORT(sfd); 684 685 tst_res(TINFO, "bind to port %d", port); 686 if (server_bg) { 687 SAFE_CHDIR(server_bg); 688 SAFE_FILE_PRINTF(port_path, "%d", port); 689 } 690 691 if (sock_type == SOCK_DGRAM) 692 return; 693 694 init_socket_opts(sfd); 695 696 if (fastopen_api || fastopen_sapi) { 697 SAFE_SETSOCKOPT_INT(sfd, IPPROTO_TCP, TCP_FASTOPEN, 698 tfo_queue_size); 699 } 700 701 if (zcopy) 702 SAFE_SETSOCKOPT_INT(sfd, SOL_SOCKET, SO_ZEROCOPY, 1); 703 704 SAFE_LISTEN(sfd, max_queue_len); 705 706 tst_res(TINFO, "Listen on the socket '%d'", sfd); 707 } 708 709 static void server_cleanup(void) 710 { 711 SAFE_CLOSE(sfd); 712 } 713 714 static void move_to_background(void) 715 { 716 if (SAFE_FORK()) 717 exit(0); 718 719 SAFE_SETSID(); 720 721 close(STDIN_FILENO); 722 SAFE_OPEN("/dev/null", O_RDONLY); 723 close(STDOUT_FILENO); 724 close(STDERR_FILENO); 725 726 int fd = SAFE_OPEN(log_path, O_CREAT | O_TRUNC | O_RDONLY, 00444); 727 728 SAFE_DUP(fd); 729 } 730 731 static void server_run_udp(void) 732 { 733 if (server_bg) 734 move_to_background(); 735 736 pthread_t p_id = server_thread_add(sfd); 737 738 SAFE_PTHREAD_JOIN(p_id, NULL); 739 } 740 741 static void server_run(void) 742 { 743 if (server_bg) 744 move_to_background(); 745 746 /* IPv4 source address will be mapped to IPv6 address */ 747 struct sockaddr_in6 addr6; 748 socklen_t addr_size = sizeof(addr6); 749 750 pthread_attr_init(&attr); 751 752 /* 753 * detaching threads allow to reclaim thread's resources 754 * once a thread finishes its work. 755 */ 756 if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0) 757 tst_brk(TBROK | TERRNO, "setdetachstate failed"); 758 759 while (1) { 760 int client_fd = accept(sfd, (struct sockaddr *)&addr6, 761 &addr_size); 762 763 if (client_fd == -1) 764 tst_brk(TBROK, "Can't create client socket"); 765 766 server_thread_add(client_fd); 767 } 768 } 769 770 static void require_root(const char *file) 771 { 772 if (!geteuid()) 773 return; 774 tst_brk(TCONF, "Test needs to be run as root to change %s", file); 775 } 776 777 static void check_tfo_value(void) 778 { 779 /* Check if we can write to tcp_fastopen knob. We might be 780 * inside netns and either have read-only permission or 781 * doesn't have the knob at all. 782 */ 783 if (access(tfo_cfg, W_OK) < 0) { 784 /* TODO check /proc/self/ns/ or TST_USE_NETNS env var */ 785 tst_res(TINFO, "can't read %s, assume server runs in netns", 786 tfo_cfg); 787 return; 788 } 789 790 SAFE_FILE_SCANF(tfo_cfg, "%d", &tfo_cfg_value); 791 tst_res(TINFO, "'%s' is %d", tfo_cfg, tfo_cfg_value); 792 793 /* The check can be the first in this function but set here 794 * to allow to print information about the currently set config 795 */ 796 if (tfo_value < 0) 797 return; 798 799 if (tfo_cfg_value == tfo_value) 800 return; 801 802 require_root(tfo_cfg); 803 804 tst_res(TINFO, "set '%s' to '%d'", tfo_cfg, tfo_value); 805 806 SAFE_FILE_PRINTF(tfo_cfg, "%d", tfo_value); 807 tfo_cfg_changed = 1; 808 } 809 810 static void check_tw_reuse(void) 811 { 812 if (access(tcp_tw_reuse, W_OK) < 0) 813 return; 814 815 int reuse_value = 0; 816 817 SAFE_FILE_SCANF(tcp_tw_reuse, "%d", &reuse_value); 818 if (reuse_value) { 819 tst_res(TINFO, "tcp_tw_reuse is already set"); 820 return; 821 } 822 823 require_root(tfo_cfg); 824 825 SAFE_FILE_PRINTF(tcp_tw_reuse, "1"); 826 tw_reuse_changed = 1; 827 tst_res(TINFO, "set '%s' to '1'", tcp_tw_reuse); 828 } 829 830 static void set_protocol_type(void) 831 { 832 if (!type || !strcmp(type, "tcp")) 833 proto_type = TYPE_TCP; 834 else if (!strcmp(type, "udp")) 835 proto_type = TYPE_UDP; 836 else if (!strcmp(type, "udp_lite")) 837 proto_type = TYPE_UDP_LITE; 838 else if (!strcmp(type, "dccp")) 839 proto_type = TYPE_DCCP; 840 else if (!strcmp(type, "sctp")) 841 proto_type = TYPE_SCTP; 842 else 843 tst_brk(TBROK, "Invalid proto_type: '%s'", type); 844 } 845 846 static void setup(void) 847 { 848 if (tst_parse_int(aarg, &clients_num, 1, INT_MAX)) 849 tst_brk(TBROK, "Invalid client number '%s'", aarg); 850 if (tst_parse_int(rarg, &client_max_requests, 1, INT_MAX)) 851 tst_brk(TBROK, "Invalid client max requests '%s'", rarg); 852 if (tst_parse_int(Rarg, &server_max_requests, 1, INT_MAX)) 853 tst_brk(TBROK, "Invalid server max requests '%s'", Rarg); 854 if (tst_parse_int(narg, &init_cln_msg_len, min_msg_len, max_msg_len)) 855 tst_brk(TBROK, "Invalid client msg size '%s'", narg); 856 if (tst_parse_int(Narg, &init_srv_msg_len, min_msg_len, max_msg_len)) 857 tst_brk(TBROK, "Invalid server msg size '%s'", Narg); 858 if (tst_parse_int(qarg, &tfo_queue_size, 1, INT_MAX)) 859 tst_brk(TBROK, "Invalid TFO queue size '%s'", qarg); 860 if (tst_parse_int(Targ, &wait_timeout, 0, INT_MAX)) 861 tst_brk(TBROK, "Invalid wait timeout '%s'", Targ); 862 if (tst_parse_int(barg, &busy_poll, 0, INT_MAX)) 863 tst_brk(TBROK, "Invalid busy poll timeout'%s'", barg); 864 if (tst_parse_int(targ, &tfo_value, 0, INT_MAX)) 865 tst_brk(TBROK, "Invalid net.ipv4.tcp_fastopen '%s'", targ); 866 if (tst_parse_int(Aarg, &max_rand_msg_len, 10, max_msg_len)) 867 tst_brk(TBROK, "Invalid max random payload size '%s'", Aarg); 868 869 if (max_rand_msg_len) { 870 max_rand_msg_len -= min_msg_len; 871 unsigned int seed = max_rand_msg_len ^ client_max_requests; 872 873 srand(seed); 874 tst_res(TINFO, "srand() seed 0x%x", seed); 875 } 876 877 /* if client_num is not set, use num of processors */ 878 if (!clients_num) 879 clients_num = sysconf(_SC_NPROCESSORS_ONLN); 880 881 if (tfo_value > 0 && tst_kvercmp(3, 7, 0) < 0) 882 tst_brk(TCONF, "Test must be run with kernel 3.7 or newer"); 883 884 if (busy_poll >= 0 && tst_kvercmp(3, 11, 0) < 0) 885 tst_brk(TCONF, "Test must be run with kernel 3.11 or newer"); 886 887 set_protocol_type(); 888 889 if (client_mode) { 890 if (source_addr && tst_kvercmp(4, 2, 0) >= 0) { 891 bind_no_port = 1; 892 tst_res(TINFO, "IP_BIND_ADDRESS_NO_PORT is used"); 893 } 894 tst_res(TINFO, "connection: addr '%s', port '%s'", 895 server_addr, tcp_port); 896 tst_res(TINFO, "client max req: %d", client_max_requests); 897 tst_res(TINFO, "clients num: %d", clients_num); 898 if (max_rand_msg_len) { 899 tst_res(TINFO, "random msg size [%d %d]", 900 min_msg_len, max_rand_msg_len); 901 } else { 902 tst_res(TINFO, "client msg size: %d", init_cln_msg_len); 903 tst_res(TINFO, "server msg size: %d", init_srv_msg_len); 904 } 905 net.init = client_init; 906 net.run = client_run; 907 net.cleanup = client_cleanup; 908 909 switch (proto_type) { 910 case TYPE_TCP: 911 check_tw_reuse(); 912 break; 913 case TYPE_DCCP: 914 case TYPE_UDP: 915 case TYPE_UDP_LITE: 916 if (max_etime_cnt >= client_max_requests) 917 max_etime_cnt = client_max_requests - 1; 918 tst_res(TINFO, "maximum allowed timeout errors %d", max_etime_cnt); 919 wait_timeout = 100; 920 } 921 } else { 922 tst_res(TINFO, "max requests '%d'", 923 server_max_requests); 924 net.init = server_init; 925 switch (proto_type) { 926 case TYPE_TCP: 927 case TYPE_DCCP: 928 case TYPE_SCTP: 929 net.run = server_run; 930 net.cleanup = server_cleanup; 931 break; 932 case TYPE_UDP: 933 case TYPE_UDP_LITE: 934 net.run = server_run_udp; 935 net.cleanup = NULL; 936 break; 937 } 938 } 939 940 switch (proto_type) { 941 case TYPE_TCP: 942 tst_res(TINFO, "TCP %s is using %s TCP API.", 943 (client_mode) ? "client" : "server", 944 (fastopen_api) ? "Fastopen" : "old"); 945 if (zcopy) 946 send_flags |= MSG_ZEROCOPY; 947 check_tfo_value(); 948 break; 949 case TYPE_UDP: 950 tst_res(TINFO, "using UDP"); 951 fastopen_api = fastopen_sapi = NULL; 952 sock_type = SOCK_DGRAM; 953 break; 954 case TYPE_UDP_LITE: 955 tst_res(TINFO, "using UDP Lite"); 956 fastopen_api = fastopen_sapi = NULL; 957 sock_type = SOCK_DGRAM; 958 protocol = IPPROTO_UDPLITE; 959 break; 960 case TYPE_DCCP: { 961 /* dccp* modules can be blacklisted, load them manually */ 962 const char * const argv[] = {"modprobe", "dccp_ipv6", NULL}; 963 964 if (tst_run_cmd(argv, NULL, NULL, 1)) 965 tst_brk(TCONF, "Failed to load dccp_ipv6 module"); 966 967 tst_res(TINFO, "DCCP %s", (client_mode) ? "client" : "server"); 968 fastopen_api = fastopen_sapi = NULL; 969 sock_type = SOCK_DCCP; 970 protocol = IPPROTO_DCCP; 971 service_code = htonl(service_code); 972 } break; 973 case TYPE_SCTP: 974 tst_res(TINFO, "SCTP %s", (client_mode) ? "client" : "server"); 975 fastopen_api = fastopen_sapi = NULL; 976 protocol = IPPROTO_SCTP; 977 break; 978 } 979 980 net.init(); 981 } 982 983 static void do_test(void) 984 { 985 net.run(); 986 } 987 988 static struct tst_option options[] = { 989 {"f", &fastopen_api, "-f Use TFO API, default is old API"}, 990 {"F", &fastopen_sapi, 991 "-F TCP_FASTOPEN_CONNECT socket option and standard API"}, 992 {"t:", &targ, "-t x Set tcp_fastopen value"}, 993 994 {"S:", &source_addr, "-S x Source address to bind"}, 995 {"g:", &tcp_port, "-g x x - server port"}, 996 {"b:", &barg, "-b x x - low latency busy poll timeout"}, 997 {"T:", &type, "-T x tcp (default), udp, udp_lite, dccp, sctp"}, 998 {"z", &zcopy, "-z enable SO_ZEROCOPY"}, 999 {"D:", &dev, "-d x bind to device x\n"}, 1000 1001 {"H:", &server_addr, "Client:\n-H x Server name or IP address"}, 1002 {"l", &client_mode, "-l Become client, default is server"}, 1003 {"a:", &aarg, "-a x Number of clients running in parallel"}, 1004 {"r:", &rarg, "-r x Number of client requests"}, 1005 {"n:", &narg, "-n x Client message size"}, 1006 {"N:", &Narg, "-N x Server message size"}, 1007 {"m:", &Targ, "-m x Receive timeout in milliseconds (not used by UDP/DCCP client)"}, 1008 {"d:", &rpath, "-d x x is a path to file where result is saved"}, 1009 {"A:", &Aarg, "-A x x max payload length (generated randomly)\n"}, 1010 1011 {"R:", &Rarg, "Server:\n-R x x requests after which conn.closed"}, 1012 {"q:", &qarg, "-q x x - TFO queue"}, 1013 {"B:", &server_bg, "-B x run in background, x - process directory"}, 1014 {NULL, NULL, NULL} 1015 }; 1016 1017 static struct tst_test test = { 1018 .test_all = do_test, 1019 .forks_child = 1, 1020 .setup = setup, 1021 .cleanup = cleanup, 1022 .options = options 1023 }; 1024