Skip to content
This repository has been archived by the owner on May 11, 2022. It is now read-only.

Emit events when NAT status changes #25

Merged
merged 1 commit into from
Jun 25, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 28 additions & 3 deletions autonat.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"sync"
"time"

"github.com/libp2p/go-libp2p-core/event"
"github.com/libp2p/go-libp2p-core/host"
"github.com/libp2p/go-libp2p-core/network"
"github.com/libp2p/go-libp2p-core/peer"
Expand Down Expand Up @@ -61,6 +62,10 @@ type AmbientAutoNAT struct {
// If only a single autoNAT peer is known, then the confidence increases
// for each failure until it reaches 3.
confidence int

emitUnknown event.Emitter
emitPublic event.Emitter
emitPrivate event.Emitter
}

// NewAutoNAT creates a new ambient NAT autodiscovery instance attached to a host
Expand All @@ -70,12 +75,20 @@ func NewAutoNAT(ctx context.Context, h host.Host, getAddrs GetAddrs) AutoNAT {
getAddrs = h.Addrs
}

emitUnknown, _ := h.EventBus().Emitter(new(event.EvtLocalRoutabilityUnknown))
emitPublic, _ := h.EventBus().Emitter(new(event.EvtLocalRoutabilityPublic))
emitPrivate, _ := h.EventBus().Emitter(new(event.EvtLocalRoutabilityPrivate))

as := &AmbientAutoNAT{
ctx: ctx,
host: h,
getAddrs: getAddrs,
peers: make(map[peer.ID][]ma.Multiaddr),
status: NATStatusUnknown,

emitUnknown: emitUnknown,
emitPublic: emitPublic,
emitPrivate: emitPrivate,
}

h.Network().Notify(as)
Expand All @@ -90,6 +103,18 @@ func (as *AmbientAutoNAT) Status() NATStatus {
return as.status
}

func (as *AmbientAutoNAT) updateStatus(s NATStatus) {
as.status = s
switch s {
case NATStatusUnknown:
as.emitUnknown.Emit(event.EvtLocalRoutabilityUnknown{})
raulk marked this conversation as resolved.
Show resolved Hide resolved
case NATStatusPublic:
as.emitPublic.Emit(event.EvtLocalRoutabilityPublic{})
case NATStatusPrivate:
as.emitPrivate.Emit(event.EvtLocalRoutabilityPrivate{})
}
}

func (as *AmbientAutoNAT) PublicAddr() (ma.Multiaddr, error) {
as.mx.Lock()
defer as.mx.Unlock()
Expand Down Expand Up @@ -194,7 +219,7 @@ func (as *AmbientAutoNAT) autodetect() {
} else if as.confidence < 3 {
as.confidence++
}
as.status = NATStatusPublic
as.updateStatus(NATStatusPublic)
as.addr = result.pubaddr
} else if result.private > 0 {
log.Debugf("NAT status is private")
Expand All @@ -204,14 +229,14 @@ func (as *AmbientAutoNAT) autodetect() {
} else if as.confidence < 3 {
as.confidence++
}
as.status = NATStatusPrivate
as.updateStatus(NATStatusPrivate)
as.addr = nil
} else if as.confidence > 0 {
// don't just flip to unknown, reduce confidence first
as.confidence--
} else {
log.Debugf("NAT status is unknown")
as.status = NATStatusUnknown
as.updateStatus(NATStatusUnknown)
as.addr = nil
}
as.mx.Unlock()
Expand Down
5 changes: 3 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ module github.com/libp2p/go-libp2p-autonat
require (
github.com/gogo/protobuf v1.2.1
github.com/ipfs/go-log v0.0.1
github.com/libp2p/go-libp2p-blankhost v0.1.1
github.com/libp2p/go-libp2p-core v0.0.1
github.com/libp2p/go-libp2p-blankhost v0.1.3
github.com/libp2p/go-libp2p-core v0.0.7-0.20190625152430-2d804c17fb6e
github.com/libp2p/go-libp2p-peerstore v0.1.2-0.20190621130618-cfa9bb890c1a
github.com/libp2p/go-libp2p-swarm v0.1.0
github.com/multiformats/go-multiaddr v0.0.4
)
Loading