Configure PTP Partial Timing Support

Partial Timing Support (PTS) enables a PTP node to receive and distribute time over Layer 3 IPv4/IPv6 networks using unicast PTP. This allows synchronization with grandmaster clocks across networks where not all nodes participate in timing synchronization. PTS corresponds to the G.8275.2 unicast PTP profile defined by the ITU-T.

In a PTS deployment, you can configure a ptp4l instance with one or more unicast master tables. Each table defines a set of upstream grandmaster addresses from which the node will request time, along with the transport type (UDPv4 or UDPv6) and query parameters.

Prerequisites

  • The host must have L3 IP connectivity to the remote PTP grandmaster. Ensure that routing and addressing are configured appropriately for communication between the host and the external grandmaster.

  • PTS uses UDP ports 319 and 320 for PTP event and general messages, respectively. Ensure that these ports are accessible between the host and the grandmaster.

  • At least one ptp4l instance must be configured. See Configure PTP Service Using the CLI for more information.

  • The ptp4l instance must use a UDP transport on the interface connecting to the upstream grandmaster. Set the network_transport parameter to UDPv4 or UDPv6 at the instance level.

    ~(keystone_admin)]$ system ptp-instance-parameter-add <ptp4l-instance> network_transport=UDPv6
    

About this task

Configure the unicast master tables using the --section option of the system ptp-instance-parameter-add command. Each table is identified by a section name with the prefix unicast_master_table_, for example unicast_master_table_1. You can configure multiple tables on the same ptp4l instance, each with a unique table_id.

The following parameters are supported within a unicast master table section:

Parameter

Required

Description

table_id

Yes

Unique integer identifier for this table within the instance.

logQueryInterval

Yes

Log2 of the interval between unicast grant requests.

peer_address

No

IPv4 or IPv6 address of a peer clock for delay measurement.

UDPv4

Yes (or UDPv6)

IPv4 address of an upstream grandmaster. Multiple entries of the same transport type are allowed per table.

UDPv6

Yes (or UDPv4)

IPv6 address of an upstream grandmaster. Multiple entries of the same transport type are allowed per table.

Note

Do not mix UDPv4 and UDPv6 entries within the same unicast master table. Each table must use a single transport type.

table_id values must be unique within a single ptp4l instance. Different instances may reuse the same table_id values.

Configure Unicast Master Tables

The following procedure configures a ptp4l instance to receive time from an upstream grandmaster over unicast IPv6.

  1. Add the required G.8275.2 profile parameters to the instance.

    ~(keystone_admin)]$ system ptp-instance-parameter-add <ptp4l-instance> \
        domainNumber=44 \
        dataset_comparison=G.8275.x \
        network_transport=UDPv6 \
        fault_reset_interval=-2 \
        logAnnounceInterval=-3 \
        logMinDelayReqInterval=-4 \
        logSyncInterval=-4
    

    Note

    The timing-related interval parameters (logAnnounceInterval, logSyncInterval, logMinDelayReqInterval, fault_reset_interval) are environment-specific. Adjust them to meet the requirements of your network and synchronization source.

  2. Add a unicast master table specifying the upstream grandmaster addresses. You can add multiple grandmaster addresses of the same transport type by repeating the UDPv4 or UDPv6 key.

    ~(keystone_admin)]$ system ptp-instance-parameter-add <ptp4l-instance> \
        --section unicast_master_table_1 \
        table_id=1 \
        logQueryInterval=1 \
        UDPv6=<grandmaster-ipv6-address-1> \
        UDPv6=<grandmaster-ipv6-address-2>
    
  3. Create a PTP interface for the upstream-facing port and assign the unicast master table to it. The inhibit_announce parameter is required on unicast slave interfaces to suppress announce message transmission on those ports.

    ~(keystone_admin)]$ system ptp-interface-add <upstream-interface> <ptp4l-instance>
    ~(keystone_admin)]$ system ptp-interface-parameter-add <upstream-interface> \
        unicast_master_table=1 \
        inhibit_announce=1
    ~(keystone_admin)]$ system host-if-ptp-assign controller-0 <port> <upstream-interface>
    
  4. Assign the instance to the host and apply the configuration.

    ~(keystone_admin)]$ system host-ptp-instance-assign controller-0 <ptp4l-instance>
    ~(keystone_admin)]$ system ptp-instance-apply
    

Verify the Configuration

After applying, use system ptp-instance-show to confirm that parameters are grouped correctly by section.

~(keystone_admin)]$ system ptp-instance-show <ptp4l-instance>

The parameters field shows parameters grouped by section name, for example:

parameters | {'global': ['domainNumber=44', ...],
              'unicast_master_table_1': ['table_id=1', 'logQueryInterval=1', ...],
              'unicast_master_table_2': ['table_id=2', 'logQueryInterval=1', ...]}

Also verify that the unicast master table sections appear correctly in the generated ptp4l configuration file.

~(keystone_admin)]$ cat /etc/linuxptp/ptpinstance/ptp4l-<instance-name>.conf

The output should contain one [unicast_master_table] section per configured table, and the upstream interface section should include inhibit_announce and unicast_master_table. For example:

[unicast_master_table]
##
## Associated with section: unicast_master_table_1
##
table_id 1
logQueryInterval 1
UDPv6 fc00:31:31:31::1

[eno1]
##
## Associated interface: eno1
##
inhibit_announce 1
unicast_master_table 1

Remove Unicast Master Table Configuration

To remove a unicast master table, delete all parameters associated with the section and re-apply.

~(keystone_admin)]$ system ptp-instance-parameter-delete <ptp4l-instance> \
    --section unicast_master_table_1 \
    table_id=1 \
    logQueryInterval=1 \
    UDPv6=<grandmaster-ipv6-address>

~(keystone_admin)]$ system ptp-instance-apply

Example: T-BC PTS Deployment

This example configures a T-BC that receives time from a remote grandmaster over unicast IPv6 (PTS) and distributes time to downstream nodes over L2. A single ptp4l instance handles both the unicast upstream and L2 downstream transports using separate interfaces.

Topology

Remote GM (fc00:31:31:31::1)
     │
     │  unicast IPv6 (G.8275.2)
     │
┌────┴──────────────────────────────────┐
│  NIC 1 (E825) ─ eno1                  │
│    └─ ptp4l unicast slave             │
│    └─ clock: SDP0 output (1PPS) ──┐   │
│                                   │   │
│  NIC 2 (E830) ─ enp108s0f0        │   │
│    └─ ptp4l L2 grandmaster        │   │
│    └─ clock: SDP1 input ──────────┘   │
│    └─ ts2phc: sync PHC from 1PPS      │
└───────────────────────────────────────┘
     │
     │  L2 (G.8275.1)
     │
Downstream edge nodes
  • NIC 1 (E825, eno1): Upstream-facing. Receives time from the remote grandmaster over unicast IPv6. Outputs a 1 PPS signal on (Software-Defined Pin) SDP0 to NIC 2.

  • NIC 2 (E830, enp108s0f0): Downstream-facing. Receives the 1 PPS signal on SDP1, synchronizes its PHC via ts2phc, and distributes time to local edge nodes over L2.

Procedure

ptp4l — unicast slave and L2 grandmaster

  1. Create the ptp4l instance and add G.8275.2 profile parameters.

    ~(keystone_admin)]$ system ptp-instance-add pts-inst1 ptp4l
    ~(keystone_admin)]$ system ptp-instance-parameter-add pts-inst1 \
        domainNumber=44 \
        dataset_comparison=G.8275.x \
        network_transport=UDPv6 \
        fault_reset_interval=-2 \
        logAnnounceInterval=-3 \
        logMinDelayReqInterval=-4 \
        logSyncInterval=-4
    

    Note

    The interval parameters (logAnnounceInterval, logSyncInterval, logMinDelayReqInterval, fault_reset_interval) are environment-specific. Adjust them to match your network and synchronization source.

  2. Add the unicast master table for the upstream grandmaster.

    ~(keystone_admin)]$ system ptp-instance-parameter-add pts-inst1 \
        --section unicast_master_table_1 \
        table_id=1 \
        logQueryInterval=1 \
        UDPv6=fc00:31:31:31::1
    
  3. Create the upstream interface on NIC 1 (eno1). Set inhibit_announce=1 to suppress announce messages on the unicast slave port, and assign the unicast master table.

    ~(keystone_admin)]$ system ptp-interface-add pts-inst1if1 pts-inst1
    ~(keystone_admin)]$ system ptp-interface-parameter-add pts-inst1if1 \
        unicast_master_table=1 \
        inhibit_announce=1
    ~(keystone_admin)]$ system host-if-ptp-assign controller-0 eno1 pts-inst1if1
    
  4. Create the downstream interface on NIC 2 (enp108s0f0) with L2 transport.

    ~(keystone_admin)]$ system ptp-interface-add pts-inst1if2 pts-inst1
    ~(keystone_admin)]$ system ptp-interface-parameter-add pts-inst1if2 \
        network_transport=L2
    ~(keystone_admin)]$ system host-if-ptp-assign controller-0 enp108s0f0 pts-inst1if2
    
  5. Assign the instance to the host.

    ~(keystone_admin)]$ system host-ptp-instance-assign controller-0 pts-inst1
    

phc2sys — system clock synchronization

  1. Create the phc2sys instance and link it to the ptp4l instance.

    ~(keystone_admin)]$ system ptp-instance-add phc-inst1 phc2sys
    ~(keystone_admin)]$ system ptp-instance-parameter-add phc-inst1 \
        domainNumber=44 \
        uds_address=/var/run/ptp4l-pts-inst1
    ~(keystone_admin)]$ system host-ptp-instance-assign controller-0 phc-inst1
    

clock — NIC timing module configuration

  1. Create the clock instance and assign it to the host.

    ~(keystone_admin)]$ system ptp-instance-add clock-pts clock
    ~(keystone_admin)]$ system host-ptp-instance-assign controller-0 clock-pts
    
  2. Configure NIC 1 (E825) to output a 1 PPS signal on SDP0 and use the DPLL TIME_REF as the PHC input reference.

    ~(keystone_admin)]$ system ptp-interface-add clock-ptsif1 clock-pts
    ~(keystone_admin)]$ system ptp-interface-parameter-add clock-ptsif1 \
        sdp0=output \
        period_sdp0=1pps \
        tspll_cfg=timeref_156.25
    ~(keystone_admin)]$ system host-if-ptp-assign controller-0 eno1 clock-ptsif1
    
  3. Configure NIC 2 (E830) to receive the 1 PPS signal on SDP1.

    ~(keystone_admin)]$ system ptp-interface-add clock-ptsif2 clock-pts
    ~(keystone_admin)]$ system ptp-interface-parameter-add clock-ptsif2 sdp1=input
    ~(keystone_admin)]$ system host-if-ptp-assign controller-0 enp108s0f0 clock-ptsif2
    

ts2phc — PHC synchronization for NIC 2

  1. Create the ts2phc instance to synchronize NIC 2’s PHC from the 1 PPS signal generated by NIC 1.

    ~(keystone_admin)]$ system ptp-instance-add ts1 ts2phc
    ~(keystone_admin)]$ system ptp-instance-parameter-add ts1 cmdline_opts='-s generic'
    ~(keystone_admin)]$ system host-ptp-instance-assign controller-0 ts1
    
  2. Create the ts2phc interface on NIC 2 and configure the pin.

    ~(keystone_admin)]$ system ptp-interface-add ts1if1 ts1
    ~(keystone_admin)]$ system ptp-interface-parameter-add ts1if1 \
        ts2phc.channel=1 \
        ts2phc.pin_index=1
    ~(keystone_admin)]$ system host-if-ptp-assign controller-0 enp108s0f0 ts1if1
    

Monitoring parameters

  1. Configure holdover and offset thresholds for the instances.

    ~(keystone_admin)]$ system ptp-instance-parameter-add pts-inst1 \
        --section monitoring \
        holdover_seconds=60 \
        offset_threshold_minor_nsec=1000000 \
        offset_threshold_major_nsec=100000000
    ~(keystone_admin)]$ system ptp-instance-parameter-add phc-inst1 \
        --section monitoring \
        holdover_seconds=60 \
        offset_threshold_minor_nsec=1000000 \
        offset_threshold_major_nsec=100000000
    

    See PTP Instance Monitoring Parameters for details on these parameters.

Apply the configuration

~(keystone_admin)]$ system ptp-instance-apply

Verify that no alarms are raised:

~(keystone_admin)]$ fm alarm-list

Generated configuration files

After applying, the following configuration files are generated on the host. Use these as a reference to verify that the configuration was applied correctly.

/etc/linuxptp/ptpinstance/ptp4l-pts-inst1.conf:

[global]
##
## Default Data Set
##
boundary_clock_jbod 1
clock_servo linreg
dataset_comparison G.8275.x
delay_mechanism E2E
domainNumber 44
fault_reset_interval -2
logAnnounceInterval -3
logMinDelayReqInterval -4
logSyncInterval -4
message_tag pts-inst1
network_transport UDPv6
summary_interval 6
time_stamping hardware
tx_timestamp_timeout 700
uds_address /var/run/ptp4l-pts-inst1

[unicast_master_table]
##
## Associated with section: unicast_master_table_1
##
table_id 1
logQueryInterval 1
UDPv6 fc00:31:31:31::1

[eno1]
##
## Associated interface: eno1
##
inhibit_announce 1
unicast_master_table 1

[enp108s0f0]
##
## Associated interface: enp108s0f0
##
network_transport L2

/etc/linuxptp/ptpinstance/phc2sys-phc-inst1.conf:

[global]
domainNumber 44
uds_address /var/run/ptp4l-pts-inst1

/etc/linuxptp/ptpinstance/clock-clock-pts.conf:

ifname [eno1]
base_port [eno1]
sdp0 output
period_sdp0 1pps
tspll_cfg timeref_156.25
ifname [enp108s0f0]
base_port [enp108s0f0]
sdp1 input

/etc/linuxptp/ptpinstance/ts2phc-ts1.conf:

[global]
##
## Default Data Set
##
leapfile /usr/share/zoneinfo/leap-seconds.list
message_tag ts1
ts2phc.pulsewidth 100000000

[enp108s0f0]
##
## Associated interface: enp108s0f0
##
ts2phc.channel 1
ts2phc.extts_polarity rising
ts2phc.pin_index 1

/etc/linuxptp/ptpinstance/instance-monitoring.conf (relevant sections):

[pts-inst1]
holdover_seconds 60
offset_threshold_major_nsec 100000000
offset_threshold_minor_nsec 1000000

[phc-inst1]
holdover_seconds 60
offset_threshold_major_nsec 100000000
offset_threshold_minor_nsec 1000000

[clock]
holdover_seconds 14400
locked_to_holdover_threshold_seconds 300

[ts1]
holdover_seconds 14400
locked_to_holdover_threshold_seconds 300

Example: T-GM PTS Deployment

This example configures a Telecom Grandmaster (T-GM) that serves time to remote clients over unicast IPv6 only. The node receives its timing reference from a GNSS source via ts2phc and advertises time over a single unicast ptp4l instance.

In this topology the ptp4l instance does not have a unicast master table because the node is the grandmaster — it does not request time from an upstream source. Remote clients configure their own unicast master tables pointing to this node’s address.

Topology

GNSS antenna
     │
     │  1PPS + NMEA
     │
┌────┴──────────────────────────────────┐
│  NIC 1 (E825) ─ eno1                  │
│    └─ ts2phc: GNSS → PHC              │
│    └─ ptp4l: unicast GM (UDPv6)       │
│    └─ phc2sys: PHC → system clock     │
└───────────────────────────────────────┘
     │
     │  unicast IPv6 (G.8275.2)
     │
Remote PTS clients

Procedure

ts2phc — GNSS to PHC synchronization

  1. Create the ts2phc instance to synchronize the NIC PHC from the GNSS source.

    ~(keystone_admin)]$ system ptp-instance-add ts-gm ts2phc
    ~(keystone_admin)]$ system ptp-instance-parameter-add ts-gm \
        ts2phc.nmea_serialport=/dev/ttyACM0
    ~(keystone_admin)]$ system host-ptp-instance-assign controller-0 ts-gm
    
  2. Create the ts2phc interface on NIC 1.

    ~(keystone_admin)]$ system ptp-interface-add ts-gmif1 ts-gm
    ~(keystone_admin)]$ system host-if-ptp-assign controller-0 eno1 ts-gmif1
    

ptp4l — unicast grandmaster

  1. Create the ptp4l instance with G.8275.2 profile parameters.

    ~(keystone_admin)]$ system ptp-instance-add gm-inst1 ptp4l
    ~(keystone_admin)]$ system ptp-instance-parameter-add gm-inst1 \
        domainNumber=44 \
        dataset_comparison=G.8275.x \
        network_transport=UDPv6 \
        logAnnounceInterval=-3 \
        logSyncInterval=-4 \
        logMinDelayReqInterval=-4
    
  2. Create the PTP interface on NIC 1. The hybrid_e2e, inhibit_multicast_service, and unicast_listen parameters are required on a unicast GM interface so that the node accepts unicast negotiation requests from remote clients.

    ~(keystone_admin)]$ system ptp-interface-add gm-inst1if1 gm-inst1
    ~(keystone_admin)]$ system ptp-interface-parameter-add gm-inst1if1 \
        hybrid_e2e=1 \
        inhibit_multicast_service=1 \
        unicast_listen=1
    ~(keystone_admin)]$ system host-if-ptp-assign controller-0 eno1 gm-inst1if1
    
  3. Assign the instance to the host.

    ~(keystone_admin)]$ system host-ptp-instance-assign controller-0 gm-inst1
    

phc2sys — system clock synchronization

  1. Create the phc2sys instance.

    ~(keystone_admin)]$ system ptp-instance-add phc-gm phc2sys
    ~(keystone_admin)]$ system ptp-instance-parameter-add phc-gm \
        domainNumber=44 \
        uds_address=/var/run/ptp4l-gm-inst1
    ~(keystone_admin)]$ system host-ptp-instance-assign controller-0 phc-gm
    

Apply the configuration

~(keystone_admin)]$ system ptp-instance-apply
~(keystone_admin)]$ fm alarm-list

Generated configuration files

/etc/linuxptp/ptpinstance/ptp4l-gm-inst1.conf:

[global]
##
## Default Data Set
##
boundary_clock_jbod 1
clock_servo linreg
dataset_comparison G.8275.x
delay_mechanism E2E
domainNumber 44
logAnnounceInterval -3
logMinDelayReqInterval -4
logSyncInterval -4
message_tag gm-inst1
network_transport UDPv6
summary_interval 6
time_stamping hardware
tx_timestamp_timeout 700
uds_address /var/run/ptp4l-gm-inst1

[eno1]
##
## Associated interface: eno1
##
hybrid_e2e 1
inhibit_multicast_service 1
unicast_listen 1

/etc/linuxptp/ptpinstance/ts2phc-ts-gm.conf:

[global]
##
## Default Data Set
##
leapfile /usr/share/zoneinfo/leap-seconds.list
message_tag ts-gm
ts2phc.nmea_serialport /dev/ttyACM0
ts2phc.pulsewidth 100000000

[eno1]
##
## Associated interface: eno1
##

/etc/linuxptp/ptpinstance/phc2sys-phc-gm.conf:

[global]
domainNumber 44
uds_address /var/run/ptp4l-gm-inst1

For troubleshooting PTS deployments, see PTP Instance Troubleshooting.