drop packet capture input method in favour of multicast listener
This commit is contained in:
parent
132d26305e
commit
a3905135ff
|
@ -1,92 +0,0 @@
|
||||||
//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"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
// tcpdump -y RAW -dd ip6 and udp dst port 6696
|
|
||||||
babelBPFRAW = []bpf.RawInstruction{
|
|
||||||
{0x30, 0, 0, 0x00000000},
|
|
||||||
{0x54, 0, 0, 0x000000f0},
|
|
||||||
{0x15, 0, 5, 0x00000060},
|
|
||||||
{0x30, 0, 0, 0x00000006},
|
|
||||||
{0x15, 0, 3, 0x00000011},
|
|
||||||
{0x28, 0, 0, 0x0000002a},
|
|
||||||
{0x15, 0, 1, 0x00001a28},
|
|
||||||
{0x6, 0, 0, 0x00040000},
|
|
||||||
{0x6, 0, 0, 0x00000000},
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
type Handle struct {
|
|
||||||
tp *afpacket.TPacket
|
|
||||||
}
|
|
||||||
|
|
||||||
func FromInterface(iface string) (Handle, error) {
|
|
||||||
var h Handle
|
|
||||||
var err error
|
|
||||||
|
|
||||||
if iface != "any" {
|
|
||||||
h.tp, err = afpacket.NewTPacket(
|
|
||||||
afpacket.SocketDgram,
|
|
||||||
afpacket.OptInterface(iface),
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
h.tp, err = afpacket.NewTPacket(
|
|
||||||
afpacket.SocketDgram,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("here")
|
|
||||||
return Handle{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = h.tp.SetBPF(babelBPFRAW)
|
|
||||||
if err != nil {
|
|
||||||
return Handle{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return h, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h Handle) Close() error {
|
|
||||||
h.tp.Close()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
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, netip.Addr{}, 0, err
|
|
||||||
}
|
|
||||||
pckt := gopacket.NewPacket(data, layers.LayerTypeIPv6, gopacket.NoCopy)
|
|
||||||
ip6, ok := pckt.NetworkLayer().(*layers.IPv6)
|
|
||||||
if !ok {
|
|
||||||
return nil, netip.Addr{}, 0, fmt.Errorf("Expected IPv6 layer, got %v", pckt.NetworkLayer())
|
|
||||||
}
|
|
||||||
|
|
||||||
src, ok = netip.AddrFromSlice(ip6.SrcIP)
|
|
||||||
if !ok {
|
|
||||||
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, netip.Addr{}, 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return b, src, ci.InterfaceIndex, nil
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
//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")
|
|
||||||
}
|
|
9
go.mod
9
go.mod
|
@ -1,8 +1,7 @@
|
||||||
module git.freifunk-franken.de/jkimmel/abbel
|
module git.freifunk-franken.de/jkimmel/abbel
|
||||||
|
|
||||||
go 1.13
|
go 1.20
|
||||||
|
|
||||||
require (
|
require golang.org/x/net v0.8.0
|
||||||
github.com/google/gopacket v1.1.19
|
|
||||||
golang.org/x/net v0.8.0
|
require golang.org/x/sys v0.6.0 // indirect
|
||||||
)
|
|
||||||
|
|
41
go.sum
41
go.sum
|
@ -1,45 +1,4 @@
|
||||||
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.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
|
||||||
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-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.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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
|
||||||
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 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
|
||||||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
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-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-20201119102817-f84b799fce68/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-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 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
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.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=
|
|
||||||
|
|
18
main.go
18
main.go
|
@ -7,25 +7,25 @@ import (
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"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"
|
||||||
)
|
)
|
||||||
|
|
||||||
type options struct {
|
type options struct {
|
||||||
Group string
|
Group string
|
||||||
Port uint16
|
Port uint16
|
||||||
Ifs []string
|
Ifs []string
|
||||||
UseMulticast bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseOpts() (options, error) {
|
func parseOpts() (options, error) {
|
||||||
var opt options
|
var opt options
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
var unusedMulticast bool
|
||||||
|
|
||||||
flag.StringVar(&opt.Group, "group", "ff02:0:0:0:0:0:1:6", "Multicast group to join")
|
flag.StringVar(&opt.Group, "group", "ff02:0:0:0:0:0:1:6", "Multicast group to join")
|
||||||
port := flag.Uint("port", 6696, "Port to listen on")
|
port := flag.Uint("port", 6696, "Port to listen on")
|
||||||
flag.BoolVar(&opt.UseMulticast, "m", false, "Use multicast mode")
|
flag.BoolVar(&unusedMulticast, "m", false, "Use multicast mode (default, unused)")
|
||||||
ifs := flag.String("i", "any", "Comma-seperated list of interfaces to listen on or \"any\" for all interfaces in capture mode")
|
ifs := flag.String("i", "any", "Comma-seperated list of interfaces to listen on or \"any\" for all interfaces in capture mode")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
|
@ -60,11 +60,7 @@ func run(opt options) error {
|
||||||
var err error
|
var err error
|
||||||
var conn BabelPacketConn
|
var conn BabelPacketConn
|
||||||
|
|
||||||
if opt.UseMulticast {
|
conn, err = packet.Listen(opt.Group, opt.Port, opt.Ifs...)
|
||||||
conn, err = packet.Listen(opt.Group, opt.Port, opt.Ifs...)
|
|
||||||
} else {
|
|
||||||
conn, err = capture.FromInterface(opt.Ifs[0])
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -866,8 +866,9 @@ func ipFromBytes(ae AEType, b []byte) (netip.Addr, []byte, error) {
|
||||||
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, 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])
|
||||||
|
ip4 := [4]byte(b[:4])
|
||||||
return netip.AddrFrom4(ip4), b[4:], nil
|
return netip.AddrFrom4(ip4), b[4:], nil
|
||||||
case AEIPv6:
|
case AEIPv6:
|
||||||
if len(b) < 16 {
|
if len(b) < 16 {
|
||||||
|
|
Loading…
Reference in New Issue