From a3606a74c672ef6471c006d15262dbb8ea60d025 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sun, 26 Feb 2012 17:12:59 +0100 Subject: [PATCH] proto: add an option for specifying external addresses using proto_apply_ip_settings() --- proto-static.c | 2 +- proto.c | 19 +++++++++++++------ 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 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 -- 2.25.1