Skip to content

Commit

Permalink
mptcp: implement support for user-space disconnect
Browse files Browse the repository at this point in the history
Handle explicitly AF_UNSPEC in mptcp_stream_connnect() to
allow user-space to disconnect established MPTCP connections

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Paolo Abeni authored and David S. Miller committed Jan 7, 2022
1 parent 71ba088 commit 3d1d6d6
Showing 1 changed file with 13 additions and 4 deletions.
17 changes: 13 additions & 4 deletions net/mptcp/protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -3404,9 +3404,20 @@ static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr,
struct mptcp_sock *msk = mptcp_sk(sock->sk);
struct mptcp_subflow_context *subflow;
struct socket *ssock;
int err;
int err = -EINVAL;

lock_sock(sock->sk);
if (uaddr) {
if (addr_len < sizeof(uaddr->sa_family))
goto unlock;

if (uaddr->sa_family == AF_UNSPEC) {
err = mptcp_disconnect(sock->sk, flags);
sock->state = err ? SS_DISCONNECTING : SS_UNCONNECTED;
goto unlock;
}
}

if (sock->state != SS_UNCONNECTED && msk->subflow) {
/* pending connection or invalid state, let existing subflow
* cope with that
Expand All @@ -3416,10 +3427,8 @@ static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr,
}

ssock = __mptcp_nmpc_socket(msk);
if (!ssock) {
err = -EINVAL;
if (!ssock)
goto unlock;
}

mptcp_token_destroy(msk);
inet_sk_state_store(sock->sk, TCP_SYN_SENT);
Expand Down

0 comments on commit 3d1d6d6

Please sign in to comment.