Skip to content

Instantly share code, notes, and snippets.

@cstockton
Created November 3, 2019 15:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cstockton/02638ab68bb06f4171da402b3bc8f56f to your computer and use it in GitHub Desktop.
Save cstockton/02638ab68bb06f4171da402b3bc8f56f to your computer and use it in GitHub Desktop.
package ipnet
var (
// these allow zero-allocation IP masking
cidrMasksIPv4 = [33]net.IPMask{}
cidrMasksIPv6 = [129]net.IPMask{}
)
func init() {
for i := 0; i <= 32; i++ {
cidrMasksIPv4[i] = net.CIDRMask(i, net.IPv4len*8)
}
for i := 0; i <= 128; i++ {
cidrMasksIPv6[i] = net.CIDRMask(i, net.IPv6len*8)
}
}
// IPMask is a zero-allocation net.IPMask that _must_ be treated as immutable.
func IPMask(ones, bits int) net.IPMask {
switch {
case ones <= 32 && bits == net.IPv4len*8:
return cidrMasksIPv4[ones]
case ones <= 128 && bits == net.IPv6len*8:
return cidrMasksIPv6[ones]
default:
return net.CIDRMask(ones, bits)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment