From db87efa2ec1e91e81517236b164b279e57b8daa8 Mon Sep 17 00:00:00 2001 From: Ondrej Fabry Date: Fri, 20 Mar 2020 10:52:19 +0100 Subject: Fix statsclient for VPP 20.05-rc0 (master) - this change fixes panic that was occurring with recent VPP that was caused by incorrectly calculated vector length - converting returned vector length from uint64 to uint32 results in correct length value Change-Id: I76a4b9d147c3df3bea9d3e5ef5853e2809dc42e8 Signed-off-by: Ondrej Fabry --- adapter/statsclient/statseg.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'adapter/statsclient/statseg.go') diff --git a/adapter/statsclient/statseg.go b/adapter/statsclient/statseg.go index 7f1c381..42ab3de 100644 --- a/adapter/statsclient/statseg.go +++ b/adapter/statsclient/statseg.go @@ -19,12 +19,16 @@ type sharedHeaderBase struct { statsOffset int64 } -type statSegSharedHeader struct { +type sharedHeaderV0 struct { + sharedHeaderBase +} + +type sharedHeader struct { version uint64 sharedHeaderBase } -func (h *statSegSharedHeader) legacyVersion() bool { +func (h *sharedHeader) legacyVersion() bool { // older VPP (<=19.04) did not have version in stat segment header // we try to provide fallback support by skipping it in header if h.version > maxVersion && h.inProgress > 1 && h.epoch == 0 { @@ -33,8 +37,8 @@ func (h *statSegSharedHeader) legacyVersion() bool { return false } -func statSegHeader(b []byte) (header statSegSharedHeader) { - h := (*statSegSharedHeader)(unsafe.Pointer(&b[0])) +func loadSharedHeader(b []byte) (header sharedHeader) { + h := (*sharedHeader)(unsafe.Pointer(&b[0])) header.version = atomic.LoadUint64(&h.version) header.epoch = atomic.LoadInt64(&h.epoch) header.inProgress = atomic.LoadInt64(&h.inProgress) @@ -44,8 +48,8 @@ func statSegHeader(b []byte) (header statSegSharedHeader) { return } -func statSegHeaderLegacy(b []byte) (header statSegSharedHeader) { - h := (*sharedHeaderBase)(unsafe.Pointer(&b[0])) +func loadSharedHeaderLegacy(b []byte) (header sharedHeader) { + h := (*sharedHeaderV0)(unsafe.Pointer(&b[0])) header.version = 0 header.epoch = atomic.LoadInt64(&h.epoch) header.inProgress = atomic.LoadInt64(&h.inProgress) @@ -90,7 +94,7 @@ type vecHeader struct { } func vectorLen(v unsafe.Pointer) uint64 { - vec := *(*vecHeader)(unsafe.Pointer(uintptr(v) - unsafe.Sizeof(uintptr(0)))) + vec := *(*vecHeader)(unsafe.Pointer(uintptr(v) - unsafe.Sizeof(uint64(0)))) return vec.length } -- cgit 1.2.3-korg