PTP(Precision Time Protocol)高精度时间同步协议+linuxptp代码学习

2023-11-05

最近项目中用到了PTP做时间同步,基于linuxptp做的改进和开发。刚入门对很多东西不是很清楚,用wireshark在测试设备的slave这边抓了个包,对照源码和官方文档学习一波,请各位大佬多多批评指正。
目前设备上采用的是主从同步,oneStep模式,所以重点先看看这部分的实现逻辑。

PTP报文

设备在PTP这块采用的传输层协议是UDP。PTP协议使用的端口号是319和320,其中319对应事件消息(EVENT),需要网口记录收发时间戳,320对应普通消息(GENERAL),无需记录收发时间戳。

Signaling报文

Signaling报文负责传输搭载的TLV消息。一个Signaling报文可以携带多个TLV消息。可携带的TLV类型messageType对应官方文档14节。
Signaling报文占用空间大小与携带的TLV相关,为头部(34字节)+targetPortIdentity(10字节)+每个TLV所占空间。TLV消息所占空间与其携带数据有关,携带的数据大小为lengthField字段的值,总大小为TLV类型(2字节)+TLV数据长度(2字节)+数据。
Signaling报文格式
对应代码
port_signaling.c中的port_signaling_construct,生成初始不带TLV的Signaling报文。
port_signaling.c中的process_signaling,处理收到的Signaling报文:

  1. 判断当前端口状态,状态正常即可(除INITIALIZING、FAULTY和DISABLED外);
  2. 遍历消息的TLV链表,根据TLV类型以及TLV带的messageType执行对应的操作。
    如果收到的TLV是Request Unicast Transmission,需要解析其中的messageType。如果messageType是Announce或Sync,需要进一步添加或更新源端client。最后调用unicast_service_reply返回对应Grant Unicast Transmission报文。
    如果收到的TLV是Grant Unicast Transmission,对应函数unicast_client_grant。需要判断源端是否是自己发送Request的master,然后判断对方的grant对自己的messageType类型,最后根据Unicast状态执行对应操作。

request unicast transmission TLV

功能
Slave端口→Master端口,Slave端口请求Master端口发送对应TLV中指定的报文(包括Announce、Sync、Delay_Resp或Pdelay_Resp),并约定发送间隔。这部分主从的约定功能是可选的,对应官方文档16.1节。
logInterMessagePeriod字段用于约定后续消息发送间隔,用以2为底的对数表示。
例如,开始时Slave端口发送了一个Signaling报文,如下所示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PTP(Precision Time Protocol)高精度时间同步协议+linuxptp代码学习 的相关文章

  • 未找到 ffmpeg 命令,但 pip 列表显示 ffmpeg

    我一直在尝试使用命令安装 ffmpegpip install ffmpeg我正在没有 sudo 权限的服务器上执行此操作 在编写 ffmpeg 时 我得到 ffmpeg command not found 然后我检查了pip list它显示
  • Laravel 5.4.* - 运行 artisan 时“”目录不存在

    我有一个全新安装的Ubuntu服务器14 04我目前正在尝试安装我的Laravel项目上 我已将整个存储库移至所需的文件夹中 但是当我运行命令时 php artisan 在该目录中 终端返回一个错误 指出 InvalidArgumentEx
  • 在 64 位 RHEL 上安装 32 位库 (glibc),而不使用 yum

    我试图让 32 位应用程序在 64 位 RHEL 6 1 上运行 但该计算机无法访问互联网 有没有办法在 64 位 RHEL 上安装 32 位 glibc 而不使用 yum 即仅使用 RPM 安装 我从 RHEL 6 1 ISO 中获取了
  • 简单的awk命令问题(FS、OFS相关)

    我尝试重新组织包含以下内容的文件的格式 gt Humanl chr16 86430087 86430726 element 1 positive gt Humanl chr16 85620095 85621736 element 2 neg
  • IPC:在两个程序之间使用 C++ 中的命名管道

    我试图在同一台机器上运行的两个不同程序之间实现IPC 在我的例子中是CentOS7 为了实现一种松散耦合 我决定对 IPC 使用命名管道 因此 我正在使用以下示例并遇到了不同的问题 创建并写入管道 include
  • 针对 openpose 将 GCC 9.3.0 降级到 7 后,cuda_compile_1_ generated_batch_norm_layer.cu.o.Release.cmake 出现 CMake 错误

    你知道我该如何解决以下错误吗 这是在我使用以下命令从 GCC 9 3 0 降级到 7 后发生的 使用以前版本的 GCC 我收到此错误 CMake 不支持的 GNU 版本 不支持高于 8 的 gcc 版本 https stackoverflo
  • “原子”系统调用是什么意思?

    我知道atomic通常在以下上 下文中使用竞争条件意思是类似一致性 and 根据多线程 多处理环境确定结果 没关系 但最近我读到了Linux中的原子系统调用 但不明白什么是atomic实际上这里的意思是 即how this 原子性 is 实
  • 如何将动态链接的应用程序转换为静态链接的应用程序?

    我有一个应用程序 例如 gedit 它是动态链接的 但我没有源代码 所以我不能按我喜欢的方式编译它 我想要做的是将其静态链接并将其移动到没有运行该应用程序所需的库的系统 那么是否可以做到以及如何做到呢 理论上是可能的 您基本上必须执行与动态
  • posix 和 linux 特定函数的 C++ 包装器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您知道有什么好的库将 posix 和 linux 函数和结构 例如套接字或文件描述符 包装到 C 类中
  • 如何重新安装cudnn?

    安装Cudnn 4 0 4后 我发现如果我想运行我下载的代码 我需要更高版本的Cudnn 然后我下载 cudnn 7 0 linux x64 v4 0 prod tgz 并直接按以下顺序安装 sudo cp include cudnn h
  • 为什么不使用 sshrc 中设置的 $PATH?

    我正在尝试在 OS X 服务器上通过 ssh 设置 svn 为了做到这一点 我读到我需要一个包装器来设置 umask 并 在我的例子中 设置存储库根 一种快速而肮脏的方法是重命名 usr bin svnserve并将包装器脚本放置在该位置
  • C++向量数组运算符计算成本高?

    我一直都知道 C 的丰富抽象会带来一定的计算开销 但我的印象是 一旦应用了正确的编译器优化 这种开销几乎可以忽略不计 我很好奇这种开销到底有多大 所以我编写了一个简单的测试来确定这一点 该测试是一个模板化函数 它接受一个容器变量 为容器中的
  • 参数无效”设置键“net.core.somaxconn”

    我尝试设置Linux内核 编辑后 etc sysctl conf并执行sysctl p它显示错误 Invalid argument setting key net core somaxconn Linux 发行版 Ubuntu 12 04
  • 如何在 Linux 上正确地将网络接口置于混杂模式

    那么如何正确地做到这一点呢 我知道如何通过创建套接字 然后使用 ioctl 设置 IFF PROMISC 标志来做到这一点 如 如何在C中检查网络设备状态 https stackoverflow com questions 3055622
  • Python select() 行为很奇怪

    我在理解 select select 的行为时遇到一些困难 请考虑以下 Python 程序 def str to hex s def dig n if n gt 9 return chr 65 10 n else return chr 48
  • 如何在多行而不是单行输出上打印 Linux 组名称

    我尝试过 getent group 命令 id Gn user 和一些 sed 组合 但我认为我无法实现 因此向其他程序员伸出援手 我希望能够打印此 groups abc123输出 abc123 devops 构建测试设计 预期输出 gro
  • 强制 shell 在 SunGrid 引擎中使用 conda 变量中的 python [重复]

    这个问题在这里已经有答案了 我正在尝试在 SunGrid 引擎中执行 python 文件 并且从 anaconda3 环境变量中执行它 我的代码很简单 from future import print function import url
  • top命令的CPU使用率计算

    我正在尝试使用 GNU coreutil top 的公式来计算 CPU 使用率的百分比 但 top 正在使用一些 half total 来计算百分比 即在百分比上添加 0 5 在top的utils c中 以下行 在 3 8 beta1 中
  • 共享库 RPATH 和二进制 RPATH 优先级

    如果共享库链接到二进制文件 并且共享库还依赖于其他库 则共享库的 RPATH 和二进制文件的 RPATH 的优先级 链接器搜索顺序 是什么 二进制文件的 RPATH 是否可以覆盖共享库中的 RPATH 我在共享库RPATH中设置的 ORIG
  • Linux 堆栈大小

    我正在寻找 Linux 内核中堆栈的良好描述 但我发现找到任何有用的东西出奇地困难 我知道大多数系统的堆栈限制为 4k 而其他系统则限制为 8k 我假设每个内核线程 下半部分都有自己的堆栈 我还听说 如果中断发生 它会使用当前线程的堆栈 但

随机推荐

  • Python:模块的绝对导入和相对导入

    思维导图 思维导图中的例子假设我们项目的project结构如下 知识要点 推荐阅读 Python import和from import方法对比 Python 包的调用 路径如何指定 参考资料 1 python from import详解以及
  • 在setup使用ref

  • 015——继承(来 , 看看Java中的继承关系)

    目录 继承 继承概述 使用继承的好处 什么是继承 使用继承的好处 继承后子类的特点 案例演示 继承的设计规范 内存运行原理 继承的设计规范 为什么 内存运行原理 继承的特点 子类是否可以继承父类的构造器 子类是否可以继承父类的私有成员 子类
  • 安卓模拟器中运行C程序

    在 workspace目录下编译好安卓源码 在安卓模拟器中跑一个最简单的C程序 下面来说一下跑C程序的过程 史上最简单的C程序 include
  • 基于MATLAB粒子群算法优化生产调度问题

    基于MATLAB粒子群算法优化生产调度问题 随着企业规模的扩大和竞争的加剧 制造企业越来越重视生产计划安排与协调 生产调度问题是指在生产过程中 对生产资源进行优化调度 以达到最佳生产效率和经济效益的决策问题 在实际应用中 生产调度问题涉及到
  • error:object with buffer protocol required如何解决(学习中问题分析)

    在学习openmv中遇到的问题 object with buffer protocol required 如何解决 根据网上搜索资料得到 F write 如openmv中的串口发送函数 函数需要一个字符串或者字节数组或者bytes对象作为参
  • 【Redis】——AOF持久化

    什么是AOF日志 AOF日志是redis为数据的持久化提供了的一个技术 日志里面记录着执行redis写命令 每当redis执行一条写命令的时候 就会将该命令记录 到AOF日志当中 当redis启动的时候 可以加载AOF日志中的所有指令 并执
  • 学习计划|一个月学会 Python,零基础入门数据分析

    在数据分析领域 python 是一个绕不开的知识和工具 如果不会用 python 就很难说自己会数据分析 但是最近很多想要入门数据分析的小白经常问我 Python 怎么入门 Python 虽然被称作是 最简洁的语言 但是它终究还是一门编程语
  • 笔试

    文章目录 前言 19 IC设计流程 1 确定项目需求 2 前端设计 3 RTL 实现 4 功能验证 5 逻辑综合 DFT 6 形式验证 7 静态时序分析 8 后端设计 20 对数字IC设计的理解 总结 往期精彩 前言 本文首发于微信公众号
  • Java —— 处处是指针

    public class Main public static void main String args String s1 123 String s2 s1 s2 321 System out println s1 int num1 1
  • matlab之简单粒子群的函数寻优

    沉寂了好久 再来CSDN 寻找那一片蔚蓝的天空 编辑环境变了呀 试一下Markdown编辑器 一 关于粒子群算法 粒子群算法是一种智能优化算法 关于智能 个人理解 不过是在枚举法的基础上加上了一定的寻优机制 试想一下枚举法 假设问题的解空间
  • 【Java高级技术】单元测试——概述和快速入门

    单元测试 概述和Junit框架快速入门 1 概述 就是针对最小的功能单元 方法 编写测试代码对其进行正确性测试 可以用来对方法进行测试 它是第三方公司开源出来的 很多开发工具已经集成了Junit框架 比如IDEA 优点 1 可以灵活的编写测
  • 20个有趣的C++实例

    一 简介 这里提供了20个C 有趣的实例 涵盖了基本算法 数据结构与一些LeetCode上常考的编程题 希望这些实例能够帮助您加深对C 的理解 并在实践中不断提高自己 1 打印 Hello World cpp include
  • apt-get常用命令

    apt get 软件包管理器 1 apt get用法 apt get 选项 命令 apt get 选项 install remove pkg1 pkg2 apt get 选项 source pkg1 pkg2 2 命令 update 软件包
  • 在Linux(CentOS)上部署DPDK------命令行方式

    1 DPDK 简介 DPDK Data Plane Development Kit 是数据平面开发工具包 由用于加速在各种CPU架构上运行的数据包处理的库组成 DPDK需要一定的网卡硬件支持 以Intel为例 支持以下网卡 e1000 82
  • Open3D 进阶(7)Kmeans++点云聚类

    目录 一 算法原理 1 原理概述 2 实现流程 3 参考文献 二 代码实现 三 结果展示 四 测试数据 本文由CSDN点云侠原创 原文链接 如果你不是在点云侠的博客中看到该文章 那么此处便是不要脸的爬虫 一 算法原理 1 原理概述
  • TensorFlow.js安装

    TensorFlow js是什么 一个用JavaScript实现的机器学习库 可以直接在浏览器和Node js中适用机器学习技术了 通过上面两点可以知道TensorFlow js首先是一个工具库 并不是一个产品 不能直接帮助我们创造价值 但
  • es 多条件查询 or或 查询

    es 查询满足条件1 或满足条件2 的结果合集 主查询 matchQuery must QueryBuilders boolQuery should QueryBuilders matchQuery xm 好的 分词后匹配 should Q
  • python3.7.3安装教程和配置idle_Python3.7.3安装教程

    最新在学习web自动化测试和接口自动化测试 记录一下学习过程 并将教程分享一下 web自动化测试 选用Python3 7 selenium3 0 均为当前最新版本 本文先介绍一下Python3 7的安装说明 工具 原料 Python3 7
  • PTP(Precision Time Protocol)高精度时间同步协议+linuxptp代码学习

    最近项目中用到了PTP做时间同步 基于linuxptp做的改进和开发 刚入门对很多东西不是很清楚 用wireshark在测试设备的slave这边抓了个包 对照源码和官方文档学习一波 请各位大佬多多批评指正 目前设备上采用的是主从同步 one