improve ssu data transport
This commit is contained in:
parent
68f27a15d9
commit
3cb301dea5
112
ss.go
112
ss.go
@ -455,41 +455,45 @@ func (h *shadowUDPdHandler) Handle(conn net.Conn) {
|
|||||||
|
|
||||||
func (h *shadowUDPdHandler) transportUDP(sc net.Conn, cc net.PacketConn) error {
|
func (h *shadowUDPdHandler) transportUDP(sc net.Conn, cc net.PacketConn) error {
|
||||||
errc := make(chan error, 1)
|
errc := make(chan error, 1)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
b := mPool.Get().([]byte)
|
er := func() (err error) {
|
||||||
defer mPool.Put(b)
|
b := lPool.Get().([]byte)
|
||||||
|
defer lPool.Put(b)
|
||||||
|
|
||||||
b[0] = 0
|
b[0] = 0
|
||||||
b[1] = 0
|
b[1] = 0
|
||||||
b[2] = 0
|
b[2] = 0
|
||||||
|
|
||||||
n, err := sc.Read(b[3:]) // add rsv and frag fields to make it the standard SOCKS5 UDP datagram
|
// add rsv and frag fields to make it the standard SOCKS5 UDP datagram
|
||||||
if err != nil {
|
n, err := sc.Read(b[3:])
|
||||||
// log.Logf("[ssu] %s - %s : %s", sc.RemoteAddr(), sc.LocalAddr(), err)
|
if err != nil {
|
||||||
errc <- err
|
// log.Logf("[ssu] %s - %s : %s", sc.RemoteAddr(), sc.LocalAddr(), err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
dgram, err := gosocks5.ReadUDPDatagram(bytes.NewReader(b[:n+3]))
|
||||||
|
if err != nil {
|
||||||
|
log.Logf("[ssu] %s - %s : %s", sc.RemoteAddr(), sc.LocalAddr(), err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if Debug {
|
||||||
|
log.Logf("[ssu] %s >>> %s length: %d", sc.RemoteAddr(), dgram.Header.Addr.String(), len(dgram.Data))
|
||||||
|
}
|
||||||
|
addr, err := net.ResolveUDPAddr("udp", dgram.Header.Addr.String())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if h.options.Bypass.Contains(addr.String()) {
|
||||||
|
log.Log("[ssu] bypass", addr)
|
||||||
|
return // bypass
|
||||||
|
}
|
||||||
|
_, err = cc.WriteTo(dgram.Data, addr)
|
||||||
return
|
return
|
||||||
}
|
}()
|
||||||
dgram, err := gosocks5.ReadUDPDatagram(bytes.NewReader(b[:n+3]))
|
|
||||||
if err != nil {
|
if er != nil {
|
||||||
log.Logf("[ssu] %s - %s : %s", sc.RemoteAddr(), sc.LocalAddr(), err)
|
errc <- er
|
||||||
errc <- err
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if Debug {
|
|
||||||
log.Logf("[ssu] %s >>> %s length: %d", sc.RemoteAddr(), dgram.Header.Addr.String(), len(dgram.Data))
|
|
||||||
}
|
|
||||||
addr, err := net.ResolveUDPAddr("udp", dgram.Header.Addr.String())
|
|
||||||
if err != nil {
|
|
||||||
errc <- err
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if h.options.Bypass.Contains(addr.String()) {
|
|
||||||
log.Log("[ssu] bypass", addr)
|
|
||||||
continue // bypass
|
|
||||||
}
|
|
||||||
if _, err := cc.WriteTo(dgram.Data, addr); err != nil {
|
|
||||||
errc <- err
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -497,30 +501,34 @@ func (h *shadowUDPdHandler) transportUDP(sc net.Conn, cc net.PacketConn) error {
|
|||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
b := mPool.Get().([]byte)
|
er := func() (err error) {
|
||||||
defer mPool.Put(b)
|
b := lPool.Get().([]byte)
|
||||||
|
defer lPool.Put(b)
|
||||||
|
|
||||||
n, addr, err := cc.ReadFrom(b)
|
n, addr, err := cc.ReadFrom(b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errc <- err
|
return
|
||||||
|
}
|
||||||
|
if Debug {
|
||||||
|
log.Logf("[ssu] %s <<< %s length: %d", sc.RemoteAddr(), addr, n)
|
||||||
|
}
|
||||||
|
if h.options.Bypass.Contains(addr.String()) {
|
||||||
|
log.Log("[ssu] bypass", addr)
|
||||||
|
return // bypass
|
||||||
|
}
|
||||||
|
dgram := gosocks5.NewUDPDatagram(gosocks5.NewUDPHeader(0, 0, toSocksAddr(addr)), b[:n])
|
||||||
|
buf := bytes.Buffer{}
|
||||||
|
dgram.Write(&buf)
|
||||||
|
if buf.Len() < 10 {
|
||||||
|
log.Logf("[ssu] %s <- %s : invalid udp datagram", sc.RemoteAddr(), addr)
|
||||||
|
return // ignore invalid datagram
|
||||||
|
}
|
||||||
|
_, err = sc.Write(buf.Bytes()[3:])
|
||||||
return
|
return
|
||||||
}
|
}()
|
||||||
if Debug {
|
|
||||||
log.Logf("[ssu] %s <<< %s length: %d", sc.RemoteAddr(), addr, n)
|
if er != nil {
|
||||||
}
|
errc <- er
|
||||||
if h.options.Bypass.Contains(addr.String()) {
|
|
||||||
log.Log("[ssu] bypass", addr)
|
|
||||||
continue // bypass
|
|
||||||
}
|
|
||||||
dgram := gosocks5.NewUDPDatagram(gosocks5.NewUDPHeader(0, 0, toSocksAddr(addr)), b[:n])
|
|
||||||
buf := bytes.Buffer{}
|
|
||||||
dgram.Write(&buf)
|
|
||||||
if buf.Len() < 10 {
|
|
||||||
log.Logf("[ssu] %s <- %s : invalid udp datagram", sc.RemoteAddr(), addr)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if _, err := sc.Write(buf.Bytes()[3:]); err != nil {
|
|
||||||
errc <- err
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user