Compare commits

...

5 Commits

Author SHA1 Message Date
Johannes Kimmel ce32c58ed5 refactor from inet.af/netaddr to net/netip 2023-03-07 01:59:51 +01:00
Johannes Kimmel 6836779a56 capture: disable without cgo 2023-03-07 01:59:51 +01:00
Johannes Kimmel 20a248af16 packet: handle "any" interface option 2023-03-07 01:09:52 +01:00
Johannes Kimmel cbf92bec2e packet: set SO_REUSEADDR on babel port
This allows to listen to incoming babel packets along side another babel
instance.
2023-03-07 01:08:21 +01:00
Johannes Kimmel 5d3ff44341 update dependencies 2023-03-07 01:07:24 +01:00
7 changed files with 151 additions and 73 deletions

View File

@ -1,14 +1,16 @@
//go:build cgo
package capture
import (
"fmt"
"net/netip"
"git.freifunk-franken.de/jkimmel/abbel/packet"
"github.com/google/gopacket"
"github.com/google/gopacket/afpacket"
"github.com/google/gopacket/layers"
"golang.org/x/net/bpf"
"inet.af/netaddr"
)
var (
@ -63,27 +65,27 @@ func (h Handle) Close() error {
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()
if err != nil {
return nil, netaddr.IP{}, 0, err
return nil, netip.Addr{}, 0, err
}
pckt := gopacket.NewPacket(data, layers.LayerTypeIPv6, gopacket.NoCopy)
ip6, ok := pckt.NetworkLayer().(*layers.IPv6)
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 {
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()
copy(b, payload)
b, err = packet.Validate(b[:len(payload)])
if err != nil {
return nil, netaddr.IP{}, 0, err
return nil, netip.Addr{}, 0, err
}
return b, src, ci.InterfaceIndex, nil

16
capture/netgo.go Normal file
View File

@ -0,0 +1,16 @@
//go:build !cgo
package capture
import "fmt"
import "net/netip"
type nullReaderFromCloser interface {
ReadFrom(b []byte) (body []byte, src netip.Addr, ifindex int, err error)
Close() error
}
func FromInterface(string) (nullReaderFromCloser, error) {
return nil, fmt.Errorf("packet capture disabled")
}

8
go.mod
View File

@ -1,9 +1,11 @@
module git.freifunk-franken.de/jkimmel/abbel
go 1.0
go 1.13
require (
github.com/google/gopacket v1.1.19
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110
inet.af/netaddr v0.0.0-20211027220019-c74959edd3b6
go4.org/intern v0.0.0-20230205224052-192e9f60865c // indirect
go4.org/unsafe/assume-no-moving-gc v0.0.0-20230221090011-e4bae7ad2296 // indirect
golang.org/x/net v0.8.0
inet.af/netaddr v0.0.0-20220811202034-502d2d690317
)

42
go.sum
View File

@ -2,38 +2,74 @@ github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJ
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go4.org/intern v0.0.0-20211027215823-ae77deb06f29 h1:UXLjNohABv4S58tHmeuIZDO6e3mHpW2Dx33gaNt03LE=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go4.org/intern v0.0.0-20211027215823-ae77deb06f29/go.mod h1:cS2ma+47FKrLPdXFpr7CuxiTW3eyJbWew4qx0qtQWDA=
go4.org/intern v0.0.0-20220301175310-a089fc204883 h1:pq5gAii+wMY+DsJ5r9I6T7CHjHxHlb4d45gChzX2SsI=
go4.org/intern v0.0.0-20220301175310-a089fc204883/go.mod h1:cS2ma+47FKrLPdXFpr7CuxiTW3eyJbWew4qx0qtQWDA=
go4.org/intern v0.0.0-20230205224052-192e9f60865c h1:b8WZ7Ja8nKegYxfwDLLwT00ZKv4lXAQrw8LYPK+cHSI=
go4.org/intern v0.0.0-20230205224052-192e9f60865c/go.mod h1:RJ0SVrOMpxLhgb5noIV+09zI1RsRlMsbUcSxpWHqbrE=
go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37 h1:Tx9kY6yUkLge/pFG7IEMwDZy6CS2ajFc9TvQdPCW0uA=
go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E=
go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E=
go4.org/unsafe/assume-no-moving-gc v0.0.0-20230204201903-c31fa085b70e/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E=
go4.org/unsafe/assume-no-moving-gc v0.0.0-20230221090011-e4bae7ad2296 h1:QJ/xcIANMLApehfgPCHnfK1hZiaMmbaTVmPv7DAoTbo=
go4.org/unsafe/assume-no-moving-gc v0.0.0-20230221090011-e4bae7ad2296/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220325170049-de3da57026de h1:pZB1TWnKi+o4bENlbzAgLrEbY4RMYmUIRobMcSmfeYc=
golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220325203850-36772127a21f h1:TrmogKRsSOxRMJbLYGrB4SBbW+LJcEllYBLME5Zk5pU=
golang.org/x/sys v0.0.0-20220325203850-36772127a21f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
inet.af/netaddr v0.0.0-20211027220019-c74959edd3b6 h1:acCzuUSQ79tGsM/O50VRFySfMm19IoMKL+sZztZkCxw=
inet.af/netaddr v0.0.0-20211027220019-c74959edd3b6/go.mod h1:y3MGhcFMlh0KZPMuXXow8mpjxxAk3yoDNsp4cQz54i8=
inet.af/netaddr v0.0.0-20220811202034-502d2d690317 h1:U2fwK6P2EqmopP/hFLTOAjWTki0qgd4GMJn5X8wOleU=
inet.af/netaddr v0.0.0-20220811202034-502d2d690317/go.mod h1:OIezDfdzOgFhuw4HuWapWq2e9l0H9tK4F1j+ETRtF3k=

View File

@ -4,12 +4,12 @@ import (
"flag"
"fmt"
"log"
"net/netip"
"strings"
"git.freifunk-franken.de/jkimmel/abbel/capture"
"git.freifunk-franken.de/jkimmel/abbel/packet"
"git.freifunk-franken.de/jkimmel/abbel/tlv"
"inet.af/netaddr"
)
type options struct {
@ -42,9 +42,9 @@ func parseOpts() (options, error) {
}
type updatesKey struct {
prefix netaddr.IPPrefix
prefix netip.Prefix
routerID tlv.RouterID
nexthop netaddr.IP
nexthop netip.Addr
}
var (
@ -52,7 +52,7 @@ var (
)
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
}

View File

@ -1,11 +1,13 @@
package packet
import (
"context"
"fmt"
"net"
"net/netip"
"syscall"
"golang.org/x/net/ipv6"
"inet.af/netaddr"
)
const (
@ -23,6 +25,16 @@ func Listen(group string, port uint16, ifaces ...string) (Conn, error) {
if err != nil {
return Conn{}, err
}
if len(ifaces) == 1 && ifaces[0] == "any" {
netifs, err := net.Interfaces()
if err != nil {
return Conn{}, err
}
ifaces = make([]string, 0, len(netifs))
for _, netif := range netifs {
ifaces = append(ifaces, netif.Name)
}
}
for _, iface := range ifaces {
if err = conn.JoinGroup(iface, group); err != nil {
conn.Close()
@ -34,10 +46,21 @@ func Listen(group string, port uint16, ifaces ...string) (Conn, error) {
func ListenPort(port uint16) (Conn, error) {
var c Conn
uc, err := net.ListenUDP("udp6", &net.UDPAddr{Port: int(port)})
lc := net.ListenConfig{
Control: func(network, address string, c syscall.RawConn) error {
var err error
c.Control(func(fd uintptr) {
err = syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)
})
return err
},
}
uc, err := lc.ListenPacket(context.Background(), "udp6", fmt.Sprintf(":%d", port))
if err != nil {
return c, err
}
c.v6pc = ipv6.NewPacketConn(uc)
return c, c.v6pc.SetControlMessage(
@ -52,15 +75,15 @@ func (c Conn) Close() error {
func (c Conn) JoinGroup(ifname string, addr string) error {
ifi, err := net.InterfaceByName(ifname)
if err != nil {
return err
return fmt.Errorf("InterfaceByName(%s): %w", ifname, err)
}
ip, err := netaddr.ParseIP(addr)
ip, err := netip.ParseAddr(addr)
if err != nil {
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) {
@ -88,22 +111,22 @@ func Validate(b []byte) ([]byte, error) {
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)
if err != nil {
return nil, netaddr.IP{}, 0, err
return nil, netip.Addr{}, 0, err
}
b, err = Validate(b[:n])
if err != nil {
return nil, netaddr.IP{}, 0, err
return nil, netip.Addr{}, 0, err
}
var ok bool
src, ok = netaddr.FromStdIPRaw(rcm.Src)
src, ok = netip.AddrFromSlice(rcm.Src)
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

View File

@ -12,8 +12,7 @@ import (
"bytes"
"errors"
"fmt"
"inet.af/netaddr"
"net/netip"
)
// Type encodes the type of TLV
@ -78,14 +77,14 @@ const (
)
// AEFromPrefix returns the address encoding of a prefix:
func AEFromPrefix(p netaddr.IPPrefix) AEType {
return AEFromIP(p.IP())
func AEFromPrefix(p netip.Prefix) AEType {
return AEFromIP(p.Addr())
}
// AEFromIP returns the address encoding of an address.
func AEFromIP(p netaddr.IP) AEType {
func AEFromIP(p netip.Addr) AEType {
switch {
case p.IsZero():
case p.IsUnspecified():
return AEWildcard
case p.Is4():
return AEIPv4
@ -172,8 +171,8 @@ type PacketDecoder struct {
// parser state
routerID RouterID
nexthopv6 netaddr.IP
nexthopv4 netaddr.IP
nexthopv6 netip.Addr
nexthopv4 netip.Addr
v6 [16]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.
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.tlvscanner.Reset(b)
switch {
@ -482,7 +481,7 @@ type IHU struct {
// reserved uint8
Rxcost uint16
Interval uint16
Address netaddr.IP
Address netip.Addr
}
// T returns TypeIHU.
@ -585,7 +584,7 @@ func (r RouterID) String() string {
type NextHop struct {
// AE uint8
// reserved uint8
Address netaddr.IP
Address netip.Addr
}
// T returns TypeNextHop.
@ -629,8 +628,8 @@ type Update struct {
Seqno uint16
Metric uint16
RouterID RouterID
Prefix netaddr.IPPrefix
NextHop netaddr.IP
Prefix netip.Prefix
NextHop netip.Addr
}
// T returns TypeUpdate.
@ -640,7 +639,7 @@ func (Update) T() Type {
// L depends on the anounced prefix, at least 10.
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
@ -670,13 +669,13 @@ func (s *PacketDecoder) updateFromBytes(b []byte) (Update, []byte, error) {
case 1:
u.Prefix, b, err = prefixV4Default(s.v4, plen, u.Omitted, b)
if u.Flags&0x80 > 0 {
s.v4 = u.Prefix.IP().As4()
s.v4 = u.Prefix.Addr().As4()
}
u.NextHop = s.nexthopv4
case 2:
u.Prefix, b, err = prefixV6Default(s.v6, plen, u.Omitted, b)
if u.Flags&0x80 > 0 {
s.v6 = u.Prefix.IP().As16()
s.v6 = u.Prefix.Addr().As16()
}
u.NextHop = s.nexthopv6
case 3:
@ -685,7 +684,7 @@ func (s *PacketDecoder) updateFromBytes(b []byte) (Update, []byte, error) {
}
if u.Flags&0x40 > 0 {
addr := u.Prefix.IP()
addr := u.Prefix.Addr()
switch {
case addr.Is6():
v6 := addr.As16()
@ -708,7 +707,7 @@ func (s *PacketDecoder) updateFromBytes(b []byte) (Update, []byte, error) {
type RouteRequest struct {
// AE uint8
// plen uint8
Prefix netaddr.IPPrefix
Prefix netip.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.
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) {
if err := assertLengthGreater(b, TypeRouteRequest, 2); err != nil {
@ -746,7 +745,7 @@ type SeqnoRequest struct {
Seqno uint16
HopCount uint8
RouterID RouterID
Prefix netaddr.IPPrefix
Prefix netip.Prefix
}
// T returns TypeSeqnoRequest.
@ -756,7 +755,7 @@ func (SeqnoRequest) T() Type {
// L depends on the requested prefix, at least 14.
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) {
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
type SourcePrefix struct {
netaddr.IPPrefix
netip.Prefix
}
// T returns SubTypeSourcePrefix.
@ -790,7 +789,7 @@ func (SourcePrefix) T() SubType {
// L depends on the encoded prefix
func (s SourcePrefix) L() uint8 {
return psizeFromPlen(s.Bits())
return psizeFromPlen(uint8(s.Bits()))
}
// SourcePrefixFromBytes parses a SourcePrefix SubTLV
@ -809,9 +808,9 @@ func SourcePrefixFromBytes(b []byte) (SourcePrefix, []byte, error) {
func psizeFromPlen(plen uint8) uint8 {
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)) {
return netaddr.IPPrefix{}, b, fmt.Errorf("plen too large")
return netip.Prefix{}, b, fmt.Errorf("plen too large")
}
switch ae {
@ -824,71 +823,71 @@ func prefixUncompressed(ae uint8, plen uint8, b []byte) (netaddr.IPPrefix, []byt
case 3:
return prefixV6LL(b)
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) {
return netaddr.IPPrefix{}, nil, nil
func prefixWildcard() (netip.Prefix, []byte, error) {
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)
}
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
psize := psizeFromPlen(plen) - omit
copy(ip4[:], ip4default[:omit])
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)
}
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
psize := psizeFromPlen(plen) - omit
copy(ip6[:], ip6default[:omit])
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
ip6ll[0] = 0xfe
ip6ll[1] = 0x80
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 {
case AEWildcard:
return netaddr.IP{}, b, nil
return netip.Addr{}, b, nil
case AEIPv4:
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
copy(ip4[:], b[:4])
return netaddr.IPFrom4(ip4), b[4:], nil
return netip.AddrFrom4(ip4), b[4:], nil
case AEIPv6:
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
copy(ip6[:], b[:16])
return netaddr.IPv6Raw(ip6), b[16:], nil
return netip.AddrFrom16(ip6), b[16:], nil
case AEIPv6LL:
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
ip6ll[0] = 0xfe
ip6ll[1] = 0x80
copy(ip6ll[8:], b[:8])
return netaddr.IPv6Raw(ip6ll), b[8:], nil
return netip.AddrFrom16(ip6ll), b[8:], nil
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:
return netaddr.IP{}, b, fmt.Errorf("Invalid AE %d", ae)
return netip.Addr{}, b, fmt.Errorf("Invalid AE %d", ae)
}
}