From c50bafa18771d6b013050805ede84a590c278119 Mon Sep 17 00:00:00 2001 From: Tobiasz Laskowski Date: Sat, 15 Mar 2025 19:12:17 +0000 Subject: [PATCH] feat: support overriding net interface methods The builtin methods are broken on android. This patch allows users to provide their own implementation of these methods. --- core/network/net_provider.go | 32 ++++++++++++++++++++++++++++++ p2p/discovery/mdns/mdns.go | 8 +++++++- p2p/host/basic/addrs_manager.go | 8 +++++++- p2p/net/nat/internal/nat/natpmp.go | 3 ++- p2p/net/nat/internal/nat/upnp.go | 3 ++- p2p/net/swarm/swarm_addr.go | 14 ++++++++++++- 6 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 core/network/net_provider.go diff --git a/core/network/net_provider.go b/core/network/net_provider.go new file mode 100644 index 0000000000..a371f86cb8 --- /dev/null +++ b/core/network/net_provider.go @@ -0,0 +1,32 @@ +package network + +import "net" + +type NetProvider interface { + Interfaces() ([]net.Interface, error) + InterfaceAddrs() ([]net.Addr, error) +} + +type defaultNetProvider struct{} + +func (defaultNetProvider) Interfaces() ([]net.Interface, error) { + return net.Interfaces() +} + +func (defaultNetProvider) InterfaceAddrs() ([]net.Addr, error) { + return net.InterfaceAddrs() +} + +var netProvider NetProvider = defaultNetProvider{} + +func Interfaces() ([]net.Interface, error) { + return netProvider.Interfaces() +} + +func InterfaceAddrs() ([]net.Addr, error) { + return netProvider.InterfaceAddrs() +} + +func SetNetProvider(provider NetProvider) { + netProvider = provider +} diff --git a/p2p/discovery/mdns/mdns.go b/p2p/discovery/mdns/mdns.go index 637fcdcb08..21daddfeee 100644 --- a/p2p/discovery/mdns/mdns.go +++ b/p2p/discovery/mdns/mdns.go @@ -9,6 +9,7 @@ import ( "sync" "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/zeroconf/v2" @@ -133,6 +134,11 @@ func (s *mdnsService) startServer() error { return err } + interfaces, err := network.Interfaces() + if err != nil { + return err + } + server, err := zeroconf.RegisterProxy( s.peerName, s.serviceName, @@ -141,7 +147,7 @@ func (s *mdnsService) startServer() error { s.peerName, ips, txts, - nil, + interfaces, ) if err != nil { return err diff --git a/p2p/host/basic/addrs_manager.go b/p2p/host/basic/addrs_manager.go index 6b984a9dd5..2f75f8aac0 100644 --- a/p2p/host/basic/addrs_manager.go +++ b/p2p/host/basic/addrs_manager.go @@ -516,7 +516,13 @@ func (i *interfaceAddrsCache) updateUnlocked() { } // Resolve the interface addresses - ifaceAddrs, err := manet.InterfaceMultiaddrs() + var ifaceAddrs []ma.Multiaddr + var err error + var addrs []net.Addr + if addrs, err = network.InterfaceAddrs(); err != nil { + ifaceAddrs, err = manet.InterfaceMultiaddrsFor(addrs) + } + if err != nil { // This usually shouldn't happen, but we could be in some kind // of funky restricted environment. diff --git a/p2p/net/nat/internal/nat/natpmp.go b/p2p/net/nat/internal/nat/natpmp.go index bffc0a99f2..1914f4dbec 100644 --- a/p2p/net/nat/internal/nat/natpmp.go +++ b/p2p/net/nat/internal/nat/natpmp.go @@ -6,6 +6,7 @@ import ( "time" natpmp "github.com/jackpal/go-nat-pmp" + "github.com/libp2p/go-libp2p/core/network" ) var ( @@ -67,7 +68,7 @@ func (n *natpmpNAT) GetDeviceAddress() (addr net.IP, err error) { } func (n *natpmpNAT) GetInternalAddress() (addr net.IP, err error) { - ifaces, err := net.Interfaces() + ifaces, err := network.Interfaces() if err != nil { return nil, err } diff --git a/p2p/net/nat/internal/nat/upnp.go b/p2p/net/nat/internal/nat/upnp.go index 13d898e58d..a49b7e542d 100644 --- a/p2p/net/nat/internal/nat/upnp.go +++ b/p2p/net/nat/internal/nat/upnp.go @@ -11,6 +11,7 @@ import ( "github.com/huin/goupnp" "github.com/huin/goupnp/dcps/internetgateway1" "github.com/huin/goupnp/dcps/internetgateway2" + "github.com/libp2p/go-libp2p/core/network" "github.com/koron/go-ssdp" ) @@ -229,7 +230,7 @@ func (u *upnp_NAT) GetInternalAddress() (net.IP, error) { return nil, err } - ifaces, err := net.Interfaces() + ifaces, err := network.Interfaces() if err != nil { return nil, err } diff --git a/p2p/net/swarm/swarm_addr.go b/p2p/net/swarm/swarm_addr.go index b2e3e4e8aa..f5b16fb622 100644 --- a/p2p/net/swarm/swarm_addr.go +++ b/p2p/net/swarm/swarm_addr.go @@ -3,6 +3,7 @@ package swarm import ( "time" + "github.com/libp2p/go-libp2p/core/network" manet "github.com/multiformats/go-multiaddr/net" ma "github.com/multiformats/go-multiaddr" @@ -52,8 +53,19 @@ func (s *Swarm) InterfaceListenAddresses() ([]ma.Multiaddr, error) { listenAddres := s.listenAddressesNoLock() if len(listenAddres) > 0 { // We're actually listening on addresses. + var ifaceAddrs []ma.Multiaddr + if addrs, err := network.InterfaceAddrs(); err == nil { + ifaceAddrs, err = manet.InterfaceMultiaddrsFor(addrs) + if err != nil { + s.listeners.Unlock() // Lock early exit + return nil, err + } + } else { + s.listeners.Unlock() // Lock early exit + return nil, err + } var err error - ifaceListenAddres, err = manet.ResolveUnspecifiedAddresses(listenAddres, nil) + ifaceListenAddres, err = manet.ResolveUnspecifiedAddresses(listenAddres, ifaceAddrs) if err != nil { s.listeners.Unlock() // Lock early exit return nil, err