[IFACE_ATTR_IP6CLASS] = { .name = "ip6class", .type = BLOBMSG_TYPE_ARRAY },
};
-static const union config_param_info iface_attr_info[IFACE_ATTR_MAX] = {
+static const struct uci_blob_param_info iface_attr_info[IFACE_ATTR_MAX] = {
[IFACE_ATTR_DNS] = { .type = BLOBMSG_TYPE_STRING },
[IFACE_ATTR_IP6CLASS] = { .type = BLOBMSG_TYPE_STRING },
};
-const struct config_param_list interface_attr_list = {
+const struct uci_blob_param_list interface_attr_list = {
.n_params = IFACE_ATTR_MAX,
.params = iface_attrs,
.info = iface_attr_info,
n = calloc(1, sizeof(*n) + blob_pad_len(data));
memcpy(n->data, data, blob_pad_len(data));
- n->node.key = blobmsg_name(data);
+ n->node.key = blobmsg_name(n->data);
o = avl_find_element(&iface->data, n->node.key, o, node);
if (o)
interface_proto_event(iface->proto, PROTO_CMD_TEARDOWN, force);
if (force)
interface_flush_state(iface);
+
+ if (iface->dynamic)
+ vlist_delete(&interfaces, &iface->node);
}
static void
interface_remove_user(dep);
break;
case IFEV_RELOAD:
+ case IFEV_UPDATE:
break;
}
}
switch (ev) {
case IFPEV_UP:
- if (iface->state != IFS_SETUP)
+ if (iface->state != IFS_SETUP) {
+ interface_event(iface, IFEV_UPDATE);
return;
+ }
interface_ip_set_enabled(&iface->config_ip, true);
system_flush_routes();
void
interface_init(struct interface *iface, const char *name,
- struct blob_attr *config)
+ struct blob_attr *config, bool dynamic)
{
struct blob_attr *tb[IFACE_ATTR_MAX];
struct blob_attr *cur;
}
iface->config_autostart = iface->autostart;
+ iface->dynamic = dynamic;
+
+ if (iface->dynamic)
+ iface->node.version = -1; // Don't delete on reload
}
static bool __interface_add(struct interface *iface, struct blob_attr *config, bool alias)
interface_set_l3_dev(iface, dev);
device_add_user(&iface->main_dev, dev);
+ if (!dev)
+ return;
+
if (claimed)
device_claim(&iface->l3_dev);
if (!if_old->proto_handler->config_params)
D(INTERFACE, "No config parameters for interface '%s'\n",
if_old->name);
- else if (!config_check_equal(if_old->config, if_new->config,
- if_old->proto_handler->config_params))
+ else if (!uci_blob_check_equal(if_old->config, if_new->config,
+ if_old->proto_handler->config_params))
reload = true;
#define UPDATE(field, __var) ({ \