From 395891b0e4c67591523dd0e2c2ac0c8aa22e88e7 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Wed, 18 Jan 2012 18:54:01 +0100 Subject: [PATCH] allow devices to be disabled through a config option --- device.c | 30 ++++++++++++++++++++++++++++-- device.h | 4 ++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/device.c b/device.c index 91cb37a..784905b 100644 --- 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; diff --git a/device.h b/device.h index c0b112d..338138f 100644 --- 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); -- 2.30.2