From: Michael Tremer Date: Fri, 14 Apr 2023 13:06:25 +0000 (+0000) Subject: networkd: Try to reconfigure all ports and zones on startup X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b9769b09ea2943e4b212806c11f31f14f627b08f;p=network.git networkd: Try to reconfigure all ports and zones on startup Signed-off-by: Michael Tremer --- diff --git a/src/networkd/daemon.c b/src/networkd/daemon.c index 925b2070..c6dad91e 100644 --- a/src/networkd/daemon.c +++ b/src/networkd/daemon.c @@ -291,6 +291,37 @@ static int nw_daemon_enumerate(nw_daemon* daemon) { return 0; } +static int __nw_daemon_reconfigure(sd_event_source* s, void* data) { + nw_daemon* daemon = (nw_daemon*)data; + int r; + + DEBUG("Reconfiguring...\n"); + + // Reconfigure all zones + r = nw_zones_reconfigure(daemon->zones); + if (r) + return r; + + // Reconfigure all ports + r = nw_ports_reconfigure(daemon->ports); + if (r) + return r; + + return 0; +} + +static int nw_daemon_reconfigure(nw_daemon* daemon) { + int r; + + r = sd_event_add_defer(daemon->loop, NULL, __nw_daemon_reconfigure, daemon); + if (r) { + ERROR("Could not schedule re-configuration task: %m\n"); + return r; + } + + return 0; +} + static int nw_daemon_setup(nw_daemon* daemon) { int r; @@ -324,6 +355,11 @@ static int nw_daemon_setup(nw_daemon* daemon) { if (r) return r; + // (Re-)configure everything + r = nw_daemon_reconfigure(daemon); + if (r) + return r; + return 0; } diff --git a/src/networkd/port.c b/src/networkd/port.c index 3c4f0b3e..ec40830f 100644 --- a/src/networkd/port.c +++ b/src/networkd/port.c @@ -263,6 +263,10 @@ const nw_address_t* nw_port_get_address(nw_port* port) { return &port->address; } +int nw_port_reconfigure(nw_port* port) { + return 0; // XXX TODO +} + int nw_port_has_carrier(nw_port* port) { if (!port->link) return 0; diff --git a/src/networkd/port.h b/src/networkd/port.h index 33241ed9..17c8c3cd 100644 --- a/src/networkd/port.h +++ b/src/networkd/port.h @@ -46,6 +46,8 @@ char* nw_port_bus_path(nw_port* port); const nw_address_t* nw_port_get_address(nw_port* port); +int nw_port_reconfigure(nw_port* port); + int nw_port_has_carrier(nw_port* port); #endif /* NETWORKD_PORT_H */ diff --git a/src/networkd/ports.c b/src/networkd/ports.c index a87ca033..87135d8c 100644 --- a/src/networkd/ports.c +++ b/src/networkd/ports.c @@ -222,3 +222,24 @@ ERROR: return 1; } + +int nw_ports_walk(nw_ports* ports, nw_ports_walk_callback callback, void* data) { + struct nw_ports_entry* entry = NULL; + int r; + + STAILQ_FOREACH(entry, &ports->entries, nodes) { + r = callback(ports->daemon, entry->port, data); + if (r) + return r; + } + + return 0; +} + +static int __nw_ports_reconfigure(nw_daemon* daemon, nw_port* port, void* data) { + return nw_port_reconfigure(port); +} + +int nw_ports_reconfigure(nw_ports* ports) { + return nw_ports_walk(ports, __nw_ports_reconfigure, NULL); +} diff --git a/src/networkd/ports.h b/src/networkd/ports.h index 40c9ae18..68ae532f 100644 --- a/src/networkd/ports.h +++ b/src/networkd/ports.h @@ -23,6 +23,8 @@ typedef struct nw_ports nw_ports; +typedef int (*nw_ports_walk_callback)(nw_daemon* daemon, nw_port* port, void* data); + #include "daemon.h" int nw_ports_create(nw_ports** ports, nw_daemon* daemon); @@ -38,4 +40,8 @@ struct nw_port* nw_ports_get_by_name(nw_ports* ports, const char* name); int nw_ports_bus_paths(nw_ports* ports, char*** paths); +int nw_ports_walk(nw_ports* ports, nw_ports_walk_callback callback, void* data); + +int nw_ports_reconfigure(nw_ports* ports); + #endif /* NETWORKD_PORTS_H */ diff --git a/src/networkd/zone.c b/src/networkd/zone.c index 4fda1e5f..9daa0d3d 100644 --- a/src/networkd/zone.c +++ b/src/networkd/zone.c @@ -184,6 +184,10 @@ static nw_link* nw_zone_get_link(nw_zone* zone) { return nw_link_ref(zone->link); } +int nw_zone_reconfigure(nw_zone* zone) { + return 0; // XXX TODO +} + // Carrier int nw_zone_has_carrier(nw_zone* zone) { diff --git a/src/networkd/zone.h b/src/networkd/zone.h index f5a2355e..591e467d 100644 --- a/src/networkd/zone.h +++ b/src/networkd/zone.h @@ -41,6 +41,8 @@ const char* nw_zone_name(nw_zone* zone); char* nw_zone_bus_path(nw_zone* zone); +int nw_zone_reconfigure(nw_zone* zone); + int nw_zone_has_carrier(nw_zone* zone); /* diff --git a/src/networkd/zones.c b/src/networkd/zones.c index 521da51d..84a6673e 100644 --- a/src/networkd/zones.c +++ b/src/networkd/zones.c @@ -252,3 +252,11 @@ int nw_zones_walk(nw_zones* zones, nw_zones_walk_callback callback, void* data) return 0; } + +static int __nw_zones_reconfigure(nw_daemon* daemon, nw_zone* zone, void* data) { + return nw_zone_reconfigure(zone); +} + +int nw_zones_reconfigure(nw_zones* zones) { + return nw_zones_walk(zones, __nw_zones_reconfigure, NULL); +} diff --git a/src/networkd/zones.h b/src/networkd/zones.h index 019955e7..ad39fd27 100644 --- a/src/networkd/zones.h +++ b/src/networkd/zones.h @@ -44,4 +44,6 @@ int nw_zones_bus_paths(nw_zones* zones, char*** paths); int nw_zones_walk(nw_zones* zones, nw_zones_walk_callback callback, void* data); +int nw_zones_reconfigure(nw_zones* zones); + #endif /* NETWORKD_ZONES_H */