Commit dc5a6c4e authored by Alessandro Rubini's avatar Alessandro Rubini

servo: rename some functions (no technical effect)

The servo implementation we brought forward from ptpd was strange
and difficult to understand. This commit is the first step in trying
to make some order, but it doesn't actually change anything but names.

The entry points for the servo are now called pp_servo_init(),
pp_servo_got_sync() and pp_servo_got_resp().  A two-step protocol
calls got_sync after getting the follow-up message.

Also, the hook for response messages is called handle_resp with a
name similar to the hooks for sync and follow-up.

The servo itself is not changed, but I reordered the functions so
the calculations appear in the real order in which they happen.
Signed-off-by: Alessandro Rubini's avatarAlessandro Rubini <rubini@gnudd.com>
parent cdfb8d94
...@@ -117,7 +117,7 @@ struct pp_ext_hooks { ...@@ -117,7 +117,7 @@ struct pp_ext_hooks {
int (*master_msg)(struct pp_instance *ppi, unsigned char *pkt, int (*master_msg)(struct pp_instance *ppi, unsigned char *pkt,
int plen, int msgtype); int plen, int msgtype);
int (*new_slave)(struct pp_instance *ppi, unsigned char *pkt, int plen); int (*new_slave)(struct pp_instance *ppi, unsigned char *pkt, int plen);
int (*update_delay)(struct pp_instance *ppi); int (*handle_resp)(struct pp_instance *ppi);
void (*s1)(struct pp_instance *ppi, MsgHeader *hdr, MsgAnnounce *ann); void (*s1)(struct pp_instance *ppi, MsgHeader *hdr, MsgAnnounce *ann);
int (*execute_slave)(struct pp_instance *ppi); int (*execute_slave)(struct pp_instance *ppi);
void (*handle_announce)(struct pp_instance *ppi); void (*handle_announce)(struct pp_instance *ppi);
...@@ -257,12 +257,9 @@ extern int pp_parse_cmdline(struct pp_globals *ppg, int argc, char **argv); ...@@ -257,12 +257,9 @@ extern int pp_parse_cmdline(struct pp_globals *ppg, int argc, char **argv);
extern int pp_parse_conf(struct pp_globals *ppg, char *conf, int len); extern int pp_parse_conf(struct pp_globals *ppg, char *conf, int len);
/* Servo */ /* Servo */
extern void pp_init_clock(struct pp_instance *ppi); extern void pp_servo_init(struct pp_instance *ppi);
extern void pp_update_delay(struct pp_instance *ppi, extern void pp_servo_got_sync(struct pp_instance *ppi); /* got t1 and t2 */
TimeInternal *correction_field); extern void pp_servo_got_resp(struct pp_instance *ppi); /* got all t1..t4 */
extern void pp_update_offset(struct pp_instance *ppi,
TimeInternal *correctionField);
extern void pp_update_clock(struct pp_instance *ppi);
/* bmc.c */ /* bmc.c */
......
...@@ -105,7 +105,7 @@ static int wr_new_slave(struct pp_instance *ppi, unsigned char *pkt, int plen) ...@@ -105,7 +105,7 @@ static int wr_new_slave(struct pp_instance *ppi, unsigned char *pkt, int plen)
return 0; return 0;
} }
static int wr_update_delay(struct pp_instance *ppi) static int wr_handle_resp(struct pp_instance *ppi)
{ {
MsgHeader *hdr = &ppi->received_ptp_header; MsgHeader *hdr = &ppi->received_ptp_header;
TimeInternal correction_field; TimeInternal correction_field;
...@@ -115,7 +115,7 @@ static int wr_update_delay(struct pp_instance *ppi) ...@@ -115,7 +115,7 @@ static int wr_update_delay(struct pp_instance *ppi)
/* If no WR mode is on, run normal code */ /* If no WR mode is on, run normal code */
if (!WR_DSPOR(ppi)->wrModeOn) { if (!WR_DSPOR(ppi)->wrModeOn) {
pp_update_delay(ppi, &correction_field); pp_servo_got_resp(ppi);
return 0; return 0;
} }
wr_servo_got_delay(ppi, hdr->correctionfield.lsb); wr_servo_got_delay(ppi, hdr->correctionfield.lsb);
...@@ -197,7 +197,7 @@ struct pp_ext_hooks pp_hooks = { ...@@ -197,7 +197,7 @@ struct pp_ext_hooks pp_hooks = {
.listening = wr_listening, .listening = wr_listening,
.master_msg = wr_master_msg, .master_msg = wr_master_msg,
.new_slave = wr_new_slave, .new_slave = wr_new_slave,
.update_delay = wr_update_delay, .handle_resp = wr_handle_resp,
.s1 = wr_s1, .s1 = wr_s1,
.execute_slave = wr_execute_slave, .execute_slave = wr_execute_slave,
.handle_announce = wr_handle_announce, .handle_announce = wr_handle_announce,
......
...@@ -151,8 +151,7 @@ int st_com_slave_handle_sync(struct pp_instance *ppi, unsigned char *buf, ...@@ -151,8 +151,7 @@ int st_com_slave_handle_sync(struct pp_instance *ppi, unsigned char *buf,
ppi->waiting_for_follow = FALSE; ppi->waiting_for_follow = FALSE;
to_TimeInternal(&ppi->t1, to_TimeInternal(&ppi->t1,
&sync.originTimestamp); &sync.originTimestamp);
pp_update_offset(ppi, &ppi->cField); pp_servo_got_sync(ppi);
pp_update_clock(ppi);
return 0; return 0;
} }
...@@ -198,8 +197,7 @@ int st_com_slave_handle_followup(struct pp_instance *ppi, unsigned char *buf, ...@@ -198,8 +197,7 @@ int st_com_slave_handle_followup(struct pp_instance *ppi, unsigned char *buf,
if (ret < 0) if (ret < 0)
return ret; return ret;
pp_update_offset(ppi, &ppi->cField); pp_servo_got_sync(ppi);
pp_update_clock(ppi);
return 0; return 0;
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#include <ppsi/ppsi.h> #include <ppsi/ppsi.h>
void pp_init_clock(struct pp_instance *ppi) void pp_servo_init(struct pp_instance *ppi)
{ {
pp_diag(ppi, servo, 1, "Initializing\n"); pp_diag(ppi, servo, 1, "Initializing\n");
...@@ -24,90 +24,12 @@ void pp_init_clock(struct pp_instance *ppi) ...@@ -24,90 +24,12 @@ void pp_init_clock(struct pp_instance *ppi)
ppi->t_ops->adjust(ppi, 0, 0); ppi->t_ops->adjust(ppi, 0, 0);
} }
/* called by slave states */
void pp_update_delay(struct pp_instance *ppi, TimeInternal *correction_field)
{
TimeInternal s_to_m_dly;
TimeInternal *mpd = &DSCUR(ppi)->meanPathDelay;
struct pp_owd_fltr *owd_fltr = &SRV(ppi)->owd_fltr;
int s;
/* calc 'slave to master' delay */
sub_TimeInternal(&s_to_m_dly, &ppi->t4, &ppi->t3);
if (OPTS(ppi)->max_dly) { /* If max_delay is 0 then it's OFF */
pp_diag(ppi, servo, 1, "%s aborted, delay "
"greater than 1 second\n", __func__);
if (s_to_m_dly.seconds)
return;
if (s_to_m_dly.nanoseconds > OPTS(ppi)->max_dly)
pp_diag(ppi, servo, 1, "%s aborted, delay %d greater "
"than administratively set maximum %d\n",
__func__,
(int)s_to_m_dly.nanoseconds,
(int)OPTS(ppi)->max_dly);
if (s_to_m_dly.nanoseconds > OPTS(ppi)->max_dly)
return;
}
if (!OPTS(ppi)->ofst_first_updated)
return;
/* calc 'slave to_master' delay (master to slave delay is
* already computed in pp_update_offset)
*/
sub_TimeInternal(&SRV(ppi)->delay_sm, &ppi->t4, &ppi->t3);
/* update 'one_way_delay' */
add_TimeInternal(mpd, &SRV(ppi)->delay_sm, &SRV(ppi)->delay_ms);
/* Subtract correction_field */
sub_TimeInternal(mpd, mpd, correction_field);
/* Compute one-way delay */
div2_TimeInternal(mpd);
if (mpd->seconds) {
/* cannot filter with secs, clear filter */
owd_fltr->s_exp = 0;
owd_fltr->nsec_prev = 0;
return;
}
/* avoid overflowing filter */
s = OPTS(ppi)->s;
while (abs(owd_fltr->y) >> (31 - s))
--s;
/* crank down filter cutoff by increasing 's_exp' */
if (owd_fltr->s_exp < 1)
owd_fltr->s_exp = 1;
else if (owd_fltr->s_exp < 1 << s)
++owd_fltr->s_exp;
else if (owd_fltr->s_exp > 1 << s)
owd_fltr->s_exp = 1 << s;
/* Use the average between current value and previous one */
mpd->nanoseconds = (mpd->nanoseconds + owd_fltr->nsec_prev) / 2;
owd_fltr->nsec_prev = mpd->nanoseconds;
/* filter 'meanPathDelay' (running average) */
owd_fltr->y = (owd_fltr->y * (owd_fltr->s_exp - 1) + mpd->nanoseconds)
/ owd_fltr->s_exp;
mpd->nanoseconds = owd_fltr->y;
pp_diag(ppi, servo, 1, "delay filter %d, %d\n",
(int)owd_fltr->y, (int)owd_fltr->s_exp);
}
/* /*
* Called by slave and uncalib. * Called by slave and uncalib. (pp_servo_got_sync, below in this file).
* Please note that it only uses t1 and t2, so I think it needs review - ARub * Please note that it only uses t1 and t2, so I think it needs review - ARub
*/ */
void pp_update_offset(struct pp_instance *ppi, TimeInternal *correction_field) static void pp_update_offset(struct pp_instance *ppi,
TimeInternal *correction_field)
{ {
TimeInternal m_to_s_dly; TimeInternal m_to_s_dly;
struct pp_ofm_fltr *ofm_fltr = &SRV(ppi)->ofm_fltr; struct pp_ofm_fltr *ofm_fltr = &SRV(ppi)->ofm_fltr;
...@@ -195,7 +117,7 @@ static void __pp_update_clock(struct pp_instance *ppi) ...@@ -195,7 +117,7 @@ static void __pp_update_clock(struct pp_instance *ppi)
sub_TimeInternal(&time_tmp, &time_tmp, sub_TimeInternal(&time_tmp, &time_tmp,
&DSCUR(ppi)->offsetFromMaster); &DSCUR(ppi)->offsetFromMaster);
ppi->t_ops->set(ppi, &time_tmp); ppi->t_ops->set(ppi, &time_tmp);
pp_init_clock(ppi); pp_servo_init(ppi);
} else { } else {
adj = DSCUR(ppi)->offsetFromMaster.nanoseconds adj = DSCUR(ppi)->offsetFromMaster.nanoseconds
> 0 ? PP_ADJ_FREQ_MAX:-PP_ADJ_FREQ_MAX; > 0 ? PP_ADJ_FREQ_MAX:-PP_ADJ_FREQ_MAX;
...@@ -245,7 +167,7 @@ static void format_TimeInternal(char *s, TimeInternal *t) ...@@ -245,7 +167,7 @@ static void format_TimeInternal(char *s, TimeInternal *t)
/* called only *exactly* after calling pp_update_offset above */ /* called only *exactly* after calling pp_update_offset above */
void pp_update_clock(struct pp_instance *ppi) static void pp_update_clock(struct pp_instance *ppi)
{ {
char s[24]; char s[24];
...@@ -260,3 +182,95 @@ void pp_update_clock(struct pp_instance *ppi) ...@@ -260,3 +182,95 @@ void pp_update_clock(struct pp_instance *ppi)
pp_diag(ppi, servo, 2, "Observed drift: %9i\n", pp_diag(ppi, servo, 2, "Observed drift: %9i\n",
(int)SRV(ppi)->obs_drift); (int)SRV(ppi)->obs_drift);
} }
void pp_servo_got_sync(struct pp_instance *ppi)
{
pp_update_offset(ppi, &ppi->cField);
pp_update_clock(ppi);
}
/* called by slave states when delay_resp is received (all t1..t4 are valid) */
static void pp_update_delay(struct pp_instance *ppi,
TimeInternal *correction_field)
{
TimeInternal s_to_m_dly;
TimeInternal *mpd = &DSCUR(ppi)->meanPathDelay;
struct pp_owd_fltr *owd_fltr = &SRV(ppi)->owd_fltr;
int s;
/* calc 'slave to master' delay */
sub_TimeInternal(&s_to_m_dly, &ppi->t4, &ppi->t3);
if (OPTS(ppi)->max_dly) { /* If max_delay is 0 then it's OFF */
pp_diag(ppi, servo, 1, "%s aborted, delay "
"greater than 1 second\n", __func__);
if (s_to_m_dly.seconds)
return;
if (s_to_m_dly.nanoseconds > OPTS(ppi)->max_dly)
pp_diag(ppi, servo, 1, "%s aborted, delay %d greater "
"than administratively set maximum %d\n",
__func__,
(int)s_to_m_dly.nanoseconds,
(int)OPTS(ppi)->max_dly);
if (s_to_m_dly.nanoseconds > OPTS(ppi)->max_dly)
return;
}
if (!OPTS(ppi)->ofst_first_updated)
return;
/* calc 'slave to_master' delay (master to slave delay is
* already computed in pp_update_offset)
*/
sub_TimeInternal(&SRV(ppi)->delay_sm, &ppi->t4, &ppi->t3);
/* update 'one_way_delay' */
add_TimeInternal(mpd, &SRV(ppi)->delay_sm, &SRV(ppi)->delay_ms);
/* Subtract correction_field */
sub_TimeInternal(mpd, mpd, correction_field);
/* Compute one-way delay */
div2_TimeInternal(mpd);
if (mpd->seconds) {
/* cannot filter with secs, clear filter */
owd_fltr->s_exp = 0;
owd_fltr->nsec_prev = 0;
return;
}
/* avoid overflowing filter */
s = OPTS(ppi)->s;
while (abs(owd_fltr->y) >> (31 - s))
--s;
/* crank down filter cutoff by increasing 's_exp' */
if (owd_fltr->s_exp < 1)
owd_fltr->s_exp = 1;
else if (owd_fltr->s_exp < 1 << s)
++owd_fltr->s_exp;
else if (owd_fltr->s_exp > 1 << s)
owd_fltr->s_exp = 1 << s;
/* Use the average between current value and previous one */
mpd->nanoseconds = (mpd->nanoseconds + owd_fltr->nsec_prev) / 2;
owd_fltr->nsec_prev = mpd->nanoseconds;
/* filter 'meanPathDelay' (running average) */
owd_fltr->y = (owd_fltr->y * (owd_fltr->s_exp - 1) + mpd->nanoseconds)
/ owd_fltr->s_exp;
mpd->nanoseconds = owd_fltr->y;
pp_diag(ppi, servo, 1, "delay filter %d, %d\n",
(int)owd_fltr->y, (int)owd_fltr->s_exp);
}
void pp_servo_got_resp(struct pp_instance *ppi)
{
pp_update_delay(ppi, &ppi->cField);
}
...@@ -57,7 +57,7 @@ int pp_initializing(struct pp_instance *ppi, unsigned char *pkt, int plen) ...@@ -57,7 +57,7 @@ int pp_initializing(struct pp_instance *ppi, unsigned char *pkt, int plen)
pp_diag(ppi, time, 1, "%s: can't init timers\n", __func__); pp_diag(ppi, time, 1, "%s: can't init timers\n", __func__);
goto failure; goto failure;
} }
pp_init_clock(ppi); pp_servo_init(ppi);
pp_diag(ppi, bmc, 1, "clock class = %d\n", pp_diag(ppi, bmc, 1, "clock class = %d\n",
DSDEF(ppi)->clockQuality.clockClass); DSDEF(ppi)->clockQuality.clockClass);
......
...@@ -17,7 +17,7 @@ int pp_slave(struct pp_instance *ppi, unsigned char *pkt, int plen) ...@@ -17,7 +17,7 @@ int pp_slave(struct pp_instance *ppi, unsigned char *pkt, int plen)
int d1, d2; int d1, d2;
if (ppi->is_new_state) { if (ppi->is_new_state) {
pp_init_clock(ppi); pp_servo_init(ppi);
if (pp_hooks.new_slave) if (pp_hooks.new_slave)
e = pp_hooks.new_slave(ppi, pkt, plen); e = pp_hooks.new_slave(ppi, pkt, plen);
...@@ -79,10 +79,10 @@ int pp_slave(struct pp_instance *ppi, unsigned char *pkt, int plen) ...@@ -79,10 +79,10 @@ int pp_slave(struct pp_instance *ppi, unsigned char *pkt, int plen)
* generating t4, and report back a modified t4 * generating t4, and report back a modified t4
*/ */
if (pp_hooks.update_delay) if (pp_hooks.handle_resp)
e = pp_hooks.update_delay(ppi); e = pp_hooks.handle_resp(ppi);
else else
pp_update_delay(ppi, &ppi->cField); pp_servo_got_resp(ppi);
if (e) if (e)
goto out; goto out;
...@@ -138,7 +138,7 @@ out: ...@@ -138,7 +138,7 @@ out:
pp_timeout_clr(ppi, PP_TO_ANN_RECEIPT); pp_timeout_clr(ppi, PP_TO_ANN_RECEIPT);
pp_timeout_clr(ppi, PP_TO_DELAYREQ); pp_timeout_clr(ppi, PP_TO_DELAYREQ);
pp_init_clock(ppi); pp_servo_init(ppi);
} }
d1 = d2 = pp_ms_to_timeout(ppi, PP_TO_ANN_RECEIPT); d1 = d2 = pp_ms_to_timeout(ppi, PP_TO_ANN_RECEIPT);
if (ppi->timeouts[PP_TO_DELAYREQ]) if (ppi->timeouts[PP_TO_DELAYREQ])
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment