diff --git a/packetcache/packetcache.go b/packetcache/packetcache.go index aa1e040..a9902e1 100644 --- a/packetcache/packetcache.go +++ b/packetcache/packetcache.go @@ -135,6 +135,21 @@ func (cache *Cache) Get(seqno uint16, result []byte) uint16 { return 0 } +func (cache *Cache) GetLast(result []byte) uint16 { + cache.mu.Lock() + defer cache.mu.Unlock() + + i := cache.tail - 1 + if i >= uint16(len(cache.entries)) { + i = 0 + } + + return uint16(copy( + result[:cache.entries[i].length], + cache.entries[i].buf[:]), + ) +} + func (cache *Cache) GetAt(seqno uint16, index uint16, result []byte) uint16 { cache.mu.Lock() defer cache.mu.Unlock() diff --git a/packetcache/packetcache_test.go b/packetcache/packetcache_test.go index 6680842..51968ab 100644 --- a/packetcache/packetcache_test.go +++ b/packetcache/packetcache_test.go @@ -33,6 +33,10 @@ func TestCache(t *testing.T) { if !bytes.Equal(buf[:l], buf1) { t.Errorf("Couldn't get 13 at %v", i1) } + l = cache.GetLast(buf) + if !bytes.Equal(buf[:l], buf2) { + t.Errorf("Couldn't get last") + } l = cache.Get(17, buf) if !bytes.Equal(buf[:l], buf2) {