Commit 298cd88a authored by Christoph Hellwig's avatar Christoph Hellwig Committed by David S. Miller

rxrpc: add rxrpc_sock_set_min_security_level

Add a helper to directly set the RXRPC_MIN_SECURITY_LEVEL sockopt from
kernel space without going through a fake uaccess.

Thanks to David Howells for the documentation updates.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Acked-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7d7207c2
...@@ -477,7 +477,7 @@ AF_RXRPC sockets support a few socket options at the SOL_RXRPC level: ...@@ -477,7 +477,7 @@ AF_RXRPC sockets support a few socket options at the SOL_RXRPC level:
Encrypted checksum plus packet padded and first eight bytes of packet Encrypted checksum plus packet padded and first eight bytes of packet
encrypted - which includes the actual packet length. encrypted - which includes the actual packet length.
(c) RXRPC_SECURITY_ENCRYPTED (c) RXRPC_SECURITY_ENCRYPT
Encrypted checksum plus entire packet padded and encrypted, including Encrypted checksum plus entire packet padded and encrypted, including
actual packet length. actual packet length.
...@@ -578,7 +578,7 @@ A client would issue an operation by: ...@@ -578,7 +578,7 @@ A client would issue an operation by:
This issues a request_key() to get the key representing the security This issues a request_key() to get the key representing the security
context. The minimum security level can be set:: context. The minimum security level can be set::
unsigned int sec = RXRPC_SECURITY_ENCRYPTED; unsigned int sec = RXRPC_SECURITY_ENCRYPT;
setsockopt(client, SOL_RXRPC, RXRPC_MIN_SECURITY_LEVEL, setsockopt(client, SOL_RXRPC, RXRPC_MIN_SECURITY_LEVEL,
&sec, sizeof(sec)); &sec, sizeof(sec));
...@@ -1090,6 +1090,15 @@ The kernel interface functions are as follows: ...@@ -1090,6 +1090,15 @@ The kernel interface functions are as follows:
jiffies). In the event of the timeout occurring, the call will be jiffies). In the event of the timeout occurring, the call will be
aborted and -ETIME or -ETIMEDOUT will be returned. aborted and -ETIME or -ETIMEDOUT will be returned.
(#) Apply the RXRPC_MIN_SECURITY_LEVEL sockopt to a socket from within in the
kernel::
int rxrpc_sock_set_min_security_level(struct sock *sk,
unsigned int val);
This specifies the minimum security level required for calls on this
socket.
Configurable Parameters Configurable Parameters
======================= =======================
......
...@@ -37,7 +37,6 @@ int afs_open_socket(struct afs_net *net) ...@@ -37,7 +37,6 @@ int afs_open_socket(struct afs_net *net)
{ {
struct sockaddr_rxrpc srx; struct sockaddr_rxrpc srx;
struct socket *socket; struct socket *socket;
unsigned int min_level;
int ret; int ret;
_enter(""); _enter("");
...@@ -57,9 +56,8 @@ int afs_open_socket(struct afs_net *net) ...@@ -57,9 +56,8 @@ int afs_open_socket(struct afs_net *net)
srx.transport.sin6.sin6_family = AF_INET6; srx.transport.sin6.sin6_family = AF_INET6;
srx.transport.sin6.sin6_port = htons(AFS_CM_PORT); srx.transport.sin6.sin6_port = htons(AFS_CM_PORT);
min_level = RXRPC_SECURITY_ENCRYPT; ret = rxrpc_sock_set_min_security_level(socket->sk,
ret = kernel_setsockopt(socket, SOL_RXRPC, RXRPC_MIN_SECURITY_LEVEL, RXRPC_SECURITY_ENCRYPT);
(void *)&min_level, sizeof(min_level));
if (ret < 0) if (ret < 0)
goto error_2; goto error_2;
......
...@@ -72,4 +72,6 @@ bool rxrpc_kernel_call_is_complete(struct rxrpc_call *); ...@@ -72,4 +72,6 @@ bool rxrpc_kernel_call_is_complete(struct rxrpc_call *);
void rxrpc_kernel_set_max_life(struct socket *, struct rxrpc_call *, void rxrpc_kernel_set_max_life(struct socket *, struct rxrpc_call *,
unsigned long); unsigned long);
int rxrpc_sock_set_min_security_level(struct sock *sk, unsigned int val);
#endif /* _NET_RXRPC_H */ #endif /* _NET_RXRPC_H */
...@@ -571,6 +571,19 @@ static int rxrpc_sendmsg(struct socket *sock, struct msghdr *m, size_t len) ...@@ -571,6 +571,19 @@ static int rxrpc_sendmsg(struct socket *sock, struct msghdr *m, size_t len)
return ret; return ret;
} }
int rxrpc_sock_set_min_security_level(struct sock *sk, unsigned int val)
{
if (sk->sk_state != RXRPC_UNBOUND)
return -EISCONN;
if (val > RXRPC_SECURITY_MAX)
return -EINVAL;
lock_sock(sk);
rxrpc_sk(sk)->min_sec_level = val;
release_sock(sk);
return 0;
}
EXPORT_SYMBOL(rxrpc_sock_set_min_security_level);
/* /*
* set RxRPC socket options * set RxRPC socket options
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment