From: Luigi Mantellini <luigi.mantell...@sm-optics.com> The step_window functionality should be defined at the port level because we cannot assume that different ports have the same sync message rate. --- clock.c | 13 +++++++++---- clock.h | 5 +++-- config.c | 2 +- port.c | 18 +++++++++++++++++- port.h | 7 +++++++ port_private.h | 1 + 6 files changed, 38 insertions(+), 8 deletions(-)
diff --git a/clock.c b/clock.c index e545a9b..6072ea0 100644 --- a/clock.c +++ b/clock.c @@ -710,6 +710,9 @@ static void clock_update_slave(struct clock *c) pr_info("updating UTC offset to %d", c->tds.currentUtcOffset); c->utc_offset = c->tds.currentUtcOffset; } + + // Port changed + c->step_window_counter = 0; } static int clock_utc_correct(struct clock *c, tmv_t ingress) @@ -1103,7 +1106,8 @@ struct clock *clock_create(enum clock_type type, struct config *config, c->kernel_leap = config_get_int(config, NULL, "kernel_leap"); c->utc_offset = config_get_int(config, NULL, "utc_offset"); c->time_source = config_get_int(config, NULL, "timeSource"); - c->step_window = config_get_int(config, NULL, "step_window"); + c->step_window = 0; + c->step_window_counter = 0; if (c->free_running) { c->clkid = CLOCK_INVALID; @@ -1764,8 +1768,9 @@ int clock_switch_phc(struct clock *c, int phc_index) return 0; } -static void clock_step_window(struct clock *c) +static void clock_step_window(struct clock *c, struct port *p) { + c->step_window = port_step_window(p); if (!c->step_window) { return; } @@ -1783,7 +1788,7 @@ static void clock_synchronize_locked(struct clock *c, double adj) } } -enum servo_state clock_synchronize(struct clock *c, tmv_t ingress, tmv_t origin) +enum servo_state clock_synchronize(struct clock *c, struct port *p, tmv_t ingress, tmv_t origin) { enum servo_state state = SERVO_UNLOCKED; double adj, weight; @@ -1841,7 +1846,7 @@ enum servo_state clock_synchronize(struct clock *c, tmv_t ingress, tmv_t origin) -tmv_to_nanoseconds(c->master_offset)); } tsproc_reset(c->tsproc, 0); - clock_step_window(c); + clock_step_window(c, p); break; case SERVO_LOCKED: clock_synchronize_locked(c, adj); diff --git a/clock.h b/clock.h index 845d54f..0a3b09d 100644 --- a/clock.h +++ b/clock.h @@ -314,6 +314,7 @@ int clock_switch_phc(struct clock *c, int phc_index); /** * Provide a data point to synchronize the clock. * @param c The clock instance to synchronize. + * @param p The port on which the message arrived. * @param ingress The ingress time stamp on the sync message. * @param origin The reported transmission time of the sync message, including any corrections. @@ -322,8 +323,8 @@ int clock_switch_phc(struct clock *c, int phc_index); * Pass zero in the case of one step operation. * @return The state of the clock's servo. */ -enum servo_state clock_synchronize(struct clock *c, tmv_t ingress, - tmv_t origin); +enum servo_state clock_synchronize(struct clock *c, struct port *p, + tmv_t ingress, tmv_t origin); /** * Inform a slaved clock about the master's sync interval. diff --git a/config.c b/config.c index 4472d3d..4e964d1 100644 --- a/config.c +++ b/config.c @@ -305,7 +305,7 @@ struct config_item config_tab[] = { GLOB_ITEM_INT("slaveOnly", 0, 0, 1), /*deprecated*/ GLOB_ITEM_INT("socket_priority", 0, 0, 15), GLOB_ITEM_DBL("step_threshold", 0.0, 0.0, DBL_MAX), - GLOB_ITEM_INT("step_window", 0, 0, INT_MAX), + PORT_ITEM_INT("step_window", 0, 0, INT_MAX), GLOB_ITEM_INT("summary_interval", 0, INT_MIN, INT_MAX), PORT_ITEM_INT("syncReceiptTimeout", 0, 0, UINT8_MAX), GLOB_ITEM_INT("tc_spanning_tree", 0, 0, 1), diff --git a/port.c b/port.c index 10bb9e1..d1ead80 100644 --- a/port.c +++ b/port.c @@ -189,6 +189,21 @@ int port_fault_fd(struct port *port) return port->fault_fd; } +int port_step_window(struct port *p) +{ + int step_window; + + if ((p->initialLogSyncInterval - p->log_sync_interval) > 0) + step_window = (p->step_window << (p->initialLogSyncInterval - p->log_sync_interval)); + else + step_window = (p->step_window >> (p->log_sync_interval - p->initialLogSyncInterval)); + + if (!step_window && p->step_window) + step_window = 1; + + return step_window; +} + struct fdarray *port_fda(struct port *port) { return &port->fda; @@ -1194,7 +1209,7 @@ static void port_synchronize(struct port *p, } last_state = clock_servo_state(p->clock); - state = clock_synchronize(p->clock, t2, t1c); + state = clock_synchronize(p->clock, p, t2, t1c); switch (state) { case SERVO_UNLOCKED: port_dispatch(p, EV_SYNCHRONIZATION_FAULT, 0); @@ -3141,6 +3156,7 @@ struct port *port_open(const char *phc_device, p->delayMechanism = config_get_int(cfg, p->name, "delay_mechanism"); p->versionNumber = PTP_MAJOR_VERSION; p->slave_event_monitor = clock_slave_monitor(clock); + p->step_window = config_get_int(cfg, p->name, "step_window"); if (!port_is_uds(p) && unicast_client_initialize(p)) { goto err_transport; diff --git a/port.h b/port.h index 37a4e19..e8c5792 100644 --- a/port.h +++ b/port.h @@ -252,6 +252,13 @@ struct fdarray *port_fda(struct port *port); */ int port_fault_fd(struct port *port); +/** + * Return the step_window starting counter + * @param port A port instance. + * @return The step_window value. + */ +int port_step_window(struct port *p); + /** * Utility function for setting or resetting a file descriptor timer. * diff --git a/port_private.h b/port_private.h index 2a98ef4..1d677e5 100644 --- a/port_private.h +++ b/port_private.h @@ -104,6 +104,7 @@ struct port { int inhibit_announce; int ignore_source_id; int inhibit_delay_req; + int step_window; /* portDS */ struct PortIdentity portIdentity; enum port_state state; /*portState*/ -- 2.31.1 _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel