network_manager: Support queueing additional interface data

This allows us to queue up all the interface properties before
systemd-networkd returns that it has managed the interface. Otherwise,
we will lose information about the addrs / routes / neighs on the
interface while waiting.

Change-Id: I9301f8e129fa51cf5e8d5a80235bf889841b076e
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/network_manager.cpp b/src/network_manager.cpp
index 2d7ce98..79a4e41 100644
--- a/src/network_manager.cpp
+++ b/src/network_manager.cpp
@@ -124,19 +124,19 @@
     }
 }
 
-void Manager::createInterface(const InterfaceInfo& info, bool enabled)
+void Manager::createInterface(const UndiscoveredInfo& info, bool enabled)
 {
-    removeInterface(info);
-    config::Parser config(config::pathForIntfConf(confDir, *info.name));
+    removeInterface(info.intf);
+    config::Parser config(config::pathForIntfConf(confDir, *info.intf.name));
     auto intf = std::make_unique<EthernetInterface>(
-        bus, *this, info, objectPath, config, true, enabled);
+        bus, *this, info.intf, objectPath, config, true, enabled);
     intf->createIPAddressObjects();
     intf->createStaticNeighborObjects();
     intf->loadNameServers(config);
     intf->loadNTPServers(config);
     auto ptr = intf.get();
-    interfaces.emplace(*info.name, std::move(intf));
-    interfacesByIdx.emplace(info.idx, ptr);
+    interfaces.insert_or_assign(*info.intf.name, std::move(intf));
+    interfacesByIdx.insert_or_assign(info.intf.idx, ptr);
 }
 
 void Manager::addInterface(const InterfaceInfo& info)
@@ -144,11 +144,12 @@
     auto it = systemdNetworkdEnabled.find(info.idx);
     if (it != systemdNetworkdEnabled.end())
     {
-        createInterface(info, it->second);
+        createInterface({info}, it->second);
     }
     else
     {
-        undiscoveredIntfInfo.insert_or_assign(info.idx, std::move(info));
+        undiscoveredIntfInfo.insert_or_assign(
+            info.idx, UndiscoveredInfo{std::move(info)});
     }
 }