- if (netdev->kind != NETDEV_KIND_VLAN) {
- r = netdev_create(netdev, NULL, NULL);
+ log_debug_netdev(netdev, "loaded %s", netdev_kind_to_string(netdev->kind));
+
+ /* create netdev */
+ if (NETDEV_VTABLE(netdev)->fill_message_create) {
+ _cleanup_rtnl_message_unref_ sd_rtnl_message *m = NULL;
+
+ r = sd_rtnl_message_new_link(netdev->manager->rtnl, &m, RTM_NEWLINK, 0);
+ if (r < 0) {
+ log_error_netdev(netdev,
+ "Could not allocate RTM_NEWLINK message: %s",
+ strerror(-r));
+ return r;
+ }
+
+ r = NETDEV_VTABLE(netdev)->fill_message_create(netdev, m);
+ if (r < 0)
+ return r;
+
+ 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);
+
+ log_debug_netdev(netdev, "creating");
+
+ netdev->state = NETDEV_STATE_CREATING;
+ } else if (NETDEV_VTABLE(netdev)->create) {
+ r = NETDEV_VTABLE(netdev)->create(netdev);