ssh: add debug print at the lowest level

This is a simple minded, fast print, suitable for debugging timing
sensitive issues.

Change-Id: I9ae3df5fe86f1883c1fa9265b6f7f9a98d33747e
Reviewed-on: https://go-review.googlesource.com/36054
Run-TryBot: Han-Wen Nienhuys <hanwen@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/ssh/mux_test.go b/ssh/mux_test.go
index 591aae8..25d2181 100644
--- a/ssh/mux_test.go
+++ b/ssh/mux_test.go
@@ -499,4 +499,7 @@
 	if debugHandshake {
 		t.Error("handshake debug switched on")
 	}
+	if debugTransport {
+		t.Error("transport debug switched on")
+	}
 }
diff --git a/ssh/transport.go b/ssh/transport.go
index fd19932..e9c3baf 100644
--- a/ssh/transport.go
+++ b/ssh/transport.go
@@ -8,8 +8,13 @@
 	"bufio"
 	"errors"
 	"io"
+	"log"
 )
 
+// debugTransport if set, will print packet types as they go over the
+// wire. No message decoding is done, to minimize the impact on timing.
+const debugTransport = false
+
 const (
 	gcmCipherID    = "aes128-gcm@openssh.com"
 	aes128cbcID    = "aes128-cbc"
@@ -40,7 +45,7 @@
 	bufReader *bufio.Reader
 	bufWriter *bufio.Writer
 	rand      io.Reader
-
+	isClient  bool
 	io.Closer
 }
 
@@ -86,6 +91,22 @@
 	return nil
 }
 
+func (t *transport) printPacket(p []byte, write bool) {
+	if len(p) == 0 {
+		return
+	}
+	who := "server"
+	if t.isClient {
+		who = "client"
+	}
+	what := "read"
+	if write {
+		what = "write"
+	}
+
+	log.Println(what, who, p[0])
+}
+
 // Read and decrypt next packet.
 func (t *transport) readPacket() (p []byte, err error) {
 	for {
@@ -97,6 +118,9 @@
 			break
 		}
 	}
+	if debugTransport {
+		t.printPacket(p, false)
+	}
 
 	return p, err
 }
@@ -141,6 +165,9 @@
 }
 
 func (t *transport) writePacket(packet []byte) error {
+	if debugTransport {
+		t.printPacket(packet, true)
+	}
 	return t.writer.writePacket(t.bufWriter, t.rand, packet)
 }
 
@@ -181,6 +208,8 @@
 		},
 		Closer: rwc,
 	}
+	t.isClient = isClient
+
 	if isClient {
 		t.reader.dir = serverKeys
 		t.writer.dir = clientKeys