使用Linux开源ptp遇到的项目问题

项目中Slave节点使用Gptp同步Master节点时间失败,因收到非法Pdelayresponse报错导致。分析发现是Switch中其他Slave节点的影响。对策是通过修改LinuxPTP源码,过滤不匹配的Pdelay_Resp报文,通过配置Master和SelfMAC地址确保同步正确。对策在台架和实车测试中均有效。
摘要由CSDN通过智能技术生成

1:问题背景

1.1:问题概述
问题内容:项目中ECU作为Slave节点使用Gptp同步到Master节点ECU时间域,实车发现Slave节点同步Master节点时间域失败
预期现象:Slave节点同步Master节点时间域

2:原因分析

2.1:分析结果
ECU使用基于Linux的开源PTP源码
git clone git://git.code.sf.net/p/linuxptp/code linuxptp

【20221012】
上车排查,发现Gptp进程调试信息中有报错-rogue peer delay response,收到非法的Pdelay response,Gptp进程会重置用于同步的端口,导致无法继续同步
在这里插入图片描述
在Slave节点通过tcpdump抓取网卡报文,发现Master节点周期发送Pdelay_Resp和Pdelay_Resp_Follow_Up报文
正常应是Slave节点发送Pdelay_Req后,Master节点再响应Pdelay_Resp和Pdelay_Resp_Follow_Up报文
在这里插入图片描述

【20221012】
Master节点供应商反馈是switch中存在其他Slave节点发Pdelay_Req,Master节点会响应Pdelay_Resp,由于在Gptp在MAC层,所以本Slave节点也会收到其他节点的Pdelay_Resp

3:对策说明

3.1:对策内容
根据Pdelay_Resp和Pdelay_Resp_Follow_Up中的requestingSoucrePortIdentiy字段,过滤掉Master给其他Slave节点回复的Pdelay_Resp和Pdelay_Resp_Follow_Up
根据process_pdelay_resp的ClockIdentity字段和Master的MAC地址比对是否一致,过滤掉其他从节点给ECU回复的pdelay_resp报文
在这里插入图片描述
【20221014】
修改PTP源码:
源文件:port.c
函数名:process_pdelay_req
修改内容:在接收到Pdelay_Req报文时,直接返回,不回复Pdelay_Resp和Pdelay_Resp_Follow_Up
[图片]

源文件:port.c
函数名:process_pdelay_resp
修改内容:
(1)指定自身的MAC地址,指定Master的MAC地址
(2)判断process_pdelay_resp的RequestingPortIdentity字段和自身的MAC地址是否一致(过滤掉Master给其他从节点回复的pdelay_resp报文),不一致直接Return
(3)判断process_pdelay_resp的ClockIdentity字段和Master的MAC地址是否一致(过滤掉其他从节点给我们回复的pdelay_resp报文), 不一致直接Return
(4)满足条件的pdelay_resp即为我们想要的 resp报文
[图片]
在这里插入图片描述
将自身MAC和Master MAC做成可配置项
源文件:config.c
结构体名:config_item config_tab[]
修改内容:新增ptp_master_mac,ptp_self_mac配置项
[图片]
ptp进程启动时需指定配置文件,最终可以在配置文件添加该配置
[图片]
源文件:raw.c
函数名:raw_open
修改内容:将新增的配置读取出来
[图片]
源文件:raw.c
函数名:新增raw_Get_Master_Mac,raw_Get_Self_Mac
修改内容:新增接口获取配置的Master MAC和自身MAC
[图片]

3.2:对策有效性验证(台架)
模拟实车工况,使用另外一个Slave节点模拟实车Gptp Slave节点,使用PC作为Gptp Master节点,配置文件写死Master Mac和自身MAC,运行修改源码后的PTP进程
结果为不再报rogue peer delay response错误,成功同步到Master时间域
[图片]
在这里插入图片描述
3.3:对策有效性验证(实车)
[图片]
实车验证也正常同步到Master时间域

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux使用DP83640实现PTP(Precision Time Protocol)的过程如下: DP83640是一款用于以太网中实现时间同步的芯片。它支持IEEE 1588v2标准,可以实现精确的时钟同步。 在Linux系统中,我们首先需要加载DP83640的驱动程序。可以通过内核的配置选项来启用该驱动,或者使用外部模块的方式加载。加载成功后,系统会自动识别DP83640芯片,并向其分配一个设备节点。 接下来,我们需要使用配置工具对DP83640进行初始化。这些配置通常包括PTP时钟的源,传输时间间隔以及各种时间校正参数等。配置工具会根据我们的需求生成相应的配置文件。 完成配置后,我们可以使用网络配置工具为系统中的网络接口启用PTP功能。该工具将会设置相应的网络参数,使得DP83640可以通过网络与其他设备进行PTP消息的传递和同步。 在DP83640进行PTP通信时,我们需要注意网络拓扑。DP83640可以作为主钟(Master Clock)或从钟(Slave Clock),并与其他PTP设备建立协议栈。在网络中,主钟会周期性地广播时间戳信息,从钟则会根据接收到的时间戳进行本地时钟的调整。 最后,我们可以使用系统工具或开发自定义的应用程序来监控和管理PTP同步。这些工具可以帮助我们查看系统的时间精度,进行时间校准,或者进行日志记录等操作。 总之,Linux使用DP83640实现PTP的过程包括驱动加载、配置初始化、网络接口配置、网络拓扑设置以及监控和管理等步骤。通过这些步骤,我们可以实现精确的时钟同步,并在应用中获得准确的时间标记。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值