2
0
mirror of synced 2025-02-23 14:18:13 +00:00

Handle more PeerRemoteAddr variants when calculating dial addr

This should fix https://github.com/anacrolix/torrent/issues/820.
This commit is contained in:
Matt Joiner 2023-05-16 16:35:03 +10:00
parent 044be4820f
commit 3a92268f10
No known key found for this signature in database
GPG Key ID: 6B990B8185E7F782
2 changed files with 18 additions and 24 deletions

View File

@ -2,12 +2,15 @@ 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()
if ip4 == nil {
@ -32,9 +35,7 @@ func ipv6AddrPortFromKrpcNodeAddr(na krpc.NodeAddr) (_ netip.AddrPort, err error
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

View File

@ -1056,22 +1056,21 @@ func (c *PeerConn) pexPeerFlags() pp.PexPeerFlags {
// 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 netip.AddrPortFrom(addrPort.Addr(), uint16(c.PeerListenPort))
}
func (c *PeerConn) pexEvent(t pexEventType) pexEvent {
f := c.pexPeerFlags()
@ -1095,12 +1094,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) {
dialAddr := pc.dialAddr()
return addrPortFromPeerRemoteAddr(dialAddr)