only accept in-order packets, drop duplicates and out-of-order packets

This commit is contained in:
Marten Seemann
2016-04-16 19:23:39 +07:00
parent 79ba43bbdb
commit dc07d6144c

View File

@@ -28,6 +28,7 @@ type Session struct {
Entropy EntropyAccumulator
lastSentPacketNumber protocol.PacketNumber
lastObservedPacketNumber protocol.PacketNumber
streamCallback StreamCallback
}
@@ -41,12 +42,24 @@ func NewSession(conn *net.UDPConn, v protocol.VersionNumber, connectionID protoc
ServerConfig: sCfg,
cryptoSetup: handshake.NewCryptoSetup(connectionID, v, sCfg),
streamCallback: streamCallback,
lastObservedPacketNumber: 0,
}
}
// HandlePacket handles a packet
func (s *Session) HandlePacket(addr *net.UDPAddr, publicHeaderBinary []byte, publicHeader *PublicHeader, r *bytes.Reader) error {
// TODO: Only do this after authenticating
if s.lastObservedPacketNumber > 0 { // the first packet doesn't neccessarily need to have packetNumber 1
if publicHeader.PacketNumber < s.lastObservedPacketNumber || publicHeader.PacketNumber > s.lastObservedPacketNumber+1 {
return errors.New("Out of order packet")
}
if publicHeader.PacketNumber == s.lastObservedPacketNumber {
return errors.New("Duplicate packet")
}
}
s.lastObservedPacketNumber = publicHeader.PacketNumber
if addr != s.CurrentRemoteAddr {
s.CurrentRemoteAddr = addr
}