@@ -16,7 +16,6 @@ import (
1616 "github.com/sagernet/sing/common/control"
1717 E "github.com/sagernet/sing/common/exceptions"
1818 M "github.com/sagernet/sing/common/metadata"
19-
2019 "golang.org/x/net/ipv4"
2120 "golang.org/x/net/ipv6"
2221)
@@ -59,28 +58,27 @@ func (c *Conn) isLinuxUnprivileged() bool {
5958func (c * Conn ) ReadIP (buffer * buf.Buffer ) error {
6059 if c .destination .Is6 () || c .isLinuxUnprivileged () {
6160 var readMsg func (b , oob []byte ) (n , oobn int , addr netip.Addr , err error )
62- switch conn := c .conn .(type ) {
63- case * net.IPConn :
61+ if ipConn , isIPConn := common.Cast [* net.IPConn ](c .conn ); isIPConn {
6462 readMsg = func (b , oob []byte ) (n , oobn int , addr netip.Addr , err error ) {
6563 var ipAddr * net.IPAddr
66- n , oobn , _ , ipAddr , err = conn .ReadMsgIP (b , oob )
64+ n , oobn , _ , ipAddr , err = ipConn .ReadMsgIP (b , oob )
6765 if err == nil {
6866 addr = M .AddrFromNet (ipAddr )
6967 }
7068 return
7169 }
72- case * net.UDPConn :
70+ } else if udpConn , isUDPConn := common. Cast [ * net.UDPConn ]( c . conn ); isUDPConn {
7371 readMsg = func (b , oob []byte ) (n , oobn int , addr netip.Addr , err error ) {
7472 var addrPort netip.AddrPort
75- n , oobn , _ , addrPort , err = conn .ReadMsgUDPAddrPort (b , oob )
73+ n , oobn , _ , addrPort , err = udpConn .ReadMsgUDPAddrPort (b , oob )
7674 if err == nil {
7775 addr = addrPort .Addr ()
7876 }
7977 return
8078 }
81- case * UnprivilegedConn :
82- readMsg = conn .ReadMsg
83- default :
79+ } else if unprivilegedConn , isUnprivilegedConn := c . conn .( * UnprivilegedConn ); isUnprivilegedConn {
80+ readMsg = unprivilegedConn .ReadMsg
81+ } else {
8482 return E .New ("unsupported conn type: " , reflect .TypeOf (c .conn ))
8583 }
8684 if ! c .destination .Is6 () {
0 commit comments