網卡硬件時間戳之 --- shtx->hardware標誌

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的成員變量啊。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章