bridge: keep existing mac address if specified in the config
[project/netifd.git] / ubus.c
diff --git a/ubus.c b/ubus.c
index 33c94a1..5e51d3e 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -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.
+ */
 #define _GNU_SOURCE
 
 #include <arpa/inet.h>
@@ -277,7 +290,7 @@ netifd_add_interface_errors(struct blob_buf *b, struct interface *iface)
 }
 
 static void
-interface_ip_dump_address_list(struct interface_ip_settings *ip)
+interface_ip_dump_address_list(struct interface_ip_settings *ip, bool v6)
 {
        struct device_addr *addr;
        char *buf;
@@ -291,6 +304,9 @@ interface_ip_dump_address_list(struct interface_ip_settings *ip)
                else
                        af = AF_INET6;
 
+               if (af != (v6 ? AF_INET6 : AF_INET))
+                       continue;
+
                a = blobmsg_open_table(&b, NULL);
 
                buf = blobmsg_alloc_string_buffer(&b, "address", buflen);
@@ -307,8 +323,8 @@ static void
 interface_ip_dump_route_list(struct interface_ip_settings *ip)
 {
        struct device_route *route;
-       static char *buf;
        int buflen = 128;
+       char *buf;
        void *r;
        int af;
 
@@ -334,6 +350,30 @@ interface_ip_dump_route_list(struct interface_ip_settings *ip)
        }
 }
 
+static void
+interface_ip_dump_dns_server_list(struct interface_ip_settings *ip)
+{
+       struct dns_server *dns;
+       int buflen = 128;
+       char *buf;
+
+       vlist_simple_for_each_element(&ip->dns_servers, dns, node) {
+               buf = blobmsg_alloc_string_buffer(&b, NULL, buflen);
+               inet_ntop(dns->af, &dns->addr, buf, buflen);
+               blobmsg_add_string_buffer(&b);
+       }
+}
+
+static void
+interface_ip_dump_dns_search_list(struct interface_ip_settings *ip)
+{
+       struct dns_search_domain *dns;
+
+       vlist_simple_for_each_element(&ip->dns_search, dns, node) {
+               blobmsg_add_string(&b, NULL, dns->name);
+       }
+}
+
 static int
 netifd_handle_status(struct ubus_context *ctx, struct ubus_object *obj,
                     struct ubus_request_data *req, const char *method,
@@ -363,14 +403,26 @@ netifd_handle_status(struct ubus_context *ctx, struct ubus_object *obj,
                blobmsg_add_string(&b, "device", dev->ifname);
 
        if (iface->state == IFS_UP) {
-               a = blobmsg_open_array(&b, "address");
-               interface_ip_dump_address_list(&iface->config_ip);
-               interface_ip_dump_address_list(&iface->proto_ip);
+               a = blobmsg_open_array(&b, "ipv4-address");
+               interface_ip_dump_address_list(&iface->config_ip, false);
+               interface_ip_dump_address_list(&iface->proto_ip, false);
+               blobmsg_close_array(&b, a);
+               a = blobmsg_open_array(&b, "ipv6-address");
+               interface_ip_dump_address_list(&iface->config_ip, true);
+               interface_ip_dump_address_list(&iface->proto_ip, true);
                blobmsg_close_array(&b, a);
                a = blobmsg_open_array(&b, "route");
                interface_ip_dump_route_list(&iface->config_ip);
                interface_ip_dump_route_list(&iface->proto_ip);
                blobmsg_close_array(&b, a);
+               a = blobmsg_open_array(&b, "dns-server");
+               interface_ip_dump_dns_server_list(&iface->config_ip);
+               interface_ip_dump_dns_server_list(&iface->proto_ip);
+               blobmsg_close_array(&b, a);
+               a = blobmsg_open_array(&b, "dns-search");
+               interface_ip_dump_dns_search_list(&iface->config_ip);
+               interface_ip_dump_dns_search_list(&iface->proto_ip);
+               blobmsg_close_array(&b, a);
        }
 
        a = blobmsg_open_table(&b, "data");