chiark / gitweb /
networkd: manager - refactor link tracking a bit
[elogind.git] / src / network / networkd-netdev.c
index ed4bc191f35e580862eaa8218feaa6897eeb0d51..7962cc6c6a75a36c32503ef6ac634193792e2ab7 100644 (file)
@@ -108,6 +108,21 @@ NetDev *netdev_ref(NetDev *netdev) {
         return netdev;
 }
 
+void netdev_drop(NetDev *netdev) {
+        if (!netdev || netdev->state == NETDEV_STATE_LINGER)
+                return;
+
+        netdev->state = NETDEV_STATE_LINGER;
+
+        log_debug_netdev(netdev, "dropped");
+
+        netdev_cancel_callbacks(netdev);
+
+        netdev_unref(netdev);
+
+        return;
+}
+
 int netdev_get(Manager *manager, const char *name, NetDev **ret) {
         NetDev *netdev;
 
@@ -204,8 +219,8 @@ static int netdev_create_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userda
         if (r == -EEXIST)
                 log_debug_netdev(netdev, "netdev exists, using existing");
         else if (r < 0) {
-                log_warning_netdev(netdev, "netdev failed: %s", strerror(-r));
-                netdev_enter_failed(netdev);
+                log_warning_netdev(netdev, "netdev could not be greated: %s", strerror(-r));
+                netdev_drop(netdev);
 
                 return 1;
         }