- }
-
- if (netdev->macvlan_mode != _NETDEV_MACVLAN_MODE_INVALID) {
- r = sd_rtnl_message_append_u32(req, IFLA_MACVLAN_MODE, netdev->macvlan_mode);
- if (r < 0) {
- log_error_netdev(netdev,
- "Could not append IFLA_MACVLAN_MODE attribute: %s",
- strerror(-r));
- return r;
- }
- }
-
- r = sd_rtnl_message_close_container(req);
- if (r < 0) {
- log_error_netdev(netdev,
- "Could not close IFLA_INFO_DATA container %s",
- strerror(-r));
- return r;
- }
-
- r = sd_rtnl_message_close_container(req);
- if (r < 0) {
- log_error_netdev(netdev,
- "Could not close IFLA_LINKINFO container %s",
- strerror(-r));
- return r;
- }
-
- if (link)
- r = sd_rtnl_call_async(netdev->manager->rtnl, req, callback, link, 0, NULL);
- else
- r = sd_rtnl_call_async(netdev->manager->rtnl, req, &netdev_create_handler, netdev, 0, NULL);
- if (r < 0) {
- log_error_netdev(netdev,
- "Could not send rtnetlink message: %s", strerror(-r));
- return r;
- }
-
- log_debug_netdev(netdev, "creating netdev");
-
- netdev->state = NETDEV_STATE_CREATING;
-
- return 0;
-}
-
-int netdev_enslave(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callback) {
- int r;
-
- switch(netdev->kind) {
- case NETDEV_KIND_VLAN:
- case NETDEV_KIND_MACVLAN:
- return netdev_create(netdev, link, callback);
- case NETDEV_KIND_VXLAN:
- return netdev_create_vxlan(netdev, link, callback);
- case NETDEV_KIND_IPIP:
- case NETDEV_KIND_GRE:
- case NETDEV_KIND_SIT:
- case NETDEV_KIND_VTI:
- return netdev_create_tunnel(link, netdev_create_handler);
- default:
- break;
- }
-
- if (netdev->state == NETDEV_STATE_READY) {
- r = netdev_enslave_ready(netdev, link, callback);
- if (r < 0)
- return r;
- } else {
- /* the netdev is not yet read, save this request for when it is*/
- netdev_enslave_callback *cb;
-
- cb = new0(netdev_enslave_callback, 1);
- if (!cb)
- return log_oom();