include/linux/skbuff.h -> union skb_shared_tx中的hardware标志:linux
网卡驱动用它来判断发送报文是否须要硬时标(固然还有其它方式能够判断),driver/net/igb驱动在报文发送完毕后,就是靠这个标志做为条件,来决定是否须要取硬时标,那么这个标志是在哪里初始化的呢(总之不是在网卡驱动里)。socket
int sock_tx_timestamp(struct msghdr *msg, struct sock *sk,union skb_shared_tx *shtx)
{
shtx->flags = 0;
if (sock_flag(sk, SOCK_TIMESTAMPING_TX_HARDWARE))
shtx->hardware = 1; //天杀的hardware标志,废了我一下午时间才找到你在这里赋值的
if (sock_flag(sk, SOCK_TIMESTAMPING_TX_SOFTWARE))
shtx->software = 1;
return 0;
}ide
sock_tx_timestamp 被raw_sendmsg或udp_sendmsg调用函数
上面的源码已经写的很清楚了,这个hardware标志是在socket的发送函数里被赋值的,就是说当经过socket ioctl设置了SOCK_TIMESTAMPING_TX_HARDWARE标志时,shtx->hardware将被赋予“1”,而后网卡驱动在发送完报文之后,就知道须要取硬时标(固然硬时标功能早已在网卡驱动初始化时被使能了)。源码
相反,网卡驱动在接收完一帧数据后,则直接取接收报文的硬时标,不须要判断hardware标志,hardware这个标志是发送报文时专用的。it
问题来了,若是在内核态直接构造skb发送(调用dev_queue_xmit),不走socket,那hardware标志怎么初始化呢,这种问题竟然也问,固然是构造skb的时候直接对其赋值了,hardware是skb的成员变量啊。io