aboutsummaryrefslogtreecommitdiffstats
path: root/p2p/natpmp.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-12-20 09:34:12 +0800
committerobscuren <geffobscura@gmail.com>2014-12-20 09:34:12 +0800
commit3983dd2428137211f84f299f9ce8690c22f50afd (patch)
tree3a2dc53b365e6f377fc82a3514150d1297fe549c /p2p/natpmp.go
parent7daa8c2f6eb25511c6a54ad420709af911fc6748 (diff)
parent0a9dc1536c5d776844d6947a0090ff7e1a7c6ab4 (diff)
downloadgo-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar
go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar.gz
go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar.bz2
go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar.lz
go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar.xz
go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.tar.zst
go-tangerine-3983dd2428137211f84f299f9ce8690c22f50afd.zip
Merge branch 'release/v0.7.10'vv0.7.10
Diffstat (limited to 'p2p/natpmp.go')
-rw-r--r--p2p/natpmp.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/p2p/natpmp.go b/p2p/natpmp.go
new file mode 100644
index 000000000..6714678c4
--- /dev/null
+++ b/p2p/natpmp.go
@@ -0,0 +1,55 @@
+package p2p
+
+import (
+ "fmt"
+ "net"
+ "time"
+
+ natpmp "github.com/jackpal/go-nat-pmp"
+)
+
+// Adapt the NAT-PMP protocol to the NAT interface
+
+// TODO:
+// + Register for changes to the external address.
+// + Re-register port mapping when router reboots.
+// + A mechanism for keeping a port mapping registered.
+// + Discover gateway address automatically.
+
+type natPMPClient struct {
+ client *natpmp.Client
+}
+
+// PMP returns a NAT traverser that uses NAT-PMP. The provided gateway
+// address should be the IP of your router.
+func PMP(gateway net.IP) (nat NAT) {
+ return &natPMPClient{natpmp.NewClient(gateway)}
+}
+
+func (*natPMPClient) String() string {
+ return "NAT-PMP"
+}
+
+func (n *natPMPClient) GetExternalAddress() (net.IP, error) {
+ response, err := n.client.GetExternalAddress()
+ if err != nil {
+ return nil, err
+ }
+ return response.ExternalIPAddress[:], nil
+}
+
+func (n *natPMPClient) AddPortMapping(protocol string, extport, intport int, name string, lifetime time.Duration) error {
+ if lifetime <= 0 {
+ return fmt.Errorf("lifetime must not be <= 0")
+ }
+ // Note order of port arguments is switched between our AddPortMapping and the client's AddPortMapping.
+ _, err := n.client.AddPortMapping(protocol, intport, extport, int(lifetime/time.Second))
+ return err
+}
+
+func (n *natPMPClient) DeletePortMapping(protocol string, externalPort, internalPort int) (err error) {
+ // To destroy a mapping, send an add-port with
+ // an internalPort of the internal port to destroy, an external port of zero and a time of zero.
+ _, err = n.client.AddPortMapping(protocol, internalPort, 0, 0)
+ return
+}