refactor from inet.af/netaddr to net/netip

This commit is contained in:
Johannes Kimmel 2023-03-07 01:59:19 +01:00
parent 6836779a56
commit ce32c58ed5
5 changed files with 66 additions and 67 deletions

View File

@ -4,13 +4,13 @@ package capture
import ( import (
"fmt" "fmt"
"net/netip"
"git.freifunk-franken.de/jkimmel/abbel/packet" "git.freifunk-franken.de/jkimmel/abbel/packet"
"github.com/google/gopacket" "github.com/google/gopacket"
"github.com/google/gopacket/afpacket" "github.com/google/gopacket/afpacket"
"github.com/google/gopacket/layers" "github.com/google/gopacket/layers"
"golang.org/x/net/bpf" "golang.org/x/net/bpf"
"inet.af/netaddr"
) )
var ( var (
@ -65,27 +65,27 @@ func (h Handle) Close() error {
return nil return nil
} }
func (h Handle) ReadFrom(b []byte) (body []byte, src netaddr.IP, ifindex int, err error) { func (h Handle) ReadFrom(b []byte) (body []byte, src netip.Addr, ifindex int, err error) {
data, ci, err := h.tp.ZeroCopyReadPacketData() data, ci, err := h.tp.ZeroCopyReadPacketData()
if err != nil { if err != nil {
return nil, netaddr.IP{}, 0, err return nil, netip.Addr{}, 0, err
} }
pckt := gopacket.NewPacket(data, layers.LayerTypeIPv6, gopacket.NoCopy) pckt := gopacket.NewPacket(data, layers.LayerTypeIPv6, gopacket.NoCopy)
ip6, ok := pckt.NetworkLayer().(*layers.IPv6) ip6, ok := pckt.NetworkLayer().(*layers.IPv6)
if !ok { if !ok {
return nil, netaddr.IP{}, 0, fmt.Errorf("Expected IPv6 layer, got %v", pckt.NetworkLayer()) return nil, netip.Addr{}, 0, fmt.Errorf("Expected IPv6 layer, got %v", pckt.NetworkLayer())
} }
src, ok = netaddr.FromStdIP(ip6.SrcIP) src, ok = netip.AddrFromSlice(ip6.SrcIP)
if !ok { if !ok {
return nil, netaddr.IP{}, 0, fmt.Errorf("Error parsing packet src address %q", ip6.SrcIP) return nil, netip.Addr{}, 0, fmt.Errorf("Error parsing packet src address %q", ip6.SrcIP)
} }
payload := pckt.ApplicationLayer().Payload() payload := pckt.ApplicationLayer().Payload()
copy(b, payload) copy(b, payload)
b, err = packet.Validate(b[:len(payload)]) b, err = packet.Validate(b[:len(payload)])
if err != nil { if err != nil {
return nil, netaddr.IP{}, 0, err return nil, netip.Addr{}, 0, err
} }
return b, src, ci.InterfaceIndex, nil return b, src, ci.InterfaceIndex, nil

View File

@ -4,10 +4,10 @@ package capture
import "fmt" import "fmt"
import "inet.af/netaddr" import "net/netip"
type nullReaderFromCloser interface { type nullReaderFromCloser interface {
ReadFrom(b []byte) (body []byte, src netaddr.IP, ifindex int, err error) ReadFrom(b []byte) (body []byte, src netip.Addr, ifindex int, err error)
Close() error Close() error
} }

View File

@ -4,12 +4,12 @@ import (
"flag" "flag"
"fmt" "fmt"
"log" "log"
"net/netip"
"strings" "strings"
"git.freifunk-franken.de/jkimmel/abbel/capture" "git.freifunk-franken.de/jkimmel/abbel/capture"
"git.freifunk-franken.de/jkimmel/abbel/packet" "git.freifunk-franken.de/jkimmel/abbel/packet"
"git.freifunk-franken.de/jkimmel/abbel/tlv" "git.freifunk-franken.de/jkimmel/abbel/tlv"
"inet.af/netaddr"
) )
type options struct { type options struct {
@ -42,9 +42,9 @@ func parseOpts() (options, error) {
} }
type updatesKey struct { type updatesKey struct {
prefix netaddr.IPPrefix prefix netip.Prefix
routerID tlv.RouterID routerID tlv.RouterID
nexthop netaddr.IP nexthop netip.Addr
} }
var ( var (
@ -52,7 +52,7 @@ var (
) )
type BabelPacketConn interface { type BabelPacketConn interface {
ReadFrom(b []byte) (body []byte, src netaddr.IP, ifindex int, err error) ReadFrom(b []byte) (body []byte, src netip.Addr, ifindex int, err error)
Close() error Close() error
} }

View File

@ -4,10 +4,10 @@ import (
"context" "context"
"fmt" "fmt"
"net" "net"
"net/netip"
"syscall" "syscall"
"golang.org/x/net/ipv6" "golang.org/x/net/ipv6"
"inet.af/netaddr"
) )
const ( const (
@ -78,12 +78,12 @@ func (c Conn) JoinGroup(ifname string, addr string) error {
return fmt.Errorf("InterfaceByName(%s): %w", ifname, err) return fmt.Errorf("InterfaceByName(%s): %w", ifname, err)
} }
ip, err := netaddr.ParseIP(addr) ip, err := netip.ParseAddr(addr)
if err != nil { if err != nil {
return err return err
} }
return c.v6pc.JoinGroup(ifi, &net.UDPAddr{IP: ip.IPAddr().IP}) return c.v6pc.JoinGroup(ifi, &net.UDPAddr{IP: ip.AsSlice()})
} }
func Validate(b []byte) ([]byte, error) { func Validate(b []byte) ([]byte, error) {
@ -111,22 +111,22 @@ func Validate(b []byte) ([]byte, error) {
return b, nil return b, nil
} }
func (c Conn) ReadFrom(b []byte) (body []byte, src netaddr.IP, ifindex int, err error) { func (c Conn) ReadFrom(b []byte) (body []byte, src netip.Addr, ifindex int, err error) {
n, rcm, _, err := c.v6pc.ReadFrom(b) n, rcm, _, err := c.v6pc.ReadFrom(b)
if err != nil { if err != nil {
return nil, netaddr.IP{}, 0, err return nil, netip.Addr{}, 0, err
} }
b, err = Validate(b[:n]) b, err = Validate(b[:n])
if err != nil { if err != nil {
return nil, netaddr.IP{}, 0, err return nil, netip.Addr{}, 0, err
} }
var ok bool var ok bool
src, ok = netaddr.FromStdIPRaw(rcm.Src) src, ok = netip.AddrFromSlice(rcm.Src)
if !ok { if !ok {
return nil, netaddr.IP{}, 0, fmt.Errorf("Invalid src address %q", rcm.Src) return nil, netip.Addr{}, 0, fmt.Errorf("Invalid src address %q", rcm.Src)
} }
return b, src, rcm.IfIndex, err return b, src, rcm.IfIndex, err

View File

@ -12,8 +12,7 @@ import (
"bytes" "bytes"
"errors" "errors"
"fmt" "fmt"
"net/netip"
"inet.af/netaddr"
) )
// Type encodes the type of TLV // Type encodes the type of TLV
@ -78,14 +77,14 @@ const (
) )
// AEFromPrefix returns the address encoding of a prefix: // AEFromPrefix returns the address encoding of a prefix:
func AEFromPrefix(p netaddr.IPPrefix) AEType { func AEFromPrefix(p netip.Prefix) AEType {
return AEFromIP(p.IP()) return AEFromIP(p.Addr())
} }
// AEFromIP returns the address encoding of an address. // AEFromIP returns the address encoding of an address.
func AEFromIP(p netaddr.IP) AEType { func AEFromIP(p netip.Addr) AEType {
switch { switch {
case p.IsZero(): case p.IsUnspecified():
return AEWildcard return AEWildcard
case p.Is4(): case p.Is4():
return AEIPv4 return AEIPv4
@ -172,8 +171,8 @@ type PacketDecoder struct {
// parser state // parser state
routerID RouterID routerID RouterID
nexthopv6 netaddr.IP nexthopv6 netip.Addr
nexthopv4 netaddr.IP nexthopv4 netip.Addr
v6 [16]byte v6 [16]byte
v4 [4]byte v4 [4]byte
@ -183,7 +182,7 @@ type PacketDecoder struct {
} }
// Reset clears the parser state and sets a new byte slice to work on. // Reset clears the parser state and sets a new byte slice to work on.
func (s *PacketDecoder) Reset(b []byte, nexthop netaddr.IP, ifindex int) { func (s *PacketDecoder) Reset(b []byte, nexthop netip.Addr, ifindex int) {
*s = PacketDecoder{} *s = PacketDecoder{}
s.tlvscanner.Reset(b) s.tlvscanner.Reset(b)
switch { switch {
@ -482,7 +481,7 @@ type IHU struct {
// reserved uint8 // reserved uint8
Rxcost uint16 Rxcost uint16
Interval uint16 Interval uint16
Address netaddr.IP Address netip.Addr
} }
// T returns TypeIHU. // T returns TypeIHU.
@ -585,7 +584,7 @@ func (r RouterID) String() string {
type NextHop struct { type NextHop struct {
// AE uint8 // AE uint8
// reserved uint8 // reserved uint8
Address netaddr.IP Address netip.Addr
} }
// T returns TypeNextHop. // T returns TypeNextHop.
@ -629,8 +628,8 @@ type Update struct {
Seqno uint16 Seqno uint16
Metric uint16 Metric uint16
RouterID RouterID RouterID RouterID
Prefix netaddr.IPPrefix Prefix netip.Prefix
NextHop netaddr.IP NextHop netip.Addr
} }
// T returns TypeUpdate. // T returns TypeUpdate.
@ -640,7 +639,7 @@ func (Update) T() Type {
// L depends on the anounced prefix, at least 10. // L depends on the anounced prefix, at least 10.
func (u Update) L() uint8 { func (u Update) L() uint8 {
return 10 + psizeFromPlen(u.Prefix.Bits()) return 10 + psizeFromPlen(uint8(u.Prefix.Bits()))
} }
// FormatHeader returns a string of the most important fields except the prefix // FormatHeader returns a string of the most important fields except the prefix
@ -670,13 +669,13 @@ func (s *PacketDecoder) updateFromBytes(b []byte) (Update, []byte, error) {
case 1: case 1:
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.IP().As4() s.v4 = u.Prefix.Addr().As4()
} }
u.NextHop = s.nexthopv4 u.NextHop = s.nexthopv4
case 2: case 2:
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.IP().As16() s.v6 = u.Prefix.Addr().As16()
} }
u.NextHop = s.nexthopv6 u.NextHop = s.nexthopv6
case 3: case 3:
@ -685,7 +684,7 @@ func (s *PacketDecoder) updateFromBytes(b []byte) (Update, []byte, error) {
} }
if u.Flags&0x40 > 0 { if u.Flags&0x40 > 0 {
addr := u.Prefix.IP() addr := u.Prefix.Addr()
switch { switch {
case addr.Is6(): case addr.Is6():
v6 := addr.As16() v6 := addr.As16()
@ -708,7 +707,7 @@ func (s *PacketDecoder) updateFromBytes(b []byte) (Update, []byte, error) {
type RouteRequest struct { type RouteRequest struct {
// AE uint8 // AE uint8
// plen uint8 // plen uint8
Prefix netaddr.IPPrefix Prefix netip.Prefix
} }
// AE returns the address encoding of the requested prefix // AE returns the address encoding of the requested prefix
@ -723,7 +722,7 @@ func (RouteRequest) T() Type {
// L depends on the requested prefix, at least 4. // L depends on the requested prefix, at least 4.
func (r RouteRequest) L() uint8 { func (r RouteRequest) L() uint8 {
return 4 + psizeFromPlen(r.Prefix.Bits()) return 4 + psizeFromPlen(uint8(r.Prefix.Bits()))
} }
func routeRequestFromBytes(b []byte) (RouteRequest, []byte, error) { func routeRequestFromBytes(b []byte) (RouteRequest, []byte, error) {
if err := assertLengthGreater(b, TypeRouteRequest, 2); err != nil { if err := assertLengthGreater(b, TypeRouteRequest, 2); err != nil {
@ -746,7 +745,7 @@ type SeqnoRequest struct {
Seqno uint16 Seqno uint16
HopCount uint8 HopCount uint8
RouterID RouterID RouterID RouterID
Prefix netaddr.IPPrefix Prefix netip.Prefix
} }
// T returns TypeSeqnoRequest. // T returns TypeSeqnoRequest.
@ -756,7 +755,7 @@ func (SeqnoRequest) T() Type {
// L depends on the requested prefix, at least 14. // L depends on the requested prefix, at least 14.
func (r SeqnoRequest) L() uint8 { func (r SeqnoRequest) L() uint8 {
return 14 + psizeFromPlen(r.Prefix.Bits()) return 14 + psizeFromPlen(uint8(r.Prefix.Bits()))
} }
func seqnoRequestFromBytes(b []byte) (SeqnoRequest, []byte, error) { func seqnoRequestFromBytes(b []byte) (SeqnoRequest, []byte, error) {
if err := assertLengthGreater(b, TypeSeqnoRequest, 14); err != nil { if err := assertLengthGreater(b, TypeSeqnoRequest, 14); err != nil {
@ -780,7 +779,7 @@ func seqnoRequestFromBytes(b []byte) (SeqnoRequest, []byte, error) {
// //
// https://datatracker.ietf.org/doc/html/draft-ietf-babel-source-specific-07#section-7.1 // https://datatracker.ietf.org/doc/html/draft-ietf-babel-source-specific-07#section-7.1
type SourcePrefix struct { type SourcePrefix struct {
netaddr.IPPrefix netip.Prefix
} }
// T returns SubTypeSourcePrefix. // T returns SubTypeSourcePrefix.
@ -790,7 +789,7 @@ func (SourcePrefix) T() SubType {
// L depends on the encoded prefix // L depends on the encoded prefix
func (s SourcePrefix) L() uint8 { func (s SourcePrefix) L() uint8 {
return psizeFromPlen(s.Bits()) return psizeFromPlen(uint8(s.Bits()))
} }
// SourcePrefixFromBytes parses a SourcePrefix SubTLV // SourcePrefixFromBytes parses a SourcePrefix SubTLV
@ -809,9 +808,9 @@ func SourcePrefixFromBytes(b []byte) (SourcePrefix, []byte, error) {
func psizeFromPlen(plen uint8) uint8 { func psizeFromPlen(plen uint8) uint8 {
return uint8((uint16(plen) + 7) / 8) return uint8((uint16(plen) + 7) / 8)
} }
func prefixUncompressed(ae uint8, plen uint8, b []byte) (netaddr.IPPrefix, []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)) {
return netaddr.IPPrefix{}, b, fmt.Errorf("plen too large") return netip.Prefix{}, b, fmt.Errorf("plen too large")
} }
switch ae { switch ae {
@ -824,71 +823,71 @@ func prefixUncompressed(ae uint8, plen uint8, b []byte) (netaddr.IPPrefix, []byt
case 3: case 3:
return prefixV6LL(b) return prefixV6LL(b)
default: default:
return netaddr.IPPrefix{}, b, fmt.Errorf("Invalid AE %d", ae) return netip.Prefix{}, b, fmt.Errorf("Invalid AE %d", ae)
} }
} }
func prefixWildcard() (netaddr.IPPrefix, []byte, error) { func prefixWildcard() (netip.Prefix, []byte, error) {
return netaddr.IPPrefix{}, nil, nil return netip.Prefix{}, nil, nil
} }
func prefixV4(plen uint8, b []byte) (netaddr.IPPrefix, []byte, error) { func prefixV4(plen uint8, b []byte) (netip.Prefix, []byte, error) {
return prefixV4Default([4]byte{}, plen, 0, b) return prefixV4Default([4]byte{}, plen, 0, b)
} }
func prefixV4Default(ip4default [4]byte, plen uint8, omit uint8, b []byte) (netaddr.IPPrefix, []byte, error) { func prefixV4Default(ip4default [4]byte, plen uint8, omit uint8, b []byte) (netip.Prefix, []byte, error) {
var ip4 [4]byte var ip4 [4]byte
psize := psizeFromPlen(plen) - omit psize := psizeFromPlen(plen) - omit
copy(ip4[:], ip4default[:omit]) copy(ip4[:], ip4default[:omit])
copy(ip4[omit:], b[:psize]) copy(ip4[omit:], b[:psize])
return netaddr.IPPrefixFrom(netaddr.IPFrom4(ip4), plen), b[psize:], nil return netip.PrefixFrom(netip.AddrFrom4(ip4), int(plen)), b[psize:], nil
} }
func prefixV6(plen uint8, b []byte) (netaddr.IPPrefix, []byte, error) { func prefixV6(plen uint8, b []byte) (netip.Prefix, []byte, error) {
return prefixV6Default([16]byte{}, plen, 0, b) return prefixV6Default([16]byte{}, plen, 0, b)
} }
func prefixV6Default(ip6default [16]byte, plen uint8, omit uint8, b []byte) (netaddr.IPPrefix, []byte, error) { func prefixV6Default(ip6default [16]byte, plen uint8, omit uint8, b []byte) (netip.Prefix, []byte, error) {
var ip6 [16]byte var ip6 [16]byte
psize := psizeFromPlen(plen) - omit psize := psizeFromPlen(plen) - omit
copy(ip6[:], ip6default[:omit]) copy(ip6[:], ip6default[:omit])
copy(ip6[omit:], b[:psize]) copy(ip6[omit:], b[:psize])
return netaddr.IPPrefixFrom(netaddr.IPv6Raw(ip6), plen), b[psize:], nil return netip.PrefixFrom(netip.AddrFrom16(ip6), int(plen)), b[psize:], nil
} }
func prefixV6LL(b []byte) (netaddr.IPPrefix, []byte, error) { func prefixV6LL(b []byte) (netip.Prefix, []byte, error) {
var ip6ll [16]byte var ip6ll [16]byte
ip6ll[0] = 0xfe ip6ll[0] = 0xfe
ip6ll[1] = 0x80 ip6ll[1] = 0x80
copy(ip6ll[8:], b[:8]) copy(ip6ll[8:], b[:8])
return netaddr.IPPrefixFrom(netaddr.IPv6Raw(ip6ll), 8), b[8:], nil return netip.PrefixFrom(netip.AddrFrom16(ip6ll), 8), b[8:], nil
} }
func ipFromBytes(ae AEType, b []byte) (netaddr.IP, []byte, error) { func ipFromBytes(ae AEType, b []byte) (netip.Addr, []byte, error) {
switch ae { switch ae {
case AEWildcard: case AEWildcard:
return netaddr.IP{}, b, nil return netip.Addr{}, b, nil
case AEIPv4: case AEIPv4:
if len(b) < 4 { if len(b) < 4 {
return netaddr.IP{}, b, fmt.Errorf("Not enough bytes for v4 address: %d", len(b)) return netip.Addr{}, b, fmt.Errorf("Not enough bytes for v4 address: %d", len(b))
} }
var ip4 [4]byte var ip4 [4]byte
copy(ip4[:], b[:4]) copy(ip4[:], b[:4])
return netaddr.IPFrom4(ip4), b[4:], nil return netip.AddrFrom4(ip4), b[4:], nil
case AEIPv6: case AEIPv6:
if len(b) < 16 { if len(b) < 16 {
return netaddr.IP{}, b, fmt.Errorf("Not enough bytes for v6 address: %d", len(b)) return netip.Addr{}, b, fmt.Errorf("Not enough bytes for v6 address: %d", len(b))
} }
var ip6 [16]byte var ip6 [16]byte
copy(ip6[:], b[:16]) copy(ip6[:], b[:16])
return netaddr.IPv6Raw(ip6), b[16:], nil return netip.AddrFrom16(ip6), b[16:], nil
case AEIPv6LL: case AEIPv6LL:
if len(b) < 8 { if len(b) < 8 {
return netaddr.IP{}, b, fmt.Errorf("Not enough bytes for v6ll address: %d", len(b)) return netip.Addr{}, b, fmt.Errorf("Not enough bytes for v6ll address: %d", len(b))
} }
var ip6ll [16]byte var ip6ll [16]byte
ip6ll[0] = 0xfe ip6ll[0] = 0xfe
ip6ll[1] = 0x80 ip6ll[1] = 0x80
copy(ip6ll[8:], b[:8]) copy(ip6ll[8:], b[:8])
return netaddr.IPv6Raw(ip6ll), b[8:], nil return netip.AddrFrom16(ip6ll), b[8:], nil
case AEIPv4oIPv6: case AEIPv4oIPv6:
return netaddr.IP{}, b, fmt.Errorf("Not implemented AE Type %s", ae) return netip.Addr{}, b, fmt.Errorf("Not implemented AE Type %s", ae)
default: default:
return netaddr.IP{}, b, fmt.Errorf("Invalid AE %d", ae) return netip.Addr{}, b, fmt.Errorf("Invalid AE %d", ae)
} }
} }