diff --git a/src/main/java/org/qortal/network/Network.java b/src/main/java/org/qortal/network/Network.java index c9ae3b7a..8c1a05aa 100644 --- a/src/main/java/org/qortal/network/Network.java +++ b/src/main/java/org/qortal/network/Network.java @@ -1,5 +1,6 @@ package org.qortal.network; +import com.dosse.upnp.UPnP; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.bouncycastle.crypto.params.Ed25519PrivateKeyParameters; @@ -183,6 +184,11 @@ public class Network { } } + // Attempt to set up UPnP. All errors are ignored. + if (Settings.getInstance().isuPnPEnabled()) { + UPnP.openPortTCP(Settings.getInstance().getListenPort()); + } + // Start up first networking thread networkEPC.start(); } diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index a3e03028..d1bc41a8 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -181,6 +181,8 @@ public class Settings { private boolean isTestNet = false; /** Port number for inbound peer-to-peer connections. */ private Integer listenPort; + /** Whether to attempt to open the listen port via UPnP */ + private boolean uPnPEnabled = true; /** Minimum number of peers to allow block minting / synchronization. */ private int minBlockchainPeers = 5; /** Target number of outbound connections to peers we should make. */ @@ -629,6 +631,10 @@ public class Settings { return this.bindAddress; } + public boolean isuPnPEnabled() { + return this.uPnPEnabled; + } + public int getMinBlockchainPeers() { return this.minBlockchainPeers; }