summaryrefslogtreecommitdiff
path: root/src/ipcpd/unicast/routing.c
diff options
context:
space:
mode:
authorDimitri Staessens <dimitri@ouroboros.rocks>2025-08-10 10:25:34 +0200
committerSander Vrijders <sander@ouroboros.rocks>2025-08-11 10:09:24 +0200
commit2fd016776bca60e0a2bff69a9f130e4c3415bb4c (patch)
treee419d213846d3206ae4c0ebbb1cb8d0ebfa25491 /src/ipcpd/unicast/routing.c
parent10f70a0ab27c8b80b1dcb501147d64a851e7ad06 (diff)
downloadouroboros-2fd016776bca60e0a2bff69a9f130e4c3415bb4c.tar.gz
ouroboros-2fd016776bca60e0a2bff69a9f130e4c3415bb4c.zip
ipcpd: Fix shutdown of link-state routing
The link_state component tried to unregister from the notifier while it had threads running. The deadlock happens when notifier_event had a rdlock trying to delete a neighbour, while notifier_unreg tries to take the write lock. And the delete can't complete in the notifier. https://tree.taiga.io/project/dstaesse-ouroboros/us/113 We need to make sure that all threads are stopped before unregistering from the notifier. Updated link_state to use the start/stop() paradigm and not create/cancel threads within init/fini(). Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks> Signed-off-by: Sander Vrijders <sander@ouroboros.rocks>
Diffstat (limited to 'src/ipcpd/unicast/routing.c')
-rw-r--r--src/ipcpd/unicast/routing.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/ipcpd/unicast/routing.c b/src/ipcpd/unicast/routing.c
index f5417c24..4efc3ea6 100644
--- a/src/ipcpd/unicast/routing.c
+++ b/src/ipcpd/unicast/routing.c
@@ -57,6 +57,11 @@ int routing_init(enum pol_routing pr)
return pff_type;
}
+int routing_start(void)
+{
+ return r_ops->start();
+}
+
struct routing_i * routing_i_create(struct pff * pff)
{
return r_ops->routing_i_create(pff);
@@ -67,6 +72,11 @@ void routing_i_destroy(struct routing_i * instance)
return r_ops->routing_i_destroy(instance);
}
+void routing_stop(void)
+{
+ r_ops->stop();
+}
+
void routing_fini(void)
{
r_ops->fini();