selftests: mptcp: check IP_TOS in/out are the same
authorFlorian Westphal <fw@strlen.de>
Fri, 3 Dec 2021 22:35:38 +0000 (14:35 -0800)
committerJakub Kicinski <kuba@kernel.org>
Tue, 7 Dec 2021 19:36:30 +0000 (11:36 -0800)
Check that getsockopt(IP_TOS) returns what setsockopt(IP_TOS) did set
right before.

Also check that socklen_t == 0 and -1 input values match those
of normal tcp sockets.

Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/testing/selftests/net/mptcp/mptcp_sockopt.c

index 417b11c..ac9a4d9 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <assert.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <limits.h>
 #include <string.h>
 #include <stdarg.h>
@@ -13,6 +14,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <strings.h>
+#include <time.h>
 #include <unistd.h>
 
 #include <sys/socket.h>
@@ -594,6 +596,44 @@ static int server(int pipefd)
        return 0;
 }
 
+static void test_ip_tos_sockopt(int fd)
+{
+       uint8_t tos_in, tos_out;
+       socklen_t s;
+       int r;
+
+       tos_in = rand() & 0xfc;
+       r = setsockopt(fd, SOL_IP, IP_TOS, &tos_in, sizeof(tos_out));
+       if (r != 0)
+               die_perror("setsockopt IP_TOS");
+
+       tos_out = 0;
+       s = sizeof(tos_out);
+       r = getsockopt(fd, SOL_IP, IP_TOS, &tos_out, &s);
+       if (r != 0)
+               die_perror("getsockopt IP_TOS");
+
+       if (tos_in != tos_out)
+               xerror("tos %x != %x socklen_t %d\n", tos_in, tos_out, s);
+
+       if (s != 1)
+               xerror("tos should be 1 byte");
+
+       s = 0;
+       r = getsockopt(fd, SOL_IP, IP_TOS, &tos_out, &s);
+       if (r != 0)
+               die_perror("getsockopt IP_TOS 0");
+       if (s != 0)
+               xerror("expect socklen_t == 0");
+
+       s = -1;
+       r = getsockopt(fd, SOL_IP, IP_TOS, &tos_out, &s);
+       if (r != -1 && errno != EINVAL)
+               die_perror("getsockopt IP_TOS did not indicate -EINVAL");
+       if (s != -1)
+               xerror("expect socklen_t == -1");
+}
+
 static int client(int pipefd)
 {
        int fd = -1;
@@ -611,6 +651,8 @@ static int client(int pipefd)
                xerror("Unknown pf %d\n", pf);
        }
 
+       test_ip_tos_sockopt(fd);
+
        connect_one_server(fd, pipefd);
 
        return 0;
@@ -642,6 +684,25 @@ static int rcheck(int wstatus, const char *what)
        return 111;
 }
 
+static void init_rng(void)
+{
+       int fd = open("/dev/urandom", O_RDONLY);
+
+       if (fd >= 0) {
+               unsigned int foo;
+               ssize_t ret;
+
+               /* can't fail */
+               ret = read(fd, &foo, sizeof(foo));
+               assert(ret == sizeof(foo));
+
+               close(fd);
+               srand(foo);
+       } else {
+               srand(time(NULL));
+       }
+}
+
 int main(int argc, char *argv[])
 {
        int e1, e2, wstatus;
@@ -650,6 +711,8 @@ int main(int argc, char *argv[])
 
        parse_opts(argc, argv);
 
+       init_rng();
+
        e1 = pipe(pipefds);
        if (e1 < 0)
                die_perror("pipe");