Newer
Older
bnet "github.com/bio-routing/bio-rd/net"
"github.com/taktv6/tflow2/convert"
)
// MultiProtocolUnreachNLRI represents network layer withdraw information for one prefix of an IP address family (rfc4760)
type MultiProtocolUnreachNLRI struct {
AFI uint16
SAFI uint8
Prefixes []bnet.Prefix
func (n *MultiProtocolUnreachNLRI) serialize(buf *bytes.Buffer) uint16 {
tempBuf := bytes.NewBuffer(nil)
tempBuf.Write(convert.Uint16Byte(n.AFI))
tempBuf.WriteByte(n.SAFI)
for _, pfx := range n.Prefixes {
tempBuf.Write(serializePrefix(pfx))
}
func deserializeMultiProtocolUnreachNLRI(b []byte) (MultiProtocolUnreachNLRI, error) {
n := MultiProtocolUnreachNLRI{}
prefixesLength := len(b) - 3 // 3 <- AFI + SAFI
if prefixesLength < 0 {
return n, fmt.Errorf("Invalid length of MP_UNREACH_NLRI: expected more than 3 bytes but got %d", len(b))
}
prefixes := make([]byte, prefixesLength)
fields := []interface{}{
&n.AFI,
&n.SAFI,
}
err := decode(bytes.NewBuffer(b), fields)
if err != nil {
return MultiProtocolUnreachNLRI{}, err
}
for idx < uint16(len(prefixes)) {
pfxLen := prefixes[idx]
if r < numBytes {
return MultiProtocolUnreachNLRI{}, fmt.Errorf("expected %d bytes for NLRI, only %d remaining", numBytes, r)
pfx, err := deserializePrefix(prefixes[start:end], pfxLen, n.AFI)
if err != nil {
return MultiProtocolUnreachNLRI{}, err
}
n.Prefixes = append(n.Prefixes, pfx)