From 6443a383c54dee0cd3b9858801e0b765147a4ef4 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 5 Apr 2011 03:44:14 +0200 Subject: [PATCH] add some configuration code for interfaces, bind interfaces to regular devices --- config.c | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/config.c b/config.c index 99adda1..6019862 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 }, -- 2.30.2