From 25c375a78a45748b2d2debd32681c7f1673e12b3 Mon Sep 17 00:00:00 2001 From: Daniel Winzen Date: Thu, 3 Nov 2022 23:10:11 +0100 Subject: [PATCH 1/5] Increase backlog of listening sockets to match maxconn --- src/proxymain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/proxymain.c b/src/proxymain.c index 419d745..5cf6d6c 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -649,7 +649,7 @@ int MODULEMAINFUNC (int argc, char** argv){ } } if(!isudp){ - if(so._listen (sock, 1 + (srv.maxchild>>4))==-1) { + if(so._listen (sock, srv.maxchild)==-1) { sprintf((char *)buf, "listen(): %s", strerror(errno)); if(!srv.silent)dolog(&defparam, buf); return -4; From 65e57a251d77b085a1d98532bb54da29f908d8ab Mon Sep 17 00:00:00 2001 From: Daniel Winzen Date: Tue, 8 Nov 2022 13:25:05 +0100 Subject: [PATCH 2/5] Clarify use of maxconn in man page --- man/3proxy.cfg.3 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/man/3proxy.cfg.3 b/man/3proxy.cfg.3 index 82ba02a..83455d4 100644 --- a/man/3proxy.cfg.3 +++ b/man/3proxy.cfg.3 @@ -482,8 +482,12 @@ External or -e can be given twice: once with IPv4 and once with IPv6 address. .B maxconn .br - sets maximum number of simulationeous connections to each services -started after this command. Default is 100. + sets maximum number of simulationeous connections to each service +started after this command on network level. Default is 100. +.br + To limit clients, use connlim instead. maxconn will silently ignore +new connections, while connlim will report back to the client that +the connection limit has been reached. .br .B service From 9a6908e623901a6e5c57125a188342b8035e14b9 Mon Sep 17 00:00:00 2001 From: Daniel Winzen Date: Tue, 8 Nov 2022 15:01:39 +0100 Subject: [PATCH 3/5] Add backlog config option --- doc/html/howtoe.html | 2 +- man/3proxy.cfg.3 | 6 ++++++ src/common.c | 2 +- src/conf.c | 11 +++++++++++ src/proxymain.c | 3 ++- src/structures.h | 3 ++- 6 files changed, 23 insertions(+), 4 deletions(-) diff --git a/doc/html/howtoe.html b/doc/html/howtoe.html index 8adcfb0..9d49696 100644 --- a/doc/html/howtoe.html +++ b/doc/html/howtoe.html @@ -20,7 +20,7 @@
  • How to make 3proxy start
  • How to make limitation (access, bandwidth, traffic, connections) work
  • How to make 3proxy to run as a service
  • -
  • How to understand internal ¨ external
  • +
  • How to understand internal and external
  • How to make ODBC logging work?
  • How to make IPv6 work
  • How to fix 3proxy crashes
  • diff --git a/man/3proxy.cfg.3 b/man/3proxy.cfg.3 index 83455d4..3f38088 100644 --- a/man/3proxy.cfg.3 +++ b/man/3proxy.cfg.3 @@ -489,6 +489,12 @@ started after this command on network level. Default is 100. new connections, while connlim will report back to the client that the connection limit has been reached. +.br +.B backlog +.br + sets the listening socket backlog of new connections. Default is +1+(maxconn>>3). Maximum value is capped by kernel tunable somaxconn. + .br .B service .br diff --git a/src/common.c b/src/common.c index 81839fe..462133d 100644 --- a/src/common.c +++ b/src/common.c @@ -102,7 +102,7 @@ struct extparam conf = { NULL, 0, 0, -1, 0, 0, 0, 0, - 0, 500, 0, 0, 0, 0, 0, 2, + 0, 500, 13, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, 600, 1048576, diff --git a/src/conf.c b/src/conf.c index 4cbe211..392b73e 100644 --- a/src/conf.c +++ b/src/conf.c @@ -550,6 +550,7 @@ static int h_maxconn(int argc, unsigned char **argv){ if(!conf.maxchild) { return(1); } + conf.backlog = 1 + (conf.maxchild>>3); #ifndef _WIN32 { struct rlimit rl; @@ -565,6 +566,14 @@ static int h_maxconn(int argc, unsigned char **argv){ return 0; } +static int h_backlog(int argc, unsigned char **argv){ + conf.backlog = atoi((char *)argv[1]); + if(!conf.backlog) { + return(1); + } + return 0; +} + static int h_flush(int argc, unsigned char **argv){ freeacl(conf.acl); conf.acl = NULL; @@ -1612,6 +1621,7 @@ struct commands commandhandlers[]={ #ifndef NORADIUS {commandhandlers+65, "radius", h_radius, 3, 0}, #endif + {commandhandlers+66, "backlog", h_backlog, 2, 2}, {specificcommands, "", h_noop, 1, 0} }; @@ -1855,6 +1865,7 @@ void freeconf(struct extparam *confp){ *SAFAMILY(&confp->intsa) = AF_INET; *SAFAMILY(&confp->extsa) = AF_INET; confp->maxchild = 100; + confp->backlog = 13; resolvfunc = NULL; numservers = 0; acl = confp->acl; diff --git a/src/proxymain.c b/src/proxymain.c index 5cf6d6c..08ed586 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -649,7 +649,7 @@ int MODULEMAINFUNC (int argc, char** argv){ } } if(!isudp){ - if(so._listen (sock, srv.maxchild)==-1) { + if(so._listen (sock, srv.backlog)==-1) { sprintf((char *)buf, "listen(): %s", strerror(errno)); if(!srv.silent)dolog(&defparam, buf); return -4; @@ -917,6 +917,7 @@ void srvinit(struct srvparam * srv, struct clientparam *param){ srv->authfunc = conf.authfunc; srv->usentlm = 0; srv->maxchild = conf.maxchild; + srv->backlog = conf.backlog; srv->stacksize = conf.stacksize; srv->time_start = time(NULL); if(havelog && conf.logtarget){ diff --git a/src/structures.h b/src/structures.h index 5adb361..8d41374 100644 --- a/src/structures.h +++ b/src/structures.h @@ -429,6 +429,7 @@ struct srvparam { SOCKET srvsock, cbsock; int childcount; int maxchild; + int backlog; int paused, version; int singlepacket; int usentlm; @@ -578,7 +579,7 @@ struct extparam { struct srvparam *services; int stacksize, threadinit, counterd, haveerror, rotate, paused, archiverc, - demon, maxchild, needreload, timetoexit, version, noforce, bandlimver, parentretries; + demon, maxchild, backlog, needreload, timetoexit, version, noforce, bandlimver, parentretries; int authcachetype, authcachetime; int filtermaxsize; int gracetraf, gracenum, gracedelay; From cc0fd518bd7207c5bfc42c4c039d2599d54a684b Mon Sep 17 00:00:00 2001 From: Daniel Winzen Date: Tue, 8 Nov 2022 15:42:04 +0100 Subject: [PATCH 4/5] Incorporate feedback from z3APA3A --- man/3proxy.cfg.3 | 2 +- src/common.c | 2 +- src/proxymain.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/man/3proxy.cfg.3 b/man/3proxy.cfg.3 index 3f38088..cdeef48 100644 --- a/man/3proxy.cfg.3 +++ b/man/3proxy.cfg.3 @@ -493,7 +493,7 @@ the connection limit has been reached. .B backlog .br sets the listening socket backlog of new connections. Default is -1+(maxconn>>3). Maximum value is capped by kernel tunable somaxconn. +1 + maxconn/8. Maximum value is capped by kernel tunable somaxconn. .br .B service diff --git a/src/common.c b/src/common.c index 462133d..e8106e2 100644 --- a/src/common.c +++ b/src/common.c @@ -102,7 +102,7 @@ struct extparam conf = { NULL, 0, 0, -1, 0, 0, 0, 0, - 0, 500, 13, 0, 0, 0, 0, 0, 2, + 0, 500, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, 600, 1048576, diff --git a/src/proxymain.c b/src/proxymain.c index 08ed586..40f7141 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -649,7 +649,7 @@ int MODULEMAINFUNC (int argc, char** argv){ } } if(!isudp){ - if(so._listen (sock, srv.backlog)==-1) { + if(so._listen (sock, srv.backlog?srv.backlog : 1+(srv.maxchild>>3))==-1) { sprintf((char *)buf, "listen(): %s", strerror(errno)); if(!srv.silent)dolog(&defparam, buf); return -4; From b94e1fc01f967532f67ce3bffb13c9ecdb9106b0 Mon Sep 17 00:00:00 2001 From: Daniel Winzen Date: Tue, 8 Nov 2022 16:02:47 +0100 Subject: [PATCH 5/5] Few more changes --- src/conf.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/conf.c b/src/conf.c index 392b73e..3d7a545 100644 --- a/src/conf.c +++ b/src/conf.c @@ -550,7 +550,6 @@ static int h_maxconn(int argc, unsigned char **argv){ if(!conf.maxchild) { return(1); } - conf.backlog = 1 + (conf.maxchild>>3); #ifndef _WIN32 { struct rlimit rl; @@ -568,7 +567,7 @@ static int h_maxconn(int argc, unsigned char **argv){ static int h_backlog(int argc, unsigned char **argv){ conf.backlog = atoi((char *)argv[1]); - if(!conf.backlog) { + if(conf.maxchild < 0) { return(1); } return 0; @@ -1618,10 +1617,10 @@ struct commands commandhandlers[]={ {commandhandlers+62, "noforce", h_noforce, 1, 1}, {commandhandlers+63, "parentretries", h_parentretries, 2, 2}, {commandhandlers+64, "auto", h_proxy, 1, 0}, + {commandhandlers+65, "backlog", h_backlog, 2, 2}, #ifndef NORADIUS - {commandhandlers+65, "radius", h_radius, 3, 0}, + {commandhandlers+66, "radius", h_radius, 3, 0}, #endif - {commandhandlers+66, "backlog", h_backlog, 2, 2}, {specificcommands, "", h_noop, 1, 0} }; @@ -1865,7 +1864,7 @@ void freeconf(struct extparam *confp){ *SAFAMILY(&confp->intsa) = AF_INET; *SAFAMILY(&confp->extsa) = AF_INET; confp->maxchild = 100; - confp->backlog = 13; + confp->backlog = 0; resolvfunc = NULL; numservers = 0; acl = confp->acl;