On Mon, Mar 18, 2019 at 03:51:30PM -0700, Vedang Patel wrote:
> @@ -1123,10 +1123,16 @@ static void port_synchronize(struct port *p,
> c2 = correction_to_tmv(correction2);
> t1c = tmv_add(t1, tmv_add(c1, c2));
>
> + last_state = clock_servo_state(p->clock);
> state = clock_synchronize(p->clock, t2, t1c);
> switch (state) {
> case SERVO_UNLOCKED:
> port_dispatch(p, EV_SYNCHRONIZATION_FAULT, 0);
> + p->logPdelayReqInterval = p->logMinPdelayReqInterval;
> + p->logSyncInterval = p->initialLogSyncInterval;
> + port_tx_interval_request(p, SIGNAL_NO_CHANGE,
> + p->logSyncInterval,
> + SIGNAL_NO_CHANGE);
This sends a message with every Sync. That isn't what we want.
Instead, we should send the request only when entering SERVO_UNLOCKED,
and only if the relevant options are configured.
> break;
> case SERVO_JUMP:
> port_dispatch(p, EV_SYNCHRONIZATION_FAULT, 0);
> @@ -1139,6 +1145,16 @@ static void port_synchronize(struct port *p,
> case SERVO_LOCKED:
> port_dispatch(p, EV_MASTER_CLOCK_SELECTED, 0);
> break;
> + case SERVO_LOCKED_STABLE:
> + if (last_state == SERVO_LOCKED) {
> + p->logPdelayReqInterval = p->operLogPdelayReqInterval;
> + p->logSyncInterval = p->operLogSyncInterval;
> + port_tx_interval_request(p, SIGNAL_NO_CHANGE,
> + p->logSyncInterval,
> + SIGNAL_NO_CHANGE);
In contrast, this one is okay, since it only sends once, and only if
the options are set (otherwise you can't enter SERVO_LOCKED_STABLE).
> + }
> + port_dispatch(p, EV_MASTER_CLOCK_SELECTED, 0);
> + break;
> }
> }
>
> @@ -1613,8 +1629,10 @@ int port_initialize(struct port *p)
> p->localPriority = config_get_int(cfg, p->name,
> "G.8275.portDS.localPriority");
> p->initialLogSyncInterval = config_get_int(cfg, p->name,
> "logSyncInterval");
> p->logSyncInterval = p->initialLogSyncInterval;
> + p->operLogSyncInterval = config_get_int(cfg, p->name,
> "operLogSyncInterval");
> p->logMinPdelayReqInterval = config_get_int(cfg, p->name,
> "logMinPdelayReqInterval");
> p->logPdelayReqInterval = p->logMinPdelayReqInterval;
> + p->operLogPdelayReqInterval = config_get_int(cfg, p->name,
> "operLogPdelayReqInterval");
> p->neighborPropDelayThresh = config_get_int(cfg, p->name,
> "neighborPropDelayThresh");
> p->min_neighbor_prop_delay = config_get_int(cfg, p->name,
> "min_neighbor_prop_delay");
>
> diff --git a/port_private.h b/port_private.h
> index d28ab0712798..bb1d86e08fb5 100644
> --- a/port_private.h
> +++ b/port_private.h
> @@ -115,9 +115,11 @@ struct port {
> UInteger8 transportSpecific;
> UInteger8 localPriority;
> Integer8 initialLogSyncInterval;
> + Integer8 operLogSyncInterval;
> Integer8 logSyncInterval;
> Enumeration8 delayMechanism;
> Integer8 logMinPdelayReqInterval;
> + Integer8 operLogPdelayReqInterval;
> Integer8 logPdelayReqInterval;
> UInteger32 neighborPropDelayThresh;
> int follow_up_info;
> diff --git a/ptp4l.8 b/ptp4l.8
> index 99b085c148c9..fad21bf57724 100644
> --- a/ptp4l.8
> +++ b/ptp4l.8
> @@ -161,6 +161,13 @@ The mean time interval between Sync messages. A shorter
> interval may improve
> accuracy of the local clock. It's specified as a power of two in seconds.
> The default is 0 (1 second).
> .TP
> +.B operLogSyncInterval
> +The mean time interval between Sync messages. This value is only used by the
> +slave device when interval_update_timer is enabled. Slave will send this
> +interval to the master to switch to. This is done via a signaling message
> after
> +interval_update_timer expires. It's specified as a power of two in seconds.
> The
> +default value is 0 (1 second).
> +.TP
> .B logMinDelayReqInterval
> The minimum permitted mean time interval between Delay_Req messages. A
> shorter
> interval makes ptp4l react faster to the changes in the path delay. It's
> @@ -172,6 +179,13 @@ The minimum permitted mean time interval between
> Pdelay_Req messages. It's
> specified as a power of two in seconds.
> The default is 0 (1 second).
> .TP
> +.B operLogPdelayReqInterval
> +The mean time interval between Pdelay Request messages. This value is only
> used
> +by the slave device when interval_update_timer is enabled. Slave will switch
> to
> +the interval specified by this config option after the interval_update_timer
> +expires. It's specified as a power of two in seconds. The default value is 0
> (1
> +second).
> +.TP
> .B announceReceiptTimeout
> The number of missed Announce messages before the last Announce messages
> expires.
> @@ -715,6 +729,22 @@ This will disable source port identity checking for Sync
> and Follow_Up
> messages. This is useful when the announce messages are disabled in the
> master
> and the slave does not have any way to know it's identity. The default is 0
> (disabled).
> +.TP
> +.B servo_num_offset_values
> +The number of offset values calculated in previously received Sync messages
> to
> +consider when adjusting the Sync and Pdelay request intervals. More
> information
> +provided in the description of 'offset_threshold'. The default value is 10.
> +.TP
> +.B servo_offset_threshold
> +This value is used by the slave for adjusting the intervals for Sync and
> Pdelay
> +request messages. The slave will check the last 'num_offset_values' offsets
> and
> +if all those offsets are less than the offset_threshold, it will adjust both
> +the intervals. The Sync interval is adjusted via the signaling mechanism and
> +the pdelay request interval is just adjusted locally. The new values to use
> for
> +sync message intervals and pdelay request intervals can be indicated by
> +operLogSyncInterval and operLogPdelayReqInterval respectively. This mechanism
> +is currently only supported when BMCA == 'noop'. The default
> +value of offset_threshold is 0 (disabled).
>
> .SH UNICAST DISCOVERY OPTIONS
>
> diff --git a/servo.c b/servo.c
> index 8be4b92875de..483ad31487f1 100644
> --- a/servo.c
> +++ b/servo.c
> @@ -17,6 +17,7 @@
> * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> */
> #include <string.h>
> +#include <stdlib.h>
>
> #include "config.h"
> #include "linreg.h"
> @@ -79,6 +80,8 @@ struct servo *servo_create(struct config *cfg, enum
> servo_type type,
> }
>
> servo->first_update = 1;
> + servo->offset_threshold = config_get_int(cfg, NULL,
> "servo_offset_threshold");
> + servo->num_offset_values = config_get_int(cfg, NULL,
> "servo_num_offset_values");
>
> return servo;
> }
> @@ -88,6 +91,19 @@ void servo_destroy(struct servo *servo)
> servo->destroy(servo);
> }
>
> +static int check_offset_threshold(struct servo *s, int64_t offset)
> +{
> + uint64_t abs_offset = abs(offset);
abs() returns an int...
> + if (s->offset_threshold) {
> + if (abs_offset < INT64_MAX && abs_offset < s->offset_threshold
^^^^^^^^^^^^^^^^^^^^^^
... so this test is always true
> + && s->curr_offset_values)
> + s->curr_offset_values--;
> + return s->curr_offset_values ? 0 : 1;
> + }
> + return 0;
> +}
> +
> double servo_sample(struct servo *servo,
> int64_t offset,
> uint64_t local_ts,
Thanks,
Richard
_______________________________________________
Linuxptp-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel