+static int
+alias_device_set_state(struct device *dev, bool state)
+{
+ struct alias_device *alias;
+
+ alias = container_of(dev, struct alias_device, dev);
+ if (!alias->dep.dev)
+ return -1;
+
+ if (state)
+ return device_claim(&alias->dep);
+
+ device_release(&alias->dep);
+ if (alias->cleanup)
+ device_remove_user(&alias->dep);
+ return 0;
+}
+
+static struct device *
+alias_device_create(const char *name, struct blob_attr *attr)
+{
+ struct alias_device *alias;
+
+ alias = calloc(1, sizeof(*alias) + strlen(name) + 1);
+ strcpy(alias->name, name);
+ alias->dev.set_state = alias_device_set_state;
+ device_init_virtual(&alias->dev, &alias_device_type, NULL);
+ alias->avl.key = alias->name;
+ avl_insert(&aliases, &alias->avl);
+
+ return &alias->dev;
+}
+
+static void alias_device_free(struct device *dev)
+{
+ struct alias_device *alias;
+
+ device_cleanup(dev);
+
+ alias = container_of(dev, struct alias_device, dev);
+ avl_delete(&aliases, &alias->avl);
+ free(alias);
+}
+
+static const struct device_type alias_device_type = {
+ .name = "Network alias",
+ .create = alias_device_create,
+ .free = alias_device_free,
+};
+