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

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
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -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
=======================
+2 −4
Original line number Diff line number Diff line
@@ -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;

+2 −0
Original line number Diff line number Diff line
@@ -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 */
+13 −0
Original line number Diff line number Diff line
@@ -571,6 +571,19 @@ out:
	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
 */