]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Protocol: State announcements must be always processed before leaving the loop
authorKaterina Kubecova <katerina.kubecova@nic.cz>
Thu, 18 Sep 2025 09:21:41 +0000 (11:21 +0200)
committerMaria Matejka <mq@ucw.cz>
Mon, 22 Sep 2025 10:45:25 +0000 (12:45 +0200)
When using PROTO_LOCKED_FROM_MAIN or other birdloop_enter, there may be
deferred state announcements which have to be sent immediately,
otherwise the main loop would try to execute them out of the appropriate
locked context.

nest/protocol.h

index f5d8a757181bf10fd4217212e983a82f7710d5a8..036e91b48cc020d04aac6e50b3b0385e3660ca2a 100644 (file)
@@ -303,7 +303,8 @@ struct proto_reload_request {
 
 #define PROTO_LEAVE_FROM_MAIN(loop) ({ if (loop != &main_birdloop) birdloop_leave(loop); })
 
-#define PROTO_LOCKED_FROM_MAIN(p)      for (struct birdloop *_proto_loop = PROTO_ENTER_FROM_MAIN(p); _proto_loop; PROTO_LEAVE_FROM_MAIN(_proto_loop), (_proto_loop = NULL))
+#define PROTO_LOCKED_FROM_MAIN(p)      for (struct birdloop *_proto_loop = PROTO_ENTER_FROM_MAIN(p); _proto_loop; \
+proto_announce_state((p), (p)->ea_state), PROTO_LEAVE_FROM_MAIN(_proto_loop), (_proto_loop = NULL))
 
 static inline struct domain_generic *proto_domain(struct proto *p)
 { return birdloop_domain(p->loop); }