From dd1e1635fea390664a952099ef875a12d5357117 Mon Sep 17 00:00:00 2001
From: Henning Brauer <henning@cvs.openbsd.org>
Date: Thu, 25 Dec 2003 19:24:47 +0000
Subject: detect connected routes and flag them as such

---
 usr.sbin/bgpd/kroute.c | 35 +++++++++++++++++++++++------------
 1 file changed, 23 insertions(+), 12 deletions(-)

(limited to 'usr.sbin/bgpd/kroute.c')

diff --git a/usr.sbin/bgpd/kroute.c b/usr.sbin/bgpd/kroute.c
index 890b54b70c4..42f76b39f62 100644
--- a/usr.sbin/bgpd/kroute.c
+++ b/usr.sbin/bgpd/kroute.c
@@ -1,4 +1,4 @@
-/*	$OpenBSD: kroute.c,v 1.19 2003/12/25 17:07:24 henning Exp $ */
+/*	$OpenBSD: kroute.c,v 1.20 2003/12/25 19:24:46 henning Exp $ */
 
 /*
  * Copyright (c) 2003 Henning Brauer <henning@openbsd.org>
@@ -56,6 +56,7 @@ pid_t			pid;
 
 #define	F_BGPD_INSERTED		0x0001
 #define F_KERNEL		0x0002
+#define	F_CONNECTED		0x0004
 
 int
 kroute_init(void)
@@ -299,6 +300,7 @@ kroute_fetchtable(void)
 		if ((kr = calloc(1, sizeof(struct kroute_node))) == NULL)
 			fatal(NULL, errno);
 
+		kr->flags = F_KERNEL;
 		kr->r.prefix = sa_in->sin_addr.s_addr;
 		if ((sa_in = (struct sockaddr_in *)rti_info[RTAX_NETMASK]) !=
 		    NULL) {
@@ -310,10 +312,12 @@ kroute_fetchtable(void)
 			kr->r.prefixlen = prefixlen_classful(kr->r.prefix);
 
 		if ((sa_in = (struct sockaddr_in *)rti_info[RTAX_GATEWAY]) !=
-		    NULL)
-			kr->r.nexthop = sa_in->sin_addr.s_addr;
-
-		kr->flags = F_KERNEL;
+		    NULL) {
+			if (sa_in->sin_family == AF_INET)
+				kr->r.nexthop = sa_in->sin_addr.s_addr;
+			else if (sa_in->sin_family == AF_LINK)
+				kr->flags |= F_CONNECTED;
+		}
 
 		if (RB_INSERT(kroute_tree, &krt, kr) != NULL) {
 			logit(LOG_CRIT, "RB_INSERT failed!");
@@ -335,6 +339,7 @@ kroute_dispatch_msg(int fd)
 	struct sockaddr_in	*sa_in;
 	struct kroute_node	*kr, s;
 	in_addr_t		 nexthop;
+	int			 flags;
 
 	if ((n = read(fd, &buf, sizeof(buf))) == -1)
 		fatal("read error on routing socket", errno);
@@ -346,6 +351,8 @@ kroute_dispatch_msg(int fd)
 		rtm = (struct rt_msghdr *)next;
 		sa = (struct sockaddr *)(rtm + 1);
 		get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
+		flags = F_KERNEL;
+		nexthop = 0;
 
 		if ((sa_in = (struct sockaddr_in *)rti_info[RTAX_DST]) == NULL)
 			continue;
@@ -370,10 +377,12 @@ kroute_dispatch_msg(int fd)
 			s.r.prefixlen = prefixlen_classful(s.r.prefix);
 
 		if ((sa_in = (struct sockaddr_in *)rti_info[RTAX_GATEWAY]) !=
-		    NULL)
-			nexthop = sa_in->sin_addr.s_addr;
-		else
-			nexthop = 0;
+		    NULL) {
+			if (sa_in->sin_family == AF_INET)
+				nexthop = sa_in->sin_addr.s_addr;
+			else if (sa_in->sin_family == AF_LINK)
+				flags |= F_CONNECTED;
+		}
 
 		switch (rtm->rtm_type) {
 		case RTM_ADD:
@@ -382,16 +391,18 @@ kroute_dispatch_msg(int fd)
 				fatal("nexthop is 0 in kroute_dispatch!", 0);
 
 			if ((kr = RB_FIND(kroute_tree, &krt, &s)) != NULL) {
-				if (kr->flags & F_KERNEL)
+				if (kr->flags & F_KERNEL) {
 					kr->r.nexthop = nexthop;
+					kr->flags = flags;
+				}
 			} else {
 				if ((kr = calloc(1,
-				   sizeof(struct kroute_node))) == NULL)
+				    sizeof(struct kroute_node))) == NULL)
 					fatal(NULL, errno);
 				kr->r.prefix = s.r.prefix;
 				kr->r.prefixlen = s.r.prefixlen;
 				kr->r.nexthop = nexthop;
-				kr->flags = F_KERNEL;
+				kr->flags = flags;
 
 				if (RB_INSERT(kroute_tree, &krt, kr) != NULL) {
 					logit(LOG_CRIT, "RB_INSERT failed!");
-- 
cgit v1.2.3