tun_linux.go 919 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package tun
  2. import (
  3. "net/netip"
  4. "github.com/vishvananda/netlink"
  5. "gvisor.dev/gvisor/pkg/tcpip/link/tun"
  6. )
  7. func Open(name string) (uintptr, error) {
  8. tunFd, err := tun.Open(name)
  9. if err != nil {
  10. return 0, err
  11. }
  12. return uintptr(tunFd), nil
  13. }
  14. func Configure(name string, inet4Address netip.Prefix, inet6Address netip.Prefix, mtu uint32) error {
  15. tunLink, err := netlink.LinkByName(name)
  16. if err != nil {
  17. return err
  18. }
  19. if inet4Address.IsValid() {
  20. addr4, _ := netlink.ParseAddr(inet4Address.String())
  21. err = netlink.AddrAdd(tunLink, addr4)
  22. if err != nil {
  23. return err
  24. }
  25. }
  26. if inet6Address.IsValid() {
  27. addr6, _ := netlink.ParseAddr(inet6Address.String())
  28. err = netlink.AddrAdd(tunLink, addr6)
  29. if err != nil {
  30. return err
  31. }
  32. }
  33. err = netlink.LinkSetMTU(tunLink, int(mtu))
  34. if err != nil {
  35. return err
  36. }
  37. err = netlink.LinkSetUp(tunLink)
  38. if err != nil {
  39. return err
  40. }
  41. return nil
  42. }