Accept network names in per-zone subnet option
[project/firewall3.git] / zones.c
diff --git a/zones.c b/zones.c
index 846e430..a269629 100644 (file)
--- a/zones.c
+++ b/zones.c
@@ -73,15 +73,15 @@ const struct fw3_option fw3_zone_opts[] = {
 
        FW3_LIST("network",            device,   zone,     networks),
        FW3_LIST("device",             device,   zone,     devices),
-       FW3_LIST("subnet",             address,  zone,     subnets),
+       FW3_LIST("subnet",             network,  zone,     subnets),
 
        FW3_OPT("input",               target,   zone,     policy_input),
        FW3_OPT("forward",             target,   zone,     policy_forward),
        FW3_OPT("output",              target,   zone,     policy_output),
 
        FW3_OPT("masq",                bool,     zone,     masq),
-       FW3_LIST("masq_src",           address,  zone,     masq_src),
-       FW3_LIST("masq_dest",          address,  zone,     masq_dest),
+       FW3_LIST("masq_src",           network,  zone,     masq_src),
+       FW3_LIST("masq_dest",          network,  zone,     masq_dest),
 
        FW3_OPT("extra",               string,   zone,     extra_src),
        FW3_OPT("extra_src",           string,   zone,     extra_src),
@@ -243,8 +243,8 @@ fw3_load_zones(struct fw3_state *state, struct uci_package *p)
 
 
 static void
-print_zone_chain(enum fw3_table table, enum fw3_family family,
-                 struct fw3_zone *zone, bool reload, struct fw3_state *state)
+print_zone_chain(struct fw3_state *state, enum fw3_family family,
+                 enum fw3_table table, bool reload, struct fw3_zone *zone)
 {
        bool c, r;
        uint32_t custom_mask = ~0;
@@ -280,10 +280,12 @@ print_zone_chain(enum fw3_table table, enum fw3_family family,
 }
 
 static void
-print_interface_rule(enum fw3_table table, enum fw3_family family,
-                     struct fw3_zone *zone, struct fw3_device *dev,
-                     struct fw3_address *sub, bool reload, bool disable_notrack)
+print_interface_rule(struct fw3_state *state, enum fw3_family family,
+                     enum fw3_table table, bool reload, struct fw3_zone *zone,
+                     struct fw3_device *dev, struct fw3_address *sub)
 {
+       bool disable_notrack = state->defaults.drop_invalid;
+
        enum fw3_flag t;
 
 #define jump_target(t) \
@@ -388,8 +390,8 @@ print_interface_rule(enum fw3_table table, enum fw3_family family,
 }
 
 static void
-print_interface_rules(enum fw3_table table, enum fw3_family family,
-                      struct fw3_zone *zone, bool reload, bool disable_notrack)
+print_interface_rules(struct fw3_state *state, enum fw3_family family,
+                      enum fw3_table table, bool reload, struct fw3_zone *zone)
 {
        struct fw3_device *dev;
        struct fw3_address *sub;
@@ -403,13 +405,13 @@ print_interface_rules(enum fw3_table table, enum fw3_family family,
                if (!dev && !sub)
                        continue;
 
-               print_interface_rule(table, family, zone, dev, sub, reload, disable_notrack);
+               print_interface_rule(state, family, table, reload, zone, dev, sub);
        }
 }
 
 static void
-print_zone_rule(enum fw3_table table, enum fw3_family family,
-                struct fw3_zone *zone, bool reload, bool disable_notrack)
+print_zone_rule(struct fw3_state *state, enum fw3_family family,
+                enum fw3_table table, bool reload, struct fw3_zone *zone)
 {
        struct fw3_address *msrc;
        struct fw3_address *mdest;
@@ -460,9 +462,13 @@ print_zone_rule(enum fw3_table table, enum fw3_family family,
                        fw3_foreach(msrc, &zone->masq_src)
                        fw3_foreach(mdest, &zone->masq_dest)
                        {
-                               fw3_pr("-A zone_%s_postrouting ", zone->name);
+                               if (!fw3_is_family(msrc, family) ||
+                                   !fw3_is_family(mdest, family))
+                                       continue;
+
+                               fw3_pr("-A zone_%s_postrouting", zone->name);
                                fw3_format_src_dest(msrc, mdest);
-                               fw3_pr("-j MASQUERADE\n");
+                               fw3_pr(" -j MASQUERADE\n");
                        }
                }
                break;
@@ -472,32 +478,32 @@ print_zone_rule(enum fw3_table table, enum fw3_family family,
                break;
        }
 
-       print_interface_rules(table, family, zone, reload, disable_notrack);
+       print_interface_rules(state, family, table, reload, zone);
 }
 
 void
-fw3_print_zone_chains(enum fw3_table table, enum fw3_family family,
-                      bool reload, struct fw3_state *state)
+fw3_print_zone_chains(struct fw3_state *state, enum fw3_family family,
+                      enum fw3_table table, bool reload)
 {
        struct fw3_zone *zone;
 
        list_for_each_entry(zone, &state->zones, list)
-               print_zone_chain(table, family, zone, reload, state);
+               print_zone_chain(state, family, table, reload, zone);
 }
 
 void
-fw3_print_zone_rules(enum fw3_table table, enum fw3_family family,
-                     bool reload, struct fw3_state *state)
+fw3_print_zone_rules(struct fw3_state *state, enum fw3_family family,
+                     enum fw3_table table, bool reload)
 {
        struct fw3_zone *zone;
 
        list_for_each_entry(zone, &state->zones, list)
-               print_zone_rule(table, family, zone, reload, state->defaults.drop_invalid);
+               print_zone_rule(state, family, table, reload, zone);
 }
 
 void
-fw3_flush_zones(enum fw3_table table, enum fw3_family family,
-                           bool pass2, bool reload, struct fw3_state *state)
+fw3_flush_zones(struct fw3_state *state, enum fw3_family family,
+                enum fw3_table table, bool reload, bool pass2)
 {
        struct fw3_zone *z, *tmp;
        uint32_t custom_mask = ~0;
@@ -515,14 +521,12 @@ fw3_flush_zones(enum fw3_table table, enum fw3_family family,
                                pass2 ? "-X %s\n" : "-F %s\n", z->name);
 
                if (pass2)
-               {
                        del(z->flags, family, table);
-               }
        }
 }
 
 void
-fw3_hotplug_zones(bool add, struct fw3_state *state)
+fw3_hotplug_zones(struct fw3_state *state, bool add)
 {
        struct fw3_zone *z;
        struct fw3_device *d;