-
Notifications
You must be signed in to change notification settings - Fork 574
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add basic IEEE-1588 PTP server/client
What works: - Basic server & client operation - Transmission and reception of announce, sync and follow-up Still missing: - SO_TIMINGS for getting more precise packet timestamps - Implementation of delay_req and delay_resp packets - Status and stop interfaces for the daemon
- Loading branch information
1 parent
7a37a93
commit 0ba727d
Showing
10 changed files
with
1,473 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
/**************************************************************************** | ||
* apps/include/netutils/ptpd.h | ||
* | ||
* Licensed to the Apache Software Foundation (ASF) under one or more | ||
* contributor license agreements. See the NOTICE file distributed with | ||
* this work for additional information regarding copyright ownership. The | ||
* ASF licenses this file to you under the Apache License, Version 2.0 (the | ||
* "License"); you may not use this file except in compliance with the | ||
* License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
* License for the specific language governing permissions and limitations | ||
* under the License. | ||
* | ||
****************************************************************************/ | ||
|
||
#ifndef __APPS_INCLUDE_NETUTILS_PTPD_H | ||
#define __APPS_INCLUDE_NETUTILS_PTPD_H | ||
|
||
/**************************************************************************** | ||
* Included Files | ||
****************************************************************************/ | ||
|
||
/**************************************************************************** | ||
* Pre-processor Definitions | ||
****************************************************************************/ | ||
|
||
/**************************************************************************** | ||
* Public Types | ||
****************************************************************************/ | ||
|
||
/**************************************************************************** | ||
* Public Data | ||
****************************************************************************/ | ||
|
||
#ifdef __cplusplus | ||
#define EXTERN extern "C" | ||
extern "C" | ||
{ | ||
#else | ||
#define EXTERN extern | ||
#endif | ||
|
||
/**************************************************************************** | ||
* Public Function Prototypes | ||
****************************************************************************/ | ||
|
||
/**************************************************************************** | ||
* Name: ptpd_start | ||
* | ||
* Description: | ||
* Start the PTP daemon and bind it to specified interface. | ||
* | ||
* Returned Value: | ||
* On success, the non-negative task ID of the PTP daemon is returned; | ||
* On failure, a negated errno value is returned. | ||
* | ||
****************************************************************************/ | ||
|
||
int ptpd_start(const char *interface); | ||
|
||
#undef EXTERN | ||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* __APPS_INCLUDE_NETUTILS_PTPD_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,167 @@ | ||
# | ||
# For a description of the syntax of this configuration file, | ||
# see the file kconfig-language.txt in the NuttX tools repository. | ||
# | ||
|
||
config NETUTILS_PTPD | ||
bool "PTPD client/server" | ||
default n | ||
select NET_IPv4 | ||
select NET_IGMP | ||
select NET_UDP | ||
---help--- | ||
Build a minimal implementation of IEEE-1588 precision time protocol. | ||
Uses system gettimeofday() and adjtime() calls to synchronize clock | ||
with a master clock through network, or to provide a master clock to | ||
other systems. | ||
|
||
if NETUTILS_PTPD | ||
|
||
config NETUTILS_PTPD_DEBUG | ||
bool "Enable PTP debug messages" | ||
default n | ||
depends on DEBUG_INFO | ||
---help--- | ||
Enable PTP debug messages even if CONFIG_DEBUG_NET_INFO is not enabled. | ||
|
||
config NETUTILS_PTPD_CLIENT | ||
bool "Enable client support" | ||
default y | ||
---help--- | ||
Act as a PTP client, synchronizing the NuttX clock to a remote master | ||
clock. | ||
|
||
config NETUTILS_PTPD_SERVER | ||
bool "Enable server support" | ||
default n | ||
---help--- | ||
Act as a PTP server, providing NuttX clock time to other systems. | ||
|
||
Both server and client can be simultaneously enabled. NuttX will then | ||
synchronize to a higher priority master clock, or act as a master | ||
clock itself if it has the highest priority. | ||
Refer to Best Master Clock algorithm in IEEE-1588 for details. | ||
|
||
config NETUTILS_PTPD_STACKSIZE | ||
int "PTP daemon stack stack size" | ||
default DEFAULT_TASK_STACKSIZE | ||
|
||
config NETUTILS_PTPD_SERVERPRIO | ||
int "PTP daemon priority" | ||
default 100 | ||
|
||
config NETUTILS_PTPD_DOMAIN | ||
int "PTP domain selection" | ||
default 0 | ||
range 0 127 | ||
---help--- | ||
Set PTP domain to participate in. Default domain is 0, other domains | ||
can be used to isolate reference clocks from each other. | ||
|
||
if NETUTILS_PTPD_SERVER | ||
|
||
config NETUTILS_PTPD_PRIORITY1 | ||
int "PTP server priority1" | ||
default 128 | ||
range 0 255 | ||
---help--- | ||
Set clock priority to announce when acting as a PTP server. | ||
Lower value is higher priority. | ||
|
||
A higher priority1 clock will be selected without regard to announced | ||
clock quality fields. | ||
Refer to Best Master Clock algorithm in IEEE-1588 for details. | ||
|
||
config NETUTILS_PTPD_PRIORITY2 | ||
int "PTP server priority2" | ||
default 128 | ||
range 0 255 | ||
---help--- | ||
Set clock subpriority to announce when acting as a PTP server. | ||
This will distinguish between two clocks that are equivalent in | ||
priority1, class and accuracy values. | ||
Lower value is higher priority. | ||
|
||
config NETUTILS_PTPD_CLASS | ||
int "PTP server class" | ||
default 248 | ||
range 0 255 | ||
---help--- | ||
Set master clock class to announce when acting as a PTP server. | ||
Lower value means higher quality clock source. | ||
248 is the default for unknown class. | ||
|
||
config NETUTILS_PTPD_ACCURACY | ||
int "PTP server accuracy" | ||
default 254 | ||
range 0 255 | ||
---help--- | ||
Set master clock accuracy to announce when acting as a PTP server. | ||
Logarithmic scale is defined in IEEE-1588: | ||
32: +- 25 ns | ||
33: +- 100 ns | ||
34: +- 250 ns | ||
35: +- 1 us | ||
36: +- 2.5 us | ||
37: +- 10 us | ||
38: +- 25 us | ||
39: +- 100 us | ||
40: +- 250 us | ||
41: +- 1 ms | ||
42: +- 2.5 ms | ||
43: +- 10 ms | ||
44: +- 25 ms | ||
45: +- 100 ms | ||
46: +- 250 ms | ||
47: +- 1 s | ||
48: +- 10 s | ||
49: +- more than 10 s | ||
254: Unknown | ||
|
||
config NETUTILS_PTPD_CLOCKSOURCE | ||
int "PTP server clock source type" | ||
default 160 | ||
range 0 255 | ||
---help--- | ||
Set clock source type to announce when acting as a PTP server. | ||
Common values: | ||
32: GPS | ||
64: PTP | ||
80: NTP | ||
144: Other | ||
160: Internal oscillator | ||
|
||
config NETUTILS_PTPD_SYNC_INTERVAL_MSEC | ||
int "PTP server sync transmit interval (ms)" | ||
default 1000 | ||
---help--- | ||
How often to transmit sync packets in server mode. | ||
|
||
config NETUTILS_PTPD_ANNOUNCE_INTERVAL_MSEC | ||
int "PTP server announce transmit interval (ms)" | ||
default 10000 | ||
---help--- | ||
How often to transmit announce packets in server mode. | ||
|
||
endif # NETUTILS_PTPD_SERVER | ||
|
||
if NETUTILS_PTPD_CLIENT | ||
|
||
config NETUTILS_PTPD_TIMEOUT_MS | ||
int "PTP client timeout for changing clock source (ms)" | ||
default 60000 | ||
---help--- | ||
If no packets are being received from currently chosen clock source, | ||
fall back to next best clock source after this many seconds. | ||
|
||
config NETUTILS_PTPD_SETTIME_THRESHOLD_MS | ||
int "PTP client threshold for changing system time (ms)" | ||
default 1000 | ||
---help--- | ||
If difference between local and remote clock exceeds this threshold, | ||
time is reset with settimeofday() instead of changing the rate with | ||
adjtime(). | ||
|
||
endif # NETUTILS_PTPD_CLIENT | ||
|
||
endif # NETUTILS_PTPD |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
############################################################################ | ||
# apps/netutils/ptpd/Make.defs | ||
# | ||
# Licensed to the Apache Software Foundation (ASF) under one or more | ||
# contributor license agreements. See the NOTICE file distributed with | ||
# this work for additional information regarding copyright ownership. The | ||
# ASF licenses this file to you under the Apache License, Version 2.0 (the | ||
# "License"); you may not use this file except in compliance with the | ||
# License. You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
# License for the specific language governing permissions and limitations | ||
# under the License. | ||
# | ||
############################################################################ | ||
|
||
ifneq ($(CONFIG_NETUTILS_PTPD),) | ||
CONFIGURED_APPS += $(APPDIR)/netutils/ptpd | ||
endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
############################################################################ | ||
# apps/netutils/ptpd/Makefile | ||
# | ||
# Licensed to the Apache Software Foundation (ASF) under one or more | ||
# contributor license agreements. See the NOTICE file distributed with | ||
# this work for additional information regarding copyright ownership. The | ||
# ASF licenses this file to you under the Apache License, Version 2.0 (the | ||
# "License"); you may not use this file except in compliance with the | ||
# License. You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
# License for the specific language governing permissions and limitations | ||
# under the License. | ||
# | ||
############################################################################ | ||
|
||
include $(APPDIR)/Make.defs | ||
|
||
# PTP server/client implementation | ||
|
||
ifeq ($(CONFIG_NET_UDP),y) | ||
CSRCS = ptpd.c | ||
endif | ||
|
||
include $(APPDIR)/Application.mk |
Oops, something went wrong.