Commit 4a2777a8 authored by Geliang Tang's avatar Geliang Tang Committed by David S. Miller

mptcp: add the outgoing ADD_ADDR port support

This patch added a new add_addr_signal type named MPTCP_ADD_ADDR_PORT,
to identify it is an address with port to be added.

It also added a new parameter 'port' for both mptcp_add_addr_len and
mptcp_pm_add_addr_signal.

In mptcp_established_options_add_addr, we check whether the announced
address is added with port. If it is, we put this port number to
mptcp_out_options's port field.
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 2ec72fae
...@@ -587,6 +587,7 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff * ...@@ -587,6 +587,7 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
unsigned int opt_size = *size; unsigned int opt_size = *size;
struct mptcp_addr_info saddr; struct mptcp_addr_info saddr;
bool echo; bool echo;
bool port;
int len; int len;
if (mptcp_pm_should_add_signal_ipv6(msk) && if (mptcp_pm_should_add_signal_ipv6(msk) &&
...@@ -598,10 +599,10 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff * ...@@ -598,10 +599,10 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
} }
if (!mptcp_pm_should_add_signal(msk) || if (!mptcp_pm_should_add_signal(msk) ||
!(mptcp_pm_add_addr_signal(msk, remaining, &saddr, &echo))) !(mptcp_pm_add_addr_signal(msk, remaining, &saddr, &echo, &port)))
return false; return false;
len = mptcp_add_addr_len(saddr.family, echo); len = mptcp_add_addr_len(saddr.family, echo, port);
if (remaining < len) if (remaining < len)
return false; return false;
...@@ -609,6 +610,8 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff * ...@@ -609,6 +610,8 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
if (drop_other_suboptions) if (drop_other_suboptions)
*size -= opt_size; *size -= opt_size;
opts->addr_id = saddr.id; opts->addr_id = saddr.id;
if (port)
opts->port = ntohs(saddr.port);
if (saddr.family == AF_INET) { if (saddr.family == AF_INET) {
opts->suboptions |= OPTION_MPTCP_ADD_ADDR; opts->suboptions |= OPTION_MPTCP_ADD_ADDR;
opts->addr = saddr.addr; opts->addr = saddr.addr;
...@@ -631,7 +634,8 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff * ...@@ -631,7 +634,8 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
} }
} }
#endif #endif
pr_debug("addr_id=%d, ahmac=%llu, echo=%d", opts->addr_id, opts->ahmac, echo); pr_debug("addr_id=%d, ahmac=%llu, echo=%d, port=%d",
opts->addr_id, opts->ahmac, echo, opts->port);
return true; return true;
} }
......
...@@ -188,7 +188,7 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id) ...@@ -188,7 +188,7 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id)
/* path manager helpers */ /* path manager helpers */
bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining, bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
struct mptcp_addr_info *saddr, bool *echo) struct mptcp_addr_info *saddr, bool *echo, bool *port)
{ {
int ret = false; int ret = false;
...@@ -199,8 +199,9 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining, ...@@ -199,8 +199,9 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
goto out_unlock; goto out_unlock;
*echo = mptcp_pm_should_add_signal_echo(msk); *echo = mptcp_pm_should_add_signal_echo(msk);
*port = mptcp_pm_should_add_signal_port(msk);
if (remaining < mptcp_add_addr_len(msk->pm.local.family, *echo)) if (remaining < mptcp_add_addr_len(msk->pm.local.family, *echo, *port))
goto out_unlock; goto out_unlock;
*saddr = msk->pm.local; *saddr = msk->pm.local;
......
...@@ -172,6 +172,7 @@ enum mptcp_add_addr_status { ...@@ -172,6 +172,7 @@ enum mptcp_add_addr_status {
MPTCP_ADD_ADDR_SIGNAL, MPTCP_ADD_ADDR_SIGNAL,
MPTCP_ADD_ADDR_ECHO, MPTCP_ADD_ADDR_ECHO,
MPTCP_ADD_ADDR_IPV6, MPTCP_ADD_ADDR_IPV6,
MPTCP_ADD_ADDR_PORT,
}; };
struct mptcp_pm_data { struct mptcp_pm_data {
...@@ -570,12 +571,17 @@ static inline bool mptcp_pm_should_add_signal_ipv6(struct mptcp_sock *msk) ...@@ -570,12 +571,17 @@ static inline bool mptcp_pm_should_add_signal_ipv6(struct mptcp_sock *msk)
return READ_ONCE(msk->pm.add_addr_signal) & BIT(MPTCP_ADD_ADDR_IPV6); return READ_ONCE(msk->pm.add_addr_signal) & BIT(MPTCP_ADD_ADDR_IPV6);
} }
static inline bool mptcp_pm_should_add_signal_port(struct mptcp_sock *msk)
{
return READ_ONCE(msk->pm.add_addr_signal) & BIT(MPTCP_ADD_ADDR_PORT);
}
static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk) static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk)
{ {
return READ_ONCE(msk->pm.rm_addr_signal); return READ_ONCE(msk->pm.rm_addr_signal);
} }
static inline unsigned int mptcp_add_addr_len(int family, bool echo) static inline unsigned int mptcp_add_addr_len(int family, bool echo, bool port)
{ {
u8 len = TCPOLEN_MPTCP_ADD_ADDR_BASE; u8 len = TCPOLEN_MPTCP_ADD_ADDR_BASE;
...@@ -583,12 +589,14 @@ static inline unsigned int mptcp_add_addr_len(int family, bool echo) ...@@ -583,12 +589,14 @@ static inline unsigned int mptcp_add_addr_len(int family, bool echo)
len = TCPOLEN_MPTCP_ADD_ADDR6_BASE; len = TCPOLEN_MPTCP_ADD_ADDR6_BASE;
if (!echo) if (!echo)
len += MPTCPOPT_THMAC_LEN; len += MPTCPOPT_THMAC_LEN;
if (port)
len += TCPOLEN_MPTCP_PORT_LEN;
return len; return len;
} }
bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining, bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
struct mptcp_addr_info *saddr, bool *echo); struct mptcp_addr_info *saddr, bool *echo, bool *port);
bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining, bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
u8 *rm_id); u8 *rm_id);
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc); int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
......
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