selftests: mptcp: check IP_TOS in/out are the same
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>
This commit is contained in:
parent
3b1e21eb60
commit
edb596e80c
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue