From: Felix Fietkau Date: Tue, 18 Oct 2011 23:32:55 +0000 (+0200) Subject: apply device settings to simple devices with config specified from the interface... X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=commitdiff_plain;h=f8276b9b149f3b0c8f3cdf8d3d0c232bd92e3464 apply device settings to simple devices with config specified from the interface section (legacy format compatibility), but only if no other config was provided --- diff --git a/config.c b/config.c index c8f7807..9f42471 100644 --- a/config.c +++ b/config.c @@ -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 diff --git a/device.c b/device.c index ccba9d3..6eb730e 100644 --- a/device.c +++ b/device.c @@ -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); diff --git a/device.h b/device.h index 686b1b1..f7718cc 100644 --- a/device.h +++ b/device.h @@ -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); diff --git a/vlan.c b/vlan.c index bf8cfba..1e06280 100644 --- a/vlan.c +++ b/vlan.c @@ -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;