network_manager: Add addresses to undiscovered interfaces
This will make it possible to disable IP dumping on the creation of
every interface.
Change-Id: I0c310e5f84e363ca8e7efe477626edd191729a27
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/ethernet_interface.cpp b/src/ethernet_interface.cpp
index 0408219..bc33243 100644
--- a/src/ethernet_interface.cpp
+++ b/src/ethernet_interface.cpp
@@ -9,7 +9,6 @@
#include <fmt/compile.h>
#include <fmt/format.h>
-#include <linux/if_addr.h>
#include <linux/neighbour.h>
#include <linux/rtnetlink.h>
#include <net/if.h>
@@ -172,10 +171,6 @@
void EthernetInterface::addAddr(const AddressInfo& info)
{
- if (info.flags & IFA_F_DEPRECATED)
- {
- return;
- }
IP::AddressOrigin origin = IP::AddressOrigin::Static;
if (dhcpIsEnabled(info.ifaddr.getAddr()))
{
@@ -206,7 +201,7 @@
addrs.clear();
for (const auto& addr : system::getAddresses({.ifidx = ifIdx}))
{
- addAddr(addr);
+ manager.addAddress(addr);
}
}
diff --git a/src/network_manager.cpp b/src/network_manager.cpp
index 62ca491..cdbade9 100644
--- a/src/network_manager.cpp
+++ b/src/network_manager.cpp
@@ -8,6 +8,7 @@
#include "types.hpp"
#include "util.hpp"
+#include <linux/if_addr.h>
#include <net/if.h>
#include <filesystem>
@@ -227,14 +228,37 @@
void Manager::addAddress(const AddressInfo& info)
{
- getIntfOrLog(interfacesByIdx, info.ifidx,
- [&](auto& intf) { intf.addAddr(info); });
+ if (info.flags & IFA_F_DEPRECATED)
+ {
+ return;
+ }
+ if (auto it = interfacesByIdx.find(info.ifidx); it != interfacesByIdx.end())
+ {
+ it->second->addAddr(info);
+ }
+ else if (auto it = undiscoveredIntfInfo.find(info.ifidx);
+ it != undiscoveredIntfInfo.end())
+ {
+ it->second.addrs.insert_or_assign(info.ifaddr, info);
+ }
+ else
+ {
+ throw std::runtime_error(
+ fmt::format("Interface `{}` not found for addr", info.ifidx));
+ }
}
void Manager::removeAddress(const AddressInfo& info)
{
- getIntfOrLog(interfacesByIdx, info.ifidx,
- [&](auto& intf) { intf.addrs.erase(info.ifaddr); });
+ if (auto it = interfacesByIdx.find(info.ifidx); it != interfacesByIdx.end())
+ {
+ it->second->addrs.erase(info.ifaddr);
+ }
+ else if (auto it = undiscoveredIntfInfo.find(info.ifidx);
+ it != undiscoveredIntfInfo.end())
+ {
+ it->second.addrs.erase(info.ifaddr);
+ }
}
void Manager::addNeighbor(const NeighborInfo& info)