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
					
				| @ -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 @@ set_rcvbuf: | ||||
| 		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 New Issue
	
	Block a user