032273e67e
Signed-off-by: Alejandro Mery <amery@jpi.io>
55 lines
899 B
Go
55 lines
899 B
Go
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),
|
|
})
|
|
}
|