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 */
*/
#define CONF_DISCARD_AVERAGE 1
#define CONF_DISCARD_MINIMUM 2
+#define CONF_DISCARD_MONITOR 3
/*
* "tinker" modifier keywords
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 */
{ "", 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
}
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;
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");
}
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);
* 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 *));
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);
* 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));
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) {
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;
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)
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) {
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) {