Skip to content

Commit

Permalink
fix: use custom mdns service to set custom network interfaces
Browse files Browse the repository at this point in the history
this is mainly a fix to use android specific method to get network interfaces on
android
related: https://developer.android.com/about/versions/10/non-sdk-q?hl=de

Signed-off-by: gfanton <8671905+gfanton@users.noreply.github.com>
  • Loading branch information
gfanton committed Jan 26, 2022
1 parent 49dc3a8 commit fc11fbc
Show file tree
Hide file tree
Showing 12 changed files with 540 additions and 85 deletions.
5 changes: 3 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ require (
github.com/libp2p/go-libp2p-rendezvous v0.0.0-00010101000000-000000000000
github.com/libp2p/go-libp2p-transport-upgrader v0.6.0
github.com/libp2p/go-tcp-transport v0.4.0
github.com/libp2p/zeroconf/v2 v2.1.1
github.com/markbates/pkger v0.17.1
github.com/mdomke/git-semver/v5 v5.0.0
github.com/mdp/qrterminal v1.0.1
Expand Down Expand Up @@ -121,11 +122,11 @@ require (

replace (
bazil.org/fuse => bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc // specific version for iOS building

github.com/agl/ed25519 => github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 // latest commit before the author shutdown the repo; see https://github.com/golang/go/issues/20504

github.com/libp2p/go-libp2p-rendezvous => github.com/berty/go-libp2p-rendezvous v0.0.0-20211013085524-09965cd64781 // use berty fork of go-libp2p-rendezvous with sqlcipher support
github.com/multiformats/go-multiaddr => github.com/berty/go-multiaddr v0.4.2-0.20211217161528-bfc4488c5ae9 // tmp, required for Android SDK30

github.com/multiformats/go-multiaddr => github.com/berty/go-multiaddr v0.4.2-0.20220126184027-53e56f02fb68 // tmp, required for Android SDK30
github.com/mutecomm/go-sqlcipher/v4 => github.com/berty/go-sqlcipher/v4 v4.0.0-20211104165006-2c524b646cf0
github.com/peterbourgon/ff/v3 => github.com/moul/ff/v3 v3.0.1 // temporary, see https://github.com/peterbourgon/ff/pull/67, https://github.com/peterbourgon/ff/issues/68
golang.org/x/mobile => github.com/aeddi/mobile v0.0.3-silicon // temporary, see https://github.com/golang/mobile/pull/58
Expand Down
4 changes: 2 additions & 2 deletions go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 5 additions & 3 deletions go/framework/bertybridge/bridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (

"berty.tech/berty/v2/go/internal/grpcutil"
"berty.tech/berty/v2/go/internal/initutil"
"berty.tech/berty/v2/go/internal/ipfsutil"
"berty.tech/berty/v2/go/internal/lifecycle"
"berty.tech/berty/v2/go/internal/notification"
proximity "berty.tech/berty/v2/go/internal/proximitytransport"
Expand Down Expand Up @@ -89,10 +90,11 @@ func NewBridge(config *Config) (*Bridge, error) {
// setup netdriver
{
if config.netDriver != nil {
inet := &inetAddrs{
netaddrs: config.netDriver,
logger: b.logger,
inet := &inet{
net: config.netDriver,
logger: b.logger,
}
ipfsutil.SetNetDriver(inet)
manet.SetNetInterface(inet)
}
}
Expand Down
92 changes: 82 additions & 10 deletions go/framework/bertybridge/driver_net.go
Original file line number Diff line number Diff line change
@@ -1,30 +1,34 @@
package bertybridge

import (
"fmt"
"net"
"runtime"
"strings"

"go.uber.org/zap"

"berty.tech/berty/v2/go/pkg/osversion"
)

type NativeNetDriver interface {
InterfaceAddrs() (*NetAddrs, error)
Interfaces() (*NetInterfaces, error)
}

type inetAddrs struct {
netaddrs NativeNetDriver
logger *zap.Logger
type inet struct {
net NativeNetDriver
logger *zap.Logger
}

func (ia *inetAddrs) InterfaceAddrs() ([]net.Addr, error) {
if runtime.GOOS != "android" || osversion.GetVersion().Major() < 30 {
return net.InterfaceAddrs()
func (ia *inet) Interfaces() ([]net.Interface, error) {
ifaces, err := ia.net.Interfaces()
if err != nil {
return nil, err
}

na, err := ia.netaddrs.InterfaceAddrs()
return ifaces.Interfaces(), nil
}

func (ia *inet) InterfaceAddrs() ([]net.Addr, error) {
na, err := ia.net.InterfaceAddrs()
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -62,6 +66,74 @@ func (ia *inetAddrs) InterfaceAddrs() ([]net.Addr, error) {
return addrs, nil
}

type NetInterfaces struct {
ifaces []*NetInterface
}

func (n *NetInterfaces) Interfaces() []net.Interface {
ifaces := make([]net.Interface, len(n.ifaces))
for i, iface := range n.ifaces {
ifaces[i] = iface.Interface()
}
return ifaces
}

func (n *NetInterfaces) Append(i *NetInterface) {
n.ifaces = append(n.ifaces, i)
}

const (
NetFlagUp int = iota // interface is up
NetFlagBroadcast // interface supports broadcast access capability
NetFlagLoopback // interface is a loopback interface
NetFlagPointToPoint // interface belongs to a point-to-point link
NetFlagMulticast // interface supports multicast access capability
)

type NetInterface struct {
Index int // positive integer that starts at one, zero is never used
MTU int // maximum transmission unit
Name string // e.g., "en0", "lo0", "eth0.100"
Addrs *NetAddrs // InterfaceAddresses

hardwareaddr []byte // IEEE MAC-48, EUI-48 and EUI-64 form
flags net.Flags // e.g., FlagUp, FlagLoopback, FlagMulticast
}

func (n *NetInterface) CopyHardwareAddr(addr []byte) {
n.hardwareaddr = make([]byte, len(n.hardwareaddr))
copy(n.hardwareaddr, addr)
}

func (n *NetInterface) Interface() net.Interface {
return net.Interface{
Index: n.Index,
MTU: n.MTU,
Name: n.Name,
HardwareAddr: n.hardwareaddr,
Flags: n.flags,
}
}

func (n *NetInterface) AddFlag(flag int) (err error) {
switch flag {
case NetFlagUp:
n.flags |= net.FlagUp
case NetFlagBroadcast:
n.flags |= net.FlagBroadcast
case NetFlagLoopback:
n.flags |= net.FlagLoopback
case NetFlagPointToPoint:
n.flags |= net.FlagPointToPoint
case NetFlagMulticast:
n.flags |= net.FlagMulticast
default:
err = fmt.Errorf("failed to add unknown flag to net interface: %d", flag)
}

return
}

type NetAddrs struct {
addrs []string
}
Expand Down
18 changes: 15 additions & 3 deletions go/internal/initutil/ipfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,19 @@ func (m *Manager) getLocalIPFS() (ipfsutil.ExtendedCoreAPI, *ipfs_core.IpfsNode,
}
m.Node.Protocol.ipfsNode = mnode.IpfsNode

// setup mdns
if m.Node.Protocol.MDNS.Enable && !m.Node.Protocol.DisableIPFSNetwork {
h := mnode.PeerHost()
dh := ipfsutil.DiscoveryHandler(ctx, logger, h)
mdnsService := ipfsutil.NewMdnsService(logger, h, ipfsutil.MDNSServiceName, dh)
logger.Named("mdns").Info("starting mdns")
if err := mdnsService.Start(); err != nil {
return nil, nil, errcode.ErrIPFSInit.Wrap(err)
}

m.Node.Protocol.mdnsService = mdnsService
}

// init extended api
m.Node.Protocol.ipfsAPI, err = ipfsutil.NewExtendedCoreAPIFromNode(mnode.IpfsNode)
if err != nil {
Expand Down Expand Up @@ -468,8 +481,8 @@ func (m *Manager) setupIPFSConfig(cfg *ipfs_cfg.Config) ([]libp2p.Option, error)
}
}

// localdisc driver
cfg.Discovery.MDNS.Enabled = m.Node.Protocol.MDNS.Enable
// enable mdns
cfg.Discovery.MDNS.Enabled = false

// enable auto relay
if m.Node.Protocol.AutoRelay {
Expand Down Expand Up @@ -622,7 +635,6 @@ func (m *Manager) configIPFSRouting(h host.Host, r p2p_routing.Routing) error {

// pubsub.DiscoveryPollInterval = m.Node.Protocol.PollInterval
m.Node.Protocol.pubsub, err = pubsub.NewGossipSub(m.getContext(), h, popts...)

if err != nil {
return errcode.ErrIPFSSetupHost.Wrap(err)
}
Expand Down
9 changes: 9 additions & 0 deletions go/internal/initutil/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
datastore "github.com/ipfs/go-datastore"
"github.com/ipfs/go-ipfs/core"
pubsub "github.com/libp2p/go-libp2p-pubsub"
p2p_mdns "github.com/libp2p/go-libp2p/p2p/discovery/mdns"
"github.com/oklog/run"
"github.com/prometheus/client_golang/prometheus"
"github.com/shibukawa/configdir"
Expand Down Expand Up @@ -110,6 +111,7 @@ type Manager struct {
MDNS struct {
Enable bool `json:"Enable,omitempty"`
DriverLocker sync.Locker
NetAddrs ipfsutil.NetAddrs
} `json:"MDNS,omitempty"`
Ble struct {
Enable bool `json:"Enable,omitempty"`
Expand Down Expand Up @@ -138,6 +140,7 @@ type Manager struct {
needAuth bool
ipfsNode *core.IpfsNode
ipfsAPI ipfsutil.ExtendedCoreAPI
mdnsService p2p_mdns.Service
pubsub *pubsub.PubSub
discovery tinder.Service
server bertyprotocol.Service
Expand Down Expand Up @@ -315,6 +318,7 @@ func (m *Manager) Close(prog *progress.Progress) error {
prog.AddStep("cleanup-replication-db")
prog.AddStep("close-protocol-server")
prog.AddStep("close-tinder-service")
prog.AddStep("close-mdns-service")
prog.AddStep("close-ipfs-node")
prog.AddStep("close-datastore")
prog.AddStep("close-ring")
Expand Down Expand Up @@ -376,6 +380,11 @@ func (m *Manager) Close(prog *progress.Progress) error {
m.Node.Protocol.discovery.Close()
}

prog.Get("close-mdns-service").SetAsCurrent()
if m.Node.Protocol.mdnsService != nil {
m.Node.Protocol.mdnsService.Close()
}

prog.Get("close-ipfs-node").SetAsCurrent()
if m.Node.Protocol.ipfsNode != nil {
m.Node.Protocol.ipfsNode.Close()
Expand Down

0 comments on commit fc11fbc

Please sign in to comment.