Skip to content
Permalink
Browse files
mptcp: reflect remote port (not 0) in ANNOUNCED events
Per RFC 8684, if no port is specified in an ADD_ADDR message, MPTCP
SHOULD attempt to connect to the specified address on the same port
as the port that is already in use by the subflow on which the
ADD_ADDR signal was sent.

To facilitate that, this change reflects the specific remote port in
use by that subflow in MPTCP_EVENT_ANNOUNCED events.

Signed-off-by: Kishen Maloor <kishen.maloor@intel.com>
  • Loading branch information
kmaloor authored and intel-lab-lkp committed Dec 16, 2021
1 parent 7d3d64f commit bdb267794b512f230544060dba463c0fa9881780
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 7 deletions.
@@ -1123,7 +1123,7 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
if ((mp_opt.suboptions & OPTION_MPTCP_ADD_ADDR) &&
add_addr_hmac_valid(msk, &mp_opt)) {
if (!mp_opt.echo) {
mptcp_pm_add_addr_received(msk, &mp_opt.addr);
mptcp_pm_add_addr_received(msk, &mp_opt.addr, sk);
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDR);
} else {
mptcp_pm_add_addr_echoed(msk, &mp_opt.addr);
@@ -204,14 +204,15 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock *ssk,
}

void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
const struct mptcp_addr_info *addr)
const struct mptcp_addr_info *addr,
const struct sock *ssk)
{
struct mptcp_pm_data *pm = &msk->pm;

pr_debug("msk=%p remote_id=%d accept=%d", msk, addr->id,
READ_ONCE(pm->accept_addr));

mptcp_event_addr_announced(msk, addr);
mptcp_event_addr_announced(msk, addr, ssk);

spin_lock_bh(&pm->lock);

@@ -1933,7 +1933,8 @@ void mptcp_event_addr_removed(const struct mptcp_sock *msk, uint8_t id)
}

void mptcp_event_addr_announced(const struct mptcp_sock *msk,
const struct mptcp_addr_info *info)
const struct mptcp_addr_info *info,
const struct sock *ssk)
{
struct net *net = sock_net((const struct sock *)msk);
struct nlmsghdr *nlh;
@@ -1957,7 +1958,10 @@ void mptcp_event_addr_announced(const struct mptcp_sock *msk,
if (nla_put_u8(skb, MPTCP_ATTR_REM_ID, info->id))
goto nla_put_failure;

if (nla_put_be16(skb, MPTCP_ATTR_DPORT, info->port))
if (nla_put_be16(skb, MPTCP_ATTR_DPORT,
info->port == 0 ?
((struct inet_sock *)inet_sk(ssk))->inet_dport :
info->port))
goto nla_put_failure;

switch (info->family) {
@@ -752,7 +752,8 @@ bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk);
void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock *ssk,
const struct mptcp_subflow_context *subflow);
void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
const struct mptcp_addr_info *addr);
const struct mptcp_addr_info *addr,
const struct sock *ssk);
void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
struct mptcp_addr_info *addr);
void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk);
@@ -780,7 +781,8 @@ int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_list *

void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
const struct sock *ssk, gfp_t gfp);
void mptcp_event_addr_announced(const struct mptcp_sock *msk, const struct mptcp_addr_info *info);
void mptcp_event_addr_announced(const struct mptcp_sock *msk, const struct mptcp_addr_info *info,
const struct sock *ssk);
void mptcp_event_addr_removed(const struct mptcp_sock *msk, u8 id);

static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk)

0 comments on commit bdb2677

Please sign in to comment.