ntp: process presend responses

Rework the code to make a real request for presend and process the
response, but don't accumulate the sample. This allows presend to work
in the interleaved client mode.
This commit is contained in:
Miroslav Lichvar 2016-11-23 15:43:07 +01:00
parent d75f6830f1
commit 2408bbcd77
2 changed files with 15 additions and 26 deletions

View file

@ -203,8 +203,7 @@ when the polling interval is 512 seconds or more, an extra NTP client packet
will be sent to the server a short time (4 seconds) before making the actual will be sent to the server a short time (4 seconds) before making the actual
measurement. measurement.
+ +
The *presend* option cannot be used in the *peer* directive or with the The *presend* option cannot be used in the *peer* directive.
*xleave* option.
*minstratum* _stratum_::: *minstratum* _stratum_:::
When the synchronisation source is selected from available sources, sources When the synchronisation source is selected from available sources, sources
with lower stratum are normally slightly preferred. This option can be used to with lower stratum are normally slightly preferred. This option can be used to

View file

@ -506,10 +506,9 @@ NCR_GetInstance(NTP_Remote_Address *remote_addr, NTP_Source_Type type, SourcePar
if (result->min_stratum >= NTP_MAX_STRATUM) if (result->min_stratum >= NTP_MAX_STRATUM)
result->min_stratum = NTP_MAX_STRATUM - 1; result->min_stratum = NTP_MAX_STRATUM - 1;
/* Presend doesn't work in symmetric and interleaved modes */ /* Presend doesn't work in symmetric mode */
result->presend_minpoll = params->presend_minpoll; result->presend_minpoll = params->presend_minpoll;
if (result->presend_minpoll && if (result->presend_minpoll && result->mode != MODE_CLIENT)
(result->mode != MODE_CLIENT || result->interleaved))
result->presend_minpoll = 0; result->presend_minpoll = 0;
result->max_delay = params->max_delay; result->max_delay = params->max_delay;
@ -752,6 +751,8 @@ get_transmit_delay(NCR_Instance inst, int on_tx, double last_tx)
poll_to_use = inst->local_poll; poll_to_use = inst->local_poll;
delay_time = (double) (1UL<<poll_to_use); delay_time = (double) (1UL<<poll_to_use);
if (inst->presend_done)
delay_time = WARM_UP_DELAY;
break; break;
@ -1055,23 +1056,12 @@ transmit_timeout(void *arg)
if ((inst->presend_minpoll > 0) && if ((inst->presend_minpoll > 0) &&
(inst->presend_minpoll <= inst->local_poll) && (inst->presend_minpoll <= inst->local_poll) &&
!inst->presend_done) { !inst->presend_done) {
/* Send a client packet, don't store the local tx values
as the reply will be ignored */
transmit_packet(MODE_CLIENT, 0, inst->local_poll, inst->version, AUTH_NONE, 0,
&inst->remote_ntp_rx, &inst->remote_ntp_tx, &inst->local_rx, NULL,
NULL, NULL, &inst->remote_addr, &local_addr);
inst->presend_done = 1; inst->presend_done = 1;
} else {
/* Requeue timeout */ /* Reset for next time */
restart_timeout(inst, WARM_UP_DELAY); inst->presend_done = 0;
return;
} }
inst->presend_done = 0; /* Reset for next time */
sent = transmit_packet(inst->mode, inst->interleaved, inst->local_poll, sent = transmit_packet(inst->mode, inst->interleaved, inst->local_poll,
inst->version, inst->version,
inst->auth_mode, inst->auth_key_id, inst->auth_mode, inst->auth_key_id,
@ -1475,11 +1465,15 @@ receive_packet(NCR_Instance inst, NTP_Local_Address *local_addr,
/* Accept at most one response per request. The NTP specification recommends /* Accept at most one response per request. The NTP specification recommends
resetting local_ntp_tx to make the following packets fail test2 or test3, resetting local_ntp_tx to make the following packets fail test2 or test3,
but that would not allow the code above to make multiple updates of the but that would not allow the code above to make multiple updates of the
timestamps in symmetric mode. */ timestamps in symmetric mode. Also, ignore presend responses. */
if (inst->valid_rx) { if (inst->valid_rx) {
test2 = test3 = 0; test2 = test3 = 0;
valid_packet = synced_packet = good_packet = 0; valid_packet = synced_packet = good_packet = 0;
} else if (valid_packet) { } else if (valid_packet) {
if (inst->presend_done) {
testA = 0;
good_packet = 0;
}
inst->valid_rx = 1; inst->valid_rx = 1;
} }
@ -1494,9 +1488,9 @@ receive_packet(NCR_Instance inst, NTP_Local_Address *local_addr,
UTI_Ntp64ToString(&message->transmit_ts)); UTI_Ntp64ToString(&message->transmit_ts));
DEBUG_LOG(LOGF_NtpCore, "offset=%.9f delay=%.9f dispersion=%f root_delay=%f root_dispersion=%f", DEBUG_LOG(LOGF_NtpCore, "offset=%.9f delay=%.9f dispersion=%f root_delay=%f root_dispersion=%f",
offset, delay, dispersion, root_delay, root_dispersion); offset, delay, dispersion, root_delay, root_dispersion);
DEBUG_LOG(LOGF_NtpCore, "test123=%d%d%d test567=%d%d%d testABCD=%d%d%d%d kod_rate=%d interleaved=%d valid=%d good=%d updated=%d", DEBUG_LOG(LOGF_NtpCore, "test123=%d%d%d test567=%d%d%d testABCD=%d%d%d%d kod_rate=%d interleaved=%d presend=%d valid=%d good=%d updated=%d",
test1, test2, test3, test5, test6, test7, testA, testB, testC, testD, test1, test2, test3, test5, test6, test7, testA, testB, testC, testD,
kod_rate, interleaved_packet, valid_packet, good_packet, kod_rate, interleaved_packet, inst->presend_done, valid_packet, good_packet,
!UTI_CompareTimespecs(&inst->local_rx.ts, &rx_ts->ts)); !UTI_CompareTimespecs(&inst->local_rx.ts, &rx_ts->ts));
if (valid_packet) { if (valid_packet) {
@ -1698,10 +1692,6 @@ NCR_ProcessRxKnown(NCR_Instance inst, NTP_Local_Address *local_addr,
break; break;
case MODE_SERVER: case MODE_SERVER:
/* Ignore presend reply */
if (inst->presend_done)
break;
switch (inst->mode) { switch (inst->mode) {
case MODE_CLIENT: case MODE_CLIENT:
/* Standard case where he's a server and we're the client */ /* Standard case where he's a server and we're the client */