mptcp: __mptcp_tcp_fallback() returns a struct sock
Currently __mptcp_tcp_fallback() always return NULL on incoming connections, because MPTCP does not create the additional socket for the first subflow. Since the previous commit no __mptcp_tcp_fallback() caller needs a struct socket, so let __mptcp_tcp_fallback() return the first subflow sock and cope correctly even with incoming connections. Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Davide Caratti <dcaratti@redhat.com> Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
fa68018dc4
commit
76660afbb7
|
@ -76,14 +76,14 @@ static bool mptcp_is_tcpsk(struct sock *sk)
|
|||
return false;
|
||||
}
|
||||
|
||||
static struct socket *__mptcp_tcp_fallback(struct mptcp_sock *msk)
|
||||
static struct sock *__mptcp_tcp_fallback(struct mptcp_sock *msk)
|
||||
{
|
||||
sock_owned_by_me((const struct sock *)msk);
|
||||
|
||||
if (likely(!__mptcp_check_fallback(msk)))
|
||||
return NULL;
|
||||
|
||||
return msk->subflow;
|
||||
return msk->first;
|
||||
}
|
||||
|
||||
static int __mptcp_socket_create(struct mptcp_sock *msk)
|
||||
|
@ -1498,7 +1498,7 @@ static int mptcp_setsockopt(struct sock *sk, int level, int optname,
|
|||
char __user *optval, unsigned int optlen)
|
||||
{
|
||||
struct mptcp_sock *msk = mptcp_sk(sk);
|
||||
struct socket *ssock;
|
||||
struct sock *ssk;
|
||||
|
||||
pr_debug("msk=%p", msk);
|
||||
|
||||
|
@ -1509,11 +1509,10 @@ static int mptcp_setsockopt(struct sock *sk, int level, int optname,
|
|||
* to the one remaining subflow.
|
||||
*/
|
||||
lock_sock(sk);
|
||||
ssock = __mptcp_tcp_fallback(msk);
|
||||
ssk = __mptcp_tcp_fallback(msk);
|
||||
release_sock(sk);
|
||||
if (ssock)
|
||||
return tcp_setsockopt(ssock->sk, level, optname, optval,
|
||||
optlen);
|
||||
if (ssk)
|
||||
return tcp_setsockopt(ssk, level, optname, optval, optlen);
|
||||
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
@ -1522,7 +1521,7 @@ static int mptcp_getsockopt(struct sock *sk, int level, int optname,
|
|||
char __user *optval, int __user *option)
|
||||
{
|
||||
struct mptcp_sock *msk = mptcp_sk(sk);
|
||||
struct socket *ssock;
|
||||
struct sock *ssk;
|
||||
|
||||
pr_debug("msk=%p", msk);
|
||||
|
||||
|
@ -1533,11 +1532,10 @@ static int mptcp_getsockopt(struct sock *sk, int level, int optname,
|
|||
* to the one remaining subflow.
|
||||
*/
|
||||
lock_sock(sk);
|
||||
ssock = __mptcp_tcp_fallback(msk);
|
||||
ssk = __mptcp_tcp_fallback(msk);
|
||||
release_sock(sk);
|
||||
if (ssock)
|
||||
return tcp_getsockopt(ssock->sk, level, optname, optval,
|
||||
option);
|
||||
if (ssk)
|
||||
return tcp_getsockopt(ssk, level, optname, optval, option);
|
||||
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue