从net.CIDRMask

时间:2015-11-18 00:37:06

标签: go ipv6

我正在处理代码,并尝试添加ipv6支持。以下代码位于ipv4支持的当前代码库中。该代码采用ipv4 ip地址并获取/ 32上的地址的子网掩码。

// string of ip address
networkInterface["ip_address"] = v.IpAddress[0]
m := net.CIDRMask(v.IpConfig.IpAddress[0].PrefixLength, 32)
subnetMask := net.IPv4(m[0], m[1], m[2], m[3])
networkInterface["subnet_mask"] = subnetMask.String()

我知道net.CIDRMask适用于ipv6,我不确定如何将其与ipv6地址一起使用。

我现在正在测试ip地址以确定地址是ipv4还是ipv6:

testInput := net.ParseIP(v.IpAddress[0])
if testInput.To4() != nil {
// find ipv4 subnet mask
}
if testInput.To16() != nil {
// do ipv6 subnet mask
}

net.CIDRMask的单元测试中有与ipv6一起使用的示例:https://golang.org/src/net/ip_test.go

但它超出了我的golang经验和ipv6知识。

RTFM提供文档https://golang.org/pkg/net/#CIDRMask时提到:

func CIDRMask(ones, bits int) IPMask
  

CIDRMask返回一个IPMask,由1个1位后跟0组成   最多为“位”位的总长度。对于这种形式的掩码,CIDRMask   是IPMask.Size的反转。

那么我对onesbits使用什么值?

这是从api回来的:

$ govc vm.info -json vcsa | jq .VirtualMachines[0].Guest.Net[0].IpConfig.IpAddress [   {
    "IpAddress": "10.20.128.218",
    "PrefixLength": 22,
    "Origin": "",
    "State": "preferred",
    "Lifetime": null   } ]

提前致谢!

1 个答案:

答案 0 :(得分:1)

我不确定PrefixLength是什么,它可能是您的某个结构中定义的某个字段,但它似乎不是net包中任何内容的字段,或者事实上,标准库中的任何地方都是:https://golang.org/search?q=PrefixLength

所以我不确定PrefixLength应该给出什么,但是,我可以告诉你:

  • IPv4地址由32位数据组成(256 x 256 x 256 x 256个总IP),因此在处理IPv4时,bits的{​​{1}}参数值应为32。 / LI>
  • IPv4地址有128位数据,因此net.CIDRMask参数为128。
  • 与单个IP对应的CIDR范围的子网掩码将具有最大数量1,因此bits值为32或128,具体取决于您是在谈论IPv4还是IPv6。

因此,对于IPv4,您应该呼叫ones,对于IPv6,net.CIDRMask(32, 32)。由于这些计算每次都是完全相同的,因此您可以选择将值预先设置为代码中的常量。正确的值是: