implement a basic store for new connection IDs

This commit is contained in:
Marten Seemann
2019-09-14 14:11:28 +07:00
parent 36c77a56c9
commit 031c1709e6
6 changed files with 368 additions and 0 deletions

45
conn_id_manager.go Normal file
View File

@@ -0,0 +1,45 @@
package quic
import (
"fmt"
"github.com/lucas-clemente/quic-go/internal/utils"
"github.com/lucas-clemente/quic-go/internal/wire"
)
type connIDManager struct {
queue utils.NewConnectionIDList
}
func (h *connIDManager) Add(f *wire.NewConnectionIDFrame) error {
// insert a new element at the end
if h.queue.Len() == 0 || h.queue.Back().Value.SequenceNumber < f.SequenceNumber {
h.queue.PushBack(utils.NewConnectionID{
SequenceNumber: f.SequenceNumber,
ConnectionID: f.ConnectionID,
StatelessResetToken: &f.StatelessResetToken,
})
return nil
}
// insert a new element somewhere in the middle
for el := h.queue.Front(); el != nil; el = el.Next() {
if el.Value.SequenceNumber == f.SequenceNumber {
if !el.Value.ConnectionID.Equal(f.ConnectionID) {
return fmt.Errorf("received conflicting connection IDs for sequence number %d", f.SequenceNumber)
}
if *el.Value.StatelessResetToken != f.StatelessResetToken {
return fmt.Errorf("received conflicting stateless reset tokens for sequence number %d", f.SequenceNumber)
}
return nil
}
if el.Value.SequenceNumber > f.SequenceNumber {
h.queue.InsertBefore(utils.NewConnectionID{
SequenceNumber: f.SequenceNumber,
ConnectionID: f.ConnectionID,
StatelessResetToken: &f.StatelessResetToken,
}, el)
return nil
}
}
panic("should have processed NEW_CONNECTION_ID frame")
}