summaryrefslogtreecommitdiffhomepage
path: root/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'config.c')
-rw-r--r--config.c88
1 files changed, 5 insertions, 83 deletions
diff --git a/config.c b/config.c
index 9104a9c..18efe96 100644
--- a/config.c
+++ b/config.c
@@ -2,16 +2,14 @@
#include <stdlib.h>
#include <stdio.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <net/ethernet.h>
-
#include "netifd.h"
#include "interface.h"
struct uci_context *uci_ctx;
static struct uci_package *uci_network;
bool config_init = false;
+static struct blob_buf b;
+
static void uci_attr_to_blob(struct blob_buf *b, const char *str,
const char *name, enum blobmsg_type type)
@@ -112,8 +110,6 @@ static void uci_to_blob(struct blob_buf *b, struct uci_section *s,
static void
config_parse_interface(struct uci_section *s)
{
- struct blob_buf b = {};
-
DPRINTF("Create interface '%s'\n", s->e.name);
blob_buf_init(&b, 0);
@@ -121,68 +117,10 @@ config_parse_interface(struct uci_section *s)
alloc_interface(s->e.name, s, b.head);
}
-enum {
- SDEV_NAME,
- SDEV_TYPE,
- SDEV_MTU,
- SDEV_MACADDR,
- SDEV_TXQUEUELEN,
- __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 },
- [SDEV_MACADDR] = { "macaddr", UCI_TYPE_STRING },
- [SDEV_TXQUEUELEN] = { "txqueuelen", UCI_TYPE_STRING },
-};
-
-static bool
-add_int_option(struct uci_option *o, unsigned int *dest)
-{
- char *error = NULL;
- int val;
-
- if (!o)
- return false;
-
- val = strtoul(o->v.string, &error, 0);
- if (error && *error)
- return false;
-
- *dest = val;
- return true;
-}
-
-static void
-config_init_device_settings(struct device *dev, struct uci_option **opts)
-{
- struct ether_addr *ea;
-
- dev->flags = 0;
-
- if (add_int_option(opts[SDEV_MTU], &dev->mtu))
- dev->flags |= DEV_OPT_MTU;
-
- if (add_int_option(opts[SDEV_TXQUEUELEN], &dev->txqueuelen))
- dev->flags |= DEV_OPT_TXQUEUELEN;
-
- if (opts[SDEV_MACADDR]) {
- ea = ether_aton(opts[SDEV_MACADDR]->v.string);
- if (ea) {
- memcpy(dev->macaddr, ea, sizeof(dev->macaddr));
- dev->flags |= DEV_OPT_MACADDR;
- }
- }
-}
-
void
config_init_devices(void)
{
struct uci_element *e;
- struct device *dev;
- struct uci_option *opts[__SDEV_MAX];
uci_foreach_element(&uci_network->sections, e) {
struct uci_section *s = uci_to_section(e);
@@ -190,25 +128,9 @@ config_init_devices(void)
if (strcmp(s->type, "device") != 0)
continue;
- uci_parse_section(s, dev_opts, __SDEV_MAX, opts);
- if (!opts[SDEV_NAME])
- continue;
-
- dev = NULL;
- if (opts[SDEV_TYPE]) {
- const char *type = opts[SDEV_TYPE]->v.string;
-
- if (!strcmp(type, "bridge"))
- dev = bridge_create(opts[SDEV_NAME]->v.string, s);
- } else {
- dev = get_device(opts[SDEV_NAME]->v.string, true);
- }
-
- if (!dev)
- continue;
-
- config_init_device_settings(dev, opts);
- dev->config_hash = uci_hash_options(opts, __SDEV_MAX);
+ blob_buf_init(&b, 0);
+ uci_to_blob(&b, s, &device_attr_list);
+ device_create(b.head, s);
}
}