[Nagiosplug-checkins] SF.net SVN: nagiosplug: [1824] nagiosplug/branches/dermoth_ntp_rework/ plugins/check_ntpd.c
dermoth at users.sourceforge.net
dermoth at users.sourceforge.net
Sat Nov 10 22:22:58 CET 2007
Revision: 1824
http://nagiosplug.svn.sourceforge.net/nagiosplug/?rev=1824&view=rev
Author: dermoth
Date: 2007-11-10 13:22:58 -0800 (Sat, 10 Nov 2007)
Log Message:
-----------
More cleanups, some fixes
Modified Paths:
--------------
nagiosplug/branches/dermoth_ntp_rework/plugins/check_ntpd.c
Modified: nagiosplug/branches/dermoth_ntp_rework/plugins/check_ntpd.c
===================================================================
--- nagiosplug/branches/dermoth_ntp_rework/plugins/check_ntpd.c 2007-11-10 17:42:44 UTC (rev 1823)
+++ nagiosplug/branches/dermoth_ntp_rework/plugins/check_ntpd.c 2007-11-10 21:22:58 UTC (rev 1824)
@@ -68,21 +68,6 @@
/* max size of control message data */
#define MAX_CM_SIZE 468
-/* this structure holds everything in an ntp request/response as per rfc1305 */
-typedef struct {
- uint8_t flags; /* byte with leapindicator,vers,mode. see macros */
- uint8_t stratum; /* clock stratum */
- int8_t poll; /* polling interval */
- int8_t precision; /* precision of the local clock */
- int32_t rtdelay; /* total rt delay, as a fixed point num. see macros */
- uint32_t rtdisp; /* like above, but for max err to primary src */
- uint32_t refid; /* ref clock identifier */
- uint64_t refts; /* reference timestamp. local time local clock */
- uint64_t origts; /* time at which request departed client */
- uint64_t rxts; /* time at which request arrived at server */
- uint64_t txts; /* time at which request departed server */
-} ntp_message;
-
/* this structure holds everything in an ntp control message as per rfc1305 */
typedef struct {
uint8_t flags; /* byte with leapindicator,vers,mode. see macros */
@@ -138,57 +123,6 @@
#define PEER_INCLUDED 0x04
#define PEER_SYNCSOURCE 0x06
-/**
- ** a note about the 32-bit "fixed point" numbers:
- **
- they are divided into halves, each being a 16-bit int in network byte order:
- - the first 16 bits are an int on the left side of a decimal point.
- - the second 16 bits represent a fraction n/(2^16)
- likewise for the 64-bit "fixed point" numbers with everything doubled :)
- **/
-
-/* macros to access the left/right 16 bits of a 32-bit ntp "fixed point"
- number. note that these can be used as lvalues too */
-#define L16(x) (((uint16_t*)&x)[0])
-#define R16(x) (((uint16_t*)&x)[1])
-/* macros to access the left/right 32 bits of a 64-bit ntp "fixed point"
- number. these too can be used as lvalues */
-#define L32(x) (((uint32_t*)&x)[0])
-#define R32(x) (((uint32_t*)&x)[1])
-
-/* ntp wants seconds since 1/1/00, epoch is 1/1/70. this is the difference */
-#define EPOCHDIFF 0x83aa7e80UL
-
-/* extract a 32-bit ntp fixed point number into a double */
-#define NTP32asDOUBLE(x) (ntohs(L16(x)) + (double)ntohs(R16(x))/65536.0)
-
-/* likewise for a 64-bit ntp fp number */
-#define NTP64asDOUBLE(n) (double)(((uint64_t)n)?\
- (ntohl(L32(n))-EPOCHDIFF) + \
- (.00000001*(0.5+(double)(ntohl(R32(n))/42.94967296))):\
- 0)
-
-/* convert a struct timeval to a double */
-#define TVasDOUBLE(x) (double)(x.tv_sec+(0.000001*x.tv_usec))
-
-/* convert an ntp 64-bit fp number to a struct timeval */
-#define NTP64toTV(n,t) \
- do{ if(!n) t.tv_sec = t.tv_usec = 0; \
- else { \
- t.tv_sec=ntohl(L32(n))-EPOCHDIFF; \
- t.tv_usec=(int)(0.5+(double)(ntohl(R32(n))/4294.967296)); \
- } \
- }while(0)
-
-/* convert a struct timeval to an ntp 64-bit fp number */
-#define TVtoNTP64(t,n) \
- do{ if(!t.tv_usec && !t.tv_sec) n=0x0UL; \
- else { \
- L32(n)=htonl(t.tv_sec + EPOCHDIFF); \
- R32(n)=htonl((uint64_t)((4294.967296*t.tv_usec)+.5)); \
- } \
- } while(0)
-
/* NTP control message header is 12 bytes, plus any data in the data
* field, plus null padding to the nearest 32-bit boundary per rfc.
*/
@@ -201,16 +135,6 @@
printf("%u.%u.%u.%u", (x>>24)&0xff, (x>>16)&0xff, (x>>8)&0xff, x&0xff);\
}while(0);
-/* calculate the offset of the local clock */
-static inline double calc_offset(const ntp_message *m, const struct timeval *t){
- double client_tx, peer_rx, peer_tx, client_rx;
- client_tx = NTP64asDOUBLE(m->origts);
- peer_rx = NTP64asDOUBLE(m->rxts);
- peer_tx = NTP64asDOUBLE(m->txts);
- client_rx=TVasDOUBLE((*t));
- return (.5*((peer_tx-client_rx)+(peer_rx-client_tx)));
-}
-
void print_ntp_control_message(const ntp_control_message *p){
int i=0, numpeers=0;
const ntp_assoc_status_pair *peer=NULL;
@@ -246,8 +170,8 @@
}
}
}
-char *
-extract_value(const char *varlist, const char *name){
+
+char *extract_value(const char *varlist, const char *name){
char *tmpvarlist=NULL, *tmpkey=NULL, *value=NULL;
int last=0;
@@ -291,7 +215,8 @@
*jitter = *stratum = -1;
/* Long-winded explanation:
- * Getting the offset, jitter and stratum requires a number of steps:
+ * Getting the sync peer offset, jitter and stratum requires a number of
+ * steps:
* 1) Send a READSTAT request.
* 2) Interpret the READSTAT reply
* a) The data section contains a list of peer identifiers (16 bits)
@@ -378,10 +303,11 @@
if(req.op&REM_ERROR && strstr(getvar, "jitter")) {
if(verbose) printf("The 'jitter' command failed (old ntp server?)\nRestarting with 'dispersion'...\n");
getvar = "stratum,offset,dispersion";
+ i--;
continue;
}
- if(verbose)
+ if(verbose > 1)
printf("Server responded: >>>%s<<<\n", req.data);
/* get the offset */
@@ -389,7 +315,6 @@
printf("parsing offset from peer %.2x: ", ntohs(peers[i].assoc));
value = extract_value(req.data, "offset");
- //value = extract_value(req.data, "jitter=");
if(value != NULL)
*offset = strtod(value, &nptr) / 1000;
if(value == NULL || value==nptr){
@@ -406,8 +331,7 @@
if(verbose) {
printf("parsing jitter from peer %.2x: ", ntohs(peers[i].assoc));
}
- //*value = extract_value(req.data, strstr(getvar, "dispersion") ? "dispersion=" : "jitter=");
- value = extract_value(req.data, "jitter");
+ value = extract_value(req.data, strstr(getvar, "dispersion") != NULL ? "dispersion" : "jitter");
if(value != NULL)
*jitter = strtod(value, &nptr);
if(value == NULL || value==nptr){
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list