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 {
int (*master_msg)(struct pp_instance *ppi, unsigned char *pkt,
int plen, int msgtype);
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);
int (*execute_slave)(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);
extern int pp_parse_conf(struct pp_globals *ppg, char *conf, int len);
/* Servo */
extern void pp_init_clock(struct pp_instance *ppi);
extern void pp_update_delay(struct pp_instance *ppi,
TimeInternal *correction_field);
extern void pp_update_offset(struct pp_instance *ppi,
TimeInternal *correctionField);
extern void pp_update_clock(struct pp_instance *ppi);
extern void pp_servo_init(struct pp_instance *ppi);
extern void pp_servo_got_sync(struct pp_instance *ppi); /* got t1 and t2 */
extern void pp_servo_got_resp(struct pp_instance *ppi); /* got all t1..t4 */
/* bmc.c */
......
......@@ -105,7 +105,7 @@ static int wr_new_slave(struct pp_instance *ppi, unsigned char *pkt, int plen)
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;
TimeInternal correction_field;
......@@ -115,7 +115,7 @@ static int wr_update_delay(struct pp_instance *ppi)
/* If no WR mode is on, run normal code */
if (!WR_DSPOR(ppi)->wrModeOn) {
pp_update_delay(ppi, &correction_field);
pp_servo_got_resp(ppi);
return 0;
}
wr_servo_got_delay(ppi, hdr->correctionfield.lsb);
......@@ -197,7 +197,7 @@ struct pp_ext_hooks pp_hooks = {
.listening = wr_listening,
.master_msg = wr_master_msg,
.new_slave = wr_new_slave,
.update_delay = wr_update_delay,
.handle_resp = wr_handle_resp,
.s1 = wr_s1,
.execute_slave = wr_execute_slave,
.handle_announce = wr_handle_announce,
......
......@@ -151,8 +151,7 @@ int st_com_slave_handle_sync(struct pp_instance *ppi, unsigned char *buf,
ppi->waiting_for_follow = FALSE;
to_TimeInternal(&ppi->t1,
&sync.originTimestamp);
pp_update_offset(ppi, &ppi->cField);
pp_update_clock(ppi);
pp_servo_got_sync(ppi);
return 0;
}
......@@ -198,8 +197,7 @@ int st_com_slave_handle_followup(struct pp_instance *ppi, unsigned char *buf,
if (ret < 0)
return ret;
pp_update_offset(ppi, &ppi->cField);
pp_update_clock(ppi);
pp_servo_got_sync(ppi);
return 0;
}
......
......@@ -8,7 +8,7 @@
#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");
......@@ -24,90 +24,12 @@ void pp_init_clock(struct pp_instance *ppi)
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
*/
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;
struct pp_ofm_fltr *ofm_fltr = &SRV(ppi)->ofm_fltr;
......@@ -195,7 +117,7 @@ static void __pp_update_clock(struct pp_instance *ppi)
sub_TimeInternal(&time_tmp, &time_tmp,
&DSCUR(ppi)->offsetFromMaster);
ppi->t_ops->set(ppi, &time_tmp);
pp_init_clock(ppi);
pp_servo_init(ppi);
} else {
adj = DSCUR(ppi)->offsetFromMaster.nanoseconds
> 0 ? PP_ADJ_FREQ_MAX:-PP_ADJ_FREQ_MAX;
......@@ -245,7 +167,7 @@ static void format_TimeInternal(char *s, TimeInternal *t)
/* 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];
......@@ -260,3 +182,95 @@ void pp_update_clock(struct pp_instance *ppi)
pp_diag(ppi, servo, 2, "Observed drift: %9i\n",
(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)
pp_diag(ppi, time, 1, "%s: can't init timers\n", __func__);
goto failure;
}
pp_init_clock(ppi);
pp_servo_init(ppi);
pp_diag(ppi, bmc, 1, "clock class = %d\n",
DSDEF(ppi)->clockQuality.clockClass);
......
......@@ -17,7 +17,7 @@ int pp_slave(struct pp_instance *ppi, unsigned char *pkt, int plen)
int d1, d2;
if (ppi->is_new_state) {
pp_init_clock(ppi);
pp_servo_init(ppi);
if (pp_hooks.new_slave)
e = pp_hooks.new_slave(ppi, pkt, 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
*/
if (pp_hooks.update_delay)
e = pp_hooks.update_delay(ppi);
if (pp_hooks.handle_resp)
e = pp_hooks.handle_resp(ppi);
else
pp_update_delay(ppi, &ppi->cField);
pp_servo_got_resp(ppi);
if (e)
goto out;
......@@ -138,7 +138,7 @@ out:
pp_timeout_clr(ppi, PP_TO_ANN_RECEIPT);
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);
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