diff --git a/client.c b/client.c index 8cccc75..fcc627b 100644 --- a/client.c +++ b/client.c @@ -909,6 +909,11 @@ process_cmd_add_server_or_peer(CMD_Request *msg, char *line) break; } + if (data.params.min_stratum) { + fprintf(stderr, "Option minstratum not supported\n"); + break; + } + msg->data.ntp_source.port = htonl((unsigned long) data.port); UTI_IPHostToNetwork(&data.ip_addr, &msg->data.ntp_source.ip_addr); msg->data.ntp_source.minpoll = htonl(data.params.minpoll); @@ -951,6 +956,9 @@ process_cmd_add_server_or_peer(CMD_Request *msg, char *line) case CPS_BadKey: fprintf(stderr, "Unreadable key value\n"); break; + case CPS_BadMinstratum: + fprintf(stderr, "Unreadable minstratum value\n"); + break; } return result; diff --git a/cmdmon.c b/cmdmon.c index b28d438..c39317e 100644 --- a/cmdmon.c +++ b/cmdmon.c @@ -1227,6 +1227,7 @@ handle_add_server(CMD_Request *rx_message, CMD_Reply *tx_message) params.iburst = ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_IBURST ? 1 : 0; params.max_delay = UTI_FloatNetworkToHost(rx_message->data.ntp_source.max_delay); params.max_delay_ratio = UTI_FloatNetworkToHost(rx_message->data.ntp_source.max_delay_ratio); + params.min_stratum = 0; /* not transmitted in cmdmon protocol yet */ status = NSR_AddSource(&rem_addr, NTP_SERVER, ¶ms); switch (status) { case NSR_Success: @@ -1268,6 +1269,7 @@ handle_add_peer(CMD_Request *rx_message, CMD_Reply *tx_message) params.iburst = ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_IBURST ? 1 : 0; params.max_delay = UTI_FloatNetworkToHost(rx_message->data.ntp_source.max_delay); params.max_delay_ratio = UTI_FloatNetworkToHost(rx_message->data.ntp_source.max_delay_ratio); + params.min_stratum = 0; /* not transmitted in cmdmon protocol yet */ status = NSR_AddSource(&rem_addr, NTP_PEER, ¶ms); switch (status) { case NSR_Success: diff --git a/cmdparse.c b/cmdparse.c index 5dad262..9f514c1 100644 --- a/cmdparse.c +++ b/cmdparse.c @@ -59,6 +59,7 @@ CPS_ParseNTPSourceAdd(const char *line, CPS_NTP_Source *src) src->params.online = 1; src->params.auto_offline = 0; src->params.iburst = 0; + src->params.min_stratum = 0; result = CPS_Success; @@ -153,6 +154,15 @@ CPS_ParseNTPSourceAdd(const char *line, CPS_NTP_Source *src) } else if (!strncasecmp(cmd, "iburst", 6)) { src->params.iburst = 1; + + } else if (!strncasecmp(cmd, "minstratum", 10)) { + if (sscanf(line, "%d%n", &src->params.min_stratum, &n) != 1) { + result = CPS_BadMinstratum; + ok = 0; + done = 1; + } else { + line += n; + } } else { result = CPS_BadOption; diff --git a/cmdparse.h b/cmdparse.h index 7523d8e..9f4d4ae 100644 --- a/cmdparse.h +++ b/cmdparse.h @@ -44,7 +44,8 @@ typedef enum { CPS_BadPresend, CPS_BadMaxdelayratio, CPS_BadMaxdelay, - CPS_BadKey + CPS_BadKey, + CPS_BadMinstratum } CPS_Status; typedef struct { diff --git a/conf.c b/conf.c index d1dd2ed..f1c4914 100644 --- a/conf.c +++ b/conf.c @@ -394,6 +394,9 @@ parse_source(const char *line, NTP_Source_Type type) case CPS_BadKey: LOG(LOGS_WARN, LOGF_Configure, "Unreadable key value at line %d", line_number); break; + case CPS_BadMinstratum: + LOG(LOGS_WARN, LOGF_Configure, "Unreadable minstratum value at line %d", line_number); + break; } return; diff --git a/ntp_core.c b/ntp_core.c index 952308c..e06ea41 100644 --- a/ntp_core.c +++ b/ntp_core.c @@ -107,6 +107,9 @@ struct NCR_Instance_Record { int minpoll; /* Log2 of minimum defined polling interval */ int maxpoll; /* Log2 of maximum defined polling interval */ + int min_stratum; /* Increase stratum in received packets to the + minimum */ + double max_delay; /* Maximum round-trip delay to the peer that we can tolerate and still use the sample for generating @@ -268,6 +271,7 @@ NCR_GetInstance(NTP_Remote_Address *remote_addr, NTP_Source_Type type, SourcePar result->minpoll = params->minpoll; result->maxpoll = params->maxpoll; + result->min_stratum = params->min_stratum; result->presend_minpoll = params->presend_minpoll; result->presend_done = 0; @@ -981,6 +985,11 @@ receive_packet(NTP_Packet *message, struct timeval *now, double now_err, NCR_Ins message->stratum = NTP_MAX_STRATUM + 1; } + /* Increase stratum to the configured minimum */ + if (message->stratum < inst->min_stratum) { + message->stratum = inst->min_stratum; + } + /* Test 7 checks that the stratum in the packet is appropriate */ if ((message->stratum > REF_GetOurStratum()) || (message->stratum > NTP_MAX_STRATUM)) { diff --git a/srcparams.h b/srcparams.h index c4bccf0..1fb93e7 100644 --- a/srcparams.h +++ b/srcparams.h @@ -38,6 +38,7 @@ typedef struct { int auto_offline; int presend_minpoll; int iburst; + int min_stratum; unsigned long authkey; double max_delay; double max_delay_ratio;