From: Michael Tremer Date: Sat, 11 Feb 2023 14:10:16 +0000 (+0000) Subject: networkd: Add method to fetch corresponding link to port X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=30d4ab67ce9936c6668d93229c8cc808c725338c;p=network.git networkd: Add method to fetch corresponding link to port Signed-off-by: Michael Tremer --- diff --git a/src/networkd/daemon.c b/src/networkd/daemon.c index 795a8b76..c4acff55 100644 --- a/src/networkd/daemon.c +++ b/src/networkd/daemon.c @@ -448,6 +448,13 @@ struct nw_link* nw_daemon_get_link_by_ifindex(struct nw_daemon* daemon, int ifin return nw_links_get_by_ifindex(daemon->links, ifindex); } +struct nw_link* nw_daemon_get_link_by_name(struct nw_daemon* daemon, const char* name) { + if (!daemon->links) + return NULL; + + return nw_links_get_by_name(daemon->links, name); +} + /* Ports */ diff --git a/src/networkd/daemon.h b/src/networkd/daemon.h index e08537e8..a40dd60d 100644 --- a/src/networkd/daemon.h +++ b/src/networkd/daemon.h @@ -48,6 +48,7 @@ sd_netlink* nw_daemon_get_rtnl(struct nw_daemon* daemon); struct nw_links* nw_daemon_links(struct nw_daemon* daemon); void nw_daemon_drop_link(struct nw_daemon* daemon, struct nw_link* link); struct nw_link* nw_daemon_get_link_by_ifindex(struct nw_daemon* daemon, int ifindex); +struct nw_link* nw_daemon_get_link_by_name(struct nw_daemon* daemon, const char* name); /* Ports diff --git a/src/networkd/link.h b/src/networkd/link.h index e482d71a..72ddfa99 100644 --- a/src/networkd/link.h +++ b/src/networkd/link.h @@ -21,16 +21,17 @@ #ifndef NETWORKD_LINK_H #define NETWORKD_LINK_H -#include "daemon.h" - struct nw_link; +#include "daemon.h" + 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_ifindex(struct nw_link* link); +const char* nw_link_name(struct nw_link* link); int nw_link_process(sd_netlink* rtnl, sd_netlink_message* message, void* data); diff --git a/src/networkd/links.c b/src/networkd/links.c index 044a27dc..7aa83a31 100644 --- a/src/networkd/links.c +++ b/src/networkd/links.c @@ -20,6 +20,7 @@ #include #include +#include #include #include "daemon.h" @@ -192,3 +193,17 @@ struct nw_link* nw_links_get_by_ifindex(struct nw_links* links, int ifindex) { return nw_link_ref(entry->link); } + +struct nw_link* nw_links_get_by_name(struct nw_links* links, const char* name) { + struct nw_links_entry* entry = NULL; + + STAILQ_FOREACH(entry, &links->entries, nodes) { + const char* n = nw_link_name(entry->link); + + if (strcmp(name, n) == 0) + return nw_link_ref(entry->link); + } + + // No match found + return NULL; +} diff --git a/src/networkd/links.h b/src/networkd/links.h index 2f2bbeab..2b5c7876 100644 --- a/src/networkd/links.h +++ b/src/networkd/links.h @@ -37,5 +37,6 @@ void nw_links_drop_link(struct nw_links* links, struct nw_link* link); int nw_links_enumerate(struct nw_links* links); struct nw_link* nw_links_get_by_ifindex(struct nw_links* links, int ifindex); +struct nw_link* nw_links_get_by_name(struct nw_links* links, const char* name); #endif /* NETWORKD_LINKS_H */ diff --git a/src/networkd/port.c b/src/networkd/port.c index e59e7606..33e75d70 100644 --- a/src/networkd/port.c +++ b/src/networkd/port.c @@ -27,11 +27,13 @@ #include "address.h" #include "config.h" +#include "link.h" #include "logging.h" #include "string.h" #include "port.h" struct nw_port { + struct nw_daemon* daemon; int nrefs; char name[IF_NAMESIZE]; @@ -66,6 +68,8 @@ static nw_port_type_t nw_port_type_from_string(const char* s) { static void nw_port_free(struct nw_port* port) { if (port->config) nw_config_unref(port->config); + if (port->daemon) + nw_daemon_unref(port->daemon); free(port); } @@ -163,7 +167,7 @@ static int nw_port_setup(struct nw_port* port) { return 0; } -int nw_port_create(struct nw_port** port, const char* name) { +int nw_port_create(struct nw_port** port, struct nw_daemon* daemon, const char* name) { int r; // Allocate a new object @@ -171,6 +175,9 @@ int nw_port_create(struct nw_port** port, const char* name) { if (!p) return 1; + // Store a reference to the daemon + p->daemon = nw_daemon_ref(daemon); + // Initialize reference counter p->nrefs = 1; @@ -222,6 +229,10 @@ char* nw_port_bus_path(struct nw_port* port) { return p; } +static struct nw_link* nw_port_get_link(struct nw_port* port) { + return nw_daemon_get_link_by_name(port->daemon, port->name); +} + const nw_address_t* nw_port_get_address(struct nw_port* port) { return &port->address; } diff --git a/src/networkd/port.h b/src/networkd/port.h index caf1433b..92d60b29 100644 --- a/src/networkd/port.h +++ b/src/networkd/port.h @@ -31,8 +31,9 @@ typedef enum nw_port_type { struct nw_port; #include "address.h" +#include "daemon.h" -int nw_port_create(struct nw_port** port, const char* name); +int nw_port_create(struct nw_port** port, struct nw_daemon* daemon, const char* name); struct nw_port* nw_port_ref(struct nw_port* port); struct nw_port* nw_port_unref(struct nw_port* port); diff --git a/src/networkd/ports.c b/src/networkd/ports.c index 24bd2579..9cec1115 100644 --- a/src/networkd/ports.c +++ b/src/networkd/ports.c @@ -138,7 +138,7 @@ static int __nw_ports_enumerate(const char* path, const struct stat* s, void* da return 0; // Create a new port - r = nw_port_create(&port, name); + r = nw_port_create(&port, ports->daemon, name); if (r) goto ERROR;