stack.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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. HandleTCP(handleTCP),
  28. HandleUDP(handleUDP),
  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. for _, opt := range opts {
  36. if err := opt(s); err != nil {
  37. return nil, err
  38. }
  39. }
  40. return s, nil
  41. }