mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-26 19:45:35 +00:00
65888d95c9
This commit introduces a userspace program for managing an experimental eBPF XDP STUN server program. derp/xdp contains the eBPF pseudo-C along with a Go pkg for loading it and exporting its metrics. cmd/xdpderper is a package main user of derp/xdp. Updates tailscale/corp#20689 Signed-off-by: Jordan Whited <jordan@tailscale.com>
77 lines
1.8 KiB
Go
77 lines
1.8 KiB
Go
// Copyright (c) Tailscale Inc & AUTHORS
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package main
|
|
|
|
import (
|
|
"flag"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"strings"
|
|
"syscall"
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"tailscale.com/derp/xdp"
|
|
"tailscale.com/tsweb"
|
|
)
|
|
|
|
var (
|
|
flagDevice = flag.String("device", "", "target device name")
|
|
flagPort = flag.Int("dst-port", 0, "destination UDP port to serve")
|
|
flagVerbose = flag.Bool("verbose", false, "verbose output including verifier errors")
|
|
flagMode = flag.String("mode", "xdp", "XDP mode; valid modes: [xdp, xdpgeneric, xdpdrv, xdpoffload]")
|
|
flagHTTP = flag.String("http", ":8230", "HTTP listen address")
|
|
)
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
var attachFlags xdp.XDPAttachFlags
|
|
switch strings.ToLower(*flagMode) {
|
|
case "xdp":
|
|
attachFlags = 0
|
|
case "xdpgeneric":
|
|
attachFlags = xdp.XDPGenericMode
|
|
case "xdpdrv":
|
|
attachFlags = xdp.XDPDriverMode
|
|
case "xdpoffload":
|
|
attachFlags = xdp.XDPOffloadMode
|
|
default:
|
|
log.Fatal("invalid mode")
|
|
}
|
|
server, err := xdp.NewSTUNServer(&xdp.STUNServerConfig{
|
|
DeviceName: *flagDevice,
|
|
DstPort: *flagPort,
|
|
AttachFlags: attachFlags,
|
|
FullVerifierErr: *flagVerbose,
|
|
})
|
|
if err != nil {
|
|
log.Fatalf("failed to init XDP STUN server: %v", err)
|
|
}
|
|
defer server.Close()
|
|
err = prometheus.Register(server)
|
|
if err != nil {
|
|
log.Fatalf("failed to register XDP STUN server as a prometheus collector: %v", err)
|
|
}
|
|
log.Println("XDP STUN server started")
|
|
|
|
mux := http.NewServeMux()
|
|
tsweb.Debugger(mux)
|
|
errCh := make(chan error, 1)
|
|
go func() {
|
|
err := http.ListenAndServe(*flagHTTP, mux)
|
|
errCh <- err
|
|
}()
|
|
|
|
sigCh := make(chan os.Signal, 1)
|
|
signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
|
|
select {
|
|
case err := <-errCh:
|
|
log.Printf("HTTP serve err: %v", err)
|
|
case sig := <-sigCh:
|
|
log.Printf("received signal: %s", sig)
|
|
}
|
|
|
|
}
|