mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	net: add sock_enable_timestamps
Add a helper to directly enable timestamps instead of setting the SO_TIMESTAMP* sockopts from kernel space and going through a fake uaccess. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									7594888c78
								
							
						
					
					
						commit
						783da70e83
					
				
					 3 changed files with 34 additions and 28 deletions
				
			
		| 
						 | 
				
			
			@ -2689,6 +2689,7 @@ static inline bool sk_dev_equal_l3scope(struct sock *sk, int dif)
 | 
			
		|||
void sock_def_readable(struct sock *sk);
 | 
			
		||||
 | 
			
		||||
int sock_bindtoindex(struct sock *sk, int ifindex);
 | 
			
		||||
void sock_enable_timestamps(struct sock *sk);
 | 
			
		||||
void sock_no_linger(struct sock *sk);
 | 
			
		||||
void sock_set_priority(struct sock *sk, u32 priority);
 | 
			
		||||
void sock_set_reuseaddr(struct sock *sk);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -757,6 +757,28 @@ void sock_set_sndtimeo(struct sock *sk, s64 secs)
 | 
			
		|||
}
 | 
			
		||||
EXPORT_SYMBOL(sock_set_sndtimeo);
 | 
			
		||||
 | 
			
		||||
static void __sock_set_timestamps(struct sock *sk, bool val, bool new, bool ns)
 | 
			
		||||
{
 | 
			
		||||
	if (val)  {
 | 
			
		||||
		sock_valbool_flag(sk, SOCK_TSTAMP_NEW, new);
 | 
			
		||||
		sock_valbool_flag(sk, SOCK_RCVTSTAMPNS, ns);
 | 
			
		||||
		sock_set_flag(sk, SOCK_RCVTSTAMP);
 | 
			
		||||
		sock_enable_timestamp(sk, SOCK_TIMESTAMP);
 | 
			
		||||
	} else {
 | 
			
		||||
		sock_reset_flag(sk, SOCK_RCVTSTAMP);
 | 
			
		||||
		sock_reset_flag(sk, SOCK_RCVTSTAMPNS);
 | 
			
		||||
		sock_reset_flag(sk, SOCK_TSTAMP_NEW);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sock_enable_timestamps(struct sock *sk)
 | 
			
		||||
{
 | 
			
		||||
	lock_sock(sk);
 | 
			
		||||
	__sock_set_timestamps(sk, true, false, true);
 | 
			
		||||
	release_sock(sk);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(sock_enable_timestamps);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 *	This is meant for all protocols to use and covers goings on
 | 
			
		||||
 *	at the socket level. Everything here is generic.
 | 
			
		||||
| 
						 | 
				
			
			@ -948,28 +970,17 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
 | 
			
		|||
		break;
 | 
			
		||||
 | 
			
		||||
	case SO_TIMESTAMP_OLD:
 | 
			
		||||
	case SO_TIMESTAMP_NEW:
 | 
			
		||||
	case SO_TIMESTAMPNS_OLD:
 | 
			
		||||
	case SO_TIMESTAMPNS_NEW:
 | 
			
		||||
		if (valbool)  {
 | 
			
		||||
			if (optname == SO_TIMESTAMP_NEW || optname == SO_TIMESTAMPNS_NEW)
 | 
			
		||||
				sock_set_flag(sk, SOCK_TSTAMP_NEW);
 | 
			
		||||
			else
 | 
			
		||||
				sock_reset_flag(sk, SOCK_TSTAMP_NEW);
 | 
			
		||||
 | 
			
		||||
			if (optname == SO_TIMESTAMP_OLD || optname == SO_TIMESTAMP_NEW)
 | 
			
		||||
				sock_reset_flag(sk, SOCK_RCVTSTAMPNS);
 | 
			
		||||
			else
 | 
			
		||||
				sock_set_flag(sk, SOCK_RCVTSTAMPNS);
 | 
			
		||||
			sock_set_flag(sk, SOCK_RCVTSTAMP);
 | 
			
		||||
			sock_enable_timestamp(sk, SOCK_TIMESTAMP);
 | 
			
		||||
		} else {
 | 
			
		||||
			sock_reset_flag(sk, SOCK_RCVTSTAMP);
 | 
			
		||||
			sock_reset_flag(sk, SOCK_RCVTSTAMPNS);
 | 
			
		||||
			sock_reset_flag(sk, SOCK_TSTAMP_NEW);
 | 
			
		||||
		}
 | 
			
		||||
		__sock_set_timestamps(sk, valbool, false, false);
 | 
			
		||||
		break;
 | 
			
		||||
	case SO_TIMESTAMP_NEW:
 | 
			
		||||
		__sock_set_timestamps(sk, valbool, true, false);
 | 
			
		||||
		break;
 | 
			
		||||
	case SO_TIMESTAMPNS_OLD:
 | 
			
		||||
		__sock_set_timestamps(sk, valbool, false, true);
 | 
			
		||||
		break;
 | 
			
		||||
	case SO_TIMESTAMPNS_NEW:
 | 
			
		||||
		__sock_set_timestamps(sk, valbool, true, true);
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	case SO_TIMESTAMPING_NEW:
 | 
			
		||||
		sock_set_flag(sk, SOCK_TSTAMP_NEW);
 | 
			
		||||
		/* fall through */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -189,13 +189,7 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		/* We want receive timestamps. */
 | 
			
		||||
		opt = 1;
 | 
			
		||||
		ret = kernel_setsockopt(local->socket, SOL_SOCKET, SO_TIMESTAMPNS_OLD,
 | 
			
		||||
					(char *)&opt, sizeof(opt));
 | 
			
		||||
		if (ret < 0) {
 | 
			
		||||
			_debug("setsockopt failed");
 | 
			
		||||
			goto error;
 | 
			
		||||
		}
 | 
			
		||||
		sock_enable_timestamps(local->socket->sk);
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue