mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-03-22 14:39:24 -05: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:
parent
8659f5145f
commit
a3ea90c0e8
1
pscp.c
1
pscp.c
@ -418,6 +418,7 @@ static void do_cmd(char *host, char *user, char *cmd)
|
|||||||
cfg.x11_forward = 0;
|
cfg.x11_forward = 0;
|
||||||
cfg.agentfwd = 0;
|
cfg.agentfwd = 0;
|
||||||
cfg.portfwd[0] = cfg.portfwd[1] = '\0';
|
cfg.portfwd[0] = cfg.portfwd[1] = '\0';
|
||||||
|
cfg.ssh_simple = TRUE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up main and possibly fallback command depending on
|
* Set up main and possibly fallback command depending on
|
||||||
|
1
psftp.c
1
psftp.c
@ -2752,6 +2752,7 @@ static int psftp_connect(char *userhost, char *user, int portnumber)
|
|||||||
cfg.x11_forward = 0;
|
cfg.x11_forward = 0;
|
||||||
cfg.agentfwd = 0;
|
cfg.agentfwd = 0;
|
||||||
cfg.portfwd[0] = cfg.portfwd[1] = '\0';
|
cfg.portfwd[0] = cfg.portfwd[1] = '\0';
|
||||||
|
cfg.ssh_simple = TRUE;
|
||||||
|
|
||||||
/* Set up subsystem name. */
|
/* Set up subsystem name. */
|
||||||
strcpy(cfg.remote_cmd, "sftp");
|
strcpy(cfg.remote_cmd, "sftp");
|
||||||
|
6
putty.h
6
putty.h
@ -588,6 +588,12 @@ struct config_tag {
|
|||||||
int sshbug_ignore1, sshbug_plainpw1, sshbug_rsa1,
|
int sshbug_ignore1, sshbug_plainpw1, sshbug_rsa1,
|
||||||
sshbug_hmac2, sshbug_derivekey2, sshbug_rsapad2,
|
sshbug_hmac2, sshbug_derivekey2, sshbug_rsapad2,
|
||||||
sshbug_pksessid2, sshbug_rekey2;
|
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. */
|
/* Options for pterm. Should split out into platform-dependent part. */
|
||||||
int stamp_utmp;
|
int stamp_utmp;
|
||||||
int login_shell;
|
int login_shell;
|
||||||
|
25
ssh.c
25
ssh.c
@ -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
|
* - OUR_V2_WINSIZE is the maximum window size we present on SSH-2
|
||||||
* channels.
|
* channels.
|
||||||
|
*
|
||||||
|
* - OUR_V2_BIGWIN is the window size we advertise for the only
|
||||||
|
* channel in a simple connection.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define SSH1_BUFFER_LIMIT 32768
|
#define SSH1_BUFFER_LIMIT 32768
|
||||||
#define SSH_MAX_BACKLOG 32768
|
#define SSH_MAX_BACKLOG 32768
|
||||||
#define OUR_V2_WINSIZE 16384
|
#define OUR_V2_WINSIZE 16384
|
||||||
|
#define OUR_V2_BIGWIN 0x10000000
|
||||||
#define OUR_V2_MAXPKT 0x4000UL
|
#define OUR_V2_MAXPKT 0x4000UL
|
||||||
|
|
||||||
/* Maximum length of passwords/passphrases (arbitrary) */
|
/* Maximum length of passwords/passphrases (arbitrary) */
|
||||||
@ -552,7 +556,7 @@ struct ssh_channel {
|
|||||||
bufchain outbuffer;
|
bufchain outbuffer;
|
||||||
unsigned remwindow, remmaxpkt;
|
unsigned remwindow, remmaxpkt;
|
||||||
/* locwindow is signed so we can cope with excess data. */
|
/* locwindow is signed so we can cope with excess data. */
|
||||||
int locwindow;
|
int locwindow, locmaxwin;
|
||||||
} v2;
|
} v2;
|
||||||
} v;
|
} v;
|
||||||
union {
|
union {
|
||||||
@ -4030,7 +4034,7 @@ void sshfwd_unthrottle(struct ssh_channel *c, int bufsize)
|
|||||||
ssh1_throttle(ssh, -1);
|
ssh1_throttle(ssh, -1);
|
||||||
}
|
}
|
||||||
} else {
|
} 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
|
* need to adjust the window if the server's
|
||||||
* sent excess data.
|
* sent excess data.
|
||||||
*/
|
*/
|
||||||
ssh2_set_window(c, bufsize < OUR_V2_WINSIZE ?
|
ssh2_set_window(c, bufsize < c->v.v2.locmaxwin ?
|
||||||
OUR_V2_WINSIZE - bufsize : 0);
|
c->v.v2.locmaxwin - bufsize : 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6756,7 +6760,7 @@ static void ssh2_msg_channel_open(Ssh ssh, struct Packet *pktin)
|
|||||||
} else {
|
} else {
|
||||||
c->localid = alloc_channel_id(ssh);
|
c->localid = alloc_channel_id(ssh);
|
||||||
c->closes = 0;
|
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.remwindow = winsize;
|
||||||
c->v.v2.remmaxpkt = pktsize;
|
c->v.v2.remmaxpkt = pktsize;
|
||||||
bufchain_init(&c->v.v2.outbuffer);
|
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);
|
s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN);
|
||||||
ssh2_pkt_addstring(s->pktout, "direct-tcpip");
|
ssh2_pkt_addstring(s->pktout, "direct-tcpip");
|
||||||
ssh2_pkt_adduint32(s->pktout, ssh->mainchan->localid);
|
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, ssh->mainchan->v.v2.locwindow);/* our window size */
|
||||||
ssh2_pkt_adduint32(s->pktout, OUR_V2_MAXPKT); /* our max pkt size */
|
ssh2_pkt_adduint32(s->pktout, OUR_V2_MAXPKT); /* our max pkt size */
|
||||||
ssh2_pkt_addstring(s->pktout, ssh->cfg.ssh_nc_host);
|
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);
|
s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN);
|
||||||
ssh2_pkt_addstring(s->pktout, "session");
|
ssh2_pkt_addstring(s->pktout, "session");
|
||||||
ssh2_pkt_adduint32(s->pktout, ssh->mainchan->localid);
|
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, ssh->mainchan->v.v2.locwindow);/* our window size */
|
||||||
ssh2_pkt_adduint32(s->pktout, OUR_V2_MAXPKT); /* our max pkt size */
|
ssh2_pkt_adduint32(s->pktout, OUR_V2_MAXPKT); /* our max pkt size */
|
||||||
ssh2_pkt_send(ssh, s->pktout);
|
ssh2_pkt_send(ssh, s->pktout);
|
||||||
@ -9062,7 +9068,8 @@ static void ssh_unthrottle(void *handle, int bufsize)
|
|||||||
ssh1_throttle(ssh, -1);
|
ssh1_throttle(ssh, -1);
|
||||||
}
|
}
|
||||||
} else {
|
} 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);
|
pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN);
|
||||||
ssh2_pkt_addstring(pktout, "direct-tcpip");
|
ssh2_pkt_addstring(pktout, "direct-tcpip");
|
||||||
ssh2_pkt_adduint32(pktout, c->localid);
|
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, c->v.v2.locwindow);/* our window size */
|
||||||
ssh2_pkt_adduint32(pktout, OUR_V2_MAXPKT); /* our max pkt size */
|
ssh2_pkt_adduint32(pktout, OUR_V2_MAXPKT); /* our max pkt size */
|
||||||
ssh2_pkt_addstring(pktout, hostname);
|
ssh2_pkt_addstring(pktout, hostname);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user