mirror of
https://github.com/v2fly/v2ray-core.git
synced 2024-12-30 05:56:54 -05:00
fullcone bug fixes
This commit is contained in:
parent
ddf25beec1
commit
c4f850f1a9
@ -210,7 +210,7 @@ func (h *Handler) Dial(ctx context.Context, dest net.Destination) (internet.Conn
|
||||
}
|
||||
|
||||
if isStream, err := packetaddr.GetDestinationSubsetOf(dest); err == nil {
|
||||
packetConn, err := internet.ListenSystemPacket(ctx, nil, h.streamSettings.SocketSettings)
|
||||
packetConn, err := internet.ListenSystemPacket(ctx, &net.UDPAddr{IP: net.AnyIP.IP(), Port: 0}, h.streamSettings.SocketSettings)
|
||||
if err != nil {
|
||||
return nil, newError("unable to listen socket").Base(err)
|
||||
}
|
||||
|
@ -64,19 +64,23 @@ func (c *packetConnectionAdaptor) ReadFrom(p []byte) (n int, addr gonet.Addr, er
|
||||
defer c.readerAccess.Unlock()
|
||||
if c.readerBuffer.IsEmpty() {
|
||||
c.readerBuffer, err = c.link.Reader.ReadMultiBuffer()
|
||||
if err != nil {
|
||||
return 0, nil, err
|
||||
}
|
||||
}
|
||||
c.readerBuffer, n = buf.SplitFirstBytes(c.readerBuffer, p)
|
||||
p, addr = ExtractAddressFromPacket(p)
|
||||
var w []byte
|
||||
w, addr = ExtractAddressFromPacket(p[:n])
|
||||
n = copy(p, w)
|
||||
return
|
||||
}
|
||||
|
||||
func (c *packetConnectionAdaptor) WriteTo(p []byte, addr gonet.Addr) (n int, err error) {
|
||||
payloadLen := len(p)
|
||||
p = AttachAddressToPacket(p, addr)
|
||||
buffer := buf.New()
|
||||
buffer := buf.FromBytes(p)
|
||||
mb := buf.MultiBuffer{buffer}
|
||||
err = c.link.Writer.WriteMultiBuffer(mb)
|
||||
buf.ReleaseMulti(mb)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
@ -128,7 +132,7 @@ func (pc *packetConnWrapper) Read(p []byte) (n int, err error) {
|
||||
recbuf.Extend(2048)
|
||||
n, addr, err := pc.PacketConn.ReadFrom(recbuf.Bytes())
|
||||
if err != nil {
|
||||
return 0, nil
|
||||
return 0, err
|
||||
}
|
||||
result := AttachAddressToPacket(recbuf.Bytes()[0:n], addr)
|
||||
n = copy(p, result)
|
||||
@ -146,7 +150,7 @@ func (pc *packetConnWrapper) Write(p []byte) (n int, err error) {
|
||||
}
|
||||
|
||||
func (pc *packetConnWrapper) Close() error {
|
||||
return pc.Close()
|
||||
return pc.PacketConn.Close()
|
||||
}
|
||||
|
||||
func GetDestinationSubsetOf(dest net.Destination) (bool, error) {
|
||||
|
@ -359,6 +359,17 @@ func EncodeUDPPacket(request *protocol.RequestHeader, data []byte) (*buf.Buffer,
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func EncodeUDPPacketFromAddress(address net.Destination, data []byte) (*buf.Buffer, error) {
|
||||
b := buf.New()
|
||||
common.Must2(b.Write([]byte{0, 0, 0 /* Fragment */}))
|
||||
if err := addrParser.WriteAddressPort(b, address.Address, address.Port); err != nil {
|
||||
b.Release()
|
||||
return nil, err
|
||||
}
|
||||
common.Must2(b.Write(data))
|
||||
return b, nil
|
||||
}
|
||||
|
||||
type UDPReader struct {
|
||||
reader io.Reader
|
||||
}
|
||||
|
@ -200,10 +200,13 @@ func (s *Server) handleUDPPayload(ctx context.Context, conn internet.Connection,
|
||||
newError("writing back UDP response with ", payload.Len(), " bytes").AtDebug().WriteToLog(session.ExportIDToError(ctx))
|
||||
|
||||
request := protocol.RequestHeaderFromContext(ctx)
|
||||
var packetSource net.Destination
|
||||
if request == nil {
|
||||
return
|
||||
packetSource = packet.Source
|
||||
} else {
|
||||
packetSource = net.UDPDestination(request.Address, request.Port)
|
||||
}
|
||||
udpMessage, err := EncodeUDPPacket(request, payload.Bytes())
|
||||
udpMessage, err := EncodeUDPPacketFromAddress(packetSource, payload.Bytes())
|
||||
payload.Release()
|
||||
|
||||
defer udpMessage.Release()
|
||||
|
Loading…
Reference in New Issue
Block a user