1 .. Copyright (c) 2019 Intel
3 .. Licensed under the Apache License, Version 2.0 (the "License");
4 .. you may not use this file except in compliance with the License.
5 .. You may obtain a copy of the License at
7 .. http://www.apache.org/licenses/LICENSE-2.0
9 .. Unless required by applicable law or agreed to in writing, software
10 .. distributed under the License is distributed on an "AS IS" BASIS,
11 .. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 .. See the License for the specific language governing permissions and
13 .. limitations under the License.
22 A.5 PTP Synchronization
23 -----------------------
24 Precision Time Protocol (PTP) provides an efficient way to synchronize
25 time on the network nodes. This protocol uses Primary-Slave architecture.
26 Main Reference Clock (Primary) is a reference clock for the other nodes,
27 which adapt their clocks to the Primary.
29 Using Physical Hardware Clock (PHC) from the Main Reference Clock, NIC port
30 precision timestamp packets can be served for other network nodes. Secondary
31 nodes adjust their PHC to the Primary following the IEEE 1588
34 There are existing implementations of PTP protocol that are widely used
35 in the industry. One of them is PTP for Linux, which is a set of tools
36 providing necessary PTP functionality. There is no need to re-implement
37 the 1588 protocol because PTP for Linux is precise and efficient enough
38 to be used out of the box.
40 To meet xRAN requirements, two tools from PTP for Linux package are
41 required: ptp4l and phc2sys.
43 PTP for Linux\* Requirements
44 ----------------------------
46 PTP for Linux\* introduces some software and hardware requirements. The
47 machine on which the tools will be run needs to use at least a 3.10
48 Kernel version (built-in PTP support). There are several Kernel options
49 that need to be enabled in Kernel configuration:
53 - CONFIG_NETWORK_PHY_TIMESTAMPING
57 Be sure that the Kernel is compiled with these options.
59 For the best precision, PTP uses hardware timestamping. NIC has its own
60 clock, called Physical Hardware Clock (PHC) to read current time just a
61 moment before the packet is sent to minimalize the delays added by the
62 Kernel processing the packet. Not every NIC supports that feature. To
63 confirm that currently attached NIC support Hardware Timestamps, use
64 ethtool with the command:
68 where eth0 is the potential PHC port. The output from the command should
69 say that there is Hardware Timestamps support.
71 To set up PTP for Linux*:
73 1.Download source code::
75 git clone http://git.code.sf.net/p/linuxptp/code linuxptp
79 2.Apply patch (this is required to work around issue with some of the
80 GM PTP packet size.)::
82 diff --git a/msg.c b/msg.c
88 index d1619d4..40d1538
94 @@ -399,9 +399,11 @@ int msg_post_recv(struct ptp_message \*m, int cnt)
96 port_id_post_recv(&m->pdelay_resp.requestingPortIdentity);
104 timestamp_post_recv(m, &m->follow_up.preciseOriginTimestamp);
112 timestamp_post_recv(m, &m->delay_resp.receiveTimestamp);
114 port_id_post_recv(&m->delay_resp.requestingPortIdentity);
118 3.Build and install ptp41::
120 # make && make install
122 4.Modify configs/default.cfg to control frequency of Sync interval to
130 This tool handles all PTP traffic on the provided NIC port and updated
131 PHC. It also determines the Primary Reference Clock and tracks synchronization
132 status. This tool can be run as a daemon or as a regular Linux\*
133 application. When the synchronization is reached, it gives output on the
134 screen for precision tracking. The configuration file of ptp4l contains
135 many options that can be set to get the best synchronization precision.
136 Although, even with default.cfg the synchronization quality is good.
138 To start the synchronization process run::
142 ./ptp4l -f ./configs/default.cfg -2 -i <if_name> -m
144 The output below shows what the output on non-Primary node should look
145 like when synchronization is started. This means that PHC on this
146 machine is synchronized to the Primary PHC::
148 ptp4l[1434165.358]: port 1: INITIALIZING to LISTENING on INIT_COMPLETE
150 ptp4l[1434165.358]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE
152 ptp4l[1434166.384]: port 1: new foreign primary fcaf6a.fffe.029708-1
154 ptp4l[1434170.352]: selected best primary clock fcaf6a.fffe.029708
156 ptp4l[1434170.352]: updating UTC offset to 37
158 ptp4l[1434170.352]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE
160 ptp4l[1434171.763]: primary offset -5873 s0 freq -18397 path delay 2778
162 ptp4l[1434172.763]: primary offset -6088 s2 freq -18612 path delay 2778
164 ptp4l[1434172.763]: port 1: UNCALIBRATED to SLAVE on
165 MASTER_CLOCK_SELECTED
167 ptp4l[1434173.763]: primary offset -5886 s2 freq -24498 path delay 2732
169 ptp4l[1434174.763]: primary offset 221 s2 freq -20157 path delay 2728
171 ptp4l[1434175.763]: primary offset 1911 s2 freq -18401 path delay 2724
173 ptp4l[1434176.763]: primary offset 1774 s2 freq -17964 path delay 2728
175 ptp4l[1434177.763]: primary offset 1198 s2 freq -18008 path delay 2728
177 ptp4l[1434178.763]: primary offset 746 s2 freq -18101 path delay 2755
179 ptp4l[1434179.763]: primary offset 218 s2 freq -18405 path delay 2792
181 ptp4l[1434180.763]: primary offset 103 s2 freq -18454 path delay 2792
183 ptp4l[1434181.763]: primary offset -13 s2 freq -18540 path delay 2813
185 ptp4l[1434182.763]: primary offset 9 s2 freq -18521 path delay 2813
187 ptp4l[1434183.763]: primary offset 11 s2 freq -18517 path delay 2813
192 The PHC clock is independent from the system clock. Synchronizing only
193 PHC does not make the system clock exactly the same as the primary. The
194 xRAN library requires use of the system clock to determine a common
195 point in time on two machines (O-DU and RU) to start transmission at the
196 same moment and keep time frames defined by ORAN Fronthaul specification.
198 This application keeps the system clock updated to PHC. It makes it
199 possible to use POSIX timers as a time reference in xRAN application.
201 Run phc2sys with the command::
205 ./phc2sys -s enp25s0f0 -w -m -R 8
207 Command output will look like::
209 ptp4l[1434165.342]: selected /dev/ptp4 as PTP
211 phc2sys[1434344.651]: CLOCK_REALTIME phc offset 450 s2 freq -39119 delay
214 phc2sys[1434344.776]: CLOCK_REALTIME phc offset 499 s2 freq -38620 delay
217 phc2sys[1434344.902]: CLOCK_REALTIME phc offset 485 s2 freq -38484 delay
220 phc2sys[1434345.027]: CLOCK_REALTIME phc offset 476 s2 freq -38348 delay
223 phc2sys[1434345.153]: CLOCK_REALTIME phc offset 392 s2 freq -38289 delay
226 phc2sys[1434345.278]: CLOCK_REALTIME phc offset 319 s2 freq -38244 delay
229 phc2sys[1434345.404]: CLOCK_REALTIME phc offset 278 s2 freq -38190 delay
232 phc2sys[1434345.529]: CLOCK_REALTIME phc offset 221 s2 freq -38163 delay
235 phc2sys[1434345.654]: CLOCK_REALTIME phc offset 97 s2 freq -38221 delay
238 phc2sys[1434345.780]: CLOCK_REALTIME phc offset 67 s2 freq -38222 delay
241 phc2sys[1434345.905]: CLOCK_REALTIME phc offset 68 s2 freq -38201 delay
244 phc2sys[1434346.031]: CLOCK_REALTIME phc offset 104 s2 freq -38144 delay
247 phc2sys[1434346.156]: CLOCK_REALTIME phc offset 58 s2 freq -38159 delay
250 phc2sys[1434346.281]: CLOCK_REALTIME phc offset 12 s2 freq -38188 delay
253 phc2sys[1434346.407]: CLOCK_REALTIME phc offset -36 s2 freq -38232 delay
256 phc2sys[1434346.532]: CLOCK_REALTIME phc offset -103 s2 freq -38310
262 Configuration C3 27 can be simulated for O-DU using a separate server
263 acting as Fronthaul Network and O-RU at the same time. O-RU server can
264 be configured to relay PTP and act as PTP primary for O-DU. Settings
265 below can be used to instantiate this scenario. The difference is that
266 on the O-DU side, the Fronthaul port can be used as the source of PTP as
267 well as for U-plane and C-plane traffic.
269 1.Follow the steps in Section A.6.1 to install PTP on the O-RU server.
271 2.Copy configs/default.cfg to configs/default_slave.cfg and modify the
272 copied file as below::
274 diff --git a/configs/default.cfg b/configs/default.cfg
280 index e23dfd7..f1ecaf1
282 --- a/configs/default.cfg
284 +++ b/configs/default.cfg
314 offsetScaledLogVariance 0xFFFF
324 -dataset_comparison ieee1588
326 +dataset_comparison G.8275.x
328 G.8275.defaultDS.localPriority 128
338 logAnnounceInterval 1
344 operLogSyncInterval 0
346 logMinDelayReqInterval 0
348 logMinPdelayReqInterval 0
350 @@ -37,7 +37,7 @@ G.8275.portDS.localPriority 128
358 -inhibit_pdelay_req 0
360 +#inhibit_pdelay_req 0
368 1.Start secondary port toward PTP GM::
370 ./ptp4l -f ./configs/default_slave.cfg -2 -i enp25s0f0 –m
374 ./ptp4l -f ./configs/default_slave.cfg -2 -i enp25s0f0 -m
376 ptp4l[3904470.256]: selected /dev/ptp6 as PTP clock
378 ptp4l[3904470.274]: port 1: INITIALIZING to LISTENING on INIT_COMPLETE
380 ptp4l[3904470.275]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE
382 ptp4l[3904471.085]: port 1: new foreign primary fcaf6a.fffe.029708-1
384 ptp4l[3904475.053]: selected best primary clock fcaf6a.fffe.029708
386 ptp4l[3904475.053]: updating UTC offset to 37
388 ptp4l[3904475.053]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE
390 ptp4l[3904477.029]: primary offset 196 s0 freq -18570 path delay 1109
392 ptp4l[3904478.029]: primary offset 212 s2 freq -18554 path delay 1109
394 ptp4l[3904478.029]: port 1: UNCALIBRATED to SLAVE on
395 MASTER_CLOCK_SELECTED
397 ptp4l[3904479.029]: primary offset 86 s2 freq -18468 path delay 1109
399 ptp4l[3904480.029]: primary offset 23 s2 freq -18505 path delay 1124
401 ptp4l[3904481.029]: primary offset 3 s2 freq -18518 path delay 1132
403 ptp4l[3904482.029]: primary offset -169 s2 freq -18689 path delay 1141
405 2.Synchronize local timer clock on O-RU for sample application::
407 ./phc2sys -s enp25s0f0 -w -m -R 8
411 ./phc2sys -s enp25s0f0 -w -m -R 8
413 phc2sys[3904510.892]: CLOCK_REALTIME phc offset 343 s0 freq -38967 delay
416 phc2sys[3904511.017]: CLOCK_REALTIME phc offset 368 s2 freq -38767 delay
419 phc2sys[3904511.142]: CLOCK_REALTIME phc offset 339 s2 freq -38428 delay
422 phc2sys[3904511.267]: CLOCK_REALTIME phc offset 298 s2 freq -38368 delay
425 phc2sys[3904511.392]: CLOCK_REALTIME phc offset 239 s2 freq -38337 delay
428 phc2sys[3904511.518]: CLOCK_REALTIME phc offset 145 s2 freq -38360 delay
431 phc2sys[3904511.643]: CLOCK_REALTIME phc offset 106 s2 freq -38355 delay
434 phc2sys[3904511.768]: CLOCK_REALTIME phc offset -30 s2 freq -38459 delay
437 phc2sys[3904511.893]: CLOCK_REALTIME phc offset -92 s2 freq -38530 delay
440 phc2sys[3904512.018]: CLOCK_REALTIME phc offset -173 s2 freq -38639
443 phc2sys[3904512.143]: CLOCK_REALTIME phc offset -246 s2 freq -38764
446 phc2sys[3904512.268]: CLOCK_REALTIME phc offset -300 s2 freq -38892
449 3. Modify configs/default.cfg as shown below to run PTP primary on
452 diff --git a/configs/default.cfg b/configs/default.cfg
458 index e23dfd7..c9e9d4c
460 --- a/configs/default.cfg
462 +++ b/configs/default.cfg
464 @@ -15,14 +15,14 @@ free_running 0
472 -dataset_comparison ieee1588
474 +dataset_comparison G.8275.x
476 G.8275.defaultDS.localPriority 128
486 logAnnounceInterval 1
492 operLogSyncInterval 0
494 logMinDelayReqInterval 0
496 logMinPdelayReqInterval 0
498 @@ -37,7 +37,7 @@ G.8275.portDS.localPriority 128
506 -inhibit_pdelay_req 0
508 +#inhibit_pdelay_req 0
516 4.Start PTP primary toward O-DU::
518 ./ptp4l -f ./configs/default.cfg -2 -i enp175s0f1 –m
522 ./ptp4l -f ./configs/default.cfg -2 -i enp175s0f1 -m
524 ptp4l[3903857.249]: selected /dev/ptp3 as PTP clock
526 ptp4l[3903857.266]: port 1: INITIALIZING to LISTENING on INIT_COMPLETE
528 ptp4l[3903857.267]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE
530 ptp4l[3903863.734]: port 1: LISTENING to MASTER on
531 ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
533 ptp4l[3903863.734]: selected local clock 3cfdfe.fffe.bd005d as best
536 ptp4l[3903863.734]: assuming the main reference role
538 5.Synchronize local NIC PTP primary clock to local NIC PTP secondary clock::
540 ./phc2sys -c enp175s0f1 -s enp25s0f0 -w -m -R 8
544 ./phc2sys -c enp175s0f1 -s enp25s0f0 -w -m -R 8
546 phc2sys[3904600.332]: enp175s0f1 phc offset 2042 s0 freq -2445 delay
549 phc2sys[3904600.458]: enp175s0f1 phc offset 2070 s2 freq -2223 delay
552 phc2sys[3904600.584]: enp175s0f1 phc offset 2125 s2 freq -98 delay 4505
554 phc2sys[3904600.710]: enp175s0f1 phc offset 1847 s2 freq +262 delay 4518
556 phc2sys[3904600.836]: enp175s0f1 phc offset 1500 s2 freq +469 delay 4515
558 phc2sys[3904600.961]: enp175s0f1 phc offset 1146 s2 freq +565 delay 4547
560 phc2sys[3904601.086]: enp175s0f1 phc offset 877 s2 freq +640 delay 4542
562 phc2sys[3904601.212]: enp175s0f1 phc offset 517 s2 freq +543 delay 4517
564 phc2sys[3904601.337]: enp175s0f1 phc offset 189 s2 freq +370 delay 4510
566 phc2sys[3904601.462]: enp175s0f1 phc offset -125 s2 freq +113 delay 4554
568 phc2sys[3904601.587]: enp175s0f1 phc offset -412 s2 freq -212 delay 4513
570 phc2sys[3904601.712]: enp175s0f1 phc offset -693 s2 freq -617 delay 4519
572 phc2sys[3904601.837]: enp175s0f1 phc offset -878 s2 freq -1009 delay
575 phc2sys[3904601.962]: enp175s0f1 phc offset -965 s2 freq -1360 delay
578 phc2sys[3904602.088]: enp175s0f1 phc offset -1048 s2 freq -1732 delay
581 phc2sys[3904602.213]: enp175s0f1 phc offset -1087 s2 freq -2086 delay
584 phc2sys[3904602.338]: enp175s0f1 phc offset -1014 s2 freq -2339 delay
587 phc2sys[3904602.463]: enp175s0f1 phc offset -1009 s2 freq -2638 delay
590 6. On O-DU Install PTP for Linux tools from source code the same way as
591 on O-RU above but no need to apply the patch for msg.c
593 7. Start secondary port toward PTP primary from O-RU using the same
594 default_slave.cfg as on O-RU (see above)::
596 ./ptp4l -f ./configs/default_slave.cfg -2 -i enp181s0f0 –m
600 ./ptp4l -f ./configs/default_slave.cfg -2 -i enp181s0f0 -m
602 ptp4l[809092.918]: selected /dev/ptp6 as PTP clock
604 ptp4l[809092.934]: port 1: INITIALIZING to LISTENING on INIT_COMPLETE
606 ptp4l[809092.934]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE
608 ptp4l[809092.949]: port 1: new foreign primary 3cfdfe.fffe.bd005d-1
610 ptp4l[809096.949]: selected best primary clock 3cfdfe.fffe.bd005d
612 ptp4l[809096.950]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE
614 ptp4l[809098.363]: port 1: UNCALIBRATED to SLAVE on
615 MASTER_CLOCK_SELECTED
617 ptp4l[809099.051]: rms 38643 max 77557 freq +719 +/- 1326 delay 1905 +/-
620 ptp4l[809100.051]: rms 1134 max 1935 freq -103 +/- 680 delay 1891 +/- 4
622 ptp4l[809101.051]: rms 453 max 855 freq +341 +/- 642 delay 1888 +/- 0
624 ptp4l[809102.052]: rms 491 max 772 freq +1120 +/- 752 delay 1702 +/- 0
626 ptp4l[809103.052]: rms 423 max 654 freq +1352 +/- 653 delay 1888 +/- 0
628 ptp4l[809104.052]: rms 412 max 579 freq +1001 +/- 672 delay 1702 +/- 0
630 ptp4l[809105.053]: rms 441 max 672 freq +807 +/- 709 delay 1826 +/- 88
632 ptp4l[809106.053]: rms 422 max 607 freq +1353 +/- 636 delay 1702 +/- 0
634 ptp4l[809107.054]: rms 401 max 466 freq +946 +/- 646 delay 1702 +/- 0
636 ptp4l[809108.055]: rms 401 max 502 freq +912 +/- 659
638 8. Synchronize local clock on O-DU for sample application or l1
641 ./phc2sys -s enp181s0f0 -w -m -R 8
645 ./phc2sys -s enp181s0f0 -w -m -R 8
647 phc2sys[809127.123]: CLOCK_REALTIME phc offset 675 s0 freq -37379 delay
650 phc2sys[809127.249]: CLOCK_REALTIME phc offset 696 s2 freq -37212 delay
653 phc2sys[809127.374]: CLOCK_REALTIME phc offset 630 s2 freq -36582 delay
656 phc2sys[809127.500]: CLOCK_REALTIME phc offset 461 s2 freq -36562 delay
659 phc2sys[809127.625]: CLOCK_REALTIME phc offset 374 s2 freq -36510 delay
662 phc2sys[809127.751]: CLOCK_REALTIME phc offset 122 s2 freq -36650 delay
665 phc2sys[809127.876]: CLOCK_REALTIME phc offset 34 s2 freq -36702 delay
668 phc2sys[809128.002]: CLOCK_REALTIME phc offset -112 s2 freq -36837 delay
671 phc2sys[809128.127]: CLOCK_REALTIME phc offset -160 s2 freq -36919 delay
674 phc2sys[809128.252]: CLOCK_REALTIME phc offset -270 s2 freq -37077 delay
677 phc2sys[809128.378]: CLOCK_REALTIME phc offset -285 s2 freq -37173 delay
680 phc2sys[809128.503]: CLOCK_REALTIME phc offset -349 s2 freq -37322 delay
683 phc2sys[809128.629]: CLOCK_REALTIME phc offset -402 s2 freq -37480 delay
686 phc2sys[809128.754]: CLOCK_REALTIME phc offset -377 s2 freq -37576 delay
689 phc2sys[809128.879]: CLOCK_REALTIME phc offset -467 s2 freq -37779 delay
692 phc2sys[809129.005]: CLOCK_REALTIME phc offset -408 s2 freq -37860 delay
695 phc2sys[809129.130]: CLOCK_REALTIME phc offset -480 s2 freq -38054 delay
698 phc2sys[809129.256]: CLOCK_REALTIME phc offset -350 s2 freq -38068 delay
701 Support in xRAN Library
702 ----------------------------
704 The xRAN library provides an API to check whether PTP for Linux is
705 running correctly. There is a function called xran_is_synchronized(). It
706 checks if ptp4l and phc2sys are running in the system by making PMC tool
707 requests for current port state and comparing it with the expected
708 value. This verification should be done before initialization.
710 *notes. “SECONDARY” is the only expected value in this release; only a
711 non-primary scenario is supported currently.*
713 *notes1. Inclusive language terms were used except for the PTP traces where the source code has
714 not been updated to support the inclusive language terms yet.*
716 .. |image0| image:: media/image3.png
719 .. |image1| image:: media/image8.png
722 .. |image2| image:: media/image10.emf
725 .. |image3| image:: media/image15.png
728 .. |image4| image:: media/image21.JPG