Handle more PeerRemoteAddr variants when calculating dial addr
This should fix https://github.com/anacrolix/torrent/issues/820.
This commit is contained in:
parent
044be4820f
commit
3a92268f10
@ -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
|
||||||
|
33
peerconn.go
33
peerconn.go
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user