Skip to content

Commit d0876b2

Browse files
geliangtangdavem330
authored andcommitted
mptcp: add the incoming RM_ADDR support
This patch added the RM_ADDR option parsing logic: We parsed the incoming options to find if the rm_addr option is received, and called mptcp_pm_rm_addr_received to schedule PM work to a new status, named MPTCP_PM_RM_ADDR_RECEIVED. PM work got this status, and called mptcp_pm_nl_rm_addr_received to handle it. In mptcp_pm_nl_rm_addr_received, we closed the subflow matching the rm_id, and updated PM counter. Suggested-by: Matthieu Baerts <matthieu.baerts@tessares.net> Suggested-by: Paolo Abeni <pabeni@redhat.com> Suggested-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: Geliang Tang <geliangtang@gmail.com> Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 5cb104a commit d0876b2

File tree

5 files changed

+66
-4
lines changed

5 files changed

+66
-4
lines changed

net/mptcp/options.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,11 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb,
888888
mp_opt.add_addr = 0;
889889
}
890890

891+
if (mp_opt.rm_addr) {
892+
mptcp_pm_rm_addr_received(msk, mp_opt.rm_id);
893+
mp_opt.rm_addr = 0;
894+
}
895+
891896
if (!mp_opt.dss)
892897
return;
893898

net/mptcp/pm.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,18 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
149149
spin_unlock_bh(&pm->lock);
150150
}
151151

152+
void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id)
153+
{
154+
struct mptcp_pm_data *pm = &msk->pm;
155+
156+
pr_debug("msk=%p remote_id=%d", msk, rm_id);
157+
158+
spin_lock_bh(&pm->lock);
159+
mptcp_pm_schedule_work(msk, MPTCP_PM_RM_ADDR_RECEIVED);
160+
pm->rm_id = rm_id;
161+
spin_unlock_bh(&pm->lock);
162+
}
163+
152164
/* path manager helpers */
153165

154166
bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,

net/mptcp/pm_netlink.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,40 @@ void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
268268
spin_lock_bh(&msk->pm.lock);
269269
}
270270

271+
void mptcp_pm_nl_rm_addr_received(struct mptcp_sock *msk)
272+
{
273+
struct mptcp_subflow_context *subflow, *tmp;
274+
struct sock *sk = (struct sock *)msk;
275+
276+
pr_debug("address rm_id %d", msk->pm.rm_id);
277+
278+
if (!msk->pm.rm_id)
279+
return;
280+
281+
if (list_empty(&msk->conn_list))
282+
return;
283+
284+
list_for_each_entry_safe(subflow, tmp, &msk->conn_list, node) {
285+
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
286+
int how = RCV_SHUTDOWN | SEND_SHUTDOWN;
287+
long timeout = 0;
288+
289+
if (msk->pm.rm_id != subflow->remote_id)
290+
continue;
291+
292+
spin_unlock_bh(&msk->pm.lock);
293+
mptcp_subflow_shutdown(sk, ssk, how);
294+
__mptcp_close_ssk(sk, ssk, subflow, timeout);
295+
spin_lock_bh(&msk->pm.lock);
296+
297+
msk->pm.add_addr_accepted--;
298+
msk->pm.subflows--;
299+
WRITE_ONCE(msk->pm.accept_addr, true);
300+
301+
break;
302+
}
303+
}
304+
271305
static bool address_use_port(struct mptcp_pm_addr_entry *entry)
272306
{
273307
return (entry->addr.flags &

net/mptcp/protocol.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1652,9 +1652,9 @@ static struct sock *mptcp_subflow_get_retrans(const struct mptcp_sock *msk)
16521652
* so we need to use tcp_close() after detaching them from the mptcp
16531653
* parent socket.
16541654
*/
1655-
static void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
1656-
struct mptcp_subflow_context *subflow,
1657-
long timeout)
1655+
void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
1656+
struct mptcp_subflow_context *subflow,
1657+
long timeout)
16581658
{
16591659
struct socket *sock = READ_ONCE(ssk->sk_socket);
16601660

@@ -1685,6 +1685,10 @@ static void pm_work(struct mptcp_sock *msk)
16851685
pm->status &= ~BIT(MPTCP_PM_ADD_ADDR_RECEIVED);
16861686
mptcp_pm_nl_add_addr_received(msk);
16871687
}
1688+
if (pm->status & BIT(MPTCP_PM_RM_ADDR_RECEIVED)) {
1689+
pm->status &= ~BIT(MPTCP_PM_RM_ADDR_RECEIVED);
1690+
mptcp_pm_nl_rm_addr_received(msk);
1691+
}
16881692
if (pm->status & BIT(MPTCP_PM_ESTABLISHED)) {
16891693
pm->status &= ~BIT(MPTCP_PM_ESTABLISHED);
16901694
mptcp_pm_nl_fully_established(msk);
@@ -1846,7 +1850,7 @@ static void mptcp_cancel_work(struct sock *sk)
18461850
sock_put(sk);
18471851
}
18481852

1849-
static void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how)
1853+
void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how)
18501854
{
18511855
lock_sock(ssk);
18521856

net/mptcp/protocol.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ struct mptcp_addr_info {
152152

153153
enum mptcp_pm_status {
154154
MPTCP_PM_ADD_ADDR_RECEIVED,
155+
MPTCP_PM_RM_ADDR_RECEIVED,
155156
MPTCP_PM_ESTABLISHED,
156157
MPTCP_PM_SUBFLOW_ESTABLISHED,
157158
};
@@ -362,6 +363,10 @@ void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow,
362363
struct mptcp_options_received *mp_opt);
363364
bool mptcp_subflow_data_available(struct sock *sk);
364365
void __init mptcp_subflow_init(void);
366+
void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how);
367+
void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
368+
struct mptcp_subflow_context *subflow,
369+
long timeout);
365370

366371
/* called with sk socket lock held */
367372
int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
@@ -434,6 +439,7 @@ void mptcp_pm_subflow_established(struct mptcp_sock *msk,
434439
void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id);
435440
void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
436441
const struct mptcp_addr_info *addr);
442+
void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id);
437443

438444
int mptcp_pm_announce_addr(struct mptcp_sock *msk,
439445
const struct mptcp_addr_info *addr);
@@ -468,6 +474,7 @@ void mptcp_pm_nl_data_init(struct mptcp_sock *msk);
468474
void mptcp_pm_nl_fully_established(struct mptcp_sock *msk);
469475
void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk);
470476
void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk);
477+
void mptcp_pm_nl_rm_addr_received(struct mptcp_sock *msk);
471478
int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
472479

473480
static inline struct mptcp_ext *mptcp_get_ext(struct sk_buff *skb)

0 commit comments

Comments
 (0)