From 7b39f643abed643c00a683e20a3bb23a6d6e05b1 Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Tue, 28 May 2024 02:29:34 +0000 Subject: [PATCH] rings: DecodeAddress() [WIP] Signed-off-by: Alejandro Mery --- pkg/rings/decode.go | 62 +++++++++++++++++++++++++++++++++++++++++++++ pkg/rings/rings.go | 14 ++++++++++ 2 files changed, 76 insertions(+) create mode 100644 pkg/rings/decode.go diff --git a/pkg/rings/decode.go b/pkg/rings/decode.go new file mode 100644 index 0000000..6c91442 --- /dev/null +++ b/pkg/rings/decode.go @@ -0,0 +1,62 @@ +package rings + +import ( + "net/netip" + + "darvaza.org/core" +) + +// DecodeAddress ... TODO +// +// revive:disable:function-result-limit +func DecodeAddress(addr netip.Addr) (RingID, RegionID, ZoneID, uint) { + // revive:enable:function-result-limit + if addr.IsValid() { + if addr.Is4In6() { + addr = addr.Unmap() + } + + if addr.Is4() { + a4 := addr.As4() + return unsafeDecodeAddress(a4[0], a4[1], a4[2], a4[3]) + } + } + + return InvalidRing, 0, 0, 0 +} + +// revive:disable:function-result-limit +func unsafeDecodeAddress(a, b, c, d byte) (RingID, RegionID, ZoneID, uint) { + // revive:enable:function-result-limit + switch { + case a != 10: + return InvalidRing, 0, 0, 0 + case b&0xf0 != 0: + k := RingThree + r := RegionID(b >> 4) + + n2 := uint(b & 0x0f) + n1 := uint(c) + n0 := uint(d) + n := n0 + n1<<8 + n2<<16 + + return k, r, 0, n + case b&0x0f != 0: + r := RegionID(b) + z := ZoneID(c >> 4) + k := core.IIf(z == 0, RingTwo, RingOne) + + n1 := uint(c & 0x0f) + n0 := uint(d) + n := n0 + n1<<8 + + return k, r, z, n + default: // b == 0 + k := RingZero + r := RegionID(c >> 4) + z := ZoneID(c & 0xf) + n := uint(d) + + return k, r, z, n + } +} diff --git a/pkg/rings/rings.go b/pkg/rings/rings.go index 646014d..b816db7 100644 --- a/pkg/rings/rings.go +++ b/pkg/rings/rings.go @@ -8,7 +8,21 @@ import ( "darvaza.org/core" ) +// RingID ... TODO +type RingID int + const ( + // InvalidRing ... TODO + InvalidRing RingID = iota - 1 + // RingZero ... TODO + RingZero + // RingOne ... TODO + RingOne + // RingTwo ... TODO + RingTwo + // RingThree ... TODO + RingThree + // RegionMax indicates the highest number that can be used for a [RegionID]. RegionMax = (1 << 4) - 1 // ZoneMax indicates the highest number that can be used for a [ZoneID].