netmaker/logic/ips/ips.go
2022-04-25 13:10:55 -04:00

63 lines
1.9 KiB
Go

package ips
import (
"fmt"
"strings"
"github.com/seancfoley/ipaddress-go/ipaddr"
)
// GetFirstAddr - gets the first valid address in a given IPv4 CIDR
func GetFirstAddr(cidr4 string) (*ipaddr.IPAddress, error) {
currentCidr := ipaddr.NewIPAddressString(cidr4).GetAddress()
if !currentCidr.IsIPv4() {
return nil, fmt.Errorf("invalid IPv4 CIDR provided to GetFirstAddr")
}
lower := currentCidr.GetLower()
ipParts := strings.Split(lower.GetNetIPAddr().IP.String(), ".")
if ipParts[len(ipParts)-1] == "0" {
lower = lower.Increment(1)
}
return lower, nil
}
// GetLastAddr - gets the last valid address in a given IPv4 CIDR
func GetLastAddr(cidr4 string) (*ipaddr.IPAddress, error) {
currentCidr := ipaddr.NewIPAddressString(cidr4).GetAddress()
if !currentCidr.IsIPv4() {
return nil, fmt.Errorf("invalid IPv4 CIDR provided to GetLastAddr")
}
upper := currentCidr.GetUpper()
ipParts := strings.Split(upper.GetNetIPAddr().IP.String(), ".")
if ipParts[len(ipParts)-1] == "255" {
upper = upper.Increment(-1)
}
return upper, nil
}
// GetFirstAddr6 - gets the first valid IPv6 address in a given IPv6 CIDR
func GetFirstAddr6(cidr6 string) (*ipaddr.IPAddress, error) {
currentCidr := ipaddr.NewIPAddressString(cidr6).GetAddress()
if !currentCidr.IsIPv6() {
return nil, fmt.Errorf("invalid IPv6 CIDR provided to GetFirstAddr6")
}
lower := currentCidr.GetLower()
ipParts := strings.Split(lower.GetNetIPAddr().IP.String(), "::")
if len(ipParts) == 2 {
if len(ipParts[len(ipParts)-1]) == 0 {
lower = lower.Increment(1)
}
}
return lower, nil
}
// GetLastAddr6 - gets the last valid IPv6 address in a given IPv6 CIDR
func GetLastAddr6(cidr6 string) (*ipaddr.IPAddress, error) {
currentCidr := ipaddr.NewIPAddressString(cidr6).GetAddress()
if !currentCidr.IsIPv6() {
return nil, fmt.Errorf("invalid IPv6 CIDR provided to GetLastAddr6")
}
upper := currentCidr.GetUpper()
return upper, nil
}