diff options
author | Felix Fietkau <nbd@nbd.name> | 2020-11-30 12:34:13 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2020-11-30 12:39:25 +0100 |
commit | 42c48866f1c1fce068f41536baa8dd2e80fc08d7 (patch) | |
tree | 439389ff79d44a5eb48c3fd5d3c60c0a5f36f024 /config.c | |
parent | 524310276f2084d419cb0f2de58b0f42641d987f (diff) | |
download | netifd-42c48866f1c1fce068f41536baa8dd2e80fc08d7.tar.gz |
config: parse default mac address from board.json
Example:
{
"network-device": {
"eth0": {
"macaddr": "bc:a5:11:16:76:d7"
}
}
}
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'config.c')
-rw-r--r-- | config.c | 56 |
1 files changed, 56 insertions, 0 deletions
@@ -18,6 +18,8 @@ #include <uci.h> +#include <libubox/blobmsg_json.h> + #include "netifd.h" #include "interface.h" #include "interface-ip.h" @@ -31,6 +33,7 @@ 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_attr *board_netdevs; static struct blob_buf b; static int @@ -654,6 +657,57 @@ config_init_wireless(void) } } + +static struct blob_attr * +config_find_blobmsg_attr(struct blob_attr *attr, const char *name, int type) +{ + struct blobmsg_policy policy = { .name = name, .type = type }; + struct blob_attr *cur; + + blobmsg_parse(&policy, 1, &cur, blobmsg_data(attr), blobmsg_len(attr)); + + return cur; +} + +struct ether_addr *config_get_default_macaddr(const char *ifname) +{ + struct blob_attr *cur; + + if (!board_netdevs) + return NULL; + + cur = config_find_blobmsg_attr(board_netdevs, ifname, BLOBMSG_TYPE_TABLE); + if (!cur) + return NULL; + + cur = config_find_blobmsg_attr(cur, "macaddr", BLOBMSG_TYPE_STRING); + if (!cur) + return NULL; + + return ether_aton(blobmsg_get_string(cur)); +} + +static void +config_init_board(void) +{ + struct blob_attr *cur; + + blob_buf_init(&b, 0); + + if (!blobmsg_add_json_from_file(&b, DEFAULT_BOARD_JSON)) + return; + + free(board_netdevs); + board_netdevs = NULL; + + cur = config_find_blobmsg_attr(b.head, "network-device", + BLOBMSG_TYPE_TABLE); + if (!cur) + return; + + board_netdevs = blob_memdup(cur); +} + int config_init_all(void) { @@ -676,6 +730,8 @@ config_init_all(void) ret = -1; } + config_init_board(); + vlist_update(&interfaces); config_init = true; device_lock(); |