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

原文地址:https://www.cnblogs.com/xiaoyudian/p/12547011.html