mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	tun: Support software transmit time stamping.
This patch adds transmit time stamping to the tun/tap driver. Similar support already exists for UDP, can, and raw packets. Signed-off-by: Richard Cochran <richardcochran@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									cb820f8e4b
								
							
						
					
					
						commit
						eda2977291
					
				
					 2 changed files with 15 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -739,6 +739,11 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
 | 
			
		|||
			  >= dev->tx_queue_len / tun->numqueues)
 | 
			
		||||
		goto drop;
 | 
			
		||||
 | 
			
		||||
	if (skb->sk) {
 | 
			
		||||
		sock_tx_timestamp(skb->sk, &skb_shinfo(skb)->tx_flags);
 | 
			
		||||
		sw_tx_timestamp(skb);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Orphan the skb - required as we might hang on to it
 | 
			
		||||
	 * for indefinite time. */
 | 
			
		||||
	if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC)))
 | 
			
		||||
| 
						 | 
				
			
			@ -1476,7 +1481,6 @@ static int tun_sendmsg(struct kiocb *iocb, struct socket *sock,
 | 
			
		|||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int tun_recvmsg(struct kiocb *iocb, struct socket *sock,
 | 
			
		||||
		       struct msghdr *m, size_t total_len,
 | 
			
		||||
		       int flags)
 | 
			
		||||
| 
						 | 
				
			
			@ -1488,10 +1492,15 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock,
 | 
			
		|||
	if (!tun)
 | 
			
		||||
		return -EBADFD;
 | 
			
		||||
 | 
			
		||||
	if (flags & ~(MSG_DONTWAIT|MSG_TRUNC)) {
 | 
			
		||||
	if (flags & ~(MSG_DONTWAIT|MSG_TRUNC|MSG_ERRQUEUE)) {
 | 
			
		||||
		ret = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	if (flags & MSG_ERRQUEUE) {
 | 
			
		||||
		ret = sock_recv_errqueue(sock->sk, m, total_len,
 | 
			
		||||
					 SOL_PACKET, TUN_TX_TIMESTAMP);
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
	ret = tun_do_read(tun, tfile, iocb, m->msg_iov, total_len,
 | 
			
		||||
			  flags & MSG_DONTWAIT);
 | 
			
		||||
	if (ret > total_len) {
 | 
			
		||||
| 
						 | 
				
			
			@ -2274,6 +2283,7 @@ static const struct ethtool_ops tun_ethtool_ops = {
 | 
			
		|||
	.get_msglevel	= tun_get_msglevel,
 | 
			
		||||
	.set_msglevel	= tun_set_msglevel,
 | 
			
		||||
	.get_link	= ethtool_op_get_link,
 | 
			
		||||
	.get_ts_info	= ethtool_op_get_ts_info,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -71,6 +71,9 @@
 | 
			
		|||
/* read-only flag */
 | 
			
		||||
#define IFF_PERSIST	0x0800
 | 
			
		||||
 | 
			
		||||
/* Socket options */
 | 
			
		||||
#define TUN_TX_TIMESTAMP 1
 | 
			
		||||
 | 
			
		||||
/* Features for GSO (TUNSETOFFLOAD). */
 | 
			
		||||
#define TUN_F_CSUM	0x01	/* You can hand me unchecksummed packets. */
 | 
			
		||||
#define TUN_F_TSO4	0x02	/* I can handle TSO for IPv4 packets */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue