}
}
}
+ else if ((p = strchr(s, '-')) != NULL)
+ {
+ *p++ = 0;
+
+ if (inet_pton(AF_INET6, p, &v6))
+ {
+ addr->family = FW3_FAMILY_V6;
+ addr->address2.v6 = v6;
+ addr->range = true;
+ }
+ else if (inet_pton(AF_INET, p, &v4))
+ {
+ addr->family = FW3_FAMILY_V4;
+ addr->address2.v4 = v4;
+ addr->range = true;
+ }
+ else
+ {
+ free(s);
+ return false;
+ }
+ }
if (inet_pton(AF_INET6, s, &v6))
{
void
-fw3_parse_options(void *s,
- struct fw3_option *opts, int n,
+fw3_parse_options(void *s, const struct fw3_option *opts,
struct uci_section *section)
{
- int i;
char *p;
bool known;
struct uci_element *e, *l;
struct uci_option *o;
- struct fw3_option *opt;
+ const struct fw3_option *opt;
struct list_head *item;
struct list_head *dest;
o = uci_to_option(e);
known = false;
- for (i = 0; i < n; i++)
+ for (opt = opts; opt->name; opt++)
{
- opt = &opts[i];
-
- if (!opt->parse || !opt->name)
+ if (!opt->parse)
continue;
if (strcmp(opt->name, e->name))
{
char s[INET6_ADDRSTRLEN];
+ if ((src && src->range) || (dest && dest->range))
+ fw3_pr(" -m iprange");
+
if (src && src->set)
{
- inet_ntop(src->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
- &src->address.v4, s, sizeof(s));
+ if (src->range)
+ {
+ inet_ntop(src->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
+ &src->address.v4, s, sizeof(s));
- fw3_pr(" %s-s %s/%u", src->invert ? "! " : "", s, src->mask);
+ fw3_pr(" %s--src-range %s", src->invert ? "! " : "", s);
+
+ inet_ntop(src->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
+ &src->address2.v4, s, sizeof(s));
+
+ fw3_pr("-%s", s);
+ }
+ else
+ {
+ inet_ntop(src->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
+ &src->address.v4, s, sizeof(s));
+
+ fw3_pr(" %s-s %s/%u", src->invert ? "! " : "", s, src->mask);
+ }
}
if (dest && dest->set)
{
- inet_ntop(dest->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
- &dest->address.v4, s, sizeof(s));
+ if (dest->range)
+ {
+ inet_ntop(dest->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
+ &dest->address.v4, s, sizeof(s));
- fw3_pr(" %s-d %s/%u", dest->invert ? "! " : "", s, dest->mask);
+ fw3_pr(" %s--dst-range %s", dest->invert ? "! " : "", s);
+
+ inet_ntop(dest->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
+ &dest->address2.v4, s, sizeof(s));
+
+ fw3_pr("-%s", s);
+ }
+ else
+ {
+ inet_ntop(dest->family == FW3_FAMILY_V4 ? AF_INET : AF_INET6,
+ &dest->address.v4, s, sizeof(s));
+
+ fw3_pr(" %s-d %s/%u", dest->invert ? "! " : "", s, dest->mask);
+ }
}
}