diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-02-27 13:03:44 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-02-27 13:03:44 +0100 |
commit | d82ea2ba8f9486d338b3aefe161afd4f77ce7a86 (patch) | |
tree | b07fd8b2e617dd973f2ea39c448c1fd079bd5677 /networking/tcpudp.c | |
parent | 0e0209ac5312fb0a4cf740f59e3564c6549f4d77 (diff) | |
download | busybox-w32-d82ea2ba8f9486d338b3aefe161afd4f77ce7a86.tar.gz busybox-w32-d82ea2ba8f9486d338b3aefe161afd4f77ce7a86.tar.bz2 busybox-w32-d82ea2ba8f9486d338b3aefe161afd4f77ce7a86.zip |
tcpudp: shrink per-host rate-limiting code
function old new delta
tcpudpsvd_main 1775 1780 +5
ipsvd_perhost_add 108 107 -1
cclen 4 - -4
cc 4 - -4
ipsvd_perhost_init 30 25 -5
ipsvd_perhost_remove 80 44 -36
------------------------------------------------------------------------------
(add/remove: 0/2 grow/shrink: 1/3 up/down: 5/-50) Total: -45 bytes
text data bss dec hex filename
933358 473 6852 940683 e5a8b busybox_old
933326 473 6844 940643 e5a63 busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking/tcpudp.c')
-rw-r--r-- | networking/tcpudp.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/networking/tcpudp.c b/networking/tcpudp.c index 2feb63a01..a90e3f80a 100644 --- a/networking/tcpudp.c +++ b/networking/tcpudp.c | |||
@@ -127,6 +127,7 @@ struct globals { | |||
127 | unsigned cur_per_host; | 127 | unsigned cur_per_host; |
128 | unsigned cnum; | 128 | unsigned cnum; |
129 | unsigned cmax; | 129 | unsigned cmax; |
130 | struct hcc *cc; | ||
130 | char **env_cur; | 131 | char **env_cur; |
131 | char *env_var[1]; /* actually bigger */ | 132 | char *env_var[1]; /* actually bigger */ |
132 | } FIX_ALIASING; | 133 | } FIX_ALIASING; |
@@ -229,7 +230,7 @@ static void sig_child_handler(int sig UNUSED_PARAM) | |||
229 | 230 | ||
230 | while ((pid = wait_any_nohang(&wstat)) > 0) { | 231 | while ((pid = wait_any_nohang(&wstat)) > 0) { |
231 | if (max_per_host) | 232 | if (max_per_host) |
232 | ipsvd_perhost_remove(pid); | 233 | ipsvd_perhost_remove(G.cc, pid); |
233 | if (cnum) | 234 | if (cnum) |
234 | cnum--; | 235 | cnum--; |
235 | if (verbose) | 236 | if (verbose) |
@@ -347,7 +348,7 @@ int tcpudpsvd_main(int argc UNUSED_PARAM, char **argv) | |||
347 | signal(SIGPIPE, SIG_IGN); | 348 | signal(SIGPIPE, SIG_IGN); |
348 | 349 | ||
349 | if (max_per_host) | 350 | if (max_per_host) |
350 | ipsvd_perhost_init(cmax); | 351 | G.cc = ipsvd_perhost_init(cmax); |
351 | 352 | ||
352 | local_port = bb_lookup_port(argv[1], tcp ? "tcp" : "udp", 0); | 353 | local_port = bb_lookup_port(argv[1], tcp ? "tcp" : "udp", 0); |
353 | lsa = xhost2sockaddr(argv[0], local_port); | 354 | lsa = xhost2sockaddr(argv[0], local_port); |
@@ -422,7 +423,7 @@ int tcpudpsvd_main(int argc UNUSED_PARAM, char **argv) | |||
422 | /* Drop connection immediately if cur_per_host > max_per_host | 423 | /* Drop connection immediately if cur_per_host > max_per_host |
423 | * (minimizing load under SYN flood) */ | 424 | * (minimizing load under SYN flood) */ |
424 | remote_addr = xmalloc_sockaddr2dotted_noport(&remote.u.sa); | 425 | remote_addr = xmalloc_sockaddr2dotted_noport(&remote.u.sa); |
425 | cur_per_host = ipsvd_perhost_add(remote_addr, max_per_host, &hccp); | 426 | cur_per_host = ipsvd_perhost_add(G.cc, remote_addr, max_per_host, &hccp); |
426 | if (cur_per_host > max_per_host) { | 427 | if (cur_per_host > max_per_host) { |
427 | /* ipsvd_perhost_add detected that max is exceeded | 428 | /* ipsvd_perhost_add detected that max is exceeded |
428 | * (and did not store ip in connection table) */ | 429 | * (and did not store ip in connection table) */ |