Commit 3cb301de authored by ginuerzh's avatar ginuerzh

improve ssu data transport

parent 68f27a15
...@@ -455,41 +455,45 @@ func (h *shadowUDPdHandler) Handle(conn net.Conn) { ...@@ -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[1] = 0 b[0] = 0
b[2] = 0 b[1] = 0
b[2] = 0
n, err := sc.Read(b[3:]) // add rsv and frag fields to make it the standard SOCKS5 UDP datagram
if err != nil { // add rsv and frag fields to make it the standard SOCKS5 UDP datagram
// log.Logf("[ssu] %s - %s : %s", sc.RemoteAddr(), sc.LocalAddr(), err) n, err := sc.Read(b[3:])
errc <- err if err != nil {
return // log.Logf("[ssu] %s - %s : %s", sc.RemoteAddr(), sc.LocalAddr(), err)
} return
dgram, err := gosocks5.ReadUDPDatagram(bytes.NewReader(b[:n+3])) }
if err != nil { dgram, err := gosocks5.ReadUDPDatagram(bytes.NewReader(b[:n+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
}
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
} }()
if Debug {
log.Logf("[ssu] %s >>> %s length: %d", sc.RemoteAddr(), dgram.Header.Addr.String(), len(dgram.Data)) if er != nil {
} errc <- er
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 { ...@@ -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)
if err != nil { n, addr, err := cc.ReadFrom(b)
errc <- err if err != nil {
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
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment