]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
Add minstratum option
authorBenny Lyne Amorsen <benny@amorsen.dk>
Tue, 24 Aug 2010 16:37:38 +0000 (18:37 +0200)
committerMiroslav Lichvar <mlichvar@redhat.com>
Wed, 25 Aug 2010 10:46:14 +0000 (12:46 +0200)
Stratum in received packets is raised to the configured minimum.

client.c
cmdmon.c
cmdparse.c
cmdparse.h
conf.c
ntp_core.c
srcparams.h

index 8cccc75301531e8be58acc90a39863cc27b53286..fcc627b25a80d279e1ab51d658474d25521d8848 100644 (file)
--- 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;
index b28d438d524c4c1adeeb09497d1665abfb3daa74..c39317e14e0b8749862f4ef1646ed7d9ba12f14f 100644 (file)
--- 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, &params);
   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, &params);
   switch (status) {
     case NSR_Success:
index 5dad262faa83e462d84df3e10b32e16ceaad32aa..9f514c1cb742f19bab42b34b614b2b431b6b1b2b 100644 (file)
@@ -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;
index 7523d8e43e9c396b9310343c92372304219002d4..9f4d4ae5d790dade3d0ab1b1732f8703d4d50bb3 100644 (file)
@@ -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 d1dd2edff207ba2415b7b8a11134b464ee431983..f1c4914e404f0c18b2f8ebe0704206a750c95c4c 100644 (file)
--- 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;
index 952308c9c2b80fa51e83443cd7053cf5b4b50ae9..e06ea41ef23ae435d2a0ff366a42d3dd1a7132e2 100644 (file)
@@ -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)) {
index c4bccf05cf1d47bda553ba55fd7f14e3046b85f1..1fb93e7297d77e021f76b0ed68e7b2530c9e6207 100644 (file)
@@ -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;