From ec9b64e5ec2ab5b5b22e8f0a31a0b17f12b1aac1 Mon Sep 17 00:00:00 2001 From: Shelikhoo Date: Mon, 13 Dec 2021 21:52:57 +0000 Subject: [PATCH] Add packet addr dispatcher --- .../internet/udp/dispatcher_packetaddr.go | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 transport/internet/udp/dispatcher_packetaddr.go diff --git a/transport/internet/udp/dispatcher_packetaddr.go b/transport/internet/udp/dispatcher_packetaddr.go new file mode 100644 index 000000000..35f3e2e60 --- /dev/null +++ b/transport/internet/udp/dispatcher_packetaddr.go @@ -0,0 +1,57 @@ +package udp + +import ( + "context" + "github.com/v2fly/v2ray-core/v4/common/buf" + "github.com/v2fly/v2ray-core/v4/common/net" + "github.com/v2fly/v2ray-core/v4/common/net/packetaddr" + "github.com/v2fly/v2ray-core/v4/common/protocol/udp" + "github.com/v2fly/v2ray-core/v4/features/routing" +) + +type PacketAddrDispatcher struct { + conn net.PacketConn + callback ResponseCallback + ctx context.Context +} + +func (p PacketAddrDispatcher) Close() error { + return p.conn.Close() +} + +func (p PacketAddrDispatcher) Dispatch(ctx context.Context, destination net.Destination, payload *buf.Buffer) { + if destination.Network != net.Network_UDP { + return + } + p.conn.WriteTo(payload.Bytes(), &net.UDPAddr{IP: destination.Address.IP(), Port: int(destination.Port.Value())}) +} +func (p PacketAddrDispatcher) readWorker() { + for { + readBuf := buf.New() + n, addr, err := p.conn.ReadFrom(readBuf.Extend(2048)) + if err != nil { + return + } + readBuf.Resize(0, int32(n)) + p.callback(p.ctx, &udp.Packet{Payload: readBuf, Source: net.DestinationFromAddr(addr)}) + } +} + +type PacketAddrDispatcherCreator struct { + ctx context.Context +} + +func NewPacketAddrDispatcherCreator(ctx context.Context) PacketAddrDispatcherCreator { + return PacketAddrDispatcherCreator{ctx: ctx} +} + +func (pdc *PacketAddrDispatcherCreator) NewPacketAddrDispatcher( + dispatcher routing.Dispatcher, callback ResponseCallback) (DispatcherI, error) { + packetConn, err := packetaddr.CreatePacketAddrConn(pdc.ctx, dispatcher, false) + if err != nil { + return nil, err + } + pd := &PacketAddrDispatcher{conn: packetConn, callback: callback, ctx: pdc.ctx} + go pd.readWorker() + return pd, nil +}