diff options
author | Felix Fietkau <nbd@openwrt.org> | 2011-04-05 03:44:14 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2011-04-05 03:44:14 +0200 |
commit | 6443a383c54dee0cd3b9858801e0b765147a4ef4 (patch) | |
tree | 50f9533817b4af78c394f96eac0bb429c73aaf18 | |
parent | c1692fdcf48ad32217354d5206af31115e562306 (diff) |
add some configuration code for interfaces, bind interfaces to regular devices
-rw-r--r-- | config.c | 39 |
1 files changed, 33 insertions, 6 deletions
@@ -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 }, |