+/*
+ * netifd - network interface daemon
+ * Copyright (C) 2012 Felix Fietkau <nbd@openwrt.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
IFACE_ATTR_PROTO,
IFACE_ATTR_AUTO,
IFACE_ATTR_DEFAULTROUTE,
+ IFACE_ATTR_PEERDNS,
+ IFACE_ATTR_DNS,
+ IFACE_ATTR_DNS_SEARCH,
IFACE_ATTR_METRIC,
IFACE_ATTR_MAX
};
[IFACE_ATTR_IFNAME] = { .name = "ifname", .type = BLOBMSG_TYPE_STRING },
[IFACE_ATTR_AUTO] = { .name = "auto", .type = BLOBMSG_TYPE_BOOL },
[IFACE_ATTR_DEFAULTROUTE] = { .name = "defaultroute", .type = BLOBMSG_TYPE_BOOL },
+ [IFACE_ATTR_PEERDNS] = { .name = "peerdns", .type = BLOBMSG_TYPE_BOOL },
[IFACE_ATTR_METRIC] = { .name = "metric", .type = BLOBMSG_TYPE_INT32 },
+ [IFACE_ATTR_DNS] = { .name = "dns", .type = BLOBMSG_TYPE_ARRAY },
+ [IFACE_ATTR_DNS_SEARCH] = { .name = "dns_search", .type = BLOBMSG_TYPE_ARRAY },
+};
+
+static const union config_param_info iface_attr_info[IFACE_ATTR_MAX] = {
+ [IFACE_ATTR_DNS] = { .type = BLOBMSG_TYPE_STRING },
};
const struct config_param_list interface_attr_list = {
.n_params = IFACE_ATTR_MAX,
.params = iface_attrs,
+ .info = iface_attr_info,
};
static void
if (!blobmsg_check_attr(data, true))
return UBUS_STATUS_INVALID_ARGUMENT;
- n = calloc(1, sizeof(*data) + blob_pad_len(data));
+ n = calloc(1, sizeof(*n) + blob_pad_len(data));
memcpy(n->data, data, blob_pad_len(data));
n->node.key = blobmsg_name(data);
list_for_each_entry_safe(dep, tmp, &iface_all_users, list)
dep->cb(dep, iface, ev);
-
- interface_queue_event(iface, ev);
}
static void
list_for_each_entry_safe(dep, tmp, &iface->users, list)
interface_remove_user(dep);
- interface_dequeue_event(iface);
interface_ip_flush(&iface->config_ip);
interface_flush_state(iface);
interface_clear_errors(iface);
static void
interface_do_reload(struct interface *iface)
{
+ interface_event(iface, IFEV_RELOAD);
interface_cleanup(iface, true);
proto_init_interface(iface, iface->config);
interface_claim_device(iface);
static void
interface_handle_config_change(struct interface *iface)
{
- switch(iface->config_state) {
+ enum interface_config_state state = iface->config_state;
+
+ iface->config_state = IFC_NORMAL;
+ switch(state) {
case IFC_NORMAL:
break;
case IFC_RELOAD:
iface->autostart = blobmsg_get_bool_default(tb[IFACE_ATTR_AUTO], true);
iface->proto_ip.no_defaultroute =
!blobmsg_get_bool_default(tb[IFACE_ATTR_DEFAULTROUTE], true);
+ iface->proto_ip.no_dns =
+ !blobmsg_get_bool_default(tb[IFACE_ATTR_PEERDNS], true);
+
+ if ((cur = tb[IFACE_ATTR_DNS]))
+ interface_add_dns_server_list(&iface->config_ip, cur);
+
+ if ((cur = tb[IFACE_ATTR_DNS_SEARCH]))
+ interface_add_dns_search_list(&iface->config_ip, cur);
+
+ if ((cur = tb[IFACE_ATTR_METRIC]))
+ iface->metric = blobmsg_get_u32(cur);
iface->config_autostart = iface->autostart;
}
}
static void
+interface_replace_dns(struct interface_ip_settings *new, struct interface_ip_settings *old)
+{
+ vlist_simple_replace(&new->dns_servers, &old->dns_servers);
+ vlist_simple_replace(&new->dns_search, &old->dns_search);
+}
+
+static void
interface_change_config(struct interface *if_old, struct interface *if_new)
{
struct blob_attr *old_config = if_old->config;
interface_ip_set_enabled(&if_old->proto_ip, if_new->proto_ip.enabled);
}
+ UPDATE(proto_ip.no_dns);
+ interface_replace_dns(&if_old->config_ip, &if_new->config_ip);
+ interface_write_resolv_conf();
+
#undef UPDATE
goto out;