2016-11-03 7 views
0

net.IPNet型では、net.IPが内部にあるかどうかを確認するContainsメソッドがあります。しかし、私が欲しいのは、net.IPNetが別のnet.IPNetの中にあるかどうかを知ることです。私はbig.Intで動作するソリューションを試しましたが、機能しませんでした(また、関数のインターフェイスはひどいものでした)。何か案は?net.IPNet他のネットの中.IPNet?

// ipnet2 contains ipnet1 ? 
func ContainsCIDR(ipnet1, ipnet2 net.IPNet) bool { 
    var begin big.Int 
    begin.SetBytes([]byte(ipnet1.IP)) 

    var mask big.Int 
    mask.SetBytes([]byte(ipnet1.Mask)) 

    var diff big.Int 
    diff.Xor(&begin, &mask) 

    var end big.Int 
    end.Add(&begin, &diff) 

    ipBegin := net.IP(begin.Bytes()) 
    ipEnd := net.IP(end.Bytes()) 

    return ipnet2.Contains(ipBegin) && ipnet2.Contains(ipEnd) 
} 

答えて

1

その後、外側のサブネットのマスクは同じサイズまたは内部よりも小さいことを確認し、内部サブネットの開始アドレスが外側に含まれていることを確認します。

func ContainsCIDR(ipnet1, ipnet2 *net.IPNet) bool { 
    ones1, _ := ipnet1.Mask.Size() 
    ones2, _ := ipnet2.Mask.Size() 
    return ones1 <= ones2 && ipnet1.Contains(ipnet2.IP) 
} 
+0

は非常にありがとう多く!ソリューションのいくつかのテストシナリオは、https://play.golang.org/p/Q4J-JEN3sFにあります。 – faersons

関連する問題