X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=config.c;h=1d04efd7d1caf86d67e192c84d6bdd2c24089cc4;hp=49bae15dfe21599d6dc6058f2598760b429f1196;hb=4b7662c5841214c105a174fdc9ab9fac870abab9;hpb=6843870670b8a68c98528faf638c6b3938cab55d diff --git a/config.c b/config.c index 49bae15..1d04efd 100644 --- a/config.c +++ b/config.c @@ -22,12 +22,14 @@ #include "interface-ip.h" #include "iprule.h" #include "proto.h" +#include "wireless.h" #include "config.h" bool config_init = false; static struct uci_context *uci_ctx; static struct uci_package *uci_network; +static struct uci_package *uci_wireless; static struct blob_buf b; static int @@ -54,11 +56,15 @@ static void config_parse_interface(struct uci_section *s, bool alias) { struct interface *iface; - const char *type = NULL; + const char *type = NULL, *disabled; struct blob_attr *config; struct device *dev; bool bridge = false; + disabled = uci_lookup_option_string(uci_ctx, s, "disabled"); + if (disabled && !strcmp(disabled, "1")) + return; + blob_buf_init(&b, 0); if (!alias) @@ -188,8 +194,11 @@ config_init_package(const char *config) ctx = uci_alloc_context(); uci_ctx = ctx; + ctx->flags &= ~UCI_FLAG_STRICT; + if (config_path) + uci_set_confdir(ctx, config_path); + #ifdef DUMMY_MODE - uci_set_confdir(ctx, "./config"); uci_set_savedir(ctx, "./tmp"); #endif } else { @@ -278,6 +287,85 @@ config_init_globals(void) interface_ip_set_ula_prefix(ula_prefix); } +static void +config_parse_wireless_device(struct uci_section *s) +{ + struct wireless_driver *drv; + const char *driver_name; + + driver_name = uci_lookup_option_string(uci_ctx, s, "type"); + if (!driver_name) + return; + + drv = avl_find_element(&wireless_drivers, driver_name, drv, node); + if (!drv) + return; + + blob_buf_init(&b, 0); + uci_to_blob(&b, s, drv->device.config); + wireless_device_create(drv, s->e.name, b.head); +} + +static void +config_parse_wireless_interface(struct wireless_device *wdev, struct uci_section *s) +{ + blob_buf_init(&b, 0); + uci_to_blob(&b, s, wdev->drv->interface.config); + wireless_interface_create(wdev, b.head, s->e.name); +} + +static void +config_init_wireless(void) +{ + struct wireless_device *wdev; + struct uci_element *e; + const char *dev_name; + + if (!uci_wireless) { + DPRINTF("No wireless configuration found\n"); + return; + } + + vlist_update(&wireless_devices); + + uci_foreach_element(&uci_wireless->sections, e) { + struct uci_section *s = uci_to_section(e); + if (strcmp(s->type, "wifi-device") != 0) + continue; + + config_parse_wireless_device(s); + } + + vlist_flush(&wireless_devices); + + vlist_for_each_element(&wireless_devices, wdev, node) { + wdev->vif_idx = 0; + vlist_update(&wdev->interfaces); + } + + uci_foreach_element(&uci_wireless->sections, e) { + struct uci_section *s = uci_to_section(e); + + if (strcmp(s->type, "wifi-iface") != 0) + continue; + + dev_name = uci_lookup_option_string(uci_ctx, s, "device"); + if (!dev_name) + continue; + + wdev = vlist_find(&wireless_devices, dev_name, wdev, node); + if (!wdev) { + DPRINTF("device %s not found!\n", dev_name); + continue; + } + + config_parse_wireless_interface(wdev, s); + } + + vlist_for_each_element(&wireless_devices, wdev, node) + vlist_flush(&wdev->interfaces); +} + void config_init_all(void) { @@ -287,6 +375,8 @@ config_init_all(void) return; } + uci_wireless = config_init_package("wireless"); + vlist_update(&interfaces); config_init = true; device_lock(); @@ -297,6 +387,7 @@ config_init_all(void) config_init_routes(); config_init_rules(); config_init_globals(); + config_init_wireless(); config_init = false; device_unlock(); @@ -307,4 +398,5 @@ config_init_all(void) device_free_unused(NULL); interface_refresh_assignments(false); interface_start_pending(); + wireless_start_pending(); }