ethernet_interface: Fix VLAN delete
This ensures that we delete the interface in the correct order with
reloads.
Change-Id: I6fec890b112b62be15256af415a6df1bfb6ccd38
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/ethernet_interface.cpp b/src/ethernet_interface.cpp
index 2e42e7f..2e1e252 100644
--- a/src/ethernet_interface.cpp
+++ b/src/ethernet_interface.cpp
@@ -888,6 +888,14 @@
std::filesystem::remove(config::pathForIntfConf(confDir, intf), ec);
std::filesystem::remove(config::pathForIntfDev(confDir, intf), ec);
+ if (eth.ifIdx > 0)
+ {
+ eth.manager.interfacesByIdx.erase(eth.ifIdx);
+ }
+ auto it = eth.manager.interfaces.find(intf);
+ auto obj = std::move(it->second);
+ eth.manager.interfaces.erase(it);
+
// Write an updated parent interface since it has a VLAN entry
for (const auto& [_, intf] : eth.manager.interfaces)
{
@@ -900,11 +908,14 @@
if (eth.ifIdx > 0)
{
// We need to forcibly delete the interface as systemd does not
- system::deleteIntf(eth.ifIdx);
+ eth.manager.addReloadPostHook(
+ [idx = eth.ifIdx]() { system::deleteIntf(idx); });
- eth.manager.interfacesByIdx.erase(eth.ifIdx);
+ // Ignore the interface so the reload doesn't re-query it
+ eth.manager.ignoredIntf.emplace(eth.ifIdx);
}
- eth.manager.interfaces.erase(intf);
+
+ eth.manager.reloadConfigs();
}
} // namespace network