diff --git a/net/mptcp/mptcp_fullmesh.c b/net/mptcp/mptcp_fullmesh.c index 28c5f6601e398..81a8d767d8d44 100644 --- a/net/mptcp/mptcp_fullmesh.c +++ b/net/mptcp/mptcp_fullmesh.c @@ -1555,8 +1555,7 @@ static void full_mesh_addr_signal(struct sock *sk, unsigned *size, ((mpcb->mptcp_ver == 0 && MAX_TCP_OPTION_SPACE - *size >= MPTCP_SUB_LEN_ADD_ADDR4_ALIGN) || (mpcb->mptcp_ver >= 1 && - MAX_TCP_OPTION_SPACE - *size >= - MPTCP_SUB_LEN_ADD_ADDR4_ALIGN_VER1))) { + MAX_TCP_OPTION_SPACE - *size >= MPTCP_SUB_LEN_ADD_ADDR4_ALIGN_VER1))) { int ind = mptcp_find_free_index(~unannouncedv4); opts->options |= OPTION_MPTCP; @@ -1597,8 +1596,7 @@ static void full_mesh_addr_signal(struct sock *sk, unsigned *size, ((mpcb->mptcp_ver == 0 && MAX_TCP_OPTION_SPACE - *size >= MPTCP_SUB_LEN_ADD_ADDR6_ALIGN) || (mpcb->mptcp_ver >= 1 && - MAX_TCP_OPTION_SPACE - *size >= - MPTCP_SUB_LEN_ADD_ADDR6_ALIGN_VER1))) { + MAX_TCP_OPTION_SPACE - *size >= MPTCP_SUB_LEN_ADD_ADDR6_ALIGN_VER1))) { int ind = mptcp_find_free_index(~unannouncedv6); opts->options |= OPTION_MPTCP; diff --git a/net/mptcp/mptcp_output.c b/net/mptcp/mptcp_output.c index 3a65fd09cc963..6a108651a93ae 100644 --- a/net/mptcp/mptcp_output.c +++ b/net/mptcp/mptcp_output.c @@ -960,12 +960,20 @@ void mptcp_established_options(struct sock *sk, struct sk_buff *skb, if (skb) tp->mptcp->include_mpc = 0; } + if (unlikely(tp->mptcp->pre_established)) { opts->options |= OPTION_MPTCP; opts->mptcp_options |= OPTION_MP_JOIN | OPTION_TYPE_ACK; *size += MPTCP_SUB_LEN_JOIN_ACK_ALIGN; } + if (unlikely(mpcb->addr_signal) && mpcb->pm_ops->addr_signal) { + mpcb->pm_ops->addr_signal(sk, size, opts, skb); + if (opts->add_addr_v6) + /* Skip subsequent options */ + return; + } + if (!tp->mptcp->include_mpc && !tp->mptcp->pre_established) { opts->options |= OPTION_MPTCP; opts->mptcp_options |= OPTION_DATA_ACK; @@ -985,9 +993,6 @@ void mptcp_established_options(struct sock *sk, struct sk_buff *skb, *size += MPTCP_SUB_LEN_DSS_ALIGN; } - if (unlikely(mpcb->addr_signal) && mpcb->pm_ops->addr_signal) - mpcb->pm_ops->addr_signal(sk, size, opts, skb); - if (unlikely(tp->mptcp->send_mp_prio) && MAX_TCP_OPTION_SPACE - *size >= MPTCP_SUB_LEN_PRIO_ALIGN) { opts->options |= OPTION_MPTCP;