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/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)