tun_android.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. //go:build android
  2. package tun
  3. import (
  4. "context"
  5. "strconv"
  6. "github.com/xtls/xray-core/common/errors"
  7. "github.com/xtls/xray-core/common/platform"
  8. "golang.org/x/sys/unix"
  9. "gvisor.dev/gvisor/pkg/tcpip/link/fdbased"
  10. "gvisor.dev/gvisor/pkg/tcpip/stack"
  11. )
  12. type AndroidTun struct {
  13. tunFd int
  14. options TunOptions
  15. }
  16. // DefaultTun implements Tun
  17. var _ Tun = (*AndroidTun)(nil)
  18. // DefaultTun implements GVisorTun
  19. var _ GVisorTun = (*AndroidTun)(nil)
  20. // NewTun builds new tun interface handler
  21. func NewTun(options TunOptions) (Tun, error) {
  22. fd, err := strconv.Atoi(platform.NewEnvFlag(platform.TunFdKey).GetValue(func() string { return "0" }))
  23. errors.LogInfo(context.Background(), "read Android Tun Fd ", fd, err)
  24. err = unix.SetNonblock(fd, true)
  25. if err != nil {
  26. _ = unix.Close(fd)
  27. return nil, err
  28. }
  29. return &AndroidTun{
  30. tunFd: fd,
  31. options: options,
  32. }, nil
  33. }
  34. func (t *AndroidTun) Start() error {
  35. return nil
  36. }
  37. func (t *AndroidTun) Close() error {
  38. return nil
  39. }
  40. func (t *AndroidTun) newEndpoint() (stack.LinkEndpoint, error) {
  41. return fdbased.New(&fdbased.Options{
  42. FDs: []int{t.tunFd},
  43. MTU: t.options.MTU,
  44. RXChecksumOffload: true,
  45. })
  46. }