diff options
Diffstat (limited to 'usr.sbin/bgpd/session.c')
-rw-r--r-- | usr.sbin/bgpd/session.c | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/usr.sbin/bgpd/session.c b/usr.sbin/bgpd/session.c index 37ff59a7764..1b0f138a990 100644 --- a/usr.sbin/bgpd/session.c +++ b/usr.sbin/bgpd/session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: session.c,v 1.195 2004/10/07 13:39:14 henning Exp $ */ +/* $OpenBSD: session.c,v 1.196 2004/10/19 12:02:50 henning Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> @@ -533,6 +533,12 @@ init_peer(struct peer *p) p->capa.announce = p->conf.capabilities; p->capa.ann_mp = 1; p->capa.ann_refresh = 1; + if (p->conf.if_depend[0]) + imsg_compose(ibuf_main, IMSG_IFINFO, 0, 0, -1, + p->conf.if_depend, sizeof(p->conf.if_depend)); + else + p->depend_ok = 1; + peer_cnt++; change_state(p, STATE_IDLE, EVNT_NONE); @@ -570,7 +576,9 @@ bgp_fsm(struct peer *peer, enum session_events event) return; } - if (peer->conf.passive || peer->conf.template) { + if (!peer->depend_ok) + peer->ConnectRetryTimer = 0; + else if (peer->conf.passive || peer->conf.template) { change_state(peer, STATE_ACTIVE, event); peer->ConnectRetryTimer = 0; } else { @@ -2019,9 +2027,10 @@ session_dispatch_imsg(struct imsgbuf *ibuf, int idx, u_int *listener_cnt) struct peer_config *pconf; struct peer *p, *next; struct listen_addr *la, *nla; + struct kif *kif; u_char *data; enum reconf_action reconf; - int n; + int n, depend_ok; u_int8_t errcode, subcode; if ((n = imsg_read(ibuf)) == -1) @@ -2161,6 +2170,29 @@ session_dispatch_imsg(struct imsgbuf *ibuf, int idx, u_int *listener_cnt) pending_reconf = 0; log_info("SE reconfigured"); break; + case IMSG_IFINFO: + if (idx != PFD_PIPE_MAIN) + fatalx("IFINFO message not from parent"); + if (imsg.hdr.len != IMSG_HEADER_SIZE + + sizeof(struct kif)) + fatalx("IFINFO imsg with wrong len"); + kif = imsg.data; + depend_ok = (kif->flags & IFF_UP) && + (kif->link_state == LINK_STATE_UP || + (kif->link_state == LINK_STATE_UNKNOWN && + strncmp(kif->ifname, "carp", 4))); + + for (p = peers; p != NULL; p = p->next) + if (!strcmp(p->conf.if_depend, kif->ifname)) { + if (depend_ok && !p->depend_ok) { + p->depend_ok = depend_ok; + bgp_fsm(p, EVNT_START); + } else if (!depend_ok && p->depend_ok) { + p->depend_ok = depend_ok; + bgp_fsm(p, EVNT_STOP); + } + } + break; case IMSG_MRT_OPEN: case IMSG_MRT_REOPEN: if (imsg.hdr.len > IMSG_HEADER_SIZE + |