From eaf649ee9bdfa7e20ba381a505e2c5b48501c242 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 9 Feb 2023 20:41:02 +0000 Subject: [PATCH] networkd: Enumerate all links on startup Signed-off-by: Michael Tremer --- src/networkd/daemon.c | 16 +++++++++------- src/networkd/daemon.h | 7 +++++++ src/networkd/link.c | 7 +++++++ src/networkd/link.h | 2 ++ src/networkd/links.c | 39 +++++++++++++++++++++++++++++++++++++-- 5 files changed, 62 insertions(+), 9 deletions(-) diff --git a/src/networkd/daemon.c b/src/networkd/daemon.c index 27b118e9..88ce8e71 100644 --- a/src/networkd/daemon.c +++ b/src/networkd/daemon.c @@ -31,6 +31,7 @@ #include "config.h" #include "daemon.h" #include "devmon.h" +#include "link.h" #include "links.h" #include "logging.h" #include "zone.h" @@ -193,12 +194,6 @@ static int nw_start_device_monitor(struct nw_daemon* daemon) { return 0; } -static int _rtnl_dummy(sd_netlink* rtnl, sd_netlink_message* message, void* data) { - DEBUG("_rtnl_dummy called\n"); - - return 0; -} - static int nw_daemon_connect_rtnl(struct nw_daemon* daemon, int fd) { int r; @@ -224,7 +219,7 @@ static int nw_daemon_connect_rtnl(struct nw_daemon* daemon, int fd) { } // Register callback for new interfaces - r = sd_netlink_add_match(daemon->rtnl, NULL, RTM_NEWLINK, _rtnl_dummy, NULL, + r = sd_netlink_add_match(daemon->rtnl, NULL, RTM_NEWLINK, nw_link_process, NULL, daemon, "networkd-RTM_NEWLINK"); if (r < 0) { ERROR("Could not register RTM_NEWLINK: %m\n"); @@ -394,6 +389,13 @@ int nw_daemon_reload(struct nw_daemon* daemon) { return 0; } +/* + Netlink +*/ +sd_netlink* nw_daemon_get_rtnl(struct nw_daemon* daemon) { + return daemon->rtnl; +} + /* Zones */ diff --git a/src/networkd/daemon.h b/src/networkd/daemon.h index 891c297a..543685f5 100644 --- a/src/networkd/daemon.h +++ b/src/networkd/daemon.h @@ -21,6 +21,8 @@ #ifndef NETWORKD_DAEMON_H #define NETWORKD_DAEMON_H +#include + #include "zone.h" struct nw_daemon; @@ -34,6 +36,11 @@ int nw_daemon_run(struct nw_daemon* daemon); int nw_daemon_reload(struct nw_daemon* daemon); +/* + Netlink +*/ +sd_netlink* nw_daemon_get_rtnl(struct nw_daemon* daemon); + /* Zones */ diff --git a/src/networkd/link.c b/src/networkd/link.c index 06e31017..ec0593b0 100644 --- a/src/networkd/link.c +++ b/src/networkd/link.c @@ -23,6 +23,7 @@ #include "daemon.h" #include "link.h" +#include "logging.h" struct nw_link { struct nw_daemon* daemon; @@ -70,3 +71,9 @@ struct nw_link* nw_link_unref(struct nw_link* link) { nw_link_free(link); return NULL; } + +int nw_link_process(sd_netlink* rtnl, sd_netlink_message* message, void* data) { + DEBUG("nw_link_process called\n"); + + return 0; +} diff --git a/src/networkd/link.h b/src/networkd/link.h index 6ffe843c..6003133d 100644 --- a/src/networkd/link.h +++ b/src/networkd/link.h @@ -30,4 +30,6 @@ int nw_link_create(struct nw_link** link, struct nw_daemon* daemon, int ifindex) struct nw_link* nw_link_ref(struct nw_link* link); struct nw_link* nw_link_unref(struct nw_link* link); +int nw_link_process(sd_netlink* rtnl, sd_netlink_message* message, void* data); + #endif /* NETWORKD_LINK_H */ diff --git a/src/networkd/links.c b/src/networkd/links.c index b81d6a59..22584f2f 100644 --- a/src/networkd/links.c +++ b/src/networkd/links.c @@ -99,7 +99,42 @@ struct nw_links* nw_links_unref(struct nw_links* links) { } int nw_links_enumerate(struct nw_links* links) { - // TODO + sd_netlink_message* req = NULL; + sd_netlink_message* res = NULL; + int r; - return 0; + sd_netlink* rtnl = nw_daemon_get_rtnl(links->daemon); + if (!rtnl) + return 1; + + r = sd_rtnl_message_new_link(rtnl, &req, RTM_GETLINK, 0); + if (r < 0) + return 1; + + r = sd_netlink_message_set_request_dump(req, 1); + if (r < 0) + return 1; + + r = sd_netlink_call(rtnl, req, 0, &res); + if (r < 0) + return 1; + + sd_netlink_message* m = res; + + // Iterate through all replies + do { + r = nw_link_process(rtnl, m, links->daemon); + if (r) + goto ERROR; + } while ((m = sd_netlink_message_next(m))); + +ERROR: + if (m) + sd_netlink_message_unref(m); + if (req) + sd_netlink_message_unref(req); + if (res) + sd_netlink_message_unref(res); + + return r; } -- 2.47.3