[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20230719102737.2513246-4-leitao@debian.org>
Date: Wed, 19 Jul 2023 03:27:37 -0700
From: Breno Leitao <leitao@...ian.org>
To: asml.silence@...il.com, axboe@...nel.dk
Cc: io-uring@...r.kernel.org, netdev@...r.kernel.org,
davem@...emloft.net, kuba@...nel.org, edumazet@...gle.com,
pabeni@...hat.com, linux-kernel@...r.kernel.org
Subject: [RFC PATCH 3/3] io_uring/cmd: Add support for set_sockopt
Add initial support for setsockopt for SOL_SOCKET level, by leveraging
the sockptr infrastructure.
Function io_uring_cmd_setsockopt is inspired by the function
__sys_setsockopt(), which handles the system call case.
Signed-off-by: Breno Leitao <leitao@...ian.org>
---
include/uapi/linux/io_uring.h | 1 +
io_uring/uring_cmd.c | 24 ++++++++++++++++++++++++
2 files changed, 25 insertions(+)
diff --git a/include/uapi/linux/io_uring.h b/include/uapi/linux/io_uring.h
index 8152151080db..3fe82df06abf 100644
--- a/include/uapi/linux/io_uring.h
+++ b/include/uapi/linux/io_uring.h
@@ -736,6 +736,7 @@ enum {
SOCKET_URING_OP_SIOCINQ = 0,
SOCKET_URING_OP_SIOCOUTQ,
SOCKET_URING_OP_GETSOCKOPT,
+ SOCKET_URING_OP_SETSOCKOPT,
};
#ifdef __cplusplus
diff --git a/io_uring/uring_cmd.c b/io_uring/uring_cmd.c
index 28fd09351be7..7c06634e744a 100644
--- a/io_uring/uring_cmd.c
+++ b/io_uring/uring_cmd.c
@@ -191,6 +191,28 @@ static inline int io_uring_cmd_getsockopt(struct socket *sock,
return -EOPNOTSUPP;
}
+static inline int io_uring_cmd_setsockopt(struct socket *sock,
+ struct io_uring_cmd *cmd)
+{
+ void __user *optval = u64_to_user_ptr(READ_ONCE(cmd->sqe->optval));
+ int optlen = READ_ONCE(cmd->sqe->optlen);
+ int optname = READ_ONCE(cmd->sqe->optname);
+ int level = READ_ONCE(cmd->sqe->level);
+ int err;
+
+ err = security_socket_setsockopt(sock, level, optname);
+ if (err)
+ return err;
+
+ if (level == SOL_SOCKET && !sock_use_custom_sol_socket(sock)) {
+ err = sock_setsockopt(sock, level, optname,
+ USER_SOCKPTR(optval), optlen);
+ return err;
+ }
+
+ return -EOPNOTSUPP;
+}
+
int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags)
{
struct socket *sock = cmd->file->private_data;
@@ -214,6 +236,8 @@ int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags)
return arg;
case SOCKET_URING_OP_GETSOCKOPT:
return io_uring_cmd_getsockopt(sock, cmd);
+ case SOCKET_URING_OP_SETSOCKOPT:
+ return io_uring_cmd_setsockopt(sock, cmd);
default:
return -EOPNOTSUPP;
}
--
2.34.1
Powered by blists - more mailing lists