我正在处理代码,并尝试添加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的反转。
那么我对ones
和bits
使用什么值?
这是从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 } ]
提前致谢!
答案 0 :(得分:1)
我不确定PrefixLength
是什么,它可能是您的某个结构中定义的某个字段,但它似乎不是net
包中任何内容的字段,或者事实上,标准库中的任何地方都是:https://golang.org/search?q=PrefixLength。
所以我不确定PrefixLength
应该给出什么,但是,我可以告诉你:
bits
的{{1}}参数值应为32。 / LI>
net.CIDRMask
参数为128。bits
值为32或128,具体取决于您是在谈论IPv4还是IPv6。因此,对于IPv4,您应该呼叫ones
,对于IPv6,net.CIDRMask(32, 32)
。由于这些计算每次都是完全相同的,因此您可以选择将值预先设置为代码中的常量。正确的值是: