Newer
Older
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
56
57
58
59
60
package packet
import (
"bytes"
"fmt"
"math"
"net"
)
func decodeNLRIs(buf *bytes.Buffer, length uint16) (*NLRI, error) {
var ret *NLRI
var eol *NLRI
var nlri *NLRI
var err error
var consumed uint8
p := uint16(0)
for p < length {
nlri, consumed, err = decodeNLRI(buf)
if err != nil {
return nil, fmt.Errorf("Unable to decode NLRI: %v", err)
}
p += uint16(consumed)
if ret == nil {
ret = nlri
eol = nlri
continue
}
eol.Next = nlri
eol = nlri
}
return ret, nil
}
func decodeNLRI(buf *bytes.Buffer) (*NLRI, uint8, error) {
var addr [4]byte
nlri := &NLRI{}
err := decode(buf, []interface{}{&nlri.Pfxlen})
if err != nil {
return nil, 0, err
}
toCopy := uint8(math.Ceil(float64(nlri.Pfxlen) / float64(OctetLen)))
for i := uint8(0); i < net.IPv4len%OctetLen; i++ {
if i < toCopy {
err := decode(buf, []interface{}{&addr[i]})
if err != nil {
return nil, 0, err
}
} else {
addr[i] = 0
}
}
nlri.IP = addr
return nlri, toCopy + 1, nil
}
func (n *NLRI) serialize(buf *bytes.Buffer) uint8 {
addr := n.IP.([4]byte)
nBytes := bytesInAddr(n.Pfxlen)
buf.WriteByte(n.Pfxlen)
buf.Write(addr[:nBytes])
return nBytes + 1
}
func bytesInAddr(pfxlen uint8) uint8 {
return uint8(math.Ceil(float64(pfxlen) / 8))
}