mirror of https://gitee.com/openkylin/linux.git
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 - which includes the actual packet length.
|
||||
|
||||
(c) RXRPC_SECURITY_ENCRYPTED
|
||||
(c) RXRPC_SECURITY_ENCRYPT
|
||||
|
||||
Encrypted checksum plus entire packet padded and encrypted, including
|
||||
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
|
||||
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,
|
||||
&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
|
||||
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
|
||||
=======================
|
||||
|
|
|
@ -37,7 +37,6 @@ int afs_open_socket(struct afs_net *net)
|
|||
{
|
||||
struct sockaddr_rxrpc srx;
|
||||
struct socket *socket;
|
||||
unsigned int min_level;
|
||||
int ret;
|
||||
|
||||
_enter("");
|
||||
|
@ -57,9 +56,8 @@ int afs_open_socket(struct afs_net *net)
|
|||
srx.transport.sin6.sin6_family = AF_INET6;
|
||||
srx.transport.sin6.sin6_port = htons(AFS_CM_PORT);
|
||||
|
||||
min_level = RXRPC_SECURITY_ENCRYPT;
|
||||
ret = kernel_setsockopt(socket, SOL_RXRPC, RXRPC_MIN_SECURITY_LEVEL,
|
||||
(void *)&min_level, sizeof(min_level));
|
||||
ret = rxrpc_sock_set_min_security_level(socket->sk,
|
||||
RXRPC_SECURITY_ENCRYPT);
|
||||
if (ret < 0)
|
||||
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 *,
|
||||
unsigned long);
|
||||
|
||||
int rxrpc_sock_set_min_security_level(struct sock *sk, unsigned int val);
|
||||
|
||||
#endif /* _NET_RXRPC_H */
|
||||
|
|
|
@ -571,6 +571,19 @@ static int rxrpc_sendmsg(struct socket *sock, struct msghdr *m, size_t len)
|
|||
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
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue