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,