Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
go-libp2p
Commits
08c8d6f7
Commit
08c8d6f7
authored
7 years ago
by
Jeromy Johnson
Committed by
GitHub
7 years ago
Browse files
Options
Download
Plain Diff
Merge pull request #197 from libp2p/feat/refactor-basichost-new
basichost: refactor BasicHost construction
parents
78dabda4
f0453a24
master
2018-Q4-OKR
feat/protobuf
feat/udp
fix/473
fix/no-custom-field
fix/reset-ping-stream
fix/revert-correct-external-addr
gx/update-jccl6u
gx/update-nza0mn
jenkinsfile
kevina/fix-go-vet
multistream-ping
punching
revert-276-update-go-detect-race
v6.0.23
v6.0.22
v6.0.21
v6.0.20
v6.0.19
v6.0.18
v6.0.17
v6.0.16
v6.0.15
v6.0.14
v6.0.13
v6.0.12
v6.0.11
v6.0.10
v6.0.9
v6.0.8
v6.0.7
v6.0.6
v6.0.5
v6.0.4
v6.0.3
v6.0.2
v6.0.1
v6.0.0
v5.0.21
v5.0.20
v5.0.19
v5.0.18
v5.0.17
v5.0.16
v5.0.15
v5.0.14
v5.0.13
v5.0.12
v5.0.11
v5.0.10
v5.0.9
v5.0.8
v5.0.7
v5.0.6
v5.0.5
v5.0.4
v5.0.3
v5.0.2
v5.0.1
v5.0.0
v4.5.5
v4.5.4
v4.5.3
v4.5.2
v4.5.1
v4.5.0
v4.4.5
v4.4.4
v4.4.3
v4.4.2
v4.4.1
v4.4.0
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
p2p/host/basic/basic_host.go
+101
-32
p2p/host/basic/basic_host.go
p2p/host/basic/natmgr.go
+6
-11
p2p/host/basic/natmgr.go
p2p/net/mock/mock_net.go
+4
-2
p2p/net/mock/mock_net.go
p2p/protocol/identify/id.go
+2
-0
p2p/protocol/identify/id.go
with
113 additions
and
45 deletions
+113
-45
p2p/host/basic/basic_host.go
View file @
08c8d6f7
...
...
@@ -21,23 +21,31 @@ import (
var
log
=
logging
.
Logger
(
"basichost"
)
var
NegotiateTimeout
=
time
.
Second
*
60
var
(
// DefaultNegotiationTimeout is the default value for HostOpts.NegotiationTimeout.
DefaultNegotiationTimeout
=
time
.
Second
*
60
// DefaultAddrsFactory is the default value for HostOpts.AddrsFactory.
DefaultAddrsFactory
=
func
(
addrs
[]
ma
.
Multiaddr
)
[]
ma
.
Multiaddr
{
return
addrs
}
)
// AddrsFactory functions can be passed to New in order to override
// addresses returned by Addrs.
type
AddrsFactory
func
([]
ma
.
Multiaddr
)
[]
ma
.
Multiaddr
// Option is a type used to pass in options to the host.
//
// Deprecated in favor of HostOpts and NewHost.
type
Option
int
const
(
//
NATPortMap makes the host attempt to open port-mapping in NAT devices
//
for all its listeners. Pass in this option in the constructor to
//
asynchronously a) find a gateway, b) open port mappings, c) republish
//
port mappings periodically. The NATed addresses are included in the
//
Host's Addrs() list.
NATPortMap
Option
=
iota
)
// NATPortMap makes the host attempt to open port-mapping in NAT devices
//
for all its listeners. Pass in this option in the constructor to
//
asynchronously a) find a gateway, b) open port mappings, c) republish
//
port mappings periodically. The NATed addresses are included in the
//
Host's Addrs() list.
//
// This option is deprecated in favor of HostOpts and NewHost.
const
NATPortMap
Option
=
iota
// BasicHost is the basic implementation of the host.Host interface. This
// particular host implementation:
...
...
@@ -51,55 +59,116 @@ type BasicHost struct {
natmgr
*
natManager
addrs
AddrsFactory
N
eg
otiateT
imeout
time
.
Duration
n
eg
t
imeout
time
.
Duration
proc
goprocess
.
Process
bwc
metrics
.
Reporter
}
// New constructs and sets up a new *BasicHost with given Network
func
New
(
net
inet
.
Network
,
opts
...
interface
{})
*
BasicHost
{
// HostOpts holds options that can be passed to NewHost in order to
// customize construction of the *BasicHost.
type
HostOpts
struct
{
// MultistreamMuxer is essential for the *BasicHost and will use a sensible default value if omitted.
MultistreamMuxer
*
msmux
.
MultistreamMuxer
// NegotiationTimeout determines the read and write timeouts on streams.
// If 0 or omitted, it will use DefaultNegotiationTimeout.
// If below 0, timeouts on streams will be deactivated.
NegotiationTimeout
time
.
Duration
// IdentifyService holds an implementation of the /ipfs/id/ protocol.
// If omitted, a new *identify.IDService will be used.
IdentifyService
*
identify
.
IDService
// AddrsFactory holds a function which can be used to override or filter the result of Addrs.
// If omitted, there's no override or filtering, and the results of Addrs and AllAddrs are the same.
AddrsFactory
AddrsFactory
// NATManager takes care of setting NAT port mappings, and discovering external addresses.
// If omitted, this will simply be disabled.
//
// TODO: Currently the NATManager can only be enabled by calling New,
// since the underlying struct and functions are still private.
// Once they are public, NATManager can be used through NewHost as well.
NATManager
*
natManager
//
BandwidthReporter
metrics
.
Reporter
}
// NewHost constructs a new *BasicHost and activates it by attaching its stream and connection handlers to the given inet.Network.
func
NewHost
(
net
inet
.
Network
,
opts
*
HostOpts
)
*
BasicHost
{
h
:=
&
BasicHost
{
network
:
net
,
mux
:
msmux
.
NewMultistreamMuxer
(),
NegotiateTimeout
:
NegotiateTimeout
,
network
:
net
,
mux
:
msmux
.
NewMultistreamMuxer
(),
negtimeout
:
DefaultNegotiationTimeout
,
addrs
:
DefaultAddrsFactory
,
}
if
opts
.
MultistreamMuxer
!=
nil
{
h
.
mux
=
opts
.
MultistreamMuxer
}
if
opts
.
IdentifyService
!=
nil
{
h
.
ids
=
opts
.
IdentifyService
}
else
{
// we can't set this as a default above because it depends on the *BasicHost.
h
.
ids
=
identify
.
NewIDService
(
h
)
}
if
uint64
(
opts
.
NegotiationTimeout
)
!=
0
{
h
.
negtimeout
=
opts
.
NegotiationTimeout
}
if
opts
.
AddrsFactory
!=
nil
{
h
.
addrs
=
opts
.
AddrsFactory
}
if
opts
.
NATManager
!=
nil
{
h
.
natmgr
=
opts
.
NATManager
}
if
opts
.
BandwidthReporter
!=
nil
{
h
.
bwc
=
opts
.
BandwidthReporter
h
.
ids
.
Reporter
=
opts
.
BandwidthReporter
}
h
.
proc
=
goprocess
.
WithTeardown
(
func
()
error
{
if
h
.
natmgr
!=
nil
{
h
.
natmgr
.
Close
()
}
return
h
.
Network
()
.
Close
()
})
// setup host services
h
.
ids
=
identify
.
NewIDService
(
h
)
net
.
SetConnHandler
(
h
.
newConnHandler
)
net
.
SetStreamHandler
(
h
.
newStreamHandler
)
return
h
}
// default addresses factory, can be overridden via opts argument
h
.
addrs
=
func
(
addrs
[]
ma
.
Multiaddr
)
[]
ma
.
Multiaddr
{
return
addrs
}
// New constructs and sets up a new *BasicHost with given Network and options.
// Three options can be passed: NATPortMap, AddrsFactory, and metrics.Reporter.
// This function is deprecated in favor of NewHost and HostOpts.
func
New
(
net
inet
.
Network
,
opts
...
interface
{})
*
BasicHost
{
hostopts
:=
&
HostOpts
{}
for
_
,
o
:=
range
opts
{
switch
o
:=
o
.
(
type
)
{
case
Option
:
switch
o
{
case
NATPortMap
:
h
.
natmg
r
=
newNatManager
(
h
)
h
ostopts
.
NATManage
r
=
newNatManager
(
net
)
}
case
metrics
.
Reporter
:
h
.
bwc
=
o
h
ostopts
.
BandwidthReporter
=
o
case
AddrsFactory
:
h
.
addrs
=
AddrsFactory
(
o
)
h
ostopts
.
AddrsFactory
=
AddrsFactory
(
o
)
}
}
h
.
ids
.
Reporter
=
h
.
bwc
net
.
SetConnHandler
(
h
.
newConnHandler
)
net
.
SetStreamHandler
(
h
.
newStreamHandler
)
return
h
return
NewHost
(
net
,
hostopts
)
}
// newConnHandler is the remote-opened conn handler for inet.Network
...
...
@@ -115,8 +184,8 @@ func (h *BasicHost) newConnHandler(c inet.Conn) {
func
(
h
*
BasicHost
)
newStreamHandler
(
s
inet
.
Stream
)
{
before
:=
time
.
Now
()
if
h
.
N
eg
o
ti
ateTi
meout
!=
0
{
if
err
:=
s
.
SetDeadline
(
time
.
Now
()
.
Add
(
h
.
N
eg
otiateT
imeout
));
err
!=
nil
{
if
h
.
n
egtimeout
>
0
{
if
err
:=
s
.
SetDeadline
(
time
.
Now
()
.
Add
(
h
.
n
eg
t
imeout
));
err
!=
nil
{
log
.
Error
(
"setting stream deadline: "
,
err
)
s
.
Close
()
return
...
...
@@ -144,7 +213,7 @@ func (h *BasicHost) newStreamHandler(s inet.Stream) {
rw
:
lzc
,
}
if
h
.
N
eg
o
ti
ateTi
meout
!=
0
{
if
h
.
n
egtimeout
>
0
{
if
err
:=
s
.
SetDeadline
(
time
.
Time
{});
err
!=
nil
{
log
.
Error
(
"resetting stream deadline: "
,
err
)
s
.
Close
()
...
...
This diff is collapsed.
Click to expand it.
p2p/host/basic/natmgr.go
View file @
08c8d6f7
...
...
@@ -19,7 +19,7 @@ import (
// as the network signals Listen() or ListenClose().
// * closing the natManager closes the nat and its mappings.
type
natManager
struct
{
host
*
BasicHost
net
inet
.
Network
natmu
sync
.
RWMutex
// guards nat (ready could obviate this mutex, but safety first.)
nat
*
inat
.
NAT
...
...
@@ -27,23 +27,18 @@ type natManager struct {
proc
goprocess
.
Process
// natManager has a process + children. can be closed.
}
func
newNatManager
(
host
*
BasicHost
)
*
natManager
{
func
newNatManager
(
net
inet
.
Network
)
*
natManager
{
nmgr
:=
&
natManager
{
hos
t
:
hos
t
,
ne
t
:
ne
t
,
ready
:
make
(
chan
struct
{}),
proc
:
goprocess
.
WithParent
(
host
.
proc
),
}
// teardown
nmgr
.
proc
=
goprocess
.
WithTeardown
(
func
()
error
{
// on closing, unregister from network notifications.
host
.
Network
()
.
StopNotify
((
*
nmgrNetNotifiee
)(
nmgr
))
net
.
StopNotify
((
*
nmgrNetNotifiee
)(
nmgr
))
return
nil
})
// host is our parent. close when host closes.
host
.
proc
.
AddChild
(
nmgr
.
proc
)
// discover the nat.
nmgr
.
discoverNAT
()
return
nmgr
...
...
@@ -108,13 +103,13 @@ func (nmgr *natManager) discoverNAT() {
// sign natManager up for network notifications
// we need to sign up here to avoid missing some notifs
// before the NAT has been found.
nmgr
.
host
.
Network
()
.
Notify
((
*
nmgrNetNotifiee
)(
nmgr
))
nmgr
.
net
.
Notify
((
*
nmgrNetNotifiee
)(
nmgr
))
// if any interfaces were brought up while we were setting up
// the nat, now is the time to setup port mappings for them.
// we release ready, then grab them to avoid losing any. adding
// a port mapping is idempotent, so its ok to add the same twice.
addrs
:=
nmgr
.
host
.
Network
()
.
ListenAddresses
()
addrs
:=
nmgr
.
net
.
ListenAddresses
()
for
_
,
addr
:=
range
addrs
{
// we do it async because it's slow and we may want to close beforehand
go
addPortMapping
(
nmgr
,
addr
)
...
...
This diff is collapsed.
Click to expand it.
p2p/net/mock/mock_net.go
View file @
08c8d6f7
...
...
@@ -84,8 +84,10 @@ func (mn *mocknet) AddPeerWithPeerstore(p peer.ID, ps pstore.Peerstore) (host.Ho
return
nil
,
err
}
h
:=
bhost
.
New
(
n
)
h
.
NegotiateTimeout
=
0
opts
:=
&
bhost
.
HostOpts
{
NegotiationTimeout
:
-
1
,
}
h
:=
bhost
.
NewHost
(
n
,
opts
)
mn
.
proc
.
AddChild
(
n
.
proc
)
...
...
This diff is collapsed.
Click to expand it.
p2p/protocol/identify/id.go
View file @
08c8d6f7
...
...
@@ -55,6 +55,8 @@ type IDService struct {
observedAddrs
ObservedAddrSet
}
// NewIDService constructs a new *IDService and activates it by
// attaching its stream handler to the given host.Host.
func
NewIDService
(
h
host
.
Host
)
*
IDService
{
s
:=
&
IDService
{
Host
:
h
,
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help