X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;ds=sidebyside;f=config.c;h=c5a2d2cd246802f3001b0f76da24b21c50073142;hb=8cb06c3efe734a52;hp=5687b4c3f8c8bc318d6147228ae3aed2e70324e9;hpb=bfe5db1ea8018aaa940dc6e991110fac62b85516;p=project%2Fnetifd.git diff --git a/config.c b/config.c index 5687b4c..c5a2d2c 100644 --- a/config.c +++ b/config.c @@ -156,16 +156,17 @@ config_parse_bridge_interface(struct uci_section *s) } static void -config_parse_interface(struct uci_section *s) +config_parse_interface(struct uci_section *s, bool alias) { struct interface *iface; - const char *type; + const char *type = NULL; struct blob_attr *config; struct device *dev; blob_buf_init(&b, 0); - type = uci_lookup_option_string(uci_ctx, s, "type"); + if (!alias) + type = uci_lookup_option_string(uci_ctx, s, "type"); if (type && !strcmp(type, "bridge")) if (config_parse_bridge_interface(s)) return; @@ -181,13 +182,17 @@ config_parse_interface(struct uci_section *s) uci_to_blob(&b, s, iface->proto_handler->config_params); config = malloc(blob_pad_len(b.head)); - if (!config) { - free(iface); - return; - } + if (!config) + goto error; memcpy(config, b.head, blob_pad_len(b.head)); - interface_add(iface, config); + + if (alias) { + if (!interface_add_alias(iface, config)) + goto error_free_config; + } else { + interface_add(iface, config); + } /* * need to look up the interface name again, in case of config update, @@ -207,6 +212,11 @@ config_parse_interface(struct uci_section *s) return; device_set_config(dev, dev->type, b.head); + return; +error_free_config: + free(config); +error: + free(iface); } static void @@ -378,7 +388,14 @@ config_init_interfaces(void) struct uci_section *s = uci_to_section(e); if (!strcmp(s->type, "interface")) - config_parse_interface(s); + config_parse_interface(s, false); + } + + uci_foreach_element(&uci_network->sections, e) { + struct uci_section *s = uci_to_section(e); + + if (!strcmp(s->type, "alias")) + config_parse_interface(s, true); } }