| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- 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
- }
|