最近项目中用到了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字节)+数据。
对应代码:
port_signaling.c中的port_signaling_construct
,生成初始不带TLV的Signaling报文。
port_signaling.c中的process_signaling
,处理收到的Signaling报文:
- 判断当前端口状态,状态正常即可(除INITIALIZING、FAULTY和DISABLED外);
- 遍历消息的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</