diff --git a/tlv/tlv.go b/tlv/tlv.go index 8daab3c..5c19e88 100644 --- a/tlv/tlv.go +++ b/tlv/tlv.go @@ -508,6 +508,7 @@ type Update struct { Interval uint16 Seqno uint16 Metric uint16 + RouterID RouterID Prefix netaddr.IPPrefix NextHop netaddr.IP } @@ -521,8 +522,8 @@ func (u Update) L() uint8 { } func (u Update) FormatHeader() string { - return fmt.Sprintf("Flags 0x%02x Omitted %2d Interval %4d Seqno %5d Metric %5d NextHop %s", - u.Flags, u.Omitted, u.Interval, u.Seqno, u.Metric, u.NextHop, + return fmt.Sprintf("Flags 0x%02x Omitted %2d Interval %4d Seqno %5d Metric %5d RouterID %s", + u.Flags, u.Omitted, u.Interval, u.Seqno, u.Metric, u.RouterID, ) } @@ -561,6 +562,21 @@ func (s *PacketDecoder) UpdateFromBytes(b []byte) (Update, []byte, error) { u.NextHop = s.nexthopv6 } + if u.Flags&0x40 > 0 { + addr := u.Prefix.IP() + switch { + case addr.Is6(): + v6 := addr.As16() + copy(s.routerID[:], v6[8:]) + case addr.Is4(): + s.routerID = RouterID{} + v4 := addr.As4() + copy(s.routerID[4:], v4[:]) + } + } + + u.RouterID = s.routerID + return u, b, err }