Skip to content

Commit ddd14bb

Browse files
geliangtangdavem330
authored andcommitted
mptcp: remove multi subflows in PM
This patch dealt with removing multi subflows in PM: In mptcp_pm_remove_subflow, changed the input parameter local_id as an list of removing address ids, and passed the list to mptcp_pm_nl_rm_subflow_received. In mptcp_pm_nl_rm_subflow_received, iterated each address id from the received ids list. Then shut down and closed each address id's subsocket. In mptcp_nl_remove_subflow_and_signal_addr, put the single address id into an ids list, and passed it to mptcp_pm_remove_subflow. Signed-off-by: Geliang Tang <[email protected]> Signed-off-by: Mat Martineau <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent d0b698c commit ddd14bb

File tree

3 files changed

+31
-22
lines changed

3 files changed

+31
-22
lines changed

net/mptcp/pm.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,12 @@ int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_
5656
return 0;
5757
}
5858

59-
int mptcp_pm_remove_subflow(struct mptcp_sock *msk, u8 local_id)
59+
int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list)
6060
{
61-
pr_debug("msk=%p, local_id=%d", msk, local_id);
61+
pr_debug("msk=%p, rm_list_nr=%d", msk, rm_list->nr);
6262

6363
spin_lock_bh(&msk->pm.lock);
64-
mptcp_pm_nl_rm_subflow_received(msk, local_id);
64+
mptcp_pm_nl_rm_subflow_received(msk, rm_list);
6565
spin_unlock_bh(&msk->pm.lock);
6666
return 0;
6767
}

net/mptcp/pm_netlink.c

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -645,39 +645,44 @@ void mptcp_pm_nl_work(struct mptcp_sock *msk)
645645
spin_unlock_bh(&msk->pm.lock);
646646
}
647647

648-
void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk, u8 rm_id)
648+
void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk,
649+
const struct mptcp_rm_list *rm_list)
649650
{
650651
struct mptcp_subflow_context *subflow, *tmp;
651652
struct sock *sk = (struct sock *)msk;
653+
u8 i;
652654

653-
pr_debug("subflow rm_id %d", rm_id);
655+
pr_debug("subflow rm_list_nr %d", rm_list->nr);
654656

655657
msk_owned_by_me(msk);
656658

657-
if (!rm_id)
659+
if (!rm_list->nr)
658660
return;
659661

660662
if (list_empty(&msk->conn_list))
661663
return;
662664

663-
list_for_each_entry_safe(subflow, tmp, &msk->conn_list, node) {
664-
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
665-
int how = RCV_SHUTDOWN | SEND_SHUTDOWN;
665+
for (i = 0; i < rm_list->nr; i++) {
666+
list_for_each_entry_safe(subflow, tmp, &msk->conn_list, node) {
667+
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
668+
int how = RCV_SHUTDOWN | SEND_SHUTDOWN;
666669

667-
if (rm_id != subflow->local_id)
668-
continue;
670+
if (rm_list->ids[i] != subflow->local_id)
671+
continue;
669672

670-
spin_unlock_bh(&msk->pm.lock);
671-
mptcp_subflow_shutdown(sk, ssk, how);
672-
mptcp_close_ssk(sk, ssk, subflow);
673-
spin_lock_bh(&msk->pm.lock);
673+
pr_debug(" -> subflow rm_list_ids[%d]=%u", i, rm_list->ids[i]);
674+
spin_unlock_bh(&msk->pm.lock);
675+
mptcp_subflow_shutdown(sk, ssk, how);
676+
mptcp_close_ssk(sk, ssk, subflow);
677+
spin_lock_bh(&msk->pm.lock);
674678

675-
msk->pm.local_addr_used--;
676-
msk->pm.subflows--;
679+
msk->pm.local_addr_used--;
680+
msk->pm.subflows--;
677681

678-
__MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW);
682+
__MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW);
679683

680-
break;
684+
break;
685+
}
681686
}
682687
}
683688

@@ -1094,9 +1099,12 @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
10941099
{
10951100
struct mptcp_sock *msk;
10961101
long s_slot = 0, s_num = 0;
1102+
struct mptcp_rm_list list = { .nr = 0 };
10971103

10981104
pr_debug("remove_id=%d", addr->id);
10991105

1106+
list.ids[list.nr++] = addr->id;
1107+
11001108
while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
11011109
struct sock *sk = (struct sock *)msk;
11021110
bool remove_subflow;
@@ -1110,7 +1118,7 @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
11101118
remove_subflow = lookup_subflow_by_saddr(&msk->conn_list, addr);
11111119
mptcp_pm_remove_anno_addr(msk, addr, remove_subflow);
11121120
if (remove_subflow)
1113-
mptcp_pm_remove_subflow(msk, addr->id);
1121+
mptcp_pm_remove_subflow(msk, &list);
11141122
release_sock(sk);
11151123

11161124
next:

net/mptcp/protocol.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,7 @@ int mptcp_pm_announce_addr(struct mptcp_sock *msk,
664664
const struct mptcp_addr_info *addr,
665665
bool echo, bool port);
666666
int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
667-
int mptcp_pm_remove_subflow(struct mptcp_sock *msk, u8 local_id);
667+
int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
668668

669669
void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
670670
const struct sock *ssk, gfp_t gfp);
@@ -728,7 +728,8 @@ int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
728728
void __init mptcp_pm_nl_init(void);
729729
void mptcp_pm_nl_data_init(struct mptcp_sock *msk);
730730
void mptcp_pm_nl_work(struct mptcp_sock *msk);
731-
void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk, u8 rm_id);
731+
void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk,
732+
const struct mptcp_rm_list *rm_list);
732733
int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
733734
unsigned int mptcp_pm_get_add_addr_signal_max(struct mptcp_sock *msk);
734735
unsigned int mptcp_pm_get_add_addr_accept_max(struct mptcp_sock *msk);

0 commit comments

Comments
 (0)