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: Geliang Tang <geliangtang@gmail.com> Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2ec72faec8
commit
4a2777a834
|
@ -587,6 +587,7 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
|
|||
unsigned int opt_size = *size;
|
||||
struct mptcp_addr_info saddr;
|
||||
bool echo;
|
||||
bool port;
|
||||
int len;
|
||||
|
||||
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 *
|
|||
}
|
||||
|
||||
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;
|
||||
|
||||
len = mptcp_add_addr_len(saddr.family, echo);
|
||||
len = mptcp_add_addr_len(saddr.family, echo, port);
|
||||
if (remaining < len)
|
||||
return false;
|
||||
|
||||
|
@ -609,6 +610,8 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
|
|||
if (drop_other_suboptions)
|
||||
*size -= opt_size;
|
||||
opts->addr_id = saddr.id;
|
||||
if (port)
|
||||
opts->port = ntohs(saddr.port);
|
||||
if (saddr.family == AF_INET) {
|
||||
opts->suboptions |= OPTION_MPTCP_ADD_ADDR;
|
||||
opts->addr = saddr.addr;
|
||||
|
@ -631,7 +634,8 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
|
|||
}
|
||||
}
|
||||
#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;
|
||||
}
|
||||
|
|
|
@ -188,7 +188,7 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id)
|
|||
/* path manager helpers */
|
||||
|
||||
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;
|
||||
|
||||
|
@ -199,8 +199,9 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
|
|||
goto out_unlock;
|
||||
|
||||
*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;
|
||||
|
||||
*saddr = msk->pm.local;
|
||||
|
|
|
@ -172,6 +172,7 @@ enum mptcp_add_addr_status {
|
|||
MPTCP_ADD_ADDR_SIGNAL,
|
||||
MPTCP_ADD_ADDR_ECHO,
|
||||
MPTCP_ADD_ADDR_IPV6,
|
||||
MPTCP_ADD_ADDR_PORT,
|
||||
};
|
||||
|
||||
struct mptcp_pm_data {
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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;
|
||||
|
||||
|
@ -583,12 +589,14 @@ static inline unsigned int mptcp_add_addr_len(int family, bool echo)
|
|||
len = TCPOLEN_MPTCP_ADD_ADDR6_BASE;
|
||||
if (!echo)
|
||||
len += MPTCPOPT_THMAC_LEN;
|
||||
if (port)
|
||||
len += TCPOLEN_MPTCP_PORT_LEN;
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
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,
|
||||
u8 *rm_id);
|
||||
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
|
||||
|
|
Loading…
Reference in New Issue