net: mptcp: don't hang in mptcp_sendmsg() after TCP fallback
it's still possible for packetdrill to hang in mptcp_sendmsg(), when the MPTCP socket falls back to regular TCP (e.g. after receiving unsupported flags/version during the three-way handshake). Adjust MPTCP socket state earlier, to ensure correct functionality of mptcp_sendmsg() even in case of TCP fallback. Fixes:767d3ded5f
("net: mptcp: don't hang before sending 'MP capable with data'") Fixes:1954b86016
("mptcp: Check connection state before attempting send") Signed-off-by: Davide Caratti <dcaratti@redhat.com> Acked-by: Paolo Abeni <pabeni@redhat.com> Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
b69bbab51b
Коммит
c3c123d16c
|
@ -1055,10 +1055,6 @@ void mptcp_finish_connect(struct sock *ssk)
|
|||
WRITE_ONCE(msk->write_seq, subflow->idsn + 1);
|
||||
WRITE_ONCE(msk->ack_seq, ack_seq);
|
||||
WRITE_ONCE(msk->can_ack, 1);
|
||||
if (inet_sk_state_load(sk) != TCP_ESTABLISHED) {
|
||||
inet_sk_state_store(sk, TCP_ESTABLISHED);
|
||||
sk->sk_state_change(sk);
|
||||
}
|
||||
}
|
||||
|
||||
static void mptcp_sock_graft(struct sock *sk, struct socket *parent)
|
||||
|
|
|
@ -109,9 +109,15 @@ static void subflow_v6_init_req(struct request_sock *req,
|
|||
static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
|
||||
{
|
||||
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
|
||||
struct sock *parent = subflow->conn;
|
||||
|
||||
subflow->icsk_af_ops->sk_rx_dst_set(sk, skb);
|
||||
|
||||
if (inet_sk_state_load(parent) != TCP_ESTABLISHED) {
|
||||
inet_sk_state_store(parent, TCP_ESTABLISHED);
|
||||
parent->sk_state_change(parent);
|
||||
}
|
||||
|
||||
if (!subflow->conn_finished) {
|
||||
pr_debug("subflow=%p, remote_key=%llu", mptcp_subflow_ctx(sk),
|
||||
subflow->remote_key);
|
||||
|
|
Загрузка…
Ссылка в новой задаче