netip-addrport.go | 9 +++++---- peerconn.go | 33 +++++++++++++-------------------- diff --git a/netip-addrport.go b/netip-addrport.go index cf9edfd5ed753e001e9f9d4713753be35c5d9e8e..4e2dc94d2b3686997d60b8924005064d849d8a90 100644 --- a/netip-addrport.go +++ b/netip-addrport.go @@ -2,11 +2,14 @@ package torrent import ( "fmt" - "net" "net/netip" "github.com/anacrolix/dht/v2/krpc" ) + +type addrPorter interface { + AddrPort() netip.AddrPort +} func ipv4AddrPortFromKrpcNodeAddr(na krpc.NodeAddr) (_ netip.AddrPort, err error) { ip4 := na.IP.To4() @@ -32,9 +35,7 @@ } func addrPortFromPeerRemoteAddr(pra PeerRemoteAddr) (netip.AddrPort, error) { switch v := pra.(type) { - case *net.TCPAddr: - return v.AddrPort(), nil - case *net.UDPAddr: + case addrPorter: return v.AddrPort(), nil case netip.AddrPort: return v, nil diff --git a/peerconn.go b/peerconn.go index 1443a7b9a7afaf7fe86c4f8ea9247b367c8cd0a9..9915758332b7ca1408e58fd566008e3bba224e19 100644 --- a/peerconn.go +++ b/peerconn.go @@ -1056,21 +1056,20 @@ // This returns the address to use if we want to dial the peer again. It incorporates the peer's // advertised listen port. func (c *PeerConn) dialAddr() PeerRemoteAddr { - if !c.outgoing && c.PeerListenPort != 0 { - switch addr := c.RemoteAddr.(type) { - case *net.TCPAddr: - dialAddr := *addr - dialAddr.Port = c.PeerListenPort - return &dialAddr - case *net.UDPAddr: - dialAddr := *addr - dialAddr.Port = c.PeerListenPort - return &dialAddr - default: - panic(addr) - } + if c.outgoing || c.PeerListenPort == 0 { + return c.RemoteAddr + } + addrPort, err := addrPortFromPeerRemoteAddr(c.RemoteAddr) + if err != nil { + c.logger.Levelf( + log.Warning, + "error parsing %q for alternate dial port: %v", + c.RemoteAddr, + err, + ) + return c.RemoteAddr } - return c.RemoteAddr + return netip.AddrPortFrom(addrPort.Addr(), uint16(c.PeerListenPort)) } func (c *PeerConn) pexEvent(t pexEventType) pexEvent { @@ -1093,12 +1092,6 @@ } func (pc *PeerConn) remoteIsTransmission() bool { return bytes.HasPrefix(pc.PeerID[:], []byte("-TR")) && pc.PeerID[7] == '-' -} - -func (pc *PeerConn) remoteAddrPort() Option[netip.AddrPort] { - return Some(pc.conn.RemoteAddr().(interface { - AddrPort() netip.AddrPort - }).AddrPort()) } func (pc *PeerConn) remoteDialAddrPort() (netip.AddrPort, error) {