Commit ac12b7e2 authored by Michal Luczaj's avatar Michal Luczaj Committed by Jakub Kicinski
Browse files

vsock/test: Introduce vsock_connect_fd()

parent 852a00c4
Loading
Loading
Loading
Loading
+17 −28
Original line number Diff line number Diff line
@@ -120,27 +120,33 @@ int vsock_bind(unsigned int cid, unsigned int port, int type)
	return fd;
}

/* Bind to <bind_port>, connect to <cid, port> and return the file descriptor. */
int vsock_bind_connect(unsigned int cid, unsigned int port, unsigned int bind_port, int type)
int vsock_connect_fd(int fd, unsigned int cid, unsigned int port)
{
	struct sockaddr_vm sa_server = {
	struct sockaddr_vm sa = {
		.svm_family = AF_VSOCK,
		.svm_cid = cid,
		.svm_port = port,
	};

	int client_fd, ret;

	client_fd = vsock_bind(VMADDR_CID_ANY, bind_port, type);
	int ret;

	timeout_begin(TIMEOUT);
	do {
		ret = connect(client_fd, (struct sockaddr *)&sa_server, sizeof(sa_server));
		ret = connect(fd, (struct sockaddr *)&sa, sizeof(sa));
		timeout_check("connect");
	} while (ret < 0 && errno == EINTR);
	timeout_end();

	if (ret < 0) {
	return ret;
}

/* Bind to <bind_port>, connect to <cid, port> and return the file descriptor. */
int vsock_bind_connect(unsigned int cid, unsigned int port, unsigned int bind_port, int type)
{
	int client_fd;

	client_fd = vsock_bind(VMADDR_CID_ANY, bind_port, type);

	if (vsock_connect_fd(client_fd, cid, port)) {
		perror("connect");
		exit(EXIT_FAILURE);
	}
@@ -151,17 +157,6 @@ int vsock_bind_connect(unsigned int cid, unsigned int port, unsigned int bind_po
/* Connect to <cid, port> and return the file descriptor. */
int vsock_connect(unsigned int cid, unsigned int port, int type)
{
	union {
		struct sockaddr sa;
		struct sockaddr_vm svm;
	} addr = {
		.svm = {
			.svm_family = AF_VSOCK,
			.svm_port = port,
			.svm_cid = cid,
		},
	};
	int ret;
	int fd;

	control_expectln("LISTENING");
@@ -172,20 +167,14 @@ int vsock_connect(unsigned int cid, unsigned int port, int type)
		exit(EXIT_FAILURE);
	}

	timeout_begin(TIMEOUT);
	do {
		ret = connect(fd, &addr.sa, sizeof(addr.svm));
		timeout_check("connect");
	} while (ret < 0 && errno == EINTR);
	timeout_end();

	if (ret < 0) {
	if (vsock_connect_fd(fd, cid, port)) {
		int old_errno = errno;

		close(fd);
		fd = -1;
		errno = old_errno;
	}

	return fd;
}

+1 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ struct test_case {
void init_signals(void);
unsigned int parse_cid(const char *str);
unsigned int parse_port(const char *str);
int vsock_connect_fd(int fd, unsigned int cid, unsigned int port);
int vsock_connect(unsigned int cid, unsigned int port, int type);
int vsock_accept(unsigned int cid, unsigned int port,
		 struct sockaddr_vm *clientaddrp, int type);