diff options
Diffstat (limited to 'usr.sbin/eigrpd')
-rw-r--r-- | usr.sbin/eigrpd/eigrpe.c | 3 | ||||
-rw-r--r-- | usr.sbin/eigrpd/interface.c | 35 | ||||
-rw-r--r-- | usr.sbin/eigrpd/kroute.c | 10 |
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 |