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

时间: 2024-11-11 16:40:45

linux 时间戳,打戳代码分析,用于PTP报文协议的相关文章

《linux 内核完全剖析》 exit.c 代码分析笔记

exit.c 代码分析笔记 release 释放进程的函数release() 主要根据指定进程的任务数据结构指针,在任务数组中删除指定的进程指针,释放相关内存页,并立刻让内核重新调度进程的运行. void release(struct task_struct * p) //释放p指向的进程 { int i; if (!p) //常规检测p是否为0 return; if (p == current) { //不能把自己给释放了 printk("task releasing itself\n\r&q

《linux 内核完全剖析》sched.c sched.h 代码分析笔记

sched.c sched.h 代码分析笔记 首先上header file sched.h #ifndef _SCHED_H #define _SCHED_H #define HZ 100 #define NR_TASKS 64 #define TASK_SIZE 0x04000000 #define LIBRARY_SIZE 0x00400000 #if (TASK_SIZE & 0x3fffff) #error "TASK_SIZE must be multiple of 4M&qu

《linux 内核完全剖析》 signal.c 代码分析笔记

signal.c 代码分析笔记 sgetmask int sys_sgetmask()// 获取当前进程阻塞的信号 { returncurrent->blocked; } sys_ssetmask int sys_ssetmask(int newmask) //设置当前进程阻塞信号,确保SIGKILL 和SIGSTOP不被阻塞 { int old=current->blocked; current->blocked= newmask & ~(1<<(SIGKILL-1

linux kernel的中断子系统之(七):GIC代码分析

一.前言 GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器,其architecture specification目前有四个版本,V1-V4(V2最多支持8个ARM core,V3/V4支持更多的ARM core,主要用于ARM64服务器系统结构).目前在ARM官方网站只能下载到Version 2的GIC architecture specification,因此,本文主要描述符合V2规范的GIC硬件及其驱动. 具体GIC硬件的实现形态有两

Linux中断 - GIC代码分析

一.前言 GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器,其architecture specification目前有四个版本,V1-V4(V2最多支持8个ARM core,V3/V4支持更多的ARM core,主要用于ARM64服务器系统结构).目前在ARM官方网站只能下载到Version 2的GIC architecture specification,因此,本文主要描述符合V2规范的GIC硬件及其驱动. 具体GIC硬件的实现形态有两

Linux时间子系统(十七) ARM generic timer驱动代码分析

一.前言 关注ARM平台上timer driver(clocksource chip driver和clockevent chip driver)的驱动工程师应该会注意到timer硬件的演化过程.在单核时代,各个SOC vendor厂商购买ARM core的IP,然后自己设计SOC上的peripherals,这里面就包括了timer的硬件.由于没有统一的标准,各个厂商的设计各不相同,这给驱动工程师带来了工作量.然而,如果仅仅是工作量的话就还好,实际上,不仅仅如此.linux的时间子系统要求硬件t

《linux 内核完全剖析》 keyboard.S 部分代码分析(key_map)

keyboard.S 部分代码分析(key_map) keyboard中间有这么一段,我一开始没看明白,究竟啥意思 key_map: .byte 0,27 .ascii "1234567890-=" .byte 127,9 .ascii "qwertyuiop[]" .byte 13,0 .ascii "asdfghjkl;'" .byte '`,0 .ascii "\\zxcvbnm,./" .byte 0,'*,0,32

《linux 内核完全剖析》 笔记 由逻辑地址转换成线性地址代码分析

一开始由这段代码引发的纠结 get_base(current->ldt[1]) 下面是各个相关的代码,摘自不同的header files... current是指向当前task的指针 struct desc_struct ldt[3]; struct desc_struct { unsigned long a,b; } ; #define _get_base(addr) ({unsigned long __base; __asm__("movb %3,%%dh\n\t" &quo

ARM Linux 大小核切换 ——cortex-A7 big.LITTLE 大小核 切换代码分析

ARM Linux 大小核切换——cortex-A7 big.LITTLE 大小切换代码分析 8核CPU或者是更多核的处理器,这些CPU有可能不完全对称.有的是4个A15和4个A7,或者是4个A57和4个A53,甚至像海思麒麟935处理器(4核A53 2.2 GHz + 4核A53 1.5 GHz),这8个核的频率可能不一样,则使用过程中需要大小核切换(频率高的是大核,频率低的是小核).本文以ARM cortex-A7为例,分析大小核切换的代码,着重于分析实现切换的代码,对于为什么要这样切换.以