From 535252dc269885192b6a9e22352cefd23e483a28 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 12 Jan 2024 11:49:12 +0100 Subject: [PATCH] networkd: expose nsid via dbus --- man/org.freedesktop.network1.xml | 21 +++++++++++++++++++-- src/network/networkd-manager-bus.c | 26 ++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/man/org.freedesktop.network1.xml b/man/org.freedesktop.network1.xml index c6cadee177f..1d8ce0de811 100644 --- a/man/org.freedesktop.network1.xml +++ b/man/org.freedesktop.network1.xml @@ -87,6 +87,8 @@ node /org/freedesktop/network1 { readonly s OnlineState = '...'; @org.freedesktop.DBus.Property.EmitsChangedSignal("const") readonly t NamespaceId = ...; + @org.freedesktop.DBus.Property.EmitsChangedSignal("false") + readonly u NamespaceNSID = ...; }; interface org.freedesktop.DBus.Peer { ... }; interface org.freedesktop.DBus.Introspectable { ... }; @@ -148,8 +150,6 @@ node /org/freedesktop/network1 { - - @@ -212,11 +212,24 @@ node /org/freedesktop/network1 { + + Provides information about the manager. + + + Properties + + NamespaceId contains the inode number of the network namespace that the + network service runs in. A client may compare this with the inode number of its own network namespace + to verify whether the service manages the same network namespace. + + NamespaceNSID contains the "nsid" identifier the kernel maintains for the + network namespace, if there's one assigned. + @@ -584,5 +597,9 @@ $ gdbus introspect --system \ DHCPv6 Client Object State was added in version 255. + + Manager Object + NamespaceNSID was added in version 256. + diff --git a/src/network/networkd-manager-bus.c b/src/network/networkd-manager-bus.c index a8906f81c1b..035537c869a 100644 --- a/src/network/networkd-manager-bus.c +++ b/src/network/networkd-manager-bus.c @@ -279,6 +279,31 @@ static int property_get_namespace_id( return sd_bus_message_append(reply, "t", id); } +static int property_get_namespace_nsid( + sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + void *userdata, + sd_bus_error *error) { + + uint32_t nsid = UINT32_MAX; + int r; + + assert(bus); + assert(reply); + + /* Returns our own "nsid", which is another ID for the network namespace, different from the inode + * number. */ + + r = netns_get_nsid(/* netnsfd= */ -EBADF, &nsid); + if (r < 0) + log_warning_errno(r, "Failed to query network nsid, ignoring: %m"); + + return sd_bus_message_append(reply, "u", nsid); +} + static const sd_bus_vtable manager_vtable[] = { SD_BUS_VTABLE_START(0), @@ -289,6 +314,7 @@ static const sd_bus_vtable manager_vtable[] = { SD_BUS_PROPERTY("IPv6AddressState", "s", property_get_address_state, offsetof(Manager, ipv6_address_state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), SD_BUS_PROPERTY("OnlineState", "s", property_get_online_state, offsetof(Manager, online_state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), SD_BUS_PROPERTY("NamespaceId", "t", property_get_namespace_id, 0, SD_BUS_VTABLE_PROPERTY_CONST), + SD_BUS_PROPERTY("NamespaceNSID", "u", property_get_namespace_nsid, 0, 0), SD_BUS_METHOD_WITH_ARGS("ListLinks", SD_BUS_NO_ARGS,