[🚀] v0.12.21
This commit is contained in:
@ -9,21 +9,21 @@ import (
|
||||
)
|
||||
|
||||
// SuperNetting 合并网段
|
||||
func SuperNetting(ns []string) (*cidr, error) {
|
||||
func SuperNetting(ns []string) (*Cidr, error) {
|
||||
num := len(ns)
|
||||
if num < 1 || (num&(num-1)) != 0 {
|
||||
return nil, fmt.Errorf("子网数量必须是2的次方")
|
||||
}
|
||||
|
||||
mask := ""
|
||||
var cidrs []*cidr
|
||||
var ciders []*Cidr
|
||||
for _, n := range ns {
|
||||
// 检查子网CIDR有效性
|
||||
c, err := ParseCIDR(n)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("网段%v格式错误", n)
|
||||
}
|
||||
cidrs = append(cidrs, c)
|
||||
ciders = append(ciders, c)
|
||||
|
||||
// TODO 暂只考虑相同子网掩码的网段合并
|
||||
if len(mask) == 0 {
|
||||
@ -32,12 +32,12 @@ func SuperNetting(ns []string) (*cidr, error) {
|
||||
return nil, fmt.Errorf("子网掩码不一致")
|
||||
}
|
||||
}
|
||||
AscSortCIDRs(cidrs)
|
||||
AscSortCIDRs(ciders)
|
||||
|
||||
// 检查网段是否连续
|
||||
var network net.IP
|
||||
for _, c := range cidrs {
|
||||
if len(network) > 0 {
|
||||
for _, c := range ciders {
|
||||
if network != nil && len(network) > 0 {
|
||||
if !network.Equal(c.ipNet.IP) {
|
||||
return nil, fmt.Errorf("必须是连续的网段")
|
||||
}
|
||||
@ -47,7 +47,7 @@ func SuperNetting(ns []string) (*cidr, error) {
|
||||
}
|
||||
|
||||
// 子网掩码左移,得到共同的父网段
|
||||
c := cidrs[0]
|
||||
c := ciders[0]
|
||||
ones, bits := c.MaskSize()
|
||||
ones = ones - int(math.Log2(float64(num)))
|
||||
c.ipNet.Mask = net.CIDRMask(ones, bits)
|
||||
@ -89,7 +89,7 @@ func Compare(a, b net.IP) int {
|
||||
}
|
||||
|
||||
// AscSortCIDRs 升序
|
||||
func AscSortCIDRs(cs []*cidr) {
|
||||
func AscSortCIDRs(cs []*Cidr) {
|
||||
sort.Slice(cs, func(i, j int) bool {
|
||||
if n := bytes.Compare(cs[i].ipNet.IP, cs[j].ipNet.IP); n != 0 {
|
||||
return n < 0
|
||||
@ -104,7 +104,7 @@ func AscSortCIDRs(cs []*cidr) {
|
||||
}
|
||||
|
||||
// DescSortCIDRs 降序
|
||||
func DescSortCIDRs(cs []*cidr) {
|
||||
func DescSortCIDRs(cs []*Cidr) {
|
||||
sort.Slice(cs, func(i, j int) bool {
|
||||
if n := bytes.Compare(cs[i].ipNet.IP, cs[j].ipNet.IP); n != 0 {
|
||||
return n >= 0
|
||||
|
Reference in New Issue
Block a user