From 1fc128a60160ffe912a06ab6f7870b260438b37d Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Sun, 26 May 2013 16:02:24 +0200 Subject: [PATCH] Add fw3_resolve_zone_addresses() helper to obtain a list of all subnets covered by a zone --- zones.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ zones.h | 2 ++ 2 files changed, 47 insertions(+) diff --git a/zones.c b/zones.c index 4c17c68..dbf682f 100644 --- a/zones.c +++ b/zones.c @@ -643,6 +643,51 @@ fw3_lookup_zone(struct fw3_state *state, const char *name) return NULL; } +struct list_head * +fw3_resolve_zone_addresses(struct fw3_zone *zone) +{ + struct fw3_device *net; + struct fw3_address *addr, *tmp; + struct list_head *addrs, *all; + + all = malloc(sizeof(*all)); + + if (!all) + return NULL; + + memset(all, 0, sizeof(*all)); + INIT_LIST_HEAD(all); + + list_for_each_entry(net, &zone->networks, list) + { + addrs = fw3_ubus_address(net->name); + + if (!addrs) + continue; + + list_for_each_entry_safe(addr, tmp, addrs, list) + { + list_del(&addr->list); + list_add_tail(&addr->list, all); + } + + free(addrs); + } + + list_for_each_entry(addr, &zone->subnets, list) + { + tmp = malloc(sizeof(*tmp)); + + if (!tmp) + continue; + + memcpy(tmp, addr, sizeof(*tmp)); + list_add_tail(&tmp->list, all); + } + + return all; +} + void fw3_free_zone(struct fw3_zone *zone) { diff --git a/zones.h b/zones.h index dfae81c..b438870 100644 --- a/zones.h +++ b/zones.h @@ -44,6 +44,8 @@ void fw3_hotplug_zones(struct fw3_state *state, bool add); struct fw3_zone * fw3_lookup_zone(struct fw3_state *state, const char *name); +struct list_head * fw3_resolve_zone_addresses(struct fw3_zone *zone); + void fw3_free_zone(struct fw3_zone *zone); #define fw3_to_src_target(t) \ -- 2.11.0