Skip to content

Commit 42f7e92

Browse files
committed
internal/mdns implementation
- Inspired from mdns_legacy - Remove mdns dependency on libp2p - Improve existing code to be safer and service oriented
1 parent e6044a8 commit 42f7e92

File tree

8 files changed

+317
-87
lines changed

8 files changed

+317
-87
lines changed

dot/network/mdns.go

Lines changed: 0 additions & 80 deletions
This file was deleted.

dot/network/service.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package network
66
import (
77
"context"
88
"errors"
9+
"fmt"
910
"math/big"
1011
"strings"
1112
"sync"
@@ -14,6 +15,7 @@ import (
1415
"github.com/ChainSafe/gossamer/dot/peerset"
1516
"github.com/ChainSafe/gossamer/dot/telemetry"
1617
"github.com/ChainSafe/gossamer/internal/log"
18+
"github.com/ChainSafe/gossamer/internal/mdns"
1719
"github.com/ChainSafe/gossamer/internal/metrics"
1820
"github.com/ChainSafe/gossamer/lib/common"
1921
"github.com/ChainSafe/gossamer/lib/services"
@@ -105,7 +107,7 @@ type Service struct {
105107

106108
cfg *Config
107109
host *host
108-
mdns *mdns
110+
mdns services.Service
109111
gossip *gossip
110112
bufPool *sync.Pool
111113
streamManager *streamManager
@@ -188,12 +190,20 @@ func NewService(cfg *Config) (*Service, error) {
188190
},
189191
}
190192

193+
serviceTag := string(host.protocolID)
194+
notifee := mdns.NewNotifeeTracker(host.p2pHost.Peerstore(), host.cm.peerSetHandler)
195+
mdnsLogger := log.NewFromGlobal(log.AddContext("module", "mdns"))
196+
mdnsLogger.Debugf(
197+
"Creating mDNS discovery service with host %s and protocol %s...",
198+
host.id(), host.protocolID)
199+
mdnsService := mdns.NewService(host.p2pHost, serviceTag, mdnsLogger, notifee)
200+
191201
network := &Service{
192202
ctx: ctx,
193203
cancel: cancel,
194204
cfg: cfg,
195205
host: host,
196-
mdns: newMDNS(host),
206+
mdns: mdnsService,
197207
gossip: newGossip(),
198208
blockState: cfg.BlockState,
199209
transactionHandler: cfg.TransactionHandler,
@@ -305,7 +315,10 @@ func (s *Service) Start() error {
305315
s.startPeerSetHandler()
306316

307317
if !s.noMDNS {
308-
s.mdns.start()
318+
err = s.mdns.Start()
319+
if err != nil {
320+
return fmt.Errorf("starting mDNS service: %w", err)
321+
}
309322
}
310323

311324
if !s.noDiscover {
@@ -445,7 +458,7 @@ func (s *Service) Stop() error {
445458
s.cancel()
446459

447460
// close mDNS discovery service
448-
err := s.mdns.close()
461+
err := s.mdns.Stop()
449462
if err != nil {
450463
logger.Errorf("Failed to close mDNS discovery service: %s", err)
451464
}

go.mod

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ require (
119119
github.com/libp2p/go-openssl v0.0.7 // indirect
120120
github.com/libp2p/go-reuseport v0.2.0 // indirect
121121
github.com/libp2p/go-yamux/v3 v3.1.2 // indirect
122-
github.com/libp2p/zeroconf/v2 v2.1.1 // indirect
123122
github.com/lucas-clemente/quic-go v0.27.1 // indirect
124123
github.com/marten-seemann/qtls-go1-16 v0.1.5 // indirect
125124
github.com/marten-seemann/qtls-go1-17 v0.1.1 // indirect
@@ -170,7 +169,7 @@ require (
170169
github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce // indirect
171170
github.com/vedhavyas/go-subkey v1.0.3 // indirect
172171
github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect
173-
github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9 // indirect
172+
github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9
174173
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 // indirect
175174
go.opencensus.io v0.23.0 // indirect
176175
go.uber.org/atomic v1.9.0 // indirect

go.sum

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,6 @@ github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPAN
711711
github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo=
712712
github.com/libp2p/go-yamux/v3 v3.1.2 h1:lNEy28MBk1HavUAlzKgShp+F6mn/ea1nDYWftZhFW9Q=
713713
github.com/libp2p/go-yamux/v3 v3.1.2/go.mod h1:jeLEQgLXqE2YqX1ilAClIfCMDY+0uXQUKmmb/qp0gT4=
714-
github.com/libp2p/zeroconf/v2 v2.1.1 h1:XAuSczA96MYkVwH+LqqqCUZb2yH3krobMJ1YE+0hG2s=
715714
github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs=
716715
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
717716
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=

internal/mdns/dialable.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Copyright 2022 ChainSafe Systems (ON)
2+
// SPDX-License-Identifier: LGPL-3.0-only
3+
4+
package mdns
5+
6+
import (
7+
"errors"
8+
"fmt"
9+
"net"
10+
11+
manet "github.com/multiformats/go-multiaddr/net"
12+
)
13+
14+
var (
15+
ErrTCPListenAddressNotFound = errors.New("TCP listen address not found")
16+
)
17+
18+
func getMDNSIPsAndPort(p2pHost Networker) (ips []net.IP, port uint16, err error) {
19+
tcpAddresses, err := getDialableListenAddrs(p2pHost)
20+
if err != nil {
21+
return nil, 0, fmt.Errorf("getting dialable listen addresses: %w", err)
22+
}
23+
24+
ips = make([]net.IP, len(tcpAddresses))
25+
for i := range tcpAddresses {
26+
ips[i] = tcpAddresses[i].IP
27+
}
28+
port = uint16(tcpAddresses[0].Port)
29+
30+
return ips, port, nil
31+
}
32+
33+
func getDialableListenAddrs(p2pHost Networker) (tcpAddresses []*net.TCPAddr, err error) {
34+
multiAddresses, err := p2pHost.Network().InterfaceListenAddresses()
35+
if err != nil {
36+
return nil, fmt.Errorf("listing host interface listen addresses: %w", err)
37+
}
38+
39+
tcpAddresses = make([]*net.TCPAddr, 0, len(multiAddresses))
40+
for _, multiAddress := range multiAddresses {
41+
netAddress, err := manet.ToNetAddr(multiAddress)
42+
if err != nil {
43+
continue
44+
}
45+
46+
tcpAddress, ok := netAddress.(*net.TCPAddr)
47+
if !ok {
48+
continue
49+
}
50+
51+
tcpAddresses = append(tcpAddresses, tcpAddress)
52+
}
53+
54+
if len(tcpAddresses) == 0 {
55+
return nil, fmt.Errorf("%w: in %d multiaddresses", ErrTCPListenAddressNotFound, len(multiAddresses))
56+
}
57+
58+
return tcpAddresses, nil
59+
}

internal/mdns/interfaces.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright 2022 ChainSafe Systems (ON)
2+
// SPDX-License-Identifier: LGPL-3.0-only
3+
4+
package mdns
5+
6+
import (
7+
"github.com/libp2p/go-libp2p-core/network"
8+
"github.com/libp2p/go-libp2p-core/peer"
9+
)
10+
11+
// Logger is a logger interface for the mDNS service.
12+
type Logger interface {
13+
Debugf(format string, args ...any)
14+
Warnf(format string, args ...any)
15+
}
16+
17+
// IDNetworker can return the peer ID and a network interface.
18+
type IDNetworker interface {
19+
ID() peer.ID
20+
Networker
21+
}
22+
23+
// Networker can return a network interface.
24+
type Networker interface {
25+
Network() network.Network
26+
}

0 commit comments

Comments
 (0)