diff options
author | Felix Fietkau <nbd@openwrt.org> | 2011-10-19 01:32:55 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2011-10-19 01:32:55 +0200 |
commit | f8276b9b149f3b0c8f3cdf8d3d0c232bd92e3464 (patch) | |
tree | eba0adb88f9e0408740c2855922db80ece63d55e | |
parent | beecba5195b2f1180f0bdfb6f61f0dbd3dff0eba (diff) |
apply device settings to simple devices with config specified from the interface section (legacy format compatibility), but only if no other config was provided
-rw-r--r-- | config.c | 18 | ||||
-rw-r--r-- | config/network | 11 | ||||
-rw-r--r-- | device.c | 12 | ||||
-rw-r--r-- | device.h | 4 | ||||
-rw-r--r-- | vlan.c | 1 |
5 files changed, 35 insertions, 11 deletions
@@ -147,6 +147,7 @@ config_parse_interface(struct uci_section *s) struct interface *iface; const char *type; struct blob_attr *config; + struct device *dev; blob_buf_init(&b, 0); @@ -173,6 +174,17 @@ config_parse_interface(struct uci_section *s) memcpy(config, b.head, blob_pad_len(b.head)); interface_add(iface, config); + + dev = iface->main_dev.dev; + if (!dev || !dev->default_config) + return; + + blob_buf_init(&b, 0); + uci_to_blob(&b, s, dev->type->config_params); + if (blob_len(b.head) == 0) + return; + + device_set_config(dev, dev->type, b.head); } static void @@ -244,6 +256,12 @@ __config_check_equal(struct blob_attr *c1, struct blob_attr *c2, { struct blob_attr **tb1, **tb2; + if (!!c1 ^ !!c2) + return false; + + if (!c1 && !c2) + return true; + tb1 = alloca(config->n_params * sizeof(struct blob_attr *)); blobmsg_parse(config->params, config->n_params, tb1, blob_data(c1), blob_len(c1)); diff --git a/config/network b/config/network index 2361aa0..9b16bba 100644 --- a/config/network +++ b/config/network @@ -7,11 +7,11 @@ config interface loopback option netmask 255.0.0.0 config device - option name br-lan - option type bridge - list ifname eth0.1 - list ifname eth0.2 - option mtu 1500 + option name br-lan + option type bridge + list ifname eth0.1 + list ifname eth0.2 + option mtu 1500 config device option name dummy @@ -24,6 +24,7 @@ config interface lan config interface dummy option ifname eth0.4 + option mtu 1500 option proto none config interface lan2 @@ -430,7 +430,7 @@ device_init_pending(void) } } -enum dev_change_type +static enum dev_change_type device_reload_config(struct device *dev, struct blob_attr *attr) { struct blob_attr *tb[__DEV_ATTR_MAX]; @@ -442,7 +442,7 @@ device_reload_config(struct device *dev, struct blob_attr *attr) if (cfg == &device_attr_list) { memset(tb, 0, sizeof(tb)); - if (dev->config) + if (attr) blobmsg_parse(dev_attrs, __DEV_ATTR_MAX, tb, blob_data(attr), blob_len(attr)); @@ -452,9 +452,9 @@ device_reload_config(struct device *dev, struct blob_attr *attr) return DEV_CONFIG_RECREATE; } -static enum dev_change_type -device_check_config(struct device *dev, const struct device_type *type, - struct blob_attr *attr) +enum dev_change_type +device_set_config(struct device *dev, const struct device_type *type, + struct blob_attr *attr) { if (type != dev->type) return DEV_CONFIG_RECREATE; @@ -525,7 +525,7 @@ device_create(const char *name, const struct device_type *type, odev = device_get(name, false); if (odev) { odev->current_config = true; - change = device_check_config(odev, type, config); + change = device_set_config(odev, type, config); switch (change) { case DEV_CONFIG_APPLIED: D(DEVICE, "Device '%s': config applied\n", odev->ifname); @@ -118,6 +118,10 @@ struct device *device_create(const char *name, const struct device_type *type, void device_init_settings(struct device *dev, struct blob_attr **tb); void device_init_pending(void); +enum dev_change_type +device_set_config(struct device *dev, const struct device_type *type, + struct blob_attr *attr); + void device_reset_config(void); void device_reset_old(void); @@ -94,6 +94,7 @@ static struct device *get_vlan_device(struct device *dev, int id, bool create) snprintf(vldev->dev.ifname, IFNAMSIZ, "%s.%d", dev->ifname, id); device_init(&vldev->dev, &vlan_type, NULL); + vldev->dev.default_config = true; vldev->set_state = vldev->dev.set_state; vldev->dev.set_state = vlan_set_device_state; |