diff options
author | Claudio Jeker <claudio@cvs.openbsd.org> | 2011-07-04 04:08:35 +0000 |
---|---|---|
committer | Claudio Jeker <claudio@cvs.openbsd.org> | 2011-07-04 04:08:35 +0000 |
commit | 60cf1b87bd82e8898e79d8188c4d7b8f06f3ee98 (patch) | |
tree | 82bd4c62268bffa9f427ee8f08c7d1627f092ad2 | |
parent | f97b26dfb6b44d8475f6b1bdaa26273f61157388 (diff) |
Make sure that passive interfaces (like carp) are added to the
intra-area rtr LSA. Diff initialy made by Patrick Coleman but
simplified by myself. Tested and OK dlg@
-rw-r--r-- | usr.sbin/ospf6d/interface.c | 10 | ||||
-rw-r--r-- | usr.sbin/ospf6d/rde.c | 32 |
2 files changed, 32 insertions, 10 deletions
diff --git a/usr.sbin/ospf6d/interface.c b/usr.sbin/ospf6d/interface.c index 0d085a15288..6779b962c65 100644 --- a/usr.sbin/ospf6d/interface.c +++ b/usr.sbin/ospf6d/interface.c @@ -1,4 +1,4 @@ -/* $OpenBSD: interface.c,v 1.16 2011/05/06 13:48:46 claudio Exp $ */ +/* $OpenBSD: interface.c,v 1.17 2011/07/04 04:08:34 claudio Exp $ */ /* * Copyright (c) 2005 Claudio Jeker <claudio@openbsd.org> @@ -145,11 +145,11 @@ if_fsm(struct iface *iface, enum iface_event event) if (iface->state != old_state) { orig_rtr_lsa(iface); orig_link_lsa(iface); - - /* state change inform RDE */ - ospfe_imsg_compose_rde(IMSG_IFINFO, - iface->self->peerid, 0, iface, sizeof(struct iface)); } + + /* Inform RDE in any case since the link state may have changed */ + ospfe_imsg_compose_rde(IMSG_IFINFO, + iface->self->peerid, 0, iface, sizeof(struct iface)); if (old_state & (IF_STA_MULTI | IF_STA_POINTTOPOINT) && (iface->state & (IF_STA_MULTI | IF_STA_POINTTOPOINT)) == 0) diff --git a/usr.sbin/ospf6d/rde.c b/usr.sbin/ospf6d/rde.c index a1ed18c72fe..fae779a83fa 100644 --- a/usr.sbin/ospf6d/rde.c +++ b/usr.sbin/ospf6d/rde.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.c,v 1.52 2011/05/05 15:58:02 claudio Exp $ */ +/* $OpenBSD: rde.c,v 1.53 2011/07/04 04:08:34 claudio Exp $ */ /* * Copyright (c) 2004, 2005 Claudio Jeker <claudio@openbsd.org> @@ -21,6 +21,7 @@ #include <sys/types.h> #include <sys/socket.h> #include <sys/queue.h> +#include <net/if_types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <err.h> @@ -585,11 +586,20 @@ rde_dispatch_imsg(int fd, short event, void *bula) iface = if_find(ifp->ifindex); if (iface == NULL) fatalx("interface lost in rde"); - iface->flags = ifp->flags; - iface->linkstate = ifp->linkstate; iface->nh_reachable = ifp->nh_reachable; - if (iface->state != ifp->state) { + + /* + * Resend LSAs if interface flags change - + * carp/passive interfaces can come up and down + * without changing OSPF state. + */ + if ((iface->state != ifp->state) || + (iface->linkstate != ifp->linkstate) || + (iface->flags != ifp->flags)) { iface->state = ifp->state; + iface->flags = ifp->flags; + iface->linkstate = ifp->linkstate; + area = area_find(rdeconf, iface->area_id); if (!area) fatalx("interface lost area"); @@ -1457,8 +1467,20 @@ orig_intra_lsa_rtr(struct area *area, struct vertex *old) numprefix = 0; LIST_FOREACH(iface, &area->iface_list, entry) { - if (iface->state & IF_STA_DOWN) + if (!((iface->flags & IFF_UP) && + (LINK_STATE_IS_UP(iface->linkstate) || + (iface->linkstate == LINK_STATE_UNKNOWN && + iface->media_type != IFT_CARP)))) + /* interface or link state down */ continue; + if ((iface->state & IF_STA_DOWN) && + !(iface->cflags & F_IFACE_PASSIVE)) + /* passive interfaces stay in state DOWN */ + continue; + + log_debug("orig_intra_lsa_rtr: area %s, interface %s: " + "including in intra-area-prefix LSA", + inet_ntoa(area->id), iface->name); /* Broadcast links with adjacencies are handled * by orig_intra_lsa_net(), ignore. */ |