stack.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package tun
  2. import (
  3. "gvisor.dev/gvisor/pkg/tcpip"
  4. "gvisor.dev/gvisor/pkg/tcpip/network/ipv4"
  5. "gvisor.dev/gvisor/pkg/tcpip/network/ipv6"
  6. "gvisor.dev/gvisor/pkg/tcpip/stack"
  7. "gvisor.dev/gvisor/pkg/tcpip/transport/icmp"
  8. "gvisor.dev/gvisor/pkg/tcpip/transport/tcp"
  9. "gvisor.dev/gvisor/pkg/tcpip/transport/udp"
  10. )
  11. type StackOption func(*stack.Stack) error
  12. func (t *TUN) CreateStack(linkedEndpoint stack.LinkEndpoint) (*stack.Stack, error) {
  13. s := stack.New(stack.Options{
  14. NetworkProtocols: []stack.NetworkProtocolFactory{
  15. ipv4.NewProtocol,
  16. ipv6.NewProtocol,
  17. },
  18. TransportProtocols: []stack.TransportProtocolFactory{
  19. tcp.NewProtocol,
  20. udp.NewProtocol,
  21. icmp.NewProtocol4,
  22. icmp.NewProtocol6,
  23. },
  24. })
  25. nicID := tcpip.NICID(s.UniqueID())
  26. opts := []StackOption{
  27. SetTCPHandler(t.ctx, t.dispatcher, t.policyManager, t.config),
  28. SetUDPHandler(t.ctx, t.dispatcher, t.policyManager, t.config),
  29. CreateNIC(nicID, linkedEndpoint),
  30. AddProtocolAddress(nicID, t.config.Ips),
  31. SetRouteTable(nicID, t.config.Routes),
  32. SetPromiscuousMode(nicID, t.config.EnablePromiscuousMode),
  33. SetSpoofing(nicID, t.config.EnableSpoofing),
  34. }
  35. if size := t.config.SocketSettings.TxBufSize; size != 0 {
  36. opts = append(opts, SetTCPSendBufferSize(int(size)))
  37. }
  38. if size := t.config.SocketSettings.RxBufSize; size != 0 {
  39. opts = append(opts, SetTCPReceiveBufferSize(int(size)))
  40. }
  41. for _, opt := range opts {
  42. if err := opt(s); err != nil {
  43. return nil, err
  44. }
  45. }
  46. return s, nil
  47. }