immediately remove sessions that were closed remotely

We only need to keep sessions that were closed locally, in order to
retransmit the CONNECTION_CLOSE packet. For sessions that were closed by
the peer, we don't need to wait for any more packets, and there's also
no CONNECTION_CLOSE to retransmit. The same applies for sessions that
were destroyed when receiving a Version Negotiation or a Retry packet.
This commit is contained in:
Marten Seemann
2018-11-15 19:14:34 +07:00
parent 1dd0b9a635
commit 65cca7b726
8 changed files with 46 additions and 4 deletions

View File

@@ -33,6 +33,7 @@ type unknownPacketHandler interface {
type packetHandlerManager interface {
Add(protocol.ConnectionID, packetHandler)
Retire(protocol.ConnectionID)
Remove(protocol.ConnectionID)
SetServer(unknownPacketHandler)
CloseServer()
}
@@ -49,15 +50,18 @@ type quicSession interface {
type sessionRunner interface {
onHandshakeComplete(Session)
retireConnectionID(protocol.ConnectionID)
removeConnectionID(protocol.ConnectionID)
}
type runner struct {
onHandshakeCompleteImpl func(Session)
retireConnectionIDImpl func(protocol.ConnectionID)
removeConnectionIDImpl func(protocol.ConnectionID)
}
func (r *runner) onHandshakeComplete(s Session) { r.onHandshakeCompleteImpl(s) }
func (r *runner) retireConnectionID(c protocol.ConnectionID) { r.retireConnectionIDImpl(c) }
func (r *runner) removeConnectionID(c protocol.ConnectionID) { r.removeConnectionIDImpl(c) }
var _ sessionRunner = &runner{}
@@ -153,6 +157,7 @@ func (s *server) setup() error {
s.sessionRunner = &runner{
onHandshakeCompleteImpl: func(sess Session) { s.sessionQueue <- sess },
retireConnectionIDImpl: s.sessionHandler.Retire,
removeConnectionIDImpl: s.sessionHandler.Remove,
}
cookieGenerator, err := handshake.NewCookieGenerator()
if err != nil {