network_manager: Don't log errors for ignored interfaces

We currently print errors for interfaces we have ignored when neighbors
and addresses get added.

Change-Id: I58d643db8801837d603f807b1b12e80580ce390b
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/network_manager.cpp b/src/network_manager.cpp
index 3dd171a..2634e11 100644
--- a/src/network_manager.cpp
+++ b/src/network_manager.cpp
@@ -131,6 +131,13 @@
 
 void Manager::createInterface(const UndiscoveredInfo& info, bool enabled)
 {
+    if (!info.intf.name)
+    {
+        auto msg = fmt::format("Can't create interface without name: {}",
+                               info.intf.idx);
+        log<level::ERR>(msg.c_str(), entry("IFIDX=%u", info.intf.idx));
+        return;
+    }
     removeInterface(info.intf);
     config::Parser config(config::pathForIntfConf(confDir, *info.intf.name));
     auto intf = std::make_unique<EthernetInterface>(
@@ -148,18 +155,24 @@
 {
     if (info.flags & IFF_LOOPBACK)
     {
+        ignoredIntf.emplace(info.idx);
         return;
     }
-    if (!info.name)
+    if (info.name)
     {
-        throw std::invalid_argument("Interface missing name");
-    }
-    const auto& ignored = internal::getIgnoredInterfaces();
-    if (ignored.find(*info.name) != ignored.end())
-    {
-        auto msg = fmt::format("Ignoring interface {}\n", *info.name);
-        log<level::INFO>(msg.c_str());
-        return;
+        const auto& ignored = internal::getIgnoredInterfaces();
+        if (ignored.find(*info.name) != ignored.end())
+        {
+            static std::unordered_set<std::string> ignored;
+            if (!ignored.contains(*info.name))
+            {
+                ignored.emplace(*info.name);
+                auto msg = fmt::format("Ignoring interface {}\n", *info.name);
+                log<level::INFO>(msg.c_str());
+            }
+            ignoredIntf.emplace(info.idx);
+            return;
+        }
     }
 
     auto it = systemdNetworkdEnabled.find(info.idx);
@@ -207,6 +220,7 @@
     else
     {
         undiscoveredIntfInfo.erase(info.idx);
+        ignoredIntf.erase(info.idx);
     }
     if (nit != interfaces.end())
     {
@@ -229,7 +243,7 @@
     {
         it->second.addrs.insert_or_assign(info.ifaddr, info);
     }
-    else
+    else if (!ignoredIntf.contains(info.ifidx))
     {
         throw std::runtime_error(
             fmt::format("Interface `{}` not found for addr", info.ifidx));
@@ -264,7 +278,7 @@
     {
         it->second.staticNeighs.insert_or_assign(*info.addr, info);
     }
-    else
+    else if (!ignoredIntf.contains(info.ifidx))
     {
         throw std::runtime_error(
             fmt::format("Interface `{}` not found for neigh", info.ifidx));
@@ -331,7 +345,7 @@
             },
             addr);
     }
-    else
+    else if (!ignoredIntf.contains(ifidx))
     {
         auto msg = fmt::format("Interface `{}` not found for gw", ifidx);
         log<level::ERR>(msg.c_str(), entry("IFIDX=%u", ifidx));