aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2013-10-26 14:57:24 +0000
committerChristian Grothoff <christian@grothoff.org>2013-10-26 14:57:24 +0000
commit87b7d2bc3d9cc8c4da313e5dc60fa497d65eb0e2 (patch)
tree83bc7d72ac31fff436525d75d3ddb7b59ba04a7b /src
parent0c9ca79b2eb820c3266e9117f3ba9179cbdc2ff1 (diff)
-faster port range generation, O(n) instead of O(n^2)
Diffstat (limited to 'src')
-rw-r--r--src/tun/regex.c23
-rw-r--r--src/tun/test_regex.c9
2 files changed, 21 insertions, 11 deletions
diff --git a/src/tun/regex.c b/src/tun/regex.c
index 3d3ebd8bac..478132f4ea 100644
--- a/src/tun/regex.c
+++ b/src/tun/regex.c
@@ -186,8 +186,9 @@ port_to_regex (const struct GNUNET_STRINGS_PortPolicy *pp)
{
char *reg;
char *ret;
- char *tmp;
+ char *pos;
unsigned int i;
+ unsigned int cnt;
if ( (0 == pp->start_port) ||
( (1 == pp->start_port) &&
@@ -202,27 +203,31 @@ port_to_regex (const struct GNUNET_STRINGS_PortPolicy *pp)
pp->start_port);
return ret;
}
- reg = NULL;
+ cnt = pp->end_port - pp->start_port + 1;
+ if (GNUNET_YES == pp->negate_portrange)
+ cnt = 0xFFFF - cnt;
+ reg = GNUNET_malloc (cnt * 5 + 1);
+ pos = reg;
for (i=1;i<=0xFFFF;i++)
{
if ( ( (i >= pp->start_port) && (i <= pp->end_port) ) ^
(GNUNET_YES == pp->negate_portrange) )
{
- if (NULL == reg)
+ if (pos == reg)
{
- GNUNET_asprintf (&tmp,
+ GNUNET_snprintf (pos,
+ 5,
"%04X",
i);
}
else
{
- GNUNET_asprintf (&tmp,
- "%s|%04X",
- reg,
+ GNUNET_snprintf (pos,
+ 6,
+ "|%04X",
i);
- GNUNET_free (reg);
}
- reg = tmp;
+ pos += strlen (pos);
}
}
GNUNET_asprintf (&ret,
diff --git a/src/tun/test_regex.c b/src/tun/test_regex.c
index 341d8b9a09..3f0f898a92 100644
--- a/src/tun/test_regex.c
+++ b/src/tun/test_regex.c
@@ -121,12 +121,17 @@ test_policy6toregex (const char *policy,
int
main (int argc, char *argv[])
{
- GNUNET_log_setup ("test-regex", "WARNING", NULL);
-
int error;
+ char *r;
+ GNUNET_log_setup ("test-regex", "WARNING", NULL);
error = 0;
+ /* this is just a performance test ... */
+ r = GNUNET_TUN_ipv4policy2regex ("1.2.3.4/16:!25;");
+ GNUNET_break (NULL != r);
+ GNUNET_free (r);
+
error +=
test_iptoregex ("192.1.2.3", 2086,
"4-0826-C0010203",