diff options
author | Felix Fietkau <nbd@openwrt.org> | 2012-02-26 17:12:59 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2012-02-26 17:12:59 +0100 |
commit | a3606a74c672ef6471c006d15262dbb8ea60d025 (patch) | |
tree | 5f8da24901f5ca218978e5d2eda4acc037f9900b | |
parent | 285039a8783654439d9c0e29aac16e3893e2444b (diff) |
proto: add an option for specifying external addresses using proto_apply_ip_settings()
-rw-r--r-- | proto-static.c | 2 | ||||
-rw-r--r-- | proto.c | 19 | ||||
-rw-r--r-- | proto.h | 2 |
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 @@ -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"; @@ -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 |