mirror of
https://github.com/v2fly/v2ray-core.git
synced 2024-12-22 01:57:12 -05:00
60 lines
1.5 KiB
Go
60 lines
1.5 KiB
Go
package tun
|
|
|
|
import (
|
|
"gvisor.dev/gvisor/pkg/tcpip"
|
|
"gvisor.dev/gvisor/pkg/tcpip/network/ipv4"
|
|
"gvisor.dev/gvisor/pkg/tcpip/network/ipv6"
|
|
"gvisor.dev/gvisor/pkg/tcpip/stack"
|
|
"gvisor.dev/gvisor/pkg/tcpip/transport/icmp"
|
|
"gvisor.dev/gvisor/pkg/tcpip/transport/tcp"
|
|
"gvisor.dev/gvisor/pkg/tcpip/transport/udp"
|
|
)
|
|
|
|
type StackOption func(*stack.Stack) error
|
|
|
|
func (t *TUN) CreateStack(linkedEndpoint stack.LinkEndpoint) (*stack.Stack, error) {
|
|
s := stack.New(stack.Options{
|
|
NetworkProtocols: []stack.NetworkProtocolFactory{
|
|
ipv4.NewProtocol,
|
|
ipv6.NewProtocol,
|
|
},
|
|
TransportProtocols: []stack.TransportProtocolFactory{
|
|
tcp.NewProtocol,
|
|
udp.NewProtocol,
|
|
icmp.NewProtocol4,
|
|
icmp.NewProtocol6,
|
|
},
|
|
})
|
|
|
|
nicID := tcpip.NICID(s.UniqueID())
|
|
|
|
opts := []StackOption{
|
|
SetTCPHandler(t.ctx, t.dispatcher, t.policyManager, t.config),
|
|
SetUDPHandler(t.ctx, t.dispatcher, t.policyManager, t.config),
|
|
|
|
CreateNIC(nicID, linkedEndpoint),
|
|
AddProtocolAddress(nicID, t.config.Ips),
|
|
SetRouteTable(nicID, t.config.Routes),
|
|
SetPromiscuousMode(nicID, t.config.EnablePromiscuousMode),
|
|
SetSpoofing(nicID, t.config.EnableSpoofing),
|
|
}
|
|
|
|
if t.config.SocketSettings != nil {
|
|
if size := t.config.SocketSettings.TxBufSize; size != 0 {
|
|
opts = append(opts, SetTCPSendBufferSize(int(size)))
|
|
}
|
|
|
|
if size := t.config.SocketSettings.RxBufSize; size != 0 {
|
|
opts = append(opts, SetTCPReceiveBufferSize(int(size)))
|
|
}
|
|
}
|
|
|
|
for _, opt := range opts {
|
|
if err := opt(s); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return s, nil
|
|
}
|