git: 96d5b400b7c3 - main - net/udp-over-tcp: New port: Proxy UDP traffic over a TCP stream

From: Yuri Victorovich <yuri_at_FreeBSD.org>
Date: Tue, 02 Apr 2024 03:12:36 UTC
The branch main has been updated by yuri:

URL: https://cgit.FreeBSD.org/ports/commit/?id=96d5b400b7c309861dbf4cb17d29cd8e742ae6af

commit 96d5b400b7c309861dbf4cb17d29cd8e742ae6af
Author:     Yuri Victorovich <yuri@FreeBSD.org>
AuthorDate: 2024-04-02 03:12:01 +0000
Commit:     Yuri Victorovich <yuri@FreeBSD.org>
CommitDate: 2024-04-02 03:12:01 +0000

    net/udp-over-tcp: New port: Proxy UDP traffic over a TCP stream
---
 net/Makefile               |   1 +
 net/udp-over-tcp/Makefile  | 113 ++++++++++++++++++++++++++++++
 net/udp-over-tcp/distinfo  | 169 +++++++++++++++++++++++++++++++++++++++++++++
 net/udp-over-tcp/pkg-descr |  18 +++++
 4 files changed, 301 insertions(+)

diff --git a/net/Makefile b/net/Makefile
index 689285bf1f69..7659be658fa5 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -1574,6 +1574,7 @@
     SUBDIR += turnserver
     SUBDIR += u6rd
     SUBDIR += ucarp
+    SUBDIR += udp-over-tcp
     SUBDIR += udpbroadcastrelay
     SUBDIR += udptunnel
     SUBDIR += udpxy
diff --git a/net/udp-over-tcp/Makefile b/net/udp-over-tcp/Makefile
new file mode 100644
index 000000000000..baa85062240a
--- /dev/null
+++ b/net/udp-over-tcp/Makefile
@@ -0,0 +1,113 @@
+PORTNAME=	udp-over-tcp
+DISTVERSIONPREFIX=	v
+DISTVERSION=	0.4.0
+CATEGORIES=	net
+
+MAINTAINER=	yuri@FreeBSD.org
+COMMENT=	Proxy UDP traffic over a TCP stream
+WWW=		https://github.com/mullvad/udp-over-tcp
+
+LICENSE=	MIT
+
+USES=		cargo
+
+USE_GITHUB=	yes
+GH_ACCOUNT=	mullvad
+
+CARGO_CRATES=	addr2line-0.21.0 \
+		adler-1.0.2 \
+		aho-corasick-1.1.1 \
+		anstream-0.6.4 \
+		anstyle-1.0.4 \
+		anstyle-parse-0.2.2 \
+		anstyle-query-1.0.0 \
+		anstyle-wincon-3.0.1 \
+		autocfg-1.1.0 \
+		backtrace-0.3.69 \
+		bitflags-2.4.0 \
+		bytes-1.5.0 \
+		cadence-1.0.0 \
+		cc-1.0.83 \
+		cfg-if-1.0.0 \
+		clap-4.4.6 \
+		clap_builder-4.4.6 \
+		clap_derive-4.4.2 \
+		clap_lex-0.5.1 \
+		colorchoice-1.0.0 \
+		crossbeam-channel-0.5.8 \
+		crossbeam-utils-0.8.16 \
+		env_logger-0.10.0 \
+		err-context-0.1.0 \
+		errno-0.3.4 \
+		errno-dragonfly-0.1.2 \
+		futures-0.3.28 \
+		futures-channel-0.3.28 \
+		futures-core-0.3.28 \
+		futures-executor-0.3.28 \
+		futures-io-0.3.28 \
+		futures-macro-0.3.28 \
+		futures-sink-0.3.28 \
+		futures-task-0.3.28 \
+		futures-util-0.3.28 \
+		gimli-0.28.0 \
+		heck-0.4.1 \
+		hermit-abi-0.3.3 \
+		humantime-2.1.0 \
+		is-terminal-0.4.9 \
+		lazy_static-1.4.0 \
+		libc-0.2.148 \
+		linux-raw-sys-0.4.8 \
+		log-0.4.20 \
+		memchr-2.6.4 \
+		memoffset-0.9.0 \
+		miniz_oxide-0.7.1 \
+		mio-0.8.8 \
+		nix-0.27.1 \
+		num_cpus-1.16.0 \
+		object-0.32.1 \
+		pin-project-lite-0.2.13 \
+		pin-utils-0.1.0 \
+		proc-macro2-1.0.67 \
+		quote-1.0.33 \
+		regex-1.9.6 \
+		regex-automata-0.3.9 \
+		regex-syntax-0.7.5 \
+		rustc-demangle-0.1.23 \
+		rustix-0.38.17 \
+		slab-0.4.9 \
+		socket2-0.5.4 \
+		strsim-0.10.0 \
+		syn-2.0.37 \
+		termcolor-1.3.0 \
+		tokio-1.32.0 \
+		tokio-macros-2.1.0 \
+		unicode-ident-1.0.12 \
+		utf8parse-0.2.1 \
+		wasi-0.11.0+wasi-snapshot-preview1 \
+		winapi-0.3.9 \
+		winapi-i686-pc-windows-gnu-0.4.0 \
+		winapi-util-0.1.6 \
+		winapi-x86_64-pc-windows-gnu-0.4.0 \
+		windows-sys-0.48.0 \
+		windows-targets-0.48.5 \
+		windows_aarch64_gnullvm-0.48.5 \
+		windows_aarch64_msvc-0.48.5 \
+		windows_i686_gnu-0.48.5 \
+		windows_i686_msvc-0.48.5 \
+		windows_x86_64_gnu-0.48.5 \
+		windows_x86_64_gnullvm-0.48.5 \
+		windows_x86_64_msvc-0.48.5
+CARGO_BUILD_ARGS=	--all-features
+CARGO_INSTALL_ARGS=	--all-features
+
+BINARIES=	bin/udp2tcp \
+		bin/tcp2udp
+
+PLIST_FILES=	${BINARIES}
+
+post-install:
+.for bin in ${BINARIES}
+	@${STRIP_CMD} ${STAGEDIR}${PREFIX}/${bin}
+.endfor
+
+.include <bsd.port.mk>
diff --git a/net/udp-over-tcp/distinfo b/net/udp-over-tcp/distinfo
new file mode 100644
index 000000000000..c017fc784b07
--- /dev/null
+++ b/net/udp-over-tcp/distinfo
@@ -0,0 +1,169 @@
+TIMESTAMP = 1712026517
+SHA256 (rust/crates/addr2line-0.21.0.crate) = 8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb
+SIZE (rust/crates/addr2line-0.21.0.crate) = 40807
+SHA256 (rust/crates/adler-1.0.2.crate) = f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe
+SIZE (rust/crates/adler-1.0.2.crate) = 12778
+SHA256 (rust/crates/aho-corasick-1.1.1.crate) = ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab
+SIZE (rust/crates/aho-corasick-1.1.1.crate) = 182812
+SHA256 (rust/crates/anstream-0.6.4.crate) = 2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44
+SIZE (rust/crates/anstream-0.6.4.crate) = 20593
+SHA256 (rust/crates/anstyle-1.0.4.crate) = 7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87
+SIZE (rust/crates/anstyle-1.0.4.crate) = 13998
+SHA256 (rust/crates/anstyle-parse-0.2.2.crate) = 317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140
+SIZE (rust/crates/anstyle-parse-0.2.2.crate) = 24696
+SHA256 (rust/crates/anstyle-query-1.0.0.crate) = 5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b
+SIZE (rust/crates/anstyle-query-1.0.0.crate) = 8620
+SHA256 (rust/crates/anstyle-wincon-3.0.1.crate) = f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628
+SIZE (rust/crates/anstyle-wincon-3.0.1.crate) = 11279
+SHA256 (rust/crates/autocfg-1.1.0.crate) = d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa
+SIZE (rust/crates/autocfg-1.1.0.crate) = 13272
+SHA256 (rust/crates/backtrace-0.3.69.crate) = 2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837
+SIZE (rust/crates/backtrace-0.3.69.crate) = 77299
+SHA256 (rust/crates/bitflags-2.4.0.crate) = b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635
+SIZE (rust/crates/bitflags-2.4.0.crate) = 36954
+SHA256 (rust/crates/bytes-1.5.0.crate) = a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223
+SIZE (rust/crates/bytes-1.5.0.crate) = 58909
+SHA256 (rust/crates/cadence-1.0.0.crate) = eab51a759f502097abe855100b81b421d3a104b62a2c3209f751d90ce6dd2ea1
+SIZE (rust/crates/cadence-1.0.0.crate) = 50247
+SHA256 (rust/crates/cc-1.0.83.crate) = f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0
+SIZE (rust/crates/cc-1.0.83.crate) = 68343
+SHA256 (rust/crates/cfg-if-1.0.0.crate) = baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd
+SIZE (rust/crates/cfg-if-1.0.0.crate) = 7934
+SHA256 (rust/crates/clap-4.4.6.crate) = d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956
+SIZE (rust/crates/clap-4.4.6.crate) = 54823
+SHA256 (rust/crates/clap_builder-4.4.6.crate) = 0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45
+SIZE (rust/crates/clap_builder-4.4.6.crate) = 162450
+SHA256 (rust/crates/clap_derive-4.4.2.crate) = 0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873
+SIZE (rust/crates/clap_derive-4.4.2.crate) = 29019
+SHA256 (rust/crates/clap_lex-0.5.1.crate) = cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961
+SIZE (rust/crates/clap_lex-0.5.1.crate) = 11793
+SHA256 (rust/crates/colorchoice-1.0.0.crate) = acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7
+SIZE (rust/crates/colorchoice-1.0.0.crate) = 6857
+SHA256 (rust/crates/crossbeam-channel-0.5.8.crate) = a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200
+SIZE (rust/crates/crossbeam-channel-0.5.8.crate) = 90455
+SHA256 (rust/crates/crossbeam-utils-0.8.16.crate) = 5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294
+SIZE (rust/crates/crossbeam-utils-0.8.16.crate) = 42508
+SHA256 (rust/crates/env_logger-0.10.0.crate) = 85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0
+SIZE (rust/crates/env_logger-0.10.0.crate) = 36574
+SHA256 (rust/crates/err-context-0.1.0.crate) = 449aad22b1364e927ff3bf50f55404efd705c40065fb47f73f28704de707c89e
+SIZE (rust/crates/err-context-0.1.0.crate) = 12453
+SHA256 (rust/crates/errno-0.3.4.crate) = add4f07d43996f76ef320709726a556a9d4f965d9410d8d0271132d2f8293480
+SIZE (rust/crates/errno-0.3.4.crate) = 10589
+SHA256 (rust/crates/errno-dragonfly-0.1.2.crate) = aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf
+SIZE (rust/crates/errno-dragonfly-0.1.2.crate) = 1810
+SHA256 (rust/crates/futures-0.3.28.crate) = 23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40
+SIZE (rust/crates/futures-0.3.28.crate) = 53229
+SHA256 (rust/crates/futures-channel-0.3.28.crate) = 955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2
+SIZE (rust/crates/futures-channel-0.3.28.crate) = 32281
+SHA256 (rust/crates/futures-core-0.3.28.crate) = 4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c
+SIZE (rust/crates/futures-core-0.3.28.crate) = 14780
+SHA256 (rust/crates/futures-executor-0.3.28.crate) = ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0
+SIZE (rust/crates/futures-executor-0.3.28.crate) = 17743
+SHA256 (rust/crates/futures-io-0.3.28.crate) = 4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964
+SIZE (rust/crates/futures-io-0.3.28.crate) = 8910
+SHA256 (rust/crates/futures-macro-0.3.28.crate) = 89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72
+SIZE (rust/crates/futures-macro-0.3.28.crate) = 11272
+SHA256 (rust/crates/futures-sink-0.3.28.crate) = f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e
+SIZE (rust/crates/futures-sink-0.3.28.crate) = 7852
+SHA256 (rust/crates/futures-task-0.3.28.crate) = 76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65
+SIZE (rust/crates/futures-task-0.3.28.crate) = 11848
+SHA256 (rust/crates/futures-util-0.3.28.crate) = 26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533
+SIZE (rust/crates/futures-util-0.3.28.crate) = 158510
+SHA256 (rust/crates/gimli-0.28.0.crate) = 6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0
+SIZE (rust/crates/gimli-0.28.0.crate) = 269277
+SHA256 (rust/crates/heck-0.4.1.crate) = 95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8
+SIZE (rust/crates/heck-0.4.1.crate) = 11567
+SHA256 (rust/crates/hermit-abi-0.3.3.crate) = d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7
+SIZE (rust/crates/hermit-abi-0.3.3.crate) = 14253
+SHA256 (rust/crates/humantime-2.1.0.crate) = 9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4
+SIZE (rust/crates/humantime-2.1.0.crate) = 16749
+SHA256 (rust/crates/is-terminal-0.4.9.crate) = cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b
+SIZE (rust/crates/is-terminal-0.4.9.crate) = 8109
+SHA256 (rust/crates/lazy_static-1.4.0.crate) = e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646
+SIZE (rust/crates/lazy_static-1.4.0.crate) = 10443
+SHA256 (rust/crates/libc-0.2.148.crate) = 9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b
+SIZE (rust/crates/libc-0.2.148.crate) = 690988
+SHA256 (rust/crates/linux-raw-sys-0.4.8.crate) = 3852614a3bd9ca9804678ba6be5e3b8ce76dfc902cae004e3e0c44051b6e88db
+SIZE (rust/crates/linux-raw-sys-0.4.8.crate) = 1407619
+SHA256 (rust/crates/log-0.4.20.crate) = b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f
+SIZE (rust/crates/log-0.4.20.crate) = 38307
+SHA256 (rust/crates/memchr-2.6.4.crate) = f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167
+SIZE (rust/crates/memchr-2.6.4.crate) = 94439
+SHA256 (rust/crates/memoffset-0.9.0.crate) = 5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c
+SIZE (rust/crates/memoffset-0.9.0.crate) = 9033
+SHA256 (rust/crates/miniz_oxide-0.7.1.crate) = e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7
+SIZE (rust/crates/miniz_oxide-0.7.1.crate) = 55194
+SHA256 (rust/crates/mio-0.8.8.crate) = 927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2
+SIZE (rust/crates/mio-0.8.8.crate) = 94264
+SHA256 (rust/crates/nix-0.27.1.crate) = 2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053
+SIZE (rust/crates/nix-0.27.1.crate) = 286494
+SHA256 (rust/crates/num_cpus-1.16.0.crate) = 4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43
+SIZE (rust/crates/num_cpus-1.16.0.crate) = 15713
+SHA256 (rust/crates/object-0.32.1.crate) = 9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0
+SIZE (rust/crates/object-0.32.1.crate) = 275463
+SHA256 (rust/crates/pin-project-lite-0.2.13.crate) = 8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58
+SIZE (rust/crates/pin-project-lite-0.2.13.crate) = 29141
+SHA256 (rust/crates/pin-utils-0.1.0.crate) = 8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184
+SIZE (rust/crates/pin-utils-0.1.0.crate) = 7580
+SHA256 (rust/crates/proc-macro2-1.0.67.crate) = 3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328
+SIZE (rust/crates/proc-macro2-1.0.67.crate) = 43683
+SHA256 (rust/crates/quote-1.0.33.crate) = 5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae
+SIZE (rust/crates/quote-1.0.33.crate) = 28090
+SHA256 (rust/crates/regex-1.9.6.crate) = ebee201405406dbf528b8b672104ae6d6d63e6d118cb10e4d51abbc7b58044ff
+SIZE (rust/crates/regex-1.9.6.crate) = 254981
+SHA256 (rust/crates/regex-automata-0.3.9.crate) = 59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9
+SIZE (rust/crates/regex-automata-0.3.9.crate) = 610489
+SHA256 (rust/crates/regex-syntax-0.7.5.crate) = dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da
+SIZE (rust/crates/regex-syntax-0.7.5.crate) = 343366
+SHA256 (rust/crates/rustc-demangle-0.1.23.crate) = d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76
+SIZE (rust/crates/rustc-demangle-0.1.23.crate) = 28970
+SHA256 (rust/crates/rustix-0.38.17.crate) = f25469e9ae0f3d0047ca8b93fc56843f38e6774f0914a107ff8b41be8be8e0b7
+SIZE (rust/crates/rustix-0.38.17.crate) = 353766
+SHA256 (rust/crates/slab-0.4.9.crate) = 8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67
+SIZE (rust/crates/slab-0.4.9.crate) = 17108
+SHA256 (rust/crates/socket2-0.5.4.crate) = 4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e
+SIZE (rust/crates/socket2-0.5.4.crate) = 54663
+SHA256 (rust/crates/strsim-0.10.0.crate) = 73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623
+SIZE (rust/crates/strsim-0.10.0.crate) = 11355
+SHA256 (rust/crates/syn-2.0.37.crate) = 7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8
+SIZE (rust/crates/syn-2.0.37.crate) = 243250
+SHA256 (rust/crates/termcolor-1.3.0.crate) = 6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64
+SIZE (rust/crates/termcolor-1.3.0.crate) = 18799
+SHA256 (rust/crates/tokio-1.32.0.crate) = 17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9
+SIZE (rust/crates/tokio-1.32.0.crate) = 725004
+SHA256 (rust/crates/tokio-macros-2.1.0.crate) = 630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e
+SIZE (rust/crates/tokio-macros-2.1.0.crate) = 11472
+SHA256 (rust/crates/unicode-ident-1.0.12.crate) = 3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b
+SIZE (rust/crates/unicode-ident-1.0.12.crate) = 42168
+SHA256 (rust/crates/utf8parse-0.2.1.crate) = 711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a
+SIZE (rust/crates/utf8parse-0.2.1.crate) = 13435
+SHA256 (rust/crates/wasi-0.11.0+wasi-snapshot-preview1.crate) = 9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423
+SIZE (rust/crates/wasi-0.11.0+wasi-snapshot-preview1.crate) = 28131
+SHA256 (rust/crates/winapi-0.3.9.crate) = 5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419
+SIZE (rust/crates/winapi-0.3.9.crate) = 1200382
+SHA256 (rust/crates/winapi-i686-pc-windows-gnu-0.4.0.crate) = ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6
+SIZE (rust/crates/winapi-i686-pc-windows-gnu-0.4.0.crate) = 2918815
+SHA256 (rust/crates/winapi-util-0.1.6.crate) = f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596
+SIZE (rust/crates/winapi-util-0.1.6.crate) = 12234
+SHA256 (rust/crates/winapi-x86_64-pc-windows-gnu-0.4.0.crate) = 712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f
+SIZE (rust/crates/winapi-x86_64-pc-windows-gnu-0.4.0.crate) = 2947998
+SHA256 (rust/crates/windows-sys-0.48.0.crate) = 677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9
+SIZE (rust/crates/windows-sys-0.48.0.crate) = 2628884
+SHA256 (rust/crates/windows-targets-0.48.5.crate) = 9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c
+SIZE (rust/crates/windows-targets-0.48.5.crate) = 6904
+SHA256 (rust/crates/windows_aarch64_gnullvm-0.48.5.crate) = 2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8
+SIZE (rust/crates/windows_aarch64_gnullvm-0.48.5.crate) = 418492
+SHA256 (rust/crates/windows_aarch64_msvc-0.48.5.crate) = dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc
+SIZE (rust/crates/windows_aarch64_msvc-0.48.5.crate) = 798483
+SHA256 (rust/crates/windows_i686_gnu-0.48.5.crate) = a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e
+SIZE (rust/crates/windows_i686_gnu-0.48.5.crate) = 844891
+SHA256 (rust/crates/windows_i686_msvc-0.48.5.crate) = 8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406
+SIZE (rust/crates/windows_i686_msvc-0.48.5.crate) = 864300
+SHA256 (rust/crates/windows_x86_64_gnu-0.48.5.crate) = 53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e
+SIZE (rust/crates/windows_x86_64_gnu-0.48.5.crate) = 801619
+SHA256 (rust/crates/windows_x86_64_gnullvm-0.48.5.crate) = 0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc
+SIZE (rust/crates/windows_x86_64_gnullvm-0.48.5.crate) = 418486
+SHA256 (rust/crates/windows_x86_64_msvc-0.48.5.crate) = ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538
+SIZE (rust/crates/windows_x86_64_msvc-0.48.5.crate) = 798412
+SHA256 (mullvad-udp-over-tcp-v0.4.0_GH0.tar.gz) = 0338b65bd979ec6ccd50e6d7642fc371bed9ea2c173a54cdd98af1ca3b25f2d0
+SIZE (mullvad-udp-over-tcp-v0.4.0_GH0.tar.gz) = 22004
diff --git a/net/udp-over-tcp/pkg-descr b/net/udp-over-tcp/pkg-descr
new file mode 100644
index 000000000000..43ddb60fa64c
--- /dev/null
+++ b/net/udp-over-tcp/pkg-descr
@@ -0,0 +1,18 @@
+udp-over-tcp is a library and binaries for tunneling UDP datagrams over
+a TCP stream.
+
+Some programs/protocols only work over UDP. And some networks only allow TCP.
+This is where `udp-over-tcp` comes in handy. This library comes in two parts:
+
+* `udp2tcp` - Forwards incoming UDP datagrams over a TCP stream. The return
+  stream is translated back to datagrams and sent back out over UDP again.
+  This part can be easily used as both a library and a binary.
+  So it can be run standalone, but can also easily be included in other
+  Rust programs. The UDP socket is connected to the peer address of the first
+  incoming datagram. So one [`Udp2Tcp`] instance can handle traffic from a
+  single peer only.
+* `tcp2udp` - Accepts connections over TCP and translates + forwards the
+  incoming stream as UDP datagrams to the destination specified during setup
+  and on the command line.
+  Designed mostly to be a standalone executable to run on servers. But can be
+  consumed as a Rust library as well.