File Index
Files and directories
Sign in
FILE

vsock_test.c

File preview with syntax highlighting.

linux-6.19.14/tools/testing/vsock/vsock_test.c C
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * vsock_test - vsock.ko test suite
   4 *
   5 * Copyright (C) 2017 Red Hat, Inc.
   6 *
   7 * Author: Stefan Hajnoczi <stefanha@redhat.com>
   8 */
   9
  10#include <getopt.h>
  11#include <stdio.h>
  12#include <stdlib.h>
  13#include <string.h>
  14#include <errno.h>
  15#include <unistd.h>
  16#include <linux/kernel.h>
  17#include <sys/types.h>
  18#include <sys/socket.h>
  19#include <time.h>
  20#include <sys/mman.h>
  21#include <poll.h>
  22#include <signal.h>
  23#include <sys/ioctl.h>
  24#include <linux/time64.h>
  25#include <pthread.h>
  26#include <fcntl.h>
  27#include <linux/sockios.h>
  28
  29#include "vsock_test_zerocopy.h"
  30#include "timeout.h"
  31#include "control.h"
  32#include "util.h"
  33
  34/* Basic messages for control_writeulong(), control_readulong() */
  35#define CONTROL_CONTINUE	1
  36#define CONTROL_DONE		0
  37
  38static void test_stream_connection_reset(const struct test_opts *opts)
  39{
  40	union {
  41		struct sockaddr sa;
  42		struct sockaddr_vm svm;
  43	} addr = {
  44		.svm = {
  45			.svm_family = AF_VSOCK,
  46			.svm_port = opts->peer_port,
  47			.svm_cid = opts->peer_cid,
  48		},
  49	};
  50	int ret;
  51	int fd;
  52
  53	fd = socket(AF_VSOCK, SOCK_STREAM, 0);
  54
  55	timeout_begin(TIMEOUT);
  56	do {
  57		ret = connect(fd, &addr.sa, sizeof(addr.svm));
  58		timeout_check("connect");
  59	} while (ret < 0 && errno == EINTR);
  60	timeout_end();
  61
  62	if (ret != -1) {
  63		fprintf(stderr, "expected connect(2) failure, got %d\n", ret);
  64		exit(EXIT_FAILURE);
  65	}
  66	if (errno != ECONNRESET) {
  67		fprintf(stderr, "unexpected connect(2) errno %d\n", errno);
  68		exit(EXIT_FAILURE);
  69	}
  70
  71	close(fd);
  72}
  73
  74static void test_stream_bind_only_client(const struct test_opts *opts)
  75{
  76	union {
  77		struct sockaddr sa;
  78		struct sockaddr_vm svm;
  79	} addr = {
  80		.svm = {
  81			.svm_family = AF_VSOCK,
  82			.svm_port = opts->peer_port,
  83			.svm_cid = opts->peer_cid,
  84		},
  85	};
  86	int ret;
  87	int fd;
  88
  89	/* Wait for the server to be ready */
  90	control_expectln("BIND");
  91
  92	fd = socket(AF_VSOCK, SOCK_STREAM, 0);
  93
  94	timeout_begin(TIMEOUT);
  95	do {
  96		ret = connect(fd, &addr.sa, sizeof(addr.svm));
  97		timeout_check("connect");
  98	} while (ret < 0 && errno == EINTR);
  99	timeout_end();
 100
 101	if (ret != -1) {
 102		fprintf(stderr, "expected connect(2) failure, got %d\n", ret);
 103		exit(EXIT_FAILURE);
 104	}
 105	if (errno != ECONNRESET) {
 106		fprintf(stderr, "unexpected connect(2) errno %d\n", errno);
 107		exit(EXIT_FAILURE);
 108	}
 109
 110	/* Notify the server that the client has finished */
 111	control_writeln("DONE");
 112
 113	close(fd);
 114}
 115
 116static void test_stream_bind_only_server(const struct test_opts *opts)
 117{
 118	int fd;
 119
 120	fd = vsock_bind(VMADDR_CID_ANY, opts->peer_port, SOCK_STREAM);
 121
 122	/* Notify the client that the server is ready */
 123	control_writeln("BIND");
 124
 125	/* Wait for the client to finish */
 126	control_expectln("DONE");
 127
 128	close(fd);
 129}
 130
 131static void test_stream_client_close_client(const struct test_opts *opts)
 132{
 133	int fd;
 134
 135	fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
 136	if (fd < 0) {
 137		perror("connect");
 138		exit(EXIT_FAILURE);
 139	}
 140
 141	send_byte(fd, 1, 0);
 142	close(fd);
 143}
 144
 145static void test_stream_client_close_server(const struct test_opts *opts)
 146{
 147	int fd;
 148
 149	fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
 150	if (fd < 0) {
 151		perror("accept");
 152		exit(EXIT_FAILURE);
 153	}
 154
 155	/* Wait for the remote to close the connection, before check
 156	 * -EPIPE error on send.
 157	 */
 158	vsock_wait_remote_close(fd);
 159
 160	send_byte(fd, -EPIPE, 0);
 161	recv_byte(fd, 1, 0);
 162	recv_byte(fd, 0, 0);
 163	close(fd);
 164}
 165
 166static void test_stream_server_close_client(const struct test_opts *opts)
 167{
 168	int fd;
 169
 170	fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
 171	if (fd < 0) {
 172		perror("connect");
 173		exit(EXIT_FAILURE);
 174	}
 175
 176	/* Wait for the remote to close the connection, before check
 177	 * -EPIPE error on send.
 178	 */
 179	vsock_wait_remote_close(fd);
 180
 181	send_byte(fd, -EPIPE, 0);
 182	recv_byte(fd, 1, 0);
 183	recv_byte(fd, 0, 0);
 184	close(fd);
 185}
 186
 187static void test_stream_server_close_server(const struct test_opts *opts)
 188{
 189	int fd;
 190
 191	fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
 192	if (fd < 0) {
 193		perror("accept");
 194		exit(EXIT_FAILURE);
 195	}
 196
 197	send_byte(fd, 1, 0);
 198	close(fd);
 199}
 200
 201/* With the standard socket sizes, VMCI is able to support about 100
 202 * concurrent stream connections.
 203 */
 204#define MULTICONN_NFDS 100
 205
 206static void test_stream_multiconn_client(const struct test_opts *opts)
 207{
 208	int fds[MULTICONN_NFDS];
 209	int i;
 210
 211	for (i = 0; i < MULTICONN_NFDS; i++) {
 212		fds[i] = vsock_stream_connect(opts->peer_cid, opts->peer_port);
 213		if (fds[i] < 0) {
 214			perror("connect");
 215			exit(EXIT_FAILURE);
 216		}
 217	}
 218
 219	for (i = 0; i < MULTICONN_NFDS; i++) {
 220		if (i % 2)
 221			recv_byte(fds[i], 1, 0);
 222		else
 223			send_byte(fds[i], 1, 0);
 224	}
 225
 226	for (i = 0; i < MULTICONN_NFDS; i++)
 227		close(fds[i]);
 228}
 229
 230static void test_stream_multiconn_server(const struct test_opts *opts)
 231{
 232	int fds[MULTICONN_NFDS];
 233	int i;
 234
 235	for (i = 0; i < MULTICONN_NFDS; i++) {
 236		fds[i] = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
 237		if (fds[i] < 0) {
 238			perror("accept");
 239			exit(EXIT_FAILURE);
 240		}
 241	}
 242
 243	for (i = 0; i < MULTICONN_NFDS; i++) {
 244		if (i % 2)
 245			send_byte(fds[i], 1, 0);
 246		else
 247			recv_byte(fds[i], 1, 0);
 248	}
 249
 250	for (i = 0; i < MULTICONN_NFDS; i++)
 251		close(fds[i]);
 252}
 253
 254#define MSG_PEEK_BUF_LEN 64
 255
 256static void test_msg_peek_client(const struct test_opts *opts,
 257				 bool seqpacket)
 258{
 259	unsigned char buf[MSG_PEEK_BUF_LEN];
 260	int fd;
 261	int i;
 262
 263	if (seqpacket)
 264		fd = vsock_seqpacket_connect(opts->peer_cid, opts->peer_port);
 265	else
 266		fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
 267
 268	if (fd < 0) {
 269		perror("connect");
 270		exit(EXIT_FAILURE);
 271	}
 272
 273	for (i = 0; i < sizeof(buf); i++)
 274		buf[i] = rand() & 0xFF;
 275
 276	control_expectln("SRVREADY");
 277
 278	send_buf(fd, buf, sizeof(buf), 0, sizeof(buf));
 279
 280	close(fd);
 281}
 282
 283static void test_msg_peek_server(const struct test_opts *opts,
 284				 bool seqpacket)
 285{
 286	unsigned char buf_half[MSG_PEEK_BUF_LEN / 2];
 287	unsigned char buf_normal[MSG_PEEK_BUF_LEN];
 288	unsigned char buf_peek[MSG_PEEK_BUF_LEN];
 289	int fd;
 290
 291	if (seqpacket)
 292		fd = vsock_seqpacket_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
 293	else
 294		fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
 295
 296	if (fd < 0) {
 297		perror("accept");
 298		exit(EXIT_FAILURE);
 299	}
 300
 301	/* Peek from empty socket. */
 302	recv_buf(fd, buf_peek, sizeof(buf_peek), MSG_PEEK | MSG_DONTWAIT,
 303		 -EAGAIN);
 304
 305	control_writeln("SRVREADY");
 306
 307	/* Peek part of data. */
 308	recv_buf(fd, buf_half, sizeof(buf_half), MSG_PEEK, sizeof(buf_half));
 309
 310	/* Peek whole data. */
 311	recv_buf(fd, buf_peek, sizeof(buf_peek), MSG_PEEK, sizeof(buf_peek));
 312
 313	/* Compare partial and full peek. */
 314	if (memcmp(buf_half, buf_peek, sizeof(buf_half))) {
 315		fprintf(stderr, "Partial peek data mismatch\n");
 316		exit(EXIT_FAILURE);
 317	}
 318
 319	if (seqpacket) {
 320		/* This type of socket supports MSG_TRUNC flag,
 321		 * so check it with MSG_PEEK. We must get length
 322		 * of the message.
 323		 */
 324		recv_buf(fd, buf_half, sizeof(buf_half), MSG_PEEK | MSG_TRUNC,
 325			 sizeof(buf_peek));
 326	}
 327
 328	recv_buf(fd, buf_normal, sizeof(buf_normal), 0, sizeof(buf_normal));
 329
 330	/* Compare full peek and normal read. */
 331	if (memcmp(buf_peek, buf_normal, sizeof(buf_peek))) {
 332		fprintf(stderr, "Full peek data mismatch\n");
 333		exit(EXIT_FAILURE);
 334	}
 335
 336	close(fd);
 337}
 338
 339static void test_stream_msg_peek_client(const struct test_opts *opts)
 340{
 341	return test_msg_peek_client(opts, false);
 342}
 343
 344static void test_stream_msg_peek_server(const struct test_opts *opts)
 345{
 346	return test_msg_peek_server(opts, false);
 347}
 348
 349#define SOCK_BUF_SIZE (2 * 1024 * 1024)
 350#define SOCK_BUF_SIZE_SMALL (64 * 1024)
 351#define MAX_MSG_PAGES 4
 352
 353static void test_seqpacket_msg_bounds_client(const struct test_opts *opts)
 354{
 355	unsigned long long sock_buf_size;
 356	unsigned long curr_hash;
 357	size_t max_msg_size;
 358	int page_size;
 359	int msg_count;
 360	int fd;
 361
 362	fd = vsock_seqpacket_connect(opts->peer_cid, opts->peer_port);
 363	if (fd < 0) {
 364		perror("connect");
 365		exit(EXIT_FAILURE);
 366	}
 367
 368	sock_buf_size = SOCK_BUF_SIZE;
 369
 370	setsockopt_ull_check(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_MAX_SIZE,
 371			     sock_buf_size,
 372			     "setsockopt(SO_VM_SOCKETS_BUFFER_MAX_SIZE)");
 373
 374	setsockopt_ull_check(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_SIZE,
 375			     sock_buf_size,
 376			     "setsockopt(SO_VM_SOCKETS_BUFFER_SIZE)");
 377
 378	/* Wait, until receiver sets buffer size. */
 379	control_expectln("SRVREADY");
 380
 381	curr_hash = 0;
 382	page_size = getpagesize();
 383	max_msg_size = MAX_MSG_PAGES * page_size;
 384	msg_count = SOCK_BUF_SIZE / max_msg_size;
 385
 386	for (int i = 0; i < msg_count; i++) {
 387		size_t buf_size;
 388		int flags;
 389		void *buf;
 390
 391		/* Use "small" buffers and "big" buffers. */
 392		if (i & 1)
 393			buf_size = page_size +
 394					(rand() % (max_msg_size - page_size));
 395		else
 396			buf_size = 1 + (rand() % page_size);
 397
 398		buf = malloc(buf_size);
 399
 400		if (!buf) {
 401			perror("malloc");
 402			exit(EXIT_FAILURE);
 403		}
 404
 405		memset(buf, rand() & 0xff, buf_size);
 406		/* Set at least one MSG_EOR + some random. */
 407		if (i == (msg_count / 2) || (rand() & 1)) {
 408			flags = MSG_EOR;
 409			curr_hash++;
 410		} else {
 411			flags = 0;
 412		}
 413
 414		send_buf(fd, buf, buf_size, flags, buf_size);
 415
 416		/*
 417		 * Hash sum is computed at both client and server in
 418		 * the same way:
 419		 * H += hash('message data')
 420		 * Such hash "controls" both data integrity and message
 421		 * bounds. After data exchange, both sums are compared
 422		 * using control socket, and if message bounds wasn't
 423		 * broken - two values must be equal.
 424		 */
 425		curr_hash += hash_djb2(buf, buf_size);
 426		free(buf);
 427	}
 428
 429	control_writeln("SENDDONE");
 430	control_writeulong(curr_hash);
 431	close(fd);
 432}
 433
 434static void test_seqpacket_msg_bounds_server(const struct test_opts *opts)
 435{
 436	unsigned long long sock_buf_size;
 437	unsigned long remote_hash;
 438	unsigned long curr_hash;
 439	int fd;
 440	struct msghdr msg = {0};
 441	struct iovec iov = {0};
 442
 443	fd = vsock_seqpacket_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
 444	if (fd < 0) {
 445		perror("accept");
 446		exit(EXIT_FAILURE);
 447	}
 448
 449	sock_buf_size = SOCK_BUF_SIZE;
 450
 451	setsockopt_ull_check(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_MAX_SIZE,
 452			     sock_buf_size,
 453			     "setsockopt(SO_VM_SOCKETS_BUFFER_MAX_SIZE)");
 454
 455	setsockopt_ull_check(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_SIZE,
 456			     sock_buf_size,
 457			     "setsockopt(SO_VM_SOCKETS_BUFFER_SIZE)");
 458
 459	/* Ready to receive data. */
 460	control_writeln("SRVREADY");
 461	/* Wait, until peer sends whole data. */
 462	control_expectln("SENDDONE");
 463	iov.iov_len = MAX_MSG_PAGES * getpagesize();
 464	iov.iov_base = malloc(iov.iov_len);
 465	if (!iov.iov_base) {
 466		perror("malloc");
 467		exit(EXIT_FAILURE);
 468	}
 469
 470	msg.msg_iov = &iov;
 471	msg.msg_iovlen = 1;
 472
 473	curr_hash = 0;
 474
 475	while (1) {
 476		ssize_t recv_size;
 477
 478		recv_size = recvmsg(fd, &msg, 0);
 479
 480		if (!recv_size)
 481			break;
 482
 483		if (recv_size < 0) {
 484			perror("recvmsg");
 485			exit(EXIT_FAILURE);
 486		}
 487
 488		if (msg.msg_flags & MSG_EOR)
 489			curr_hash++;
 490
 491		curr_hash += hash_djb2(msg.msg_iov[0].iov_base, recv_size);
 492	}
 493
 494	free(iov.iov_base);
 495	close(fd);
 496	remote_hash = control_readulong();
 497
 498	if (curr_hash != remote_hash) {
 499		fprintf(stderr, "Message bounds broken\n");
 500		exit(EXIT_FAILURE);
 501	}
 502}
 503
 504#define MESSAGE_TRUNC_SZ 32
 505static void test_seqpacket_msg_trunc_client(const struct test_opts *opts)
 506{
 507	int fd;
 508	char buf[MESSAGE_TRUNC_SZ];
 509
 510	fd = vsock_seqpacket_connect(opts->peer_cid, opts->peer_port);
 511	if (fd < 0) {
 512		perror("connect");
 513		exit(EXIT_FAILURE);
 514	}
 515
 516	send_buf(fd, buf, sizeof(buf), 0, sizeof(buf));
 517
 518	control_writeln("SENDDONE");
 519	close(fd);
 520}
 521
 522static void test_seqpacket_msg_trunc_server(const struct test_opts *opts)
 523{
 524	int fd;
 525	char buf[MESSAGE_TRUNC_SZ / 2];
 526	struct msghdr msg = {0};
 527	struct iovec iov = {0};
 528
 529	fd = vsock_seqpacket_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
 530	if (fd < 0) {
 531		perror("accept");
 532		exit(EXIT_FAILURE);
 533	}
 534
 535	control_expectln("SENDDONE");
 536	iov.iov_base = buf;
 537	iov.iov_len = sizeof(buf);
 538	msg.msg_iov = &iov;
 539	msg.msg_iovlen = 1;
 540
 541	ssize_t ret = recvmsg(fd, &msg, MSG_TRUNC);
 542
 543	if (ret != MESSAGE_TRUNC_SZ) {
 544		printf("%zi\n", ret);
 545		perror("MSG_TRUNC doesn't work");
 546		exit(EXIT_FAILURE);
 547	}
 548
 549	if (!(msg.msg_flags & MSG_TRUNC)) {
 550		fprintf(stderr, "MSG_TRUNC expected\n");
 551		exit(EXIT_FAILURE);
 552	}
 553
 554	close(fd);
 555}
 556
 557static time_t current_nsec(void)
 558{
 559	struct timespec ts;
 560
 561	if (clock_gettime(CLOCK_REALTIME, &ts)) {
 562		perror("clock_gettime(3) failed");
 563		exit(EXIT_FAILURE);
 564	}
 565
 566	return (ts.tv_sec * NSEC_PER_SEC) + ts.tv_nsec;
 567}
 568
 569#define RCVTIMEO_TIMEOUT_SEC 1
 570#define READ_OVERHEAD_NSEC 250000000 /* 0.25 sec */
 571
 572static void test_seqpacket_timeout_client(const struct test_opts *opts)
 573{
 574	int fd;
 575	struct timeval tv;
 576	char dummy;
 577	time_t read_enter_ns;
 578	time_t read_overhead_ns;
 579
 580	fd = vsock_seqpacket_connect(opts->peer_cid, opts->peer_port);
 581	if (fd < 0) {
 582		perror("connect");
 583		exit(EXIT_FAILURE);
 584	}
 585
 586	tv.tv_sec = RCVTIMEO_TIMEOUT_SEC;
 587	tv.tv_usec = 0;
 588
 589	setsockopt_timeval_check(fd, SOL_SOCKET, SO_RCVTIMEO, tv,
 590				 "setsockopt(SO_RCVTIMEO)");
 591
 592	read_enter_ns = current_nsec();
 593
 594	if (read(fd, &dummy, sizeof(dummy)) != -1) {
 595		fprintf(stderr,
 596			"expected 'dummy' read(2) failure\n");
 597		exit(EXIT_FAILURE);
 598	}
 599
 600	if (errno != EAGAIN) {
 601		perror("EAGAIN expected");
 602		exit(EXIT_FAILURE);
 603	}
 604
 605	read_overhead_ns = current_nsec() - read_enter_ns -
 606			   NSEC_PER_SEC * RCVTIMEO_TIMEOUT_SEC;
 607
 608	if (read_overhead_ns > READ_OVERHEAD_NSEC) {
 609		fprintf(stderr,
 610			"too much time in read(2), %lu > %i ns\n",
 611			read_overhead_ns, READ_OVERHEAD_NSEC);
 612		exit(EXIT_FAILURE);
 613	}
 614
 615	control_writeln("WAITDONE");
 616	close(fd);
 617}
 618
 619static void test_seqpacket_timeout_server(const struct test_opts *opts)
 620{
 621	int fd;
 622
 623	fd = vsock_seqpacket_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
 624	if (fd < 0) {
 625		perror("accept");
 626		exit(EXIT_FAILURE);
 627	}
 628
 629	control_expectln("WAITDONE");
 630	close(fd);
 631}
 632
 633static void test_seqpacket_bigmsg_client(const struct test_opts *opts)
 634{
 635	unsigned long long sock_buf_size;
 636	size_t buf_size;
 637	socklen_t len;
 638	void *data;
 639	int fd;
 640
 641	len = sizeof(sock_buf_size);
 642
 643	fd = vsock_seqpacket_connect(opts->peer_cid, opts->peer_port);
 644	if (fd < 0) {
 645		perror("connect");
 646		exit(EXIT_FAILURE);
 647	}
 648
 649	if (getsockopt(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_SIZE,
 650		       &sock_buf_size, &len)) {
 651		perror("getsockopt");
 652		exit(EXIT_FAILURE);
 653	}
 654
 655	sock_buf_size++;
 656
 657	/* size_t can be < unsigned long long */
 658	buf_size = (size_t)sock_buf_size;
 659	if (buf_size != sock_buf_size) {
 660		fprintf(stderr, "Returned BUFFER_SIZE too large\n");
 661		exit(EXIT_FAILURE);
 662	}
 663
 664	data = malloc(buf_size);
 665	if (!data) {
 666		perror("malloc");
 667		exit(EXIT_FAILURE);
 668	}
 669
 670	send_buf(fd, data, buf_size, 0, -EMSGSIZE);
 671
 672	control_writeln("CLISENT");
 673
 674	free(data);
 675	close(fd);
 676}
 677
 678static void test_seqpacket_bigmsg_server(const struct test_opts *opts)
 679{
 680	int fd;
 681
 682	fd = vsock_seqpacket_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
 683	if (fd < 0) {
 684		perror("accept");
 685		exit(EXIT_FAILURE);
 686	}
 687
 688	control_expectln("CLISENT");
 689
 690	close(fd);
 691}
 692
 693#define BUF_PATTERN_1 'a'
 694#define BUF_PATTERN_2 'b'
 695
 696static void test_seqpacket_invalid_rec_buffer_client(const struct test_opts *opts)
 697{
 698	int fd;
 699	unsigned char *buf1;
 700	unsigned char *buf2;
 701	int buf_size = getpagesize() * 3;
 702
 703	fd = vsock_seqpacket_connect(opts->peer_cid, opts->peer_port);
 704	if (fd < 0) {
 705		perror("connect");
 706		exit(EXIT_FAILURE);
 707	}
 708
 709	buf1 = malloc(buf_size);
 710	if (!buf1) {
 711		perror("'malloc()' for 'buf1'");
 712		exit(EXIT_FAILURE);
 713	}
 714
 715	buf2 = malloc(buf_size);
 716	if (!buf2) {
 717		perror("'malloc()' for 'buf2'");
 718		exit(EXIT_FAILURE);
 719	}
 720
 721	memset(buf1, BUF_PATTERN_1, buf_size);
 722	memset(buf2, BUF_PATTERN_2, buf_size);
 723
 724	send_buf(fd, buf1, buf_size, 0, buf_size);
 725
 726	send_buf(fd, buf2, buf_size, 0, buf_size);
 727
 728	close(fd);
 729}
 730
 731static void test_seqpacket_invalid_rec_buffer_server(const struct test_opts *opts)
 732{
 733	int fd;
 734	unsigned char *broken_buf;
 735	unsigned char *valid_buf;
 736	int page_size = getpagesize();
 737	int buf_size = page_size * 3;
 738	ssize_t res;
 739	int prot = PROT_READ | PROT_WRITE;
 740	int flags = MAP_PRIVATE | MAP_ANONYMOUS;
 741	int i;
 742
 743	fd = vsock_seqpacket_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
 744	if (fd < 0) {
 745		perror("accept");
 746		exit(EXIT_FAILURE);
 747	}
 748
 749	/* Setup first buffer. */
 750	broken_buf = mmap(NULL, buf_size, prot, flags, -1, 0);
 751	if (broken_buf == MAP_FAILED) {
 752		perror("mmap for 'broken_buf'");
 753		exit(EXIT_FAILURE);
 754	}
 755
 756	/* Unmap "hole" in buffer. */
 757	if (munmap(broken_buf + page_size, page_size)) {
 758		perror("'broken_buf' setup");
 759		exit(EXIT_FAILURE);
 760	}
 761
 762	valid_buf = mmap(NULL, buf_size, prot, flags, -1, 0);
 763	if (valid_buf == MAP_FAILED) {
 764		perror("mmap for 'valid_buf'");
 765		exit(EXIT_FAILURE);
 766	}
 767
 768	/* Try to fill buffer with unmapped middle. */
 769	res = read(fd, broken_buf, buf_size);
 770	if (res != -1) {
 771		fprintf(stderr,
 772			"expected 'broken_buf' read(2) failure, got %zi\n",
 773			res);
 774		exit(EXIT_FAILURE);
 775	}
 776
 777	if (errno != EFAULT) {
 778		perror("unexpected errno of 'broken_buf'");
 779		exit(EXIT_FAILURE);
 780	}
 781
 782	/* Try to fill valid buffer. */
 783	res = read(fd, valid_buf, buf_size);
 784	if (res < 0) {
 785		perror("unexpected 'valid_buf' read(2) failure");
 786		exit(EXIT_FAILURE);
 787	}
 788
 789	if (res != buf_size) {
 790		fprintf(stderr,
 791			"invalid 'valid_buf' read(2), expected %i, got %zi\n",
 792			buf_size, res);
 793		exit(EXIT_FAILURE);
 794	}
 795
 796	for (i = 0; i < buf_size; i++) {
 797		if (valid_buf[i] != BUF_PATTERN_2) {
 798			fprintf(stderr,
 799				"invalid pattern for 'valid_buf' at %i, expected %hhX, got %hhX\n",
 800				i, BUF_PATTERN_2, valid_buf[i]);
 801			exit(EXIT_FAILURE);
 802		}
 803	}
 804
 805	/* Unmap buffers. */
 806	munmap(broken_buf, page_size);
 807	munmap(broken_buf + page_size * 2, page_size);
 808	munmap(valid_buf, buf_size);
 809	close(fd);
 810}
 811
 812#define RCVLOWAT_BUF_SIZE 128
 813
 814static void test_stream_poll_rcvlowat_server(const struct test_opts *opts)
 815{
 816	int fd;
 817	int i;
 818
 819	fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
 820	if (fd < 0) {
 821		perror("accept");
 822		exit(EXIT_FAILURE);
 823	}
 824
 825	/* Send 1 byte. */
 826	send_byte(fd, 1, 0);
 827
 828	control_writeln("SRVSENT");
 829
 830	/* Wait until client is ready to receive rest of data. */
 831	control_expectln("CLNSENT");
 832
 833	for (i = 0; i < RCVLOWAT_BUF_SIZE - 1; i++)
 834		send_byte(fd, 1, 0);
 835
 836	/* Keep socket in active state. */
 837	control_expectln("POLLDONE");
 838
 839	close(fd);
 840}
 841
 842static void test_stream_poll_rcvlowat_client(const struct test_opts *opts)
 843{
 844	int lowat_val = RCVLOWAT_BUF_SIZE;
 845	char buf[RCVLOWAT_BUF_SIZE];
 846	struct pollfd fds;
 847	short poll_flags;
 848	int fd;
 849
 850	fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
 851	if (fd < 0) {
 852		perror("connect");
 853		exit(EXIT_FAILURE);
 854	}
 855
 856	setsockopt_int_check(fd, SOL_SOCKET, SO_RCVLOWAT,
 857			     lowat_val, "setsockopt(SO_RCVLOWAT)");
 858
 859	control_expectln("SRVSENT");
 860
 861	/* At this point, server sent 1 byte. */
 862	fds.fd = fd;
 863	poll_flags = POLLIN | POLLRDNORM;
 864	fds.events = poll_flags;
 865
 866	/* Try to wait for 1 sec. */
 867	if (poll(&fds, 1, 1000) < 0) {
 868		perror("poll");
 869		exit(EXIT_FAILURE);
 870	}
 871
 872	/* poll() must return nothing. */
 873	if (fds.revents) {
 874		fprintf(stderr, "Unexpected poll result %hx\n",
 875			fds.revents);
 876		exit(EXIT_FAILURE);
 877	}
 878
 879	/* Tell server to send rest of data. */
 880	control_writeln("CLNSENT");
 881
 882	/* Poll for data. */
 883	if (poll(&fds, 1, 10000) < 0) {
 884		perror("poll");
 885		exit(EXIT_FAILURE);
 886	}
 887
 888	/* Only these two bits are expected. */
 889	if (fds.revents != poll_flags) {
 890		fprintf(stderr, "Unexpected poll result %hx\n",
 891			fds.revents);
 892		exit(EXIT_FAILURE);
 893	}
 894
 895	/* Use MSG_DONTWAIT, if call is going to wait, EAGAIN
 896	 * will be returned.
 897	 */
 898	recv_buf(fd, buf, sizeof(buf), MSG_DONTWAIT, RCVLOWAT_BUF_SIZE);
 899
 900	control_writeln("POLLDONE");
 901
 902	close(fd);
 903}
 904
 905#define INV_BUF_TEST_DATA_LEN 512
 906
 907static void test_inv_buf_client(const struct test_opts *opts, bool stream)
 908{
 909	unsigned char data[INV_BUF_TEST_DATA_LEN] = {0};
 910	ssize_t expected_ret;
 911	int fd;
 912
 913	if (stream)
 914		fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
 915	else
 916		fd = vsock_seqpacket_connect(opts->peer_cid, opts->peer_port);
 917
 918	if (fd < 0) {
 919		perror("connect");
 920		exit(EXIT_FAILURE);
 921	}
 922
 923	control_expectln("SENDDONE");
 924
 925	/* Use invalid buffer here. */
 926	recv_buf(fd, NULL, sizeof(data), 0, -EFAULT);
 927
 928	if (stream) {
 929		/* For SOCK_STREAM we must continue reading. */
 930		expected_ret = sizeof(data);
 931	} else {
 932		/* For SOCK_SEQPACKET socket's queue must be empty. */
 933		expected_ret = -EAGAIN;
 934	}
 935
 936	recv_buf(fd, data, sizeof(data), MSG_DONTWAIT, expected_ret);
 937
 938	control_writeln("DONE");
 939
 940	close(fd);
 941}
 942
 943static void test_inv_buf_server(const struct test_opts *opts, bool stream)
 944{
 945	unsigned char data[INV_BUF_TEST_DATA_LEN] = {0};
 946	int fd;
 947
 948	if (stream)
 949		fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
 950	else
 951		fd = vsock_seqpacket_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
 952
 953	if (fd < 0) {
 954		perror("accept");
 955		exit(EXIT_FAILURE);
 956	}
 957
 958	send_buf(fd, data, sizeof(data), 0, sizeof(data));
 959
 960	control_writeln("SENDDONE");
 961
 962	control_expectln("DONE");
 963
 964	close(fd);
 965}
 966
 967static void test_stream_inv_buf_client(const struct test_opts *opts)
 968{
 969	test_inv_buf_client(opts, true);
 970}
 971
 972static void test_stream_inv_buf_server(const struct test_opts *opts)
 973{
 974	test_inv_buf_server(opts, true);
 975}
 976
 977static void test_seqpacket_inv_buf_client(const struct test_opts *opts)
 978{
 979	test_inv_buf_client(opts, false);
 980}
 981
 982static void test_seqpacket_inv_buf_server(const struct test_opts *opts)
 983{
 984	test_inv_buf_server(opts, false);
 985}
 986
 987#define HELLO_STR "HELLO"
 988#define WORLD_STR "WORLD"
 989
 990static void test_stream_virtio_skb_merge_client(const struct test_opts *opts)
 991{
 992	int fd;
 993
 994	fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
 995	if (fd < 0) {
 996		perror("connect");
 997		exit(EXIT_FAILURE);
 998	}
 999
1000	/* Send first skbuff. */
1001	send_buf(fd, HELLO_STR, strlen(HELLO_STR), 0, strlen(HELLO_STR));
1002
1003	control_writeln("SEND0");
1004	/* Peer reads part of first skbuff. */
1005	control_expectln("REPLY0");
1006
1007	/* Send second skbuff, it will be appended to the first. */
1008	send_buf(fd, WORLD_STR, strlen(WORLD_STR), 0, strlen(WORLD_STR));
1009
1010	control_writeln("SEND1");
1011	/* Peer reads merged skbuff packet. */
1012	control_expectln("REPLY1");
1013
1014	close(fd);
1015}
1016
1017static void test_stream_virtio_skb_merge_server(const struct test_opts *opts)
1018{
1019	size_t read = 0, to_read;
1020	unsigned char buf[64];
1021	int fd;
1022
1023	fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
1024	if (fd < 0) {
1025		perror("accept");
1026		exit(EXIT_FAILURE);
1027	}
1028
1029	control_expectln("SEND0");
1030
1031	/* Read skbuff partially. */
1032	to_read = 2;
1033	recv_buf(fd, buf + read, to_read, 0, to_read);
1034	read += to_read;
1035
1036	control_writeln("REPLY0");
1037	control_expectln("SEND1");
1038
1039	/* Read the rest of both buffers */
1040	to_read = strlen(HELLO_STR WORLD_STR) - read;
1041	recv_buf(fd, buf + read, to_read, 0, to_read);
1042	read += to_read;
1043
1044	/* No more bytes should be there */
1045	to_read = sizeof(buf) - read;
1046	recv_buf(fd, buf + read, to_read, MSG_DONTWAIT, -EAGAIN);
1047
1048	if (memcmp(buf, HELLO_STR WORLD_STR, strlen(HELLO_STR WORLD_STR))) {
1049		fprintf(stderr, "pattern mismatch\n");
1050		exit(EXIT_FAILURE);
1051	}
1052
1053	control_writeln("REPLY1");
1054
1055	close(fd);
1056}
1057
1058static void test_seqpacket_msg_peek_client(const struct test_opts *opts)
1059{
1060	return test_msg_peek_client(opts, true);
1061}
1062
1063static void test_seqpacket_msg_peek_server(const struct test_opts *opts)
1064{
1065	return test_msg_peek_server(opts, true);
1066}
1067
1068static sig_atomic_t have_sigpipe;
1069
1070static void sigpipe(int signo)
1071{
1072	have_sigpipe = 1;
1073}
1074
1075#define SEND_SLEEP_USEC (10 * 1000)
1076
1077static void test_stream_check_sigpipe(int fd)
1078{
1079	ssize_t res;
1080
1081	have_sigpipe = 0;
1082
1083	/* When the other peer calls shutdown(SHUT_RD), there is a chance that
1084	 * the send() call could occur before the message carrying the close
1085	 * information arrives over the transport. In such cases, the send()
1086	 * might still succeed. To avoid this race, let's retry the send() call
1087	 * a few times, ensuring the test is more reliable.
1088	 */
1089	timeout_begin(TIMEOUT);
1090	while(1) {
1091		res = send(fd, "A", 1, 0);
1092		if (res == -1 && errno != EINTR)
1093			break;
1094
1095		/* Sleep a little before trying again to avoid flooding the
1096		 * other peer and filling its receive buffer, causing
1097		 * false-negative.
1098		 */
1099		timeout_usleep(SEND_SLEEP_USEC);
1100		timeout_check("send");
1101	}
1102	timeout_end();
1103
1104	if (errno != EPIPE) {
1105		fprintf(stderr, "unexpected send(2) errno %d\n", errno);
1106		exit(EXIT_FAILURE);
1107	}
1108	if (!have_sigpipe) {
1109		fprintf(stderr, "SIGPIPE expected\n");
1110		exit(EXIT_FAILURE);
1111	}
1112
1113	have_sigpipe = 0;
1114
1115	timeout_begin(TIMEOUT);
1116	while(1) {
1117		res = send(fd, "A", 1, MSG_NOSIGNAL);
1118		if (res == -1 && errno != EINTR)
1119			break;
1120
1121		timeout_usleep(SEND_SLEEP_USEC);
1122		timeout_check("send");
1123	}
1124	timeout_end();
1125
1126	if (errno != EPIPE) {
1127		fprintf(stderr, "unexpected send(2) errno %d\n", errno);
1128		exit(EXIT_FAILURE);
1129	}
1130	if (have_sigpipe) {
1131		fprintf(stderr, "SIGPIPE not expected\n");
1132		exit(EXIT_FAILURE);
1133	}
1134}
1135
1136static void test_stream_shutwr_client(const struct test_opts *opts)
1137{
1138	int fd;
1139
1140	struct sigaction act = {
1141		.sa_handler = sigpipe,
1142	};
1143
1144	sigaction(SIGPIPE, &act, NULL);
1145
1146	fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
1147	if (fd < 0) {
1148		perror("connect");
1149		exit(EXIT_FAILURE);
1150	}
1151
1152	if (shutdown(fd, SHUT_WR)) {
1153		perror("shutdown");
1154		exit(EXIT_FAILURE);
1155	}
1156
1157	test_stream_check_sigpipe(fd);
1158
1159	control_writeln("CLIENTDONE");
1160
1161	close(fd);
1162}
1163
1164static void test_stream_shutwr_server(const struct test_opts *opts)
1165{
1166	int fd;
1167
1168	fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
1169	if (fd < 0) {
1170		perror("accept");
1171		exit(EXIT_FAILURE);
1172	}
1173
1174	control_expectln("CLIENTDONE");
1175
1176	close(fd);
1177}
1178
1179static void test_stream_shutrd_client(const struct test_opts *opts)
1180{
1181	int fd;
1182
1183	struct sigaction act = {
1184		.sa_handler = sigpipe,
1185	};
1186
1187	sigaction(SIGPIPE, &act, NULL);
1188
1189	fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
1190	if (fd < 0) {
1191		perror("connect");
1192		exit(EXIT_FAILURE);
1193	}
1194
1195	control_expectln("SHUTRDDONE");
1196
1197	test_stream_check_sigpipe(fd);
1198
1199	control_writeln("CLIENTDONE");
1200
1201	close(fd);
1202}
1203
1204static void test_stream_shutrd_server(const struct test_opts *opts)
1205{
1206	int fd;
1207
1208	fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
1209	if (fd < 0) {
1210		perror("accept");
1211		exit(EXIT_FAILURE);
1212	}
1213
1214	if (shutdown(fd, SHUT_RD)) {
1215		perror("shutdown");
1216		exit(EXIT_FAILURE);
1217	}
1218
1219	control_writeln("SHUTRDDONE");
1220	control_expectln("CLIENTDONE");
1221
1222	close(fd);
1223}
1224
1225static void test_double_bind_connect_server(const struct test_opts *opts)
1226{
1227	int listen_fd, client_fd, i;
1228	struct sockaddr_vm sa_client;
1229	socklen_t socklen_client = sizeof(sa_client);
1230
1231	listen_fd = vsock_stream_listen(VMADDR_CID_ANY, opts->peer_port);
1232
1233	for (i = 0; i < 2; i++) {
1234		control_writeln("LISTENING");
1235
1236		timeout_begin(TIMEOUT);
1237		do {
1238			client_fd = accept(listen_fd, (struct sockaddr *)&sa_client,
1239					   &socklen_client);
1240			timeout_check("accept");
1241		} while (client_fd < 0 && errno == EINTR);
1242		timeout_end();
1243
1244		if (client_fd < 0) {
1245			perror("accept");
1246			exit(EXIT_FAILURE);
1247		}
1248
1249		/* Waiting for remote peer to close connection */
1250		vsock_wait_remote_close(client_fd);
1251	}
1252
1253	close(listen_fd);
1254}
1255
1256static void test_double_bind_connect_client(const struct test_opts *opts)
1257{
1258	int i, client_fd;
1259
1260	for (i = 0; i < 2; i++) {
1261		/* Wait until server is ready to accept a new connection */
1262		control_expectln("LISTENING");
1263
1264		/* We use 'peer_port + 1' as "some" port for the 'bind()'
1265		 * call. It is safe for overflow, but must be considered,
1266		 * when running multiple test applications simultaneously
1267		 * where 'peer-port' argument differs by 1.
1268		 */
1269		client_fd = vsock_bind_connect(opts->peer_cid, opts->peer_port,
1270					       opts->peer_port + 1, SOCK_STREAM);
1271
1272		close(client_fd);
1273	}
1274}
1275
1276#define MSG_BUF_IOCTL_LEN 64
1277static void test_unsent_bytes_server(const struct test_opts *opts, int type)
1278{
1279	unsigned char buf[MSG_BUF_IOCTL_LEN];
1280	int client_fd;
1281
1282	client_fd = vsock_accept(VMADDR_CID_ANY, opts->peer_port, NULL, type);
1283	if (client_fd < 0) {
1284		perror("accept");
1285		exit(EXIT_FAILURE);
1286	}
1287
1288	recv_buf(client_fd, buf, sizeof(buf), 0, sizeof(buf));
1289	control_writeln("RECEIVED");
1290
1291	close(client_fd);
1292}
1293
1294static void test_unsent_bytes_client(const struct test_opts *opts, int type)
1295{
1296	unsigned char buf[MSG_BUF_IOCTL_LEN];
1297	int fd;
1298
1299	fd = vsock_connect(opts->peer_cid, opts->peer_port, type);
1300	if (fd < 0) {
1301		perror("connect");
1302		exit(EXIT_FAILURE);
1303	}
1304
1305	for (int i = 0; i < sizeof(buf); i++)
1306		buf[i] = rand() & 0xFF;
1307
1308	send_buf(fd, buf, sizeof(buf), 0, sizeof(buf));
1309	control_expectln("RECEIVED");
1310
1311	/* SIOCOUTQ isn't guaranteed to instantly track sent data. Even though
1312	 * the "RECEIVED" message means that the other side has received the
1313	 * data, there can be a delay in our kernel before updating the "unsent
1314	 * bytes" counter. vsock_wait_sent() will repeat SIOCOUTQ until it
1315	 * returns 0.
1316	 */
1317	if (!vsock_wait_sent(fd))
1318		fprintf(stderr, "Test skipped, SIOCOUTQ not supported.\n");
1319
1320	close(fd);
1321}
1322
1323static void test_unread_bytes_server(const struct test_opts *opts, int type)
1324{
1325	unsigned char buf[MSG_BUF_IOCTL_LEN];
1326	int client_fd;
1327
1328	client_fd = vsock_accept(VMADDR_CID_ANY, opts->peer_port, NULL, type);
1329	if (client_fd < 0) {
1330		perror("accept");
1331		exit(EXIT_FAILURE);
1332	}
1333
1334	for (int i = 0; i < sizeof(buf); i++)
1335		buf[i] = rand() & 0xFF;
1336
1337	send_buf(client_fd, buf, sizeof(buf), 0, sizeof(buf));
1338	control_writeln("SENT");
1339
1340	close(client_fd);
1341}
1342
1343static void test_unread_bytes_client(const struct test_opts *opts, int type)
1344{
1345	unsigned char buf[MSG_BUF_IOCTL_LEN];
1346	int fd;
1347
1348	fd = vsock_connect(opts->peer_cid, opts->peer_port, type);
1349	if (fd < 0) {
1350		perror("connect");
1351		exit(EXIT_FAILURE);
1352	}
1353
1354	control_expectln("SENT");
1355	/* The data has arrived but has not been read. The expected is
1356	 * MSG_BUF_IOCTL_LEN.
1357	 */
1358	if (!vsock_ioctl_int(fd, SIOCINQ, MSG_BUF_IOCTL_LEN)) {
1359		fprintf(stderr, "Test skipped, SIOCINQ not supported.\n");
1360		goto out;
1361	}
1362
1363	recv_buf(fd, buf, sizeof(buf), 0, sizeof(buf));
1364	/* All data has been consumed, so the expected is 0. */
1365	vsock_ioctl_int(fd, SIOCINQ, 0);
1366
1367out:
1368	close(fd);
1369}
1370
1371static void test_stream_unsent_bytes_client(const struct test_opts *opts)
1372{
1373	test_unsent_bytes_client(opts, SOCK_STREAM);
1374}
1375
1376static void test_stream_unsent_bytes_server(const struct test_opts *opts)
1377{
1378	test_unsent_bytes_server(opts, SOCK_STREAM);
1379}
1380
1381static void test_seqpacket_unsent_bytes_client(const struct test_opts *opts)
1382{
1383	test_unsent_bytes_client(opts, SOCK_SEQPACKET);
1384}
1385
1386static void test_seqpacket_unsent_bytes_server(const struct test_opts *opts)
1387{
1388	test_unsent_bytes_server(opts, SOCK_SEQPACKET);
1389}
1390
1391static void test_stream_unread_bytes_client(const struct test_opts *opts)
1392{
1393	test_unread_bytes_client(opts, SOCK_STREAM);
1394}
1395
1396static void test_stream_unread_bytes_server(const struct test_opts *opts)
1397{
1398	test_unread_bytes_server(opts, SOCK_STREAM);
1399}
1400
1401static void test_seqpacket_unread_bytes_client(const struct test_opts *opts)
1402{
1403	test_unread_bytes_client(opts, SOCK_SEQPACKET);
1404}
1405
1406static void test_seqpacket_unread_bytes_server(const struct test_opts *opts)
1407{
1408	test_unread_bytes_server(opts, SOCK_SEQPACKET);
1409}
1410
1411#define RCVLOWAT_CREDIT_UPD_BUF_SIZE	(1024 * 128)
1412/* This define is the same as in 'include/linux/virtio_vsock.h':
1413 * it is used to decide when to send credit update message during
1414 * reading from rx queue of a socket. Value and its usage in
1415 * kernel is important for this test.
1416 */
1417#define VIRTIO_VSOCK_MAX_PKT_BUF_SIZE	(1024 * 64)
1418
1419static void test_stream_rcvlowat_def_cred_upd_client(const struct test_opts *opts)
1420{
1421	size_t buf_size;
1422	void *buf;
1423	int fd;
1424
1425	fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
1426	if (fd < 0) {
1427		perror("connect");
1428		exit(EXIT_FAILURE);
1429	}
1430
1431	/* Send 1 byte more than peer's buffer size. */
1432	buf_size = RCVLOWAT_CREDIT_UPD_BUF_SIZE + 1;
1433
1434	buf = malloc(buf_size);
1435	if (!buf) {
1436		perror("malloc");
1437		exit(EXIT_FAILURE);
1438	}
1439
1440	/* Wait until peer sets needed buffer size. */
1441	recv_byte(fd, 1, 0);
1442
1443	if (send(fd, buf, buf_size, 0) != buf_size) {
1444		perror("send failed");
1445		exit(EXIT_FAILURE);
1446	}
1447
1448	free(buf);
1449	close(fd);
1450}
1451
1452static void test_stream_credit_update_test(const struct test_opts *opts,
1453					   bool low_rx_bytes_test)
1454{
1455	int recv_buf_size;
1456	struct pollfd fds;
1457	size_t buf_size;
1458	unsigned long long sock_buf_size;
1459	void *buf;
1460	int fd;
1461
1462	fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
1463	if (fd < 0) {
1464		perror("accept");
1465		exit(EXIT_FAILURE);
1466	}
1467
1468	buf_size = RCVLOWAT_CREDIT_UPD_BUF_SIZE;
1469
1470	/* size_t can be < unsigned long long */
1471	sock_buf_size = buf_size;
1472
1473	setsockopt_ull_check(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_SIZE,
1474			     sock_buf_size,
1475			     "setsockopt(SO_VM_SOCKETS_BUFFER_SIZE)");
1476
1477	if (low_rx_bytes_test) {
1478		/* Set new SO_RCVLOWAT here. This enables sending credit
1479		 * update when number of bytes if our rx queue become <
1480		 * SO_RCVLOWAT value.
1481		 */
1482		recv_buf_size = 1 + VIRTIO_VSOCK_MAX_PKT_BUF_SIZE;
1483
1484		setsockopt_int_check(fd, SOL_SOCKET, SO_RCVLOWAT,
1485				     recv_buf_size, "setsockopt(SO_RCVLOWAT)");
1486	}
1487
1488	/* Send one dummy byte here, because 'setsockopt()' above also
1489	 * sends special packet which tells sender to update our buffer
1490	 * size. This 'send_byte()' will serialize such packet with data
1491	 * reads in a loop below. Sender starts transmission only when
1492	 * it receives this single byte.
1493	 */
1494	send_byte(fd, 1, 0);
1495
1496	buf = malloc(buf_size);
1497	if (!buf) {
1498		perror("malloc");
1499		exit(EXIT_FAILURE);
1500	}
1501
1502	/* Wait until there will be 128KB of data in rx queue. */
1503	while (1) {
1504		ssize_t res;
1505
1506		res = recv(fd, buf, buf_size, MSG_PEEK);
1507		if (res == buf_size)
1508			break;
1509
1510		if (res <= 0) {
1511			fprintf(stderr, "unexpected 'recv()' return: %zi\n", res);
1512			exit(EXIT_FAILURE);
1513		}
1514	}
1515
1516	/* There is 128KB of data in the socket's rx queue, dequeue first
1517	 * 64KB, credit update is sent if 'low_rx_bytes_test' == true.
1518	 * Otherwise, credit update is sent in 'if (!low_rx_bytes_test)'.
1519	 */
1520	recv_buf_size = VIRTIO_VSOCK_MAX_PKT_BUF_SIZE;
1521	recv_buf(fd, buf, recv_buf_size, 0, recv_buf_size);
1522
1523	if (!low_rx_bytes_test) {
1524		recv_buf_size++;
1525
1526		/* Updating SO_RCVLOWAT will send credit update. */
1527		setsockopt_int_check(fd, SOL_SOCKET, SO_RCVLOWAT,
1528				     recv_buf_size, "setsockopt(SO_RCVLOWAT)");
1529	}
1530
1531	fds.fd = fd;
1532	fds.events = POLLIN | POLLRDNORM | POLLERR |
1533		     POLLRDHUP | POLLHUP;
1534
1535	/* This 'poll()' will return once we receive last byte
1536	 * sent by client.
1537	 */
1538	if (poll(&fds, 1, -1) < 0) {
1539		perror("poll");
1540		exit(EXIT_FAILURE);
1541	}
1542
1543	if (fds.revents & POLLERR) {
1544		fprintf(stderr, "'poll()' error\n");
1545		exit(EXIT_FAILURE);
1546	}
1547
1548	if (fds.revents & (POLLIN | POLLRDNORM)) {
1549		recv_buf(fd, buf, recv_buf_size, MSG_DONTWAIT, recv_buf_size);
1550	} else {
1551		/* These flags must be set, as there is at
1552		 * least 64KB of data ready to read.
1553		 */
1554		fprintf(stderr, "POLLIN | POLLRDNORM expected\n");
1555		exit(EXIT_FAILURE);
1556	}
1557
1558	free(buf);
1559	close(fd);
1560}
1561
1562static void test_stream_cred_upd_on_low_rx_bytes(const struct test_opts *opts)
1563{
1564	test_stream_credit_update_test(opts, true);
1565}
1566
1567static void test_stream_cred_upd_on_set_rcvlowat(const struct test_opts *opts)
1568{
1569	test_stream_credit_update_test(opts, false);
1570}
1571
1572/* The goal of test leak_acceptq is to stress the race between connect() and
1573 * close(listener). Implementation of client/server loops boils down to:
1574 *
1575 * client                server
1576 * ------                ------
1577 * write(CONTINUE)
1578 *                       expect(CONTINUE)
1579 *                       listen()
1580 *                       write(LISTENING)
1581 * expect(LISTENING)
1582 * connect()             close()
1583 */
1584#define ACCEPTQ_LEAK_RACE_TIMEOUT 2 /* seconds */
1585
1586static void test_stream_leak_acceptq_client(const struct test_opts *opts)
1587{
1588	time_t tout;
1589	int fd;
1590
1591	tout = current_nsec() + ACCEPTQ_LEAK_RACE_TIMEOUT * NSEC_PER_SEC;
1592	do {
1593		control_writeulong(CONTROL_CONTINUE);
1594
1595		fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
1596		if (fd >= 0)
1597			close(fd);
1598	} while (current_nsec() < tout);
1599
1600	control_writeulong(CONTROL_DONE);
1601}
1602
1603/* Test for a memory leak. User is expected to run kmemleak scan, see README. */
1604static void test_stream_leak_acceptq_server(const struct test_opts *opts)
1605{
1606	int fd;
1607
1608	while (control_readulong() == CONTROL_CONTINUE) {
1609		fd = vsock_stream_listen(VMADDR_CID_ANY, opts->peer_port);
1610		control_writeln("LISTENING");
1611		close(fd);
1612	}
1613}
1614
1615/* Test for a memory leak. User is expected to run kmemleak scan, see README. */
1616static void test_stream_msgzcopy_leak_errq_client(const struct test_opts *opts)
1617{
1618	struct pollfd fds = { 0 };
1619	int fd;
1620
1621	fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
1622	if (fd < 0) {
1623		perror("connect");
1624		exit(EXIT_FAILURE);
1625	}
1626
1627	enable_so_zerocopy_check(fd);
1628	send_byte(fd, 1, MSG_ZEROCOPY);
1629
1630	fds.fd = fd;
1631	fds.events = 0;
1632	if (poll(&fds, 1, -1) < 0) {
1633		perror("poll");
1634		exit(EXIT_FAILURE);
1635	}
1636
1637	close(fd);
1638}
1639
1640static void test_stream_msgzcopy_leak_errq_server(const struct test_opts *opts)
1641{
1642	int fd;
1643
1644	fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
1645	if (fd < 0) {
1646		perror("accept");
1647		exit(EXIT_FAILURE);
1648	}
1649
1650	recv_byte(fd, 1, 0);
1651	vsock_wait_remote_close(fd);
1652	close(fd);
1653}
1654
1655/* Test msgzcopy_leak_zcskb is meant to exercise sendmsg() error handling path,
1656 * that might leak an skb. The idea is to fail virtio_transport_init_zcopy_skb()
1657 * by hitting net.core.optmem_max limit in sock_omalloc(), specifically
1658 *
1659 *   vsock_connectible_sendmsg
1660 *     virtio_transport_stream_enqueue
1661 *       virtio_transport_send_pkt_info
1662 *         virtio_transport_init_zcopy_skb
1663 *         . msg_zerocopy_realloc
1664 *         .   msg_zerocopy_alloc
1665 *         .     sock_omalloc
1666 *         .       sk_omem_alloc + size > sysctl_optmem_max
1667 *         return -ENOMEM
1668 *
1669 * We abuse the implementation detail of net/socket.c:____sys_sendmsg().
1670 * sk_omem_alloc can be precisely bumped by sock_kmalloc(), as it is used to
1671 * fetch user-provided control data.
1672 *
1673 * While this approach works for now, it relies on assumptions regarding the
1674 * implementation and configuration (for example, order of net.core.optmem_max
1675 * can not exceed MAX_PAGE_ORDER), which may not hold in the future. A more
1676 * resilient testing could be implemented by leveraging the Fault injection
1677 * framework (CONFIG_FAULT_INJECTION), e.g.
1678 *
1679 *   client# echo N > /sys/kernel/debug/failslab/ignore-gfp-wait
1680 *   client# echo 0 > /sys/kernel/debug/failslab/verbose
1681 *
1682 *   void client(const struct test_opts *opts)
1683 *   {
1684 *       char buf[16];
1685 *       int f, s, i;
1686 *
1687 *       f = open("/proc/self/fail-nth", O_WRONLY);
1688 *
1689 *       for (i = 1; i < 32; i++) {
1690 *           control_writeulong(CONTROL_CONTINUE);
1691 *
1692 *           s = vsock_stream_connect(opts->peer_cid, opts->peer_port);
1693 *           enable_so_zerocopy_check(s);
1694 *
1695 *           sprintf(buf, "%d", i);
1696 *           write(f, buf, strlen(buf));
1697 *
1698 *           send(s, &(char){ 0 }, 1, MSG_ZEROCOPY);
1699 *
1700 *           write(f, "0", 1);
1701 *           close(s);
1702 *       }
1703 *
1704 *       control_writeulong(CONTROL_DONE);
1705 *       close(f);
1706 *   }
1707 *
1708 *   void server(const struct test_opts *opts)
1709 *   {
1710 *       int fd;
1711 *
1712 *       while (control_readulong() == CONTROL_CONTINUE) {
1713 *           fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
1714 *           vsock_wait_remote_close(fd);
1715 *           close(fd);
1716 *       }
1717 *   }
1718 *
1719 * Refer to Documentation/fault-injection/fault-injection.rst.
1720 */
1721#define MAX_PAGE_ORDER	10	/* usually */
1722#define PAGE_SIZE	4096
1723
1724/* Test for a memory leak. User is expected to run kmemleak scan, see README. */
1725static void test_stream_msgzcopy_leak_zcskb_client(const struct test_opts *opts)
1726{
1727	size_t optmem_max, ctl_len, chunk_size;
1728	struct msghdr msg = { 0 };
1729	struct iovec iov;
1730	char *chunk;
1731	int fd, res;
1732	FILE *f;
1733
1734	f = fopen("/proc/sys/net/core/optmem_max", "r");
1735	if (!f) {
1736		perror("fopen(optmem_max)");
1737		exit(EXIT_FAILURE);
1738	}
1739
1740	if (fscanf(f, "%zu", &optmem_max) != 1) {
1741		fprintf(stderr, "fscanf(optmem_max) failed\n");
1742		exit(EXIT_FAILURE);
1743	}
1744
1745	fclose(f);
1746
1747	fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
1748	if (fd < 0) {
1749		perror("connect");
1750		exit(EXIT_FAILURE);
1751	}
1752
1753	enable_so_zerocopy_check(fd);
1754
1755	ctl_len = optmem_max - 1;
1756	if (ctl_len > PAGE_SIZE << MAX_PAGE_ORDER) {
1757		fprintf(stderr, "Try with net.core.optmem_max = 100000\n");
1758		exit(EXIT_FAILURE);
1759	}
1760
1761	chunk_size = CMSG_SPACE(ctl_len);
1762	chunk = malloc(chunk_size);
1763	if (!chunk) {
1764		perror("malloc");
1765		exit(EXIT_FAILURE);
1766	}
1767	memset(chunk, 0, chunk_size);
1768
1769	iov.iov_base = &(char){ 0 };
1770	iov.iov_len = 1;
1771
1772	msg.msg_iov = &iov;
1773	msg.msg_iovlen = 1;
1774	msg.msg_control = chunk;
1775	msg.msg_controllen = ctl_len;
1776
1777	errno = 0;
1778	res = sendmsg(fd, &msg, MSG_ZEROCOPY);
1779	if (res >= 0 || errno != ENOMEM) {
1780		fprintf(stderr, "Expected ENOMEM, got errno=%d res=%d\n",
1781			errno, res);
1782		exit(EXIT_FAILURE);
1783	}
1784
1785	close(fd);
1786}
1787
1788static void test_stream_msgzcopy_leak_zcskb_server(const struct test_opts *opts)
1789{
1790	int fd;
1791
1792	fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
1793	if (fd < 0) {
1794		perror("accept");
1795		exit(EXIT_FAILURE);
1796	}
1797
1798	vsock_wait_remote_close(fd);
1799	close(fd);
1800}
1801
1802#define MAX_PORT_RETRIES	24	/* net/vmw_vsock/af_vsock.c */
1803
1804static bool test_stream_transport_uaf(int cid)
1805{
1806	int sockets[MAX_PORT_RETRIES];
1807	struct sockaddr_vm addr;
1808	socklen_t alen;
1809	int fd, i, c;
1810	bool ret;
1811
1812	/* Probe for a transport by attempting a local CID bind. Unavailable
1813	 * transport (or more specifically: an unsupported transport/CID
1814	 * combination) results in EADDRNOTAVAIL, other errnos are fatal.
1815	 */
1816	fd = vsock_bind_try(cid, VMADDR_PORT_ANY, SOCK_STREAM);
1817	if (fd < 0) {
1818		if (errno != EADDRNOTAVAIL) {
1819			perror("Unexpected bind() errno");
1820			exit(EXIT_FAILURE);
1821		}
1822
1823		return false;
1824	}
1825
1826	alen = sizeof(addr);
1827	if (getsockname(fd, (struct sockaddr *)&addr, &alen)) {
1828		perror("getsockname");
1829		exit(EXIT_FAILURE);
1830	}
1831
1832	/* Drain the autobind pool; see __vsock_bind_connectible(). */
1833	for (i = 0; i < MAX_PORT_RETRIES; ++i)
1834		sockets[i] = vsock_bind(cid, ++addr.svm_port, SOCK_STREAM);
1835
1836	close(fd);
1837
1838	/* Setting SOCK_NONBLOCK makes connect() return soon after
1839	 * (re-)assigning the transport. We are not connecting to anything
1840	 * anyway, so there is no point entering the main loop in
1841	 * vsock_connect(); waiting for timeout, checking for signals, etc.
1842	 */
1843	fd = socket(AF_VSOCK, SOCK_STREAM | SOCK_NONBLOCK, 0);
1844	if (fd < 0) {
1845		perror("socket");
1846		exit(EXIT_FAILURE);
1847	}
1848
1849	/* Assign transport, while failing to autobind. Autobind pool was
1850	 * drained, so EADDRNOTAVAIL coming from __vsock_bind_connectible() is
1851	 * expected.
1852	 *
1853	 * One exception is ENODEV which is thrown by vsock_assign_transport(),
1854	 * i.e. before vsock_auto_bind(), when the only transport loaded is
1855	 * vhost.
1856	 */
1857	if (!connect(fd, (struct sockaddr *)&addr, alen)) {
1858		fprintf(stderr, "Unexpected connect() success\n");
1859		exit(EXIT_FAILURE);
1860	}
1861	if (errno == ENODEV && cid == VMADDR_CID_HOST) {
1862		ret = false;
1863		goto cleanup;
1864	}
1865	if (errno != EADDRNOTAVAIL) {
1866		perror("Unexpected connect() errno");
1867		exit(EXIT_FAILURE);
1868	}
1869
1870	/* Reassign transport, triggering old transport release and
1871	 * (potentially) unbinding of an unbound socket.
1872	 *
1873	 * Vulnerable system may crash now.
1874	 */
1875	for (c = VMADDR_CID_HYPERVISOR; c <= VMADDR_CID_HOST + 1; ++c) {
1876		if (c != cid) {
1877			addr.svm_cid = c;
1878			(void)connect(fd, (struct sockaddr *)&addr, alen);
1879		}
1880	}
1881
1882	ret = true;
1883cleanup:
1884	close(fd);
1885	while (i--)
1886		close(sockets[i]);
1887
1888	return ret;
1889}
1890
1891/* Test attempts to trigger a transport release for an unbound socket. This can
1892 * lead to a reference count mishandling.
1893 */
1894static void test_stream_transport_uaf_client(const struct test_opts *opts)
1895{
1896	bool tested = false;
1897	int cid, tr;
1898
1899	for (cid = VMADDR_CID_HYPERVISOR; cid <= VMADDR_CID_HOST + 1; ++cid)
1900		tested |= test_stream_transport_uaf(cid);
1901
1902	tr = get_transports();
1903	if (!tr)
1904		fprintf(stderr, "No transports detected\n");
1905	else if (tr == TRANSPORT_VIRTIO)
1906		fprintf(stderr, "Setup unsupported: sole virtio transport\n");
1907	else if (!tested)
1908		fprintf(stderr, "No transports tested\n");
1909}
1910
1911static void test_stream_connect_retry_client(const struct test_opts *opts)
1912{
1913	int fd;
1914
1915	fd = socket(AF_VSOCK, SOCK_STREAM, 0);
1916	if (fd < 0) {
1917		perror("socket");
1918		exit(EXIT_FAILURE);
1919	}
1920
1921	if (!vsock_connect_fd(fd, opts->peer_cid, opts->peer_port)) {
1922		fprintf(stderr, "Unexpected connect() #1 success\n");
1923		exit(EXIT_FAILURE);
1924	}
1925
1926	control_writeln("LISTEN");
1927	control_expectln("LISTENING");
1928
1929	if (vsock_connect_fd(fd, opts->peer_cid, opts->peer_port)) {
1930		perror("connect() #2");
1931		exit(EXIT_FAILURE);
1932	}
1933
1934	close(fd);
1935}
1936
1937static void test_stream_connect_retry_server(const struct test_opts *opts)
1938{
1939	int fd;
1940
1941	control_expectln("LISTEN");
1942
1943	fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
1944	if (fd < 0) {
1945		perror("accept");
1946		exit(EXIT_FAILURE);
1947	}
1948
1949	vsock_wait_remote_close(fd);
1950	close(fd);
1951}
1952
1953#define TRANSPORT_CHANGE_TIMEOUT 2 /* seconds */
1954
1955static void *test_stream_transport_change_thread(void *vargp)
1956{
1957	pid_t *pid = (pid_t *)vargp;
1958	int ret;
1959
1960	ret = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
1961	if (ret) {
1962		fprintf(stderr, "pthread_setcanceltype: %d\n", ret);
1963		exit(EXIT_FAILURE);
1964	}
1965
1966	while (true) {
1967		if (kill(*pid, SIGUSR1) < 0) {
1968			perror("kill");
1969			exit(EXIT_FAILURE);
1970		}
1971	}
1972	return NULL;
1973}
1974
1975static void test_transport_change_signal_handler(int signal)
1976{
1977	/* We need a custom handler for SIGUSR1 as the default one terminates the process. */
1978}
1979
1980static void test_stream_transport_change_client(const struct test_opts *opts)
1981{
1982	__sighandler_t old_handler;
1983	pid_t pid = getpid();
1984	pthread_t thread_id;
1985	time_t tout;
1986	int ret, tr;
1987
1988	tr = get_transports();
1989
1990	/* Print a warning if there is a G2H transport loaded.
1991	 * This is on a best effort basis because VMCI can be either G2H and H2G, and there is
1992	 * no easy way to understand it.
1993	 * The bug we are testing only appears when G2H transports are not loaded.
1994	 * This is because `vsock_assign_transport`, when using CID 0, assigns a G2H transport
1995	 * to vsk->transport. If none is available it is set to NULL, causing the null-ptr-deref.
1996	 */
1997	if (tr & TRANSPORTS_G2H)
1998		fprintf(stderr, "G2H Transport detected. This test will not fail.\n");
1999
2000	old_handler = signal(SIGUSR1, test_transport_change_signal_handler);
2001	if (old_handler == SIG_ERR) {
2002		perror("signal");
2003		exit(EXIT_FAILURE);
2004	}
2005
2006	ret = pthread_create(&thread_id, NULL, test_stream_transport_change_thread, &pid);
2007	if (ret) {
2008		fprintf(stderr, "pthread_create: %d\n", ret);
2009		exit(EXIT_FAILURE);
2010	}
2011
2012	control_expectln("LISTENING");
2013
2014	tout = current_nsec() + TRANSPORT_CHANGE_TIMEOUT * NSEC_PER_SEC;
2015	do {
2016		struct sockaddr_vm sa = {
2017			.svm_family = AF_VSOCK,
2018			.svm_cid = opts->peer_cid,
2019			.svm_port = opts->peer_port,
2020		};
2021		bool send_control = false;
2022		int s;
2023
2024		s = socket(AF_VSOCK, SOCK_STREAM, 0);
2025		if (s < 0) {
2026			perror("socket");
2027			exit(EXIT_FAILURE);
2028		}
2029
2030		/* Although setting SO_LINGER does not affect the original test
2031		 * for null-ptr-deref, it may trigger a lockdep warning.
2032		 */
2033		enable_so_linger(s, 1);
2034
2035		ret = connect(s, (struct sockaddr *)&sa, sizeof(sa));
2036		/* The connect can fail due to signals coming from the thread,
2037		 * or because the receiver connection queue is full.
2038		 * Ignoring also the latter case because there is no way
2039		 * of synchronizing client's connect and server's accept when
2040		 * connect(s) are constantly being interrupted by signals.
2041		 */
2042		if (ret == -1 && (errno != EINTR && errno != ECONNRESET)) {
2043			perror("connect");
2044			exit(EXIT_FAILURE);
2045		}
2046
2047		/* Notify the server if the connect() is successful or the
2048		 * receiver connection queue is full, so it will do accept()
2049		 * to drain it.
2050		 */
2051		if (!ret || errno == ECONNRESET)
2052			send_control = true;
2053
2054		/* Set CID to 0 cause a transport change. */
2055		sa.svm_cid = 0;
2056
2057		/* There is a case where this will not fail:
2058		 * if the previous connect() is interrupted while the
2059		 * connection request is already sent, this second
2060		 * connect() will wait for the response.
2061		 */
2062		ret = connect(s, (struct sockaddr *)&sa, sizeof(sa));
2063		if (!ret || errno == ECONNRESET)
2064			send_control = true;
2065
2066		close(s);
2067
2068		if (send_control)
2069			control_writeulong(CONTROL_CONTINUE);
2070
2071	} while (current_nsec() < tout);
2072
2073	control_writeulong(CONTROL_DONE);
2074
2075	ret = pthread_cancel(thread_id);
2076	if (ret) {
2077		fprintf(stderr, "pthread_cancel: %d\n", ret);
2078		exit(EXIT_FAILURE);
2079	}
2080
2081	ret = pthread_join(thread_id, NULL);
2082	if (ret) {
2083		fprintf(stderr, "pthread_join: %d\n", ret);
2084		exit(EXIT_FAILURE);
2085	}
2086
2087	if (signal(SIGUSR1, old_handler) == SIG_ERR) {
2088		perror("signal");
2089		exit(EXIT_FAILURE);
2090	}
2091}
2092
2093static void test_stream_transport_change_server(const struct test_opts *opts)
2094{
2095	int s = vsock_stream_listen(VMADDR_CID_ANY, opts->peer_port);
2096
2097	/* Set the socket to be nonblocking because connects that have been interrupted
2098	 * (EINTR) can fill the receiver's accept queue anyway, leading to connect failure.
2099	 * As of today (6.15) in such situation there is no way to understand, from the
2100	 * client side, if the connection has been queued in the server or not.
2101	 */
2102	if (fcntl(s, F_SETFL, fcntl(s, F_GETFL, 0) | O_NONBLOCK) < 0) {
2103		perror("fcntl");
2104		exit(EXIT_FAILURE);
2105	}
2106	control_writeln("LISTENING");
2107
2108	while (control_readulong() == CONTROL_CONTINUE) {
2109		/* Must accept the connection, otherwise the `listen`
2110		 * queue will fill up and new connections will fail.
2111		 * There can be more than one queued connection,
2112		 * clear them all.
2113		 */
2114		while (true) {
2115			int client = accept(s, NULL, NULL);
2116
2117			if (client < 0) {
2118				if (errno == EAGAIN)
2119					break;
2120
2121				perror("accept");
2122				exit(EXIT_FAILURE);
2123			}
2124
2125			close(client);
2126		}
2127	}
2128
2129	close(s);
2130}
2131
2132static void test_stream_linger_client(const struct test_opts *opts)
2133{
2134	int fd;
2135
2136	fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
2137	if (fd < 0) {
2138		perror("connect");
2139		exit(EXIT_FAILURE);
2140	}
2141
2142	enable_so_linger(fd, 1);
2143	close(fd);
2144}
2145
2146static void test_stream_linger_server(const struct test_opts *opts)
2147{
2148	int fd;
2149
2150	fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
2151	if (fd < 0) {
2152		perror("accept");
2153		exit(EXIT_FAILURE);
2154	}
2155
2156	vsock_wait_remote_close(fd);
2157	close(fd);
2158}
2159
2160/* Half of the default to not risk timing out the control channel */
2161#define LINGER_TIMEOUT	(TIMEOUT / 2)
2162
2163static void test_stream_nolinger_client(const struct test_opts *opts)
2164{
2165	bool waited;
2166	time_t ns;
2167	int fd;
2168
2169	fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
2170	if (fd < 0) {
2171		perror("connect");
2172		exit(EXIT_FAILURE);
2173	}
2174
2175	enable_so_linger(fd, LINGER_TIMEOUT);
2176	send_byte(fd, 1, 0); /* Left unread to expose incorrect behaviour. */
2177	waited = vsock_wait_sent(fd);
2178
2179	ns = current_nsec();
2180	close(fd);
2181	ns = current_nsec() - ns;
2182
2183	if (!waited) {
2184		fprintf(stderr, "Test skipped, SIOCOUTQ not supported.\n");
2185	} else if (DIV_ROUND_UP(ns, NSEC_PER_SEC) >= LINGER_TIMEOUT) {
2186		fprintf(stderr, "Unexpected lingering\n");
2187		exit(EXIT_FAILURE);
2188	}
2189
2190	control_writeln("DONE");
2191}
2192
2193static void test_stream_nolinger_server(const struct test_opts *opts)
2194{
2195	int fd;
2196
2197	fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
2198	if (fd < 0) {
2199		perror("accept");
2200		exit(EXIT_FAILURE);
2201	}
2202
2203	control_expectln("DONE");
2204	close(fd);
2205}
2206
2207static void test_stream_accepted_setsockopt_client(const struct test_opts *opts)
2208{
2209	int fd;
2210
2211	fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
2212	if (fd < 0) {
2213		perror("connect");
2214		exit(EXIT_FAILURE);
2215	}
2216
2217	close(fd);
2218}
2219
2220static void test_stream_accepted_setsockopt_server(const struct test_opts *opts)
2221{
2222	int fd;
2223
2224	fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
2225	if (fd < 0) {
2226		perror("accept");
2227		exit(EXIT_FAILURE);
2228	}
2229
2230	enable_so_zerocopy_check(fd);
2231	close(fd);
2232}
2233
2234static void test_stream_tx_credit_bounds_client(const struct test_opts *opts)
2235{
2236	unsigned long long sock_buf_size;
2237	size_t total = 0;
2238	char buf[4096];
2239	int fd;
2240
2241	memset(buf, 'A', sizeof(buf));
2242
2243	fd = vsock_stream_connect(opts->peer_cid, opts->peer_port);
2244	if (fd < 0) {
2245		perror("connect");
2246		exit(EXIT_FAILURE);
2247	}
2248
2249	sock_buf_size = SOCK_BUF_SIZE_SMALL;
2250
2251	setsockopt_ull_check(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_MAX_SIZE,
2252			     sock_buf_size,
2253			     "setsockopt(SO_VM_SOCKETS_BUFFER_MAX_SIZE)");
2254
2255	setsockopt_ull_check(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_SIZE,
2256			     sock_buf_size,
2257			     "setsockopt(SO_VM_SOCKETS_BUFFER_SIZE)");
2258
2259	if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK) < 0) {
2260		perror("fcntl(F_SETFL)");
2261		exit(EXIT_FAILURE);
2262	}
2263
2264	control_expectln("SRVREADY");
2265
2266	for (;;) {
2267		ssize_t sent = send(fd, buf, sizeof(buf), 0);
2268
2269		if (sent == 0) {
2270			fprintf(stderr, "unexpected EOF while sending bytes\n");
2271			exit(EXIT_FAILURE);
2272		}
2273
2274		if (sent < 0) {
2275			if (errno == EINTR)
2276				continue;
2277
2278			if (errno == EAGAIN || errno == EWOULDBLOCK)
2279				break;
2280
2281			perror("send");
2282			exit(EXIT_FAILURE);
2283		}
2284
2285		total += sent;
2286	}
2287
2288	control_writeln("CLIDONE");
2289	close(fd);
2290
2291	/* We should not be able to send more bytes than the value set as
2292	 * local buffer size.
2293	 */
2294	if (total > sock_buf_size) {
2295		fprintf(stderr,
2296			"TX credit too large: queued %zu bytes (expected <= %llu)\n",
2297			total, sock_buf_size);
2298		exit(EXIT_FAILURE);
2299	}
2300}
2301
2302static void test_stream_tx_credit_bounds_server(const struct test_opts *opts)
2303{
2304	unsigned long long sock_buf_size;
2305	int fd;
2306
2307	fd = vsock_stream_accept(VMADDR_CID_ANY, opts->peer_port, NULL);
2308	if (fd < 0) {
2309		perror("accept");
2310		exit(EXIT_FAILURE);
2311	}
2312
2313	sock_buf_size = SOCK_BUF_SIZE;
2314
2315	setsockopt_ull_check(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_MAX_SIZE,
2316			     sock_buf_size,
2317			     "setsockopt(SO_VM_SOCKETS_BUFFER_MAX_SIZE)");
2318
2319	setsockopt_ull_check(fd, AF_VSOCK, SO_VM_SOCKETS_BUFFER_SIZE,
2320			     sock_buf_size,
2321			     "setsockopt(SO_VM_SOCKETS_BUFFER_SIZE)");
2322
2323	control_writeln("SRVREADY");
2324	control_expectln("CLIDONE");
2325
2326	close(fd);
2327}
2328
2329static struct test_case test_cases[] = {
2330	{
2331		.name = "SOCK_STREAM connection reset",
2332		.run_client = test_stream_connection_reset,
2333	},
2334	{
2335		.name = "SOCK_STREAM bind only",
2336		.run_client = test_stream_bind_only_client,
2337		.run_server = test_stream_bind_only_server,
2338	},
2339	{
2340		.name = "SOCK_STREAM client close",
2341		.run_client = test_stream_client_close_client,
2342		.run_server = test_stream_client_close_server,
2343	},
2344	{
2345		.name = "SOCK_STREAM server close",
2346		.run_client = test_stream_server_close_client,
2347		.run_server = test_stream_server_close_server,
2348	},
2349	{
2350		.name = "SOCK_STREAM multiple connections",
2351		.run_client = test_stream_multiconn_client,
2352		.run_server = test_stream_multiconn_server,
2353	},
2354	{
2355		.name = "SOCK_STREAM MSG_PEEK",
2356		.run_client = test_stream_msg_peek_client,
2357		.run_server = test_stream_msg_peek_server,
2358	},
2359	{
2360		.name = "SOCK_SEQPACKET msg bounds",
2361		.run_client = test_seqpacket_msg_bounds_client,
2362		.run_server = test_seqpacket_msg_bounds_server,
2363	},
2364	{
2365		.name = "SOCK_SEQPACKET MSG_TRUNC flag",
2366		.run_client = test_seqpacket_msg_trunc_client,
2367		.run_server = test_seqpacket_msg_trunc_server,
2368	},
2369	{
2370		.name = "SOCK_SEQPACKET timeout",
2371		.run_client = test_seqpacket_timeout_client,
2372		.run_server = test_seqpacket_timeout_server,
2373	},
2374	{
2375		.name = "SOCK_SEQPACKET invalid receive buffer",
2376		.run_client = test_seqpacket_invalid_rec_buffer_client,
2377		.run_server = test_seqpacket_invalid_rec_buffer_server,
2378	},
2379	{
2380		.name = "SOCK_STREAM poll() + SO_RCVLOWAT",
2381		.run_client = test_stream_poll_rcvlowat_client,
2382		.run_server = test_stream_poll_rcvlowat_server,
2383	},
2384	{
2385		.name = "SOCK_SEQPACKET big message",
2386		.run_client = test_seqpacket_bigmsg_client,
2387		.run_server = test_seqpacket_bigmsg_server,
2388	},
2389	{
2390		.name = "SOCK_STREAM test invalid buffer",
2391		.run_client = test_stream_inv_buf_client,
2392		.run_server = test_stream_inv_buf_server,
2393	},
2394	{
2395		.name = "SOCK_SEQPACKET test invalid buffer",
2396		.run_client = test_seqpacket_inv_buf_client,
2397		.run_server = test_seqpacket_inv_buf_server,
2398	},
2399	{
2400		.name = "SOCK_STREAM virtio skb merge",
2401		.run_client = test_stream_virtio_skb_merge_client,
2402		.run_server = test_stream_virtio_skb_merge_server,
2403	},
2404	{
2405		.name = "SOCK_SEQPACKET MSG_PEEK",
2406		.run_client = test_seqpacket_msg_peek_client,
2407		.run_server = test_seqpacket_msg_peek_server,
2408	},
2409	{
2410		.name = "SOCK_STREAM SHUT_WR",
2411		.run_client = test_stream_shutwr_client,
2412		.run_server = test_stream_shutwr_server,
2413	},
2414	{
2415		.name = "SOCK_STREAM SHUT_RD",
2416		.run_client = test_stream_shutrd_client,
2417		.run_server = test_stream_shutrd_server,
2418	},
2419	{
2420		.name = "SOCK_STREAM MSG_ZEROCOPY",
2421		.run_client = test_stream_msgzcopy_client,
2422		.run_server = test_stream_msgzcopy_server,
2423	},
2424	{
2425		.name = "SOCK_SEQPACKET MSG_ZEROCOPY",
2426		.run_client = test_seqpacket_msgzcopy_client,
2427		.run_server = test_seqpacket_msgzcopy_server,
2428	},
2429	{
2430		.name = "SOCK_STREAM MSG_ZEROCOPY empty MSG_ERRQUEUE",
2431		.run_client = test_stream_msgzcopy_empty_errq_client,
2432		.run_server = test_stream_msgzcopy_empty_errq_server,
2433	},
2434	{
2435		.name = "SOCK_STREAM double bind connect",
2436		.run_client = test_double_bind_connect_client,
2437		.run_server = test_double_bind_connect_server,
2438	},
2439	{
2440		.name = "SOCK_STREAM virtio credit update + SO_RCVLOWAT",
2441		.run_client = test_stream_rcvlowat_def_cred_upd_client,
2442		.run_server = test_stream_cred_upd_on_set_rcvlowat,
2443	},
2444	{
2445		.name = "SOCK_STREAM virtio credit update + low rx_bytes",
2446		.run_client = test_stream_rcvlowat_def_cred_upd_client,
2447		.run_server = test_stream_cred_upd_on_low_rx_bytes,
2448	},
2449	{
2450		.name = "SOCK_STREAM ioctl(SIOCOUTQ) 0 unsent bytes",
2451		.run_client = test_stream_unsent_bytes_client,
2452		.run_server = test_stream_unsent_bytes_server,
2453	},
2454	{
2455		.name = "SOCK_SEQPACKET ioctl(SIOCOUTQ) 0 unsent bytes",
2456		.run_client = test_seqpacket_unsent_bytes_client,
2457		.run_server = test_seqpacket_unsent_bytes_server,
2458	},
2459	{
2460		.name = "SOCK_STREAM leak accept queue",
2461		.run_client = test_stream_leak_acceptq_client,
2462		.run_server = test_stream_leak_acceptq_server,
2463	},
2464	{
2465		.name = "SOCK_STREAM MSG_ZEROCOPY leak MSG_ERRQUEUE",
2466		.run_client = test_stream_msgzcopy_leak_errq_client,
2467		.run_server = test_stream_msgzcopy_leak_errq_server,
2468	},
2469	{
2470		.name = "SOCK_STREAM MSG_ZEROCOPY leak completion skb",
2471		.run_client = test_stream_msgzcopy_leak_zcskb_client,
2472		.run_server = test_stream_msgzcopy_leak_zcskb_server,
2473	},
2474	{
2475		.name = "SOCK_STREAM transport release use-after-free",
2476		.run_client = test_stream_transport_uaf_client,
2477	},
2478	{
2479		.name = "SOCK_STREAM retry failed connect()",
2480		.run_client = test_stream_connect_retry_client,
2481		.run_server = test_stream_connect_retry_server,
2482	},
2483	{
2484		.name = "SOCK_STREAM SO_LINGER null-ptr-deref",
2485		.run_client = test_stream_linger_client,
2486		.run_server = test_stream_linger_server,
2487	},
2488	{
2489		.name = "SOCK_STREAM SO_LINGER close() on unread",
2490		.run_client = test_stream_nolinger_client,
2491		.run_server = test_stream_nolinger_server,
2492	},
2493	{
2494		.name = "SOCK_STREAM transport change null-ptr-deref, lockdep warn",
2495		.run_client = test_stream_transport_change_client,
2496		.run_server = test_stream_transport_change_server,
2497	},
2498	{
2499		.name = "SOCK_STREAM ioctl(SIOCINQ) functionality",
2500		.run_client = test_stream_unread_bytes_client,
2501		.run_server = test_stream_unread_bytes_server,
2502	},
2503	{
2504		.name = "SOCK_SEQPACKET ioctl(SIOCINQ) functionality",
2505		.run_client = test_seqpacket_unread_bytes_client,
2506		.run_server = test_seqpacket_unread_bytes_server,
2507	},
2508	{
2509		.name = "SOCK_STREAM accept()ed socket custom setsockopt()",
2510		.run_client = test_stream_accepted_setsockopt_client,
2511		.run_server = test_stream_accepted_setsockopt_server,
2512	},
2513	{
2514		.name = "SOCK_STREAM virtio MSG_ZEROCOPY coalescence corruption",
2515		.run_client = test_stream_msgzcopy_mangle_client,
2516		.run_server = test_stream_msgzcopy_mangle_server,
2517	},
2518	{
2519		.name = "SOCK_STREAM TX credit bounds",
2520		.run_client = test_stream_tx_credit_bounds_client,
2521		.run_server = test_stream_tx_credit_bounds_server,
2522	},
2523	{},
2524};
2525
2526static const char optstring[] = "";
2527static const struct option longopts[] = {
2528	{
2529		.name = "control-host",
2530		.has_arg = required_argument,
2531		.val = 'H',
2532	},
2533	{
2534		.name = "control-port",
2535		.has_arg = required_argument,
2536		.val = 'P',
2537	},
2538	{
2539		.name = "mode",
2540		.has_arg = required_argument,
2541		.val = 'm',
2542	},
2543	{
2544		.name = "peer-cid",
2545		.has_arg = required_argument,
2546		.val = 'p',
2547	},
2548	{
2549		.name = "peer-port",
2550		.has_arg = required_argument,
2551		.val = 'q',
2552	},
2553	{
2554		.name = "list",
2555		.has_arg = no_argument,
2556		.val = 'l',
2557	},
2558	{
2559		.name = "skip",
2560		.has_arg = required_argument,
2561		.val = 's',
2562	},
2563	{
2564		.name = "pick",
2565		.has_arg = required_argument,
2566		.val = 't',
2567	},
2568	{
2569		.name = "help",
2570		.has_arg = no_argument,
2571		.val = '?',
2572	},
2573	{},
2574};
2575
2576static void usage(void)
2577{
2578	fprintf(stderr, "Usage: vsock_test [--help] [--control-host=<host>] --control-port=<port> --mode=client|server --peer-cid=<cid> [--peer-port=<port>] [--list] [--skip=<test_id>]\n"
2579		"\n"
2580		"  Server: vsock_test --control-port=1234 --mode=server --peer-cid=3\n"
2581		"  Client: vsock_test --control-host=192.168.0.1 --control-port=1234 --mode=client --peer-cid=2\n"
2582		"\n"
2583		"Run vsock.ko tests.  Must be launched in both guest\n"
2584		"and host.  One side must use --mode=client and\n"
2585		"the other side must use --mode=server.\n"
2586		"\n"
2587		"A TCP control socket connection is used to coordinate tests\n"
2588		"between the client and the server.  The server requires a\n"
2589		"listen address and the client requires an address to\n"
2590		"connect to.\n"
2591		"\n"
2592		"The CID of the other side must be given with --peer-cid=<cid>.\n"
2593		"During the test, two AF_VSOCK ports will be used: the port\n"
2594		"specified with --peer-port=<port> (or the default port)\n"
2595		"and the next one.\n"
2596		"\n"
2597		"Options:\n"
2598		"  --help                 This help message\n"
2599		"  --control-host <host>  Server IP address to connect to\n"
2600		"  --control-port <port>  Server port to listen on/connect to\n"
2601		"  --mode client|server   Server or client mode\n"
2602		"  --peer-cid <cid>       CID of the other side\n"
2603		"  --peer-port <port>     AF_VSOCK port used for the test [default: %d]\n"
2604		"  --list                 List of tests that will be executed\n"
2605		"  --pick <test_id>       Test ID to execute selectively;\n"
2606		"                         use multiple --pick options to select more tests\n"
2607		"  --skip <test_id>       Test ID to skip;\n"
2608		"                         use multiple --skip options to skip more tests\n",
2609		DEFAULT_PEER_PORT
2610		);
2611	exit(EXIT_FAILURE);
2612}
2613
2614int main(int argc, char **argv)
2615{
2616	const char *control_host = NULL;
2617	const char *control_port = NULL;
2618	struct test_opts opts = {
2619		.mode = TEST_MODE_UNSET,
2620		.peer_cid = VMADDR_CID_ANY,
2621		.peer_port = DEFAULT_PEER_PORT,
2622	};
2623
2624	srand(time(NULL));
2625	init_signals();
2626
2627	for (;;) {
2628		int opt = getopt_long(argc, argv, optstring, longopts, NULL);
2629
2630		if (opt == -1)
2631			break;
2632
2633		switch (opt) {
2634		case 'H':
2635			control_host = optarg;
2636			break;
2637		case 'm':
2638			if (strcmp(optarg, "client") == 0)
2639				opts.mode = TEST_MODE_CLIENT;
2640			else if (strcmp(optarg, "server") == 0)
2641				opts.mode = TEST_MODE_SERVER;
2642			else {
2643				fprintf(stderr, "--mode must be \"client\" or \"server\"\n");
2644				return EXIT_FAILURE;
2645			}
2646			break;
2647		case 'p':
2648			opts.peer_cid = parse_cid(optarg);
2649			break;
2650		case 'q':
2651			opts.peer_port = parse_port(optarg);
2652			break;
2653		case 'P':
2654			control_port = optarg;
2655			break;
2656		case 'l':
2657			list_tests(test_cases);
2658			break;
2659		case 's':
2660			skip_test(test_cases, ARRAY_SIZE(test_cases) - 1,
2661				  optarg);
2662			break;
2663		case 't':
2664			pick_test(test_cases, ARRAY_SIZE(test_cases) - 1,
2665				  optarg);
2666			break;
2667		case '?':
2668		default:
2669			usage();
2670		}
2671	}
2672
2673	if (!control_port)
2674		usage();
2675	if (opts.mode == TEST_MODE_UNSET)
2676		usage();
2677	if (opts.peer_cid == VMADDR_CID_ANY)
2678		usage();
2679
2680	if (!control_host) {
2681		if (opts.mode != TEST_MODE_SERVER)
2682			usage();
2683		control_host = "0.0.0.0";
2684	}
2685
2686	control_init(control_host, control_port,
2687		     opts.mode == TEST_MODE_SERVER);
2688
2689	run_tests(test_cases, &opts);
2690
2691	control_cleanup();
2692	return EXIT_SUCCESS;
2693}
~/ Read-only file preview.