diff --git a/frame.go b/frame.go index 8ccf142c..4fb95357 100644 --- a/frame.go +++ b/frame.go @@ -85,3 +85,20 @@ func WriteStreamFrame(b *bytes.Buffer, f *StreamFrame) { utils.WriteUint16(b, uint16(len(f.Data))) b.Write(f.Data) } + +// An AckFrame in QUIC +type AckFrame struct { + LargestObserved uint32 // TODO: change to uint64 +} + +// WriteAckFrame writes an ack frame. +func WriteAckFrame(b *bytes.Buffer, f *AckFrame) { + typeByte := uint8(0x48) + b.WriteByte(typeByte) + b.WriteByte(0x00) // TODO: Entropy accumulation + utils.WriteUint32(b, f.LargestObserved) + utils.WriteUint16(b, 1) // TODO: Ack delay time + b.WriteByte(0x01) // Just one timestamp + b.WriteByte(0x00) // Largest observed + utils.WriteUint32(b, 0) // First timestamp +} diff --git a/frame_test.go b/frame_test.go index 74675e29..26124f88 100644 --- a/frame_test.go +++ b/frame_test.go @@ -52,4 +52,16 @@ var _ = Describe("Frame", func() { }) }) }) + + Context("ACK frames", func() { + Context("when writing", func() { + It("writes simple frames", func() { + b := &bytes.Buffer{} + WriteAckFrame(b, &AckFrame{ + LargestObserved: 1, + }) + Expect(b.Bytes()).To(Equal([]byte{0x48, 0, 0x01, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0})) + }) + }) + }) })