summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsthen <sthen@openbsd.org>2011-04-21 14:55:22 +0000
committersthen <sthen@openbsd.org>2011-04-21 14:55:22 +0000
commit82baf71d3a0ff43e57453094674194115fa86b43 (patch)
tree1b2954c86bb300fe65745e16d94cc44f7a8f5060
parentMake this code actually compile on hppa64. (diff)
downloadwireguard-openbsd-82baf71d3a0ff43e57453094674194115fa86b43.tar.xz
wireguard-openbsd-82baf71d3a0ff43e57453094674194115fa86b43.zip
Add a "filter-routes" option; when set, snmpd asks the kernel not to
send route updates. If you aren't interested in examining routing tables over SNMP (e.g. if you only use it for sensors or interface stats) this reduces cpu use during heavy route updates. Makes my full-table bgp routers happier when a major peer bounces. ok reyk@
-rw-r--r--usr.sbin/snmpd/kroute.c8
-rw-r--r--usr.sbin/snmpd/parse.y31
-rw-r--r--usr.sbin/snmpd/snmpd.conf.516
-rw-r--r--usr.sbin/snmpd/snmpd.h3
4 files changed, 51 insertions, 7 deletions
diff --git a/usr.sbin/snmpd/kroute.c b/usr.sbin/snmpd/kroute.c
index 006453c6ac4..d5e3b100cf6 100644
--- a/usr.sbin/snmpd/kroute.c
+++ b/usr.sbin/snmpd/kroute.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kroute.c,v 1.16 2011/03/07 07:43:02 henning Exp $ */
+/* $OpenBSD: kroute.c,v 1.17 2011/04/21 14:55:22 sthen Exp $ */
/*
* Copyright (c) 2007, 2008 Reyk Floeter <reyk@vantronix.net>
@@ -45,6 +45,8 @@
#include "snmpd.h"
+extern struct snmpd *env;
+
struct {
struct event ks_ev;
u_long ks_iflastchange;
@@ -160,6 +162,10 @@ kr_init(void)
&opt, sizeof(opt)) == -1)
log_warn("kr_init: setsockopt"); /* not fatal */
+ if (env->sc_rtfilter && setsockopt(kr_state.ks_fd, PF_ROUTE,
+ ROUTE_MSGFILTER, &env->sc_rtfilter, sizeof(env->sc_rtfilter)) == -1)
+ log_warn("kr_init: setsockopt(ROUTE_MSGFILTER)");
+
/* grow receive buffer, don't wanna miss messages */
optlen = sizeof(default_rcvbuf);
if (getsockopt(kr_state.ks_fd, SOL_SOCKET, SO_RCVBUF,
diff --git a/usr.sbin/snmpd/parse.y b/usr.sbin/snmpd/parse.y
index 6982519d778..b6503233529 100644
--- a/usr.sbin/snmpd/parse.y
+++ b/usr.sbin/snmpd/parse.y
@@ -1,4 +1,4 @@
-/* $OpenBSD: parse.y,v 1.19 2010/10/18 13:29:49 sthen Exp $ */
+/* $OpenBSD: parse.y,v 1.20 2011/04/21 14:55:22 sthen Exp $ */
/*
* Copyright (c) 2007, 2008 Reyk Floeter <reyk@vantronix.net>
@@ -112,13 +112,13 @@ typedef struct {
%token INCLUDE
%token LISTEN ON
-%token SYSTEM CONTACT DESCR LOCATION NAME OBJECTID SERVICES
+%token SYSTEM CONTACT DESCR LOCATION NAME OBJECTID SERVICES RTFILTER
%token READONLY READWRITE OCTETSTRING INTEGER COMMUNITY TRAP RECEIVER
%token ERROR
%token <v.string> STRING
%token <v.number> NUMBER
%type <v.string> hostcmn
-%type <v.number> optwrite
+%type <v.number> optwrite yesno
%type <v.data> objtype
%type <v.oid> oid hostoid
@@ -157,6 +157,21 @@ varset : STRING '=' STRING {
}
;
+yesno : STRING {
+ if (!strcmp($1, "yes"))
+ $$ = 1;
+ else if (!strcmp($1, "no"))
+ $$ = 0;
+ else {
+ yyerror("syntax error, "
+ "either yes or no expected");
+ free($1);
+ YYERROR;
+ }
+ free($1);
+ }
+ ;
+
main : LISTEN ON STRING {
struct addresslist al;
struct address *h;
@@ -212,6 +227,15 @@ main : LISTEN ON STRING {
} host {
hlist = NULL;
}
+ | RTFILTER yesno {
+ if ($2 == 1)
+ conf->sc_rtfilter = ROUTE_FILTER(RTM_NEWADDR) |
+ ROUTE_FILTER(RTM_DELADDR) |
+ ROUTE_FILTER(RTM_IFINFO) |
+ ROUTE_FILTER(RTM_IFANNOUNCE);
+ else
+ conf->sc_rtfilter = 0;
+ }
;
system : SYSTEM sysmib
@@ -378,6 +402,7 @@ lookup(char *s)
{ "community", COMMUNITY },
{ "contact", CONTACT },
{ "description", DESCR },
+ { "filter-routes", RTFILTER },
{ "include", INCLUDE },
{ "integer", INTEGER },
{ "listen", LISTEN },
diff --git a/usr.sbin/snmpd/snmpd.conf.5 b/usr.sbin/snmpd/snmpd.conf.5
index 9026e1cf78a..44c034f440d 100644
--- a/usr.sbin/snmpd/snmpd.conf.5
+++ b/usr.sbin/snmpd/snmpd.conf.5
@@ -1,4 +1,4 @@
-.\" $OpenBSD: snmpd.conf.5,v 1.13 2010/07/18 08:03:04 jmc Exp $
+.\" $OpenBSD: snmpd.conf.5,v 1.14 2011/04/21 14:55:22 sthen Exp $
.\"
.\" Copyright (c) 2007, 2008 Reyk Floeter <reyk@vantronix.net>
.\"
@@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: July 18 2010 $
+.Dd $Mdocdate: April 21 2011 $
.Dt SNMPD.CONF 5
.Os
.Sh NAME
@@ -85,6 +85,18 @@ Specify the name of the read-write community.
The default value is
.Ar private .
.Pp
+.It Xo
+.Ic filter-routes
+.Pq Ic yes Ns \&| Ns Ic no
+.Xc
+If set to
+.Ic yes ,
+ask the kernel to filter route update messages on the routing socket.
+Routing table information will not be available, but CPU use will be
+reduced during bulk updates.
+The default is
+.Ic no .
+.Pp
.It Ic system contact Ar string
Specify the name or description of the system contact, typically a
name or an e-mail address.
diff --git a/usr.sbin/snmpd/snmpd.h b/usr.sbin/snmpd/snmpd.h
index 293a9b420b8..5a0b388fa80 100644
--- a/usr.sbin/snmpd/snmpd.h
+++ b/usr.sbin/snmpd/snmpd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: snmpd.h,v 1.30 2010/09/20 08:56:16 martinh Exp $ */
+/* $OpenBSD: snmpd.h,v 1.31 2011/04/21 14:55:22 sthen Exp $ */
/*
* Copyright (c) 2007, 2008 Reyk Floeter <reyk@vantronix.net>
@@ -303,6 +303,7 @@ struct snmpd {
int sc_ncpu;
int64_t *sc_cpustates;
+ int sc_rtfilter;
};
/* control.c */