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

Reply via email to