From c403eb4c480316090d9ca3fd2915b1bf25ac10c0 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 15 Apr 2023 11:46:22 +0000 Subject: [PATCH] ports: Implement destroying a port Signed-off-by: Michael Tremer --- src/networkd/config.c | 12 ++++++++++ src/networkd/config.h | 2 ++ src/networkd/link.c | 2 ++ src/networkd/port.c | 54 +++++++++++++++++++++++++++++++++++++++++++ src/networkd/port.h | 3 +++ src/networkd/zone.c | 9 ++++++++ src/networkd/zone.h | 2 ++ 7 files changed, 84 insertions(+) diff --git a/src/networkd/config.c b/src/networkd/config.c index 27cfad8a..8269edeb 100644 --- a/src/networkd/config.c +++ b/src/networkd/config.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "config.h" #include "logging.h" @@ -135,6 +136,17 @@ nw_config* nw_config_unref(nw_config* config) { return NULL; } +int nw_config_destroy(nw_config* config) { + int r; + + // Drop all entries + r = nw_config_flush(config); + if (r) + return r; + + return unlink(config->path); +} + const char* nw_config_path(nw_config* config) { if (*config->path) return config->path; diff --git a/src/networkd/config.h b/src/networkd/config.h index 0b25f754..e17c0167 100644 --- a/src/networkd/config.h +++ b/src/networkd/config.h @@ -33,6 +33,8 @@ int nw_config_create(nw_config** config, const char* path); nw_config* nw_config_ref(nw_config* config); nw_config* nw_config_unref(nw_config* config); +int nw_config_destroy(nw_config* config); + const char* nw_config_path(nw_config* config); int nw_config_flush(nw_config* config); diff --git a/src/networkd/link.c b/src/networkd/link.c index 1edf20d7..603aabe8 100644 --- a/src/networkd/link.c +++ b/src/networkd/link.c @@ -308,12 +308,14 @@ static int nw_link_update_flags(nw_link* link, sd_netlink_message* message) { return 1; } +#if 0 // Fetch operstate r = sd_netlink_message_read_u8(message, IFLA_OPERSTATE, &operstate); if (r < 1) { ERROR("Could not read operstate: %m\n"); return 1; } +#endif // End here if there have been no changes if (link->flags == flags && link->operstate == operstate) diff --git a/src/networkd/port.c b/src/networkd/port.c index a240c611..23ffd0bd 100644 --- a/src/networkd/port.c +++ b/src/networkd/port.c @@ -314,6 +314,60 @@ nw_port* nw_port_unref(nw_port* port) { return NULL; } +int nw_port_destroy(nw_port* port) { + int r; + + DEBUG("Destroying port %s\n", port->name); + + // Destroy the physical link (if exists) + if (port->link) { + r = nw_link_destroy(port->link); + if (r) + return r; + } + + // Dereference the port from other ports + r = nw_daemon_ports_walk(port->daemon, __nw_port_drop_port, port); + if (r) + return r; + + // Dereference the port from other zones + r = nw_daemon_zones_walk(port->daemon, __nw_zone_drop_port, port); + if (r) + return r; + + // Destroy the configuration + r = nw_config_destroy(port->config); + if (r) + return r; + + // Reset type + port->type = NW_PORT_UNKNOWN; + + return 0; +} + +int __nw_port_drop_port(nw_daemon* daemon, nw_port* port, void* data) { + nw_port* dropped_port = (nw_port*)data; + int r; + + switch (port->type) { + case NW_PORT_VLAN: + if (port->vlan.parent == dropped_port) { + r = nw_port_set_vlan_parent(port, NULL); + if (r) + return r; + } + break; + + case NW_PORT_DUMMY: + case NW_PORT_UNKNOWN: + break; + } + + return 0; +} + static int nw_port_save_vlan(nw_port* port) { int r; diff --git a/src/networkd/port.h b/src/networkd/port.h index d89e1e06..032d82c7 100644 --- a/src/networkd/port.h +++ b/src/networkd/port.h @@ -47,6 +47,9 @@ int nw_port_create_from_config(nw_port** port, nw_daemon* daemon, nw_port* nw_port_ref(nw_port* port); nw_port* nw_port_unref(nw_port* port); +int nw_port_destroy(nw_port* port); +int __nw_port_drop_port(nw_daemon* daemon, nw_port* port, void* data); + int nw_port_save(nw_port* port); const char* nw_port_name(nw_port* port); diff --git a/src/networkd/zone.c b/src/networkd/zone.c index 3f47a26d..9f5b7f8c 100644 --- a/src/networkd/zone.c +++ b/src/networkd/zone.c @@ -183,6 +183,15 @@ nw_zone* nw_zone_unref(nw_zone* zone) { return NULL; } +int __nw_zone_drop_port(nw_daemon* daemon, nw_zone* zone, void* data) { + nw_port* dropped_port = (nw_port*)data; + + // XXX TODO + (void)dropped_port; + + return 0; +} + int nw_zone_save(nw_zone* zone) { int r; diff --git a/src/networkd/zone.h b/src/networkd/zone.h index 9737b459..480440fb 100644 --- a/src/networkd/zone.h +++ b/src/networkd/zone.h @@ -37,6 +37,8 @@ int nw_zone_create(nw_zone** zone, nw_daemon* daemon, const char* name); nw_zone* nw_zone_ref(nw_zone* zone); nw_zone* nw_zone_unref(nw_zone* zone); +int __nw_zone_drop_port(nw_daemon* daemon, nw_zone* zone, void* data); + int nw_zone_save(nw_zone* zone); const char* nw_zone_name(nw_zone* zone); -- 2.47.3