forked from cloudfoundry/bosh-bootloader
/
cidr_block.go
55 lines (43 loc) · 988 Bytes
/
cidr_block.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package bosh
import (
"fmt"
"strconv"
"strings"
)
type CIDRBlock struct {
CIDRSize int
firstIP IP
}
func ParseCIDRBlock(cidrBlock string) (CIDRBlock, error) {
const HIGHEST_BITMASK = 32
const CIDR_PARTS = 2
cidrParts := strings.Split(cidrBlock, "/")
if len(cidrParts) != CIDR_PARTS {
return CIDRBlock{}, fmt.Errorf(`"%s" cannot parse CIDR block`, cidrBlock)
}
ip, err := ParseIP(cidrParts[0])
if err != nil {
return CIDRBlock{}, err
}
maskBits, err := strconv.Atoi(cidrParts[1])
if err != nil {
return CIDRBlock{}, err
}
if maskBits < 0 || maskBits > HIGHEST_BITMASK {
return CIDRBlock{}, fmt.Errorf("mask bits out of range")
}
cidrSize := 1 << (HIGHEST_BITMASK - uint(maskBits))
return CIDRBlock{
CIDRSize: cidrSize,
firstIP: ip,
}, nil
}
func (c CIDRBlock) GetFirstIP() IP {
return c.GetNthIP(0)
}
func (c CIDRBlock) GetNthIP(n int) IP {
return c.firstIP.Add(n)
}
func (c CIDRBlock) GetLastIP() IP {
return c.GetNthIP(c.CIDRSize - 1)
}