struct ubus_request_data *req, const char *method,
struct blob_attr *msg)
{
- static const char *iface_state[] = {
- [IFS_SETUP] = "setup",
- [IFS_UP] = "up",
- [IFS_TEARDOWN] = "teardown",
- [IFS_DOWN] = "down",
- };
struct interface *iface;
iface = container_of(obj, struct interface, ubus);
blob_buf_init(&b, 0);
- blobmsg_add_string(&b, "state", iface_state[iface->state]);
+ blobmsg_add_u8(&b, "up", iface->state == IFS_UP);
+ blobmsg_add_u8(&b, "pending", iface->state == IFS_SETUP);
blobmsg_add_u8(&b, "active", iface->active);
blobmsg_add_u8(&b, "autostart", iface->autostart);
if (iface->main_dev.dev) {
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);
+ dev = device_get(blobmsg_data(tb[DEV_NAME]), add);
+ if (!dev)
+ return UBUS_STATUS_NOT_FOUND;
+
+ if (main_dev != dev) {
+ if (add)
+ ret = main_dev->hotplug_ops->add(main_dev, dev);
+ else
+ ret = main_dev->hotplug_ops->del(main_dev, dev);
+ if (ret)
+ ret = UBUS_STATUS_UNKNOWN_ERROR;
+ } else {
+ ret = UBUS_STATUS_INVALID_ARGUMENT;
+ }
- if (ret)
- return UBUS_STATUS_UNKNOWN_ERROR;
+ if (add)
+ device_free_unused(dev);
- return 0;
+ return ret;
}
-
static struct ubus_method iface_object_methods[] = {
{ .name = "up", .handler = netifd_handle_up },
{ .name = "down", .handler = netifd_handle_down },