mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2024-11-16 11:42:43 +08:00
fix: tuic relay tuic
This commit is contained in:
parent
020ed8bc96
commit
dcccdaddaf
|
@ -200,7 +200,7 @@ func (q *quicStreamPacketConn) ReadFrom(p []byte) (n int, addr net.Addr, err err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *quicStreamPacketConn) WriteTo(p []byte, addr net.Addr) (n int, err error) {
|
func (q *quicStreamPacketConn) WriteTo(p []byte, addr net.Addr) (n int, err error) {
|
||||||
if len(p) > q.maxUdpRelayPacketSize {
|
if q.udpRelayMode != "quic" && len(p) > q.maxUdpRelayPacketSize {
|
||||||
return 0, fmt.Errorf("udp packet too large(%d > %d)", len(p), q.maxUdpRelayPacketSize)
|
return 0, fmt.Errorf("udp packet too large(%d > %d)", len(p), q.maxUdpRelayPacketSize)
|
||||||
}
|
}
|
||||||
if q.closed {
|
if q.closed {
|
||||||
|
@ -215,7 +215,6 @@ func (q *quicStreamPacketConn) WriteTo(p []byte, addr net.Addr) (n int, err erro
|
||||||
q.deferQuicConnFn(q.quicConn, err)
|
q.deferQuicConnFn(q.quicConn, err)
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
addr.String()
|
|
||||||
buf := pool.GetBuffer()
|
buf := pool.GetBuffer()
|
||||||
defer pool.PutBuffer(buf)
|
defer pool.PutBuffer(buf)
|
||||||
addrPort, err := netip.ParseAddrPort(addr.String())
|
addrPort, err := netip.ParseAddrPort(addr.String())
|
||||||
|
@ -239,7 +238,8 @@ func (q *quicStreamPacketConn) WriteTo(p []byte, addr net.Addr) (n int, err erro
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
default: // native
|
default: // native
|
||||||
err = q.quicConn.SendMessage(buf.Bytes())
|
data := buf.Bytes()
|
||||||
|
err = q.quicConn.SendMessage(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -250,7 +250,29 @@ func (q *quicStreamPacketConn) WriteTo(p []byte, addr net.Addr) (n int, err erro
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *quicStreamPacketConn) LocalAddr() net.Addr {
|
func (q *quicStreamPacketConn) LocalAddr() net.Addr {
|
||||||
return q.quicConn.LocalAddr()
|
addr := q.quicConn.LocalAddr()
|
||||||
|
if q.inputConn != nil { // client
|
||||||
|
return &packetAddr{addrStr: q.quicConn.LocalAddr().String(), connId: q.connId, rawAddr: addr}
|
||||||
|
}
|
||||||
|
return addr // server
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ net.PacketConn = &quicStreamPacketConn{}
|
var _ net.PacketConn = &quicStreamPacketConn{}
|
||||||
|
|
||||||
|
type packetAddr struct {
|
||||||
|
addrStr string
|
||||||
|
connId uint32
|
||||||
|
rawAddr net.Addr
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a packetAddr) Network() string {
|
||||||
|
return "tuic"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a packetAddr) String() string {
|
||||||
|
return fmt.Sprintf("%s-%d", a.addrStr, a.connId)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a packetAddr) RawAddr() net.Addr {
|
||||||
|
return a.rawAddr
|
||||||
|
}
|
||||||
|
|
|
@ -114,9 +114,6 @@ func NewAuthenticate(TKN [32]byte) Authenticate {
|
||||||
|
|
||||||
func ReadAuthenticateWithHead(head CommandHead, reader BufferedReader) (c Authenticate, err error) {
|
func ReadAuthenticateWithHead(head CommandHead, reader BufferedReader) (c Authenticate, err error) {
|
||||||
c.CommandHead = head
|
c.CommandHead = head
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if c.CommandHead.TYPE != AuthenticateType {
|
if c.CommandHead.TYPE != AuthenticateType {
|
||||||
err = fmt.Errorf("error command type: %s", c.CommandHead.TYPE)
|
err = fmt.Errorf("error command type: %s", c.CommandHead.TYPE)
|
||||||
return
|
return
|
||||||
|
@ -170,9 +167,6 @@ func NewConnect(ADDR Address) Connect {
|
||||||
|
|
||||||
func ReadConnectWithHead(head CommandHead, reader BufferedReader) (c Connect, err error) {
|
func ReadConnectWithHead(head CommandHead, reader BufferedReader) (c Connect, err error) {
|
||||||
c.CommandHead = head
|
c.CommandHead = head
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if c.CommandHead.TYPE != ConnectType {
|
if c.CommandHead.TYPE != ConnectType {
|
||||||
err = fmt.Errorf("error command type: %s", c.CommandHead.TYPE)
|
err = fmt.Errorf("error command type: %s", c.CommandHead.TYPE)
|
||||||
return
|
return
|
||||||
|
@ -228,9 +222,6 @@ func NewPacket(ASSOC_ID uint32, LEN uint16, ADDR Address, DATA []byte) Packet {
|
||||||
|
|
||||||
func ReadPacketWithHead(head CommandHead, reader BufferedReader) (c Packet, err error) {
|
func ReadPacketWithHead(head CommandHead, reader BufferedReader) (c Packet, err error) {
|
||||||
c.CommandHead = head
|
c.CommandHead = head
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if c.CommandHead.TYPE != PacketType {
|
if c.CommandHead.TYPE != PacketType {
|
||||||
err = fmt.Errorf("error command type: %s", c.CommandHead.TYPE)
|
err = fmt.Errorf("error command type: %s", c.CommandHead.TYPE)
|
||||||
return
|
return
|
||||||
|
@ -305,9 +296,6 @@ func NewDissociate(ASSOC_ID uint32) Dissociate {
|
||||||
|
|
||||||
func ReadDissociateWithHead(head CommandHead, reader BufferedReader) (c Dissociate, err error) {
|
func ReadDissociateWithHead(head CommandHead, reader BufferedReader) (c Dissociate, err error) {
|
||||||
c.CommandHead = head
|
c.CommandHead = head
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if c.CommandHead.TYPE != DissociateType {
|
if c.CommandHead.TYPE != DissociateType {
|
||||||
err = fmt.Errorf("error command type: %s", c.CommandHead.TYPE)
|
err = fmt.Errorf("error command type: %s", c.CommandHead.TYPE)
|
||||||
return
|
return
|
||||||
|
@ -476,15 +464,17 @@ func NewAddress(metadata *C.Metadata) Address {
|
||||||
|
|
||||||
func NewAddressAddrPort(addrPort netip.AddrPort) Address {
|
func NewAddressAddrPort(addrPort netip.AddrPort) Address {
|
||||||
var addrType byte
|
var addrType byte
|
||||||
if addrPort.Addr().Is4() {
|
port := addrPort.Port()
|
||||||
|
addr := addrPort.Addr().Unmap()
|
||||||
|
if addr.Is4() {
|
||||||
addrType = AtypIPv4
|
addrType = AtypIPv4
|
||||||
} else {
|
} else {
|
||||||
addrType = AtypIPv6
|
addrType = AtypIPv6
|
||||||
}
|
}
|
||||||
return Address{
|
return Address{
|
||||||
TYPE: addrType,
|
TYPE: addrType,
|
||||||
ADDR: addrPort.Addr().AsSlice(),
|
ADDR: addr.AsSlice(),
|
||||||
PORT: addrPort.Port(),
|
PORT: port,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"fmt"
|
|
||||||
"net"
|
"net"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
@ -154,14 +153,10 @@ func (s *serverHandler) parsePacket(packet Packet, udpRelayMode string) (err err
|
||||||
return s.HandleUdpFn(packet.ADDR.SocksAddr(), &serverUDPPacket{
|
return s.HandleUdpFn(packet.ADDR.SocksAddr(), &serverUDPPacket{
|
||||||
pc: pc,
|
pc: pc,
|
||||||
packet: &packet,
|
packet: &packet,
|
||||||
rAddr: s.genServerAssocIdAddr(assocId, s.quicConn.RemoteAddr()),
|
rAddr: &packetAddr{addrStr: "tuic-" + s.uuid.String(), connId: assocId, rawAddr: s.quicConn.RemoteAddr()},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serverHandler) genServerAssocIdAddr(assocId uint32, addr net.Addr) net.Addr {
|
|
||||||
return &ServerAssocIdAddr{assocId: fmt.Sprintf("tuic-%s-%d", s.uuid.String(), assocId), addr: addr}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *serverHandler) handleStream() (err error) {
|
func (s *serverHandler) handleStream() (err error) {
|
||||||
for {
|
for {
|
||||||
var quicStream quic.Stream
|
var quicStream quic.Stream
|
||||||
|
@ -276,23 +271,6 @@ func (s *serverHandler) handleUniStream() (err error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type ServerAssocIdAddr struct {
|
|
||||||
assocId string
|
|
||||||
addr net.Addr
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a ServerAssocIdAddr) Network() string {
|
|
||||||
return "ServerAssocIdAddr"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a ServerAssocIdAddr) String() string {
|
|
||||||
return a.assocId
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a ServerAssocIdAddr) RawAddr() net.Addr {
|
|
||||||
return a.addr
|
|
||||||
}
|
|
||||||
|
|
||||||
type serverUDPPacket struct {
|
type serverUDPPacket struct {
|
||||||
pc *quicStreamPacketConn
|
pc *quicStreamPacketConn
|
||||||
packet *Packet
|
packet *Packet
|
||||||
|
|
Loading…
Reference in New Issue
Block a user