allow devices to be disabled through a config option
authorFelix Fietkau <nbd@openwrt.org>
Wed, 18 Jan 2012 17:54:01 +0000 (18:54 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Thu, 19 Jan 2012 16:11:10 +0000 (17:11 +0100)
device.c
device.h

index 91cb37a615a8c94c2db9ee002745f1f862206a57..784905bde25200be38e1a12a343494d027cdf391 100644 (file)
--- a/device.c
+++ b/device.c
@@ -34,6 +34,7 @@ static const struct blobmsg_policy dev_attrs[__DEV_ATTR_MAX] = {
        [DEV_ATTR_MTU] = { "mtu", BLOBMSG_TYPE_INT32 },
        [DEV_ATTR_MACADDR] = { "macaddr", BLOBMSG_TYPE_STRING },
        [DEV_ATTR_TXQUEUELEN] = { "txqueuelen", BLOBMSG_TYPE_INT32 },
+       [DEV_ATTR_ENABLED] = { "enabled", BLOBMSG_TYPE_BOOL },
 };
 
 const struct config_param_list device_attr_list = {
@@ -181,6 +182,10 @@ device_init_settings(struct device *dev, struct blob_attr **tb)
        struct ether_addr *ea;
 
        dev->flags = 0;
+       dev->disabled = false;
+
+       if ((cur = tb[DEV_ATTR_ENABLED]))
+               device_set_disabled(dev, !blobmsg_get_bool(cur));
 
        if ((cur = tb[DEV_ATTR_MTU])) {
                dev->mtu = blobmsg_get_u32(cur);
@@ -409,16 +414,37 @@ void device_cleanup(struct device *dev)
        device_delete(dev);
 }
 
-void device_set_present(struct device *dev, bool state)
+static void __device_set_present(struct device *dev, bool state)
 {
        if (dev->present == state)
                return;
 
-       D(DEVICE, "%s '%s' %s present\n", dev->type->name, dev->ifname, state ? "is now" : "is no longer" );
        dev->present = state;
        device_broadcast_event(dev, state ? DEV_EVENT_ADD : DEV_EVENT_REMOVE);
 }
 
+void device_set_present(struct device *dev, bool state)
+{
+       if (dev->sys_present == state)
+               return;
+
+       dev->sys_present = state;
+       D(DEVICE, "%s '%s' %s present\n", dev->type->name, dev->ifname, state ? "is now" : "is no longer" );
+
+       if (state && dev->disabled)
+               return;
+
+       __device_set_present(dev, state);
+}
+
+void
+device_set_disabled(struct device *dev, bool value)
+{
+       dev->disabled = value;
+       if (dev->sys_present)
+               __device_set_present(dev, !value);
+}
+
 void device_add_user(struct device_user *dep, struct device *dev)
 {
        dep->dev = dev;
index c0b112dddebfd53190766a06d60d7d45b488165e..338138f42803411ea0e884b6c454c9e8f10cf6a0 100644 (file)
--- a/device.h
+++ b/device.h
@@ -16,6 +16,7 @@ enum {
        DEV_ATTR_MTU,
        DEV_ATTR_MACADDR,
        DEV_ATTR_TXQUEUELEN,
+       DEV_ATTR_ENABLED,
        __DEV_ATTR_MAX,
 };
 
@@ -88,9 +89,11 @@ struct device {
 
        struct blob_attr *config;
        bool config_pending;
+       bool sys_present;
        bool present;
        int active;
        bool external;
+       bool disabled;
 
        bool current_config;
        bool default_config;
@@ -143,6 +146,7 @@ void device_add_user(struct device_user *dep, struct device *iface);
 void device_remove_user(struct device_user *dep);
 
 void device_set_present(struct device *dev, bool state);
+void device_set_disabled(struct device *dev, bool value);
 int device_claim(struct device_user *dep);
 void device_release(struct device_user *dep);
 int device_check_state(struct device *dev);