mirror of
https://github.com/xjasonlyu/tun2socks.git
synced 2026-10-20 00:17:34 +00:00
48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
package core
|
|
|
|
import (
|
|
glog "gvisor.dev/gvisor/pkg/log"
|
|
"gvisor.dev/gvisor/pkg/tcpip/adapters/gonet"
|
|
"gvisor.dev/gvisor/pkg/tcpip/stack"
|
|
"gvisor.dev/gvisor/pkg/tcpip/transport/udp"
|
|
"gvisor.dev/gvisor/pkg/waiter"
|
|
|
|
"github.com/xjasonlyu/tun2socks/v2/core/adapter"
|
|
"github.com/xjasonlyu/tun2socks/v2/core/option"
|
|
)
|
|
|
|
func withUDPHandler(h adapter.TransportHandler) option.Option {
|
|
return func(s *stack.Stack) error {
|
|
f := udp.NewForwarder(s, func(r *udp.ForwarderRequest) bool {
|
|
var (
|
|
wq waiter.Queue
|
|
id = r.ID()
|
|
)
|
|
ep, err := r.CreateEndpoint(&wq)
|
|
if err != nil {
|
|
glog.Debugf("forward udp request: %s:%d->%s:%d: %s",
|
|
id.RemoteAddress, id.RemotePort, id.LocalAddress, id.LocalPort, err)
|
|
return false
|
|
}
|
|
|
|
conn := &udpConn{
|
|
UDPConn: gonet.NewUDPConn(&wq, ep),
|
|
id: id,
|
|
}
|
|
h.HandleUDP(conn)
|
|
return true
|
|
})
|
|
s.SetTransportProtocolHandler(udp.ProtocolNumber, f.HandlePacket)
|
|
return nil
|
|
}
|
|
}
|
|
|
|
type udpConn struct {
|
|
*gonet.UDPConn
|
|
id stack.TransportEndpointID
|
|
}
|
|
|
|
func (c *udpConn) ID() stack.TransportEndpointID {
|
|
return c.id
|
|
}
|