diff --git a/gvisor_udp.go b/gvisor_udp.go index 8d7a01e..fff72e0 100644 --- a/gvisor_udp.go +++ b/gvisor_udp.go @@ -13,6 +13,7 @@ import ( "github.com/sagernet/gvisor/pkg/tcpip/header" "github.com/sagernet/gvisor/pkg/tcpip/stack" "github.com/sagernet/sing/common/buf" + E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" "github.com/sagernet/sing/common/udpnat" @@ -62,6 +63,12 @@ type UDPBackWriter struct { } func (w *UDPBackWriter) WritePacket(packetBuffer *buf.Buffer, destination M.Socksaddr) error { + if destination.IsIPv4() && w.sourceNetwork == header.IPv6ProtocolNumber { + destination = M.SocksaddrFrom(netip.AddrFrom16(destination.Addr.As16()), destination.Port) + } else if destination.IsIPv6() && (w.sourceNetwork == header.IPv4AddressSizeBits) { + return E.New("send IPv6 packet to IPv4 connection") + } + defer packetBuffer.Release() route, err := w.stack.FindRoute(