+/* the callback must be called, possibly after a timeout, as otherwise the Link will hang */
+int netdev_join(NetDev *netdev, Link *link, sd_rtnl_message_handler_t callback) {
+
+ assert(netdev);
+
+ switch(netdev->kind) {
+ case NETDEV_KIND_VLAN:
+ return netdev_create_vlan(netdev, link, callback);
+ case NETDEV_KIND_MACVLAN:
+ return netdev_create_macvlan(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(netdev, link, callback);
+ case NETDEV_KIND_BRIDGE:
+ case NETDEV_KIND_BOND:
+ return netdev_enslave(netdev, link, callback);
+ default:
+ assert_not_reached("Enslaving by invalid netdev kind");
+ }
+
+ return 0;
+}
+