stack.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  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. }
  31. for _, opt := range opts {
  32. if err := opt(s); err != nil {
  33. return nil, err
  34. }
  35. }
  36. return s, nil
  37. }