[git commit] tcpudp: shrink per-host rate-limiting code

Denys Vlasenko vda.linux at googlemail.com
Tue Feb 27 12:03:44 UTC 2018


commit: https://git.busybox.net/busybox/commit/?id=d82ea2ba8f9486d338b3aefe161afd4f77ce7a86
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

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 at googlemail.com>
---
 networking/tcpudp.c         |  7 ++++---
 networking/tcpudp_perhost.c | 22 +++++++++-------------
 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 {
 	unsigned cur_per_host;
 	unsigned cnum;
 	unsigned cmax;
+	struct hcc *cc;
 	char **env_cur;
 	char *env_var[1]; /* actually bigger */
 } FIX_ALIASING;
@@ -229,7 +230,7 @@ static void sig_child_handler(int sig UNUSED_PARAM)
 
 	while ((pid = wait_any_nohang(&wstat)) > 0) {
 		if (max_per_host)
-			ipsvd_perhost_remove(pid);
+			ipsvd_perhost_remove(G.cc, pid);
 		if (cnum)
 			cnum--;
 		if (verbose)
@@ -347,7 +348,7 @@ int tcpudpsvd_main(int argc UNUSED_PARAM, char **argv)
 	signal(SIGPIPE, SIG_IGN);
 
 	if (max_per_host)
-		ipsvd_perhost_init(cmax);
+		G.cc = ipsvd_perhost_init(cmax);
 
 	local_port = bb_lookup_port(argv[1], tcp ? "tcp" : "udp", 0);
 	lsa = xhost2sockaddr(argv[0], local_port);
@@ -422,7 +423,7 @@ int tcpudpsvd_main(int argc UNUSED_PARAM, char **argv)
 		/* Drop connection immediately if cur_per_host > max_per_host
 		 * (minimizing load under SYN flood) */
 		remote_addr = xmalloc_sockaddr2dotted_noport(&remote.u.sa);
-		cur_per_host = ipsvd_perhost_add(remote_addr, max_per_host, &hccp);
+		cur_per_host = ipsvd_perhost_add(G.cc, remote_addr, max_per_host, &hccp);
 		if (cur_per_host > max_per_host) {
 			/* ipsvd_perhost_add detected that max is exceeded
 			 * (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 @@
 #include "libbb.h"
 #include "tcpudp_perhost.h"
 
-static struct hcc *cc;
-static unsigned cclen;
-
-/* to be optimized */
-
-void ipsvd_perhost_init(unsigned c)
+struct hcc* FAST_FUNC ipsvd_perhost_init(unsigned c)
 {
 //	free(cc);
-	cc = xzalloc(c * sizeof(*cc));
-	cclen = c;
+	struct hcc *cc = xzalloc((c + 1) * sizeof(*cc));
+	cc[c].pid = -1; /* "end" marker */
+	return cc;
 }
 
-unsigned ipsvd_perhost_add(char *ip, unsigned maxconn, struct hcc **hccpp)
+unsigned FAST_FUNC ipsvd_perhost_add(struct hcc *cc, char *ip, unsigned maxconn, struct hcc **hccpp)
 {
 	unsigned i;
 	unsigned conn = 1;
 	int freepos = -1;
 
-	for (i = 0; i < cclen; ++i) {
+	for (i = 0; cc[i].pid >= 0; ++i) {
 		if (!cc[i].ip) {
 			freepos = i;
 			continue;
@@ -46,10 +42,10 @@ unsigned ipsvd_perhost_add(char *ip, unsigned maxconn, struct hcc **hccpp)
 	return conn;
 }
 
-void ipsvd_perhost_remove(int pid)
+void FAST_FUNC ipsvd_perhost_remove(struct hcc *cc, int pid)
 {
 	unsigned i;
-	for (i = 0; i < cclen; ++i) {
+	for (i = 0; cc[i].pid >= 0; ++i) {
 		if (cc[i].pid == pid) {
 			free(cc[i].ip);
 			cc[i].ip = NULL;
@@ -59,7 +55,7 @@ void ipsvd_perhost_remove(int pid)
 	}
 }
 
-//void ipsvd_perhost_free(void)
+//void ipsvd_perhost_free(struct hcc *cc)
 //{
 //	free(cc);
 //}
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 {
 	int pid;
 };
 
-void ipsvd_perhost_init(unsigned);
+struct hcc* FAST_FUNC ipsvd_perhost_init(unsigned);
 
 /* Returns number of already opened connects to this ips, including this one.
  * ip should be a malloc'ed ptr.
@@ -22,12 +22,12 @@ void ipsvd_perhost_init(unsigned);
  * and pointer to table entry if stored in *hccpp
  * (useful for storing pid later).
  * Else ip is NOT inserted (you must take care of it - free() etc) */
-unsigned ipsvd_perhost_add(char *ip, unsigned maxconn, struct hcc **hccpp);
+unsigned FAST_FUNC ipsvd_perhost_add(struct hcc *cc, char *ip, unsigned maxconn, struct hcc **hccpp);
 
 /* Finds and frees element with pid */
-void ipsvd_perhost_remove(int pid);
+void FAST_FUNC ipsvd_perhost_remove(struct hcc *cc, int pid);
 
 //unsigned ipsvd_perhost_setpid(int pid);
-//void ipsvd_perhost_free(void);
+//void ipsvd_perhost_free(struct hcc *cc);
 
 POP_SAVED_FUNCTION_VISIBILITY


More information about the busybox-cvs mailing list