3 years agophc2sys: update '-s' option master
Hangbin Liu [Wed, 18 Oct 2017 12:31:38 +0000 (20:31 +0800)]
phc2sys: update '-s' option

Add description about bond interface.

Signed-off-by: Hangbin Liu <>
3 years agosk: don't leak socket when reading of IB GUID fails.
Miroslav Lichvar [Mon, 16 Oct 2017 09:40:12 +0000 (11:40 +0200)]
sk: don't leak socket when reading of IB GUID fails.

Signed-off-by: Miroslav Lichvar <>
3 years agoAdd compile time sanity check for interface name lengths.
Richard Cochran [Sat, 14 Oct 2017 13:02:14 +0000 (06:02 -0700)]
Add compile time sanity check for interface name lengths.

Because our interfaces include UNIX domain sockets, we are using
UNIX_PATH_MAX of 108 bytes for our interface names.  Even though
IF_NAMESIZE is much smaller (16 bytes), there is nothing that
guarantees this.  This patch adds a compile time sanity check that
tests whether the interface name will fit.

Signed-off-by: Richard Cochran <>
3 years agophc_ctl: fix adj command to accept negative offset.
Miroslav Lichvar [Mon, 11 Sep 2017 08:56:03 +0000 (10:56 +0200)]
phc_ctl: fix adj command to accept negative offset.

When parsing the argument, the minimum value should be -DBL_MAX instead
of DBL_MIN, which is the smallest positive value.

Signed-off-by: Miroslav Lichvar <>
3 years agoport: return timestamping iface in port properties
Hangbin Liu [Mon, 9 Oct 2017 14:31:50 +0000 (22:31 +0800)]
port: return timestamping iface in port properties

Signed-off-by: Hangbin Liu <>
3 years agophc2sys: re-create clock clkid and servo when phc index changed
Hangbin Liu [Mon, 9 Oct 2017 14:31:49 +0000 (22:31 +0800)]
phc2sys: re-create clock clkid and servo when phc index changed

When the clock device or phc index changed, the new phc device may have
different maximum adjustment. So we need to create a new clkid and servo
in clock_reinit().

At the same time, we should not only do clock_reinit() when the new state
is PS_MASTER. We also need to reinit clock after a failover in slave mode(
the new state is PS_SLAVE). We can do clock_reinit() even in PS_FAULTY so
we can finish adjust offset before come back to PS_LISTENING. So I removed
the check and let's do clock_reinit() whenever there is a new state.

And for servo reset, as Miroslav suggested, we will do it in these cases:
- the system clock is the new destination (master state)
- a PHC is the new destination (master state)
- a PHC is switched (in any state)

Signed-off-by: Hangbin Liu <>
3 years agophc2sys: split servo_add from function clock_add
Hangbin Liu [Mon, 9 Oct 2017 14:31:48 +0000 (22:31 +0800)]
phc2sys: split servo_add from function clock_add

We also need this part in clock_reinit() later. So split it out of
function clock_add().

Signed-off-by: Hangbin Liu <>
3 years agotransport: pass struct interface to transport_open
Hangbin Liu [Mon, 9 Oct 2017 14:31:47 +0000 (22:31 +0800)]
transport: pass struct interface to transport_open

Pass struct interface so we can use ts_iface in HW filter.

Signed-off-by: Hangbin Liu <>
3 years agoptp4l: use ts label to get ts info
Hangbin Liu [Mon, 9 Oct 2017 14:31:46 +0000 (22:31 +0800)]
ptp4l: use ts label to get ts info

Now the ts label will be either the bond active slave or the interface
name, which is the exactly interface we need to get ts info.

When the link down/up or there is a fail over and ts_label changed, the
phc index may also changed. So we need to check get new ts info and check
clock_required_modes. We will set the link to LINK_DOWN by force if
the new ts_label's timestamp do not support required mode.

If all good, then we set phc index to new one. Also sync clock interval
after switch phc.

Signed-off-by: Hangbin Liu <>
3 years agoclock: add clock_required_modes to obtain the required time stamping mode
Hangbin Liu [Mon, 9 Oct 2017 14:31:45 +0000 (22:31 +0800)]
clock: add clock_required_modes to obtain the required time stamping mode

Separate required_modes setting from clock_create so we can obtain the
required time stamping flags from other place.

Add enum timestamping in struct clock to store the time stamping mode.

Signed-off-by: Hangbin Liu <>
3 years agoport: update port link_status to enum
Hangbin Liu [Mon, 9 Oct 2017 14:31:44 +0000 (22:31 +0800)]
port: update port link_status to enum

Besides link up and down, we may also receive other rtnl messages, like
bond slave changed info, which link state keeps the same.

So we should return EV_FAULT_CLEARED only when both LINK_UP and

When the link state keep the same, we should return EV_NONE.

Signed-off-by: Hangbin Liu <>
3 years agortnl: add function rtnl_get_ts_label to get interface ts_label info
Hangbin Liu [Mon, 9 Oct 2017 14:31:43 +0000 (22:31 +0800)]
rtnl: add function rtnl_get_ts_label to get interface ts_label info

Signed-off-by: Hangbin Liu <>
3 years agortnl: update function rtnl_link_status to get bond slave info
Hangbin Liu [Mon, 9 Oct 2017 14:31:42 +0000 (22:31 +0800)]
rtnl: update function rtnl_link_status to get bond slave info

Update function rtnl_link_status to get bond slave info. Pass the slave index
to call back functions. i.e. port_link_status.

Also check the interface index of rtnl message in function rtnl_link_status.
Then we don't need to check it in port_link_status.

Add ifndef IFLA_BOND_MAX in case we build linuxptp on kernel before v3.13-rc1.

Signed-off-by: Hangbin Liu <>
3 years agortnl: update rtgenmsg to ifinfomsg when request link info
Hangbin Liu [Mon, 9 Oct 2017 14:31:41 +0000 (22:31 +0800)]
rtnl: update rtgenmsg to ifinfomsg when request link info

The previous function use general message and will dump all interfaces'
information. Now update with ifinfomsg so we could get specific interface's

We still could get all interfaces' info if set device to NULL.

Signed-off-by: Hangbin Liu <>
3 years agoport: track interface info in port
Hangbin Liu [Mon, 9 Oct 2017 14:31:40 +0000 (22:31 +0800)]
port: track interface info in port

Signed-off-by: Hangbin Liu <>
3 years agoconfig: add new element ts_label in struct interface
Hangbin Liu [Mon, 9 Oct 2017 14:31:39 +0000 (22:31 +0800)]
config: add new element ts_label in struct interface

Add new element ts_label in struct interface to track real ts interface.

Signed-off-by: Hangbin Liu <>
3 years agophc2sys: fix handling of multiple state changes.
Miroslav Lichvar [Fri, 1 Sep 2017 11:41:41 +0000 (13:41 +0200)]
phc2sys: fix handling of multiple state changes.

When the master clock changed its state and then changed it back to the
original state before phc2sys could process the first change, e.g. SLAVE
-> UNCALIBRATED -> SLAVE after a clockcheck failure, the second change
was ignored because the new value was the same as the original state,
which wasn't updated for the first change yet. This caused phc2sys to be
stuck with a wrong state.

Fix phc2sys to check both the state and new_state variables of the clock.

Signed-off-by: Miroslav Lichvar <>
3 years agoRemove redundant test on the UTC flags.
Richard Cochran [Mon, 24 Jul 2017 06:21:34 +0000 (08:21 +0200)]
Remove redundant test on the UTC flags.

Now that we test the UTC flags in clock_update_slave(), the similar
code in clock_utc_correct() is redundant.

Signed-off-by: Richard Cochran <>
3 years agoLatch the UTC offset.
Richard Cochran [Sat, 22 Jul 2017 20:30:10 +0000 (22:30 +0200)]
Latch the UTC offset.

When acting as a slave, we accept the foreign master's advertised
TAI-UTC offset for as long as that master is present.  However, when
the master disappears, we fall back to the initial offset value.  As a
result of this behavior, when starting with an out of date initial
offset, losing a foreign master causes a sudden UTC offset error (in
phc2sys for example) in the range of whole seconds.

This patch fixes the issue by remembering the UTC offset when assuming
the slave role.

Signed-off-by: Richard Cochran <>
3 years agoSimplify UTC tracking.
Richard Cochran [Sat, 8 Jul 2017 19:29:23 +0000 (21:29 +0200)]
Simplify UTC tracking.

The clock code uses two different variables to store the TAI-UTC
offset.  One variable represents the compile time, configuration file,
or command line initial UTC offset, while the other is used when
taking on the GM role and is settable at run time.  However, making
this distinction makes no sense.  This patch simplifies and clarifies
the code by using a single variable for the offset.

Signed-off-by: Richard Cochran <>
3 years agoptp4l: Add IPoIB interface support for ptp4l
Feras Daoud [Wed, 9 Aug 2017 15:27:32 +0000 (18:27 +0300)]
ptp4l: Add IPoIB interface support for ptp4l

The current implementation of ptp4l always assumes 6 octets MAC
address, which is correct for Ethernet interfaces but not for IPoIB
interfaces (that have 20 octets MAC), therefore running ptp4l over
IPoIB interface does not function correctly.

In Infiniband, every interface has three identifiers:
The GUID is similar in concept to a MAC address. From RFC4392:
The EUI-64 portion of a GID is referred to as the Global Unique
Identifier (GUID) and is the only persistent identifier of a port.

Therefore, to support IPoIB interfaces, the GUID of the port should
be used instead of the MAC.
This patch checks the interface type before creating the clock identity,
for Infiniband ports, it retrieves the GUID of the port using sysfs
and use it to create the clock identity.

sysfs method was chosen since the GUID is the 6 lsb bytes of
the 20 byte device address, and SIOCGIFHWADDR ioctl call returns
the 14 msb bytes of the device address, so it is not possible to
get the GUID using SIOCGIFHWADDR ioctl call.

[ RC: fixed trivial coding style error, space after switch keyword. ]

Signed-off-by: Feras Daoud <>
Reviewed-by: Alex Vesker <>
3 years agoclock: remove hash table index2port
Hangbin Liu [Mon, 10 Jul 2017 07:39:31 +0000 (15:39 +0800)]
clock: remove hash table index2port

Remove index2port since we don't need it now.

Signed-off-by: Hangbin Liu <>
3 years agoclock: remove rtnl fd on clock
Hangbin Liu [Mon, 10 Jul 2017 07:39:30 +0000 (15:39 +0800)]
clock: remove rtnl fd on clock

Remove rtnl fd on clock since we track the link status per port now.

Signed-off-by: Hangbin Liu <>
3 years agoport: add FD_RTNL event to track per-port status
Hangbin Liu [Mon, 10 Jul 2017 07:39:29 +0000 (15:39 +0800)]
port: add FD_RTNL event to track per-port status

With rtnl socket we can track link status per port(except UDS port).

We can make sure we get the correct interface and latest status with function

At the same time we need to set clock sde after link down. But we return
EV_FAULT_DETECTED in port_event(), which will not set clock sde. So we need
to set it in port_link_status().

Signed-off-by: Hangbin Liu <>
3 years agortnl: replace obsolete RTMGRP_LINK with RTNLGRP_LINK for nl groups
Hangbin Liu [Mon, 10 Jul 2017 07:39:28 +0000 (15:39 +0800)]
rtnl: replace obsolete RTMGRP_LINK with RTNLGRP_LINK for nl groups

Signed-off-by: Hangbin Liu <>
3 years agophc2sys: free clock device when exit
Hangbin Liu [Fri, 23 Jun 2017 03:22:45 +0000 (11:22 +0800)]
phc2sys: free clock device when exit

Since we called strdup() for clock device, we need free the memory
before exit.

Signed-off-by: Hangbin Liu <>
3 years agophc2sys: Add described device to stats output
Cliff Spradlin via Linuxptp-devel [Fri, 16 Jun 2017 22:07:19 +0000 (15:07 -0700)]
phc2sys: Add described device to stats output

When phc2sys synced more than one ethernet interface, such as in a JBOD
boundary clock arrangement, it was unclear which interface a line of statistics
referred to.

Previous output:

phc2sys[583.098]: sys offset       -32 s2 freq +131974 delay   3871
phc2sys[583.098]: sys offset        33 s2 freq +125746 delay   4095
phc2sys[583.098]: sys offset       -73 s2 freq +125720 delay   4128
phc2sys[583.098]: sys offset       -19 s2 freq +133265 delay   3888
phc2sys[583.098]: sys offset         2 s2 freq +131986 delay   3920


phc2sys[583.098]: eth9 sys offset       -32 s2 freq +131974 delay   3871
phc2sys[583.098]: eth8 sys offset        33 s2 freq +125746 delay   4095
phc2sys[583.098]: eth7 sys offset       -73 s2 freq +125720 delay   4128
phc2sys[583.098]: eth6 sys offset       -19 s2 freq +133265 delay   3888
phc2sys[583.098]: eth1 sys offset         2 s2 freq +131986 delay   3920

Signed-off-by: Cliff Spradlin <>
3 years agoadded workaround for ticks being returned as zero from 2.6.32 kernel.
Brian Olson [Fri, 16 Jun 2017 16:58:33 +0000 (12:58 -0400)]
added workaround for ticks being returned as zero from 2.6.32 kernel.

Signed-off-by: Brian Olson <>
3 years agofixed include order to work around issue on RHEL 6.6
Brian Olson [Fri, 16 Jun 2017 16:58:32 +0000 (12:58 -0400)]
fixed include order to work around issue on RHEL 6.6

[ RC: Added comment explaining the ordering requirements. ]

Signed-off-by: Brian Olson <>
Signed-off-by: Richard Cochran <>
3 years agoFix build when using uClinux.
Richard Cochran [Tue, 30 May 2017 06:42:27 +0000 (08:42 +0200)]
Fix build when using uClinux.

Unfortunately uClinux is rather inconsistent with respect to
clock_nanosleep().  Older versions of uclibc lack that function, while
newer versions may include the declaration but still lack the
definition, depending on whether pthreads are selected in the

This patch works around uClinux shortcomings by using the library call
when available at compile time, otherwise falling back to syscall().

Signed-off-by: Richard Cochran <>
3 years agopmc: goto out when get unknown management tlv
Hangbin Liu [Tue, 23 May 2017 06:49:55 +0000 (14:49 +0800)]
pmc: goto out when get unknown management tlv

If handle unknown management tlv. The management message id and format are
also unknown, thus we may crash due to access unknown area.

Signed-off-by: Hangbin Liu <>
3 years agopmc: optimize duplicated code in do_set_action()
Petr Kulhavy [Wed, 17 May 2017 13:58:39 +0000 (15:58 +0200)]
pmc: optimize duplicated code in do_set_action()

TLV_PRIORITY1 and TLV_PRIORITY2 cases in do_set_action() use the same repeated
piece of generic code for setting one-value parameter. Remove the duplicated
code and let both cases use the same code.

Signed-off-by: Petr Kulhavy <>
3 years agoclock: Fix poor snprintf() handling.
Richard Cochran [Sun, 21 May 2017 19:17:03 +0000 (21:17 +0200)]
clock: Fix poor snprintf() handling.

The calls to snprintf() to format /dev/phc%d use the wrong pattern.
That function always properly terminates the string with null.
However, the code passes a hard coded length of 31 to static arrays of
length 32.  While this is not a bug, there are two issues here.

First, any (improbable) future increase in the array lengths would
have to also remember to fix up the snprintf() call site as well.
Secondly, the pattern of using buf[N] and then length=N-1 is
appropriate for strncpy(), but is useless for snprintf().

Signed-off-by: Richard Cochran <>
Reported-by: Petr Kulhavy <>
3 years agoMerge 'tsproc' branch allowing clock synch. after jump.
Richard Cochran [Sun, 21 May 2017 17:20:36 +0000 (19:20 +0200)]
Merge 'tsproc' branch allowing clock synch. after jump.

Signed-off-by: Richard Cochran <>
3 years agoFix detection of clock_adjtime
Petr Kulhavy [Mon, 15 May 2017 08:17:53 +0000 (10:17 +0200)]
Fix detection of clock_adjtime

On some platforms clock_adjtime is defined in timex.h instead of time.h
Due to this fact the detection in incdefs.h was failing.
Add timex.h into the list of searched files.

Signed-off-by: Petr Kulhavy <>
3 years agoRemove conflicting netinet/ether.h
Petr Kulhavy [Mon, 15 May 2017 08:17:52 +0000 (10:17 +0200)]
Remove conflicting netinet/ether.h

On some platforms like br-arm-cortex-a9-musl struct ethhdr was defined twice
due to including of both linux/if_ether.h and netinet/ether.h. Which lead
to a compilation error.

Remove netinet/ether.h as the official header for struct ethhdr is

Signed-off-by: Petr Kulhavy <>
3 years agoutil: Fix unknown time_t types with musl-libc builds
Stephen Walker [Sun, 7 May 2017 21:44:14 +0000 (14:44 -0700)]
util: Fix unknown time_t types with musl-libc builds

Fixes the following build errors seen with musl-libc:

In file included from print.h:25:0,
                     from linreg.c:24:
util.h:364:32: error: unknown type name 'time_t'
int rate_limited(int interval, time_t *last);

Signed-off-by: Stephen Walker <>
[florian: extract patch from OpenWrt, add commit message]
Signed-off-by: Florian Fainelli <>
3 years agomsg: use last_tlv if there is not enough room for another tlv
Hangbin Liu [Fri, 12 May 2017 07:36:45 +0000 (15:36 +0800)]
msg: use last_tlv if there is not enough room for another tlv

If the len is not enought for another tlv process. e.g. one more bytes
padding at the end of message. And we set extra to NULL instead of
msg->last_tlv in tlv_post_recv(). Then the msg->last_tlv will not be
initialised. And program will crash if we read msg->last_tlv. e.g. in
function pmc_show().

Signed-off-by: Hangbin Liu <>
3 years agoudp: Avoid including netdb.h
Florian Fainelli [Sun, 7 May 2017 20:02:33 +0000 (13:02 -0700)]
udp: Avoid including netdb.h

netdb.h pulls in a large chain of include files:

rpc/types.h re-defines TRUE/FALSE and does it in this way:

 #ifndef FALSE
 #      define  FALSE   (0)

 #ifndef TRUE
 #      define  TRUE    (1)

And this later causes build problems that appear in this way:

mipsel-linux-gnu-gcc -Wall -DVER=1.8  -D_GNU_SOURCE -DHAVE_CLOCK_ADJTIME
-DHAVE_POSIX_SPAWN -DHAVE_ONESTEP_SYNC  -Os -pipe -mno-branch-likely
-mips32r2 -mtune=24kc -fno-caller-saves -Wno-unused-result
-D_FORTIFY_SOURCE=1 -Wl,-z,now -Wl,-z,relro
udp.o udp.c
In file included from
                 from udp.c:23:
pdt.h:25:7: error: expected identifier before '(' token
 enum {FALSE, TRUE};
<builtin>: recipe for target 'udp.o' failed

Upon inspection, it does not appear that netdb.h is providing any useful
definition or declaration, so let's just remove its inclusion.

Signed-off-by: Florian Fainelli <>
4 years agotsproc: Allow clock synchronization immediately after jump.
Richard Cochran [Sat, 8 Apr 2017 18:36:24 +0000 (20:36 +0200)]
tsproc: Allow clock synchronization immediately after jump.

After a servo jump, the call to tsproc_reset() clears tsp->t3.  This
causes the next call to tsproc_update_offset() to fail.  However the
offset calculation does not necessarily depend on t3, i.e. when
filtered_delay is available and neither raw nor weighting is used.

This patch fixes the issue by allowing the stored filtered delay to be
used when appropriate.

Signed-off-by: Richard Cochran <>
Reported-by: Burkhard Ilsen <>
4 years agotsproc: Clarify the internal mode handling.
Richard Cochran [Sat, 8 Apr 2017 18:17:49 +0000 (20:17 +0200)]
tsproc: Clarify the internal mode handling.

The time stamp processor features four modes resulting from the
combination of two independent Boolean options.  Even though we have a
proper enumerated type to represent the mode, still the code coverts
the mode into two variables.

The tests on the variables are currently simple enough, but soon we
will want to add some more complexity.  In the interest of clarity,
this patch converts the paired Boolean tests into a switch/case

No functional change.

Signed-off-by: Richard Cochran <>
4 years agotsproc: Track the validity of the filtered delay explicitly.
Richard Cochran [Sat, 8 Apr 2017 18:35:58 +0000 (20:35 +0200)]
tsproc: Track the validity of the filtered delay explicitly.

We will want to test whether a valid filtered delay value has been
calculated or not.  However, we cannot simply test for zero since that is
a legitimate possible delay value.  This patch adds a flag that reflects
the state of the filtered delay field.

Signed-off-by: Richard Cochran <>
4 years agoport: sequence of nrate and peer_delay calculation
Burkhard Ilsen [Fri, 7 Apr 2017 22:31:30 +0000 (00:31 +0200)]
port: sequence of nrate and peer_delay calculation

The sequence of port_nrate_calculate() and tsproc_update_delay()
in port_peer_delay() is mixed up.
The peer delay depends on the nrate ratio so the nrate ratio
shall be updated before peer delay is calculated.

Signed-off-by: Burkhard Ilsen <>
4 years agoservo: NULL pointer check for servo constructors
Burkhard Ilsen [Tue, 4 Apr 2017 17:20:17 +0000 (19:20 +0200)]
servo: NULL pointer check for servo constructors

The servo constructors might return a NULL pointer.
The function servo_create() uses servo without checks.

Signed-off-by: Burkhard Ilsen <>
4 years agophc2sys: don't synchronize clock to itself.
Miroslav Lichvar [Mon, 27 Mar 2017 15:43:06 +0000 (17:43 +0200)]
phc2sys: don't synchronize clock to itself.

When ptp4l is using multiple interfaces sharing the same clock, phc2sys
in the automatic mode should not try to synchronize them to each other.

Signed-off-by: Miroslav Lichvar <>
Reported-by: Stefan Lange <>
4 years agoFix leaks of sockets on errors.
Miroslav Lichvar [Mon, 6 Feb 2017 14:51:10 +0000 (15:51 +0100)]
Fix leaks of sockets on errors.

Signed-off-by: Miroslav Lichvar <>
4 years agoclock: Force a BMC election when a port link goes down.
Richard Cochran [Sun, 5 Feb 2017 17:31:27 +0000 (18:31 +0100)]
clock: Force a BMC election when a port link goes down.

Having one fewer port may affect the result of the BMCA.  This patch
changes the main loop so that a link down event also causes a state
decision event.

Signed-off-by: Richard Cochran <>
Reported-by: Henry Jesuiter <>
4 years agoport: Change port_dispatch() into a void function.
Richard Cochran [Sun, 5 Feb 2017 17:25:18 +0000 (18:25 +0100)]
port: Change port_dispatch() into a void function.

This global function used to return an error code, but now it always
returns zero.  This patch converts the function signature to return void
and simplifies the main clock loop by removing the useless test.

Signed-off-by: Richard Cochran <>
4 years agotimemaster: check support for SW time stamping.
Miroslav Lichvar [Tue, 17 Jan 2017 13:17:41 +0000 (14:17 +0100)]
timemaster: check support for SW time stamping.

When an interface doesn't support HW time stamping, before falling back
to SW time stamping, check if it's actually supported and exit with an
error message if not.

Signed-off-by: Miroslav Lichvar <>
4 years agotimemaster: tag ptp4l and phc2sys messages.
Miroslav Lichvar [Tue, 17 Jan 2017 13:17:40 +0000 (14:17 +0100)]
timemaster: tag ptp4l and phc2sys messages.

Use the new options of ptp4l and phc2sys to tag their log messages with
the PTP domain number and name(s) of interface(s) in the domain.

Signed-off-by: Miroslav Lichvar <>
4 years agoAdd options to tag ptp4l and phc2sys log messages.
Miroslav Lichvar [Tue, 17 Jan 2017 13:17:39 +0000 (14:17 +0100)]
Add options to tag ptp4l and phc2sys log messages.

When running multiple instances of ptp4l or phc2sys, it's difficult to
tell which log message belongs to which instance. Add new options to
ptp4l and phc2sys which can specify a tag for all messages printed to
the standard output or system log, so messages from different instances
can have different tags.

Signed-off-by: Miroslav Lichvar <>
4 years agoptp4l: Make UTC offset configurable.
Viliam Lejcik [Tue, 17 Jan 2017 17:25:26 +0000 (18:25 +0100)]
ptp4l: Make UTC offset configurable.

Currently UTC offset is defined as a constant - CURRENT_UTC_OFFSET, and if
a leap second is added, that constant is no longer valid. Ptp4l was
updated to read the UTC offset from configuration instead.

Signed-off-by: Viliam Lejcik <>
4 years agofsm: Make the transition out of INITIALIZING part of the FSM code.
Richard Cochran [Thu, 27 Oct 2016 13:20:36 +0000 (15:20 +0200)]
fsm: Make the transition out of INITIALIZING part of the FSM code.

The state machines in 1588 do not specify an event that causes a transition
out of the initializing state.  This was left as a local issue.  For this
transition, the current code assigns the next state outside of the FSM.  But
doing so prevents an alternative FSM to handle this transition differently.

By introducing a new event, this patch places this transition where it
belongs, namely under the control of the FSM code,

Signed-off-by: Richard Cochran <>
4 years agoDisentangle initialization from fault clearing.
Richard Cochran [Tue, 3 Jan 2017 19:55:50 +0000 (20:55 +0100)]
Disentangle initialization from fault clearing.

Although leaving the INITIALIZING state and clearing the FAULTY state
ASAP both result in a port entering the LISTENING state, still there
is no benefit from conflating the two.  In the FAULTY case, the
current code actually skips the INITIALIZING state altogether.

This patch separates the two cases resulting in two benefits.  First,
the check for ASAP fault status is only made when a fault is actually
present, unlike the present unconditional check.  Second, this change
will allow us to cleanly support alternative state machines later on.

Signed-off-by: Richard Cochran <>
4 years agoMake the fault handling code more readable.
Richard Cochran [Tue, 3 Jan 2017 19:55:42 +0000 (20:55 +0100)]
Make the fault handling code more readable.

The code that decides whether a fault qualifies for ASAP treatment is
a tangle of logical operators.  This patch replaces the open coded
logic with a helper function whose name makes the intent clear.  This
is a cosmetic change only.

Signed-off-by: Richard Cochran <>
4 years agoChange a misleading fault handling function signature.
Richard Cochran [Tue, 3 Jan 2017 19:55:33 +0000 (20:55 +0100)]
Change a misleading fault handling function signature.

Looking at the fault logic in port_dispatch(), you might think that
the function, fault_interval(), checks whether a fault is active, but
you would be wrong, since that function always returns zero.

This patch removes the superfluous input error checking inside of
fault_interval() and changes the return type to void, making the
actual behavior explicit.  Dropping the input check is safe because
that function has exactly two callers, both of whom always provide
valid inputs.

Signed-off-by: Richard Cochran <>
4 years agoport: Make the finite state machine into a function variable.
Richard Cochran [Tue, 3 Jan 2017 19:55:18 +0000 (20:55 +0100)]
port: Make the finite state machine into a function variable.

This allows adding new FSM flavors in the future.

Signed-off-by: Richard Cochran <>
4 years agoUpdate TAI-UTC offset
Miroslav Lichvar [Thu, 5 Jan 2017 09:15:53 +0000 (10:15 +0100)]
Update TAI-UTC offset

A leap second was applied to UTC on 2016-12-31 and the offset between
TAI and UTC is now 37 seconds.

Signed-off-by: Miroslav Lichvar <>
4 years agoptp4l: Document the "long" command line options in the man page.
Richard Cochran [Tue, 13 Dec 2016 19:49:22 +0000 (20:49 +0100)]
ptp4l: Document the "long" command line options in the man page.

Signed-off-by: Richard Cochran <>
4 years agoconfig: Fix bitwise copy-and-pasto for command line items.
Richard Cochran [Tue, 13 Dec 2016 18:55:39 +0000 (19:55 +0100)]
config: Fix bitwise copy-and-pasto for command line items.

The recent change allowing every configuration option to appear on the
command line wrongly used bitwise AND to set a flag.  This patch fixes
the bug by using the proper bitwise OR idiom.

Signed-off-by: Richard Cochran <>
Reported-by: Miroslav Lichvar <>
Fixes: 4e8dbd8 ("ptp4l: Accept any configuration option as a command line argument.")

4 years agoAdd an acknowledgment in the readme for Exablaze.
Richard Cochran [Fri, 9 Dec 2016 18:40:17 +0000 (19:40 +0100)]
Add an acknowledgment in the readme for Exablaze.

Signed-off-by: Richard Cochran <>
4 years agomakefile: Make the 'clean' target conform to standard practice.
Richard Cochran [Tue, 6 Dec 2016 18:48:39 +0000 (19:48 +0100)]
makefile: Make the 'clean' target conform to standard practice.

This patch makes the build system less surprising by removing the
executable binaries in the 'clean' target.  This behavior is more in
line with the GNU makefile guidelines.

Signed-off-by: Richard Cochran <>
Suggested-by: Manuel Traut <>
4 years agoptp4l: Accept any configuration option as a command line argument.
Richard Cochran [Tue, 6 Dec 2016 18:40:36 +0000 (19:40 +0100)]
ptp4l: Accept any configuration option as a command line argument.

This patch provides a way to use the entire table of configuration options
as "long" command line switches.

Signed-off-by: Richard Cochran <>
4 years agoVersion 1.8 v1.8
Richard Cochran [Fri, 4 Nov 2016 18:38:56 +0000 (19:38 +0100)]
Version 1.8

Signed-off-by: Richard Cochran <>
4 years agoclock: Monitor the link status using a RT netlink socket.
Richard Cochran [Tue, 30 Aug 2016 20:44:55 +0000 (22:44 +0200)]
clock: Monitor the link status using a RT netlink socket.

Poll for link up/down events.  When a link goes down, the port becomes
faulty until the link goes up again.  We keep the fault timer from the
existing fault detection, but a downed link prevents clear the fault.

The new state machine is depicted in this ascii art diagram:

          +--------+    Fault    +---------+
          |        |------------>|         |
          |   UP   |             |  FAULT  |
          |        |<------------|         |
          +--------+   Timeout   +---------+
             A  |                   /
             |  |                  /
   Link-Up   |  | Link-Down       /
             |  |                /
             |  V               /
          +--------+           /  Link-Down
          |        |          /
          |  DOWN  |<--------/
          |        |

If the fault timer occurs in the DOWN state, we simply ignore it.
After all, without the link the port is useless.

There is one case where the new code changes the existing behavior.
If the link quickly does down and then up again while another fault
(and its timer) are active, then we will enter the UP state without
waiting for the fault timer expiration.  However, this behavior is
acceptable because when a link goes up, you are starting with a clean

Signed-off-by: Richard Cochran <>
4 years agoport: Provide methods to set and get the link status.
Richard Cochran [Sat, 30 Jul 2016 13:03:48 +0000 (15:03 +0200)]
port: Provide methods to set and get the link status.

Signed-off-by: Richard Cochran <>
4 years agoclock: Remember each port's interface index.
Richard Cochran [Fri, 29 Jul 2016 20:33:04 +0000 (22:33 +0200)]
clock: Remember each port's interface index.

We use a hash table to remember the mapping.  Since our existing hash
table is a simply string hash, we convert the integer index into a decimal
string.  Although hashing integers in this way is sub-optimal, the table
will not be used in a performance critical path.

Signed-off-by: Richard Cochran <>
4 years agoclock: Fix coding style within a helper function.
Richard Cochran [Fri, 29 Jul 2016 13:39:25 +0000 (15:39 +0200)]
clock: Fix coding style within a helper function.

No functional changes.

Signed-off-by: Richard Cochran <>
4 years agoclock: Remove stray semicolon.
Richard Cochran [Sat, 30 Jul 2016 13:48:46 +0000 (15:48 +0200)]
clock: Remove stray semicolon.

Signed-off-by: Richard Cochran <>
4 years agosk: Add a method to obtain a socket for utility purposes.
Richard Cochran [Fri, 29 Jul 2016 19:54:44 +0000 (21:54 +0200)]
sk: Add a method to obtain a socket for utility purposes.

The clock module will want to know the interface indexes, in order to
implement link monitoring.  However, the clock does not open any sockets
directly.  This helper function lets us keep the clock module free of
socket level code.

Signed-off-by: Richard Cochran <>
4 years agortnl: Introduce RT netlink sockets.
Richard Cochran [Sun, 31 Jul 2016 10:08:24 +0000 (12:08 +0200)]
rtnl: Introduce RT netlink sockets.

This patch adds a source module that implements RT netlink sockets
for the purpose of link monitoring.  Unfortunately the netlink API
offers no possibility for per-port notification.  Instead it
forces us to use a de-multiplexing pattern.

Signed-off-by: Richard Cochran <>
4 years agoclock: Remove cruft from the creation method.
Richard Cochran [Sun, 16 Oct 2016 10:14:08 +0000 (12:14 +0200)]
clock: Remove cruft from the creation method.

The time stamping setup code needlessly queries the configuration data
base over and over, rather than simply using the local variable
already assigned.  This patch replaces the extraneous config_get_int()
calls with the local variable.

Signed-off-by: Richard Cochran <>
4 years agoFix regression in one-step configuration.
Richard Cochran [Sun, 16 Oct 2016 09:55:14 +0000 (11:55 +0200)]
Fix regression in one-step configuration.

We activate on-step mode based on the "time_stamping" and
"twoStepFlag" configuration options.  If twoStepFlag is false and HW
time stamping is enabled, we upgrade the time stamping mode variable
to one-step.

The code that tests the options and sets the one-step mode moved from
ptp4l.c into clock.c in commit 9b27664c ("clock: simplify the create
method.").  However, that commit inadvertently moved the test after
the place where the time stamping mode is latched in a local variable.
As a result, one-step mode is not activated when configured.

This patch fixes the issue by keeping the local time stamping mode
variable up to date during the one-step test.

Signed-off-by: Richard Cochran <>
4 years agoport: Fix input to the BMC for forming the spanning tree.
Richard Cochran [Wed, 3 Aug 2016 12:00:04 +0000 (14:00 +0200)]
port: Fix input to the BMC for forming the spanning tree.

If a non-slave port on a boundary clock see an announce message, then it
must decide whether it should take on the MASTER or the PASSIVE role.  When
the GM fields from the local clock are identical to those in the announce,
then the sender/receiver ports are used as a tie breaker.

Following a typographical error in 1588, the code wrongly uses the port
identity of the upstream parent as the "receiver" id.  As a result, a port
that should be PASSIVE may choose MASTER instead. This patch fixes the
code to use local port id.

Signed-off-by: Richard Cochran <>
4 years agoVersion 1.7 v1.7
Richard Cochran [Thu, 21 Jul 2016 14:49:14 +0000 (16:49 +0200)]
Version 1.7

Signed-off-by: Richard Cochran <>
4 years agotimemaster: ignore failures of non-essential processes.
Miroslav Lichvar [Thu, 14 Jul 2016 11:43:48 +0000 (13:43 +0200)]
timemaster: ignore failures of non-essential processes.

Assume only the chronyd or ntpd process is essential for synchronization
of the system clock and ignore SIGCHLD from other processes. This should
provide resiliency against possible bugs in ptp4l or phc2sys that can
terminate the processes.

Signed-off-by: Miroslav Lichvar <>
4 years agotimemaster: add option to specify first SHM segment.
Miroslav Lichvar [Thu, 14 Jul 2016 11:43:47 +0000 (13:43 +0200)]
timemaster: add option to specify first SHM segment.

This allows using a sequence of SHM segments that starts with a number
larger than zero, which can be useful to avoid conflicts with time
sources that are not started by timemaster, e.g. gpsd using segments
number 0 and 1.

Signed-off-by: Miroslav Lichvar <>
4 years agotimemaster: allow arbitrary options in server/refclock directives.
Miroslav Lichvar [Thu, 14 Jul 2016 11:43:46 +0000 (13:43 +0200)]
timemaster: allow arbitrary options in server/refclock directives.

Instead of trying to support all options of the server and refclock
directives in both NTP implementations, add an "ntp_options" option
which specifies a string that is added directly to the lines in the
chronyd/ntpd configuration file.

Signed-off-by: Miroslav Lichvar <>
4 years agoIntroduce options to set DSCP values in PTP messages.
Jesuiter, Henry (ALC NetworX GmbH) [Tue, 12 Jul 2016 11:52:48 +0000 (11:52 +0000)]
Introduce options to set DSCP values in PTP messages.

In the last years there are several media streaming standards
evolving that are relying on PTP. These standards make requirements
about the DSCP priority of PTP messages. This patch introduces two
new configuration options 'dscp_event' and 'dscp_general' to address
that issue and to be able to set the DSCP priority separately for
PTP event messages and PTP general messages.

Signed-off-by: Henry Jesuiter <>
Signed-off-by: Richard Cochran <>
4 years agoFix data type for return value of vasprintf()
Jesuiter, Henry (ALC NetworX GmbH) [Fri, 8 Jul 2016 09:41:16 +0000 (09:41 +0000)]
Fix data type for return value of vasprintf()

Since size_t is an unsigned data type, it won't evaluate correctly on errors
of vasprintf(). This patch makes 'len2' a signed integer, as expected by

'len2' is of type 'size_t' in util.c:451, but vasprintf in line
457 returns '-1' on error which is checked in line 460. Currently
this check will always fail (regardless of the return value of
vasprintf()), according to its declaration as unsigned int.

[ RC: Added more explanation taken from another list message. ]

Signed-off-by: Henry Jesuiter <>
4 years agouds: Prevent unintentional announce message timeouts.
Richard Cochran [Tue, 5 Jul 2016 12:48:59 +0000 (14:48 +0200)]
uds: Prevent unintentional announce message timeouts.

During the configuration rework, the announce span was wrongly converted
into a hard coded macro.  In addition, the announceReceiptTimeout option
inadvertently became non-zero for the UDS port.  As a result, the UDS port
sets a useless announce message timer, causing the code to close and reopen
the UDS port every few seconds.

This bug has an interesting history.  It was first reported and fixed in
commit f36af8e0 ("uds: disable the accidentally enabled announce timer.").

That very fix was wrongly removed in commit 54f45063 ("port: change
'announce_span' into a macro.").  Because of various code changes, this
bad commit cannot be simply reverted now.

This patch re-introduces the 'announce_span' variable and clears both it
and 'announceReceiptTimeout' for the UDS port, effectively disabling the
announce message timer.

Signed-off-by: Richard Cochran <>
4 years agoFix the man page regarding the '-p' option.
Richard Cochran [Sun, 3 Jul 2016 18:45:41 +0000 (20:45 +0200)]
Fix the man page regarding the '-p' option.

The -p option for ptp4l, which specifies the PHC device, was added
before the ethtool get_ts_info ioctl had been invented.  Today it does
not "force" the given device as the man page says.  Instead this is a
legacy option only useful when running on older kernels.

Signed-off-by: Richard Cochran <>
5 years agoLet the clock code figure the PHC index.
Richard Cochran [Wed, 21 Oct 2015 08:52:25 +0000 (10:52 +0200)]
Let the clock code figure the PHC index.

The code that determines the index of the PHC device is useful to all
kinds of clock devices.

Signed-off-by: Richard Cochran <>
5 years agoclock: specify type at creation time.
Richard Cochran [Sun, 18 Oct 2015 14:26:49 +0000 (16:26 +0200)]
clock: specify type at creation time.

Store the type in the clock object explicitly.

Signed-off-by: Richard Cochran <>
5 years agoconfig: count the interfaces as they are added.
Richard Cochran [Mon, 19 Oct 2015 09:29:49 +0000 (11:29 +0200)]
config: count the interfaces as they are added.

This information is useful to the various clock types.

Signed-off-by: Richard Cochran <>
5 years agoPerform the time stamping mode check in the clock module.
Richard Cochran [Wed, 21 Oct 2015 08:48:43 +0000 (10:48 +0200)]
Perform the time stamping mode check in the clock module.

Signed-off-by: Richard Cochran <>
5 years agoclock: offer a method to get the first port in the list.
Richard Cochran [Sat, 31 Oct 2015 19:44:15 +0000 (20:44 +0100)]
clock: offer a method to get the first port in the list.

This function will allow the TC code to iterate over the ports without
calling into the clock logic.

Signed-off-by: Richard Cochran <>
5 years agoclock: offer a method to get the type rather than the number of ports.
Richard Cochran [Sat, 3 Oct 2015 09:27:02 +0000 (11:27 +0200)]
clock: offer a method to get the type rather than the number of ports.

The port code is not interested in the number of ports but rather the
clock type.  Since the polymorphic clock object will be able to report
its own type, this patch changes the clock interface accordingly.

Signed-off-by: Richard Cochran <>
5 years agoMove the clock type enumeration into the clock header.
Richard Cochran [Sat, 3 Oct 2015 08:56:52 +0000 (10:56 +0200)]
Move the clock type enumeration into the clock header.

Signed-off-by: Richard Cochran <>
5 years agoclock: remove redundant parameter from the create method.
Richard Cochran [Sun, 18 Oct 2015 20:10:05 +0000 (22:10 +0200)]
clock: remove redundant parameter from the create method.

There is no need for the 'ifaces' parameter since the list of network
interfaces is already present in the configuration.

Signed-off-by: Richard Cochran <>
5 years agoclock: simplify the create method.
Richard Cochran [Sun, 18 Oct 2015 15:19:43 +0000 (17:19 +0200)]
clock: simplify the create method.

With the new configuration API, there is no need to pass the default data
set.  Instead, the clock code can read the configuration directly.  This
patch simplifies the clock create method by removing the 'dds' parameter
and moving the code that initialized the data set into the clock module.

Signed-off-by: Richard Cochran <>
5 years agoconfig: get the time stamp information early.
Richard Cochran [Wed, 21 Oct 2015 12:07:32 +0000 (14:07 +0200)]
config: get the time stamp information early.

There is no need to have a function to get this information as
we can easily obtain it when the interface is first created.

Signed-off-by: Richard Cochran <>
5 years agoprint: add missing include directive.
Richard Cochran [Wed, 4 Nov 2015 13:37:25 +0000 (14:37 +0100)]
print: add missing include directive.

This patch adds a #include needed for the declaration of the function,

Signed-off-by: Richard Cochran <>
5 years agofault: protect header against multiple inclusion.
Richard Cochran [Tue, 3 Nov 2015 20:46:15 +0000 (21:46 +0100)]
fault: protect header against multiple inclusion.

Signed-off-by: Richard Cochran <>
5 years agoProperly initialize the message lists.
Richard Cochran [Sun, 1 Nov 2015 11:30:51 +0000 (12:30 +0100)]
Properly initialize the message lists.

The message lists are implemented using a TAILQ from queue(3).  The heads
of the list must be initialized using the provided macros, since the field
called 'tqh_last' is non-zero in the initial state.  This patch fixes a
potential null pointer dereference by properly initializing the queues.

Note that there is no actual bug in the current code, because it uses the
lists in such a way as to initialize 'tqh_last' before any dereference.

Signed-off-by: Richard Cochran <>
5 years agotsproc: Fix time stamp handling with P2P one shot mode.
Richard Cochran [Thu, 31 Mar 2016 14:02:48 +0000 (16:02 +0200)]
tsproc: Fix time stamp handling with P2P one shot mode.

When the P2P link partner is using one shot mode, the residence time
in the peer (t3 - t2) is reflected in the correction field of the
peer delay response message, and t2 and t3 are both zero.

The function port_peer_delay() calls clock_peer_delay(), passing in
the zero valued 't2' to the 'rx' argument.  The latter function then
stores the zero value in the 't4' field of the clock's tsproc

As a result, tsproc_update_offset() returns an error to
clock_synchronize(), and so a slave clock will never leave the
"uncalibrated" state.

This patch fixes the issue by removing the test for a non-zero 't4'
field within the tsproc.

Acked-by: Miroslav Lichvar <>
Signed-off-by: Richard Cochran <>
5 years agotsproc: allow zero remote timestamps in delay update
Miroslav Lichvar [Wed, 18 Nov 2015 13:23:20 +0000 (14:23 +0100)]
tsproc: allow zero remote timestamps in delay update

When remote timestamps from P2P delay measurement are not known (the
remote processing time is saved in the correction field), they are set
to zero. Fix tsproc to not require non-zero t1 and t4.

Signed-off-by: Miroslav Lichvar <>
5 years agoFix typo in manpage of ptp4l
Wolfgang Wallner [Sun, 1 Nov 2015 18:17:29 +0000 (19:17 +0100)]
Fix typo in manpage of ptp4l

There is one parenthesis too many in the manpage of ptp4l.

5 years agoVersion 1.6 v1.6
Richard Cochran [Sat, 19 Sep 2015 14:25:11 +0000 (16:25 +0200)]
Version 1.6

Signed-off-by: Richard Cochran <>
5 years agoUpdate UTC offset
Libor Pechacek [Thu, 17 Sep 2015 10:04:28 +0000 (12:04 +0200)]
Update UTC offset

The difference between Coordinated Universal Time UTC and the International
Atomic Time TAI is :

     from 2015 July 1, 0h UTC, until further notice : UTC-TAI = -36 s

Signed-off-by: Libor Pechacek <>