mirror of
https://github.com/netbirdio/netbird.git
synced 2026-08-25 17:11:29 +02:00
35 lines
719 B
Go
35 lines
719 B
Go
package net
|
|
|
|
import (
|
|
"fmt"
|
|
"math/big"
|
|
"net"
|
|
"net/netip"
|
|
)
|
|
|
|
func GetLastIPFromNetwork(network netip.Prefix, fromEnd int) (netip.Addr, error) {
|
|
var endIP net.IP
|
|
addr := network.Addr().AsSlice()
|
|
mask := net.CIDRMask(network.Bits(), len(addr)*8)
|
|
|
|
for i := 0; i < len(addr); i++ {
|
|
endIP = append(endIP, addr[i]|^mask[i])
|
|
}
|
|
|
|
// convert to big.Int
|
|
endInt := big.NewInt(0)
|
|
endInt.SetBytes(endIP)
|
|
|
|
// subtract fromEnd from the last ip
|
|
fromEndBig := big.NewInt(int64(fromEnd))
|
|
resultInt := big.NewInt(0)
|
|
resultInt.Sub(endInt, fromEndBig)
|
|
|
|
ip, ok := netip.AddrFromSlice(resultInt.Bytes())
|
|
if !ok {
|
|
return netip.Addr{}, fmt.Errorf("invalid IP address from network %s", network)
|
|
}
|
|
|
|
return ip.Unmap(), nil
|
|
}
|