1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 01:48:00 +00:00

In the file-transfer applications, which only ever use the main

channel, arrange to set the SSH-2 window size to something very
large.  This prevents the connection stalling when the window fills
up, and means that PSCP receives data _much_ faster.

[originally from svn r7672]
This commit is contained in:
Ben Harris 2007-08-04 22:14:19 +00:00
parent 8659f5145f
commit a3ea90c0e8
4 changed files with 24 additions and 9 deletions

1
pscp.c
View File

@ -418,6 +418,7 @@ static void do_cmd(char *host, char *user, char *cmd)
cfg.x11_forward = 0;
cfg.agentfwd = 0;
cfg.portfwd[0] = cfg.portfwd[1] = '\0';
cfg.ssh_simple = TRUE;
/*
* Set up main and possibly fallback command depending on

View File

@ -2752,6 +2752,7 @@ static int psftp_connect(char *userhost, char *user, int portnumber)
cfg.x11_forward = 0;
cfg.agentfwd = 0;
cfg.portfwd[0] = cfg.portfwd[1] = '\0';
cfg.ssh_simple = TRUE;
/* Set up subsystem name. */
strcpy(cfg.remote_cmd, "sftp");

View File

@ -588,6 +588,12 @@ struct config_tag {
int sshbug_ignore1, sshbug_plainpw1, sshbug_rsa1,
sshbug_hmac2, sshbug_derivekey2, sshbug_rsapad2,
sshbug_pksessid2, sshbug_rekey2;
/*
* ssh_simple means that we promise never to open any channel other
* than the main one, which means it can safely use a very large
* window in SSH-2.
*/
int ssh_simple;
/* Options for pterm. Should split out into platform-dependent part. */
int stamp_utmp;
int login_shell;

25
ssh.c
View File

@ -470,11 +470,15 @@ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen,
*
* - OUR_V2_WINSIZE is the maximum window size we present on SSH-2
* channels.
*
* - OUR_V2_BIGWIN is the window size we advertise for the only
* channel in a simple connection.
*/
#define SSH1_BUFFER_LIMIT 32768
#define SSH_MAX_BACKLOG 32768
#define OUR_V2_WINSIZE 16384
#define OUR_V2_BIGWIN 0x10000000
#define OUR_V2_MAXPKT 0x4000UL
/* Maximum length of passwords/passphrases (arbitrary) */
@ -552,7 +556,7 @@ struct ssh_channel {
bufchain outbuffer;
unsigned remwindow, remmaxpkt;
/* locwindow is signed so we can cope with excess data. */
int locwindow;
int locwindow, locmaxwin;
} v2;
} v;
union {
@ -4030,7 +4034,7 @@ void sshfwd_unthrottle(struct ssh_channel *c, int bufsize)
ssh1_throttle(ssh, -1);
}
} else {
ssh2_set_window(c, OUR_V2_WINSIZE - bufsize);
ssh2_set_window(c, c->v.v2.locmaxwin - bufsize);
}
}
@ -6288,8 +6292,8 @@ static void ssh2_msg_channel_data(Ssh ssh, struct Packet *pktin)
* need to adjust the window if the server's
* sent excess data.
*/
ssh2_set_window(c, bufsize < OUR_V2_WINSIZE ?
OUR_V2_WINSIZE - bufsize : 0);
ssh2_set_window(c, bufsize < c->v.v2.locmaxwin ?
c->v.v2.locmaxwin - bufsize : 0);
}
}
@ -6756,7 +6760,7 @@ static void ssh2_msg_channel_open(Ssh ssh, struct Packet *pktin)
} else {
c->localid = alloc_channel_id(ssh);
c->closes = 0;
c->v.v2.locwindow = OUR_V2_WINSIZE;
c->v.v2.locwindow = c->v.v2.locmaxwin = OUR_V2_WINSIZE;
c->v.v2.remwindow = winsize;
c->v.v2.remmaxpkt = pktsize;
bufchain_init(&c->v.v2.outbuffer);
@ -7967,7 +7971,8 @@ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen,
s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN);
ssh2_pkt_addstring(s->pktout, "direct-tcpip");
ssh2_pkt_adduint32(s->pktout, ssh->mainchan->localid);
ssh->mainchan->v.v2.locwindow = OUR_V2_WINSIZE;
ssh->mainchan->v.v2.locwindow = ssh->mainchan->v.v2.locmaxwin =
ssh->cfg.ssh_simple ? OUR_V2_BIGWIN : OUR_V2_WINSIZE;
ssh2_pkt_adduint32(s->pktout, ssh->mainchan->v.v2.locwindow);/* our window size */
ssh2_pkt_adduint32(s->pktout, OUR_V2_MAXPKT); /* our max pkt size */
ssh2_pkt_addstring(s->pktout, ssh->cfg.ssh_nc_host);
@ -8009,7 +8014,8 @@ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen,
s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN);
ssh2_pkt_addstring(s->pktout, "session");
ssh2_pkt_adduint32(s->pktout, ssh->mainchan->localid);
ssh->mainchan->v.v2.locwindow = OUR_V2_WINSIZE;
ssh->mainchan->v.v2.locwindow = ssh->mainchan->v.v2.locmaxwin =
ssh->cfg.ssh_simple ? OUR_V2_BIGWIN : OUR_V2_WINSIZE;
ssh2_pkt_adduint32(s->pktout, ssh->mainchan->v.v2.locwindow);/* our window size */
ssh2_pkt_adduint32(s->pktout, OUR_V2_MAXPKT); /* our max pkt size */
ssh2_pkt_send(ssh, s->pktout);
@ -9062,7 +9068,8 @@ static void ssh_unthrottle(void *handle, int bufsize)
ssh1_throttle(ssh, -1);
}
} else {
ssh2_set_window(ssh->mainchan, OUR_V2_WINSIZE - bufsize);
ssh2_set_window(ssh->mainchan,
ssh->mainchan->v.v2.locmaxwin - bufsize);
}
}
@ -9085,7 +9092,7 @@ void ssh_send_port_open(void *channel, char *hostname, int port, char *org)
pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN);
ssh2_pkt_addstring(pktout, "direct-tcpip");
ssh2_pkt_adduint32(pktout, c->localid);
c->v.v2.locwindow = OUR_V2_WINSIZE;
c->v.v2.locwindow = c->v.v2.locmaxwin = OUR_V2_WINSIZE;
ssh2_pkt_adduint32(pktout, c->v.v2.locwindow);/* our window size */
ssh2_pkt_adduint32(pktout, OUR_V2_MAXPKT); /* our max pkt size */
ssh2_pkt_addstring(pktout, hostname);