snmpd route-filter

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Stuart Henderson
Date: Wednesday, February 3, 2010 - 4:51 am

moment,

This removes the route-table code from snmpd (it's changed a bit
in the donor, ospfd, since it was borrowed; removal done with messy
#if 0 and // as a proof of concept), and filters the route socket.

Result: don't needlessly burn cpu cycles when a BGP session
bounces and you reload 300,000 routes, the RDE can make slightly
better use of them at that point in time.

I'm mostly throwing it out for discussion at this point.. I'm not
sure whether we want to remove all of this as we might at some point
want snmpd to have access to routing tables (but in that situation,
it would probably make more sense to only do this on-demand i.e.
if the table is requested, unfilter the socket, ask for a table dump
and filter it again).

Index: kroute.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/kroute.c,v
retrieving revision 1.8
diff -u -p -r1.8 kroute.c
--- kroute.c	25 Jun 2009 17:02:30 -0000	1.8
+++ kroute.c	3 Feb 2010 11:39:23 -0000
@@ -55,11 +55,13 @@ struct {
 	u_long			 ks_iflastchange;
 } kr_state;
 
+#if 0
 struct kroute_node {
 	RB_ENTRY(kroute_node)	 entry;
 	struct kroute		 r;
 	struct kroute_node	*next;
 };
+#endif
 
 struct kif_node {
 	RB_ENTRY(kif_node)	 entry;
@@ -67,6 +69,7 @@ struct kif_node {
 	struct kif		 k;
 };
 
+#if 0
 int			 kroute_compare(struct kroute_node *, struct kroute_node *);
 struct kroute_node	*kroute_find(in_addr_t, u_int8_t);
 struct kroute_node	*kroute_match(in_addr_t);
@@ -74,6 +77,7 @@ struct kroute_node	*kroute_matchgw(struc
 int			 kroute_insert(struct kroute_node *);
 int			 kroute_remove(struct kroute_node *);
 void			 kroute_clear(void);
+#endif
 
 int			 kif_init(void);
 int			 kif_compare(struct kif_node *, struct kif_node *);
@@ -94,7 +98,7 @@ u_int16_t		 rtlabel_name2id(const char *
 const char		*rtlabel_id2name(u_int16_t);
 void			 rtlabel_unref(u_int16_t);
 
-int			 protect_lo(void);
+//int			 protect_lo(void);
 u_int8_t		 prefixlen_classful(in_addr_t);
 u_int8_t		 mask2prefixlen(in_addr_t);
 in_addr_t		 prefixlen2mask(u_int8_t);
@@ -111,9 +115,11 @@ void			 dispatch_rtmsg(int, short, void 
 int			 fetchifs(u_short);
 int			 fetchtable(void);
 
+#if 0
 RB_HEAD(kroute_tree, kroute_node)	krt;
 RB_PROTOTYPE(kroute_tree, kroute_node, entry, kroute_compare)
 RB_GENERATE(kroute_tree, kroute_node, entry, kroute_compare)
+#endif
 
 RB_HEAD(kif_tree, kif_node)		kit;
 RB_PROTOTYPE(kif_tree, kif_node, entry, kif_compare)
@@ -137,7 +143,7 @@ kif_init(void)
 int
 kr_init(void)
 {
-	int		opt = 0, rcvbuf, default_rcvbuf;
+	int		opt = 0, rcvbuf, default_rcvbuf, rtfilter;
 	socklen_t	optlen;
 
 	if (kif_init() == -1)
@@ -158,6 +164,15 @@ kr_init(void)
 	    &opt, sizeof(opt)) == -1)
 		log_warn("kr_init: setsockopt");	/* not fatal */
 
+/***/
+	rtfilter = ROUTE_FILTER(RTM_NEWADDR) | ROUTE_FILTER(RTM_DELADDR) |
+	    ROUTE_FILTER(RTM_IFINFO) | ROUTE_FILTER(RTM_IFANNOUNCE);
+
+	if (setsockopt(kr_state.ks_fd, PF_ROUTE, ROUTE_MSGFILTER,
+	    &rtfilter, sizeof(rtfilter)) == -1)
+		log_warn("setsockopt(ROUTE_MSGFILTER): %m");	/* not fatal */
+/***/
+
 	/* grow receive buffer, don't wanna miss messages */
 	optlen = sizeof(default_rcvbuf);
 	if (getsockopt(kr_state.ks_fd, SOL_SOCKET, SO_RCVBUF,
@@ -174,6 +189,7 @@ kr_init(void)
 	kr_state.ks_pid = getpid();
 	kr_state.ks_rtseq = 1;
 
+#if 0
 	RB_INIT(&krt);
 
 	if (fetchtable() == -1)
@@ -181,6 +197,7 @@ kr_init(void)
 
 	if (protect_lo() == -1)
 		return (-1);
+#endif
 
 	event_set(&kr_state.ks_ev, kr_state.ks_fd, EV_READ | EV_PERSIST,
 	    dispatch_rtmsg, NULL);
@@ -192,7 +209,7 @@ kr_init(void)
 void
 kr_shutdown(void)
 {
-	kroute_clear();
+//	kroute_clear();
 	kif_clear();
 }
 
@@ -220,6 +237,7 @@ kr_updateif(u_int if_index)
 	return (fetchifs(if_index));
 }
 
+#if 0
 /* rb-tree compare */
 int
 kroute_compare(struct kroute_node *a, struct kroute_node *b)
@@ -234,6 +252,7 @@ kroute_compare(struct kroute_node *a, st
 		return (1);
 	return (0);
 }
+#endif
 
 int
 kif_compare(struct kif_node *a, struct kif_node *b)
@@ -247,6 +266,7 @@ ka_compare(struct kif_addr *a, struct ki
 	return (memcmp(&a->addr, &b->addr, sizeof(struct in_addr)));
 }
 
+#if 0
 /* tree management */
 struct kroute_node *
 kroute_find(in_addr_t prefix, u_int8_t prefixlen)
@@ -258,7 +278,9 @@ kroute_find(in_addr_t prefix, u_int8_t p
 
 	return (RB_FIND(kroute_tree, &krt, &s));
 }
+#endif
 
+#if 0
 struct kroute_node *
 kroute_matchgw(struct kroute_node *kr, struct in_addr nh)
 {
@@ -274,7 +296,9 @@ kroute_matchgw(struct kroute_node *kr, s
 
 	return (NULL);
 }
+#endif
 
+#if 0
 int
 kroute_insert(struct kroute_node *kr)
 {
@@ -359,6 +383,7 @@ kroute_clear(void)
 	while ((kr = RB_MIN(kroute_tree, &krt)) != NULL)
 		kroute_remove(kr);
 }
+#endif
 
 struct kif_node *
 kif_find(u_short if_index)
@@ -510,6 +535,7 @@ kif_validate(u_short if_index)
 	return (kif->k.if_nhreachable);
 }
 
+#if 0
 struct kroute_node *
 kroute_match(in_addr_t key)
 {
@@ -527,6 +553,7 @@ kroute_match(in_addr_t key)
 
 	return (NULL);
 }
+#endif
 
 struct kif_addr *
 ka_insert(u_short if_index, struct kif_addr *ka)
@@ -586,6 +613,7 @@ kr_getnextaddr(struct in_addr *in)
 	return (ka);
 }
 
+#if 0
 /* misc */
 int
 protect_lo(void)
@@ -606,6 +634,7 @@ protect_lo(void)
 
 	return (0);
 }
+#endif
 
 u_int8_t
 prefixlen_classful(in_addr_t ina)
@@ -664,7 +693,7 @@ get_rtaddrs(int addrs, struct sockaddr *
 void
 if_change(u_short if_index, int flags, struct if_data *ifd)
 {
-	struct kroute_node	*kr, *tkr;
+//	struct kroute_node	*kr, *tkr;
 	struct kif		*kif;
 	u_int8_t		 reachable;
 
@@ -688,6 +717,7 @@ if_change(u_short if_index, int flags, s
 	main_imsg_compose_ospfe(IMSG_IFINFO, 0, kif, sizeof(struct kif));
 #endif
 
+#if 0
 	/* update redistribute list */
 	RB_FOREACH(kr, kroute_tree, &krt) {
 		for (tkr = kr; tkr != NULL; tkr = tkr->next) {
@@ -699,6 +729,7 @@ if_change(u_short if_index, int flags, s
 			}
 		}
 	}
+#endif
 }
 
 void
@@ -775,6 +806,7 @@ if_announce(void *msg)
 	}
 }
 
+#if 0
 int
 fetchtable(void)
 {
@@ -881,6 +913,7 @@ fetchtable(void)
 	free(buf);
 	return (0);
 }
+#endif
 
 int
 fetchifs(u_short if_index)
@@ -967,13 +1000,13 @@ dispatch_rtmsg(int fd, short event, void
 	struct if_msghdr	 ifm;
 	struct ifa_msghdr	*ifam;
 	struct sockaddr		*sa, *rti_info[RTAX_MAX];
-	struct sockaddr_in	*sa_in;
-	struct sockaddr_rtlabel	*label;
-	struct kroute_node	*kr, *okr;
+//	struct sockaddr_in	*sa_in;
+//	struct sockaddr_rtlabel	*label;
+//	struct kroute_node	*kr, *okr;
 	struct in_addr		 prefix, nexthop;
 	u_int8_t		 prefixlen;
 	int			 flags, mpath;
-	u_short			 if_index = 0;
+//	u_short			 if_index = 0;
 
 	if ((n = read(fd, &buf, sizeof(buf))) == -1) {
 		log_warn("dispatch_rtmsg: read error");
@@ -996,7 +1029,7 @@ dispatch_rtmsg(int fd, short event, void
 		flags = F_KERNEL;
 		nexthop.s_addr = 0;
 		mpath = 0;
-
+#if 0
 		if (rtm->rtm_type == RTM_ADD || rtm->rtm_type == RTM_CHANGE ||
 		    rtm->rtm_type == RTM_DELETE) {
 			sa = (struct sockaddr *)(next + rtm->rtm_hdrlen);
@@ -1057,8 +1090,9 @@ dispatch_rtmsg(int fd, short event, void
 				}
 			}
 		}
-
+#endif
 		switch (rtm->rtm_type) {
+#if 0
 		case RTM_ADD:
 		case RTM_CHANGE:
 			if (nexthop.s_addr == 0 && !(flags & F_CONNECTED)) {
@@ -1149,6 +1183,7 @@ add:
 			if (kroute_remove(kr) == -1)
 				return;
 			break;
+#endif
 		case RTM_IFINFO:
 			memcpy(&ifm, next, sizeof(ifm));
 			if_change(ifm.ifm_index, ifm.ifm_flags,
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
snmpd route-filter