diff options
-rw-r--r-- | networking/tcpudp.c | 7 | ||||
-rw-r--r-- | networking/tcpudp_perhost.c | 22 | ||||
-rw-r--r-- | networking/tcpudp_perhost.h | 8 |
3 files changed, 17 insertions, 20 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) */ |
diff --git a/networking/tcpudp_perhost.c b/networking/tcpudp_perhost.c index 105410883..2643f8d16 100644 --- a/networking/tcpudp_perhost.c +++ b/networking/tcpudp_perhost.c | |||
@@ -10,25 +10,21 @@ | |||
10 | #include "libbb.h" | 10 | #include "libbb.h" |
11 | #include "tcpudp_perhost.h" | 11 | #include "tcpudp_perhost.h" |
12 | 12 | ||
13 | static struct hcc *cc; | 13 | struct hcc* FAST_FUNC ipsvd_perhost_init(unsigned c) |
14 | static unsigned cclen; | ||
15 | |||
16 | /* to be optimized */ | ||
17 | |||
18 | void ipsvd_perhost_init(unsigned c) | ||
19 | { | 14 | { |
20 | // free(cc); | 15 | // free(cc); |
21 | cc = xzalloc(c * sizeof(*cc)); | 16 | struct hcc *cc = xzalloc((c + 1) * sizeof(*cc)); |
22 | cclen = c; | 17 | cc[c].pid = -1; /* "end" marker */ |
18 | return cc; | ||
23 | } | 19 | } |
24 | 20 | ||
25 | unsigned ipsvd_perhost_add(char *ip, unsigned maxconn, struct hcc **hccpp) | 21 | unsigned FAST_FUNC ipsvd_perhost_add(struct hcc *cc, char *ip, unsigned maxconn, struct hcc **hccpp) |
26 | { | 22 | { |
27 | unsigned i; | 23 | unsigned i; |
28 | unsigned conn = 1; | 24 | unsigned conn = 1; |
29 | int freepos = -1; | 25 | int freepos = -1; |
30 | 26 | ||
31 | for (i = 0; i < cclen; ++i) { | 27 | for (i = 0; cc[i].pid >= 0; ++i) { |
32 | if (!cc[i].ip) { | 28 | if (!cc[i].ip) { |
33 | freepos = i; | 29 | freepos = i; |
34 | continue; | 30 | continue; |
@@ -46,10 +42,10 @@ unsigned ipsvd_perhost_add(char *ip, unsigned maxconn, struct hcc **hccpp) | |||
46 | return conn; | 42 | return conn; |
47 | } | 43 | } |
48 | 44 | ||
49 | void ipsvd_perhost_remove(int pid) | 45 | void FAST_FUNC ipsvd_perhost_remove(struct hcc *cc, int pid) |
50 | { | 46 | { |
51 | unsigned i; | 47 | unsigned i; |
52 | for (i = 0; i < cclen; ++i) { | 48 | for (i = 0; cc[i].pid >= 0; ++i) { |
53 | if (cc[i].pid == pid) { | 49 | if (cc[i].pid == pid) { |
54 | free(cc[i].ip); | 50 | free(cc[i].ip); |
55 | cc[i].ip = NULL; | 51 | cc[i].ip = NULL; |
@@ -59,7 +55,7 @@ void ipsvd_perhost_remove(int pid) | |||
59 | } | 55 | } |
60 | } | 56 | } |
61 | 57 | ||
62 | //void ipsvd_perhost_free(void) | 58 | //void ipsvd_perhost_free(struct hcc *cc) |
63 | //{ | 59 | //{ |
64 | // free(cc); | 60 | // free(cc); |
65 | //} | 61 | //} |
diff --git a/networking/tcpudp_perhost.h b/networking/tcpudp_perhost.h index 3e5757678..3b14d9a57 100644 --- a/networking/tcpudp_perhost.h +++ b/networking/tcpudp_perhost.h | |||
@@ -14,7 +14,7 @@ struct hcc { | |||
14 | int pid; | 14 | int pid; |
15 | }; | 15 | }; |
16 | 16 | ||
17 | void ipsvd_perhost_init(unsigned); | 17 | struct hcc* FAST_FUNC ipsvd_perhost_init(unsigned); |
18 | 18 | ||
19 | /* Returns number of already opened connects to this ips, including this one. | 19 | /* Returns number of already opened connects to this ips, including this one. |
20 | * ip should be a malloc'ed ptr. | 20 | * ip should be a malloc'ed ptr. |
@@ -22,12 +22,12 @@ void ipsvd_perhost_init(unsigned); | |||
22 | * and pointer to table entry if stored in *hccpp | 22 | * and pointer to table entry if stored in *hccpp |
23 | * (useful for storing pid later). | 23 | * (useful for storing pid later). |
24 | * Else ip is NOT inserted (you must take care of it - free() etc) */ | 24 | * Else ip is NOT inserted (you must take care of it - free() etc) */ |
25 | unsigned ipsvd_perhost_add(char *ip, unsigned maxconn, struct hcc **hccpp); | 25 | unsigned FAST_FUNC ipsvd_perhost_add(struct hcc *cc, char *ip, unsigned maxconn, struct hcc **hccpp); |
26 | 26 | ||
27 | /* Finds and frees element with pid */ | 27 | /* Finds and frees element with pid */ |
28 | void ipsvd_perhost_remove(int pid); | 28 | void FAST_FUNC ipsvd_perhost_remove(struct hcc *cc, int pid); |
29 | 29 | ||
30 | //unsigned ipsvd_perhost_setpid(int pid); | 30 | //unsigned ipsvd_perhost_setpid(int pid); |
31 | //void ipsvd_perhost_free(void); | 31 | //void ipsvd_perhost_free(struct hcc *cc); |
32 | 32 | ||
33 | POP_SAVED_FUNCTION_VISIBILITY | 33 | POP_SAVED_FUNCTION_VISIBILITY |