// Copyright 2015 CNI authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package ip import ( "math/big" "net" ) // NextIP returns IP incremented by 1 func NextIP(ip net.IP) net.IP { i := ipToInt(ip) return intToIP(i.Add(i, big.NewInt(1))) } // PrevIP returns IP decremented by 1 func PrevIP(ip net.IP) net.IP { i := ipToInt(ip) return intToIP(i.Sub(i, big.NewInt(1))) } // Cmp compares two IPs, returning the usual ordering: // a < b : -1 // a == b : 0 // a > b : 1 func Cmp(a, b net.IP) int { aa := ipToInt(a) bb := ipToInt(b) return aa.Cmp(bb) } func ipToInt(ip net.IP) *big.Int { if v := ip.To4(); v != nil { return big.NewInt(0).SetBytes(v) } return big.NewInt(0).SetBytes(ip.To16()) } func intToIP(i *big.Int) net.IP { return net.IP(i.Bytes()) } // Network masks off the host portion of the IP func Network(ipn *net.IPNet) *net.IPNet { return &net.IPNet{ IP: ipn.IP.Mask(ipn.Mask), Mask: ipn.Mask, } }