|
|
@@ -14,6 +14,7 @@ import (
|
|
|
"github.com/cilium/ebpf"
|
|
|
"github.com/cilium/ebpf/link"
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
|
+ "tailscale.com/util/multierr"
|
|
|
)
|
|
|
|
|
|
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go -type config -type counters_key -type counter_key_af -type counter_key_packets_bytes_action -type counter_key_prog_end bpf xdp.c -- -I headers
|
|
|
@@ -27,6 +28,7 @@ type STUNServer struct {
|
|
|
metrics *stunServerMetrics
|
|
|
dstPort int
|
|
|
dropSTUN bool
|
|
|
+ link link.Link
|
|
|
}
|
|
|
|
|
|
//lint:ignore U1000 used in xdp_linux_test.go, which has a build tag
|
|
|
@@ -87,7 +89,7 @@ func NewSTUNServer(config *STUNServerConfig, opts ...STUNServerOption) (*STUNSer
|
|
|
if err != nil {
|
|
|
return nil, fmt.Errorf("error finding device: %w", err)
|
|
|
}
|
|
|
- _, err = link.AttachXDP(link.XDPOptions{
|
|
|
+ link, err := link.AttachXDP(link.XDPOptions{
|
|
|
Program: objs.XdpProgFunc,
|
|
|
Interface: iface.Index,
|
|
|
Flags: link.XDPAttachFlags(config.AttachFlags),
|
|
|
@@ -95,6 +97,7 @@ func NewSTUNServer(config *STUNServerConfig, opts ...STUNServerOption) (*STUNSer
|
|
|
if err != nil {
|
|
|
return nil, fmt.Errorf("error attaching XDP program to dev: %w", err)
|
|
|
}
|
|
|
+ server.link = link
|
|
|
return server, nil
|
|
|
}
|
|
|
|
|
|
@@ -102,7 +105,12 @@ func NewSTUNServer(config *STUNServerConfig, opts ...STUNServerOption) (*STUNSer
|
|
|
func (s *STUNServer) Close() error {
|
|
|
s.mu.Lock()
|
|
|
defer s.mu.Unlock()
|
|
|
- return s.objs.Close()
|
|
|
+ var errs []error
|
|
|
+ if s.link != nil {
|
|
|
+ errs = append(errs, s.link.Close())
|
|
|
+ }
|
|
|
+ errs = append(errs, s.objs.Close())
|
|
|
+ return multierr.New(errs...)
|
|
|
}
|
|
|
|
|
|
type stunServerMetrics struct {
|