From 4758fe8ce4962afa29913fd3600fed2c3bd1aac4 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Fri, 1 Nov 2013 04:24:39 +1100 Subject: [PATCH] go.crypto/ssh: Increase window size. Increase window size for channels (session and tcpip) to 64 * max packet size (32 KB), which is the same value that OpenSSH uses. Also breaks out the relevant harcoded constants into named constants in channel.go. Fixes golang/go#6675. R=golang-dev, dave, hanwen, agl CC=golang-dev https://golang.org/cl/18120043 --- ssh/channel.go | 6 ++++++ ssh/client.go | 10 ++++------ ssh/session.go | 4 ++-- ssh/tcpip.go | 4 ++-- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/ssh/channel.go b/ssh/channel.go index 990c04c..c5413c9 100644 --- a/ssh/channel.go +++ b/ssh/channel.go @@ -22,6 +22,12 @@ const ( // minPacketLength defines the smallest valid packet minPacketLength = 9 + + // channelMaxPacketSize defines the maximum packet size advertised in open messages + channelMaxPacketSize = 1 << 15 // RFC 4253 6.1, minimum 32 KiB + + // channelWindowSize defines the window size advertised in open messages + channelWindowSize = 64 * channelMaxPacketSize // Like OpenSSH ) // A Channel is an ordered, reliable, duplex stream that is multiplexed over an diff --git a/ssh/client.go b/ssh/client.go index f13d299..e2d2557 100644 --- a/ssh/client.go +++ b/ssh/client.go @@ -356,12 +356,10 @@ func (c *ClientConn) handleChanOpen(msg *channelOpenMsg) { ch.maxPacket = msg.MaxPacketSize m := channelOpenConfirmMsg{ - PeersId: ch.remoteId, - MyId: ch.localId, - MyWindow: 1 << 14, - - // As per RFC 4253 6.1, 32k is also the minimum. - MaxPacketSize: 1 << 15, + PeersId: ch.remoteId, + MyId: ch.localId, + MyWindow: channelWindowSize, + MaxPacketSize: channelMaxPacketSize, } c.transport.writePacket(marshal(msgChannelOpenConfirm, m)) diff --git a/ssh/session.go b/ssh/session.go index 9035b49..39f2d22 100644 --- a/ssh/session.go +++ b/ssh/session.go @@ -567,8 +567,8 @@ func (c *ClientConn) NewSession() (*Session, error) { if err := c.transport.writePacket(marshal(msgChannelOpen, channelOpenMsg{ ChanType: "session", PeersId: ch.localId, - PeersWindow: 1 << 14, - MaxPacketSize: 1 << 15, // RFC 4253 6.1 + PeersWindow: channelWindowSize, + MaxPacketSize: channelMaxPacketSize, })); err != nil { c.chanList.remove(ch.localId) return nil, err diff --git a/ssh/tcpip.go b/ssh/tcpip.go index 19c2418..74fc1a7 100644 --- a/ssh/tcpip.go +++ b/ssh/tcpip.go @@ -299,8 +299,8 @@ func (c *ClientConn) dial(laddr string, lport int, raddr string, rport int) (*tc if err := c.transport.writePacket(marshal(msgChannelOpen, channelOpenDirectMsg{ ChanType: "direct-tcpip", PeersId: ch.localId, - PeersWindow: 1 << 14, - MaxPacketSize: 1 << 15, // RFC 4253 6.1 + PeersWindow: channelWindowSize, + MaxPacketSize: channelMaxPacketSize, raddr: raddr, rport: uint32(rport), laddr: laddr,