X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=config.c;h=1711121f627f28d3edce137096e3a0e6548adb25;hp=99adda1a0a66943e668aafdd87313c7fe4c8f85f;hb=d3a4844047c7b3c62511a9836a81703b5ee70fc0;hpb=c1692fdcf48ad32217354d5206af31115e562306;ds=inline diff --git a/config.c b/config.c index 99adda1..1711121 100644 --- a/config.c +++ b/config.c @@ -13,22 +13,49 @@ struct uci_context *uci_ctx; struct uci_package *uci_network; bool config_init = false; +enum { + SIF_TYPE, + SIF_IFNAME, + __SIF_MAX, +}; + +static const struct uci_parse_option if_opts[__SIF_MAX] = { + [SIF_TYPE] = { "type", UCI_TYPE_STRING }, + [SIF_IFNAME] = { "ifname", UCI_TYPE_STRING }, +}; + static void config_parse_interface(struct uci_section *s) { + struct uci_option *opts[__SIF_MAX]; struct interface *iface; + struct device *dev; const char *type; DPRINTF("Create interface '%s'\n", s->e.name); iface = alloc_interface(s->e.name); - type = uci_lookup_option_string(uci_ctx, s, "type"); + if (!iface) + return; - if (!type) - type = ""; + uci_parse_section(s, if_opts, __SIF_MAX, opts); - if (!strcmp(type, "bridge")) - interface_attach_bridge(iface, s); + if (opts[SIF_TYPE]) { + type = opts[SIF_TYPE]->v.string; + + if (!strcmp(type, "bridge")) { + interface_attach_bridge(iface, s); + return; + } + } + + if (opts[SIF_IFNAME]) { + dev = get_device(opts[SIF_IFNAME]->v.string, true); + if (!dev) + return; + + add_device_user(&iface->main_dev, dev); + } } enum { @@ -40,7 +67,7 @@ enum { __SDEV_MAX, }; -struct uci_parse_option dev_opts[__SDEV_MAX] = { +static const struct uci_parse_option dev_opts[__SDEV_MAX] = { [SDEV_NAME] = { "name", UCI_TYPE_STRING }, [SDEV_TYPE] = { "type", UCI_TYPE_STRING }, [SDEV_MTU] = { "mtu", UCI_TYPE_STRING }, @@ -153,6 +180,7 @@ config_init_interfaces(const char *name) if (!strcmp(s->type, "interface")) config_parse_interface(s); } + cleanup_devices(); config_init = false; start_pending_interfaces();