summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2013-10-19 16:43:22 +0200
committerFelix Fietkau <nbd@openwrt.org>2013-10-22 14:10:33 +0200
commit381f47c5af62cec173528f5f539558d7a18b6d30 (patch)
treeec513fb911bdff393ea3e04fb67c34fd4aaf80d8
parent98ffa1331519ed3dd84bd351652ae0fde3df8c93 (diff)
downloadnetifd-381f47c5af62cec173528f5f539558d7a18b6d30.tar.gz
add helper function for adding/removing devices to interfaces
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
-rw-r--r--interface.c31
-rw-r--r--interface.h1
-rw-r--r--ubus.c26
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
@@ -746,6 +746,37 @@ interface_add_link(struct interface *iface, struct device *dev)
}
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)
{
int ret;
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);
}