Skip to content

Commit d7e2401

Browse files
committed
Merge #18077: net: Add NAT-PMP port forwarding support
a191e23 doc: Add release notes (Hennadii Stepanov) ae749d1 doc: Add libnatpmp stuff (Hennadii Stepanov) e28f9be ci: Add libnatpmp-dev package to some builds (Hennadii Stepanov) 5a0185b gui: Add NAT-PMP network option (Hennadii Stepanov) a39f733 net: Add -natpmp command line option (Hennadii Stepanov) 28acffd net: Add NAT-PMP to port mapping loop (Hennadii Stepanov) a8d9f27 net: Add libnatpmp support (Hennadii Stepanov) 58e8364 gui: Apply port mapping changes on dialog exit (Hennadii Stepanov) cf151cc scripted-diff: Rename UPnP stuff (Hennadii Stepanov) 4e91b1e net: Add flags for port mapping protocols (Hennadii Stepanov) 8b50d1b net: Keep trying to use UPnP when -upnp=1 (Hennadii Stepanov) 28e2961 refactor: Replace magic number with named constant (Hennadii Stepanov) 02ccf69 refactor: Move port mapping code to its own module (Hennadii Stepanov) Pull request description: Close #11902 This PR is an alternative to: - #12288 - #15717 To compile with NAT-PMP support on Ubuntu [`libnatpmp-dev`](https://packages.ubuntu.com/source/bionic/libnatpmp) should be available. Log excerpt: ``` 2020-02-05T20:12:28Z [mapport] NAT-PMP: public address = 95.164.65.194 2020-02-05T20:12:28Z [mapport] AddLocal(95.164.65.194:18333,3) 2020-02-05T20:12:28Z [mapport] NAT-PMP: port mapping successful. ``` See: [`libnatpmp`](https://miniupnp.tuxfamily.org/libnatpmp.html) --- Some follow-ups are out of this PR's scope: - mention NAT-PMP library in the version message - ~integrate NAT-PMP into the GUI~ (already [added](bitcoin/bitcoin#18077 (comment))) ACKs for top commit: laanwj: Tested and code review ACK a191e23 Tree-SHA512: 10e19267c21bf30f20ff1abfc882d526049f0e790b95e12f109dc2bed7c0aef45de03eaf967f4e667e7509be04f1873a5c508087393d947205f3aab2ad6d7cf1
2 parents b6a71b8 + a191e23 commit d7e2401

33 files changed

+547
-173
lines changed

.cirrus.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ task:
170170
task:
171171
name: 'macOS 10.15 native [gui] [no depends]'
172172
macos_brew_addon_script:
173-
- brew install boost libevent berkeley-db4 qt miniupnpc ccache zeromq qrencode sqlite libtool automake pkg-config gnu-getopt
173+
- brew install boost libevent berkeley-db4 qt miniupnpc libnatpmp ccache zeromq qrencode sqlite libtool automake pkg-config gnu-getopt
174174
<< : *GLOBAL_TASK_TEMPLATE
175175
osx_instance:
176176
# Use latest image, but hardcode version to avoid silent upgrades (and breaks)

ci/test/00_setup_env_native_asan.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
export LC_ALL=C.UTF-8
88

99
export CONTAINER_NAME=ci_native_asan
10-
export PACKAGES="clang llvm python3-zmq qtbase5-dev qttools5-dev-tools libevent-dev bsdmainutils libboost-system-dev libboost-filesystem-dev libboost-test-dev libboost-thread-dev libdb5.3++-dev libminiupnpc-dev libzmq3-dev libqrencode-dev libsqlite3-dev"
10+
export PACKAGES="clang llvm python3-zmq qtbase5-dev qttools5-dev-tools libevent-dev bsdmainutils libboost-system-dev libboost-filesystem-dev libboost-test-dev libboost-thread-dev libdb5.3++-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev libqrencode-dev libsqlite3-dev"
1111
export DOCKER_NAME_TAG=ubuntu:20.04
1212
export NO_DEPENDS=1
1313
export GOAL="install"

ci/test/00_setup_env_native_qt5.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export LC_ALL=C.UTF-8
99
export CONTAINER_NAME=ci_native_qt5
1010
export DOCKER_NAME_TAG=ubuntu:18.04 # Check that bionic gcc-7 can compile our c++17 and run our functional tests in python3, see doc/dependencies.md
1111
export PACKAGES="python3-zmq qtbase5-dev qttools5-dev-tools libdbus-1-dev libharfbuzz-dev"
12-
export DEP_OPTS="NO_QT=1 NO_UPNP=1 DEBUG=1 ALLOW_HOST_PACKAGES=1"
12+
export DEP_OPTS="NO_QT=1 NO_UPNP=1 NO_NATPMP=1 DEBUG=1 ALLOW_HOST_PACKAGES=1"
1313
export TEST_RUNNER_EXTRA="--previous-releases --coverage --extended --exclude feature_dbcrash" # Run extended tests so that coverage does not fail, but exclude the very slow dbcrash
1414
export RUN_SECURITY_TESTS="true"
1515
export RUN_UNIT_TESTS_SEQUENTIAL="true"

ci/test/00_setup_env_native_valgrind.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
export LC_ALL=C.UTF-8
88

99
export CONTAINER_NAME=ci_native_valgrind
10-
export PACKAGES="valgrind clang llvm python3-zmq libevent-dev bsdmainutils libboost-system-dev libboost-filesystem-dev libboost-test-dev libboost-thread-dev libdb5.3++-dev libminiupnpc-dev libzmq3-dev libsqlite3-dev"
10+
export PACKAGES="valgrind clang llvm python3-zmq libevent-dev bsdmainutils libboost-system-dev libboost-filesystem-dev libboost-test-dev libboost-thread-dev libdb5.3++-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev libsqlite3-dev"
1111
export USE_VALGRIND=1
1212
export NO_DEPENDS=1
1313
export TEST_RUNNER_EXTRA="--exclude rpc_bind" # Excluded for now, see https://github.com/bitcoin/bitcoin/issues/17765#issuecomment-602068547

configure.ac

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,18 @@ AC_ARG_ENABLE([upnp-default],
143143
[use_upnp_default=$enableval],
144144
[use_upnp_default=no])
145145

146+
AC_ARG_WITH([natpmp],
147+
[AS_HELP_STRING([--with-natpmp],
148+
[enable NAT-PMP (default is yes if libnatpmp is found)])],
149+
[use_natpmp=$withval],
150+
[use_natpmp=auto])
151+
152+
AC_ARG_ENABLE([natpmp-default],
153+
[AS_HELP_STRING([--enable-natpmp-default],
154+
[if NAT-PMP is enabled, turn it on at startup (default is no)])],
155+
[use_natpmp_default=$enableval],
156+
[use_natpmp_default=no])
157+
146158
AC_ARG_ENABLE(tests,
147159
AS_HELP_STRING([--disable-tests],[do not compile tests (default is to compile)]),
148160
[use_tests=$enableval],
@@ -1206,6 +1218,7 @@ if test "x$enable_fuzz" = "xyes"; then
12061218
enable_wallet=no
12071219
use_bench=no
12081220
use_upnp=no
1221+
use_natpmp=no
12091222
use_zmq=no
12101223

12111224
AX_CHECK_PREPROC_FLAG([-DABORT_ON_FAILED_ASSUME],[[DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DABORT_ON_FAILED_ASSUME"]],,[[$CXXFLAG_WERROR]])
@@ -1303,6 +1316,13 @@ if test x$have_miniupnpc != xno; then
13031316
fi
13041317
fi
13051318

1319+
dnl Check for libnatpmp (optional).
1320+
if test "x$use_natpmp" != xno; then
1321+
AC_CHECK_HEADERS([natpmp.h],
1322+
[AC_CHECK_LIB([natpmp], [initnatpmp], [NATPMP_LIBS=-lnatpmp], [have_natpmp=no])],
1323+
[have_natpmp=no])
1324+
fi
1325+
13061326
if test x$build_bitcoin_wallet$build_bitcoin_cli$build_bitcoin_tx$build_bitcoind$bitcoin_enable_qt$use_tests$use_bench = xnonononononono; then
13071327
use_boost=no
13081328
else
@@ -1561,6 +1581,31 @@ else
15611581
fi
15621582
fi
15631583

1584+
dnl Enable NAT-PMP support.
1585+
AC_MSG_CHECKING([whether to build with support for NAT-PMP])
1586+
if test "x$have_natpmp" = xno; then
1587+
if test "x$use_natpmp" = xyes; then
1588+
AC_MSG_ERROR([NAT-PMP requested but cannot be built. Use --without-natpmp])
1589+
fi
1590+
AC_MSG_RESULT([no])
1591+
use_natpmp=no
1592+
else
1593+
if test "x$use_natpmp" != xno; then
1594+
AC_MSG_RESULT([yes])
1595+
AC_MSG_CHECKING([whether to build with NAT-PMP enabled by default])
1596+
use_natpmp=yes
1597+
natpmp_setting=0
1598+
if test "x$use_natpmp_default" != xno; then
1599+
use_natpmp_default=yes
1600+
natpmp_setting=1
1601+
fi
1602+
AC_MSG_RESULT($use_natpmp_default)
1603+
AC_DEFINE_UNQUOTED([USE_NATPMP], [$natpmp_setting], [NAT-PMP support not compiled if undefined, otherwise value (0 or 1) determines default state])
1604+
else
1605+
AC_MSG_RESULT([no])
1606+
fi
1607+
fi
1608+
15641609
dnl these are only used when qt is enabled
15651610
BUILD_TEST_QT=""
15661611
if test x$bitcoin_enable_qt != xno; then
@@ -1707,6 +1752,7 @@ AC_SUBST(SQLITE_LIBS)
17071752
AC_SUBST(TESTDEFS)
17081753
AC_SUBST(MINIUPNPC_CPPFLAGS)
17091754
AC_SUBST(MINIUPNPC_LIBS)
1755+
AC_SUBST(NATPMP_LIBS)
17101756
AC_SUBST(EVENT_LIBS)
17111757
AC_SUBST(EVENT_PTHREADS_LIBS)
17121758
AC_SUBST(ZMQ_LIBS)
@@ -1794,6 +1840,7 @@ else
17941840
fi
17951841
echo " with bench = $use_bench"
17961842
echo " with upnp = $use_upnp"
1843+
echo " with natpmp = $use_natpmp"
17971844
echo " use asm = $use_asm"
17981845
echo " sanitizers = $use_sanitizers"
17991846
echo " debug enabled = $enable_debug"

depends/Makefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ NO_QR ?=
3737
NO_WALLET ?=
3838
NO_ZMQ ?=
3939
NO_UPNP ?=
40+
NO_NATPMP ?=
4041
MULTIPROCESS ?=
4142
FALLBACK_DOWNLOAD_PATH ?= https://bitcoincore.org/depends-sources
4243

@@ -139,10 +140,12 @@ sqlite_packages_$(NO_SQLITE) = $(sqlite_packages)
139140
wallet_packages_$(NO_WALLET) = $(bdb_packages_) $(sqlite_packages_)
140141

141142
upnp_packages_$(NO_UPNP) = $(upnp_packages)
143+
natpmp_packages_$(NO_NATPMP) = $(natpmp_packages)
144+
142145
zmq_packages_$(NO_ZMQ) = $(zmq_packages)
143146
multiprocess_packages_$(MULTIPROCESS) = $(multiprocess_packages)
144147

145-
packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages) $(qt_packages_) $(wallet_packages_) $(upnp_packages_)
148+
packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages) $(qt_packages_) $(wallet_packages_) $(upnp_packages_) $(natpmp_packages_)
146149
native_packages += $($(host_arch)_$(host_os)_native_packages) $($(host_os)_native_packages)
147150

148151
ifneq ($(zmq_packages_),)
@@ -200,6 +203,7 @@ $(host_prefix)/share/config.site : config.site.in $(host_prefix)/.stamp_$(final_
200203
-e 's|@no_zmq@|$(NO_ZMQ)|' \
201204
-e 's|@no_wallet@|$(NO_WALLET)|' \
202205
-e 's|@no_upnp@|$(NO_UPNP)|' \
206+
-e 's|@no_natpmp@|$(NO_NATPMP)|' \
203207
-e 's|@multiprocess@|$(MULTIPROCESS)|' \
204208
-e 's|@debug@|$(DEBUG)|' \
205209
$< > $@

depends/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ The following can be set when running make: `make FOO=bar`
9494
- `NO_BDB`: Don't download/build/cache BerkeleyDB
9595
- `NO_SQLITE`: Don't download/build/cache SQLite
9696
- `NO_UPNP`: Don't download/build/cache packages needed for enabling UPnP
97+
- `NO_NATPMP`: Don't download/build/cache packages needed for enabling NAT-PMP</dd>
9798
- `ALLOW_HOST_PACKAGES`: Packages that are missed in dependencies (due to `NO_*` option or
9899
build script logic) are searched for among the host system packages using
99100
`pkg-config`. It allows building with packages of other (newer) versions

depends/config.site.in

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ if test -z $with_miniupnpc && test -n "@no_upnp@"; then
4646
with_miniupnpc=no
4747
fi
4848

49+
if test -z $with_natpmp && test -n "@no_natpmp@"; then
50+
with_natpmp=no
51+
fi
52+
4953
if test -z $with_gui && test -n "@no_qt@"; then
5054
with_gui=no
5155
fi

depends/packages/libnatpmp.mk

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package=libnatpmp
2+
$(package)_version=20150609
3+
$(package)_download_path=https://miniupnp.tuxfamily.org/files/
4+
$(package)_file_name=$(package)-$($(package)_version).tar.gz
5+
$(package)_sha256_hash=e1aa9c4c4219bc06943d6b2130f664daee213fb262fcb94dd355815b8f4536b0
6+
7+
define $(package)_set_vars
8+
$(package)_build_opts=CC="$($(package)_cc)"
9+
endef
10+
11+
define $(package)_build_cmds
12+
$(MAKE) libnatpmp.a $($(package)_build_opts)
13+
endef
14+
15+
define $(package)_stage_cmds
16+
mkdir -p $($(package)_staging_prefix_dir)/include $($(package)_staging_prefix_dir)/lib &&\
17+
install *.h $($(package)_staging_prefix_dir)/include &&\
18+
install libnatpmp.a $($(package)_staging_prefix_dir)/lib
19+
endef

depends/packages/packages.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ sqlite_packages=sqlite
1616
zmq_packages=zeromq
1717

1818
upnp_packages=miniupnpc
19+
natpmp_packages=libnatpmp
1920

2021
multiprocess_packages = libmultiprocess capnp
2122
multiprocess_native_packages = native_libmultiprocess native_capnp

0 commit comments

Comments
 (0)