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

最近项目中用到了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节。
logInte

  • 13
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值