summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2012-02-26 17:12:59 +0100
committerFelix Fietkau <nbd@openwrt.org>2012-02-26 17:12:59 +0100
commita3606a74c672ef6471c006d15262dbb8ea60d025 (patch)
tree5f8da24901f5ca218978e5d2eda4acc037f9900b
parent285039a8783654439d9c0e29aac16e3893e2444b (diff)
proto: add an option for specifying external addresses using proto_apply_ip_settings()
-rw-r--r--proto-static.c2
-rw-r--r--proto.c19
-rw-r--r--proto.h2
3 files changed, 15 insertions, 8 deletions
diff --git a/proto-static.c b/proto-static.c
index 4ee4793..be68e8e 100644
--- a/proto-static.c
+++ b/proto-static.c
@@ -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 dfdedcb..ce56a66 100644
--- 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 5930766..f8e7a86 100644
--- 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