stack.go 919 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package tun
  2. import (
  3. "gvisor.dev/gvisor/pkg/tcpip/network/ipv4"
  4. "gvisor.dev/gvisor/pkg/tcpip/network/ipv6"
  5. "gvisor.dev/gvisor/pkg/tcpip/stack"
  6. "gvisor.dev/gvisor/pkg/tcpip/transport/icmp"
  7. "gvisor.dev/gvisor/pkg/tcpip/transport/tcp"
  8. "gvisor.dev/gvisor/pkg/tcpip/transport/udp"
  9. )
  10. type StackOption func(*stack.Stack) error
  11. func (t *TUN) CreateStack(_ stack.LinkEndpoint) (*stack.Stack, error) {
  12. s := stack.New(stack.Options{
  13. NetworkProtocols: []stack.NetworkProtocolFactory{
  14. ipv4.NewProtocol,
  15. ipv6.NewProtocol,
  16. },
  17. TransportProtocols: []stack.TransportProtocolFactory{
  18. tcp.NewProtocol,
  19. udp.NewProtocol,
  20. icmp.NewProtocol4,
  21. icmp.NewProtocol6,
  22. },
  23. })
  24. opts := []StackOption{
  25. SetTCPHandler(t.ctx, t.dispatcher, t.policyManager, t.config),
  26. }
  27. for _, opt := range opts {
  28. if err := opt(s); err != nil {
  29. return nil, err
  30. }
  31. }
  32. // nicID := tcpip.NICID(s.UniqueID())
  33. return s, nil
  34. }