linux 時間戳,打戳代碼分析,用於PTP報文協議


 

1.linux內核打戳查看

(1)打戳模式設置:

代碼文件:     sk.c           ->   socket.c        sock.c
函數接口:    setsockopt -> setsockopt     sock_setsockopt

代碼位置:     PTP代碼    -》     內核代碼

 

作用:設置軟硬件時間戳,發送接收時間戳;

 

(2)recvmsg調用UDP:

recvmsg -> __sys_recvmsg -> sock_recvmsg_nosec -> __sock_recvmsg_nosec
-> sock->ops->recvmsg -> udp_recvmsg (udp.c) -> ip_recv_error
sock_recv_timestamp -> __sock_recv_timestamp -> skb_get_timestampns  / skb_hwtstamps(skb),skb_shared_info->hwtstamp

這里,應該是組合報文,把skb結構帶的時間戳取出來,放在消息里,扔給上層;(ERR隊列報文)


變量(軟/硬) : sk skb ts / hwtstamp ->> msg
數據結構 : socket sk_buff tstamp / skb_shared_info->hwtstamps ->> msghdr

 

2.取時戳

軟時戳:sk(sk_error_queue) >>> skb->tstamp >>> msg
硬時戳:sk(sk_error_queue) >>> skb_shared_info->hwtstamps (skb 的end后面skb_shared_info中)
skbuff.h有說明,這三個時戳源頭;skb_shared_hwtstamps

說明:用的sk的sk_error_queue隊列,存儲時戳的;
所有查出這個隊列,把它賦給skb,skb自帶時戳,取出時戳,最終給msg,返回msg給上層;


3.放時戳

要求,sk給mac之前,把調用把時戳寫上;(skbuff.h L2255)

(1)發送數據包時,記錄時戳;

路徑1:cpsw_netdev_ops -> cpsw_ndo_start_xmit -> skb_tx_timestamp -> sw_tx_timestamp -> skb_tstamp_tx
路徑2:cpsw_probe ---> cpsw_tx_handler -> cpts_tx_timestamp -> 一樣
檢查!!!!感覺和下面接收不一樣,接收一樣的路徑也有個發送時戳
感覺應該是SW,因為CPTS沒使能,沒用硬件PTP;下面的軟件時戳也需要重新找;

 

skb_tstamp_tx (skbuff.c)

  • 硬件用入參hwtstamps,
  • 軟件時戳直接此時讀取時間,二者只記錄一個時戳;

 

(2)接收數據包時,記錄時戳:

cpsw_rx_handler -> netif_receive_skb -> net_timestamp_check -> __net_timestamp

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM