always send ACK frames together with Stream frames

This commit is contained in:
Marten Seemann
2016-04-19 12:18:13 +07:00
parent b52455c3f7
commit 30998cef1f

View File

@@ -39,6 +39,8 @@ type Session struct {
Streams map[protocol.StreamID]*Stream Streams map[protocol.StreamID]*Stream
streamsMutex sync.RWMutex streamsMutex sync.RWMutex
AckQueue []*frames.AckFrame
streamCallback StreamCallback streamCallback StreamCallback
} }
@@ -92,7 +94,7 @@ func (s *Session) HandlePacket(addr *net.UDPAddr, publicHeaderBinary []byte, pub
} }
s.EntropyReceived.Add(publicHeader.PacketNumber, privateFlag&0x01 > 0) s.EntropyReceived.Add(publicHeader.PacketNumber, privateFlag&0x01 > 0)
s.SendFrame(&frames.AckFrame{ s.queueAck(&frames.AckFrame{
LargestObserved: publicHeader.PacketNumber, LargestObserved: publicHeader.PacketNumber,
Entropy: s.EntropyReceived.Get(), Entropy: s.EntropyReceived.Get(),
}) })
@@ -195,6 +197,10 @@ func (s *Session) handleAckFrame(r *bytes.Reader) error {
return nil return nil
} }
func (s *Session) queueAck(f *frames.AckFrame) {
s.AckQueue = append(s.AckQueue, f)
}
func (s *Session) handleConnectionCloseFrame(r *bytes.Reader) error { func (s *Session) handleConnectionCloseFrame(r *bytes.Reader) error {
fmt.Println("Detected CONNECTION_CLOSE") fmt.Println("Detected CONNECTION_CLOSE")
frame, err := frames.ParseConnectionCloseFrame(r) frame, err := frames.ParseConnectionCloseFrame(r)
@@ -258,6 +264,13 @@ func (s *Session) SendFrame(frame frames.Frame) error {
framesData.WriteByte(0) framesData.WriteByte(0)
} }
// add all outstanding ACKs
for _, ackFrame := range s.AckQueue {
fmt.Printf("Adding ACK for %d\n", ackFrame.LargestObserved)
ackFrame.Write(&framesData)
}
s.AckQueue = s.AckQueue[:0]
if err := frame.Write(&framesData); err != nil { if err := frame.Write(&framesData); err != nil {
return err return err
} }