tlv: small cleanups

This commit is contained in:
Johannes Kimmel 2023-03-09 10:43:21 +01:00
parent a3905135ff
commit 69e2890ea0
1 changed files with 32 additions and 25 deletions

View File

@ -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