]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
Changes from Dave Mills - "monitor" stuff, mostly.
authorHarlan Stenn <stenn@ntp.org>
Tue, 7 Oct 2003 08:44:07 +0000 (04:44 -0400)
committerHarlan Stenn <stenn@ntp.org>
Tue, 7 Oct 2003 08:44:07 +0000 (04:44 -0400)
bk: 3f827cd7F9l8eORYamGOzT-8PqOUlA

include/ntp.h
include/ntp_config.h
include/ntpd.h
ntpd/ntp_config.c
ntpd/ntp_monitor.c
ntpd/ntp_request.c
ntpdc/ntpdc_ops.c

index eca3f1981f67df2bca68666156599485b5966fa3..1ce302b7be98380f30f73069dd50b706f1432b28 100644 (file)
@@ -751,8 +751,7 @@ struct mon_data {
        struct mon_data *mru_prev;      /* previous structure in MRU list */
        u_long drop_count;              /* dropped due RESLIMIT*/
        double avg_interval;            /* average interpacket interval */
-       u_long lasttime;                /* last packet received time */
-       u_long firsttime;               /* first packet received time */
+       u_long lasttime;                /* interval since last packet */
        u_long count;                   /* total packet count */
        struct sockaddr_storage rmtadr; /* address of remote host */
        struct interface *interface;    /* interface on which this arrived */
index de6f0c2b044d9823cb8cbbc0091134ad1a3b7427..01478d2b6b0751951c0fd3db5454b03d2ded3e31 100644 (file)
  */
 #define CONF_DISCARD_AVERAGE   1
 #define CONF_DISCARD_MINIMUM   2
+#define        CONF_DISCARD_MONITOR    3
 
 /*
  * "tinker" modifier keywords
index 34bedce25d2e915a090ab2521becce0abc395d63..cd3aad2d464db1b23c13afa359bc1e59320e21b7 100644 (file)
@@ -402,6 +402,7 @@ extern struct restrictlist *restrictlist; /* the ipv4 restriction list */
 extern struct restrictlist6 *restrictlist6; /* the ipv6 restriction list */
 extern u_long  res_min_interval;
 extern u_long  res_avg_interval;
+extern u_long  mon_age;                /* monitor preempt age */
 
 /* ntp_timer.c */
 extern volatile int alarm_flag;                /* alarm flag */
index c1336c5a10e93d052cc7f15b8c862a2cb2f023ff..f1428b15f1c346324eff6c86b25aa9067571d184 100644 (file)
@@ -207,16 +207,15 @@ static struct keyword flags_keywords[] = {
        { "",                   CONFIG_UNKNOWN }
 };
 
-#ifdef OPENSSL
 /*
  * "discard" modifier keywords
  */
 static struct keyword discard_keywords[] = {
        { "average",            CONF_DISCARD_AVERAGE },
        { "minimum",            CONF_DISCARD_MINIMUM },
+       { "monitor",            CONF_DISCARD_MONITOR },
        { "",                   CONFIG_UNKNOWN }
 };
-#endif /* OPENSSL */
 
 /*
  * "tinker" modifier keywords
@@ -1076,17 +1075,6 @@ getconfig(
                        }
                        break;
 
-#ifdef OPENSSL
-                   case CONFIG_REVOKE:
-                       if (ntokens >= 2)
-                           sys_revoke = (u_char) max(atoi(tokens[1]), KEY_REVOKE);
-                       break;
-
-                   case CONFIG_AUTOMAX:
-                       if (ntokens >= 2)
-                           sys_automax = 1 << max(atoi(tokens[1]), 10);
-                       break;
-
                    case CONFIG_DISCARD:
                        for (i = 1; i < ntokens; i++) {
                            int temp;
@@ -1107,6 +1095,11 @@ getconfig(
                            case CONF_DISCARD_MINIMUM:
                                res_min_interval = atoi(tokens[i++]);
                                break;
+
+                           case CONF_DISCARD_MONITOR:
+                               mon_age = atoi(tokens[i++]);
+                               break;
+
                            default:
                                msyslog(LOG_ERR,
                                    "discard: unknown keyword");
@@ -1115,6 +1108,17 @@ getconfig(
                        }
                        break;
 
+#ifdef OPENSSL
+                   case CONFIG_REVOKE:
+                       if (ntokens >= 2)
+                           sys_revoke = (u_char) max(atoi(tokens[1]), KEY_REVOKE);
+                       break;
+
+                   case CONFIG_AUTOMAX:
+                       if (ntokens >= 2)
+                           sys_automax = 1 << max(atoi(tokens[1]), 10);
+                       break;
+
                    case CONFIG_CRYPTO:
                        if (ntokens == 1) {
                                crypto_config(CRYPTO_CONF_NONE, NULL);
index 5599b757d3477d34a9f566c2f0b499c3d31d09d7..6b288fc32fecf53e8bc6056bd8dda3aa92d306ad 100644 (file)
@@ -82,7 +82,8 @@ static        int mon_mem_increments;         /* times called malloc() */
  * Initialization state.  We may be monitoring, we may not.  If
  * we aren't, we may not even have allocated any memory yet.
  */
-int    mon_enabled;
+int    mon_enabled;                    /* enable switch */
+u_long mon_age = 3000;                 /* preemption limit */
 static int mon_have_memory;
 static void    mon_getmoremem  P((void));
 static void    remove_from_hash P((struct mon_data *));
@@ -235,9 +236,13 @@ ntp_monitor(
        if (mon_free == NULL && mon_total_mem >= MAXMONMEM) {
 
                /*
-                * Get it from MRU list.
+                * Preempt from the MRU list if old enough.
                 */
                md = mon_mru_list.mru_prev;
+               if (((u_long)RANDOM & 0xffffffff) / FRAC >
+                   (double)(current_time - md->lasttime) / mon_age)
+                       return;
+
                md->mru_prev->mru_next = &mon_mru_list;
                mon_mru_list.mru_prev = md->mru_prev;
                remove_from_hash(md);
@@ -252,7 +257,7 @@ ntp_monitor(
         * Got one, initialize it
         */
        md->avg_interval = 0;
-       md->lasttime = md->firsttime = current_time;
+       md->lasttime = current_time;
        md->count = 1;
        md->drop_count = 0;
        memset(&md->rmtadr, 0, sizeof(md->rmtadr));
index a137cce064fbd83aa6d6dffad831328780e30a27..4ea4b1072a439c56e43716574d125b4377fc1242 100644 (file)
@@ -1856,7 +1856,7 @@ mon_getlist_0(
        for (md = mon_mru_list.mru_next; md != &mon_mru_list && im != 0;
             md = md->mru_next) {
                im->lasttime = htonl((u_int32)md->avg_interval);
-               im->firsttime = htonl((u_int32)(current_time - md->firsttime));
+               im->firsttime = htonl((u_int32)(current_time - md->lasttime));
                im->lastdrop = htonl((u_int32)md->drop_count);
                im->count = htonl((u_int32)(md->count));
                if (md->rmtadr.ss_family == AF_INET6) {
@@ -1892,10 +1892,6 @@ mon_getlist_1(
        extern struct mon_data mon_mru_list;
        extern int mon_enabled;
 
-#ifdef DEBUG
-       if (debug > 2)
-           printf("wants monitor 1 list\n");
-#endif
        if (!mon_enabled) {
                req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
                return;
@@ -1905,8 +1901,8 @@ mon_getlist_1(
        for (md = mon_mru_list.mru_next; md != &mon_mru_list && im != 0;
             md = md->mru_next) {
                im->lasttime = htonl((u_int32)md->avg_interval);
-               im->firsttime = htonl((u_int32)(current_time - md->firsttime));
-                   im->lastdrop = htonl((u_int32)md->drop_count);
+               im->firsttime = htonl((u_int32)(current_time - md->lasttime));
+               im->lastdrop = htonl((u_int32)md->drop_count);
                im->count = htonl((u_int32)md->count);
                if (md->rmtadr.ss_family == AF_INET6) {
                        if (!client_v6_capable)
index 7c5e925fe21dc4e3cf39d699918e46bdb9c19221..10a2c967fa17552e6b0518bd7ff5e30c17e187e5 100644 (file)
@@ -1910,7 +1910,7 @@ again:
                struct info_monitor_1 *ml = (struct info_monitor_1 *) struct_star;
 
                (void) fprintf(fp,
-                              "remote address          port local address      count m ver code avglen   first\n");
+                              "remote address          port local address      count m ver code avgint  lstint\n");
                (void) fprintf(fp,
                               "===============================================================================\n");
                while (items > 0) {
@@ -1953,7 +1953,7 @@ again:
                struct info_monitor *ml = (struct info_monitor *) struct_star;
 
                (void) fprintf(fp,
-                              "     address               port     count mode ver code avglen   first\n");
+                              "     address               port     count mode ver code avgint  lstint\n");
                (void) fprintf(fp,
                               "===============================================================================\n");
                while (items > 0) {