summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--config.c18
-rw-r--r--config/network11
-rw-r--r--device.c12
-rw-r--r--device.h4
-rw-r--r--vlan.c1
5 files changed, 35 insertions, 11 deletions
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;