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/tun | |
parent | 0c9ca79b2eb820c3266e9117f3ba9179cbdc2ff1 (diff) | |
download | gnunet-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.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 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, | |||
121 | int | 121 | int |
122 | main (int argc, char *argv[]) | 122 | main (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", |