aboutsummaryrefslogtreecommitdiff
path: root/src/tun
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/tun
parent0c9ca79b2eb820c3266e9117f3ba9179cbdc2ff1 (diff)
downloadgnunet-87b7d2bc3d9cc8c4da313e5dc60fa497d65eb0e2.tar.gz
gnunet-87b7d2bc3d9cc8c4da313e5dc60fa497d65eb0e2.zip
-faster port range generation, O(n) instead of O(n^2)
Diffstat (limited to 'src/tun')
-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 3d3ebd8ba..478132f4e 100644
--- a/src/tun/regex.c
+++ b/src/tun/regex.c
@@ -186,8 +186,9 @@ port_to_regex (const struct GNUNET_STRINGS_PortPolicy *pp)
186{ 186{
187 char *reg; 187 char *reg;
188 char *ret; 188 char *ret;
189 char *tmp; 189 char *pos;
190 unsigned int i; 190 unsigned int i;
191 unsigned int cnt;
191 192
192 if ( (0 == pp->start_port) || 193 if ( (0 == pp->start_port) ||
193 ( (1 == pp->start_port) && 194 ( (1 == pp->start_port) &&
@@ -202,27 +203,31 @@ port_to_regex (const struct GNUNET_STRINGS_PortPolicy *pp)
202 pp->start_port); 203 pp->start_port);
203 return ret; 204 return ret;
204 } 205 }
205 reg = NULL; 206 cnt = pp->end_port - pp->start_port + 1;
207 if (GNUNET_YES == pp->negate_portrange)
208 cnt = 0xFFFF - cnt;
209 reg = GNUNET_malloc (cnt * 5 + 1);
210 pos = reg;
206 for (i=1;i<=0xFFFF;i++) 211 for (i=1;i<=0xFFFF;i++)
207 { 212 {
208 if ( ( (i >= pp->start_port) && (i <= pp->end_port) ) ^ 213 if ( ( (i >= pp->start_port) && (i <= pp->end_port) ) ^
209 (GNUNET_YES == pp->negate_portrange) ) 214 (GNUNET_YES == pp->negate_portrange) )
210 { 215 {
211 if (NULL == reg) 216 if (pos == reg)
212 { 217 {
213 GNUNET_asprintf (&tmp, 218 GNUNET_snprintf (pos,
219 5,
214 "%04X", 220 "%04X",
215 i); 221 i);
216 } 222 }
217 else 223 else
218 { 224 {
219 GNUNET_asprintf (&tmp, 225 GNUNET_snprintf (pos,
220 "%s|%04X", 226 6,
221 reg, 227 "|%04X",
222 i); 228 i);
223 GNUNET_free (reg);
224 } 229 }
225 reg = tmp; 230 pos += strlen (pos);
226 } 231 }
227 } 232 }
228 GNUNET_asprintf (&ret, 233 GNUNET_asprintf (&ret,
diff --git a/src/tun/test_regex.c b/src/tun/test_regex.c
index 341d8b9a0..3f0f898a9 100644
--- a/src/tun/test_regex.c
+++ b/src/tun/test_regex.c
@@ -121,12 +121,17 @@ test_policy6toregex (const char *policy,
121int 121int
122main (int argc, char *argv[]) 122main (int argc, char *argv[])
123{ 123{
124 GNUNET_log_setup ("test-regex", "WARNING", NULL);
125
126 int error; 124 int error;
125 char *r;
127 126
127 GNUNET_log_setup ("test-regex", "WARNING", NULL);
128 error = 0; 128 error = 0;
129 129
130 /* this is just a performance test ... */
131 r = GNUNET_TUN_ipv4policy2regex ("1.2.3.4/16:!25;");
132 GNUNET_break (NULL != r);
133 GNUNET_free (r);
134
130 error += 135 error +=
131 test_iptoregex ("192.1.2.3", 2086, 136 test_iptoregex ("192.1.2.3", 2086,
132 "4-0826-C0010203", 137 "4-0826-C0010203",