diff options
-rw-r--r-- | usr.sbin/ldpd/ldpe.h | 4 | ||||
-rw-r--r-- | usr.sbin/ldpd/neighbor.c | 42 | ||||
-rw-r--r-- | usr.sbin/ldpd/packet.c | 3 |
3 files changed, 46 insertions, 3 deletions
diff --git a/usr.sbin/ldpd/ldpe.h b/usr.sbin/ldpd/ldpe.h index 52a10a60d22..62341870b52 100644 --- a/usr.sbin/ldpd/ldpe.h +++ b/usr.sbin/ldpd/ldpe.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ldpe.h,v 1.59 2016/06/11 01:46:36 renato Exp $ */ +/* $OpenBSD: ldpe.h,v 1.60 2016/06/13 20:19:40 renato Exp $ */ /* * Copyright (c) 2013, 2016 Renato Westphal <renato@openbsd.org> @@ -68,6 +68,7 @@ struct nbr { struct event ev_connect; struct event keepalive_timer; struct event keepalive_timeout; + struct event init_timeout; struct event initdelay_timer; struct mapping_head mapping_list; @@ -228,6 +229,7 @@ int nbr_adj_count(struct nbr *, int); int nbr_session_active_role(struct nbr *); void nbr_stop_ktimer(struct nbr *); void nbr_stop_ktimeout(struct nbr *); +void nbr_stop_itimeout(struct nbr *); void nbr_start_idtimer(struct nbr *); void nbr_stop_idtimer(struct nbr *); int nbr_pending_idtimer(struct nbr *); diff --git a/usr.sbin/ldpd/neighbor.c b/usr.sbin/ldpd/neighbor.c index 5755bd1fa11..4b607c0ce3f 100644 --- a/usr.sbin/ldpd/neighbor.c +++ b/usr.sbin/ldpd/neighbor.c @@ -1,4 +1,4 @@ -/* $OpenBSD: neighbor.c,v 1.72 2016/05/23 19:20:55 renato Exp $ */ +/* $OpenBSD: neighbor.c,v 1.73 2016/06/13 20:19:40 renato Exp $ */ /* * Copyright (c) 2013, 2016 Renato Westphal <renato@openbsd.org> @@ -41,6 +41,8 @@ static void nbr_ktimer(int, short, void *); static void nbr_start_ktimer(struct nbr *); static void nbr_ktimeout(int, short, void *); static void nbr_start_ktimeout(struct nbr *); +static void nbr_itimeout(int, short, void *); +static void nbr_start_itimeout(struct nbr *); static void nbr_idtimer(int, short, void *); static int nbr_act_session_operational(struct nbr *); static void nbr_send_labelmappings(struct nbr *); @@ -164,6 +166,11 @@ nbr_fsm(struct nbr *nbr, enum nbr_event event) } } + if (nbr->state == NBR_STA_OPER || nbr->state == NBR_STA_PRESENT) + nbr_stop_itimeout(nbr); + else + nbr_start_itimeout(nbr); + switch (nbr_fsm_tbl[i].action) { case NBR_ACT_RST_KTIMEOUT: nbr_start_ktimeout(nbr); @@ -259,6 +266,7 @@ nbr_new(struct in_addr id, int af, int ds_tlv, union ldpd_addr *addr, /* set event structures */ evtimer_set(&nbr->keepalive_timeout, nbr_ktimeout, nbr); evtimer_set(&nbr->keepalive_timer, nbr_ktimer, nbr); + evtimer_set(&nbr->init_timeout, nbr_itimeout, nbr); evtimer_set(&nbr->initdelay_timer, nbr_idtimer, nbr); nbrp = nbr_params_find(leconf, nbr->id); @@ -286,6 +294,7 @@ nbr_del(struct nbr *nbr) event_del(&nbr->ev_connect); nbr_stop_ktimer(nbr); nbr_stop_ktimeout(nbr); + nbr_stop_itimeout(nbr); nbr_stop_idtimer(nbr); mapping_list_clr(&nbr->mapping_list); @@ -431,6 +440,37 @@ nbr_stop_ktimeout(struct nbr *nbr) fatal(__func__); } +/* Session initialization timeout: if nbr got stuck in the initialization FSM */ + +static void +nbr_itimeout(int fd, short event, void *arg) +{ + struct nbr *nbr = arg; + + log_debug("%s: lsr-id %s", __func__, inet_ntoa(nbr->id)); + + nbr_fsm(nbr, NBR_EVT_CLOSE_SESSION); +} + +static void +nbr_start_itimeout(struct nbr *nbr) +{ + struct timeval tv; + + timerclear(&tv); + tv.tv_sec = DEFAULT_KEEPALIVE; + if (evtimer_add(&nbr->init_timeout, &tv) == -1) + fatal(__func__); +} + +void +nbr_stop_itimeout(struct nbr *nbr) +{ + if (evtimer_pending(&nbr->init_timeout, NULL) && + evtimer_del(&nbr->init_timeout) == -1) + fatal(__func__); +} + /* Init delay timer: timer to retry to iniziatize session */ static void diff --git a/usr.sbin/ldpd/packet.c b/usr.sbin/ldpd/packet.c index f8a7f45549b..a804a7f7c24 100644 --- a/usr.sbin/ldpd/packet.c +++ b/usr.sbin/ldpd/packet.c @@ -1,4 +1,4 @@ -/* $OpenBSD: packet.c,v 1.62 2016/06/13 20:13:34 renato Exp $ */ +/* $OpenBSD: packet.c,v 1.63 2016/06/13 20:19:40 renato Exp $ */ /* * Copyright (c) 2013, 2016 Renato Westphal <renato@openbsd.org> @@ -648,6 +648,7 @@ session_close(struct nbr *nbr) tcp_close(nbr->tcp); nbr_stop_ktimer(nbr); nbr_stop_ktimeout(nbr); + nbr_stop_itimeout(nbr); } static ssize_t |