add functions for adding dns servers to the proto list, hook them up in proto-static.c
authorFelix Fietkau <nbd@openwrt.org>
Thu, 13 Oct 2011 12:58:51 +0000 (14:58 +0200)
committerFelix Fietkau <nbd@openwrt.org>
Thu, 13 Oct 2011 12:58:51 +0000 (14:58 +0200)
config/network
interface-ip.c
interface-ip.h
proto-static.c

index 6e9d7a609a127ab7ad6fce669e2fa3070a5d4bd8..e39164a1ca63b75bf3bc7cc07114df487ae85fe8 100644 (file)
@@ -33,6 +33,7 @@ config interface lan2
        option ipaddr   192.168.1.1
        option netmask  255.255.255.0
        option gateway  192.168.1.2
+       option dns              '192.168.1.5 192.168.1.6'
 
 config interface wan
        option proto    pppoe
index d2e1461cfa8cca291bd8a785775a3ed745496163..c0a1bb961665033c700e0659159f726f3fd72411 100644 (file)
@@ -79,6 +79,44 @@ interface_update_proto_route(struct vlist_tree *tree,
        }
 }
 
+void
+interface_add_dns_server(struct interface *iface, const char *str)
+{
+       struct dns_server *s;
+
+       s = calloc(1, sizeof(*s));
+       s->af = AF_INET;
+       if (inet_pton(s->af, str, &s->addr.in))
+               goto add;
+
+       s->af = AF_INET6;
+       if (inet_pton(s->af, str, &s->addr.in))
+               goto add;
+
+       free(s);
+       return;
+
+add:
+       list_add_tail(&s->list, &iface->proto_dns_servers);
+}
+
+void
+interface_add_dns_server_list(struct interface *iface, struct blob_attr *list)
+{
+       struct blob_attr *cur;
+       int rem;
+
+       blobmsg_for_each_attr(cur, list, rem) {
+               if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING)
+                       continue;
+
+               if (!blobmsg_check_attr(cur, NULL))
+                       continue;
+
+               interface_add_dns_server(iface, blobmsg_data(cur));
+       }
+}
+
 static void
 interface_clear_dns_servers(struct interface *iface)
 {
index 23782ad686d535ee046a8c974f4e911eff0d01ee..91703a1d89787b6e5addd1e23a1d608a9efdfe0b 100644 (file)
@@ -55,6 +55,8 @@ struct dns_search_domain {
 };
 
 void interface_ip_init(struct interface *iface);
+void interface_add_dns_server(struct interface *iface, const char *str);
+void interface_add_dns_server_list(struct interface *iface, struct blob_attr *list);
 void interface_clear_dns(struct interface *iface);
 void interface_write_resolv_conf(void);
 
index 17cff0aa570bf0f7d87e6e60753b8a0971b7f16f..f5d676a7bf1e05959edb71b0e135871213e151cc 100644 (file)
@@ -17,6 +17,7 @@ enum {
        OPT_NETMASK,
        OPT_GATEWAY,
        OPT_IP6GW,
+       OPT_DNS,
        __OPT_MAX,
 };
 
@@ -26,11 +27,13 @@ static const struct blobmsg_policy static_attrs[__OPT_MAX] = {
        [OPT_NETMASK] = { .name = "netmask", .type = BLOBMSG_TYPE_STRING },
        [OPT_GATEWAY] = { .name = "gateway", .type = BLOBMSG_TYPE_STRING },
        [OPT_IP6GW] = { .name = "ip6gw", .type = BLOBMSG_TYPE_STRING },
+       [OPT_DNS] = { .name = "dns", .type = BLOBMSG_TYPE_ARRAY },
 };
 
 static const union config_param_info static_attr_info[__OPT_MAX] = {
        [OPT_IPADDR] = { .type = BLOBMSG_TYPE_STRING },
        [OPT_IP6ADDR] = { .type = BLOBMSG_TYPE_STRING },
+       [OPT_DNS] = { .type = BLOBMSG_TYPE_STRING },
 };
 
 static const struct config_param_list static_attr_list = {
@@ -140,6 +143,9 @@ proto_apply_static_settings(struct interface *iface, struct blob_attr *attr)
                        goto out;
        }
 
+       if (tb[OPT_DNS])
+               interface_add_dns_server_list(iface, tb[OPT_DNS]);
+
        return 0;
 
 error: