From 79ce9b9b14ac83a33712d6af4eecdb63bba45742 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 16 Jan 2023 20:14:26 +0100 Subject: [PATCH] tests: let test_echo_tcp_sendmmsg_recvmmsg check raw SYS_close, SYS_recvmmsg and SYS_sendmmsg Signed-off-by: Stefan Metzmacher Reviewed-by: Andreas Schneider --- tests/test_echo_tcp_sendmmsg_recvmmsg.c | 127 ++++++++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/tests/test_echo_tcp_sendmmsg_recvmmsg.c b/tests/test_echo_tcp_sendmmsg_recvmmsg.c index e03f629..5715ab2 100644 --- a/tests/test_echo_tcp_sendmmsg_recvmmsg.c +++ b/tests/test_echo_tcp_sendmmsg_recvmmsg.c @@ -14,6 +14,12 @@ #include #include #include +#ifdef HAVE_SYS_SYSCALL_H +#include +#endif +#ifdef HAVE_SYSCALL_H +#include +#endif static int setup_echo_srv_tcp_ipv4(void **state) { @@ -277,6 +283,122 @@ static void test_sendmmsg_recvmmsg_ipv4_null(void **state) assert_int_equal(rc, 0); } +#ifdef SYS_recvmmsg +static int __raw_syscall_close(int sockfd) +{ + return syscall(SYS_close, sockfd); +} + +static int __raw_syscall_recvmmsg(int sockfd, + struct mmsghdr *msgvec, + unsigned int vlen, + int flags, + struct timespec *timeout) +{ + return syscall(SYS_recvmmsg, + sockfd, + (uintptr_t)msgvec, + vlen, + flags, + (uintptr_t)timeout); +} + +static int __raw_syscall_sendmmsg(int sockfd, + struct mmsghdr *msgvec, + unsigned int vlen, + int flags) +{ + return syscall(SYS_sendmmsg, + sockfd, + (uintptr_t)msgvec, + vlen, + flags); +} + +static void test_sendmmsg_recvmmsg_ipv4_raw(void **state) +{ + struct torture_address addr = { + .sa_socklen = sizeof(struct sockaddr_storage), + }; + struct { + struct torture_address reply_addr; + struct iovec s_iov; + struct iovec r_iov; + char send_buf[64]; + char recv_buf[64]; + } tmsgs[10] = {}; + struct mmsghdr s_msgs[10] = {}; + struct mmsghdr r_msgs[10] = {}; + ssize_t ret; + int rc; + int i; + int s; + + (void) state; /* unused */ + + s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + assert_int_not_equal(s, -1); + + addr.sa.in.sin_family = AF_INET; + addr.sa.in.sin_port = htons(torture_server_port()); + + rc = inet_pton(AF_INET, + torture_server_address(AF_INET), + &addr.sa.in.sin_addr); + assert_int_equal(rc, 1); + + rc = connect(s, &addr.sa.s, addr.sa_socklen); + assert_return_code(rc, errno); + + /* This should be ignored */ + rc = inet_pton(AF_INET, + "127.0.0.1", + &addr.sa.in.sin_addr); + assert_int_equal(rc, 1); + + for (i = 0; i < 10; i++) { + tmsgs[i].reply_addr = (struct torture_address){ + .sa_socklen = sizeof(struct sockaddr_storage), + }; + + snprintf(tmsgs[i].send_buf, sizeof(tmsgs[i].send_buf), "packet.%d", i); + + tmsgs[i].s_iov.iov_base = tmsgs[i].send_buf; + tmsgs[i].s_iov.iov_len = sizeof(tmsgs[i].send_buf); + + s_msgs[i].msg_hdr.msg_name = &addr.sa.s; + s_msgs[i].msg_hdr.msg_namelen = addr.sa_socklen; + s_msgs[i].msg_hdr.msg_iov = &tmsgs[i].s_iov; + s_msgs[i].msg_hdr.msg_iovlen = 1; + + tmsgs[i].r_iov.iov_base = tmsgs[i].recv_buf; + tmsgs[i].r_iov.iov_len = sizeof(tmsgs[i].recv_buf); + + r_msgs[i].msg_hdr.msg_name = &tmsgs[i].reply_addr.sa.s; + r_msgs[i].msg_hdr.msg_namelen = tmsgs[i].reply_addr.sa_socklen; + r_msgs[i].msg_hdr.msg_iov = &tmsgs[i].r_iov; + r_msgs[i].msg_hdr.msg_iovlen = 1; + } + + ret = __raw_syscall_sendmmsg(s, s_msgs, 10, 0); + assert_int_equal(ret, 10); + + ret = __raw_syscall_recvmmsg(s, r_msgs, 10, 0, NULL); + assert_int_equal(ret, 10); + + for (i = 0; i < 10; i++) { + assert_int_equal(r_msgs[i].msg_hdr.msg_namelen, 0); + assert_ptr_equal(r_msgs[i].msg_hdr.msg_name, &tmsgs[i].reply_addr.sa.s); + + assert_int_equal(r_msgs[i].msg_len, tmsgs[i].s_iov.iov_len); + assert_memory_equal(tmsgs[i].send_buf, tmsgs[i].recv_buf, sizeof(tmsgs[i].send_buf)); + } + + rc = __raw_syscall_close(s); + assert_int_equal(rc, 0); +} +#endif /* SYS_recvmmsg */ + int main(void) { int rc; @@ -287,6 +409,11 @@ int main(void) { cmocka_unit_test_setup_teardown(test_sendmmsg_recvmmsg_ipv4_null, setup_echo_srv_tcp_ipv4, teardown), +#ifdef SYS_recvmmsg + cmocka_unit_test_setup_teardown(test_sendmmsg_recvmmsg_ipv4_raw, + setup_echo_srv_tcp_ipv4, + teardown), +#endif /* SYS_recvmmsg */ #ifdef HAVE_IPV6 cmocka_unit_test_setup_teardown(test_sendmmsg_recvmmsg_ipv6, setup_echo_srv_tcp_ipv6, -- 2.34.1