Remove RA timer on an interface with !IFF_UP actively after starting to send

clean-up RA messages for shutting down.  The RA timers could prevent the rtadvd
daemon from shutting down because ra_output() just ignored !IFF_UP interfaces
and TRANSITIVE->UNCONFIGURED state transition never happened due to it.

Spotted by:	kib
Approved by:	re (bz)
This commit is contained in:
Hiroki Sato 2011-09-20 00:32:30 +00:00
parent 6090ab8bd6
commit 8cdd0a8091
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=225683

View File

@ -380,6 +380,21 @@ rtadvd_shutdown(void)
syslog(LOG_INFO,
"waiting expiration of the all RA timers.");
TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
/*
* Ignore !IFF_UP interfaces in waiting for shutdown.
*/
if (!(ifi->ifi_flags & IFF_UP) &&
ifi->ifi_ra_timer != NULL) {
ifi->ifi_state = IFI_STATE_UNCONFIGURED;
rtadvd_remove_timer(ifi->ifi_ra_timer);
ifi->ifi_ra_timer = NULL;
syslog(LOG_DEBUG, "<%s> %s(idx=%d) is down. "
"Timer removed and marked as UNCONFIGURED.",
__func__, ifi->ifi_ifname,
ifi->ifi_ifindex);
}
}
TAILQ_FOREACH(ifi, &ifilist, ifi_next) {
if (ifi->ifi_ra_timer != NULL)
break;