+static int
+netifd_iface_handle_device(struct ubus_context *ctx, struct ubus_object *obj,
+ struct ubus_request_data *req, const char *method,
+ struct blob_attr *msg)
+{
+ struct interface *iface;
+ struct device *dev, *main_dev;
+ struct blob_attr *tb[__DEV_MAX];
+ bool add = !strncmp(method, "add", 3);
+ int ret;
+
+ iface = container_of(obj, struct interface, ubus);
+
+ blobmsg_parse(dev_policy, __DEV_MAX, tb, blob_data(msg), blob_len(msg));
+
+ if (!tb[DEV_NAME])
+ return UBUS_STATUS_INVALID_ARGUMENT;
+
+ dev = device_get(blobmsg_data(tb[DEV_NAME]), add);
+ if (!dev)
+ return UBUS_STATUS_NOT_FOUND;
+
+ main_dev = iface->main_dev.dev;
+ if (!main_dev)
+ return UBUS_STATUS_NOT_FOUND;
+
+ if (main_dev == dev)
+ return UBUS_STATUS_INVALID_ARGUMENT;
+
+ if (!main_dev->hotplug_ops)
+ return UBUS_STATUS_NOT_SUPPORTED;
+
+ if (add)
+ ret = main_dev->hotplug_ops->add(main_dev, dev);
+ else
+ ret = main_dev->hotplug_ops->del(main_dev, dev);
+
+ if (ret)
+ return UBUS_STATUS_UNKNOWN_ERROR;
+
+ return 0;
+}
+
+