package rings import "net/netip" func PrefixToRange(subnet netip.Prefix) (from, to netip.Addr) { if u, ok := addrToU32(subnet.Addr()); ok { shift := 32 - subnet.Bits() m1 := uint32((1 << shift) - 1) m0 := uint32(0xffffffff) & ^m1 u0 := u & m0 u1 := u0 + m1 from = u32ToAddr(u0) to = u32ToAddr(u1) } return from, to } func u32ToAddr(v uint32) netip.Addr { return addrFrom4( uint(v>>24)&0xff, uint(v>>16)&0xff, uint(v>>8)&0xff, uint(v)&0xff, ) } func addrToU32(addr netip.Addr) (uint32, bool) { switch { case !addr.IsValid(): return 0, false case addr.Is4(), addr.Is4In6(): a4 := addr.As4() v := uint32(a4[0])<<24 + uint32(a4[1])<<16 + uint32(a4[2])<<8 + uint32(a4[3]) return v, true default: return 0, false } } func addrFrom4(a, b, c, d uint) netip.Addr { return netip.AddrFrom4([4]byte{ byte(a), byte(b), byte(c), byte(d), }) }