From 3e2cfe90e05fed7bb4e60e9730f6da8a1ac2a12d Mon Sep 17 00:00:00 2001 From: Maxime Piraux Date: Mon, 21 Jan 2019 16:52:00 +0100 Subject: [PATCH] HTTP/3 update with draft-17 --- bin/test_suite/scenario_runner.go | 2 +- common.go | 2 ++ connection.go | 18 ++++++++++++++---- http3/http3.go | 2 +- scenarii/ack_ecn.go | 4 ++-- scenarii/ack_only.go | 2 +- scenarii/address_validation.go | 2 +- scenarii/connection_migration.go | 2 +- scenarii/flow_control.go | 2 +- scenarii/handshake.go | 2 +- scenarii/handshake_v6.go | 2 +- scenarii/http3_encoder_stream.go | 2 +- scenarii/http3_get.go | 3 ++- scenarii/http3_uni_streams_limits.go | 2 +- scenarii/http_get_and_wait.go | 4 ++-- scenarii/http_get_on_uni_stream.go | 2 +- scenarii/key_update.go | 2 +- scenarii/multi_stream.go | 2 +- scenarii/new_connection_id.go | 2 +- scenarii/padding.go | 2 +- scenarii/retire_connection_id.go | 2 +- scenarii/scenario.go | 5 +++++ .../stop_sending_frame_on_receive_stream.go | 2 +- scenarii/stream_opening_reordering.go | 2 +- scenarii/transport_parameters.go | 2 +- scenarii/unsupported_tls_version.go | 2 +- scenarii/version_negotiation.go | 2 +- scenarii/zero_rtt.go | 4 ++-- 28 files changed, 50 insertions(+), 32 deletions(-) diff --git a/bin/test_suite/scenario_runner.go b/bin/test_suite/scenario_runner.go index b763f8f..34dddda 100644 --- a/bin/test_suite/scenario_runner.go +++ b/bin/test_suite/scenario_runner.go @@ -32,7 +32,7 @@ func main() { trace := qt.NewTrace(scenario.Name(), scenario.Version(), *host) - conn, err := qt.NewDefaultConnection(*host, strings.Split(*host, ":")[0], nil, scenario.IPv6()) // Raw IPv6 are not handled correctly + conn, err := qt.NewDefaultConnection(*host, strings.Split(*host, ":")[0], nil, scenario.IPv6(), scenario.HTTP3()) // Raw IPv6 are not handled correctly if err == nil { pcap, err := qt.StartPcapCapture(conn, *netInterface) diff --git a/common.go b/common.go index 719033e..d4ebe5d 100644 --- a/common.go +++ b/common.go @@ -39,8 +39,10 @@ import ( "math" ) +// TODO: Reconsider the use of global variables var QuicVersion uint32 = 0xff000011 // See https://tools.ietf.org/html/draft-ietf-quic-transport-08#section-4 var QuicALPNToken = "hq-17" // See https://www.ietf.org/mail-archive/web/quic/current/msg01882.html +var QuicH3ALPNToken = "h3-17" // See https://tools.ietf.org/html/draft-ietf-quic-http-17#section-2.1 const ( MinimumInitialLength = 1252 diff --git a/connection.go b/connection.go index f2c2f5e..c3f81f6 100644 --- a/connection.go +++ b/connection.go @@ -12,6 +12,7 @@ import ( "net" "os" "sort" + "strings" "unsafe" ) @@ -46,6 +47,7 @@ type Connection struct { SourceCID ConnectionID DestinationCID ConnectionID Version uint32 + ALPN string Token []byte ResumptionTicket []byte @@ -153,7 +155,8 @@ func (c *Connection) ProcessVersionNegotation(vn *VersionNegotiationPacket) erro c.Logger.Printf("Versions received: %v\n", vn.SupportedVersions) return errors.New("no appropriate version found") } - QuicVersion, QuicALPNToken = version, fmt.Sprintf("hq-%02d", version & 0xff) + QuicVersion = version + QuicALPNToken = fmt.Sprintf("%s-%02d", strings.Split(c.ALPN, "-")[0], version & 0xff) c.TransitionTo(QuicVersion, QuicALPNToken) return nil } @@ -193,7 +196,8 @@ func (c *Connection) TransitionTo(version uint32, ALPN string) { } c.TLSTPHandler = NewTLSTransportParameterHandler(version, prevVersion) c.Version = version - c.Tls = pigotls.NewConnection(c.ServerName, ALPN, c.ResumptionTicket) + c.ALPN = ALPN + c.Tls = pigotls.NewConnection(c.ServerName, c.ALPN, c.ResumptionTicket) c.PacketNumber = make(map[PNSpace]PacketNumber) c.LargestPNsReceived = make(map[PNSpace]PacketNumber) c.LargestPNsAcknowledged = make(map[PNSpace]PacketNumber) @@ -229,7 +233,7 @@ func EstablishUDPConnection(addr *net.UDPAddr) (*net.UDPConn, error) { } return udpConn, nil } -func NewDefaultConnection(address string, serverName string, resumptionTicket []byte, useIPv6 bool) (*Connection, error) { +func NewDefaultConnection(address string, serverName string, resumptionTicket []byte, useIPv6 bool, negotiateHTTP3 bool) (*Connection, error) { scid := make([]byte, 8, 8) dcid := make([]byte, 8, 8) rand.Read(scid) @@ -251,7 +255,13 @@ func NewDefaultConnection(address string, serverName string, resumptionTicket [] return nil, err } - c := NewConnection(serverName, QuicVersion, QuicALPNToken, scid, dcid, udpConn, resumptionTicket) + var c *Connection + if negotiateHTTP3 { + c = NewConnection(serverName, QuicVersion, QuicH3ALPNToken, scid, dcid, udpConn, resumptionTicket) + } else { + c = NewConnection(serverName, QuicVersion, QuicALPNToken, scid, dcid, udpConn, resumptionTicket) + } + c.UseIPv6 = useIPv6 c.Host = udpAddr return c, nil diff --git a/http3/http3.go b/http3/http3.go index c7189d3..3e35459 100644 --- a/http3/http3.go +++ b/http3/http3.go @@ -222,9 +222,9 @@ func ReadSetting(buffer *bytes.Reader) Setting { const ( SETTINGS_HEADER_TABLE_SIZE = 0x01 - SETTINGS_NUM_PLACEHOLDERS = 0x03 SETTINGS_MAX_HEADER_LIST_SIZE = 0x06 SETTINGS_QPACK_BLOCKED_STREAMS = 0x07 + SETTINGS_NUM_PLACEHOLDERS = 0x08 ) type SETTINGS struct { diff --git a/scenarii/ack_ecn.go b/scenarii/ack_ecn.go index 8c00faa..062bb57 100644 --- a/scenarii/ack_ecn.go +++ b/scenarii/ack_ecn.go @@ -1,9 +1,9 @@ package scenarii import ( - "time" qt "github.com/QUIC-Tracker/quic-tracker" "github.com/QUIC-Tracker/quic-tracker/agents" + "time" ) const ( @@ -19,7 +19,7 @@ type AckECNScenario struct { } func NewAckECNScenario() *AckECNScenario { - return &AckECNScenario{AbstractScenario{"ack_ecn", 1, false, nil}} + return &AckECNScenario{AbstractScenario{name: "ack_ecn", version: 1}} } func (s *AckECNScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/ack_only.go b/scenarii/ack_only.go index e63accc..0a9f1fb 100644 --- a/scenarii/ack_only.go +++ b/scenarii/ack_only.go @@ -16,7 +16,7 @@ type AckOnlyScenario struct { } func NewAckOnlyScenario() *AckOnlyScenario { - return &AckOnlyScenario{AbstractScenario{"ack_only", 1, false, nil}} + return &AckOnlyScenario{AbstractScenario{name: "ack_only", version: 1}} } func (s *AckOnlyScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/address_validation.go b/scenarii/address_validation.go index f6f5e8f..ddfc65a 100644 --- a/scenarii/address_validation.go +++ b/scenarii/address_validation.go @@ -17,7 +17,7 @@ type AddressValidationScenario struct { } func NewAddressValidationScenario() *AddressValidationScenario { - return &AddressValidationScenario{AbstractScenario{"address_validation", 3, false, nil}} + return &AddressValidationScenario{AbstractScenario{name: "address_validation", version: 3}} } func (s *AddressValidationScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/connection_migration.go b/scenarii/connection_migration.go index f3aa451..e092f68 100644 --- a/scenarii/connection_migration.go +++ b/scenarii/connection_migration.go @@ -18,7 +18,7 @@ type ConnectionMigrationScenario struct { } func NewConnectionMigrationScenario() *ConnectionMigrationScenario { - return &ConnectionMigrationScenario{AbstractScenario{"connection_migration", 1, false, nil}} + return &ConnectionMigrationScenario{AbstractScenario{name: "connection_migration", version: 1}} } func (s *ConnectionMigrationScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/flow_control.go b/scenarii/flow_control.go index c73b660..a3a42cf 100644 --- a/scenarii/flow_control.go +++ b/scenarii/flow_control.go @@ -20,7 +20,7 @@ type FlowControlScenario struct { } func NewFlowControlScenario() *FlowControlScenario { - return &FlowControlScenario{AbstractScenario{"flow_control", 2, false, nil}} + return &FlowControlScenario{AbstractScenario{name: "flow_control", version: 2}} } func (s *FlowControlScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/handshake.go b/scenarii/handshake.go index 0317a30..8e29ff1 100644 --- a/scenarii/handshake.go +++ b/scenarii/handshake.go @@ -19,7 +19,7 @@ type HandshakeScenario struct { } func NewHandshakeScenario() *HandshakeScenario { - return &HandshakeScenario{AbstractScenario{"handshake", 2, false, nil}} + return &HandshakeScenario{AbstractScenario{name: "handshake", version: 2}} } func (s *HandshakeScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/handshake_v6.go b/scenarii/handshake_v6.go index 2e81997..8670f28 100644 --- a/scenarii/handshake_v6.go +++ b/scenarii/handshake_v6.go @@ -10,7 +10,7 @@ type Handshakev6Scenario struct { } func NewHandshakev6Scenario() *Handshakev6Scenario { - return &Handshakev6Scenario{AbstractScenario{"handshake_v6", 2, true, nil}} + return &Handshakev6Scenario{AbstractScenario{name: "handshake_v6", version: 2, ipv6: true}} } func (s *Handshakev6Scenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { NewHandshakeScenario().Run(conn, trace, preferredUrl, debug) diff --git a/scenarii/http3_encoder_stream.go b/scenarii/http3_encoder_stream.go index bce1765..0167b33 100644 --- a/scenarii/http3_encoder_stream.go +++ b/scenarii/http3_encoder_stream.go @@ -20,7 +20,7 @@ type HTTP3EncoderStreamScenario struct { } func NewHTTP3EncoderStreamScenario() *HTTP3EncoderStreamScenario { - return &HTTP3EncoderStreamScenario{AbstractScenario{"http3_encoder_stream", 1, false, nil}} + return &HTTP3EncoderStreamScenario{AbstractScenario{name: "http3_encoder_stream", version: 1, http3: true}} } func (s *HTTP3EncoderStreamScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/http3_get.go b/scenarii/http3_get.go index 37a0d11..85ba1d0 100644 --- a/scenarii/http3_get.go +++ b/scenarii/http3_get.go @@ -17,11 +17,12 @@ type HTTP3GETScenario struct { } func NewHTTP3GETScenario() *HTTP3GETScenario { - return &HTTP3GETScenario{AbstractScenario{"http3_get", 1, false, nil}} + return &HTTP3GETScenario{AbstractScenario{name: "http3_get", version: 1, http3: true}} } func (s *HTTP3GETScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) conn.TLSTPHandler.MaxUniStreams = 3 + conn.TransitionTo(qt.QuicVersion, qt.QuicH3ALPNToken) http := agents.HTTPAgent{} connAgents := s.CompleteHandshake(conn, trace, H3G_TLSHandshakeFailed, &http) diff --git a/scenarii/http3_uni_streams_limits.go b/scenarii/http3_uni_streams_limits.go index b3e28ea..1246a6c 100644 --- a/scenarii/http3_uni_streams_limits.go +++ b/scenarii/http3_uni_streams_limits.go @@ -18,7 +18,7 @@ type HTTP3UniStreamsLimitsScenario struct { } func NewHTTP3UniStreamsLimitsScenario() *HTTP3UniStreamsLimitsScenario { - return &HTTP3UniStreamsLimitsScenario{AbstractScenario{"http3_uni_streams_limits", 1, false, nil}} + return &HTTP3UniStreamsLimitsScenario{AbstractScenario{name: "http3_uni_streams_limits", version: 1, http3: true}} } func (s *HTTP3UniStreamsLimitsScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/http_get_and_wait.go b/scenarii/http_get_and_wait.go index b3de715..26ddcc2 100644 --- a/scenarii/http_get_and_wait.go +++ b/scenarii/http_get_and_wait.go @@ -3,8 +3,8 @@ package scenarii import ( qt "github.com/QUIC-Tracker/quic-tracker" - "time" "fmt" + "time" ) const ( @@ -25,7 +25,7 @@ type SimpleGetAndWaitScenario struct { } func NewSimpleGetAndWaitScenario() *SimpleGetAndWaitScenario { - return &SimpleGetAndWaitScenario{AbstractScenario{"http_get_and_wait", 1, false, nil}} + return &SimpleGetAndWaitScenario{AbstractScenario{name: "http_get_and_wait", version: 1}} } func (s *SimpleGetAndWaitScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { diff --git a/scenarii/http_get_on_uni_stream.go b/scenarii/http_get_on_uni_stream.go index 94f1b68..5b30504 100644 --- a/scenarii/http_get_on_uni_stream.go +++ b/scenarii/http_get_on_uni_stream.go @@ -20,7 +20,7 @@ type GetOnStream2Scenario struct { } func NewGetOnStream2Scenario() *GetOnStream2Scenario { - return &GetOnStream2Scenario{AbstractScenario{"http_get_on_uni_stream", 1, false, nil}} + return &GetOnStream2Scenario{AbstractScenario{name: "http_get_on_uni_stream", version: 1}} } func (s *GetOnStream2Scenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { diff --git a/scenarii/key_update.go b/scenarii/key_update.go index 57f9d70..7b76548 100644 --- a/scenarii/key_update.go +++ b/scenarii/key_update.go @@ -16,7 +16,7 @@ type KeyUpdateScenario struct { } func NewKeyUpdateScenario() *KeyUpdateScenario { - return &KeyUpdateScenario{AbstractScenario{"key_update", 1, false, nil}} + return &KeyUpdateScenario{AbstractScenario{name: "key_update", version: 1}} } func (s *KeyUpdateScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/multi_stream.go b/scenarii/multi_stream.go index 8f81a00..c148ff5 100644 --- a/scenarii/multi_stream.go +++ b/scenarii/multi_stream.go @@ -19,7 +19,7 @@ type MultiStreamScenario struct { } func NewMultiStreamScenario() *MultiStreamScenario { - return &MultiStreamScenario{AbstractScenario{"multi_stream", 1, false, nil}} + return &MultiStreamScenario{AbstractScenario{name: "multi_stream", version: 1}} } func (s *MultiStreamScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/new_connection_id.go b/scenarii/new_connection_id.go index 326d26c..657c84e 100644 --- a/scenarii/new_connection_id.go +++ b/scenarii/new_connection_id.go @@ -23,7 +23,7 @@ type NewConnectionIDScenario struct { } func NewNewConnectionIDScenario() *NewConnectionIDScenario { - return &NewConnectionIDScenario{AbstractScenario{"new_connection_id", 1, false, nil}} + return &NewConnectionIDScenario{AbstractScenario{name: "new_connection_id", version: 1}} } func (s *NewConnectionIDScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { // TODO: Flag NEW_CONNECTION_ID frames sent before TLS Handshake complete diff --git a/scenarii/padding.go b/scenarii/padding.go index 005b560..1b8b693 100644 --- a/scenarii/padding.go +++ b/scenarii/padding.go @@ -17,7 +17,7 @@ type PaddingScenario struct { } func NewPaddingScenario() *PaddingScenario { - return &PaddingScenario{AbstractScenario{"padding", 1, false, nil}} + return &PaddingScenario{AbstractScenario{name: "padding", version: 1}} } func (s *PaddingScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/retire_connection_id.go b/scenarii/retire_connection_id.go index 77730a9..01537be 100644 --- a/scenarii/retire_connection_id.go +++ b/scenarii/retire_connection_id.go @@ -20,7 +20,7 @@ type RetireConnectionIDScenario struct { } func NewRetireConnectionIDScenario() *RetireConnectionIDScenario { - return &RetireConnectionIDScenario{AbstractScenario{"retire_connection_id", 1, false, nil}} + return &RetireConnectionIDScenario{AbstractScenario{name: "retire_connection_id", version: 1}} } func (s *RetireConnectionIDScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/scenario.go b/scenarii/scenario.go index 8e7ed15..1af15b8 100644 --- a/scenarii/scenario.go +++ b/scenarii/scenario.go @@ -22,6 +22,7 @@ type Scenario interface { Name() string Version() int IPv6() bool + HTTP3() bool Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) Timeout() *time.Timer } @@ -31,6 +32,7 @@ type AbstractScenario struct { name string version int ipv6 bool + http3 bool timeout *time.Timer } @@ -43,6 +45,9 @@ func (s *AbstractScenario) Version() int { func (s *AbstractScenario) IPv6() bool { return s.ipv6 } +func (s *AbstractScenario) HTTP3() bool { + return s.http3 +} func (s *AbstractScenario) Timeout() *time.Timer { return s.timeout } diff --git a/scenarii/stop_sending_frame_on_receive_stream.go b/scenarii/stop_sending_frame_on_receive_stream.go index b52f99b..9eb0aa3 100644 --- a/scenarii/stop_sending_frame_on_receive_stream.go +++ b/scenarii/stop_sending_frame_on_receive_stream.go @@ -20,7 +20,7 @@ type StopSendingOnReceiveStreamScenario struct { } func NewStopSendingOnReceiveStreamScenario() *StopSendingOnReceiveStreamScenario { - return &StopSendingOnReceiveStreamScenario{AbstractScenario{"stop_sending_frame_on_receive_stream", 1, false, nil}} + return &StopSendingOnReceiveStreamScenario{AbstractScenario{name: "stop_sending_frame_on_receive_stream", version: 1}} } func (s *StopSendingOnReceiveStreamScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { diff --git a/scenarii/stream_opening_reordering.go b/scenarii/stream_opening_reordering.go index 95f45b5..46faa9a 100644 --- a/scenarii/stream_opening_reordering.go +++ b/scenarii/stream_opening_reordering.go @@ -17,7 +17,7 @@ type StreamOpeningReorderingScenario struct { } func NewStreamOpeningReorderingScenario() *StreamOpeningReorderingScenario { - return &StreamOpeningReorderingScenario{AbstractScenario{"stream_opening_reordering", 2, false, nil}} + return &StreamOpeningReorderingScenario{AbstractScenario{name: "stream_opening_reordering", version: 2}} } func (s *StreamOpeningReorderingScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/transport_parameters.go b/scenarii/transport_parameters.go index b4fd606..6fa1316 100644 --- a/scenarii/transport_parameters.go +++ b/scenarii/transport_parameters.go @@ -19,7 +19,7 @@ type TransportParameterScenario struct { } func NewTransportParameterScenario() *TransportParameterScenario { - return &TransportParameterScenario{AbstractScenario{"transport_parameters", 3, false, nil}} + return &TransportParameterScenario{AbstractScenario{name: "transport_parameters", version: 3}} } func (s *TransportParameterScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/unsupported_tls_version.go b/scenarii/unsupported_tls_version.go index 631b5e3..aa05d88 100644 --- a/scenarii/unsupported_tls_version.go +++ b/scenarii/unsupported_tls_version.go @@ -20,7 +20,7 @@ type UnsupportedTLSVersionScenario struct { } func NewUnsupportedTLSVersionScenario() *UnsupportedTLSVersionScenario { - return &UnsupportedTLSVersionScenario{AbstractScenario{"unsupported_tls_version", 1, false, nil}} + return &UnsupportedTLSVersionScenario{AbstractScenario{name: "unsupported_tls_version", version: 1}} } func (s *UnsupportedTLSVersionScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/version_negotiation.go b/scenarii/version_negotiation.go index eda8eec..4baaae8 100644 --- a/scenarii/version_negotiation.go +++ b/scenarii/version_negotiation.go @@ -22,7 +22,7 @@ type VersionNegotiationScenario struct { } func NewVersionNegotiationScenario() *VersionNegotiationScenario { - return &VersionNegotiationScenario{AbstractScenario{"version_negotiation", 2, false, nil}} + return &VersionNegotiationScenario{AbstractScenario{name: "version_negotiation", version: 2}} } func (s *VersionNegotiationScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) diff --git a/scenarii/zero_rtt.go b/scenarii/zero_rtt.go index 0931bf4..546a7f2 100644 --- a/scenarii/zero_rtt.go +++ b/scenarii/zero_rtt.go @@ -19,7 +19,7 @@ type ZeroRTTScenario struct { } func NewZeroRTTScenario() *ZeroRTTScenario { - return &ZeroRTTScenario{AbstractScenario{"zero_rtt", 1, false, nil}} + return &ZeroRTTScenario{AbstractScenario{name: "zero_rtt", version: 1}} } func (s *ZeroRTTScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl string, debug bool) { s.timeout = time.NewTimer(10 * time.Second) @@ -58,7 +58,7 @@ func (s *ZeroRTTScenario) Run(conn *qt.Connection, trace *qt.Trace, preferredUrl rh, sh, token := conn.ReceivedPacketHandler, conn.SentPacketHandler, conn.Token var err error - conn, err = qt.NewDefaultConnection(conn.Host.String(), conn.ServerName, ticket, s.ipv6) + conn, err = qt.NewDefaultConnection(conn.Host.String(), conn.ServerName, ticket, s.ipv6, false) conn.ReceivedPacketHandler = rh conn.SentPacketHandler = sh conn.Token = token