Commit 8dee6ca2 authored by Matthieu Baerts's avatar Matthieu Baerts Committed by Jakub Kicinski
Browse files

selftests: mptcp: sockopt: relax expected returned size

Selftests are supposed to run on any kernels, including the old ones not
supporting all MPTCP features.

One of them is the getsockopt(SOL_MPTCP) to get info about the MPTCP
connections introduced by commit 55c42fa7 ("mptcp: add MPTCP_INFO
getsockopt") and the following ones.

We cannot guess in advance which sizes the kernel will returned: older
kernel can returned smaller sizes, e.g. recently the tcp_info structure
has been modified in commit 71fc7047 ("tcp: add rcv_wnd and
plb_rehash to TCP_INFO") where a new field has been added.

The userspace can also expect a smaller size if it is compiled with old
uAPI kernel headers.

So for these sizes, we can only check if they are above a certain
threshold, 0 for the moment. We can also only compared sizes with the
ones set by the kernel.

Link: https://github.com/multipath-tcp/mptcp_net-next/issues/368


Fixes: ce997912 ("selftests: mptcp: add mptcp getsockopt test cases")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent f3761b50
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -87,6 +87,10 @@ struct so_state {
	uint64_t tcpi_rcv_delta;
};

#ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif

static void die_perror(const char *msg)
{
	perror(msg);
@@ -349,13 +353,14 @@ static void do_getsockopt_tcp_info(struct so_state *s, int fd, size_t r, size_t
			xerror("getsockopt MPTCP_TCPINFO (tries %d, %m)");

		assert(olen <= sizeof(ti));
		assert(ti.d.size_user == ti.d.size_kernel);
		assert(ti.d.size_user == sizeof(struct tcp_info));
		assert(ti.d.size_kernel > 0);
		assert(ti.d.size_user ==
		       MIN(ti.d.size_kernel, sizeof(struct tcp_info)));
		assert(ti.d.num_subflows == 1);

		assert(olen > (socklen_t)sizeof(struct mptcp_subflow_data));
		olen -= sizeof(struct mptcp_subflow_data);
		assert(olen == sizeof(struct tcp_info));
		assert(olen == ti.d.size_user);

		if (ti.ti[0].tcpi_bytes_sent == w &&
		    ti.ti[0].tcpi_bytes_received == r)
@@ -401,13 +406,14 @@ static void do_getsockopt_subflow_addrs(int fd)
		die_perror("getsockopt MPTCP_SUBFLOW_ADDRS");

	assert(olen <= sizeof(addrs));
	assert(addrs.d.size_user == addrs.d.size_kernel);
	assert(addrs.d.size_user == sizeof(struct mptcp_subflow_addrs));
	assert(addrs.d.size_kernel > 0);
	assert(addrs.d.size_user ==
	       MIN(addrs.d.size_kernel, sizeof(struct mptcp_subflow_addrs)));
	assert(addrs.d.num_subflows == 1);

	assert(olen > (socklen_t)sizeof(struct mptcp_subflow_data));
	olen -= sizeof(struct mptcp_subflow_data);
	assert(olen == sizeof(struct mptcp_subflow_addrs));
	assert(olen == addrs.d.size_user);

	llen = sizeof(local);
	ret = getsockname(fd, (struct sockaddr *)&local, &llen);