mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-26 11:35:35 +00:00
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)
|
||
|
}
|
||
|
|
||
|
}
|