Skip to content

Commit

Permalink
Adds a connection migration IPv4 to IPv6 test
Browse files Browse the repository at this point in the history
  • Loading branch information
mpiraux committed Mar 26, 2019
1 parent 089d64d commit 4027b3d
Show file tree
Hide file tree
Showing 2 changed files with 145 additions and 28 deletions.
116 changes: 116 additions & 0 deletions scenarii/connection_migration_v4_v6.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package scenarii

import (
"bytes"
qt "github.com/QUIC-Tracker/quic-tracker"
"math/rand"
"net"
"time"
)

const (
CM46_TLSHandshakeFailed = 1
CM46_UDPConnectionFailed = 2
CM46_HostDidNotMigrate = 3
CM46_HostDidNotValidateNewPath = 4
CM46_NoNewCIDReceived = 5
CM46_NoNewCIDUsed = 6
)


type ConnectionMigrationv4v6Scenario struct {
AbstractScenario
}

func NewConnectionMigrationv4v6Scenario() *ConnectionMigrationv4v6Scenario {
return &ConnectionMigrationv4v6Scenario{AbstractScenario{name: "connection_migration_v4_v6", version: 1}}
}
func (s *ConnectionMigrationv4v6Scenario) Run(conn *qt.Connection, trace *qt.Trace, preferredPath string, debug bool) {
incPackets := conn.IncomingPackets.RegisterNewChan(1000)

connAgents := s.CompleteHandshake(conn, trace, CM46_TLSHandshakeFailed)
if connAgents == nil {
return
}
defer connAgents.CloseConnection(false, 0, "")

scid := make([]byte, 8)
var resetToken [16]byte
rand.Read(scid)
rand.Read(resetToken[:])
conn.FrameQueue.Submit(qt.QueuedFrame{&qt.NewConnectionIdFrame{ 1, uint8(len(scid)), scid, resetToken}, qt.EncryptionLevelBest})
firstFlightTimer := time.NewTimer(3 * time.Second)

var ncid qt.ConnectionID
firstFlight:
for {
select {
case i := <-incPackets:
switch p := i.(type) {
case *qt.ProtectedPacket:
if p.Contains(qt.NewConnectionIdType) {
ncid = p.GetFirst(qt.NewConnectionIdType).(*qt.NewConnectionIdFrame).ConnectionId
break firstFlight
}
}
case <-firstFlightTimer.C:
trace.ErrorCode = CM46_NoNewCIDReceived
return
}
}
<-firstFlightTimer.C

conn.DestinationCID = ncid
conn.SourceCID = scid

v6Addr, err := net.ResolveUDPAddr("udp6", trace.Host)
if err != nil {
trace.ErrorCode = CM46_UDPConnectionFailed
trace.Results["ResolveUDPAddr"] = err.Error()
return
}
udpConn, err := qt.EstablishUDPConnection(v6Addr)
if err != nil {
trace.ErrorCode = CM46_UDPConnectionFailed
trace.Results["EstablishUDPConnection"] = err.Error()
return
}

conn.UdpConnection.Close()
conn.UdpConnection = udpConn

connAgents.Get("SocketAgent").Run(conn)
connAgents.Get("SendingAgent").Run(conn)
conn.EncryptionLevelsAvailable.Submit(qt.DirectionalEncryptionLevel{qt.EncryptionLevel1RTT, false})

incPackets = conn.IncomingPackets.RegisterNewChan(1000)

conn.SendHTTP09GETRequest(preferredPath, 0)
trace.ErrorCode = CM46_HostDidNotMigrate // Assume it until proven wrong

for {
select {
case i := <-incPackets:
p := i.(qt.Packet)
if trace.ErrorCode == CM46_HostDidNotMigrate {
trace.ErrorCode = CM46_HostDidNotValidateNewPath
}

if fp, ok := p.(qt.Framer); ok && fp.Contains(qt.PathChallengeType) && trace.ErrorCode == CM46_HostDidNotValidateNewPath {
trace.ErrorCode = CM46_NoNewCIDUsed
}

if bytes.Equal(p.Header().DestinationConnectionID(), scid) && trace.ErrorCode == CM46_NoNewCIDUsed {
trace.ErrorCode = 0
}

if conn.Streams.Get(0).ReadClosed {
s.Finished()
}
case <-conn.ConnectionClosed:
return
case <-s.Timeout():
return
}
}
}
57 changes: 29 additions & 28 deletions scenarii/scenario.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,33 +100,34 @@ func (s *AbstractScenario) CompleteHandshake(conn *qt.Connection, trace *qt.Trac

func GetAllScenarii() map[string]Scenario {
return map[string]Scenario{
"zero_rtt": NewZeroRTTScenario(),
"connection_migration": NewConnectionMigrationScenario(),
"unsupported_tls_version": NewUnsupportedTLSVersionScenario(),
"stream_opening_reordering": NewStreamOpeningReorderingScenario(),
"multi_stream": NewMultiStreamScenario(),
"new_connection_id": NewNewConnectionIDScenario(),
"version_negotiation": NewVersionNegotiationScenario(),
"handshake": NewHandshakeScenario(),
"handshake_v6": NewHandshakev6Scenario(),
"transport_parameters": NewTransportParameterScenario(),
"address_validation": NewAddressValidationScenario(),
"padding": NewPaddingScenario(),
"flow_control": NewFlowControlScenario(),
"ack_only": NewAckOnlyScenario(),
"ack_ecn": NewAckECNScenario(),
"stop_sending": NewStopSendingOnReceiveStreamScenario(),
"http_get_and_wait": NewSimpleGetAndWaitScenario(),
"http_get_on_uni_stream": NewGetOnStream2Scenario(),
"key_update": NewKeyUpdateScenario(),
"retire_connection_id": NewRetireConnectionIDScenario(),
"http3_get": NewHTTP3GETScenario(),
"http3_encoder_stream": NewHTTP3EncoderStreamScenario(),
"http3_uni_streams_limits": NewHTTP3UniStreamsLimitsScenario(),
"http3_reserved_frames": NewHTTP3ReservedFramesScenario(),
"http3_reserved_streams": NewHTTP3ReservedStreamsScenario(),
"spin_bit": NewSpinBitScenario(),
"overlapping_stream_frames": NewOverlappingStreamFramesScenario(),
"server_flow_control": NewServerFlowControlScenario(),
"zero_rtt": NewZeroRTTScenario(),
"connection_migration": NewConnectionMigrationScenario(),
"unsupported_tls_version": NewUnsupportedTLSVersionScenario(),
"stream_opening_reordering": NewStreamOpeningReorderingScenario(),
"multi_stream": NewMultiStreamScenario(),
"new_connection_id": NewNewConnectionIDScenario(),
"version_negotiation": NewVersionNegotiationScenario(),
"handshake": NewHandshakeScenario(),
"handshake_v6": NewHandshakev6Scenario(),
"transport_parameters": NewTransportParameterScenario(),
"address_validation": NewAddressValidationScenario(),
"padding": NewPaddingScenario(),
"flow_control": NewFlowControlScenario(),
"ack_only": NewAckOnlyScenario(),
"ack_ecn": NewAckECNScenario(),
"stop_sending": NewStopSendingOnReceiveStreamScenario(),
"http_get_and_wait": NewSimpleGetAndWaitScenario(),
"http_get_on_uni_stream": NewGetOnStream2Scenario(),
"key_update": NewKeyUpdateScenario(),
"retire_connection_id": NewRetireConnectionIDScenario(),
"http3_get": NewHTTP3GETScenario(),
"http3_encoder_stream": NewHTTP3EncoderStreamScenario(),
"http3_uni_streams_limits": NewHTTP3UniStreamsLimitsScenario(),
"http3_reserved_frames": NewHTTP3ReservedFramesScenario(),
"http3_reserved_streams": NewHTTP3ReservedStreamsScenario(),
"spin_bit": NewSpinBitScenario(),
"overlapping_stream_frames": NewOverlappingStreamFramesScenario(),
"server_flow_control": NewServerFlowControlScenario(),
"connection_migration_v4_v6": NewConnectionMigrationv4v6Scenario(),
}
}

0 comments on commit 4027b3d

Please sign in to comment.