From 381f47c5af62cec173528f5f539558d7a18b6d30 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sat, 19 Oct 2013 16:43:22 +0200 Subject: [PATCH] add helper function for adding/removing devices to interfaces Signed-off-by: Felix Fietkau --- interface.c | 31 +++++++++++++++++++++++++++++++ interface.h | 1 + ubus.c | 26 +------------------------- 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/interface.c b/interface.c index 5649324..23c7032 100644 --- a/interface.c +++ b/interface.c @@ -745,6 +745,37 @@ interface_add_link(struct interface *iface, struct device *dev) return 0; } +int +interface_handle_link(struct interface *iface, const char *name, bool add) +{ + struct device *dev; + int ret; + + device_lock(); + + dev = device_get(name, add ? 2 : 0); + if (!dev) { + ret = UBUS_STATUS_NOT_FOUND; + goto out; + } + + if (add) { + device_set_present(dev, true); + if (iface->device_config) + device_set_config(dev, &simple_device_type, iface->config); + + system_if_apply_settings(dev, &dev->settings); + ret = interface_add_link(iface, dev); + } else { + ret = interface_remove_link(iface, dev); + } + +out: + device_unlock(); + + return ret; +} + int interface_set_up(struct interface *iface) { diff --git a/interface.h b/interface.h index b845c9b..4b7de59 100644 --- a/interface.h +++ b/interface.h @@ -167,6 +167,7 @@ void interface_remove_user(struct interface_user *dep); int interface_add_link(struct interface *iface, struct device *dev); int interface_remove_link(struct interface *iface, struct device *dev); +int interface_handle_link(struct interface *iface, const char *name, bool add); void interface_add_error(struct interface *iface, const char *subsystem, const char *code, const char **data, int n_data); diff --git a/ubus.c b/ubus.c index 31a83a9..b75eaec 100644 --- a/ubus.c +++ b/ubus.c @@ -762,9 +762,7 @@ netifd_iface_handle_device(struct ubus_context *ctx, struct ubus_object *obj, { struct blob_attr *tb[__DEV_MAX]; struct interface *iface; - struct device *dev; bool add = !strncmp(method, "add", 3); - int ret; iface = container_of(obj, struct interface, ubus); @@ -773,29 +771,7 @@ netifd_iface_handle_device(struct ubus_context *ctx, struct ubus_object *obj, if (!tb[DEV_NAME]) return UBUS_STATUS_INVALID_ARGUMENT; - device_lock(); - - dev = device_get(blobmsg_data(tb[DEV_NAME]), add ? 2 : 0); - if (!dev) { - ret = UBUS_STATUS_NOT_FOUND; - goto out; - } - - if (add) { - device_set_present(dev, true); - if (iface->device_config) - device_set_config(dev, &simple_device_type, iface->config); - - system_if_apply_settings(dev, &dev->settings); - ret = interface_add_link(iface, dev); - } else { - ret = interface_remove_link(iface, dev); - } - -out: - device_unlock(); - - return ret; + return interface_handle_link(iface, blobmsg_data(tb[DEV_NAME]), add); } -- 2.25.1