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: Christoph Hellwig <hch@lst.de> Acked-by: David Howells <dhowells@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7d7207c2d5
commit
298cd88a66
@ -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:
|
|||||||
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:
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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 *);
|
|||||||
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 @@ out:
|
|||||||
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
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user