我正在编写代码,并尝试添加 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 位后跟 0 组成,直到总长度为“位”位。对于这种形式的掩码,CIDRMask 是 IPMask.Size 的倒数。
那么我对onesand使用什么值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 } ]
提前致谢!
慕容森
相关分类