diff options
author | Geliang Tang <geliangtang@gmail.com> | 2020-09-24 03:29:48 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2020-09-25 05:58:33 +0300 |
commit | 5cb104ae55e9dbffe4552cd77ded37ec8b0518cd (patch) | |
tree | 8496df1eee63d6f29befa19fbee8f16752111044 /net/mptcp/pm.c | |
parent | f643b8032ee31848a5fe619a8f2d2776f8a42902 (diff) | |
download | linux-5cb104ae55e9dbffe4552cd77ded37ec8b0518cd.tar.xz |
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>
Diffstat (limited to 'net/mptcp/pm.c')
-rw-r--r-- | net/mptcp/pm.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index ce12b8b26ad2..81b07ae213b9 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -174,6 +174,29 @@ out_unlock: return ret; } +bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining, + u8 *rm_id) +{ + int ret = false; + + spin_lock_bh(&msk->pm.lock); + + /* double check after the lock is acquired */ + if (!mptcp_pm_should_rm_signal(msk)) + goto out_unlock; + + if (remaining < TCPOLEN_MPTCP_RM_ADDR_BASE) + goto out_unlock; + + *rm_id = msk->pm.rm_id; + WRITE_ONCE(msk->pm.rm_addr_signal, false); + ret = true; + +out_unlock: + spin_unlock_bh(&msk->pm.lock); + return ret; +} + int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc) { return mptcp_pm_nl_get_local_id(msk, skc); @@ -185,8 +208,10 @@ void mptcp_pm_data_init(struct mptcp_sock *msk) msk->pm.add_addr_accepted = 0; msk->pm.local_addr_used = 0; msk->pm.subflows = 0; + msk->pm.rm_id = 0; WRITE_ONCE(msk->pm.work_pending, false); WRITE_ONCE(msk->pm.add_addr_signal, false); + WRITE_ONCE(msk->pm.rm_addr_signal, false); WRITE_ONCE(msk->pm.accept_addr, false); WRITE_ONCE(msk->pm.accept_subflow, false); msk->pm.status = 0; |