PTP4l是关于1588v2 PTP协议栈的开源代码,其中实现了各种ITU 规定的profile. ITU规定的各种profile主要满足电信要求的一些profile, profile的定义请参看1588v2协议。PTP4l实现了BC时钟和OC时钟。
1. 语法
PTP4l [-A|-E|-P] [-2|-4|-6] [-H|-S|-L] [-f config] [-p phc-device] [-s] [-l print-level] [-q] [-v] [-i interface]...
选项
-A 自动选择延迟机制,初始为E2E,当收到对端的delay request的时候切换到P2P.
-E 选择延迟 请求-响应机制E2E。默认机制
-P 选择对端延迟机制P2P.
-2 IEEE802.3网络传输
-4 UDP IPv4传输 默认值
-6 UDP IPv6 传输
-H 硬件打时间戳
-S 软件打时间戳
-L legacy硬件时间戳
-f config 读取配置文件
-p phc设备,硬件时间戳的设备 /dev/PTP0
-s 只作为从时钟
-l 打印级别,级别是根据syslog定义的。默认为6 LOG_INFO
-q 不打印消息到系统日志
-v 打印消息的标准输出
-i interface 确定一个PTP的端口。
2. 配置文件
配置文件分为几部分。每个部分均以包含其名称的一行开头,并带有括号。每个设置都放在单独的行上,其中包含
选项和由空格字符分隔的值。空行和以#开头的行将被忽略。
全局部分(表示为[global])设置程序选项,时钟选项和默认端口选项。其他部分是端口特定的部分,它们将覆盖默认端口选项。该部分的名称是
已配置端口的名称(例如[eth0])。 -i选项无需指定配置文件中指定的端口。空端口部分可用于替换命令行选项。
端口选项
延迟不对称
传输路径和接收路径的时间差(以纳秒为单位)。当主机到从机的传播时间较长时,该值应为正;从机到主机的时间较长时,该值应为负。的
默认值为0纳秒。
logAnnounceInterval
公告消息之间的平均时间间隔。较短的时间间隔使PTP41对主从层次结构中的更改反应更快。在整个域中,间隔应相同。被指定为两秒的幂。默认值为1(2秒)。
logSyncInterval
同步消息之间的平均时间间隔。较短的时间间隔可以提高本地时钟的准确性。指定为两秒的幂。默认值为0(1秒)。
logMinDelayReqInterval
Delay_Req消息之间的最小允许平均时间间隔。较短的时间间隔使PTP41对路径延迟的变化反应更快。指定为两秒的幂。默认值为0(1第二)。
logMinPdelayReqInterval
Pdelay_Req消息之间的最小允许平均时间间隔。指定为两秒的幂。默认值为0(1秒)。
announceReceiptTimeout
在最后一条“公告”消息过期之前,错过的“公告”消息的数量。预设值为3。
syncReceiptTimeout
在触发“最佳主时钟”选择之前,可能丢失的同步/跟随消息的数量。此选项用于根据802.1AS-2011标准在gPTP模式下运行。将此选项设置为零将禁用同步消息超时。默认值为0或禁用。具体运输运输特定领域。必须在0到255之间。默认值为0。
path_trace_enabled
启用用于跟踪通告消息路由的机制。默认值为0(禁用)。
follow_up_info
如果启用,则在Follow_Up消息中包括802.1AS数据。默认值为0(禁用)。
fault_reset_interval
从检测到端口故障到重置故障之间的时间(以秒为单位)。该值表示为2的幂。将此值设置为-128或特殊关键字“ ASAP”将使故障排除。立即重置。默认值为4(16秒)。
fault_badpeernet_interval
从检测到对等网络配置错误到重置故障之间的时间(以秒为单位)。在间隔时间内,该端口被禁用。该值以秒为单位,并且特殊关键字ASAP
延迟机制
选择延迟机制。可能的值为E2E,P2P和Auto。默认为E2E。
hybrid_e2e
从企业概要草案中启用“混合”延迟机制。启用后,处于从属状态的端口会将其延迟请求消息发送到从主机的公告消息中获取的单播地址。港口
处于主状态的用户将使用单播延迟响应来回复单播延迟请求。如果将delay_mechanism设置为P2P,则此选项无效。默认值为0(禁用)。
PTP_dst_mac
PTP消息应发送到的MAC地址。仅与L2运输有关。默认值为01:1B:19:00:00:00。
p2p_dst_mac
对等延迟消息应发送到的MAC地址。仅与L2运输有关。默认值为01:80:C2:00:00:0E。
network_transport
选择网络传输。可能的值为UDPv4,UDPv6和L2。默认值为UDPv4。
neighborPropDelayThresh
对等延迟的上限(以纳秒为单位)。如果估计的对等延迟大于此值,则将该端口标记为不支持802.1AS。
min_neighbor_prop_delay
对等延迟的下限(以纳秒为单位)。如果估计的对等延迟小于此值,则将该端口标记为不支持802.1AS。
tsproc_mode
选择用于计算偏移量和延迟的时间戳处理模式。可能的值为filter,raw,filter_weight,raw_weight。当同步消息的速率(logSyncInterval)接近时,原始模式的性能很好
与延迟消息的速率(logMinDelayReqInterval或logMinPdelayReqInterval)类似。加权对于较大的网络抖动很有用(例如,软件时间戳)。默认为过滤器。
delay_filter
选择用于过滤测得的延迟和对等延迟的算法。可能的值是moving_average和moving_median。默认值为moving_median。
delay_filter_length
样本中延迟滤波器的长度。预设值为10。
出口延迟
指定参考平面上的实际传输时间与报告的传输时间戳之间的纳秒差。该值将添加到从硬件获得的出口时间戳记中。默认值为0。
入口延迟
指定报告的接收时间戳和参考平面上的实际接收时间之间的纳秒差。该值将从从硬件获得的入口时间戳中减去。默认值为0。
boundary_clock_jbod
当作为边界时钟运行时(即,配置了多个网络接口时),PTP4l执行完整性检查,以确保所有端口共享同一硬件时钟设备。这个选项允许PTP4l使用“只是一堆彼此不同步的设备”作为边界时钟。对于此模式,必须通过外部程序来同步时钟收集,例如
phc2sys(8)处于“自动”模式。默认值为0(禁用)。
udp_ttl
指定IPv4组播消息的生存时间(TTL)值和IPv6组播消息的跳数限制。此选项仅与IPv4和IPv6 UDP传输相关。默认值为1以限制程序和时钟选项
twoStepFlag
为同步消息启用两步模式。单步模式只能与硬件时间戳一起使用。默认值为1(启用)。只有从
如果启用,本地时钟是仅从时钟。此选项仅适用于1588时钟,不应为802.1AS时钟启用。默认值为0(禁用)。
gmCapable
如果启用此选项,则本地时钟将成为主时钟。这仅适用于802.1AS时钟,对1588时钟无效。默认值为1(启用)。优先级1
本地时钟的priority1属性。在最佳主选择算法中使用它,较低的值优先。必须在0到255之间。默认值为128。优先级2
本地时钟的priority2属性。最佳主选择算法中使用它,较低的值优先。必须在0到255之间。默认值为128。
clockClass
本地时钟的clockClass属性。它表示由主时钟分配的时间的可追溯性。默认值为248。
时钟精度
本地时钟的clockAccuracy属性。最佳主选择算法中使用它。默认值为0xFE。
offsetScaledLogVariance
本地时钟的offsetScaledLogVariance属性。它代表了时钟的稳定性。默认值为0xFFFF。
domainNumber
本地时钟的域属性。默认值为0。
自由奔跑
如果启用,请勿调整本地时钟。默认值为0(禁用)。
freq_est_interval
估计本地时钟频率与对等时钟频率之比的时间间隔。指定为两秒的幂。默认值为1(2秒)。假设如果启用,则将一步响应视为两步响应。它用于解决有问题的802.1AS交换机。默认值为0(禁用)。
tx_timestamp_timeout
最近发送消息时,等待内核发送tx时间戳的轮询时间(以毫秒为单位)。预设值为1。
check_fup_sync
由于可能在网络,硬件或网络堆栈中发生数据包重新排序,因此后续消息可能会出现在匹配的同步消息之前到达应用程序中。因为这是正常的发生次数少,并且sequenceID消息字段确保正确匹配,PTP4l程序接受乱序数据包。此选项使用网络堆栈中的软件时间戳添加其他检查验证同步消息是否确实先到达。仅当您不信任主服务器生成的序列ID时,此选项才有用。默认值为0(禁用)。
时钟伺服
用于同步本地时钟的伺服。对于PI控制器,有效值为“ pi”;对于使用线性回归的自适应控制器,有效值为“ linreg”;对于NTP SHM参考时钟,允许的有效值为“ ntpshm”
另一个同步本地时钟的过程(将SHM段号设置为域号),对于始终拨打频率偏移为零的伺服器,则为“ nullf”(用于SyncE节点)。默认值为“ pi”。
pi_proportional_const
PI控制器的比例常数。当设置为0.0时,将从当前同步间隔通过以下公式设置比例常数。默认值为0.0
i_integral_const
PI控制器的积分常数。当设置为0.0时,将从当前同步间隔通过以下公式设置积分常数。默认值为0.0。
ki = min(ki_scale * sync ^ ki_exponent,ki_norm_max / sync)
pi_proportional_scale
公式中的kp_scale常数用于根据同步间隔设置PI控制器的比例常数。设置为0.0时,硬件和软件时间将从0.7和0.1中选择。分别冲压。默认值为0.0。
pi_proportional_exponent
公式中的kp_exponent常数用于根据同步间隔设置PI控制器的比例常数。默认值为-0.3。
pi_proportional_norm_max
公式中的kp_norm_max常数用于根据同步间隔设置PI控制器的比例常数。默认值为0.7
pi_integral_scale
公式中的ki_scale常数用于根据同步间隔设置PI控制器的积分常数。设置为0.0时,硬件和软件时间的值将从0.3和0.001中选择分别冲压。默认值为0.0。
pi_integral_exponent
公式中的ki_exponent常数,用于根据同步间隔设置PI控制器的积分常数。默认值为0.4。
pi_integral_norm_max
公式中的ki_norm_max常数,用于根据同步间隔设置PI控制器的积分常数。默认值为0.3。
step_threshold
伺服器将通过更改时钟频率而不是步进时钟来校正最大偏移量。设置为0.0时,伺服器除启动外将永不步进时钟。以秒为单位指定。默认值是0.0。该选项以前称为pi_offset_const。
first_step_threshold
伺服器将通过更改时钟频率而不是步进时钟来校正最大偏移量。这仅适用于第一次更新。以秒为单位指定。设置为0.0时, 时钟开始。默认值为0.00002(20微秒)。该选项以前称为pi_f_offset_const。
最大频率时钟的最大允许频率调整,以十亿分之一(ppb)为单位。这是硬件所允许的最大限制。设置为0时,将使用硬件限制。默认是900000000(90%)。该选项以前称为pi_max_frequency。
sanity_freq_limit
未校正时钟与系统单调时钟之间的最大允许频率偏移,以十亿分之一(ppb)为单位。这用作同步时钟的健全性检查。当测量到较大的偏移量时,将显示警告消息,并且将重置伺服器。设置为0时,将禁用完整性检查。默认值为200000000(20%)。
ntpshm_segment
ntpshm伺服器使用的SHM段号。默认值为0。
udp6_scope
指定IPv6组播消息的期望范围。这将用作主地址的第二个字节。此选项仅与IPv6传输有关。请参阅RFC4291。默认值为0x0E
uds_address
指定用于接收本地管理消息的UNIX域套接字的地址。默认值为/ var / run / PTP4l
ogging_level
应打印的消息的最大日志记录级别。默认值为6(LOG_INFO)。冗长的如果启用,则将消息打印到标准输出。默认值为0(禁用)。
use_syslog
如果启用,则将消息打印到系统日志中。默认值为1(启用)。
summary_interval
打印时钟摘要统计信息的时间间隔。指定为两秒的幂。统计信息包括偏移均方根(RMS),最大绝对偏移,频率偏移均值和标准差,以及路径延迟均值和标准差。单位是纳秒和十亿分之一(ppb)。如果间隔中只有一个时钟更新,则将打印样本而不是统计数据。消息以LOG_INFO级别打印。默认值为0(1秒)。
时间戳记
时间戳记方法。允许的值为硬件,软件和旧版。默认为硬件。
产品描述
产品描述字符串。允许的值的形式必须为ManufacturerName; modelNumber; instanceIdentifier,并且最多包含64个utf8符号。默认值为“ ;;”。
版本数据
修订说明字符串包含节点硬件(HW),固件(FW)和软件(SW)的修订。允许值的形式为HW; FW; SW,最多包含32个utf8符号。默认“ ;;”。
userDescription
用户描述字符串。允许的值具有名称形式;位置,并且最多包含128个utf8符号。默认值为空字符串。
厂商身份
制造商ID,应该是制造商拥有的OUI。默认值为00:00:00。
kernel_leap
宣布a秒后,让内核通过步进时钟来应用它,而不是通过伺服来校正一秒偏移,这将通过更改时钟频率来缓慢地校正一秒偏移
(除非将step_threshold选项设置为通过步进来纠正此类偏移量)。仅与软件时间戳相关。默认值为1(启用)。
timeSource
时间源是一个单字节代码,它给出了所使用的本地时钟类型的概念。该值纯粹是信息性的,对“最佳主时钟”算法的结果没有影响,并被公布当时钟成为GM时。
生成配置文件
echo -e "[global]\ntx_timestamp_timeout\t1000\n" > PTP4l.cfg
echo -e "sanity_freq_limit\t0\n" >> PTP4l.cfg
echo -e "logSyncInterval\t0\n" >> PTP4l.cfg
echo -e "assume_two_step\t0\n" >> PTP4l.cfg
echo -e "twoStepFlag\t0\n" >> PTP4l.cfg
echo -e "time_stamping\tonestep\n" >> PTP4l.cfg
3. Linuxptp的实现
3.1 硬件支持
查看网卡是否支持软硬件时间戳:
- sudo ethtool -T eno1
Time stamping parameters for eno1:
Capabilities:
hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE)
software-transmit (SOF_TIMESTAMPING_TX_SOFTWARE)
hardware-receive (SOF_TIMESTAMPING_RX_HARDWARE)
software-receive (SOF_TIMESTAMPING_RX_SOFTWARE)
software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
hardware-raw-clock (SOF_TIMESTAMPING_RAW_HARDWARE)
PTP Hardware Clock: 0
Hardware Transmit Timestamp Modes:
off (HWTSTAMP_TX_OFF)
on (HWTSTAMP_TX_ON)
Hardware Receive Filter Modes:
none (HWTSTAMP_FILTER_NONE)
all (HWTSTAMP_FILTER_ALL)
ptpv1-l4-sync (HWTSTAMP_FILTER_PTP_V1_L4_SYNC)
ptpv1-l4-delay-req (HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ)
ptpv2-l4-sync (HWTSTAMP_FILTER_PTP_V2_L4_SYNC)
ptpv2-l4-delay-req (HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ)
ptpv2-l2-sync (HWTSTAMP_FILTER_PTP_V2_L2_SYNC)
ptpv2-l2-delay-req (HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ)
ptpv2-event (HWTSTAMP_FILTER_PTP_V2_EVENT)
ptpv2-sync (HWTSTAMP_FILTER_PTP_V2_SYNC)
ptpv2-delay-req (HWTSTAMP_FILTER_PTP_V2_DELAY_REQ)
- 软件时间戳需要包括参数
SOF_TIMESTAMPING_SOFTWARE
SOF_TIMESTAMPING_TX_SOFTWARE
SOF_TIMESTAMPING_RX_SOFTWARE - 硬件时间戳需要包括参数
SOF_TIMESTAMPING_RAW_HARDWARE
SOF_TIMESTAMPING_TX_HARDWARE
SOF_TIMESTAMPING_RX_HARDWARE
3.2 LinuxPTP源码下载
- sudo git clone git://git.code.sf.net/p/linuxptp/code linuxptp
- cd linuxptp
- sudo make
- sudo make install
3.3 run linuxptp
软件时间戳测试
服务端(主钟):
- sudo ptp4l -i enp0s31f6 -m -S
客户端(从钟):
- sudo ptp4l -i eno1 -m -S -s
运行结果:
主钟:
主钟运行结果示意图
从钟:
从钟运行结果示意图
运行一会儿以后:
从钟锁定示意图
log中的内容为:
- master offset : 即PTP协议中定义的主从端时间差,单位:ns
- s0,s1,s2 : 表示时钟伺服器的不同状态,s0表示未锁定,s1表示正在同步,s2表示锁定,锁定状态表示不会再发生阶跃行同步,只是缓慢调整
- port 0:INITIALIZING to LISTENING on INIT_COMPLET : 本地PTP管理的Unix域socket;
- port 1:new foreign … : eno1上的端口;
- 从钟端口状态由UNCALIBRATED 变为SLAVE时,则从钟已经成功地与best master同步。
硬件时间戳测试
服务端(主钟):
- sudo ptp4l -i enp0s31f6 -m -H
客户端(从钟):
- sudo ptp4l -i eno1 -m -H -s
运行结果:
从钟:
硬件同步示意图