mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-02 21:05:30 -04:00
Merge branch 'mptcp-misc-features-for-v6-20-7-0'
Matthieu Baerts says: ==================== mptcp: misc. features for v6.20/7.0 This series contains a few independent new features, and small fixes for net-next: - Patches 1-2: two small fixes linked to the MPTCP receive buffer that are not urgent, requiring code that has been recently changed, and is needed for the next patch. Because we are at the end of the cycle, it seems easier to send them to net-next, instead of dealing with conflicts between net and net-next. - Patch 3: a refactoring to simplify the code around MPTCP DRS. - Patch 4: a new trace event for MPTCP to help debugging receive buffer auto-tuning issues. - Patch 5: align internal MPTCP PM structure with NL specs, just to manipulate the same thing. - Patch 6: convert some min_t(int, ...) to min(): cleaner, and to avoid future warnings. - Patch 7: [removed] - Patch 8: sort all #include in MPTCP Diag tool in the selftests to prevent future potential conflicts and ease the reading. - Patches 9-11: improve the MPTCP Join selftest by waiting for an event instead of a "random" sleep. - Patches 12-14: some small cleanups in the selftests, seen while working on the previous patches. - Patch 15: avoid marking subtests as skipped while still validating most checks when executing the last MPTCP selftests on older kernels. ==================== Link: https://patch.msgid.link/20260203-net-next-mptcp-misc-feat-6-20-v1-0-31ec8bfc56d1@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -5,7 +5,13 @@
|
||||
#if !defined(_TRACE_MPTCP_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define _TRACE_MPTCP_H
|
||||
|
||||
#include <linux/ipv6.h>
|
||||
#include <linux/tcp.h>
|
||||
#include <linux/tracepoint.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <net/tcp.h>
|
||||
#include <linux/sock_diag.h>
|
||||
#include <net/rstreason.h>
|
||||
|
||||
#define show_mapping_status(status) \
|
||||
__print_symbolic(status, \
|
||||
@@ -178,6 +184,80 @@ TRACE_EVENT(subflow_check_data_avail,
|
||||
__entry->skb)
|
||||
);
|
||||
|
||||
#include <trace/events/net_probe_common.h>
|
||||
|
||||
TRACE_EVENT(mptcp_rcvbuf_grow,
|
||||
|
||||
TP_PROTO(struct sock *sk, int time),
|
||||
|
||||
TP_ARGS(sk, time),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(int, time)
|
||||
__field(__u32, rtt_us)
|
||||
__field(__u32, copied)
|
||||
__field(__u32, inq)
|
||||
__field(__u32, space)
|
||||
__field(__u32, ooo_space)
|
||||
__field(__u32, rcvbuf)
|
||||
__field(__u32, rcv_wnd)
|
||||
__field(__u8, scaling_ratio)
|
||||
__field(__u16, sport)
|
||||
__field(__u16, dport)
|
||||
__field(__u16, family)
|
||||
__array(__u8, saddr, 4)
|
||||
__array(__u8, daddr, 4)
|
||||
__array(__u8, saddr_v6, 16)
|
||||
__array(__u8, daddr_v6, 16)
|
||||
__field(const void *, skaddr)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
struct mptcp_sock *msk = mptcp_sk(sk);
|
||||
struct inet_sock *inet = inet_sk(sk);
|
||||
bool ofo_empty;
|
||||
__be32 *p32;
|
||||
|
||||
__entry->time = time;
|
||||
__entry->rtt_us = msk->rcvq_space.rtt_us >> 3;
|
||||
__entry->copied = msk->rcvq_space.copied;
|
||||
__entry->inq = mptcp_inq_hint(sk);
|
||||
__entry->space = msk->rcvq_space.space;
|
||||
ofo_empty = RB_EMPTY_ROOT(&msk->out_of_order_queue);
|
||||
__entry->ooo_space = ofo_empty ? 0 :
|
||||
MPTCP_SKB_CB(msk->ooo_last_skb)->end_seq -
|
||||
msk->ack_seq;
|
||||
|
||||
__entry->rcvbuf = sk->sk_rcvbuf;
|
||||
__entry->rcv_wnd = atomic64_read(&msk->rcv_wnd_sent) -
|
||||
msk->ack_seq;
|
||||
__entry->scaling_ratio = msk->scaling_ratio;
|
||||
__entry->sport = ntohs(inet->inet_sport);
|
||||
__entry->dport = ntohs(inet->inet_dport);
|
||||
__entry->family = sk->sk_family;
|
||||
|
||||
p32 = (__be32 *)__entry->saddr;
|
||||
*p32 = inet->inet_saddr;
|
||||
|
||||
p32 = (__be32 *)__entry->daddr;
|
||||
*p32 = inet->inet_daddr;
|
||||
|
||||
TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
|
||||
sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
|
||||
|
||||
__entry->skaddr = sk;
|
||||
),
|
||||
|
||||
TP_printk("time=%u rtt_us=%u copied=%u inq=%u space=%u ooo=%u scaling_ratio=%u "
|
||||
"rcvbuf=%u rcv_wnd=%u family=%d sport=%hu dport=%hu saddr=%pI4 "
|
||||
"daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c skaddr=%p",
|
||||
__entry->time, __entry->rtt_us, __entry->copied,
|
||||
__entry->inq, __entry->space, __entry->ooo_space,
|
||||
__entry->scaling_ratio, __entry->rcvbuf, __entry->rcv_wnd,
|
||||
__entry->family, __entry->sport, __entry->dport,
|
||||
__entry->saddr, __entry->daddr, __entry->saddr_v6,
|
||||
__entry->daddr_v6, __entry->skaddr)
|
||||
);
|
||||
#endif /* _TRACE_MPTCP_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
#include "protocol.h"
|
||||
#include "mib.h"
|
||||
|
||||
static unsigned int mptcp_inq_hint(const struct sock *sk);
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/mptcp.h>
|
||||
|
||||
@@ -224,9 +226,6 @@ static bool mptcp_rcvbuf_grow(struct sock *sk, u32 newval)
|
||||
do_div(grow, oldval);
|
||||
rcvwin += grow << 1;
|
||||
|
||||
if (!RB_EMPTY_ROOT(&msk->out_of_order_queue))
|
||||
rcvwin += MPTCP_SKB_CB(msk->ooo_last_skb)->end_seq - msk->ack_seq;
|
||||
|
||||
cap = READ_ONCE(net->ipv4.sysctl_tcp_rmem[2]);
|
||||
|
||||
rcvbuf = min_t(u32, mptcp_space_from_win(sk, rcvwin), cap);
|
||||
@@ -350,9 +349,6 @@ static void mptcp_data_queue_ofo(struct mptcp_sock *msk, struct sk_buff *skb)
|
||||
end:
|
||||
skb_condense(skb);
|
||||
skb_set_owner_r(skb, sk);
|
||||
/* do not grow rcvbuf for not-yet-accepted or orphaned sockets. */
|
||||
if (sk->sk_socket)
|
||||
mptcp_rcvbuf_grow(sk, msk->rcvq_space.space);
|
||||
}
|
||||
|
||||
static void mptcp_init_skb(struct sock *ssk, struct sk_buff *skb, int offset,
|
||||
@@ -1164,8 +1160,9 @@ struct mptcp_sendmsg_info {
|
||||
bool data_lock_held;
|
||||
};
|
||||
|
||||
static int mptcp_check_allowed_size(const struct mptcp_sock *msk, struct sock *ssk,
|
||||
u64 data_seq, int avail_size)
|
||||
static size_t mptcp_check_allowed_size(const struct mptcp_sock *msk,
|
||||
struct sock *ssk, u64 data_seq,
|
||||
size_t avail_size)
|
||||
{
|
||||
u64 window_end = mptcp_wnd_end(msk);
|
||||
u64 mptcp_snd_wnd;
|
||||
@@ -1174,7 +1171,7 @@ static int mptcp_check_allowed_size(const struct mptcp_sock *msk, struct sock *s
|
||||
return avail_size;
|
||||
|
||||
mptcp_snd_wnd = window_end - data_seq;
|
||||
avail_size = min_t(unsigned int, mptcp_snd_wnd, avail_size);
|
||||
avail_size = min(mptcp_snd_wnd, avail_size);
|
||||
|
||||
if (unlikely(tcp_sk(ssk)->snd_wnd < mptcp_snd_wnd)) {
|
||||
tcp_sk(ssk)->snd_wnd = min_t(u64, U32_MAX, mptcp_snd_wnd);
|
||||
@@ -1518,7 +1515,7 @@ struct sock *mptcp_subflow_get_send(struct mptcp_sock *msk)
|
||||
if (!ssk || !sk_stream_memory_free(ssk))
|
||||
return NULL;
|
||||
|
||||
burst = min_t(int, MPTCP_SEND_BURST_SIZE, mptcp_wnd_end(msk) - msk->snd_nxt);
|
||||
burst = min(MPTCP_SEND_BURST_SIZE, mptcp_wnd_end(msk) - msk->snd_nxt);
|
||||
wmem = READ_ONCE(ssk->sk_wmem_queued);
|
||||
if (!burst)
|
||||
return ssk;
|
||||
@@ -2071,6 +2068,21 @@ static int __mptcp_recvmsg_mskq(struct sock *sk, struct msghdr *msg,
|
||||
return copied;
|
||||
}
|
||||
|
||||
static void mptcp_rcv_space_init(struct mptcp_sock *msk, const struct sock *ssk)
|
||||
{
|
||||
const struct tcp_sock *tp = tcp_sk(ssk);
|
||||
|
||||
msk->rcvspace_init = 1;
|
||||
msk->rcvq_space.copied = 0;
|
||||
msk->rcvq_space.rtt_us = 0;
|
||||
|
||||
/* initial rcv_space offering made to peer */
|
||||
msk->rcvq_space.space = min_t(u32, tp->rcv_wnd,
|
||||
TCP_INIT_CWND * tp->advmss);
|
||||
if (msk->rcvq_space.space == 0)
|
||||
msk->rcvq_space.space = TCP_INIT_CWND * TCP_MSS_DEFAULT;
|
||||
}
|
||||
|
||||
/* receive buffer autotuning. See tcp_rcv_space_adjust for more information.
|
||||
*
|
||||
* Only difference: Use highest rtt estimate of the subflows in use.
|
||||
@@ -2093,8 +2105,8 @@ static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied)
|
||||
|
||||
msk->rcvq_space.copied += copied;
|
||||
|
||||
mstamp = div_u64(tcp_clock_ns(), NSEC_PER_USEC);
|
||||
time = tcp_stamp_us_delta(mstamp, msk->rcvq_space.time);
|
||||
mstamp = mptcp_stamp();
|
||||
time = tcp_stamp_us_delta(mstamp, READ_ONCE(msk->rcvq_space.time));
|
||||
|
||||
rtt_us = msk->rcvq_space.rtt_us;
|
||||
if (rtt_us && time < (rtt_us >> 3))
|
||||
@@ -2124,6 +2136,7 @@ static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied)
|
||||
if (msk->rcvq_space.copied <= msk->rcvq_space.space)
|
||||
goto new_measure;
|
||||
|
||||
trace_mptcp_rcvbuf_grow(sk, time);
|
||||
if (mptcp_rcvbuf_grow(sk, msk->rcvq_space.copied)) {
|
||||
/* Make subflows follow along. If we do not do this, we
|
||||
* get drops at subflow level if skbs can't be moved to
|
||||
@@ -3554,6 +3567,7 @@ struct sock *mptcp_sk_clone_init(const struct sock *sk,
|
||||
__mptcp_propagate_sndbuf(nsk, ssk);
|
||||
|
||||
mptcp_rcv_space_init(msk, ssk);
|
||||
msk->rcvq_space.time = mptcp_stamp();
|
||||
|
||||
if (mp_opt->suboptions & OPTION_MPTCP_MPC_ACK)
|
||||
__mptcp_subflow_fully_established(msk, subflow, mp_opt);
|
||||
@@ -3563,23 +3577,6 @@ struct sock *mptcp_sk_clone_init(const struct sock *sk,
|
||||
return nsk;
|
||||
}
|
||||
|
||||
void mptcp_rcv_space_init(struct mptcp_sock *msk, const struct sock *ssk)
|
||||
{
|
||||
const struct tcp_sock *tp = tcp_sk(ssk);
|
||||
|
||||
msk->rcvspace_init = 1;
|
||||
msk->rcvq_space.copied = 0;
|
||||
msk->rcvq_space.rtt_us = 0;
|
||||
|
||||
msk->rcvq_space.time = tp->tcp_mstamp;
|
||||
|
||||
/* initial rcv_space offering made to peer */
|
||||
msk->rcvq_space.space = min_t(u32, tp->rcv_wnd,
|
||||
TCP_INIT_CWND * tp->advmss);
|
||||
if (msk->rcvq_space.space == 0)
|
||||
msk->rcvq_space.space = TCP_INIT_CWND * TCP_MSS_DEFAULT;
|
||||
}
|
||||
|
||||
static void mptcp_destroy(struct sock *sk)
|
||||
{
|
||||
struct mptcp_sock *msk = mptcp_sk(sk);
|
||||
@@ -3768,6 +3765,7 @@ void mptcp_finish_connect(struct sock *ssk)
|
||||
* accessing the field below
|
||||
*/
|
||||
WRITE_ONCE(msk->local_key, subflow->local_key);
|
||||
WRITE_ONCE(msk->rcvq_space.time, mptcp_stamp());
|
||||
|
||||
mptcp_pm_new_connection(msk, ssk, 0);
|
||||
}
|
||||
|
||||
@@ -246,14 +246,14 @@ struct mptcp_pm_data {
|
||||
|
||||
struct mptcp_pm_local {
|
||||
struct mptcp_addr_info addr;
|
||||
u8 flags;
|
||||
u32 flags;
|
||||
int ifindex;
|
||||
};
|
||||
|
||||
struct mptcp_pm_addr_entry {
|
||||
struct list_head list;
|
||||
struct mptcp_addr_info addr;
|
||||
u8 flags;
|
||||
u32 flags;
|
||||
int ifindex;
|
||||
struct socket *lsk;
|
||||
};
|
||||
@@ -915,7 +915,11 @@ static inline bool mptcp_is_fully_established(struct sock *sk)
|
||||
READ_ONCE(mptcp_sk(sk)->fully_established);
|
||||
}
|
||||
|
||||
void mptcp_rcv_space_init(struct mptcp_sock *msk, const struct sock *ssk);
|
||||
static inline u64 mptcp_stamp(void)
|
||||
{
|
||||
return div_u64(tcp_clock_ns(), NSEC_PER_USEC);
|
||||
}
|
||||
|
||||
void mptcp_data_ready(struct sock *sk, struct sock *ssk);
|
||||
bool mptcp_finish_join(struct sock *sk);
|
||||
bool mptcp_schedule_work(struct sock *sk);
|
||||
|
||||
@@ -462,8 +462,6 @@ void __mptcp_sync_state(struct sock *sk, int state)
|
||||
|
||||
subflow = mptcp_subflow_ctx(ssk);
|
||||
__mptcp_propagate_sndbuf(sk, ssk);
|
||||
if (!msk->rcvspace_init)
|
||||
mptcp_rcv_space_init(msk, ssk);
|
||||
|
||||
if (sk->sk_state == TCP_SYN_SENT) {
|
||||
/* subflow->idsn is always available is TCP_SYN_SENT state,
|
||||
|
||||
@@ -259,7 +259,7 @@ static void set_transparent(int fd, int pf)
|
||||
}
|
||||
}
|
||||
|
||||
static void set_mptfo(int fd, int pf)
|
||||
static void set_mptfo(int fd)
|
||||
{
|
||||
int qlen = 25;
|
||||
|
||||
@@ -336,7 +336,7 @@ static int sock_listen_mptcp(const char * const listenaddr,
|
||||
set_transparent(sock, pf);
|
||||
|
||||
if (cfg_sockopt_types.mptfo)
|
||||
set_mptfo(sock, pf);
|
||||
set_mptfo(sock);
|
||||
|
||||
if (bind(sock, a->ai_addr, a->ai_addrlen) == 0)
|
||||
break; /* success */
|
||||
@@ -407,21 +407,18 @@ static int sock_connect_mptcp(const char * const remoteaddr,
|
||||
*peer = a;
|
||||
break; /* success */
|
||||
}
|
||||
perror("sendto()");
|
||||
} else {
|
||||
if (connect(sock, a->ai_addr, a->ai_addrlen) == 0) {
|
||||
*peer = a;
|
||||
break; /* success */
|
||||
}
|
||||
}
|
||||
if (cfg_sockopt_types.mptfo) {
|
||||
perror("sendto()");
|
||||
close(sock);
|
||||
sock = -1;
|
||||
} else {
|
||||
perror("connect()");
|
||||
close(sock);
|
||||
sock = -1;
|
||||
}
|
||||
|
||||
/* error */
|
||||
close(sock);
|
||||
sock = -1;
|
||||
}
|
||||
|
||||
freeaddrinfo(addr);
|
||||
|
||||
@@ -1,21 +1,24 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Copyright (c) 2025, Kylin Software */
|
||||
|
||||
#include <linux/sock_diag.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/inet_diag.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <linux/tcp.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/inet_diag.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/sock_diag.h>
|
||||
#include <linux/tcp.h>
|
||||
|
||||
#ifndef IPPROTO_MPTCP
|
||||
#define IPPROTO_MPTCP 262
|
||||
|
||||
@@ -603,8 +603,7 @@ wait_rm_addr()
|
||||
local old_cnt="${2}"
|
||||
local cnt
|
||||
|
||||
local i
|
||||
for i in $(seq 10); do
|
||||
for _ in $(seq 10); do
|
||||
cnt=$(rm_addr_count ${ns})
|
||||
[ "$cnt" = "${old_cnt}" ] || break
|
||||
sleep 0.1
|
||||
@@ -623,25 +622,22 @@ wait_rm_sf()
|
||||
local old_cnt="${2}"
|
||||
local cnt
|
||||
|
||||
local i
|
||||
for i in $(seq 10); do
|
||||
for _ in $(seq 10); do
|
||||
cnt=$(rm_sf_count ${ns})
|
||||
[ "$cnt" = "${old_cnt}" ] || break
|
||||
sleep 0.1
|
||||
done
|
||||
}
|
||||
|
||||
# $1: expected MPJ ACK Rx counter in $ns1
|
||||
wait_mpj()
|
||||
{
|
||||
local ns="${1}"
|
||||
local cnt old_cnt
|
||||
local exp_cnt="${1}"
|
||||
local cnt
|
||||
|
||||
old_cnt=$(mptcp_lib_get_counter ${ns} "MPTcpExtMPJoinAckRx")
|
||||
|
||||
local i
|
||||
for i in $(seq 10); do
|
||||
cnt=$(mptcp_lib_get_counter ${ns} "MPTcpExtMPJoinAckRx")
|
||||
[ "$cnt" = "${old_cnt}" ] || break
|
||||
for _ in $(seq 10); do
|
||||
cnt=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPJoinAckRx")
|
||||
[ "${cnt}" = "${exp_cnt}" ] && break
|
||||
sleep 0.1
|
||||
done
|
||||
}
|
||||
@@ -650,8 +646,7 @@ wait_ll_ready()
|
||||
{
|
||||
local ns="${1}"
|
||||
|
||||
local i
|
||||
for i in $(seq 50); do
|
||||
for _ in $(seq 50); do
|
||||
ip -n "${ns}" -6 addr show scope link | grep "inet6 fe80" |
|
||||
grep -qw "tentative" || break
|
||||
sleep 0.1
|
||||
@@ -1407,7 +1402,7 @@ chk_join_tx_nr()
|
||||
|
||||
count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtMPJoinSynTxCreatSkErr")
|
||||
if [ -z "$count" ]; then
|
||||
rc=${KSFT_SKIP}
|
||||
: # ignore skip
|
||||
elif [ "$count" != "$create" ]; then
|
||||
rc=${KSFT_FAIL}
|
||||
print_check "syn tx create socket error"
|
||||
@@ -1416,7 +1411,7 @@ chk_join_tx_nr()
|
||||
|
||||
count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtMPJoinSynTxBindErr")
|
||||
if [ -z "$count" ]; then
|
||||
rc=${KSFT_SKIP}
|
||||
: # ignore skip
|
||||
elif [ "$count" != "$bind" ]; then
|
||||
rc=${KSFT_FAIL}
|
||||
print_check "syn tx bind error"
|
||||
@@ -1425,7 +1420,7 @@ chk_join_tx_nr()
|
||||
|
||||
count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtMPJoinSynTxConnectErr")
|
||||
if [ -z "$count" ]; then
|
||||
rc=${KSFT_SKIP}
|
||||
: # ignore skip
|
||||
elif [ "$count" != "$connect" ]; then
|
||||
rc=${KSFT_FAIL}
|
||||
print_check "syn tx connect error"
|
||||
@@ -1451,7 +1446,7 @@ chk_fallback_nr()
|
||||
|
||||
count=$(mptcp_lib_get_counter ${!ns} "MPTcpExtInfiniteMapTx")
|
||||
if [ -z "$count" ]; then
|
||||
rc=${KSFT_SKIP}
|
||||
: # ignore skip
|
||||
elif [ "$count" != "$infinite_map_tx" ]; then
|
||||
rc=${KSFT_FAIL}
|
||||
print_check "$ns infinite map tx fallback"
|
||||
@@ -1460,7 +1455,7 @@ chk_fallback_nr()
|
||||
|
||||
count=$(mptcp_lib_get_counter ${!ns} "MPTcpExtDSSCorruptionFallback")
|
||||
if [ -z "$count" ]; then
|
||||
rc=${KSFT_SKIP}
|
||||
: # ignore skip
|
||||
elif [ "$count" != "$dss_corruption" ]; then
|
||||
rc=${KSFT_FAIL}
|
||||
print_check "$ns dss corruption fallback"
|
||||
@@ -1469,7 +1464,7 @@ chk_fallback_nr()
|
||||
|
||||
count=$(mptcp_lib_get_counter ${!ns} "MPTcpExtSimultConnectFallback")
|
||||
if [ -z "$count" ]; then
|
||||
rc=${KSFT_SKIP}
|
||||
: # ignore skip
|
||||
elif [ "$count" != "$simult_conn" ]; then
|
||||
rc=${KSFT_FAIL}
|
||||
print_check "$ns simult conn fallback"
|
||||
@@ -1478,7 +1473,7 @@ chk_fallback_nr()
|
||||
|
||||
count=$(mptcp_lib_get_counter ${!ns} "MPTcpExtMPCapableFallbackACK")
|
||||
if [ -z "$count" ]; then
|
||||
rc=${KSFT_SKIP}
|
||||
: # ignore skip
|
||||
elif [ "$count" != "$mpc_passive" ]; then
|
||||
rc=${KSFT_FAIL}
|
||||
print_check "$ns mpc passive fallback"
|
||||
@@ -1487,7 +1482,7 @@ chk_fallback_nr()
|
||||
|
||||
count=$(mptcp_lib_get_counter ${!ns} "MPTcpExtMPCapableFallbackSYNACK")
|
||||
if [ -z "$count" ]; then
|
||||
rc=${KSFT_SKIP}
|
||||
: # ignore skip
|
||||
elif [ "$count" != "$mpc_active" ]; then
|
||||
rc=${KSFT_FAIL}
|
||||
print_check "$ns mpc active fallback"
|
||||
@@ -1496,7 +1491,7 @@ chk_fallback_nr()
|
||||
|
||||
count=$(mptcp_lib_get_counter ${!ns} "MPTcpExtMPCapableDataFallback")
|
||||
if [ -z "$count" ]; then
|
||||
rc=${KSFT_SKIP}
|
||||
: # ignore skip
|
||||
elif [ "$count" != "$mpc_data" ]; then
|
||||
rc=${KSFT_FAIL}
|
||||
print_check "$ns mpc data fallback"
|
||||
@@ -1505,7 +1500,7 @@ chk_fallback_nr()
|
||||
|
||||
count=$(mptcp_lib_get_counter ${!ns} "MPTcpExtMD5SigFallback")
|
||||
if [ -z "$count" ]; then
|
||||
rc=${KSFT_SKIP}
|
||||
: # ignore skip
|
||||
elif [ "$count" != "$md5_sig" ]; then
|
||||
rc=${KSFT_FAIL}
|
||||
print_check "$ns MD5 Sig fallback"
|
||||
@@ -1514,7 +1509,7 @@ chk_fallback_nr()
|
||||
|
||||
count=$(mptcp_lib_get_counter ${!ns} "MPTcpExtDssFallback")
|
||||
if [ -z "$count" ]; then
|
||||
rc=${KSFT_SKIP}
|
||||
: # ignore skip
|
||||
elif [ "$count" != "$dss" ]; then
|
||||
rc=${KSFT_FAIL}
|
||||
print_check "$ns dss fallback"
|
||||
@@ -1590,7 +1585,7 @@ chk_join_nr()
|
||||
|
||||
count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtMPJoinSynAckHMacFailure")
|
||||
if [ -z "$count" ]; then
|
||||
rc=${KSFT_SKIP}
|
||||
: # ignore skip
|
||||
elif [ "$count" != "0" ]; then
|
||||
rc=${KSFT_FAIL}
|
||||
print_check "synack HMAC"
|
||||
@@ -1599,7 +1594,7 @@ chk_join_nr()
|
||||
|
||||
count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPJoinAckRx")
|
||||
if [ -z "$count" ]; then
|
||||
rc=${KSFT_SKIP}
|
||||
: # ignore skip
|
||||
elif [ "$count" != "$ack_nr" ]; then
|
||||
rc=${KSFT_FAIL}
|
||||
print_check "ack rx"
|
||||
@@ -1608,7 +1603,7 @@ chk_join_nr()
|
||||
|
||||
count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPJoinAckHMacFailure")
|
||||
if [ -z "$count" ]; then
|
||||
rc=${KSFT_SKIP}
|
||||
: # ignore skip
|
||||
elif [ "$count" != "0" ]; then
|
||||
rc=${KSFT_FAIL}
|
||||
print_check "ack HMAC"
|
||||
@@ -1617,7 +1612,7 @@ chk_join_nr()
|
||||
|
||||
count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPJoinRejected")
|
||||
if [ -z "$count" ]; then
|
||||
rc=${KSFT_SKIP}
|
||||
: # ignore skip
|
||||
elif [ "$count" != "$syn_rej" ]; then
|
||||
rc=${KSFT_FAIL}
|
||||
print_check "syn rejected"
|
||||
@@ -1650,7 +1645,6 @@ chk_stale_nr()
|
||||
local stale_min=$2
|
||||
local stale_max=$3
|
||||
local stale_delta=$4
|
||||
local dump_stats
|
||||
local stale_nr
|
||||
local recover_nr
|
||||
|
||||
@@ -1666,16 +1660,11 @@ chk_stale_nr()
|
||||
fail_test "got $stale_nr stale[s] $recover_nr recover[s], " \
|
||||
" expected stale in range [$stale_min..$stale_max]," \
|
||||
" stale-recover delta $stale_delta"
|
||||
dump_stats=1
|
||||
echo $ns stats
|
||||
ip -n $ns -s link show
|
||||
else
|
||||
print_ok
|
||||
fi
|
||||
|
||||
if [ "${dump_stats}" = 1 ]; then
|
||||
echo $ns stats
|
||||
ip netns exec $ns ip -s link show
|
||||
ip netns exec $ns nstat -as | grep MPTcp
|
||||
fi
|
||||
}
|
||||
|
||||
chk_add_nr()
|
||||
@@ -3718,7 +3707,6 @@ userspace_pm_add_addr()
|
||||
tk=$(mptcp_lib_evts_get_info token "$evts")
|
||||
|
||||
ip netns exec $1 ./pm_nl_ctl ann $2 token $tk id $3
|
||||
sleep 1
|
||||
}
|
||||
|
||||
# $1: ns ; $2: id
|
||||
@@ -3749,7 +3737,6 @@ userspace_pm_add_sf()
|
||||
|
||||
ip netns exec $1 ./pm_nl_ctl csf lip $2 lid $3 \
|
||||
rip $da rport $dp token $tk
|
||||
sleep 1
|
||||
}
|
||||
|
||||
# $1: ns ; $2: addr $3: event type
|
||||
@@ -3999,9 +3986,11 @@ userspace_tests()
|
||||
{ timeout_test=120 test_linkfail=128 speed=5 \
|
||||
run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
|
||||
local tests_pid=$!
|
||||
wait_mpj $ns1
|
||||
wait_event ns1 MPTCP_LIB_EVENT_ESTABLISHED 1
|
||||
userspace_pm_add_addr $ns1 10.0.2.1 10
|
||||
wait_event ns2 MPTCP_LIB_EVENT_ANNOUNCED 1
|
||||
userspace_pm_add_addr $ns1 10.0.3.1 20
|
||||
wait_event ns2 MPTCP_LIB_EVENT_ANNOUNCED 2
|
||||
chk_join_nr 2 2 2
|
||||
chk_add_nr 2 2
|
||||
chk_mptcp_info subflows 2 subflows 2
|
||||
@@ -4032,8 +4021,9 @@ userspace_tests()
|
||||
{ timeout_test=120 test_linkfail=128 speed=5 \
|
||||
run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
|
||||
local tests_pid=$!
|
||||
wait_mpj $ns2
|
||||
wait_event ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
|
||||
userspace_pm_add_sf $ns2 10.0.3.2 20
|
||||
wait_event ns2 MPTCP_LIB_EVENT_SUB_ESTABLISHED 1
|
||||
chk_join_nr 1 1 1
|
||||
chk_mptcp_info subflows 1 subflows 1
|
||||
chk_subflows_total 2 2
|
||||
@@ -4060,10 +4050,11 @@ userspace_tests()
|
||||
{ timeout_test=120 test_linkfail=128 speed=5 \
|
||||
run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
|
||||
local tests_pid=$!
|
||||
wait_mpj $ns2
|
||||
wait_event ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
|
||||
chk_mptcp_info subflows 0 subflows 0
|
||||
chk_subflows_total 1 1
|
||||
userspace_pm_add_sf $ns2 10.0.3.2 0
|
||||
wait_event ns2 MPTCP_LIB_EVENT_SUB_ESTABLISHED 1
|
||||
userspace_pm_chk_dump_addr "${ns2}" \
|
||||
"id 0 flags subflow 10.0.3.2" "id 0 subflow"
|
||||
chk_join_nr 1 1 1
|
||||
@@ -4081,8 +4072,9 @@ userspace_tests()
|
||||
{ timeout_test=120 test_linkfail=128 speed=5 \
|
||||
run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
|
||||
local tests_pid=$!
|
||||
wait_mpj $ns2
|
||||
wait_event ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
|
||||
userspace_pm_add_sf $ns2 10.0.3.2 20
|
||||
wait_event ns2 MPTCP_LIB_EVENT_SUB_ESTABLISHED 1
|
||||
chk_join_nr 1 1 1
|
||||
chk_mptcp_info subflows 1 subflows 1
|
||||
chk_subflows_total 2 2
|
||||
@@ -4105,8 +4097,9 @@ userspace_tests()
|
||||
{ timeout_test=120 test_linkfail=128 speed=5 \
|
||||
run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
|
||||
local tests_pid=$!
|
||||
wait_mpj $ns1
|
||||
wait_event ns1 MPTCP_LIB_EVENT_ESTABLISHED 1
|
||||
userspace_pm_add_addr $ns1 10.0.2.1 10
|
||||
wait_event ns2 MPTCP_LIB_EVENT_ANNOUNCED 1
|
||||
chk_join_nr 1 1 1
|
||||
chk_add_nr 1 1
|
||||
chk_mptcp_info subflows 1 subflows 1
|
||||
@@ -4133,6 +4126,7 @@ userspace_tests()
|
||||
local tests_pid=$!
|
||||
wait_event ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
|
||||
userspace_pm_add_sf $ns2 10.0.3.2 20
|
||||
wait_event ns2 MPTCP_LIB_EVENT_SUB_ESTABLISHED 1
|
||||
chk_mptcp_info subflows 1 subflows 1
|
||||
chk_subflows_total 2 2
|
||||
|
||||
@@ -4158,7 +4152,7 @@ endpoint_tests()
|
||||
{
|
||||
# subflow_rebuild_header is needed to support the implicit flag
|
||||
# userspace pm type prevents add_addr
|
||||
if reset "implicit EP" &&
|
||||
if reset_with_events "implicit EP" &&
|
||||
continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then
|
||||
pm_nl_set_limits $ns1 2 2
|
||||
pm_nl_set_limits $ns2 2 2
|
||||
@@ -4167,7 +4161,7 @@ endpoint_tests()
|
||||
run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
|
||||
local tests_pid=$!
|
||||
|
||||
wait_mpj $ns1
|
||||
wait_event ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
|
||||
pm_nl_check_endpoint "creation" \
|
||||
$ns2 10.0.2.2 id 1 flags implicit
|
||||
chk_mptcp_info subflows 1 subflows 1
|
||||
@@ -4181,6 +4175,7 @@ endpoint_tests()
|
||||
pm_nl_check_endpoint "modif is allowed" \
|
||||
$ns2 10.0.2.2 id 1 flags signal
|
||||
mptcp_lib_kill_group_wait $tests_pid
|
||||
kill_events_pids
|
||||
fi
|
||||
|
||||
if reset_with_tcp_filter "delete and re-add" ns2 10.0.3.2 REJECT OUTPUT &&
|
||||
@@ -4194,7 +4189,7 @@ endpoint_tests()
|
||||
run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
|
||||
local tests_pid=$!
|
||||
|
||||
wait_mpj $ns2
|
||||
wait_event ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
|
||||
pm_nl_check_endpoint "creation" \
|
||||
$ns2 10.0.2.2 id 2 flags subflow dev ns2eth2
|
||||
chk_subflow_nr "before delete id 2" 2
|
||||
@@ -4206,7 +4201,7 @@ endpoint_tests()
|
||||
chk_mptcp_info subflows 0 subflows 0
|
||||
|
||||
pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow
|
||||
wait_mpj $ns2
|
||||
wait_mpj 2
|
||||
chk_subflow_nr "after re-add id 2" 2
|
||||
chk_mptcp_info subflows 1 subflows 1
|
||||
|
||||
@@ -4218,7 +4213,7 @@ endpoint_tests()
|
||||
ip netns exec "${ns2}" ${iptables} -D OUTPUT -s "10.0.3.2" -p tcp -j REJECT
|
||||
pm_nl_del_endpoint $ns2 3 10.0.3.2
|
||||
pm_nl_add_endpoint $ns2 10.0.3.2 id 3 flags subflow
|
||||
wait_mpj $ns2
|
||||
wait_mpj 3
|
||||
chk_subflow_nr "after no reject" 3
|
||||
chk_mptcp_info subflows 2 subflows 2
|
||||
|
||||
@@ -4230,7 +4225,7 @@ endpoint_tests()
|
||||
chk_mptcp_info subflows 2 subflows 2 # only decr for additional sf
|
||||
|
||||
pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow
|
||||
wait_mpj $ns2
|
||||
wait_mpj $((3 + i))
|
||||
chk_subflow_nr "after re-add id 0 ($i)" 3
|
||||
chk_mptcp_info subflows 3 subflows 3
|
||||
done
|
||||
@@ -4272,7 +4267,7 @@ endpoint_tests()
|
||||
run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
|
||||
local tests_pid=$!
|
||||
|
||||
wait_mpj $ns2
|
||||
wait_event ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
|
||||
pm_nl_check_endpoint "creation" \
|
||||
$ns1 10.0.2.1 id 1 flags signal
|
||||
chk_subflow_nr "before delete" 2
|
||||
@@ -4288,7 +4283,7 @@ endpoint_tests()
|
||||
|
||||
pm_nl_add_endpoint $ns1 10.0.2.1 id 1 flags signal
|
||||
pm_nl_add_endpoint $ns1 10.0.3.1 id 2 flags signal
|
||||
wait_mpj $ns2
|
||||
wait_mpj 3
|
||||
chk_subflow_nr "after re-add" 3
|
||||
chk_mptcp_info subflows 2 subflows 2
|
||||
chk_mptcp_info add_addr_signal 2 add_addr_accepted 2
|
||||
@@ -4300,7 +4295,7 @@ endpoint_tests()
|
||||
chk_mptcp_info add_addr_signal 2 add_addr_accepted 2
|
||||
|
||||
pm_nl_add_endpoint $ns1 10.0.1.1 id 99 flags signal
|
||||
wait_mpj $ns2
|
||||
wait_mpj 4
|
||||
chk_subflow_nr "after re-add ID 0" 3
|
||||
chk_mptcp_info subflows 3 subflows 3
|
||||
chk_mptcp_info add_addr_signal 3 add_addr_accepted 2
|
||||
@@ -4312,7 +4307,7 @@ endpoint_tests()
|
||||
chk_mptcp_info add_addr_signal 2 add_addr_accepted 2
|
||||
|
||||
pm_nl_add_endpoint $ns1 10.0.1.1 id 88 flags signal
|
||||
wait_mpj $ns2
|
||||
wait_mpj 5
|
||||
chk_subflow_nr "after re-re-add ID 0" 3
|
||||
chk_mptcp_info subflows 3 subflows 3
|
||||
chk_mptcp_info add_addr_signal 3 add_addr_accepted 2
|
||||
@@ -4361,9 +4356,9 @@ endpoint_tests()
|
||||
wait_rm_addr $ns2 0
|
||||
ip netns exec "${ns2}" ${iptables} -D OUTPUT -s "10.0.3.2" -p tcp -j REJECT
|
||||
pm_nl_add_endpoint $ns2 10.0.3.2 id 3 flags subflow
|
||||
wait_mpj $ns2
|
||||
wait_mpj 1
|
||||
pm_nl_add_endpoint $ns1 10.0.3.1 id 2 flags signal
|
||||
wait_mpj $ns2
|
||||
wait_mpj 2
|
||||
mptcp_lib_kill_group_wait $tests_pid
|
||||
|
||||
join_syn_tx=3 join_connect_err=1 \
|
||||
|
||||
Reference in New Issue
Block a user