proto: add an option for specifying external addresses using proto_apply_ip_settings()
authorFelix Fietkau <nbd@openwrt.org>
Sun, 26 Feb 2012 16:12:59 +0000 (17:12 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Sun, 26 Feb 2012 16:12:59 +0000 (17:12 +0100)
proto-static.c
proto.c
proto.h

index 4ee479320f664a0e865b1479c602ff9d93b5a6b4..be68e8e680c7b88d4d47a74648f2d627760f0e54 100644 (file)
@@ -20,7 +20,7 @@ struct static_proto_state {
 static bool
 static_proto_setup(struct static_proto_state *state)
 {
-       return proto_apply_ip_settings(state->proto.iface, state->config) == 0;
+       return proto_apply_ip_settings(state->proto.iface, state->config, false) == 0;
 }
 
 static int
diff --git a/proto.c b/proto.c
index dfdedcb028fb4a613ddc3d6ef919fac2bdfd7f96..ce56a66fba9c96a3150fccbe3b5bb15636ab9058 100644 (file)
--- a/proto.c
+++ b/proto.c
@@ -121,7 +121,7 @@ proto_parse_ip_addr_string(const char *str, bool v6, int mask)
 }
 
 static bool
-parse_addr(struct interface *iface, const char *str, bool v6, int mask)
+parse_addr(struct interface *iface, const char *str, bool v6, int mask, bool ext)
 {
        struct device_addr *addr;
 
@@ -130,20 +130,27 @@ parse_addr(struct interface *iface, const char *str, bool v6, int mask)
                interface_add_error(iface, "proto", "INVALID_ADDRESS", &str, 1);
                return false;
        }
+
+       if (ext)
+               addr->flags |= DEVADDR_EXTERNAL;
+
        vlist_add(&iface->proto_ip.addr, &addr->node);
        return true;
 }
 
 static int
-parse_address_option(struct interface *iface, struct blob_attr *attr, bool v6, int netmask)
+parse_address_option(struct interface *iface, struct blob_attr *attr, bool v6, int netmask, bool ext)
 {
        struct blob_attr *cur;
        int n_addr = 0;
        int rem;
 
        blobmsg_for_each_attr(cur, attr, rem) {
+               if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING)
+                       return -1;
+
                n_addr++;
-               if (!parse_addr(iface, blobmsg_data(cur), v6, netmask))
+               if (!parse_addr(iface, blobmsg_data(cur), v6, netmask, ext))
                        return -1;
        }
 
@@ -173,7 +180,7 @@ parse_gateway_option(struct interface *iface, struct blob_attr *attr, bool v6)
 }
 
 int
-proto_apply_ip_settings(struct interface *iface, struct blob_attr *attr)
+proto_apply_ip_settings(struct interface *iface, struct blob_attr *attr, bool ext)
 {
        struct blob_attr *tb[__OPT_MAX];
        const char *error;
@@ -191,10 +198,10 @@ proto_apply_ip_settings(struct interface *iface, struct blob_attr *attr)
        }
 
        if (tb[OPT_IPADDR])
-               n_v4 = parse_address_option(iface, tb[OPT_IPADDR], false, netmask);
+               n_v4 = parse_address_option(iface, tb[OPT_IPADDR], false, netmask, ext);
 
        if (tb[OPT_IP6ADDR])
-               n_v6 = parse_address_option(iface, tb[OPT_IP6ADDR], true, netmask);
+               n_v6 = parse_address_option(iface, tb[OPT_IP6ADDR], true, netmask, ext);
 
        if (!n_v4 && !n_v6) {
                error = "NO_ADDRESS";
diff --git a/proto.h b/proto.h
index 59307669333ea5a292734150e33e261177740f69..f8e7a865eed5f6e881708cbbe370b0983ca9e97b 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -58,7 +58,7 @@ int interface_proto_event(struct interface_proto_state *proto,
 struct device_addr *proto_parse_ip_addr_string(const char *str, bool v6, int mask);
 
 unsigned int parse_netmask_string(const char *str, bool v6);
-int proto_apply_ip_settings(struct interface *iface, struct blob_attr *attr);
+int proto_apply_ip_settings(struct interface *iface, struct blob_attr *attr, bool ext);
 
 
 #endif