Message ID | 20220908133829.3410092-4-benjamin.hesmans@tessares.net (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | Implement TCP_FASTOPEN_CONNECT for mptcp | expand |
Context | Check | Description |
---|---|---|
matttbe/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 31 lines checked |
matttbe/build | success | Build and static analysis OK |
matttbe/KVM_Validation__normal | warning | Unstable: 13 failed test(s): mptcp_connect_mmap packetdrill_add_addr packetdrill_dss packetdrill_fastclose packetdrill_mp_capable packetdrill_mp_prio packetdrill_mp_reset packetdrill_sockopts selftest_diag selftest_mptcp_connect selftest_mptcp_join selftest_mptcp_sockopt selftest_simult_flows |
matttbe/KVM_Validation__debug | warning | Unstable: 4 failed test(s): selftest_diag selftest_mptcp_connect selftest_mptcp_join selftest_mptcp_sockopt - Critical: Global Timeout ❌ |
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 55442df8fb97..ad81824bdbfe 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1668,6 +1668,7 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) { struct mptcp_sock *msk = mptcp_sk(sk); struct page_frag *pfrag; + struct socket *ssock; size_t copied = 0; int ret = 0; long timeo; @@ -1681,6 +1682,24 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) lock_sock(sk); + ssock = __mptcp_nmpc_socket(msk); + if (ssock && inet_sk(ssock->sk)->defer_connect) { + int copied_syn = 0; + + lock_sock(ssock->sk); + + ret = tcp_sendmsg_fastopen(ssock->sk, msg, &copied_syn, len, NULL); + copied += copied_syn; + if (ret == -EINPROGRESS && copied_syn > 0) { + release_sock(ssock->sk); + goto out; + } else if (ret) { + /* The error case is probably not correctly handled. To be checked. */ + release_sock(ssock->sk); + goto out; + } + } + timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); if ((1 << sk->sk_state) & ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) {
When TCP_FASTOPEN_CONNECT has been set on the socket before a connect, the defer flag is set and must be handled when sendmsg is called. This is similar to what is done in tcp_sendmsg_locked() Signed-off-by: Benjamin Hesmans <benjamin.hesmans@tessares.net> --- Notes: The error case is probably not correctly handled. To be checked. net/mptcp/protocol.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)