tlv: small cleanups
This commit is contained in:
parent
a3905135ff
commit
69e2890ea0
57
tlv/tlv.go
57
tlv/tlv.go
|
@ -84,7 +84,7 @@ func AEFromPrefix(p netip.Prefix) AEType {
|
||||||
// AEFromIP returns the address encoding of an address.
|
// AEFromIP returns the address encoding of an address.
|
||||||
func AEFromIP(p netip.Addr) AEType {
|
func AEFromIP(p netip.Addr) AEType {
|
||||||
switch {
|
switch {
|
||||||
case p.IsUnspecified():
|
case p.IsUnspecified(), p == netip.Addr{}:
|
||||||
return AEWildcard
|
return AEWildcard
|
||||||
case p.Is4():
|
case p.Is4():
|
||||||
return AEIPv4
|
return AEIPv4
|
||||||
|
@ -541,14 +541,12 @@ func routerIDFromBytes(b []byte) (RouterID, []byte, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip 2 reserved bytes
|
// skip 2 reserved bytes
|
||||||
var rid RouterID
|
rid, b := RouterID(b[2:10]), b[10:]
|
||||||
copy(rid[:], b[2:])
|
|
||||||
b = b[10:]
|
|
||||||
|
|
||||||
if rid == (RouterID{}) {
|
switch rid {
|
||||||
|
case RouterID{}:
|
||||||
return RouterID{}, b, ErrRouterIDZeros
|
return RouterID{}, b, ErrRouterIDZeros
|
||||||
}
|
case RouterID{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}:
|
||||||
if rid == (RouterID{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}) {
|
|
||||||
return RouterID{}, b, ErrRouterIDOnes
|
return RouterID{}, b, ErrRouterIDOnes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -655,7 +653,7 @@ func (s *PacketDecoder) updateFromBytes(b []byte) (Update, []byte, error) {
|
||||||
var u Update
|
var u Update
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
ae := b[0]
|
ae := AEType(b[0])
|
||||||
u.Flags = b[1]
|
u.Flags = b[1]
|
||||||
plen := b[2]
|
plen := b[2]
|
||||||
u.Omitted = b[3]
|
u.Omitted = b[3]
|
||||||
|
@ -665,22 +663,26 @@ func (s *PacketDecoder) updateFromBytes(b []byte) (Update, []byte, error) {
|
||||||
|
|
||||||
b = b[10:]
|
b = b[10:]
|
||||||
switch ae {
|
switch ae {
|
||||||
case 0:
|
case AEWildcard:
|
||||||
case 1:
|
case AEIPv4:
|
||||||
u.Prefix, b, err = prefixV4Default(s.v4, plen, u.Omitted, b)
|
u.Prefix, b, err = prefixV4Default(s.v4, plen, u.Omitted, b)
|
||||||
if u.Flags&0x80 > 0 {
|
if u.Flags&0x80 > 0 {
|
||||||
s.v4 = u.Prefix.Addr().As4()
|
s.v4 = u.Prefix.Addr().As4()
|
||||||
}
|
}
|
||||||
u.NextHop = s.nexthopv4
|
u.NextHop = s.nexthopv4
|
||||||
case 2:
|
case AEIPv6:
|
||||||
u.Prefix, b, err = prefixV6Default(s.v6, plen, u.Omitted, b)
|
u.Prefix, b, err = prefixV6Default(s.v6, plen, u.Omitted, b)
|
||||||
if u.Flags&0x80 > 0 {
|
if u.Flags&0x80 > 0 {
|
||||||
s.v6 = u.Prefix.Addr().As16()
|
s.v6 = u.Prefix.Addr().As16()
|
||||||
}
|
}
|
||||||
u.NextHop = s.nexthopv6
|
u.NextHop = s.nexthopv6
|
||||||
case 3:
|
case AEIPv6LL:
|
||||||
u.Prefix, b, err = prefixV6LL(b)
|
u.Prefix, b, err = prefixV6LL(b)
|
||||||
u.NextHop = s.nexthopv6
|
u.NextHop = s.nexthopv6
|
||||||
|
case AEIPv4oIPv6:
|
||||||
|
return Update{}, b, fmt.Errorf("Not implemented AE Type %s", ae)
|
||||||
|
default:
|
||||||
|
return Update{}, b, fmt.Errorf("Unknown AE Type %d", ae)
|
||||||
}
|
}
|
||||||
|
|
||||||
if u.Flags&0x40 > 0 {
|
if u.Flags&0x40 > 0 {
|
||||||
|
@ -688,7 +690,7 @@ func (s *PacketDecoder) updateFromBytes(b []byte) (Update, []byte, error) {
|
||||||
switch {
|
switch {
|
||||||
case addr.Is6():
|
case addr.Is6():
|
||||||
v6 := addr.As16()
|
v6 := addr.As16()
|
||||||
copy(s.routerID[:], v6[8:])
|
s.routerID = RouterID(v6[8:])
|
||||||
case addr.Is4():
|
case addr.Is4():
|
||||||
s.routerID = RouterID{}
|
s.routerID = RouterID{}
|
||||||
v4 := addr.As4()
|
v4 := addr.As4()
|
||||||
|
@ -769,7 +771,7 @@ func seqnoRequestFromBytes(b []byte) (SeqnoRequest, []byte, error) {
|
||||||
plen := b[1]
|
plen := b[1]
|
||||||
sr.Seqno = uint16(b[2])<<8 | uint16(b[3])
|
sr.Seqno = uint16(b[2])<<8 | uint16(b[3])
|
||||||
sr.HopCount = b[4]
|
sr.HopCount = b[4]
|
||||||
copy(sr.RouterID[:], b[6:])
|
sr.RouterID = RouterID(b[6:])
|
||||||
sr.Prefix, b, err = prefixUncompressed(ae, plen, b[14:])
|
sr.Prefix, b, err = prefixUncompressed(ae, plen, b[14:])
|
||||||
|
|
||||||
return sr, b, err
|
return sr, b, err
|
||||||
|
@ -806,7 +808,7 @@ func SourcePrefixFromBytes(b []byte) (SourcePrefix, []byte, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func psizeFromPlen(plen uint8) uint8 {
|
func psizeFromPlen(plen uint8) uint8 {
|
||||||
return uint8((uint16(plen) + 7) / 8)
|
return (plen + 7) / 8
|
||||||
}
|
}
|
||||||
func prefixUncompressed(ae uint8, plen uint8, b []byte) (netip.Prefix, []byte, error) {
|
func prefixUncompressed(ae uint8, plen uint8, b []byte) (netip.Prefix, []byte, error) {
|
||||||
if len(b) < int(psizeFromPlen(plen)) {
|
if len(b) < int(psizeFromPlen(plen)) {
|
||||||
|
@ -858,28 +860,33 @@ func prefixV6LL(b []byte) (netip.Prefix, []byte, error) {
|
||||||
copy(ip6ll[8:], b[:8])
|
copy(ip6ll[8:], b[:8])
|
||||||
return netip.PrefixFrom(netip.AddrFrom16(ip6ll), 8), b[8:], nil
|
return netip.PrefixFrom(netip.AddrFrom16(ip6ll), 8), b[8:], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ErrorIpFromBytesLength struct {
|
||||||
|
ae AEType
|
||||||
|
length int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e ErrorIpFromBytesLength) Error() string {
|
||||||
|
return fmt.Sprintf("Not enough bytes for address encoding %s: %d", e.ae, e.length)
|
||||||
|
}
|
||||||
|
|
||||||
func ipFromBytes(ae AEType, b []byte) (netip.Addr, []byte, error) {
|
func ipFromBytes(ae AEType, b []byte) (netip.Addr, []byte, error) {
|
||||||
switch ae {
|
switch ae {
|
||||||
case AEWildcard:
|
case AEWildcard:
|
||||||
return netip.Addr{}, b, nil
|
return netip.Addr{}, b, nil
|
||||||
case AEIPv4:
|
case AEIPv4:
|
||||||
if len(b) < 4 {
|
if len(b) < 4 {
|
||||||
return netip.Addr{}, b, fmt.Errorf("Not enough bytes for v4 address: %d", len(b))
|
return netip.Addr{}, b, ErrorIpFromBytesLength{ae: AEIPv4, length: len(b)}
|
||||||
}
|
}
|
||||||
//var ip4 [4]byte
|
return netip.AddrFrom4([4]byte(b)), b[4:], nil
|
||||||
//copy(ip4[:], b[:4])
|
|
||||||
ip4 := [4]byte(b[:4])
|
|
||||||
return netip.AddrFrom4(ip4), b[4:], nil
|
|
||||||
case AEIPv6:
|
case AEIPv6:
|
||||||
if len(b) < 16 {
|
if len(b) < 16 {
|
||||||
return netip.Addr{}, b, fmt.Errorf("Not enough bytes for v6 address: %d", len(b))
|
return netip.Addr{}, b, ErrorIpFromBytesLength{ae: AEIPv6, length: len(b)}
|
||||||
}
|
}
|
||||||
var ip6 [16]byte
|
return netip.AddrFrom16([16]byte(b)), b[16:], nil
|
||||||
copy(ip6[:], b[:16])
|
|
||||||
return netip.AddrFrom16(ip6), b[16:], nil
|
|
||||||
case AEIPv6LL:
|
case AEIPv6LL:
|
||||||
if len(b) < 8 {
|
if len(b) < 8 {
|
||||||
return netip.Addr{}, b, fmt.Errorf("Not enough bytes for v6ll address: %d", len(b))
|
return netip.Addr{}, b, ErrorIpFromBytesLength{ae: AEIPv6LL, length: len(b)}
|
||||||
}
|
}
|
||||||
var ip6ll [16]byte
|
var ip6ll [16]byte
|
||||||
ip6ll[0] = 0xfe
|
ip6ll[0] = 0xfe
|
||||||
|
|
Loading…
Reference in New Issue