Commit 0f5c9e3f authored by Geliang Tang's avatar Geliang Tang Committed by David S. Miller

mptcp: add port parameter for mptcp_pm_announce_addr

This patch added a new parameter 'port' for mptcp_pm_announce_addr. If
this parameter is true, we set the MPTCP_ADD_ADDR_PORT bit of the
add_addr_signal. That means the announced address is added with a port
number.
Signed-off-by: default avatarGeliang Tang <geliangtang@gmail.com>
Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fbe0f87a
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
int mptcp_pm_announce_addr(struct mptcp_sock *msk, int mptcp_pm_announce_addr(struct mptcp_sock *msk,
const struct mptcp_addr_info *addr, const struct mptcp_addr_info *addr,
bool echo) bool echo, bool port)
{ {
u8 add_addr = READ_ONCE(msk->pm.add_addr_signal); u8 add_addr = READ_ONCE(msk->pm.add_addr_signal);
...@@ -26,6 +26,8 @@ int mptcp_pm_announce_addr(struct mptcp_sock *msk, ...@@ -26,6 +26,8 @@ int mptcp_pm_announce_addr(struct mptcp_sock *msk,
add_addr |= BIT(MPTCP_ADD_ADDR_ECHO); add_addr |= BIT(MPTCP_ADD_ADDR_ECHO);
if (addr->family == AF_INET6) if (addr->family == AF_INET6)
add_addr |= BIT(MPTCP_ADD_ADDR_IPV6); add_addr |= BIT(MPTCP_ADD_ADDR_IPV6);
if (port)
add_addr |= BIT(MPTCP_ADD_ADDR_PORT);
WRITE_ONCE(msk->pm.add_addr_signal, add_addr); WRITE_ONCE(msk->pm.add_addr_signal, add_addr);
return 0; return 0;
} }
...@@ -156,7 +158,7 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk, ...@@ -156,7 +158,7 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
spin_lock_bh(&pm->lock); spin_lock_bh(&pm->lock);
if (!READ_ONCE(pm->accept_addr)) { if (!READ_ONCE(pm->accept_addr)) {
mptcp_pm_announce_addr(msk, addr, true); mptcp_pm_announce_addr(msk, addr, true, addr->port);
mptcp_pm_add_addr_send_ack(msk); mptcp_pm_add_addr_send_ack(msk);
} else if (mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED)) { } else if (mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED)) {
pm->remote = *addr; pm->remote = *addr;
......
...@@ -227,7 +227,7 @@ static void mptcp_pm_add_timer(struct timer_list *timer) ...@@ -227,7 +227,7 @@ static void mptcp_pm_add_timer(struct timer_list *timer)
if (!mptcp_pm_should_add_signal(msk)) { if (!mptcp_pm_should_add_signal(msk)) {
pr_debug("retransmit ADD_ADDR id=%d", entry->addr.id); pr_debug("retransmit ADD_ADDR id=%d", entry->addr.id);
mptcp_pm_announce_addr(msk, &entry->addr, false); mptcp_pm_announce_addr(msk, &entry->addr, false, entry->addr.port);
mptcp_pm_add_addr_send_ack(msk); mptcp_pm_add_addr_send_ack(msk);
entry->retrans_times++; entry->retrans_times++;
} }
...@@ -328,7 +328,7 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) ...@@ -328,7 +328,7 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
if (local) { if (local) {
if (mptcp_pm_alloc_anno_list(msk, local)) { if (mptcp_pm_alloc_anno_list(msk, local)) {
msk->pm.add_addr_signaled++; msk->pm.add_addr_signaled++;
mptcp_pm_announce_addr(msk, &local->addr, false); mptcp_pm_announce_addr(msk, &local->addr, false, local->addr.port);
mptcp_pm_nl_add_addr_send_ack(msk); mptcp_pm_nl_add_addr_send_ack(msk);
} }
} else { } else {
...@@ -376,6 +376,7 @@ void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk) ...@@ -376,6 +376,7 @@ void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
struct sock *sk = (struct sock *)msk; struct sock *sk = (struct sock *)msk;
struct mptcp_addr_info remote; struct mptcp_addr_info remote;
struct mptcp_addr_info local; struct mptcp_addr_info local;
bool use_port = false;
pr_debug("accepted %d:%d remote family %d", pr_debug("accepted %d:%d remote family %d",
msk->pm.add_addr_accepted, msk->pm.add_addr_accept_max, msk->pm.add_addr_accepted, msk->pm.add_addr_accept_max,
...@@ -392,6 +393,8 @@ void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk) ...@@ -392,6 +393,8 @@ void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
remote = msk->pm.remote; remote = msk->pm.remote;
if (!remote.port) if (!remote.port)
remote.port = sk->sk_dport; remote.port = sk->sk_dport;
else
use_port = true;
memset(&local, 0, sizeof(local)); memset(&local, 0, sizeof(local));
local.family = remote.family; local.family = remote.family;
...@@ -399,7 +402,7 @@ void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk) ...@@ -399,7 +402,7 @@ void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
__mptcp_subflow_connect((struct sock *)msk, &local, &remote); __mptcp_subflow_connect((struct sock *)msk, &local, &remote);
spin_lock_bh(&msk->pm.lock); spin_lock_bh(&msk->pm.lock);
mptcp_pm_announce_addr(msk, &remote, true); mptcp_pm_announce_addr(msk, &remote, true, use_port);
mptcp_pm_nl_add_addr_send_ack(msk); mptcp_pm_nl_add_addr_send_ack(msk);
} }
......
...@@ -552,7 +552,7 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk, ...@@ -552,7 +552,7 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk,
int mptcp_pm_announce_addr(struct mptcp_sock *msk, int mptcp_pm_announce_addr(struct mptcp_sock *msk,
const struct mptcp_addr_info *addr, const struct mptcp_addr_info *addr,
bool echo); bool echo, bool port);
int mptcp_pm_remove_addr(struct mptcp_sock *msk, u8 local_id); int mptcp_pm_remove_addr(struct mptcp_sock *msk, u8 local_id);
int mptcp_pm_remove_subflow(struct mptcp_sock *msk, u8 local_id); int mptcp_pm_remove_subflow(struct mptcp_sock *msk, u8 local_id);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment