]> Sergey Matveev's repositories - btrtrc.git/blob - portfwd.go
Law of Demeter Client.mu
[btrtrc.git] / portfwd.go
1 package torrent
2
3 import (
4         "log"
5         "time"
6
7         flog "github.com/anacrolix/log"
8         "github.com/elgatito/upnp"
9 )
10
11 func addPortMapping(d upnp.Device, proto upnp.Protocol, internalPort int, debug bool) {
12         externalPort, err := d.AddPortMapping(proto, internalPort, internalPort, "anacrolix/torrent", 0)
13         if err != nil {
14                 log.Printf("error adding %s port mapping: %s", proto, err)
15         } else if externalPort != internalPort {
16                 log.Printf("external port %d does not match internal port %d in port mapping", externalPort, internalPort)
17         } else if debug {
18                 log.Printf("forwarded external %s port %d", proto, externalPort)
19         }
20 }
21
22 func (cl *Client) forwardPort() {
23         cl.lock()
24         defer cl.unlock()
25         if cl.config.NoDefaultPortForwarding {
26                 return
27         }
28         cl.unlock()
29         ds := upnp.Discover(0, 2*time.Second)
30         cl.lock()
31         flog.Default.Handle(flog.Fmsg("discovered %d upnp devices", len(ds)))
32         port := cl.incomingPeerPort()
33         cl.unlock()
34         for _, d := range ds {
35                 go addPortMapping(d, upnp.TCP, port, cl.config.Debug)
36                 go addPortMapping(d, upnp.UDP, port, cl.config.Debug)
37         }
38         cl.lock()
39 }