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