Store ipset storage method and matches in state file, keep iprange and ports if set
[project/firewall3.git] / utils.c
diff --git a/utils.c b/utils.c
index 3558450..a728e77 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -490,22 +490,15 @@ static void
 write_ipset_uci(struct uci_context *ctx, struct fw3_ipset *s,
                 struct uci_package *dest)
 {
-       enum fw3_family fam = FW3_FAMILY_ANY;
+       struct fw3_ipset_datatype *type;
 
-       char buf[sizeof("0xffffffff\0")];
+       char buf[sizeof("65535-65535\0")];
 
        struct uci_ptr ptr = { .p = dest };
 
        if (!s->enabled || (s->external && *s->external))
                return;
 
-       if (fw3_no_family(s->flags[0]) && !fw3_no_family(s->flags[1]))
-               fam = FW3_FAMILY_V6;
-       else if (!fw3_no_family(s->flags[0]) && fw3_no_family(s->flags[1]))
-               fam = FW3_FAMILY_V4;
-       else if (fw3_no_family(s->flags[0]) && fw3_no_family(s->flags[1]))
-               return;
-
        uci_add_section(ctx, dest, "ipset", &ptr.s);
 
        ptr.o      = NULL;
@@ -513,25 +506,38 @@ write_ipset_uci(struct uci_context *ctx, struct fw3_ipset *s,
        ptr.value  = s->name;
        uci_set(ctx, &ptr);
 
-       if (fam != FW3_FAMILY_ANY)
+       ptr.o      = NULL;
+       ptr.option = "storage";
+       ptr.value  = fw3_ipset_method_names[s->method];
+       uci_set(ctx, &ptr);
+
+       list_for_each_entry(type, &s->datatypes, list)
        {
+               sprintf(buf, "%s_%s", type->dest ? "dst" : "src",
+                                     fw3_ipset_type_names[type->type]);
+
                ptr.o      = NULL;
-               ptr.option = "family";
-               ptr.value  = fw3_flag_names[fam];
-               uci_set(ctx, &ptr);
+               ptr.option = "match";
+               ptr.value  = buf;
+               uci_add_list(ctx, &ptr);
        }
 
-       sprintf(buf, "0x%x", s->flags[0]);
-       ptr.o      = NULL;
-       ptr.option = "__flags_v4";
-       ptr.value  = buf;
-       uci_set(ctx, &ptr);
+       if (s->iprange.set)
+       {
+               ptr.o      = NULL;
+               ptr.option = "iprange";
+               ptr.value  = fw3_address_to_string(&s->iprange, false);
+               uci_set(ctx, &ptr);
+       }
 
-       sprintf(buf, "0x%x", s->flags[1]);
-       ptr.o      = NULL;
-       ptr.option = "__flags_v6";
-       ptr.value  = buf;
-       uci_set(ctx, &ptr);
+       if (s->portrange.set)
+       {
+               sprintf(buf, "%u-%u", s->portrange.port_min, s->portrange.port_max);
+               ptr.o      = NULL;
+               ptr.option = "portrange";
+               ptr.value  = buf;
+               uci_set(ctx, &ptr);
+       }
 }
 
 void