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