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)
 | 
								  >= dev->tx_queue_len / tun->numqueues)
 | 
				
			||||||
		goto drop;
 | 
							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
 | 
						/* Orphan the skb - required as we might hang on to it
 | 
				
			||||||
	 * for indefinite time. */
 | 
						 * for indefinite time. */
 | 
				
			||||||
	if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC)))
 | 
						if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC)))
 | 
				
			||||||
| 
						 | 
					@ -1476,7 +1481,6 @@ static int tun_sendmsg(struct kiocb *iocb, struct socket *sock,
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
static int tun_recvmsg(struct kiocb *iocb, struct socket *sock,
 | 
					static int tun_recvmsg(struct kiocb *iocb, struct socket *sock,
 | 
				
			||||||
		       struct msghdr *m, size_t total_len,
 | 
							       struct msghdr *m, size_t total_len,
 | 
				
			||||||
		       int flags)
 | 
							       int flags)
 | 
				
			||||||
| 
						 | 
					@ -1488,10 +1492,15 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock,
 | 
				
			||||||
	if (!tun)
 | 
						if (!tun)
 | 
				
			||||||
		return -EBADFD;
 | 
							return -EBADFD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (flags & ~(MSG_DONTWAIT|MSG_TRUNC)) {
 | 
						if (flags & ~(MSG_DONTWAIT|MSG_TRUNC|MSG_ERRQUEUE)) {
 | 
				
			||||||
		ret = -EINVAL;
 | 
							ret = -EINVAL;
 | 
				
			||||||
		goto out;
 | 
							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,
 | 
						ret = tun_do_read(tun, tfile, iocb, m->msg_iov, total_len,
 | 
				
			||||||
			  flags & MSG_DONTWAIT);
 | 
								  flags & MSG_DONTWAIT);
 | 
				
			||||||
	if (ret > total_len) {
 | 
						if (ret > total_len) {
 | 
				
			||||||
| 
						 | 
					@ -2274,6 +2283,7 @@ static const struct ethtool_ops tun_ethtool_ops = {
 | 
				
			||||||
	.get_msglevel	= tun_get_msglevel,
 | 
						.get_msglevel	= tun_get_msglevel,
 | 
				
			||||||
	.set_msglevel	= tun_set_msglevel,
 | 
						.set_msglevel	= tun_set_msglevel,
 | 
				
			||||||
	.get_link	= ethtool_op_get_link,
 | 
						.get_link	= ethtool_op_get_link,
 | 
				
			||||||
 | 
						.get_ts_info	= ethtool_op_get_ts_info,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -71,6 +71,9 @@
 | 
				
			||||||
/* read-only flag */
 | 
					/* read-only flag */
 | 
				
			||||||
#define IFF_PERSIST	0x0800
 | 
					#define IFF_PERSIST	0x0800
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Socket options */
 | 
				
			||||||
 | 
					#define TUN_TX_TIMESTAMP 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Features for GSO (TUNSETOFFLOAD). */
 | 
					/* Features for GSO (TUNSETOFFLOAD). */
 | 
				
			||||||
#define TUN_F_CSUM	0x01	/* You can hand me unchecksummed packets. */
 | 
					#define TUN_F_CSUM	0x01	/* You can hand me unchecksummed packets. */
 | 
				
			||||||
#define TUN_F_TSO4	0x02	/* I can handle TSO for IPv4 packets */
 | 
					#define TUN_F_TSO4	0x02	/* I can handle TSO for IPv4 packets */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue