Files
jpictl/pkg/rings/cidr.go
T
amery 032273e67e rings: WIP
Signed-off-by: Alejandro Mery <amery@jpi.io>
2024-05-19 03:33:22 +00:00

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),
})
}