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