Skip to content

Commit 26be225

Browse files
committed
Sequential upnp queries
1 parent 1a4763f commit 26be225

File tree

1 file changed

+31
-28
lines changed
  • p2p/net/nat/internal/nat

1 file changed

+31
-28
lines changed

p2p/net/nat/internal/nat/nat.go

+31-28
Original file line numberDiff line numberDiff line change
@@ -55,46 +55,42 @@ type NAT interface {
5555

5656
// discoverNATs returns all NATs discovered in the network.
5757
func discoverNATs(ctx context.Context) ([]NAT, []error) {
58-
var nats []NAT
59-
var errs []error
60-
6158
type natsAndErrs struct {
6259
nats []NAT
6360
errs []error
6461
}
65-
resCh := make(chan natsAndErrs)
62+
upnpCh := make(chan natsAndErrs)
63+
pmpCh := make(chan natsAndErrs)
6664

67-
var pendingJobs int
68-
69-
pendingJobs++
7065
go func() {
66+
defer close(upnpCh)
67+
68+
// We do these UPNP queries sequentially because some routers will fail to handle parallel requests.
7169
nats, errs := discoverUPNP_IG1(ctx)
72-
select {
73-
case resCh <- natsAndErrs{nats, errs}:
74-
case <-ctx.Done():
75-
}
76-
}()
7770

78-
pendingJobs++
79-
go func() {
80-
nats, errs := discoverUPNP_IG2(ctx)
81-
select {
82-
case resCh <- natsAndErrs{nats, errs}:
83-
case <-ctx.Done():
71+
// Do IG2 after IG1 so that its NAT devices will appear as "better" when we
72+
// find the best NAT to return below.
73+
n, e := discoverUPNP_IG2(ctx)
74+
nats = append(nats, n...)
75+
errs = append(errs, e...)
76+
77+
if len(nats) == 0 {
78+
// We don't have a NAT. We should try querying all devices over
79+
// SSDP to find a InternetGatewayDevice. This shouldn't be necessary for
80+
// a well behaved router.
81+
n, e = discoverUPNP_GenIGDev(ctx)
82+
nats = append(nats, n...)
83+
errs = append(errs, e...)
8484
}
85-
}()
8685

87-
pendingJobs++
88-
go func() {
89-
nats, errs := discoverUPNP_GenIGDev(ctx)
9086
select {
91-
case resCh <- natsAndErrs{nats, errs}:
87+
case upnpCh <- natsAndErrs{nats, errs}:
9288
case <-ctx.Done():
9389
}
9490
}()
9591

96-
pendingJobs++
9792
go func() {
93+
defer close(pmpCh)
9894
nat, err := discoverNATPMP(ctx)
9995
var nats []NAT
10096
var errs []error
@@ -104,15 +100,22 @@ func discoverNATs(ctx context.Context) ([]NAT, []error) {
104100
nats = append(nats, nat)
105101
}
106102
select {
107-
case resCh <- natsAndErrs{nats, errs}:
103+
case pmpCh <- natsAndErrs{nats, errs}:
108104
case <-ctx.Done():
109105
}
110106
}()
111107

112-
for pendingJobs > 0 {
113-
pendingJobs--
108+
var nats []NAT
109+
var errs []error
110+
111+
for upnpCh != nil && pmpCh != nil {
114112
select {
115-
case res := <-resCh:
113+
case res := <-pmpCh:
114+
pmpCh = nil
115+
nats = append(nats, res.nats...)
116+
errs = append(errs, res.errs...)
117+
case res := <-upnpCh:
118+
upnpCh = nil
116119
nats = append(nats, res.nats...)
117120
errs = append(errs, res.errs...)
118121
case <-ctx.Done():

0 commit comments

Comments
 (0)