do not replace proto_ip dns servers on config reload
[project/netifd.git] / interface.c
index e43791c..331eaa1 100644 (file)
@@ -1,3 +1,16 @@
+/*
+ * 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>
@@ -19,6 +32,9 @@ enum {
        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
 };
@@ -28,12 +44,20 @@ static const struct blobmsg_policy iface_attrs[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
@@ -105,7 +129,7 @@ interface_add_data(struct interface *iface, const struct blob_attr *data)
        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);
 
@@ -377,6 +401,17 @@ interface_init(struct interface *iface, const char *name,
        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;
 }
@@ -558,6 +593,13 @@ interface_update_complete(struct interface *iface)
 }
 
 static void
+interface_replace_dns(struct interface_ip_settings *old, struct interface_ip_settings *new)
+{
+       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;
@@ -604,6 +646,10 @@ interface_change_config(struct interface *if_old, struct interface *if_new)
                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;