diff --git a/repos/pc/src/drivers/nic/pc/dummies.c b/repos/pc/src/drivers/nic/pc/dummies.c
index f0c497c675..e7d623850d 100644
--- a/repos/pc/src/drivers/nic/pc/dummies.c
+++ b/repos/pc/src/drivers/nic/pc/dummies.c
@@ -128,43 +128,6 @@ EXPORT_SYMBOL_GPL(bpf_master_redirect_enabled_key);
 DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_sibling_map);
 EXPORT_PER_CPU_SYMBOL(cpu_sibling_map);
 
-#include <net/rtnetlink.h>
-
-void rtnl_register(int protocol,int msgtype,rtnl_doit_func doit,rtnl_dumpit_func dumpit,unsigned int flags)
-{
-	lx_emul_trace(__func__);
-}
-
-#include <linux/rtnetlink.h>
-
-int rtnl_lock_killable(void)
-{
-	lx_emul_trace(__func__);
-	return 0;
-}
-
-#include <linux/rtnetlink.h>
-
-int rtnl_is_locked(void)
-{
-	lx_emul_trace(__func__);
-	return 0;
-}
-
-#include <linux/rtnetlink.h>
-
-void rtnl_lock(void)
-{
-	lx_emul_trace(__func__);
-}
-
-#include <linux/rtnetlink.h>
-
-void rtnl_unlock(void)
-{
-	lx_emul_trace(__func__);
-}
-
 #include <linux/netdevice.h>
 
 int __init dev_proc_init(void)
diff --git a/repos/pc/src/drivers/nic/pc/rtnetlink.c b/repos/pc/src/drivers/nic/pc/rtnetlink.c
new file mode 100644
index 0000000000..78c956d90d
--- /dev/null
+++ b/repos/pc/src/drivers/nic/pc/rtnetlink.c
@@ -0,0 +1,58 @@
+/*
+ * \brief  Basic RTNETLINK implementation with lock/unlock and netdev_run_todo()
+ * \author Christian Helmuth
+ * \date   2024-03-26
+ */
+
+/*
+ * Copyright (C) 2024 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#include <lx_emul.h>
+
+#include <net/rtnetlink.h>
+#include <linux/mutex.h>
+
+#include <../net/core/dev.h>
+
+
+static DEFINE_MUTEX(rtnl_mutex);
+
+void rtnl_register(int protocol,int msgtype,rtnl_doit_func doit,rtnl_dumpit_func dumpit,unsigned int flags)
+{
+}
+
+
+int rtnl_lock_killable(void)
+{
+	return mutex_lock_killable(&rtnl_mutex);
+}
+
+
+int rtnl_is_locked(void)
+{
+	return mutex_is_locked(&rtnl_mutex);
+}
+
+
+void rtnl_lock(void)
+{
+	mutex_lock(&rtnl_mutex);
+}
+
+
+void __rtnl_unlock(void)
+{
+	WARN_ON(!list_empty(&net_todo_list));
+
+	mutex_unlock(&rtnl_mutex);
+}
+
+
+void rtnl_unlock(void)
+{
+	netdev_run_todo();
+}
diff --git a/repos/pc/src/drivers/nic/pc/target.inc b/repos/pc/src/drivers/nic/pc/target.inc
index 8e45f4ff39..4c5430f0a5 100644
--- a/repos/pc/src/drivers/nic/pc/target.inc
+++ b/repos/pc/src/drivers/nic/pc/target.inc
@@ -7,6 +7,7 @@ SRC_C   += dummies.c
 SRC_C   += lx_emul.c
 SRC_C   += lx_emul/common_dummies.c
 SRC_C   += lx_user.c
+SRC_C   += rtnetlink.c
 
 vpath %.c  $(REP_DIR)/src/lib/pc
 vpath %.cc $(REP_DIR)/src/lib/pc