include/linux/skbuff.h -> union skb_shared_tx中的hardware標誌:
網卡驅動用它來判斷髮送報文是否需要硬時標(當然還有其它方式可以判斷),driver/net/igb驅動在報文發送完畢後,就是靠這個標誌作爲條件,來決定是否需要取硬時標,那麼這個標誌是在哪裏初始化的呢(總之不是在網卡驅動裏)。
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;
}
sock_tx_timestamp 被raw_sendmsg或udp_sendmsg調用
上面的源碼已經寫的很清楚了,這個hardware標誌是在socket的發送函數裏被賦值的,就是說當通過socket ioctl設置了SOCK_TIMESTAMPING_TX_HARDWARE標誌時,shtx->hardware將被賦予“1”,然後網卡驅動在發送完報文以後,就知道需要取硬時標(當然硬時標功能早已在網卡驅動初始化時被使能了)。
相反,網卡驅動在接收完一幀數據後,則直接取接收報文的硬時標,不需要判斷hardware標誌,hardware這個標誌是發送報文時專用的。
問題來了,如果在內核態直接構造skb發送(調用dev_queue_xmit),不走socket,那hardware標誌怎麼初始化呢,這種問題居然也問,當然是構造skb的時候直接對其賦值了,hardware是skb的成員變量啊。