chiark / gitweb /
log: add an "error" parameter to all low-level logging calls and intrdouce log_error_...
[elogind.git] / src / network / networkd-netdev.c
index 825b86d2a7f4bccd35c214f09ed6dff5335080ca..bdb0b888a0e57ff0e2abbda8914cb9dde1ffda1b 100644 (file)
@@ -65,7 +65,6 @@ static const char* const netdev_kind_table[_NETDEV_KIND_MAX] = {
 DEFINE_STRING_TABLE_LOOKUP(netdev_kind, NetDevKind);
 DEFINE_CONFIG_PARSE_ENUM(config_parse_netdev_kind, netdev_kind, NetDevKind, "Failed to parse netdev kind");
 
-
 static void netdev_cancel_callbacks(NetDev *netdev) {
         _cleanup_rtnl_message_unref_ sd_rtnl_message *m = NULL;
         netdev_join_callback *callback;
@@ -445,13 +444,17 @@ int netdev_get_mac(const char *ifname, struct ether_addr **ret) {
         return 0;
 }
 
-static int netdev_create(NetDev *netdev, Link *link) {
+static int netdev_create(NetDev *netdev, Link *link,
+                         sd_rtnl_message_handler_t callback) {
         int r;
 
         assert(netdev);
+        assert(!link || callback);
 
         /* create netdev */
         if (NETDEV_VTABLE(netdev)->create) {
+                assert(!link);
+
                 r = NETDEV_VTABLE(netdev)->create(netdev);
                 if (r < 0)
                         return r;
@@ -546,14 +549,30 @@ static int netdev_create(NetDev *netdev, Link *link) {
                 }
 
 
-                r = sd_rtnl_call_async(netdev->manager->rtnl, m, netdev_create_handler, netdev, 0, NULL);
-                if (r < 0) {
-                        log_error_netdev(netdev,
-                                         "Could not send rtnetlink message: %s", strerror(-r));
-                        return r;
-                }
+                if (link) {
+                        r = sd_rtnl_call_async(netdev->manager->rtnl, m,
+                                               callback, link, 0, NULL);
+                        if (r < 0) {
+                                log_error_netdev(netdev,
+                                                 "Could not send rtnetlink message: %s",
+                                                 strerror(-r));
+                                return r;
+                        }
+
+                        link_ref(link);
+                } else {
+                        r = sd_rtnl_call_async(netdev->manager->rtnl, m,
+                                               netdev_create_handler, netdev, 0,
+                                               NULL);
+                        if (r < 0) {
+                                log_error_netdev(netdev,
+                                                 "Could not send rtnetlink message: %s",
+                                                 strerror(-r));
+                                return r;
+                        }
 
-                netdev_ref(netdev);
+                        netdev_ref(netdev);
+                }
 
                 netdev->state = NETDEV_STATE_CREATING;
 
@@ -580,7 +599,7 @@ int netdev_join(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callback)
 
                 break;
         case NETDEV_CREATE_STACKED:
-                r = netdev_create(netdev, link);
+                r = netdev_create(netdev, link, callback);
                 if (r < 0)
                         return r;
 
@@ -699,9 +718,9 @@ static int netdev_load_one(Manager *manager, const char *filename) {
         switch (NETDEV_VTABLE(netdev)->create_type) {
         case NETDEV_CREATE_MASTER:
         case NETDEV_CREATE_INDEPENDENT:
-                r = netdev_create(netdev, NULL);
+                r = netdev_create(netdev, NULL, NULL);
                 if (r < 0)
-                        return r;
+                        return 0;
 
                 break;
         default: