Tries to follow the subflow most recently used from transmit. Signed-off-by: Florian Westphal --- net/mptcp/sockopt.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index c1ffc3603b4f..27ea5b1ea57e 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -657,6 +657,28 @@ static int mptcp_getsockopt_first_sf_only(struct mptcp_sock *msk, int level, int return ret; } +static int mptcp_getsockopt_tcp_info(struct mptcp_sock *msk, char __user *optval, int __user *optlen) +{ + struct mptcp_subflow_context *subflow; + struct sock *sk = (struct sock *)msk; + struct sock *ssk = NULL; + int ret = -EOPNOTSUPP; + + lock_sock(sk); + mptcp_for_each_subflow(msk, subflow) { + ssk = mptcp_subflow_tcp_sock(subflow); + + if (ssk == msk->last_snd) + break; + } + + if (ssk) + ret = tcp_getsockopt(ssk, SOL_TCP, TCP_INFO, optval, optlen); + + release_sock(sk); + return ret; +} + static int mptcp_getsockopt_sol_tcp(struct mptcp_sock *msk, int optname, char __user *optval, int __user *optlen) { @@ -665,6 +687,8 @@ static int mptcp_getsockopt_sol_tcp(struct mptcp_sock *msk, int optname, case TCP_CONGESTION: return mptcp_getsockopt_first_sf_only(msk, SOL_TCP, optname, optval, optlen); + case TCP_INFO: + return mptcp_getsockopt_tcp_info(msk, optval, optlen); } return -EOPNOTSUPP; } -- 2.26.2