# HG changeset patch # User Matt Johnston # Date 1403710959 -28800 # Node ID d93a6bcf616f0ed25ad546d50f5db0e0255b7e57 # Parent 25692c60479eb4cc8ec4643b6a1c033c769db1c6 Improve handling lots of concurrent forwarded connections. Increase connection backlog, avoid check_close() for channels that haven't had IO diff -r 25692c60479e -r d93a6bcf616f common-channel.c --- a/common-channel.c Wed Jun 25 23:37:44 2014 +0800 +++ b/common-channel.c Wed Jun 25 23:42:39 2014 +0800 @@ -208,11 +208,14 @@ /* Iterate through the channels, performing IO if available */ void channelio(fd_set *readfds, fd_set *writefds) { + /* Listeners such as TCP, X11, agent-auth */ struct Channel *channel; unsigned int i; /* foreach channel */ for (i = 0; i < ses.chansize; i++) { + /* Close checking only needs to occur for channels that had IO events */ + int do_check_close = 0; channel = ses.channels[i]; if (channel == NULL) { @@ -224,6 +227,7 @@ if (channel->readfd >= 0 && FD_ISSET(channel->readfd, readfds)) { TRACE(("send normal readfd")) send_msg_channel_data(channel, 0); + do_check_close = 1; } /* read stderr data and send it over the wire */ @@ -231,6 +235,7 @@ && FD_ISSET(channel->errfd, readfds)) { TRACE(("send normal errfd")) send_msg_channel_data(channel, 1); + do_check_close = 1; } /* write to program/pipe stdin */ @@ -242,20 +247,22 @@ check_in_progress(), as it may be NULL */ } writechannel(channel, channel->writefd, channel->writebuf); + do_check_close = 1; } /* stderr for client mode */ if (ERRFD_IS_WRITE(channel) && channel->errfd >= 0 && FD_ISSET(channel->errfd, writefds)) { writechannel(channel, channel->errfd, channel->extrabuf); + do_check_close = 1; } /* handle any channel closing etc */ - check_close(channel); - + if (do_check_close) { + check_close(channel); + } } - /* Listeners such as TCP, X11, agent-auth */ #ifdef USING_LISTENERS handle_listeners(readfds); #endif diff -r 25692c60479e -r d93a6bcf616f dbutil.c --- a/dbutil.c Wed Jun 25 23:37:44 2014 +0800 +++ b/dbutil.c Wed Jun 25 23:42:39 2014 +0800 @@ -332,7 +332,7 @@ continue; } - if (listen(sock, 20) < 0) { + if (listen(sock, DROPBEAR_LISTEN_BACKLOG) < 0) { err = errno; close(sock); TRACE(("listen() failed")) diff -r 25692c60479e -r d93a6bcf616f sysoptions.h --- a/sysoptions.h Wed Jun 25 23:37:44 2014 +0800 +++ b/sysoptions.h Wed Jun 25 23:42:39 2014 +0800 @@ -251,4 +251,10 @@ #define USE_VFORK #endif /* don't HAVE_FORK */ +#if MAX_UNAUTH_CLIENTS > MAX_CHANNELS +#define DROPBEAR_LISTEN_BACKLOG MAX_UNAUTH_CLIENTS +#else +#define DROPBEAR_LISTEN_BACKLOG MAX_CHANNELS +#endif + /* no include guard for this file */