}
var hasMorePackets bool
- for i := 0; i < numPackets; i++ {
+ for i := range numPackets {
if i > 0 {
c.receivedPacketMx.Lock()
}
if processed {
wasProcessed = true
}
- if !hasMorePackets {
+ if !c.handshakeComplete && (c.initialStream.HasData() || c.handshakeStream.HasData()) {
break
}
- // only process a single packet at a time before handshake completion
- if !c.handshakeComplete {
+ if !hasMorePackets {
break
}
}
c.sentPacketHandler.ReceivedBytes(rp.Size(), rp.rcvTime)
if wire.IsVersionNegotiationPacket(rp.data) {
- c.handleVersionNegotiationPacket(rp)
- return false, nil
+ return false, c.handleVersionNegotiationPacket(rp)
}
var counter uint8
return true
}
-func (c *Conn) handleVersionNegotiationPacket(p receivedPacket) {
+func (c *Conn) handleVersionNegotiationPacket(p receivedPacket) error {
if c.perspective == protocol.PerspectiveServer || // servers never receive version negotiation packets
c.receivedFirstPacket || c.versionNegotiated { // ignore delayed / duplicated version negotiation packets
if c.qlogger != nil {
Trigger: qlog.PacketDropUnexpectedPacket,
})
}
- return
+ return nil
}
src, dest, supportedVersions, err := wire.ParseVersionNegotiationPacket(p.data)
})
}
c.logger.Debugf("Error parsing Version Negotiation packet: %s", err)
- return
+ return nil
}
if slices.Contains(supportedVersions, c.version) {
}
// The Version Negotiation packet contains the version that we offered.
// This might be a packet sent by an attacker, or it was corrupted.
- return
+ return nil
}
c.logger.Infof("Received a Version Negotiation packet. Supported Versions: %s", supportedVersions)
Theirs: supportedVersions,
})
c.logger.Infof("No compatible QUIC version found.")
- return
+ return nil
}
if c.qlogger != nil {
c.qlogger.RecordEvent(qlog.VersionInformation{
c.logger.Infof("Switching to QUIC version %s.", newVersion)
nextPN, _ := c.sentPacketHandler.PeekPacketNumber(protocol.EncryptionInitial)
- c.destroyImpl(&errCloseForRecreating{
+ return &errCloseForRecreating{
nextPacketNumber: nextPN,
nextVersion: newVersion,
- })
+ }
}
func (c *Conn) handleUnpackedLongHeaderPacket(
}
func TestConnectionReceivePrioritization(t *testing.T) {
- t.Run("handshake complete", func(t *testing.T) {
- events := testConnectionReceivePrioritization(t, true, 5)
- require.Equal(t, []string{"unpack", "unpack", "unpack", "unpack", "unpack", "pack"}, events)
- })
-
- // before handshake completion, we trigger packing of a new packet every time we receive a packet
- t.Run("handshake not complete", func(t *testing.T) {
- events := testConnectionReceivePrioritization(t, false, 5)
- require.Equal(t, []string{
- "unpack", "pack",
- "unpack", "pack",
- "unpack", "pack",
- "unpack", "pack",
- "unpack", "pack",
- }, events)
- })
+ for _, handshakeComplete := range []bool{true, false} {
+ t.Run(fmt.Sprintf("handshake complete: %t", handshakeComplete), func(t *testing.T) {
+ events := testConnectionReceivePrioritization(t, handshakeComplete, 5)
+ require.Equal(t, []string{"unpack", "unpack", "unpack", "unpack", "unpack", "pack"}, events)
+ })
+ }
}
func testConnectionReceivePrioritization(t *testing.T, handshakeComplete bool, numPackets int) []string {