1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00

vsock/test: Introduce vsock_connect_fd()

Distill timeout-guarded vsock_connect_fd(). Adapt callers.

Suggested-by: Stefano Garzarella <sgarzare@redhat.com>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
Signed-off-by: Michal Luczaj <mhal@rbox.co>
Link: https://patch.msgid.link/20250128-vsock-transport-vs-autobind-v3-4-1cf57065b770@rbox.co
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Michal Luczaj 2025-01-28 14:15:30 +01:00 committed by Jakub Kicinski
parent 852a00c428
commit ac12b7e291
2 changed files with 18 additions and 28 deletions

View file

@ -120,27 +120,33 @@ int vsock_bind(unsigned int cid, unsigned int port, int type)
return fd; return fd;
} }
/* Bind to <bind_port>, connect to <cid, port> and return the file descriptor. */ int vsock_connect_fd(int fd, unsigned int cid, unsigned int port)
int vsock_bind_connect(unsigned int cid, unsigned int port, unsigned int bind_port, int type)
{ {
struct sockaddr_vm sa_server = { struct sockaddr_vm sa = {
.svm_family = AF_VSOCK, .svm_family = AF_VSOCK,
.svm_cid = cid, .svm_cid = cid,
.svm_port = port, .svm_port = port,
}; };
int ret;
int client_fd, ret;
client_fd = vsock_bind(VMADDR_CID_ANY, bind_port, type);
timeout_begin(TIMEOUT); timeout_begin(TIMEOUT);
do { do {
ret = connect(client_fd, (struct sockaddr *)&sa_server, sizeof(sa_server)); ret = connect(fd, (struct sockaddr *)&sa, sizeof(sa));
timeout_check("connect"); timeout_check("connect");
} while (ret < 0 && errno == EINTR); } while (ret < 0 && errno == EINTR);
timeout_end(); 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"); perror("connect");
exit(EXIT_FAILURE); 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. */ /* Connect to <cid, port> and return the file descriptor. */
int vsock_connect(unsigned int cid, unsigned int port, int type) 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; int fd;
control_expectln("LISTENING"); control_expectln("LISTENING");
@ -172,20 +167,14 @@ int vsock_connect(unsigned int cid, unsigned int port, int type)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
timeout_begin(TIMEOUT); if (vsock_connect_fd(fd, cid, port)) {
do {
ret = connect(fd, &addr.sa, sizeof(addr.svm));
timeout_check("connect");
} while (ret < 0 && errno == EINTR);
timeout_end();
if (ret < 0) {
int old_errno = errno; int old_errno = errno;
close(fd); close(fd);
fd = -1; fd = -1;
errno = old_errno; errno = old_errno;
} }
return fd; return fd;
} }

View file

@ -39,6 +39,7 @@ struct test_case {
void init_signals(void); void init_signals(void);
unsigned int parse_cid(const char *str); unsigned int parse_cid(const char *str);
unsigned int parse_port(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_connect(unsigned int cid, unsigned int port, int type);
int vsock_accept(unsigned int cid, unsigned int port, int vsock_accept(unsigned int cid, unsigned int port,
struct sockaddr_vm *clientaddrp, int type); struct sockaddr_vm *clientaddrp, int type);