config: Add a configuration option for TC mode.

This patch adds a new configuation option that enables transparent
clock mode.  When TC mode is specified, the configured delay mechanism
must also match.  The legacy behavior of upgrading a multi-port clock
from OC to BC is preserved.

Signed-off-by: Richard Cochran <richardcochran@gmail.com>
master
Richard Cochran 2015-10-20 13:23:16 +02:00
parent 96716060b1
commit c8107c8d4b
4 changed files with 63 additions and 7 deletions

View File

@ -24,6 +24,7 @@
#include <string.h> #include <string.h>
#include "bmc.h" #include "bmc.h"
#include "clock.h"
#include "config.h" #include "config.h"
#include "ether.h" #include "ether.h"
#include "hash.h" #include "hash.h"
@ -135,6 +136,14 @@ static struct config_enum clock_servo_enu[] = {
{ NULL, 0 }, { NULL, 0 },
}; };
static struct config_enum clock_type_enu[] = {
{ "OC", CLOCK_TYPE_ORDINARY },
{ "BC", CLOCK_TYPE_BOUNDARY },
{ "P2P_TC", CLOCK_TYPE_P2P },
{ "E2E_TC", CLOCK_TYPE_E2E },
{ NULL, 0 },
};
static struct config_enum dataset_comp_enu[] = { static struct config_enum dataset_comp_enu[] = {
{ "ieee1588", DS_CMP_IEEE1588 }, { "ieee1588", DS_CMP_IEEE1588 },
{ "G.8275.x", DS_CMP_G8275 }, { "G.8275.x", DS_CMP_G8275 },
@ -186,6 +195,7 @@ struct config_item config_tab[] = {
GLOB_ITEM_INT("clockAccuracy", 0xfe, 0, UINT8_MAX), GLOB_ITEM_INT("clockAccuracy", 0xfe, 0, UINT8_MAX),
GLOB_ITEM_INT("clockClass", 248, 0, UINT8_MAX), GLOB_ITEM_INT("clockClass", 248, 0, UINT8_MAX),
GLOB_ITEM_ENU("clock_servo", CLOCK_SERVO_PI, clock_servo_enu), GLOB_ITEM_ENU("clock_servo", CLOCK_SERVO_PI, clock_servo_enu),
GLOB_ITEM_ENU("clock_type", CLOCK_TYPE_ORDINARY, clock_type_enu),
GLOB_ITEM_ENU("dataset_comparison", DS_CMP_IEEE1588, dataset_comp_enu), GLOB_ITEM_ENU("dataset_comparison", DS_CMP_IEEE1588, dataset_comp_enu),
PORT_ITEM_INT("delayAsymmetry", 0, INT_MIN, INT_MAX), PORT_ITEM_INT("delayAsymmetry", 0, INT_MIN, INT_MAX),
PORT_ITEM_ENU("delay_filter", FILTER_MOVING_MEDIAN, delay_filter_enu), PORT_ITEM_ENU("delay_filter", FILTER_MOVING_MEDIAN, delay_filter_enu),

View File

@ -75,6 +75,7 @@ uds_address /var/run/ptp4l
# #
# Default interface options # Default interface options
# #
clock_type OC
network_transport UDPv4 network_transport UDPv4
delay_mechanism E2E delay_mechanism E2E
time_stamping hardware time_stamping hardware

15
ptp4l.8
View File

@ -1,6 +1,6 @@
.TH PTP4l 8 "Novemver 2017" "linuxptp" .TH PTP4l 8 "March 2018" "linuxptp"
.SH NAME .SH NAME
ptp4l - PTP Boundary/Ordinary Clock ptp4l - PTP Boundary/Ordinary/Transparent Clock
.SH SYNOPSIS .SH SYNOPSIS
.B ptp4l .B ptp4l
@ -23,8 +23,8 @@ ptp4l - PTP Boundary/Ordinary Clock
.SH DESCRIPTION .SH DESCRIPTION
.B ptp4l .B ptp4l
is an implementation of the Precision Time Protocol (PTP) according to IEEE is an implementation of the Precision Time Protocol (PTP) according to IEEE
standard 1588 for Linux. It implements Boundary Clock (BC) and Ordinary Clock standard 1588 for Linux. It implements Boundary Clock (BC), Ordinary Clock
(OC). (OC), and Transparent Clock (TC).
.SH OPTIONS .SH OPTIONS
.TP .TP
@ -425,6 +425,13 @@ number is set to the domain number), and "nullf" for a servo that
always dials frequency offset zero (for use in SyncE nodes). always dials frequency offset zero (for use in SyncE nodes).
The default is "pi." The default is "pi."
.TP .TP
.B clock_type
Specifies the kind of PTP clock. Valid values are "OC" for ordinary
clock, "BC" for boundary clock, "P2P_TC" for peer to peer transparent
clock, and "E2E_TC" for end to end transparent clock. An multi-port
ordinary clock will automatically be configured as a boundary clock.
The default is "OC".
.TP
.B pi_proportional_const .B pi_proportional_const
The proportional constant of the PI controller. When set to 0.0, the The proportional constant of the PI controller. When set to 0.0, the
proportional constant will be set by the following formula from the current proportional constant will be set by the following formula from the current

44
ptp4l.c
View File

@ -1,6 +1,6 @@
/** /**
* @file ptp4l.c * @file ptp4l.c
* @brief PTP Boundary Clock main program * @brief PTP Boundary Clock or Transparent Clock main program
* @note Copyright (C) 2011 Richard Cochran <richardcochran@gmail.com> * @note Copyright (C) 2011 Richard Cochran <richardcochran@gmail.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -59,6 +59,7 @@ static void usage(char *progname)
" -p [dev] PTP hardware clock device to use, default auto\n" " -p [dev] PTP hardware clock device to use, default auto\n"
" (ignored for SOFTWARE/LEGACY HW time stamping)\n" " (ignored for SOFTWARE/LEGACY HW time stamping)\n"
" -s slave only mode (overrides configuration file)\n" " -s slave only mode (overrides configuration file)\n"
" -t transparent clock\n"
" -l [num] set the logging level to 'num'\n" " -l [num] set the logging level to 'num'\n"
" -m print messages to stdout\n" " -m print messages to stdout\n"
" -q do not print messages to the syslog\n" " -q do not print messages to the syslog\n"
@ -71,6 +72,7 @@ static void usage(char *progname)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
char *config = NULL, *req_phc = NULL, *progname; char *config = NULL, *req_phc = NULL, *progname;
enum clock_type type = CLOCK_TYPE_ORDINARY;
int c, err = -1, index, print_level; int c, err = -1, index, print_level;
struct clock *clock = NULL; struct clock *clock = NULL;
struct option *opts; struct option *opts;
@ -201,8 +203,44 @@ int main(int argc, char *argv[])
goto out; goto out;
} }
clock = clock_create(cfg->n_interfaces > 1 ? CLOCK_TYPE_BOUNDARY : type = config_get_int(cfg, NULL, "clock_type");
CLOCK_TYPE_ORDINARY, cfg, req_phc); switch (type) {
case CLOCK_TYPE_ORDINARY:
if (cfg->n_interfaces > 1) {
type = CLOCK_TYPE_BOUNDARY;
}
break;
case CLOCK_TYPE_BOUNDARY:
if (cfg->n_interfaces < 2) {
fprintf(stderr, "BC needs at least two interfaces\n");
goto out;
}
break;
case CLOCK_TYPE_P2P:
if (cfg->n_interfaces < 2) {
fprintf(stderr, "TC needs at least two interfaces\n");
goto out;
}
if (DM_P2P != config_get_int(cfg, NULL, "delay_mechanism")) {
fprintf(stderr, "P2P_TC needs P2P delay mechanism\n");
goto out;
}
break;
case CLOCK_TYPE_E2E:
if (cfg->n_interfaces < 2) {
fprintf(stderr, "TC needs at least two interfaces\n");
goto out;
}
if (DM_E2E != config_get_int(cfg, NULL, "delay_mechanism")) {
fprintf(stderr, "E2E_TC needs E2E delay mechanism\n");
goto out;
}
break;
case CLOCK_TYPE_MANAGEMENT:
goto out;
}
clock = clock_create(type, cfg, req_phc);
if (!clock) { if (!clock) {
fprintf(stderr, "failed to create a clock\n"); fprintf(stderr, "failed to create a clock\n");
goto out; goto out;