summaryrefslogtreecommitdiffstats
path: root/usr.sbin/eigrpd
diff options
context:
space:
mode:
authorrenato <renato@openbsd.org>2015-10-25 00:43:35 +0000
committerrenato <renato@openbsd.org>2015-10-25 00:43:35 +0000
commitd604015822373fe5c27860ede1912b1665ffd21e (patch)
tree9b9e5114cc8bb67ac24f2fd326e8e06501bde815 /usr.sbin/eigrpd
parentWhen converting the real bandwidth to the composite bandwidth, truncate (diff)
downloadwireguard-openbsd-d604015822373fe5c27860ede1912b1665ffd21e.tar.xz
wireguard-openbsd-d604015822373fe5c27860ede1912b1665ffd21e.zip
Fix some bugs in the detection of when an interface can be enabled.
Diffstat (limited to 'usr.sbin/eigrpd')
-rw-r--r--usr.sbin/eigrpd/eigrpe.c3
-rw-r--r--usr.sbin/eigrpd/interface.c35
-rw-r--r--usr.sbin/eigrpd/kroute.c10
3 files changed, 32 insertions, 16 deletions
diff --git a/usr.sbin/eigrpd/eigrpe.c b/usr.sbin/eigrpd/eigrpe.c
index c17b1677431..4c97a556f40 100644
--- a/usr.sbin/eigrpd/eigrpe.c
+++ b/usr.sbin/eigrpd/eigrpe.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: eigrpe.c,v 1.7 2015/10/22 10:42:14 renato Exp $ */
+/* $OpenBSD: eigrpe.c,v 1.8 2015/10/25 00:43:35 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -303,6 +303,7 @@ eigrpe_dispatch_main(int fd, short event, void *bula)
IN6_IS_ADDR_LINKLOCAL(&ka->addr.v6)) {
memcpy(&iface->linklocal, &ka->addr.v6,
sizeof(iface->linklocal));
+ if_update(iface, AF_INET6);
break;
}
diff --git a/usr.sbin/eigrpd/interface.c b/usr.sbin/eigrpd/interface.c
index b2d7260cc62..26df5bdb5a6 100644
--- a/usr.sbin/eigrpd/interface.c
+++ b/usr.sbin/eigrpd/interface.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: interface.c,v 1.8 2015/10/21 03:52:12 renato Exp $ */
+/* $OpenBSD: interface.c,v 1.9 2015/10/25 00:43:35 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -230,30 +230,41 @@ if_update(struct iface *iface, int af)
{
struct eigrp_iface *ei;
int link_ok;
- int addr_ok = 1;
+ int addr_ok, addr4_ok = 0, addr6_ok = 0;
struct if_addr *if_addr;
link_ok = (iface->flags & IFF_UP) &&
LINK_STATE_IS_UP(iface->linkstate);
/*
- * NOTE: For EIGRPv4, each interface should have a valid IP address
- * otherwise they can not be enabled in the routing domain. For IPv6
- * this limitation does not exist because the link-local addresses
- * are used to form the adjacencies.
+ * NOTE: for EIGRPv4, each interface should have at least one valid
+ * IP address otherwise they can not be enabled in the routing domain.
*/
- if (af == AF_INET) {
- TAILQ_FOREACH(if_addr, &iface->addr_list, entry)
- if (if_addr->af == AF_INET)
- break;
- if (if_addr == NULL)
- addr_ok = 0;
+ TAILQ_FOREACH(if_addr, &iface->addr_list, entry) {
+ if (if_addr->af == AF_INET) {
+ addr4_ok = 1;
+ break;
+ }
}
+ /* for IPv6 the link-local address is enough. */
+ if (IN6_IS_ADDR_LINKLOCAL(&iface->linklocal))
+ addr6_ok = 1;
TAILQ_FOREACH(ei, &iface->ei_list, i_entry) {
if (af != AF_UNSPEC && ei->eigrp->af != af)
continue;
+ switch (ei->eigrp->af) {
+ case AF_INET:
+ addr_ok = addr4_ok;
+ break;
+ case AF_INET6:
+ addr_ok = addr6_ok;
+ break;
+ default:
+ fatalx("if_update: unknown af");
+ }
+
if (ei->state == IF_STA_DOWN) {
if (!link_ok || !addr_ok)
continue;
diff --git a/usr.sbin/eigrpd/kroute.c b/usr.sbin/eigrpd/kroute.c
index 88cb912c22a..2de5ad567d0 100644
--- a/usr.sbin/eigrpd/kroute.c
+++ b/usr.sbin/eigrpd/kroute.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kroute.c,v 1.4 2015/10/22 23:17:45 renato Exp $ */
+/* $OpenBSD: kroute.c,v 1.5 2015/10/25 00:43:35 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -198,10 +198,14 @@ kif_redistribute(void)
struct kif_node *kif;
struct kif_addr *ka;
- RB_FOREACH(kif, kif_tree, &kit)
- TAILQ_FOREACH(ka, &kif->addrs, entry)
+ RB_FOREACH(kif, kif_tree, &kit) {
+ main_imsg_compose_eigrpe(IMSG_IFINFO, 0, &kif->k,
+ sizeof(struct kif));
+ TAILQ_FOREACH(ka, &kif->addrs, entry) {
main_imsg_compose_eigrpe(IMSG_NEWADDR, 0, &ka->a,
sizeof(struct kaddr));
+ }
+ }
}
int