2015-11-18 70 views
0

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

// 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'ing该文档https://golang.org/pkg/net/#CIDRMask提及:

func CIDRMask(ones, bits int) IPMask 

CIDRMask返回IPMask包括`那些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 } ] 

谢谢!

+0

'bits'是128 IPv6和32针对IPv4。对于'ones',这取决于,它不是100%清楚你想要做什么。您是否试图获得代表1个单一IP的CIDR的子网掩码?如果是这样,那么'ones'应该等于'bits'。而且,如果你总是用相同的两对输入来调用函数,为什么不先做一次呢? –

+0

我想获得一个IP地址的子网掩码。让我更加清楚......我认为这就是代码所做的事情。新手到golang :) – chrislovecnm

+0

任何单个IPv4地址的子网掩码将始终是您在第307行上看到的内容:https://golang.org/src/net/ip_test.go#L307。对于IPv6,它始终是您在第311行上看到的内容:https://golang.org/src/net/ip_test.go#L311。 –

回答

1

我不确定PrefixLength是什么,它可能是某个字段在其中一个结构中定义的字段,但它看起来不是net包中的任何字段,或者实际上在标准库中的任何位置:https://golang.org/search?q=PrefixLength

所以我不知道什么PrefixLength有望给,但是,我可以告诉你:

  • IPv4地址包括32位数据(256×256×256×256个IP地址),因此与IPv4的处理时,对于bits参数net.CIDRMask的值应为32
  • IPv4地址具有128位数据,所以bits参数是128
  • 为对应于单个一个CIDR范围子网掩码IP将有最大数量的,所以ones值为32或128,具体取决于您是在说IPv4还是IPv6。

因此,对于IPv4,你应该叫net.CIDRMask(32, 32),以及对IPv6,net.CIDRMask(128, 128)。由于每次都会进行完全相同的计算,因此您可以选择将代码中的值作为常量进行简单设置。正确的值是:

+0

PrefixLength是我将用于'ones'的值,并且从govc api调用返回,json位于上面。 – chrislovecnm