2 unstable releases

0.2.0 Mar 7, 2024
0.1.0 Nov 24, 2023

#305 in Network programming

Download history 2/week @ 2024-02-12 8/week @ 2024-02-19 10/week @ 2024-02-26 133/week @ 2024-03-04 28/week @ 2024-03-11 101/week @ 2024-03-25 33/week @ 2024-04-01

167 downloads per month
Used in statime-linux

Apache-2.0 OR MIT

355KB
8K SLoC

Statime

codecov book book

Statime is a library providing an implementation of PTP version 2.1 (IEEE1588-2019). It provides all the building blocks to setup PTP ordinary and boundary clocks.

It is designed to be able to work with many different underlying platforms, including embedded targets. This does mean that it cannot use the standard library and platform specific libraries to interact with the system clock and to access the network. That needs to be provided by the user of the library.

On modern Linux kernels, the statime-linux crate provides ready to use implementations of these interfaces. For other platforms the user will need to implement these themselves.

The statime-stm32 crate gives an example of how to use statime on an embedded target.

Statime - PTP in Rust

The statime-linux crate provides a binary for Linux implementing an ordinary or boundary clock. It will need sufficient permissions to change the system clock to use. The easiest way to start it is through sudo:

sudo ./target/debug/statime-linux -i <network_interface>

Structure

The statime library has been built in a way to try and be platform-agnostic. To do that, the network and clock have been abstracted. The statime-linux library provides implementations of these abstractions for linux-based platforms. For other platforms, this needs to be provided by the user. For more details, see the documentation

Rust version

Statime requires a nigthly version of cargo/rust. The easiest way to obtain these is through rustup

Running with elevated privileges

Because of the use of ports 319 and 320 in the PTP protocol, the code here needs to be run as root. It is best to build the code as a non-root user with

cargo +nightly build

and then run it as root with

sudo ./target/debug/statime -i <ETHERNET INTERFACE NAME>

PTPd setup for testing

PTPd can be used as a ptp master clock for testing. Because of the port usage required by the PTP standard, this master clock must be on a different machine than that used to run the code in this repository. On Ubuntu, it can be installed with

apt install ptpd

You probably wont want to run this continuously as a service, so disable it with

service ptpd disable

Then, to start ptpd, as root run

ptpd -V -n -M -i <INTERFACE>

where <INTERFACE> is the network interface you want ptpd to use. Here -n disables clock adjustment by ptpd, and -M ensures that it runs in master mode only.

Roadmap

  • Q2 2023: PTP master, boundary clock
  • Q3 2023: NTP/PTP clock device + development of PTP for Linux
  • Q4 2023: First release of PTP for Linux + R&D fieldtest TimeNL

Support our work

The development of Statime is kindly supported by the NGI Assure Fund of the NLnet Foundation.

Logo NLnet Logo NGI Assure

SIDN Fonds is supporting us with a grant to develop clock devices running Statime and ntpd-rs, in collaboration with SIDN Labs' TimeNL.

In August of 2023, Sovereign Tech Fund invested in Pendulum (Statime and ntpd-rs). Read more on their website.

Logo STF

We continuously seek the involvement of interested parties and funding for future work. See Project Pendulum or reach out to pendulum@tweedegolf.com.

Dependencies

~4MB
~85K SLoC