2015-11-18 102 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