From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steve Muckle Date: Tue, 19 Mar 2019 19:16:18 -0700 Subject: [LTP] [PATCH] syscalls/sendmmsg: add new test Message-ID: <20190320021618.36043-1-smuckle@google.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: ltp@lists.linux.it Test basic functionality of sendmmsg and recvmmsg. Signed-off-by: Steve Muckle --- runtest/syscalls | 2 + testcases/kernel/syscalls/sendmmsg/.gitignore | 1 + testcases/kernel/syscalls/sendmmsg/Makefile | 9 ++ .../kernel/syscalls/sendmmsg/sendmmsg01.c | 123 ++++++++++++++++++ 4 files changed, 135 insertions(+) create mode 100644 testcases/kernel/syscalls/sendmmsg/.gitignore create mode 100644 testcases/kernel/syscalls/sendmmsg/Makefile create mode 100644 testcases/kernel/syscalls/sendmmsg/sendmmsg01.c diff --git a/runtest/syscalls b/runtest/syscalls index b0904086d..742b5bef3 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -1095,6 +1095,8 @@ sendfile09_64 sendfile09_64 sendmsg01 sendmsg01 sendmsg02 sendmsg02 +sendmmsg01 sendmmsg01 + sendto01 sendto01 sendto02 sendto02 diff --git a/testcases/kernel/syscalls/sendmmsg/.gitignore b/testcases/kernel/syscalls/sendmmsg/.gitignore new file mode 100644 index 000000000..b703ececd --- /dev/null +++ b/testcases/kernel/syscalls/sendmmsg/.gitignore @@ -0,0 +1 @@ +sendmmsg01 diff --git a/testcases/kernel/syscalls/sendmmsg/Makefile b/testcases/kernel/syscalls/sendmmsg/Makefile new file mode 100644 index 000000000..47e063722 --- /dev/null +++ b/testcases/kernel/syscalls/sendmmsg/Makefile @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +top_srcdir ?= ../../../.. + +sendmmsg01: CFLAGS+=-pthread + +include $(top_srcdir)/include/mk/testcases.mk + +include $(top_srcdir)/include/mk/generic_leaf_target.mk diff --git a/testcases/kernel/syscalls/sendmmsg/sendmmsg01.c b/testcases/kernel/syscalls/sendmmsg/sendmmsg01.c new file mode 100644 index 000000000..d1bdf40a1 --- /dev/null +++ b/testcases/kernel/syscalls/sendmmsg/sendmmsg01.c @@ -0,0 +1,123 @@ +/* + * This test is based on source contained in the man pages for sendmmsg and + * recvmmsg in release 4.15 of the Linux man-pages project. + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include + +#include "tst_test.h" +#include "tst_safe_macros.h" +#include "tst_safe_pthread.h" + +#define BUFSIZE 16 +#define VLEN 2 + +static void *sender_thread(LTP_ATTRIBUTE_UNUSED void *arg) +{ + struct sockaddr_in addr; + struct mmsghdr msg[2]; + struct iovec msg1[2], msg2; + int send_sockfd; + int retval; + + send_sockfd = SAFE_SOCKET(AF_INET, SOCK_DGRAM, 0); + + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + addr.sin_port = htons(1234); + SAFE_CONNECT(send_sockfd, (struct sockaddr *) &addr, sizeof(addr)); + + memset(msg1, 0, sizeof(msg1)); + msg1[0].iov_base = "one"; + msg1[0].iov_len = 3; + msg1[1].iov_base = "two"; + msg1[1].iov_len = 3; + + memset(&msg2, 0, sizeof(msg2)); + msg2.iov_base = "three"; + msg2.iov_len = 5; + + memset(msg, 0, sizeof(msg)); + msg[0].msg_hdr.msg_iov = msg1; + msg[0].msg_hdr.msg_iovlen = 2; + + msg[1].msg_hdr.msg_iov = &msg2; + msg[1].msg_hdr.msg_iovlen = 1; + + retval = sendmmsg(send_sockfd, msg, 2, 0); + if (retval < 0) + tst_brk(TFAIL|TTERRNO, "sendmmsg failed"); + + return NULL; +} + + +static void *receiver_thread(LTP_ATTRIBUTE_UNUSED void *arg) +{ + int receive_sockfd; + struct sockaddr_in addr; + struct mmsghdr msgs[VLEN]; + struct iovec iovecs[VLEN]; + char bufs[VLEN][BUFSIZE+1]; + struct timespec timeout; + int i, retval; + + receive_sockfd = SAFE_SOCKET(AF_INET, SOCK_DGRAM, 0); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + addr.sin_port = htons(1234); + SAFE_BIND(receive_sockfd, (struct sockaddr *)&addr, sizeof(addr)); + + memset(msgs, 0, sizeof(msgs)); + for (i = 0; i < VLEN; i++) { + iovecs[i].iov_base = bufs[i]; + iovecs[i].iov_len = BUFSIZE; + msgs[i].msg_hdr.msg_iov = &iovecs[i]; + msgs[i].msg_hdr.msg_iovlen = 1; + } + + timeout.tv_sec = 1; + timeout.tv_nsec = 0; + + retval = recvmmsg(receive_sockfd, msgs, VLEN, 0, &timeout); + if (retval == -1) + tst_brk(TFAIL | TTERRNO, "recvmmsg failed"); + if (retval != 2) + tst_brk(TFAIL, "Received unexpected number of messages (%d)", + retval); + + bufs[0][msgs[0].msg_len] = 0; + if (strcmp(bufs[0], "onetwo")) + tst_res(TFAIL, "Error in first received message."); + else + tst_res(TPASS, "First message received successfully."); + + bufs[1][msgs[1].msg_len] = 0; + if (strcmp(bufs[1], "three")) + tst_res(TFAIL, "Error in second received message."); + else + tst_res(TPASS, "Second message received successfully."); + + return NULL; +} + +static void run(void) +{ + pthread_t sender; + pthread_t receiver; + + SAFE_PTHREAD_CREATE(&sender, NULL, sender_thread, NULL); + SAFE_PTHREAD_CREATE(&receiver, NULL, receiver_thread, NULL); + SAFE_PTHREAD_JOIN(sender, NULL); + SAFE_PTHREAD_JOIN(receiver, NULL); +} + +static struct tst_test test = { + .test_all = run, +}; -- 2.21.0.225.g810b269d1ac-goog