quic: send more transport parameters
Send various transport parameters that we weren't sending yet,
but should have been. Add a test for transport parameters sent
by us.
For golang/go#58547
Change-Id: Id16c46ee39040b091633aca8d4cff4c60562a603
Reviewed-on: https://go-review.googlesource.com/c/net/+/523575
Run-TryBot: Damien Neil <dneil@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/internal/quic/config_test.go b/internal/quic/config_test.go
new file mode 100644
index 0000000..cec57c5
--- /dev/null
+++ b/internal/quic/config_test.go
@@ -0,0 +1,32 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build go1.21
+
+package quic
+
+import "testing"
+
+func TestConfigTransportParameters(t *testing.T) {
+ const (
+ wantInitialMaxStreamData = int64(2)
+ )
+ tc := newTestConn(t, clientSide, func(c *Config) {
+ c.StreamReadBufferSize = wantInitialMaxStreamData
+ })
+ tc.handshake()
+ if tc.sentTransportParameters == nil {
+ t.Fatalf("conn didn't send transport parameters during handshake")
+ }
+ p := tc.sentTransportParameters
+ if got, want := p.initialMaxStreamDataBidiLocal, wantInitialMaxStreamData; got != want {
+ t.Errorf("initial_max_stream_data_bidi_local = %v, want %v", got, want)
+ }
+ if got, want := p.initialMaxStreamDataBidiRemote, wantInitialMaxStreamData; got != want {
+ t.Errorf("initial_max_stream_data_bidi_remote = %v, want %v", got, want)
+ }
+ if got, want := p.initialMaxStreamDataUni, wantInitialMaxStreamData; got != want {
+ t.Errorf("initial_max_stream_data_uni = %v, want %v", got, want)
+ }
+}
diff --git a/internal/quic/conn.go b/internal/quic/conn.go
index ee8f011..04dcd7b 100644
--- a/internal/quic/conn.go
+++ b/internal/quic/conn.go
@@ -111,11 +111,17 @@
c.loss.init(c.side, maxDatagramSize, now)
c.streamsInit()
+ // TODO: initial_source_connection_id, retry_source_connection_id
c.startTLS(now, initialConnID, transportParameters{
- initialSrcConnID: c.connIDState.srcConnID(),
- ackDelayExponent: ackDelayExponent,
- maxUDPPayloadSize: maxUDPPayloadSize,
- maxAckDelay: maxAckDelay,
+ initialSrcConnID: c.connIDState.srcConnID(),
+ ackDelayExponent: ackDelayExponent,
+ maxUDPPayloadSize: maxUDPPayloadSize,
+ maxAckDelay: maxAckDelay,
+ disableActiveMigration: true,
+ initialMaxStreamDataBidiLocal: config.streamReadBufferSize(),
+ initialMaxStreamDataBidiRemote: config.streamReadBufferSize(),
+ initialMaxStreamDataUni: config.streamReadBufferSize(),
+ activeConnIDLimit: activeConnIDLimit,
})
go c.loop(now)
diff --git a/internal/quic/conn_test.go b/internal/quic/conn_test.go
index 2aa38fc..8ebe49e 100644
--- a/internal/quic/conn_test.go
+++ b/internal/quic/conn_test.go
@@ -142,6 +142,9 @@
sentFrames []debugFrame
lastPacket *testPacket
+ // Transport parameters sent by the conn.
+ sentTransportParameters *transportParameters
+
// Frame types to ignore in tests.
ignoreFrames map[byte]bool
@@ -719,6 +722,13 @@
setKey(&tc.rkeys, e)
case tls.QUICWriteData:
tc.cryptoDataIn[e.Level] = append(tc.cryptoDataIn[e.Level], e.Data...)
+ case tls.QUICTransportParameters:
+ p, err := unmarshalTransportParams(e.Data)
+ if err != nil {
+ tc.t.Logf("sent unparseable transport parameters %x %v", e.Data, err)
+ } else {
+ tc.sentTransportParameters = &p
+ }
}
}
}