From 3f12817fe3827b83e757617c2ff99f0ab088f5b9 Mon Sep 17 00:00:00 2001 From: Willem de Bruijn Date: Thu, 26 Apr 2018 13:42:24 -0400 Subject: selftests: udp gso with corking Corked sockets take a different path to construct a udp datagram than the lockless fast path. Test this alternate path. Signed-off-by: Willem de Bruijn Signed-off-by: David S. Miller --- tools/testing/selftests/net/udpgso.c | 42 ++++++++++++++++++++++++++--------- tools/testing/selftests/net/udpgso.sh | 6 +++++ 2 files changed, 38 insertions(+), 10 deletions(-) (limited to 'tools') diff --git a/tools/testing/selftests/net/udpgso.c b/tools/testing/selftests/net/udpgso.c index 52ebad2abea9..48a0592db938 100644 --- a/tools/testing/selftests/net/udpgso.c +++ b/tools/testing/selftests/net/udpgso.c @@ -49,6 +49,7 @@ static bool cfg_do_ipv4; static bool cfg_do_ipv6; static bool cfg_do_connected; static bool cfg_do_connectionless; +static bool cfg_do_msgmore; static bool cfg_do_setsockopt; static int cfg_specific_test_id = -1; @@ -369,6 +370,23 @@ static void set_route_mtu(int mtu, bool is_ipv4) fprintf(stderr, "route mtu (test): %u\n", mtu); } +static bool __send_one(int fd, struct msghdr *msg, int flags) +{ + int ret; + + ret = sendmsg(fd, msg, flags); + if (ret == -1 && (errno == EMSGSIZE || errno == ENOMEM)) + return false; + if (ret == -1) + error(1, errno, "sendmsg"); + if (ret != msg->msg_iov->iov_len) + error(1, 0, "sendto: %d != %lu", ret, msg->msg_iov->iov_len); + if (msg->msg_flags) + error(1, 0, "sendmsg: return flags 0x%x\n", msg->msg_flags); + + return true; +} + static bool send_one(int fd, int len, int gso_len, struct sockaddr *addr, socklen_t alen) { @@ -376,7 +394,6 @@ static bool send_one(int fd, int len, int gso_len, struct msghdr msg = {0}; struct iovec iov = {0}; struct cmsghdr *cm; - int ret; iov.iov_base = buf; iov.iov_len = len; @@ -398,15 +415,17 @@ static bool send_one(int fd, int len, int gso_len, *((uint16_t *) CMSG_DATA(cm)) = gso_len; } - ret = sendmsg(fd, &msg, 0); - if (ret == -1 && (errno == EMSGSIZE || errno == ENOMEM)) - return false; - if (ret == -1) - error(1, errno, "sendmsg"); - if (ret != len) - error(1, 0, "sendto: %d != %u", ret, len); + /* If MSG_MORE, send 1 byte followed by remainder */ + if (cfg_do_msgmore && len > 1) { + iov.iov_len = 1; + if (!__send_one(fd, &msg, MSG_MORE)) + error(1, 0, "send 1B failed"); - return true; + iov.iov_base++; + iov.iov_len = len - 1; + } + + return __send_one(fd, &msg, 0); } static int recv_one(int fd, int flags) @@ -558,7 +577,7 @@ static void parse_opts(int argc, char **argv) { int c; - while ((c = getopt(argc, argv, "46cCst:")) != -1) { + while ((c = getopt(argc, argv, "46cCmst:")) != -1) { switch (c) { case '4': cfg_do_ipv4 = true; @@ -572,6 +591,9 @@ static void parse_opts(int argc, char **argv) case 'C': cfg_do_connectionless = true; break; + case 'm': + cfg_do_msgmore = true; + break; case 's': cfg_do_setsockopt = true; break; diff --git a/tools/testing/selftests/net/udpgso.sh b/tools/testing/selftests/net/udpgso.sh index 7cdf0e7c1dde..fec24f584fe9 100755 --- a/tools/testing/selftests/net/udpgso.sh +++ b/tools/testing/selftests/net/udpgso.sh @@ -21,3 +21,9 @@ echo "ipv4 connected" # blocked on 2nd loopback address # echo "ipv6 connected" # ./in_netns.sh ./udpgso -6 -c + +echo "ipv4 msg_more" +./in_netns.sh ./udpgso -4 -C -m + +echo "ipv6 msg_more" +./in_netns.sh ./udpgso -6 -C -m -- cgit v1.2.3