mirror of
https://github.com/tailscale/tailscale.git
synced 2025-01-09 09:33:42 +00:00
37 lines
897 B
Go
37 lines
897 B
Go
|
// Copyright (c) Tailscale Inc & AUTHORS
|
||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||
|
|
||
|
//go:build linux
|
||
|
|
||
|
package prober
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"net/netip"
|
||
|
|
||
|
"github.com/tailscale/netlink"
|
||
|
"go4.org/netipx"
|
||
|
)
|
||
|
|
||
|
const tunName = "derpprobe"
|
||
|
|
||
|
func configureTUN(addr netip.Prefix, tunname string) error {
|
||
|
link, err := netlink.LinkByName(tunname)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("failed to look up link %q: %w", tunname, err)
|
||
|
}
|
||
|
|
||
|
// We need to bring the TUN device up before assigning an address. This
|
||
|
// allows the OS to automatically create a route for it. Otherwise, we'd
|
||
|
// have to manually create the route.
|
||
|
if err := netlink.LinkSetUp(link); err != nil {
|
||
|
return fmt.Errorf("failed to bring tun %q up: %w", tunname, err)
|
||
|
}
|
||
|
|
||
|
if err := netlink.AddrReplace(link, &netlink.Addr{IPNet: netipx.PrefixIPNet(addr)}); err != nil {
|
||
|
return fmt.Errorf("failed to add address: %w", err)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|