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:
parent
852a00c428
commit
ac12b7e291
2 changed files with 18 additions and 28 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue