]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
ntp: add version option to server/peer directive
authorMiroslav Lichvar <mlichvar@redhat.com>
Mon, 20 Oct 2014 14:12:39 +0000 (16:12 +0200)
committerMiroslav Lichvar <mlichvar@redhat.com>
Mon, 20 Oct 2014 14:14:17 +0000 (16:14 +0200)
chrony.texi.in
client.c
cmdparse.c
cmdparse.h
conf.c
ntp_core.c
srcparams.h

index fd2f487d00d12a01736faeda162bf4af0b929d54..7192ed358609bd4c2dd7214cfd127ea6cea2910e 100644 (file)
@@ -2900,6 +2900,11 @@ Target number of measurements to use for the regression algorithm which
 @code{minpoll} and @code{maxpoll}.  A higher target makes @code{chronyd} prefer
 shorter polling intervals.  The default is 6 and a useful range is 6 to 60.
 
+@item version
+This option sets the NTP version number used in packets sent to the server.
+This can be useful when the server runs an old NTP implementation that doesn't
+respond to newer versions.  The default version number is 4.
+
 @item prefer
 Prefer this source over sources without prefer option.
 
index d0df889f21cc99873c99a74a8915c16e47ce76ad..7c01435babb1435fa899bdcb12283e6424920c3a 100644 (file)
--- a/client.c
+++ b/client.c
@@ -955,6 +955,11 @@ process_cmd_add_server_or_peer(CMD_Request *msg, char *line)
         break;
       }
 
+      if (data.params.version != NTP_VERSION) {
+        fprintf(stderr, "Option version not supported\n");
+        break;
+      }
+
       msg->data.ntp_source.port = htonl((unsigned long) data.port);
       UTI_IPHostToNetwork(&ip_addr, &msg->data.ntp_source.ip_addr);
       msg->data.ntp_source.minpoll = htonl(data.params.minpoll);
@@ -1008,6 +1013,9 @@ process_cmd_add_server_or_peer(CMD_Request *msg, char *line)
     case CPS_BadPolltarget:
       fprintf(stderr, "Unreadable polltarget value\n");
       break;
+    case CPS_BadVersion:
+      fprintf(stderr, "Unreadable version value\n");
+      break;
   }
 
   return result;
index cca94a366abaacff479510c972be23639553f26d..5e589ef7736c48b0a2ec972dffdcc96b2375d938 100644 (file)
@@ -34,6 +34,7 @@
 #include "cmdparse.h"
 #include "memory.h"
 #include "nameserv.h"
+#include "ntp.h"
 #include "util.h"
 
 /* ================================================== */
@@ -58,6 +59,7 @@ CPS_ParseNTPSourceAdd(char *line, CPS_NTP_Source *src)
   src->params.iburst = 0;
   src->params.min_stratum = SRC_DEFAULT_MINSTRATUM;
   src->params.poll_target = SRC_DEFAULT_POLLTARGET;
+  src->params.version = NTP_VERSION;
   src->params.sel_option = SRC_SelectNormal;
 
   result = CPS_Success;
@@ -165,6 +167,14 @@ CPS_ParseNTPSourceAdd(char *line, CPS_NTP_Source *src)
         } else if (!strcasecmp(cmd, "prefer")) {
           src->params.sel_option = SRC_SelectPrefer;
         
+        } else if (!strcasecmp(cmd, "version")) {
+          if (sscanf(line, "%d%n", &src->params.version, &n) != 1) {
+            result = CPS_BadVersion;
+            done = 1;
+          } else {
+            line += n;
+          }
+
         } else {
           result = CPS_BadOption;
           done = 1;
index 6807f72fa46af9e5731c8dab859a6ae1b9ee5119..df8484a4cdcfeb0058ff363afac669c179d11e34 100644 (file)
@@ -43,7 +43,8 @@ typedef enum {
   CPS_BadMaxdelay,
   CPS_BadKey,
   CPS_BadMinstratum,
-  CPS_BadPolltarget
+  CPS_BadPolltarget,
+  CPS_BadVersion
 } CPS_Status;
 
 typedef struct {
diff --git a/conf.c b/conf.c
index cdd88945d574a5d2d06d62587e53fd8d99d9abee..26a15beb405339895740313d17fd950807342405 100644 (file)
--- a/conf.c
+++ b/conf.c
@@ -604,6 +604,9 @@ parse_source(char *line, NTP_Source_Type type)
     case CPS_BadPolltarget:
       other_parse_error("Unreadable polltarget");
       break;
+    case CPS_BadVersion:
+      other_parse_error("Unreadable version");
+      break;
   }
 }
 
index 214ea72f585e50b7f1fb7572cc38829265348a91..cdc32dfc6e80f3751b970126d5c0584065d27c2c 100644 (file)
@@ -105,6 +105,8 @@ struct NCR_Instance_Record {
 
   int poll_target;              /* Target number of sourcestats samples */
 
+  int version;                  /* Version set in packets for server/peer */
+
   double poll_score;            /* Score of current local poll */
 
   double max_delay;             /* Maximum round-trip delay to the
@@ -440,6 +442,12 @@ NCR_GetInstance(NTP_Remote_Address *remote_addr, NTP_Source_Type type, SourcePar
   result->auto_offline = params->auto_offline;
   result->poll_target = params->poll_target;
 
+  result->version = params->version;
+  if (result->version < NTP_MIN_COMPAT_VERSION)
+    result->version = NTP_MIN_COMPAT_VERSION;
+  else if (result->version > NTP_VERSION)
+    result->version = NTP_VERSION;
+
   if (params->authkey == INACTIVE_AUTHKEY) {
     result->do_auth = 0;
     result->auth_key_id = 0;
@@ -864,7 +872,7 @@ transmit_timeout(void *arg)
     
     /* Send a client packet, don't store the local tx values
        as the reply will be ignored */
-    transmit_packet(MODE_CLIENT, inst->local_poll, NTP_VERSION, 0, 0,
+    transmit_packet(MODE_CLIENT, inst->local_poll, inst->version, 0, 0,
                     &inst->remote_orig, &inst->local_rx, NULL, NULL,
                     &inst->remote_addr, &inst->local_addr);
 
@@ -879,7 +887,7 @@ transmit_timeout(void *arg)
   inst->presend_done = 0; /* Reset for next time */
 
   sent = transmit_packet(inst->mode, inst->local_poll,
-                         NTP_VERSION,
+                         inst->version,
                          inst->do_auth, inst->auth_key_id,
                          &inst->remote_orig,
                          &inst->local_rx, &inst->local_tx, &inst->local_ntp_tx,
index d37f6c1a34634631d2bb9f2449224df1c73960a9..5fd7517896b0902fc2ade9b37278a3b146c540ab 100644 (file)
@@ -38,6 +38,7 @@ typedef struct {
   int iburst;
   int min_stratum;
   int poll_target;
+  int version;
   uint32_t authkey;
   double max_delay;
   double max_delay_ratio;