option.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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/tcp"
  8. "github.com/v2fly/v2ray-core/v5/app/router/routercommon"
  9. )
  10. func CreateNIC(id tcpip.NICID, linkEndpoint stack.LinkEndpoint) StackOption {
  11. return func(s *stack.Stack) error {
  12. if err := s.CreateNICWithOptions(id, linkEndpoint,
  13. stack.NICOptions{
  14. Disabled: false,
  15. QDisc: nil,
  16. }); err != nil {
  17. return newError("failed to create NIC:", err)
  18. }
  19. return nil
  20. }
  21. }
  22. func SetPromiscuousMode(id tcpip.NICID, enable bool) StackOption {
  23. return func(s *stack.Stack) error {
  24. if err := s.SetPromiscuousMode(id, enable); err != nil {
  25. return newError("failed to set promiscuous mode:", err)
  26. }
  27. return nil
  28. }
  29. }
  30. func SetSpoofing(id tcpip.NICID, enable bool) StackOption {
  31. return func(s *stack.Stack) error {
  32. if err := s.SetSpoofing(id, enable); err != nil {
  33. return newError("failed to set spoofing:", err)
  34. }
  35. return nil
  36. }
  37. }
  38. func AddProtocolAddress(id tcpip.NICID, ips []*routercommon.CIDR) StackOption {
  39. return func(s *stack.Stack) error {
  40. for _, ip := range ips {
  41. tcpIPAddr := tcpip.AddrFrom4Slice(ip.Ip)
  42. protocolAddress := tcpip.ProtocolAddress{
  43. AddressWithPrefix: tcpip.AddressWithPrefix{
  44. Address: tcpIPAddr,
  45. PrefixLen: int(ip.Prefix),
  46. },
  47. }
  48. switch tcpIPAddr.Len() {
  49. case 4:
  50. protocolAddress.Protocol = ipv4.ProtocolNumber
  51. case 16:
  52. protocolAddress.Protocol = ipv6.ProtocolNumber
  53. default:
  54. return newError("invalid IP address length:", tcpIPAddr.Len())
  55. }
  56. if err := s.AddProtocolAddress(id, protocolAddress, stack.AddressProperties{}); err != nil {
  57. return newError("failed to add protocol address:", err)
  58. }
  59. }
  60. return nil
  61. }
  62. }
  63. func SetRouteTable(id tcpip.NICID, routes []*routercommon.CIDR) StackOption {
  64. return func(s *stack.Stack) error {
  65. s.SetRouteTable(func() (table []tcpip.Route) {
  66. for _, cidrs := range routes {
  67. subnet := tcpip.AddressWithPrefix{
  68. Address: tcpip.AddrFrom4Slice(cidrs.Ip),
  69. PrefixLen: int(cidrs.Prefix),
  70. }.Subnet()
  71. route := tcpip.Route{
  72. Destination: subnet,
  73. NIC: id,
  74. }
  75. table = append(table, route)
  76. }
  77. return
  78. }())
  79. return nil
  80. }
  81. }
  82. func SetTCPSendBufferSize(size int) StackOption {
  83. return func(s *stack.Stack) error {
  84. sendBufferSizeRangeOption := tcpip.TCPSendBufferSizeRangeOption{Min: tcp.MinBufferSize, Default: size, Max: tcp.MaxBufferSize}
  85. if err := s.SetTransportProtocolOption(tcp.ProtocolNumber, &sendBufferSizeRangeOption); err != nil {
  86. return newError("failed to set tcp send buffer size:", err)
  87. }
  88. return nil
  89. }
  90. }
  91. func SetTCPReceiveBufferSize(size int) StackOption {
  92. return func(s *stack.Stack) error {
  93. receiveBufferSizeRangeOption := tcpip.TCPReceiveBufferSizeRangeOption{Min: tcp.MinBufferSize, Default: size, Max: tcp.MaxBufferSize}
  94. if err := s.SetTransportProtocolOption(tcp.ProtocolNumber, &receiveBufferSizeRangeOption); err != nil {
  95. return newError("failed to set tcp receive buffer size:", err)
  96. }
  97. return nil
  98. }
  99. }