summaryrefslogtreecommitdiff
path: root/usr.sbin/bgpd
diff options
context:
space:
mode:
authorHenning Brauer <henning@cvs.openbsd.org>2004-01-17 21:06:56 +0000
committerHenning Brauer <henning@cvs.openbsd.org>2004-01-17 21:06:56 +0000
commitfbe5677342c4a3c49383838fe30f8d22e6be224c (patch)
tree0559f6be79c2f7567d09468a56ba24af422380d0 /usr.sbin/bgpd
parent4c5df9e882123bd2707fbaa7fae0703d1364cbdd (diff)
keep track of interface link state and invalidate connected routes depending
on the interface in question if it has no link now, if you pull the network cable all nexthops beeing in a connected network on this interface get invalidated nicely. ok claudio@
Diffstat (limited to 'usr.sbin/bgpd')
-rw-r--r--usr.sbin/bgpd/bgpd.h3
-rw-r--r--usr.sbin/bgpd/kroute.c18
2 files changed, 15 insertions, 6 deletions
diff --git a/usr.sbin/bgpd/bgpd.h b/usr.sbin/bgpd/bgpd.h
index 419d900cea9..9ed29c08ff5 100644
--- a/usr.sbin/bgpd/bgpd.h
+++ b/usr.sbin/bgpd/bgpd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: bgpd.h,v 1.71 2004/01/17 19:35:36 claudio Exp $ */
+/* $OpenBSD: bgpd.h,v 1.72 2004/01/17 21:06:55 henning Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -246,6 +246,7 @@ struct kif {
u_short ifindex;
int flags;
char ifname[IFNAMSIZ];
+ u_int8_t link_state;
};
struct session_up {
diff --git a/usr.sbin/bgpd/kroute.c b/usr.sbin/bgpd/kroute.c
index 105ab83edd4..a5da14ed15a 100644
--- a/usr.sbin/bgpd/kroute.c
+++ b/usr.sbin/bgpd/kroute.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kroute.c,v 1.72 2004/01/17 18:27:19 henning Exp $ */
+/* $OpenBSD: kroute.c,v 1.73 2004/01/17 21:06:55 henning Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -96,7 +96,7 @@ int protect_lo(void);
u_int8_t prefixlen_classful(in_addr_t);
u_int8_t mask2prefixlen(in_addr_t);
void get_rtaddrs(int, struct sockaddr *, struct sockaddr **);
-void if_change(u_short, int);
+void if_change(u_short, int, u_int8_t);
void if_announce(void *);
int send_rtmsg(int, int, struct kroute *);
@@ -798,7 +798,7 @@ get_rtaddrs(int addrs, struct sockaddr *sa, struct sockaddr **rti_info)
}
void
-if_change(u_short ifindex, int flags)
+if_change(u_short ifindex, int flags, u_int8_t link_state)
{
struct kif_node *kif;
struct kif_kr *kkr;
@@ -812,9 +812,15 @@ if_change(u_short ifindex, int flags)
}
kif->k.flags = flags;
+ kif->k.link_state = link_state;
LIST_FOREACH(kkr, &kif->kroute_l, entry) {
- if (flags & IFF_UP)
+ /*
+ * we treat link_state == LINK_STATE_UNKNOWN as valid
+ * not all interfaces have a conecpt of "link state" and/or
+ * do not report up
+ */
+ if ((flags & IFF_UP) && (link_state != LINK_STATE_DOWN))
kkr->kr->r.flags &= ~F_DOWN;
else
kkr->kr->r.flags |= F_DOWN;
@@ -1069,6 +1075,7 @@ fetchifs(int ifindex)
kif->k.ifindex = ifm->ifm_index;
kif->k.flags = ifm->ifm_flags;
+ kif->k.link_state = ifm->ifm_data.ifi_link_state;
if ((sa = rti_info[RTAX_IFP]) != NULL)
if (sa->sa_family == AF_LINK) {
@@ -1213,7 +1220,8 @@ dispatch_rtmsg(void)
break;
case RTM_IFINFO:
ifm = (struct if_msghdr *)next;
- if_change(ifm->ifm_index, ifm->ifm_flags);
+ if_change(ifm->ifm_index, ifm->ifm_flags,
+ ifm->ifm_data.ifi_link_state);
break;
case RTM_IFANNOUNCE:
if_announce(next);