zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    回头再看libpcap
    lex error
    perl 的威力
    什么叫回流和重绘?
    HTTP协议与FTP协议的区别【转】
    Linux操作系统Redhat系列与Debian系列 【转】
    dock是什么? docker就是集装箱原理【转】
    光端机的作用【转】
    c++ -- call_once用法
    c++ -- thread详细解析
  • 原文地址:https://www.cnblogs.com/xiaoyudian/p/12547011.html
Copyright © 2011-2022 走看看