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 commit55c42fa7fa
("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 commit71fc704768
("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:ce9979129a
("selftests: mptcp: add mptcp getsockopt test cases") Cc: stable@vger.kernel.org Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
f3761b50b8
commit
8dee6ca2ac
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue