From: Peter Krystad <peter.krys...@linux.intel.com> Signed-off-by: Peter Krystad <peter.krys...@linux.intel.com> --- net/mptcp/protocol.c | 48 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 6596e594fa5f..3215601b9c43 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -131,6 +131,52 @@ static void mptcp_destroy(struct sock *sk) token_destroy(msk->token); } +static int mptcp_setsockopt(struct sock *sk, int level, int optname, + char __user *uoptval, unsigned int optlen) +{ + struct mptcp_sock *msk = mptcp_sk(sk); + struct socket *subflow; + char __kernel *optval; + + pr_debug("msk=%p", msk); + if (msk->connection_list) { + subflow = msk->connection_list; + pr_debug("conn_list->subflow=%p", subflow_ctx(subflow->sk)); + } else { + subflow = msk->subflow; + pr_debug("subflow=%p", subflow_ctx(subflow->sk)); + } + + /* will be treated as __user in tcp_setsockopt */ + optval = (char __kernel __force *)uoptval; + + return kernel_setsockopt(subflow, level, optname, optval, optlen); +} + +static int mptcp_getsockopt(struct sock *sk, int level, int optname, + char __user *uoptval, int __user *uoption) +{ + struct mptcp_sock *msk = mptcp_sk(sk); + struct socket *subflow; + char __kernel *optval; + int __kernel *option; + + pr_debug("msk=%p", msk); + if (msk->connection_list) { + subflow = msk->connection_list; + pr_debug("conn_list->subflow=%p", subflow_ctx(subflow->sk)); + } else { + subflow = msk->subflow; + pr_debug("subflow=%p", subflow_ctx(subflow->sk)); + } + + /* will be treated as __user in tcp_getsockopt */ + optval = (char __kernel __force *)uoptval; + option = (int __kernel __force *)uoption; + + return kernel_getsockopt(subflow, level, optname, optval, option); +} + static int mptcp_get_port(struct sock *sk, unsigned short snum) { struct mptcp_sock *msk = mptcp_sk(sk); @@ -162,6 +208,8 @@ static struct proto mptcp_prot = { .init = mptcp_init_sock, .close = mptcp_close, .accept = mptcp_accept, + .setsockopt = mptcp_setsockopt, + .getsockopt = mptcp_getsockopt, .shutdown = tcp_shutdown, .destroy = mptcp_destroy, .sendmsg = mptcp_sendmsg, -- 2.22.0