+config_set_state(struct config_state *state, const struct blob_attr *attr)
+{
+ state->data = malloc(blob_pad_len(attr));
+ if (!state->data)
+ return;
+
+ memcpy(state->data, attr, blob_pad_len(attr));
+}
+
+static void
+config_parse_interface(struct uci_section *s)
+{
+ struct interface *iface;
+ const char *type;
+
+ DPRINTF("Create interface '%s'\n", s->e.name);
+
+ blob_buf_init(&b, 0);
+
+ type = uci_lookup_option_string(uci_ctx, s, "type");
+ if (type && !strcmp(type, "bridge"))
+ if (config_parse_bridge_interface(s))
+ return;
+
+ uci_to_blob(&b, s, &interface_attr_list);
+ iface = interface_alloc(s->e.name, b.head);
+ if (!iface)
+ return;
+
+ blob_buf_init(&b, 0);
+ if (iface->proto_handler && iface->proto_handler->config_params)
+ uci_to_blob(&b, s, iface->proto_handler->config_params);
+
+ proto_init_interface(iface, b.head);
+ iface->config.version = config_version;
+}
+
+static void