Skip to content

Commit 3d1d6d6

Browse files
Paolo Abenidavem330
authored andcommitted
mptcp: implement support for user-space disconnect
Handle explicitly AF_UNSPEC in mptcp_stream_connnect() to allow user-space to disconnect established MPTCP connections Signed-off-by: Paolo Abeni <[email protected]> Signed-off-by: Mat Martineau <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 71ba088 commit 3d1d6d6

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

net/mptcp/protocol.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3404,9 +3404,20 @@ static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr,
34043404
struct mptcp_sock *msk = mptcp_sk(sock->sk);
34053405
struct mptcp_subflow_context *subflow;
34063406
struct socket *ssock;
3407-
int err;
3407+
int err = -EINVAL;
34083408

34093409
lock_sock(sock->sk);
3410+
if (uaddr) {
3411+
if (addr_len < sizeof(uaddr->sa_family))
3412+
goto unlock;
3413+
3414+
if (uaddr->sa_family == AF_UNSPEC) {
3415+
err = mptcp_disconnect(sock->sk, flags);
3416+
sock->state = err ? SS_DISCONNECTING : SS_UNCONNECTED;
3417+
goto unlock;
3418+
}
3419+
}
3420+
34103421
if (sock->state != SS_UNCONNECTED && msk->subflow) {
34113422
/* pending connection or invalid state, let existing subflow
34123423
* cope with that
@@ -3416,10 +3427,8 @@ static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr,
34163427
}
34173428

34183429
ssock = __mptcp_nmpc_socket(msk);
3419-
if (!ssock) {
3420-
err = -EINVAL;
3430+
if (!ssock)
34213431
goto unlock;
3422-
}
34233432

34243433
mptcp_token_destroy(msk);
34253434
inet_sk_state_store(sock->sk, TCP_SYN_SENT);

0 commit comments

Comments
 (0)