diff options
author | Christian Grothoff <christian@grothoff.org> | 2013-10-26 14:57:24 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2013-10-26 14:57:24 +0000 |
commit | 87b7d2bc3d9cc8c4da313e5dc60fa497d65eb0e2 (patch) | |
tree | 83bc7d72ac31fff436525d75d3ddb7b59ba04a7b /src | |
parent | 0c9ca79b2eb820c3266e9117f3ba9179cbdc2ff1 (diff) |
-faster port range generation, O(n) instead of O(n^2)
Diffstat (limited to 'src')
-rw-r--r-- | src/tun/regex.c | 23 | ||||
-rw-r--r-- | src/tun/test_regex.c | 9 |
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", |