From: Maria Matejka Date: Tue, 31 Jan 2023 12:11:55 +0000 (+0100) Subject: Moved interface list flush to device protocol cleanup hook. X-Git-Tag: v3.0-alpha1~49^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e077d0e770f00c98f26ee6b3cdb7905bf9bea4c1;p=thirdparty%2Fbird.git Moved interface list flush to device protocol cleanup hook. The interface list must be flushed when device protocol is stopped. This was done in a hardcoded specific hook inside generic protocol routines. The cleanup hook was originally used for table reference counting late cleanup, yet it can be also simply used for prettier interface list flush. --- diff --git a/nest/iface.c b/nest/iface.c index fc896e266..fc63dc750 100644 --- a/nest/iface.c +++ b/nest/iface.c @@ -386,15 +386,6 @@ if_end_update(void) } } -void -if_flush_ifaces(struct proto *p) -{ - if (p->debug & D_EVENTS) - log(L_TRACE "%s: Flushing interfaces", p->name); - if_start_update(); - if_end_update(); -} - /** * if_feed_baby - advertise interfaces to a new protocol * @p: protocol to feed diff --git a/nest/iface.h b/nest/iface.h index 13f3bd12e..287f3d963 100644 --- a/nest/iface.h +++ b/nest/iface.h @@ -114,7 +114,6 @@ void ifa_delete(struct ifa *); void if_start_update(void); void if_end_partial_update(struct iface *); void if_end_update(void); -void if_flush_ifaces(struct proto *p); void if_feed_baby(struct proto *); struct iface *if_find_by_index(unsigned); struct iface *if_find_by_name(const char *); diff --git a/nest/proto.c b/nest/proto.c index 26d648f37..0ca72ead2 100644 --- a/nest/proto.c +++ b/nest/proto.c @@ -968,11 +968,8 @@ proto_event(void *ptr) if (p->do_stop) { - if (p->proto == &proto_unix_iface) - if_flush_ifaces(p); p->do_stop = 0; } - if (proto_is_done(p)) { if (p->proto->cleanup) @@ -1863,8 +1860,6 @@ proto_do_stop(struct proto *p) p->down_sched = 0; p->gr_recovery = 0; - p->do_stop = 1; - ev_schedule(p->event); if (p->main_source) { @@ -1873,6 +1868,9 @@ proto_do_stop(struct proto *p) } proto_stop_channels(p); + + p->do_stop = 1; + ev_schedule(p->event); } static void diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c index 9f95247fe..7ec30eb0a 100644 --- a/sysdep/unix/krt.c +++ b/sysdep/unix/krt.c @@ -163,6 +163,15 @@ kif_shutdown(struct proto *P) return PS_DOWN; } +static void +kif_cleanup(struct proto *p) +{ + if (p->debug & D_EVENTS) + log(L_TRACE "%s: Flushing interfaces", p->name); + if_start_update(); + if_end_update(); +} + static int kif_reconfigure(struct proto *p, struct proto_config *new) { @@ -239,6 +248,7 @@ struct protocol proto_unix_iface = { .init = kif_init, .start = kif_start, .shutdown = kif_shutdown, + .cleanup = kif_cleanup, .reconfigure = kif_reconfigure, .copy_config = kif_copy_config };