Skip to content

Commit 5cb104a

Browse files
geliangtangdavem330
authored andcommitted
mptcp: add the outgoing RM_ADDR support
This patch added a new signal named rm_addr_signal in PM. On outgoing path, we called mptcp_pm_should_rm_signal to check if rm_addr_signal has been set. If it has been, we sent out the RM_ADDR option. Suggested-by: Matthieu Baerts <matthieu.baerts@tessares.net> Suggested-by: Paolo Abeni <pabeni@redhat.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 f643b80 commit 5cb104a

File tree

3 files changed

+63
-0
lines changed

3 files changed

+63
-0
lines changed

net/mptcp/options.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,31 @@ static bool mptcp_established_options_add_addr(struct sock *sk,
614614
return true;
615615
}
616616

617+
static bool mptcp_established_options_rm_addr(struct sock *sk,
618+
unsigned int *size,
619+
unsigned int remaining,
620+
struct mptcp_out_options *opts)
621+
{
622+
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
623+
struct mptcp_sock *msk = mptcp_sk(subflow->conn);
624+
u8 rm_id;
625+
626+
if (!mptcp_pm_should_rm_signal(msk) ||
627+
!(mptcp_pm_rm_addr_signal(msk, remaining, &rm_id)))
628+
return false;
629+
630+
if (remaining < TCPOLEN_MPTCP_RM_ADDR_BASE)
631+
return false;
632+
633+
*size = TCPOLEN_MPTCP_RM_ADDR_BASE;
634+
opts->suboptions |= OPTION_MPTCP_RM_ADDR;
635+
opts->rm_id = rm_id;
636+
637+
pr_debug("rm_id=%d", opts->rm_id);
638+
639+
return true;
640+
}
641+
617642
bool mptcp_established_options(struct sock *sk, struct sk_buff *skb,
618643
unsigned int *size, unsigned int remaining,
619644
struct mptcp_out_options *opts)
@@ -644,6 +669,10 @@ bool mptcp_established_options(struct sock *sk, struct sk_buff *skb,
644669
*size += opt_size;
645670
remaining -= opt_size;
646671
ret = true;
672+
} else if (mptcp_established_options_rm_addr(sk, &opt_size, remaining, opts)) {
673+
*size += opt_size;
674+
remaining -= opt_size;
675+
ret = true;
647676
}
648677

649678
return ret;

net/mptcp/pm.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,29 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
174174
return ret;
175175
}
176176

177+
bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
178+
u8 *rm_id)
179+
{
180+
int ret = false;
181+
182+
spin_lock_bh(&msk->pm.lock);
183+
184+
/* double check after the lock is acquired */
185+
if (!mptcp_pm_should_rm_signal(msk))
186+
goto out_unlock;
187+
188+
if (remaining < TCPOLEN_MPTCP_RM_ADDR_BASE)
189+
goto out_unlock;
190+
191+
*rm_id = msk->pm.rm_id;
192+
WRITE_ONCE(msk->pm.rm_addr_signal, false);
193+
ret = true;
194+
195+
out_unlock:
196+
spin_unlock_bh(&msk->pm.lock);
197+
return ret;
198+
}
199+
177200
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
178201
{
179202
return mptcp_pm_nl_get_local_id(msk, skc);
@@ -185,8 +208,10 @@ void mptcp_pm_data_init(struct mptcp_sock *msk)
185208
msk->pm.add_addr_accepted = 0;
186209
msk->pm.local_addr_used = 0;
187210
msk->pm.subflows = 0;
211+
msk->pm.rm_id = 0;
188212
WRITE_ONCE(msk->pm.work_pending, false);
189213
WRITE_ONCE(msk->pm.add_addr_signal, false);
214+
WRITE_ONCE(msk->pm.rm_addr_signal, false);
190215
WRITE_ONCE(msk->pm.accept_addr, false);
191216
WRITE_ONCE(msk->pm.accept_subflow, false);
192217
msk->pm.status = 0;

net/mptcp/protocol.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ struct mptcp_pm_data {
163163
spinlock_t lock; /*protects the whole PM data */
164164

165165
bool add_addr_signal;
166+
bool rm_addr_signal;
166167
bool server_side;
167168
bool work_pending;
168169
bool accept_addr;
@@ -176,6 +177,7 @@ struct mptcp_pm_data {
176177
u8 local_addr_max;
177178
u8 subflows_max;
178179
u8 status;
180+
u8 rm_id;
179181
};
180182

181183
struct mptcp_data_frag {
@@ -443,6 +445,11 @@ static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk)
443445
return READ_ONCE(msk->pm.add_addr_signal);
444446
}
445447

448+
static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk)
449+
{
450+
return READ_ONCE(msk->pm.rm_addr_signal);
451+
}
452+
446453
static inline unsigned int mptcp_add_addr_len(int family)
447454
{
448455
if (family == AF_INET)
@@ -452,6 +459,8 @@ static inline unsigned int mptcp_add_addr_len(int family)
452459

453460
bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
454461
struct mptcp_addr_info *saddr);
462+
bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
463+
u8 *rm_id);
455464
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
456465

457466
void __init mptcp_pm_nl_init(void);

0 commit comments

Comments
 (0)