add test for sentlist

This commit is contained in:
soypat
2025-11-03 19:04:23 -03:00
parent 26ef39ecc3
commit 72047b8ae9
2 changed files with 48 additions and 9 deletions
+10 -9
View File
@@ -361,35 +361,35 @@ type sentlist struct {
pkts []ringidx pkts []ringidx
} }
func (sl sentlist) latestPkt() *ringidx { func (sl sentlist) Newest() *ringidx {
if len(sl.pkts) == 0 { if len(sl.pkts) == 0 {
return nil return nil
} }
return &sl.pkts[len(sl.pkts)-1] return &sl.pkts[len(sl.pkts)-1]
} }
func (sl sentlist) oldestPkt() *ringidx { func (sl sentlist) Oldest() *ringidx {
if len(sl.pkts) == 0 { if len(sl.pkts) == 0 {
return nil return nil
} }
return &sl.pkts[0] return &sl.pkts[0]
} }
func (sl *sentlist) endSeq() Value { func (sl *sentlist) EndSeq() Value {
seq := sl.iss seq := sl.iss
lastPkt := sl.latestPkt() lastPkt := sl.Newest()
if lastPkt != nil { if lastPkt != nil {
seq = lastPkt.endSeq() seq = lastPkt.endSeq()
} }
return seq return seq
} }
func (sl *sentlist) addPkt(datalen int, bufsize int) { func (sl *sentlist) AddPacket(datalen int, bufsize int) {
free := cap(sl.pkts) - len(sl.pkts) free := cap(sl.pkts) - len(sl.pkts)
if free == 0 { if free == 0 {
panic("pkt buffer full") panic("pkt buffer full")
} }
lastPkt := sl.latestPkt() lastPkt := sl.Newest()
lastEnd := 0 lastEnd := 0
if lastPkt != nil { if lastPkt != nil {
lastEnd = lastPkt.end lastEnd = lastPkt.end
@@ -397,26 +397,27 @@ func (sl *sentlist) addPkt(datalen int, bufsize int) {
pkt := ringidx{ pkt := ringidx{
off: lastEnd, off: lastEnd,
end: addEnd(lastEnd, datalen, bufsize), end: addEnd(lastEnd, datalen, bufsize),
seq: sl.endSeq(), seq: sl.EndSeq(),
size: Size(datalen), size: Size(datalen),
} }
sl.pkts = append(sl.pkts, pkt) sl.pkts = append(sl.pkts, pkt)
} }
func (sl *sentlist) recvAck(ack Value, bufsize int) { func (sl *sentlist) RecvAck(ack Value, bufsize int) {
// Mark fully acked. // Mark fully acked.
for i := 0; i < len(sl.pkts); i++ { for i := 0; i < len(sl.pkts); i++ {
pkt := &sl.pkts[i] pkt := &sl.pkts[i]
endseq := pkt.endSeq() endseq := pkt.endSeq()
isFullyAcked := endseq.LessThanEq(ack) isFullyAcked := endseq.LessThanEq(ack)
if isFullyAcked { if isFullyAcked {
sl.iss = endseq
pkt.markRcvd() pkt.markRcvd()
} else { } else {
break break
} }
} }
sl.removeRecvd() sl.removeRecvd()
maybePartial := sl.oldestPkt() maybePartial := sl.Oldest()
if maybePartial == nil { if maybePartial == nil {
return // No more packets, all acked. return // No more packets, all acked.
} }
+38
View File
@@ -8,6 +8,44 @@ import (
"testing" "testing"
) )
func TestSentlist(t *testing.T) {
sl := sentlist{
pkts: make([]ringidx, 0, 3),
}
// Test full ack.
const bufsize = 16
const pkt = 10
sl.AddPacket(pkt, bufsize)
if sl.Oldest() == nil || sl.Newest() != sl.Oldest() {
t.Error("expected same oldest/newest non-nil packet")
}
ack := Value(pkt)
sl.RecvAck(ack, bufsize)
oldest := sl.Oldest()
if oldest != nil {
t.Fatal("expected packet to be fully read")
}
// Test partial ack.
sl.AddPacket(pkt, bufsize)
for i := Value(0); i < pkt-1; i++ {
ack++
sl.RecvAck(ack, bufsize)
oldest = sl.Oldest()
if oldest == nil {
t.Fatal("partially acked packet removed")
} else if oldest.seq != ack {
t.Errorf("want pkt.seq=%d got %d", ack, oldest.seq)
}
}
ack++
sl.RecvAck(ack, bufsize)
oldest = sl.Oldest()
if oldest != nil {
t.Fatal("expected packet to be fully read")
}
}
func TestTxQueue_multipacket(t *testing.T) { func TestTxQueue_multipacket(t *testing.T) {
const mtu = 256 const mtu = 256
const iss = 1 const iss = 1