[Tarantool-patches] [PATCH 01/10] test: stop using swim_transport.addr as in-param

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Tue Dec 1 02:56:09 MSK 2020


SWIM unit tests contain special libraries for emulating event loop
and network: swim_test_ev and swim_test_transport. They provide
API similar to libev and to network part of libc, which internally
is implemented entirely in user-space and allows to simulate all
kinds of errors, any time durations, etc.

These test libraries are going to be re-used for Raft unit tests.
But for that it is necessary to detach them from all SWIM
dependencies.

--

One of the dependencies - swim_transport.addr, which was used in
swim_transport_send() as an input parameter. swim_transport_send()
simulates sendto(), and it can't be generalized while it depends
on source address being passed explicitly.

This patch makes swim_transport_send() deduct the source address
by the file descriptor number.

There is a couple of new functions for that:
swim_test_sockaddr_in_to_fd and swim_test_fd_to_sockaddr_in.

They were inlined earlier, but it seems the fd <-> source address
translation is used often enough to extract these functions.

Part of #5303
---
 test/unit/swim_test_transport.c | 28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git a/test/unit/swim_test_transport.c b/test/unit/swim_test_transport.c
index 334ac926e..9fad351b5 100644
--- a/test/unit/swim_test_transport.c
+++ b/test/unit/swim_test_transport.c
@@ -51,6 +51,25 @@ enum {
 	FAKE_FD_NUMBER = 1000,
 };
 
+static inline int
+swim_test_sockaddr_in_to_fd(const struct sockaddr_in *addr)
+{
+	assert(addr->sin_family == AF_INET);
+	return ntohs(addr->sin_port) + FAKE_FD_BASE;
+}
+
+static inline void
+swim_test_fd_to_sockaddr_in(int fd, struct sockaddr_in *addr)
+{
+	*addr = (struct sockaddr_in){
+		.sin_family = AF_INET,
+		.sin_port = htons(fd) - FAKE_FD_BASE,
+		.sin_addr = {
+			.s_addr = htonl(INADDR_LOOPBACK),
+		},
+	};
+}
+
 /** UDP packet wrapper. It is stored in send/recv queues. */
 struct swim_test_packet {
 	/** Source address. */
@@ -289,8 +308,10 @@ swim_transport_send(struct swim_transport *transport, const void *data,
 	 */
 	(void) addr_size;
 	assert(addr->sa_family == AF_INET);
+	struct sockaddr_in src_addr;
+	swim_test_fd_to_sockaddr_in(transport->fd, &src_addr);
 	struct swim_test_packet *p =
-		swim_test_packet_new(data, size, &transport->addr,
+		swim_test_packet_new(data, size, &src_addr,
 				     (const struct sockaddr_in *) addr);
 	struct swim_fd *src = &swim_fd[transport->fd - FAKE_FD_BASE];
 	assert(src->is_opened);
@@ -328,7 +349,7 @@ swim_transport_bind(struct swim_transport *transport,
 {
 	assert(addr->sa_family == AF_INET);
 	const struct sockaddr_in *new_addr = (const struct sockaddr_in *) addr;
-	int new_fd = ntohs(new_addr->sin_port) + FAKE_FD_BASE;
+	int new_fd = swim_test_sockaddr_in_to_fd(new_addr);
 	int old_fd = transport->fd;
 	if (old_fd == new_fd) {
 		transport->addr = *new_addr;
@@ -406,7 +427,8 @@ swim_fd_send_packet(struct swim_fd *fd)
 		}
 		swim_test_packet_delete(p);
 	} else {
-		dst = &swim_fd[ntohs(p->dst.sin_port)];
+		int fdnum = swim_test_sockaddr_in_to_fd(&p->dst);
+		dst = &swim_fd[fdnum - FAKE_FD_BASE];
 		swim_move_packet(fd, dst, p);
 	}
 }
-- 
2.24.3 (Apple Git-128)



More information about the Tarantool-patches mailing list