From 30998cef1fa810bb315a3275603b2860388c9856 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Tue, 19 Apr 2016 12:18:13 +0700 Subject: [PATCH] always send ACK frames together with Stream frames --- session.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/session.go b/session.go index 2fe310985..9df216ad4 100644 --- a/session.go +++ b/session.go @@ -39,6 +39,8 @@ type Session struct { Streams map[protocol.StreamID]*Stream streamsMutex sync.RWMutex + AckQueue []*frames.AckFrame + 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.SendFrame(&frames.AckFrame{ + s.queueAck(&frames.AckFrame{ LargestObserved: publicHeader.PacketNumber, Entropy: s.EntropyReceived.Get(), }) @@ -195,6 +197,10 @@ func (s *Session) handleAckFrame(r *bytes.Reader) error { return nil } +func (s *Session) queueAck(f *frames.AckFrame) { + s.AckQueue = append(s.AckQueue, f) +} + func (s *Session) handleConnectionCloseFrame(r *bytes.Reader) error { fmt.Println("Detected CONNECTION_CLOSE") frame, err := frames.ParseConnectionCloseFrame(r) @@ -258,6 +264,13 @@ func (s *Session) SendFrame(frame frames.Frame) error { 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 { return err }