stack.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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 t.config.SocketSettings != nil {
  36. if size := t.config.SocketSettings.TxBufSize; size != 0 {
  37. opts = append(opts, SetTCPSendBufferSize(int(size)))
  38. }
  39. if size := t.config.SocketSettings.RxBufSize; size != 0 {
  40. opts = append(opts, SetTCPReceiveBufferSize(int(size)))
  41. }
  42. }
  43. for _, opt := range opts {
  44. if err := opt(s); err != nil {
  45. return nil, err
  46. }
  47. }
  48. return s, nil
  49. }