mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 19:29:37 +00:00
Merge branch 'mptcp-cleanups'
Mat Martineau says: ==================== MPTCP: Cleanup and address advertisement fixes This patch series contains cleanup and fixes we have been testing in the MPTCP tree. MPTCP uses TCP option headers to advertise additional address information after an initial connection is established. The main fixes here deal with making those advertisements more reliable and improving the way subflows are created after an advertisement is received. Patches 1, 2, 4, 10, and 12 are for various cleanup or refactoring. Patch 3 skips an extra connection attempt if there's already a subflow connection for the newly received advertisement. Patches 5, 6, and 7 make sure that the next address is advertised when there are multiple addresses to share, the advertisement has been retried, and the peer has not echoed the advertisement. Self tests are updated. Patches 8 and 9 fix a problem similar to 5/6/7, but covers a case where the failure was due to a subflow connection not completing. Patches 11 and 13 send a bare ack to revoke an advertisement rather than waiting for other activity to trigger a packet send. This mirrors the way acks are sent for new advertisements. Self test is included. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
f59798b8f6
7 changed files with 173 additions and 72 deletions
|
@ -882,7 +882,7 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
|
|||
subflow->pm_notified = 1;
|
||||
if (subflow->mp_join) {
|
||||
clear_3rdack_retransmission(ssk);
|
||||
mptcp_pm_subflow_established(msk, subflow);
|
||||
mptcp_pm_subflow_established(msk);
|
||||
} else {
|
||||
mptcp_pm_fully_established(msk, ssk, GFP_ATOMIC);
|
||||
}
|
||||
|
@ -1040,6 +1040,7 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
|
|||
mptcp_pm_add_addr_received(msk, &addr);
|
||||
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDR);
|
||||
} else {
|
||||
mptcp_pm_add_addr_echoed(msk, &addr);
|
||||
mptcp_pm_del_add_timer(msk, &addr);
|
||||
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADD);
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
int mptcp_pm_announce_addr(struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr,
|
||||
bool echo, bool port)
|
||||
bool echo)
|
||||
{
|
||||
u8 add_addr = READ_ONCE(msk->pm.addr_signal);
|
||||
|
||||
|
@ -33,7 +33,7 @@ int mptcp_pm_announce_addr(struct mptcp_sock *msk,
|
|||
add_addr |= BIT(MPTCP_ADD_ADDR_ECHO);
|
||||
if (addr->family == AF_INET6)
|
||||
add_addr |= BIT(MPTCP_ADD_ADDR_IPV6);
|
||||
if (port)
|
||||
if (addr->port)
|
||||
add_addr |= BIT(MPTCP_ADD_ADDR_PORT);
|
||||
WRITE_ONCE(msk->pm.addr_signal, add_addr);
|
||||
return 0;
|
||||
|
@ -53,6 +53,7 @@ int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_
|
|||
msk->pm.rm_list_tx = *rm_list;
|
||||
rm_addr |= BIT(MPTCP_RM_ADDR_SIGNAL);
|
||||
WRITE_ONCE(msk->pm.addr_signal, rm_addr);
|
||||
mptcp_pm_nl_addr_send_ack(msk);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -152,8 +153,7 @@ void mptcp_pm_connection_closed(struct mptcp_sock *msk)
|
|||
pr_debug("msk=%p", msk);
|
||||
}
|
||||
|
||||
void mptcp_pm_subflow_established(struct mptcp_sock *msk,
|
||||
struct mptcp_subflow_context *subflow)
|
||||
void mptcp_pm_subflow_established(struct mptcp_sock *msk)
|
||||
{
|
||||
struct mptcp_pm_data *pm = &msk->pm;
|
||||
|
||||
|
@ -188,7 +188,7 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
|
|||
spin_lock_bh(&pm->lock);
|
||||
|
||||
if (!READ_ONCE(pm->accept_addr)) {
|
||||
mptcp_pm_announce_addr(msk, addr, true, addr->port);
|
||||
mptcp_pm_announce_addr(msk, addr, true);
|
||||
mptcp_pm_add_addr_send_ack(msk);
|
||||
} else if (mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED)) {
|
||||
pm->remote = *addr;
|
||||
|
@ -197,6 +197,21 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
|
|||
spin_unlock_bh(&pm->lock);
|
||||
}
|
||||
|
||||
void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
|
||||
struct mptcp_addr_info *addr)
|
||||
{
|
||||
struct mptcp_pm_data *pm = &msk->pm;
|
||||
|
||||
pr_debug("msk=%p", msk);
|
||||
|
||||
spin_lock_bh(&pm->lock);
|
||||
|
||||
if (mptcp_lookup_anno_list_by_saddr(msk, addr) && READ_ONCE(pm->work_pending))
|
||||
mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED);
|
||||
|
||||
spin_unlock_bh(&pm->lock);
|
||||
}
|
||||
|
||||
void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk)
|
||||
{
|
||||
if (!mptcp_pm_should_add_signal(msk))
|
||||
|
|
|
@ -56,8 +56,6 @@ struct pm_nl_pernet {
|
|||
#define MPTCP_PM_ADDR_MAX 8
|
||||
#define ADD_ADDR_RETRANS_MAX 3
|
||||
|
||||
static void mptcp_pm_nl_add_addr_send_ack(struct mptcp_sock *msk);
|
||||
|
||||
static bool addresses_equal(const struct mptcp_addr_info *a,
|
||||
struct mptcp_addr_info *b, bool use_port)
|
||||
{
|
||||
|
@ -140,6 +138,24 @@ static bool lookup_subflow_by_saddr(const struct list_head *list,
|
|||
return false;
|
||||
}
|
||||
|
||||
static bool lookup_subflow_by_daddr(const struct list_head *list,
|
||||
struct mptcp_addr_info *daddr)
|
||||
{
|
||||
struct mptcp_subflow_context *subflow;
|
||||
struct mptcp_addr_info cur;
|
||||
struct sock_common *skc;
|
||||
|
||||
list_for_each_entry(subflow, list, node) {
|
||||
skc = (struct sock_common *)mptcp_subflow_tcp_sock(subflow);
|
||||
|
||||
remote_address(skc, &cur);
|
||||
if (addresses_equal(&cur, daddr, daddr->port))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static struct mptcp_pm_addr_entry *
|
||||
select_local_address(const struct pm_nl_pernet *pernet,
|
||||
struct mptcp_sock *msk)
|
||||
|
@ -245,9 +261,9 @@ static void check_work_pending(struct mptcp_sock *msk)
|
|||
WRITE_ONCE(msk->pm.work_pending, false);
|
||||
}
|
||||
|
||||
static struct mptcp_pm_add_entry *
|
||||
lookup_anno_list_by_saddr(struct mptcp_sock *msk,
|
||||
struct mptcp_addr_info *addr)
|
||||
struct mptcp_pm_add_entry *
|
||||
mptcp_lookup_anno_list_by_saddr(struct mptcp_sock *msk,
|
||||
struct mptcp_addr_info *addr)
|
||||
{
|
||||
struct mptcp_pm_add_entry *entry;
|
||||
|
||||
|
@ -308,7 +324,7 @@ static void mptcp_pm_add_timer(struct timer_list *timer)
|
|||
|
||||
if (!mptcp_pm_should_add_signal(msk)) {
|
||||
pr_debug("retransmit ADD_ADDR id=%d", entry->addr.id);
|
||||
mptcp_pm_announce_addr(msk, &entry->addr, false, entry->addr.port);
|
||||
mptcp_pm_announce_addr(msk, &entry->addr, false);
|
||||
mptcp_pm_add_addr_send_ack(msk);
|
||||
entry->retrans_times++;
|
||||
}
|
||||
|
@ -319,6 +335,9 @@ static void mptcp_pm_add_timer(struct timer_list *timer)
|
|||
|
||||
spin_unlock_bh(&msk->pm.lock);
|
||||
|
||||
if (entry->retrans_times == ADD_ADDR_RETRANS_MAX)
|
||||
mptcp_pm_subflow_established(msk);
|
||||
|
||||
out:
|
||||
__sock_put(sk);
|
||||
}
|
||||
|
@ -331,7 +350,7 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk,
|
|||
struct sock *sk = (struct sock *)msk;
|
||||
|
||||
spin_lock_bh(&msk->pm.lock);
|
||||
entry = lookup_anno_list_by_saddr(msk, addr);
|
||||
entry = mptcp_lookup_anno_list_by_saddr(msk, addr);
|
||||
if (entry)
|
||||
entry->retrans_times = ADD_ADDR_RETRANS_MAX;
|
||||
spin_unlock_bh(&msk->pm.lock);
|
||||
|
@ -351,7 +370,7 @@ static bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
|
|||
|
||||
lockdep_assert_held(&msk->pm.lock);
|
||||
|
||||
if (lookup_anno_list_by_saddr(msk, &entry->addr))
|
||||
if (mptcp_lookup_anno_list_by_saddr(msk, &entry->addr))
|
||||
return false;
|
||||
|
||||
add_entry = kmalloc(sizeof(*add_entry), GFP_ATOMIC);
|
||||
|
@ -417,8 +436,8 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
|
|||
if (local) {
|
||||
if (mptcp_pm_alloc_anno_list(msk, local)) {
|
||||
msk->pm.add_addr_signaled++;
|
||||
mptcp_pm_announce_addr(msk, &local->addr, false, local->addr.port);
|
||||
mptcp_pm_nl_add_addr_send_ack(msk);
|
||||
mptcp_pm_announce_addr(msk, &local->addr, false);
|
||||
mptcp_pm_nl_addr_send_ack(msk);
|
||||
}
|
||||
} else {
|
||||
/* pick failed, avoid fourther attempts later */
|
||||
|
@ -468,7 +487,6 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
|
|||
struct mptcp_addr_info remote;
|
||||
struct mptcp_addr_info local;
|
||||
unsigned int subflows_max;
|
||||
bool use_port = false;
|
||||
|
||||
add_addr_accept_max = mptcp_pm_get_add_addr_accept_max(msk);
|
||||
subflows_max = mptcp_pm_get_subflows_max(msk);
|
||||
|
@ -476,6 +494,10 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
|
|||
pr_debug("accepted %d:%d remote family %d",
|
||||
msk->pm.add_addr_accepted, add_addr_accept_max,
|
||||
msk->pm.remote.family);
|
||||
|
||||
if (lookup_subflow_by_daddr(&msk->conn_list, &msk->pm.remote))
|
||||
goto add_addr_echo;
|
||||
|
||||
msk->pm.add_addr_accepted++;
|
||||
msk->pm.subflows++;
|
||||
if (msk->pm.add_addr_accepted >= add_addr_accept_max ||
|
||||
|
@ -488,8 +510,6 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
|
|||
remote = msk->pm.remote;
|
||||
if (!remote.port)
|
||||
remote.port = sk->sk_dport;
|
||||
else
|
||||
use_port = true;
|
||||
memset(&local, 0, sizeof(local));
|
||||
local.family = remote.family;
|
||||
|
||||
|
@ -497,28 +517,30 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
|
|||
__mptcp_subflow_connect(sk, &local, &remote);
|
||||
spin_lock_bh(&msk->pm.lock);
|
||||
|
||||
mptcp_pm_announce_addr(msk, &remote, true, use_port);
|
||||
mptcp_pm_nl_add_addr_send_ack(msk);
|
||||
add_addr_echo:
|
||||
mptcp_pm_announce_addr(msk, &msk->pm.remote, true);
|
||||
mptcp_pm_nl_addr_send_ack(msk);
|
||||
}
|
||||
|
||||
static void mptcp_pm_nl_add_addr_send_ack(struct mptcp_sock *msk)
|
||||
void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk)
|
||||
{
|
||||
struct mptcp_subflow_context *subflow;
|
||||
|
||||
msk_owned_by_me(msk);
|
||||
lockdep_assert_held(&msk->pm.lock);
|
||||
|
||||
if (!mptcp_pm_should_add_signal(msk))
|
||||
if (!mptcp_pm_should_add_signal(msk) &&
|
||||
!mptcp_pm_should_rm_signal(msk))
|
||||
return;
|
||||
|
||||
__mptcp_flush_join_list(msk);
|
||||
subflow = list_first_entry_or_null(&msk->conn_list, typeof(*subflow), node);
|
||||
if (subflow) {
|
||||
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
|
||||
u8 add_addr;
|
||||
|
||||
spin_unlock_bh(&msk->pm.lock);
|
||||
pr_debug("send ack for add_addr%s%s",
|
||||
pr_debug("send ack for %s%s%s",
|
||||
mptcp_pm_should_add_signal(msk) ? "add_addr" : "rm_addr",
|
||||
mptcp_pm_should_add_signal_ipv6(msk) ? " [ipv6]" : "",
|
||||
mptcp_pm_should_add_signal_port(msk) ? " [port]" : "");
|
||||
|
||||
|
@ -526,13 +548,6 @@ static void mptcp_pm_nl_add_addr_send_ack(struct mptcp_sock *msk)
|
|||
tcp_send_ack(ssk);
|
||||
release_sock(ssk);
|
||||
spin_lock_bh(&msk->pm.lock);
|
||||
|
||||
add_addr = READ_ONCE(msk->pm.addr_signal);
|
||||
if (mptcp_pm_should_add_signal_ipv6(msk))
|
||||
add_addr &= ~BIT(MPTCP_ADD_ADDR_IPV6);
|
||||
if (mptcp_pm_should_add_signal_port(msk))
|
||||
add_addr &= ~BIT(MPTCP_ADD_ADDR_PORT);
|
||||
WRITE_ONCE(msk->pm.addr_signal, add_addr);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -627,7 +642,7 @@ void mptcp_pm_nl_work(struct mptcp_sock *msk)
|
|||
}
|
||||
if (pm->status & BIT(MPTCP_PM_ADD_ADDR_SEND_ACK)) {
|
||||
pm->status &= ~BIT(MPTCP_PM_ADD_ADDR_SEND_ACK);
|
||||
mptcp_pm_nl_add_addr_send_ack(msk);
|
||||
mptcp_pm_nl_addr_send_ack(msk);
|
||||
}
|
||||
if (pm->status & BIT(MPTCP_PM_RM_ADDR_RECEIVED)) {
|
||||
pm->status &= ~BIT(MPTCP_PM_RM_ADDR_RECEIVED);
|
||||
|
|
|
@ -2047,28 +2047,21 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||
return copied;
|
||||
}
|
||||
|
||||
static void mptcp_retransmit_handler(struct sock *sk)
|
||||
{
|
||||
struct mptcp_sock *msk = mptcp_sk(sk);
|
||||
|
||||
set_bit(MPTCP_WORK_RTX, &msk->flags);
|
||||
mptcp_schedule_work(sk);
|
||||
}
|
||||
|
||||
static void mptcp_retransmit_timer(struct timer_list *t)
|
||||
{
|
||||
struct inet_connection_sock *icsk = from_timer(icsk, t,
|
||||
icsk_retransmit_timer);
|
||||
struct sock *sk = &icsk->icsk_inet.sk;
|
||||
struct mptcp_sock *msk = mptcp_sk(sk);
|
||||
|
||||
bh_lock_sock(sk);
|
||||
if (!sock_owned_by_user(sk)) {
|
||||
mptcp_retransmit_handler(sk);
|
||||
/* we need a process context to retransmit */
|
||||
if (!test_and_set_bit(MPTCP_WORK_RTX, &msk->flags))
|
||||
mptcp_schedule_work(sk);
|
||||
} else {
|
||||
/* delegate our work to tcp_release_cb() */
|
||||
if (!test_and_set_bit(TCP_WRITE_TIMER_DEFERRED,
|
||||
&sk->sk_tsq_flags))
|
||||
sock_hold(sk);
|
||||
set_bit(MPTCP_RETRANSMIT, &msk->flags);
|
||||
}
|
||||
bh_unlock_sock(sk);
|
||||
sock_put(sk);
|
||||
|
@ -2958,17 +2951,16 @@ void __mptcp_check_push(struct sock *sk, struct sock *ssk)
|
|||
}
|
||||
}
|
||||
|
||||
#define MPTCP_DEFERRED_ALL (TCPF_WRITE_TIMER_DEFERRED)
|
||||
|
||||
/* processes deferred events and flush wmem */
|
||||
static void mptcp_release_cb(struct sock *sk)
|
||||
{
|
||||
unsigned long flags, nflags;
|
||||
|
||||
for (;;) {
|
||||
flags = 0;
|
||||
unsigned long flags = 0;
|
||||
|
||||
if (test_and_clear_bit(MPTCP_PUSH_PENDING, &mptcp_sk(sk)->flags))
|
||||
flags |= BIT(MPTCP_PUSH_PENDING);
|
||||
if (test_and_clear_bit(MPTCP_RETRANSMIT, &mptcp_sk(sk)->flags))
|
||||
flags |= BIT(MPTCP_RETRANSMIT);
|
||||
if (!flags)
|
||||
break;
|
||||
|
||||
|
@ -2983,6 +2975,8 @@ static void mptcp_release_cb(struct sock *sk)
|
|||
spin_unlock_bh(&sk->sk_lock.slock);
|
||||
if (flags & BIT(MPTCP_PUSH_PENDING))
|
||||
__mptcp_push_pending(sk, 0);
|
||||
if (flags & BIT(MPTCP_RETRANSMIT))
|
||||
__mptcp_retrans(sk);
|
||||
|
||||
cond_resched();
|
||||
spin_lock_bh(&sk->sk_lock.slock);
|
||||
|
@ -2998,20 +2992,6 @@ static void mptcp_release_cb(struct sock *sk)
|
|||
*/
|
||||
__mptcp_update_wmem(sk);
|
||||
__mptcp_update_rmem(sk);
|
||||
|
||||
do {
|
||||
flags = sk->sk_tsq_flags;
|
||||
if (!(flags & MPTCP_DEFERRED_ALL))
|
||||
return;
|
||||
nflags = flags & ~MPTCP_DEFERRED_ALL;
|
||||
} while (cmpxchg(&sk->sk_tsq_flags, flags, nflags) != flags);
|
||||
|
||||
sock_release_ownership(sk);
|
||||
|
||||
if (flags & TCPF_WRITE_TIMER_DEFERRED) {
|
||||
mptcp_retransmit_handler(sk);
|
||||
__sock_put(sk);
|
||||
}
|
||||
}
|
||||
|
||||
void mptcp_subflow_process_delegated(struct sock *ssk)
|
||||
|
|
|
@ -104,6 +104,7 @@
|
|||
#define MPTCP_PUSH_PENDING 6
|
||||
#define MPTCP_CLEAN_UNA 7
|
||||
#define MPTCP_ERROR_REPORT 8
|
||||
#define MPTCP_RETRANSMIT 9
|
||||
|
||||
static inline bool before64(__u64 seq1, __u64 seq2)
|
||||
{
|
||||
|
@ -642,12 +643,14 @@ void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ssk, int
|
|||
void mptcp_pm_fully_established(struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp);
|
||||
bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk);
|
||||
void mptcp_pm_connection_closed(struct mptcp_sock *msk);
|
||||
void mptcp_pm_subflow_established(struct mptcp_sock *msk,
|
||||
struct mptcp_subflow_context *subflow);
|
||||
void mptcp_pm_subflow_established(struct mptcp_sock *msk);
|
||||
void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id);
|
||||
void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr);
|
||||
void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
|
||||
struct mptcp_addr_info *addr);
|
||||
void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk);
|
||||
void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk);
|
||||
void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
|
||||
const struct mptcp_rm_list *rm_list);
|
||||
void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);
|
||||
|
@ -659,10 +662,13 @@ bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk);
|
|||
struct mptcp_pm_add_entry *
|
||||
mptcp_pm_del_add_timer(struct mptcp_sock *msk,
|
||||
struct mptcp_addr_info *addr);
|
||||
struct mptcp_pm_add_entry *
|
||||
mptcp_lookup_anno_list_by_saddr(struct mptcp_sock *msk,
|
||||
struct mptcp_addr_info *addr);
|
||||
|
||||
int mptcp_pm_announce_addr(struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr,
|
||||
bool echo, bool port);
|
||||
bool echo);
|
||||
int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
|
||||
int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
|
||||
|
||||
|
|
|
@ -55,6 +55,7 @@ static int cfg_sndbuf;
|
|||
static int cfg_rcvbuf;
|
||||
static bool cfg_join;
|
||||
static bool cfg_remove;
|
||||
static unsigned int cfg_do_w;
|
||||
static int cfg_wait;
|
||||
|
||||
static void die_usage(void)
|
||||
|
@ -272,8 +273,8 @@ static size_t do_rnd_write(const int fd, char *buf, const size_t len)
|
|||
if (cfg_join && first && do_w > 100)
|
||||
do_w = 100;
|
||||
|
||||
if (cfg_remove && do_w > 50)
|
||||
do_w = 50;
|
||||
if (cfg_remove && do_w > cfg_do_w)
|
||||
do_w = cfg_do_w;
|
||||
|
||||
bw = write(fd, buf, do_w);
|
||||
if (bw < 0)
|
||||
|
@ -829,7 +830,7 @@ static void parse_opts(int argc, char **argv)
|
|||
{
|
||||
int c;
|
||||
|
||||
while ((c = getopt(argc, argv, "6jrlp:s:hut:m:S:R:w:")) != -1) {
|
||||
while ((c = getopt(argc, argv, "6jr:lp:s:hut:m:S:R:w:")) != -1) {
|
||||
switch (c) {
|
||||
case 'j':
|
||||
cfg_join = true;
|
||||
|
@ -840,6 +841,9 @@ static void parse_opts(int argc, char **argv)
|
|||
cfg_remove = true;
|
||||
cfg_mode = CFG_MODE_POLL;
|
||||
cfg_wait = 400000;
|
||||
cfg_do_w = atoi(optarg);
|
||||
if (cfg_do_w <= 0)
|
||||
cfg_do_w = 50;
|
||||
break;
|
||||
case 'l':
|
||||
listen_mode = true;
|
||||
|
|
|
@ -234,8 +234,10 @@ do_transfer()
|
|||
|
||||
if [ $speed = "fast" ]; then
|
||||
mptcp_connect="./mptcp_connect -j"
|
||||
else
|
||||
mptcp_connect="./mptcp_connect -r"
|
||||
elif [ $speed = "slow" ]; then
|
||||
mptcp_connect="./mptcp_connect -r 50"
|
||||
elif [ $speed = "least" ]; then
|
||||
mptcp_connect="./mptcp_connect -r 10"
|
||||
fi
|
||||
|
||||
local local_addr
|
||||
|
@ -783,6 +785,28 @@ signal_address_tests()
|
|||
run_tests $ns1 $ns2 10.0.1.1
|
||||
chk_join_nr "multiple subflows and signal" 3 3 3
|
||||
chk_add_nr 1 1
|
||||
|
||||
# signal addresses
|
||||
reset
|
||||
ip netns exec $ns1 ./pm_nl_ctl limits 3 3
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal
|
||||
ip netns exec $ns2 ./pm_nl_ctl limits 3 3
|
||||
run_tests $ns1 $ns2 10.0.1.1
|
||||
chk_join_nr "signal addresses" 3 3 3
|
||||
chk_add_nr 3 3
|
||||
|
||||
# signal invalid addresses
|
||||
reset
|
||||
ip netns exec $ns1 ./pm_nl_ctl limits 3 3
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.14.1 flags signal
|
||||
ip netns exec $ns2 ./pm_nl_ctl limits 3 3
|
||||
run_tests $ns1 $ns2 10.0.1.1
|
||||
chk_join_nr "signal invalid addresses" 1 1 1
|
||||
chk_add_nr 3 3
|
||||
}
|
||||
|
||||
link_failure_tests()
|
||||
|
@ -818,6 +842,26 @@ add_addr_timeout_tests()
|
|||
run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
|
||||
chk_join_nr "signal address, ADD_ADDR6 timeout" 1 1 1
|
||||
chk_add_nr 4 0
|
||||
|
||||
# signal addresses timeout
|
||||
reset_with_add_addr_timeout
|
||||
ip netns exec $ns1 ./pm_nl_ctl limits 2 2
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
|
||||
ip netns exec $ns2 ./pm_nl_ctl limits 2 2
|
||||
run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
|
||||
chk_join_nr "signal addresses, ADD_ADDR timeout" 2 2 2
|
||||
chk_add_nr 8 0
|
||||
|
||||
# signal invalid addresses timeout
|
||||
reset_with_add_addr_timeout
|
||||
ip netns exec $ns1 ./pm_nl_ctl limits 2 2
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
|
||||
ip netns exec $ns2 ./pm_nl_ctl limits 2 2
|
||||
run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
|
||||
chk_join_nr "invalid address, ADD_ADDR timeout" 1 1 1
|
||||
chk_add_nr 8 0
|
||||
}
|
||||
|
||||
remove_tests()
|
||||
|
@ -874,6 +918,30 @@ remove_tests()
|
|||
chk_add_nr 1 1
|
||||
chk_rm_nr 2 2
|
||||
|
||||
# addresses remove
|
||||
reset
|
||||
ip netns exec $ns1 ./pm_nl_ctl limits 3 3
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal id 250
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal
|
||||
ip netns exec $ns2 ./pm_nl_ctl limits 3 3
|
||||
run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
|
||||
chk_join_nr "remove addresses" 3 3 3
|
||||
chk_add_nr 3 3
|
||||
chk_rm_nr 3 3 invert
|
||||
|
||||
# invalid addresses remove
|
||||
reset
|
||||
ip netns exec $ns1 ./pm_nl_ctl limits 3 3
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.14.1 flags signal
|
||||
ip netns exec $ns2 ./pm_nl_ctl limits 3 3
|
||||
run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
|
||||
chk_join_nr "remove invalid addresses" 1 1 1
|
||||
chk_add_nr 3 3
|
||||
chk_rm_nr 3 1 invert
|
||||
|
||||
# subflows and signal, flush
|
||||
reset
|
||||
ip netns exec $ns1 ./pm_nl_ctl limits 0 3
|
||||
|
@ -908,6 +976,18 @@ remove_tests()
|
|||
chk_join_nr "flush addresses" 3 3 3
|
||||
chk_add_nr 3 3
|
||||
chk_rm_nr 3 3 invert
|
||||
|
||||
# invalid addresses flush
|
||||
reset
|
||||
ip netns exec $ns1 ./pm_nl_ctl limits 3 3
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
|
||||
ip netns exec $ns1 ./pm_nl_ctl add 10.0.14.1 flags signal
|
||||
ip netns exec $ns2 ./pm_nl_ctl limits 3 3
|
||||
run_tests $ns1 $ns2 10.0.1.1 0 -8 0 slow
|
||||
chk_join_nr "flush invalid addresses" 1 1 1
|
||||
chk_add_nr 3 3
|
||||
chk_rm_nr 3 1 invert
|
||||
}
|
||||
|
||||
add_tests()
|
||||
|
|
Loading…
Reference in a new issue