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 ( import (
"fmt" "fmt"
"net"
"net/netip" "net/netip"
"github.com/anacrolix/dht/v2/krpc" "github.com/anacrolix/dht/v2/krpc"
) )
type addrPorter interface {
AddrPort() netip.AddrPort
}
func ipv4AddrPortFromKrpcNodeAddr(na krpc.NodeAddr) (_ netip.AddrPort, err error) { func ipv4AddrPortFromKrpcNodeAddr(na krpc.NodeAddr) (_ netip.AddrPort, err error) {
ip4 := na.IP.To4() ip4 := na.IP.To4()
if ip4 == nil { if ip4 == nil {
@ -32,9 +35,7 @@ func ipv6AddrPortFromKrpcNodeAddr(na krpc.NodeAddr) (_ netip.AddrPort, err error
func addrPortFromPeerRemoteAddr(pra PeerRemoteAddr) (netip.AddrPort, error) { func addrPortFromPeerRemoteAddr(pra PeerRemoteAddr) (netip.AddrPort, error) {
switch v := pra.(type) { switch v := pra.(type) {
case *net.TCPAddr: case addrPorter:
return v.AddrPort(), nil
case *net.UDPAddr:
return v.AddrPort(), nil return v.AddrPort(), nil
case netip.AddrPort: case netip.AddrPort:
return v, nil return v, nil

View File

@ -1056,21 +1056,20 @@ 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 // This returns the address to use if we want to dial the peer again. It incorporates the peer's
// advertised listen port. // advertised listen port.
func (c *PeerConn) dialAddr() PeerRemoteAddr { func (c *PeerConn) dialAddr() PeerRemoteAddr {
if !c.outgoing && c.PeerListenPort != 0 { if c.outgoing || c.PeerListenPort == 0 {
switch addr := c.RemoteAddr.(type) { return c.RemoteAddr
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)
}
} }
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 { func (c *PeerConn) pexEvent(t pexEventType) pexEvent {
@ -1095,12 +1094,6 @@ func (pc *PeerConn) remoteIsTransmission() bool {
return bytes.HasPrefix(pc.PeerID[:], []byte("-TR")) && pc.PeerID[7] == '-' 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) { func (pc *PeerConn) remoteDialAddrPort() (netip.AddrPort, error) {
dialAddr := pc.dialAddr() dialAddr := pc.dialAddr()
return addrPortFromPeerRemoteAddr(dialAddr) return addrPortFromPeerRemoteAddr(dialAddr)