aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--Makefile.am3
-rw-r--r--configure.ac6
-rw-r--r--contrib/scripts/gnunet-logread/Makefile.am5
-rw-r--r--lint/Makefile.am3
-rw-r--r--po/POTFILES.in5
-rw-r--r--po/de.po409
-rw-r--r--po/es.po439
-rw-r--r--po/fr.po386
-rw-r--r--po/it.po367
-rw-r--r--po/sv.po398
-rw-r--r--po/vi.po399
-rw-r--r--po/zh_CN.po390
-rw-r--r--src/ats/gnunet-service-ats-new.c16
-rw-r--r--src/include/Makefile.am1
-rw-r--r--src/include/gnunet_ats_application_service.h6
-rw-r--r--src/include/gnunet_peerstore_service.h4
-rw-r--r--src/include/gnunet_protocols.h12
-rw-r--r--src/include/gnunet_transport_application_service.h100
-rw-r--r--src/include/gnunet_util_lib.h2
-rwxr-xr-xsrc/namestore/test_namestore_delete.sh6
-rwxr-xr-xsrc/namestore/test_namestore_lookup.sh28
-rwxr-xr-xsrc/namestore/test_namestore_put.sh2
-rw-r--r--src/peerinfo-tool/Makefile.am22
-rw-r--r--src/peerinfo-tool/plugin_rest_peerinfo.c (renamed from src/peerinfo/plugin_rest_peerinfo.c)0
-rw-r--r--src/peerinfo/Makefile.am20
-rw-r--r--src/rps/Makefile.am6
-rw-r--r--src/rps/gnunet-rps-profiler.c25
-rw-r--r--src/rps/gnunet-service-rps_sampler.h2
-rw-r--r--src/rps/profiler_rps.conf3
-rw-r--r--src/rps/rps-sampler_client.c54
-rw-r--r--src/rps/rps-sampler_common.c54
-rw-r--r--src/rps/rps-sampler_common.h61
-rw-r--r--src/rps/rps-test_util.c38
-rw-r--r--src/rps/rps-test_util.h21
-rw-r--r--src/rps/rps.conf.in10
-rw-r--r--src/rps/rps_api.c149
-rw-r--r--src/rps/test_rps.c20
-rw-r--r--src/rps/test_rps.conf4
-rw-r--r--src/transport/Makefile.am41
-rw-r--r--src/transport/gnunet-service-tng.c1113
-rw-r--r--src/transport/plugin_transport_xt.c4107
-rw-r--r--src/transport/plugin_transport_xu.c2492
-rw-r--r--src/transport/plugin_transport_xu.h273
-rw-r--r--src/transport/transport.h32
-rw-r--r--src/transport/transport_api2_application.c366
-rw-r--r--src/util/Makefile.am7
47 files changed, 2816 insertions, 9097 deletions
diff --git a/ChangeLog b/ChangeLog
index 77f2cf0b8..81ddd090e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
1Thu 04 Apr 2019 12:39:44 PM CEST
2 Hotfix for build issue. Releasing GNUnet 0.11.2. -CG/MS
3
4Wed 03 Apr 2019 03:18:43 PM CEST
5 Releasing GNUnet 0.11.1. -CG
6
1Wed 03 Apr 2019 01:54:44 PM CEST 7Wed 03 Apr 2019 01:54:44 PM CEST
2 Merged gnunet-qr-c-2 branch, replacing Python-based implementation 8 Merged gnunet-qr-c-2 branch, replacing Python-based implementation
3 of gnunet-qr with C-based implementation that also integrates 9 of gnunet-qr with C-based implementation that also integrates
diff --git a/Makefile.am b/Makefile.am
index f54ff203f..d69dd3a82 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -12,6 +12,9 @@ endif
12if DOCUMENTATION 12if DOCUMENTATION
13 SUBDIRS += doc 13 SUBDIRS += doc
14endif 14endif
15if HAVE_EXPERIMENTAL
16 SUBDIRS += lint
17endif
15 18
16# only manpages, needs "doc" subdir 19# only manpages, needs "doc" subdir
17if INCLUDE_MANPAGES 20if INCLUDE_MANPAGES
diff --git a/configure.ac b/configure.ac
index ac8ed60c2..d9e6af74d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -21,7 +21,7 @@
21# 21#
22AC_PREREQ(2.61) 22AC_PREREQ(2.61)
23# Checks for programs. 23# Checks for programs.
24AC_INIT([gnunet], [0.11.0], [bug-gnunet@gnu.org]) 24AC_INIT([gnunet], [0.11.2], [bug-gnunet@gnu.org])
25AC_CONFIG_AUX_DIR([build-aux]) 25AC_CONFIG_AUX_DIR([build-aux])
26 26
27AC_CANONICAL_TARGET 27AC_CANONICAL_TARGET
@@ -64,12 +64,16 @@ funcstocheck="getnameinfo gethostname gethostbyname gethostbyaddr getaddrinfo ge
64# Srcdir in a form that native compiler understands (i.e. DOS path on W32) 64# Srcdir in a form that native compiler understands (i.e. DOS path on W32)
65native_srcdir=$srcdir 65native_srcdir=$srcdir
66 66
67OLD_LDFLAGS="$LDFLAGS"
68LDFLAGS="$LDFLAGS -Wl,--unresolved-symbols=report-all"
69
67# Check system type 70# Check system type
68case "$host_os" in 71case "$host_os" in
69*darwin* | *rhapsody* | *macosx*) 72*darwin* | *rhapsody* | *macosx*)
70 AC_DEFINE_UNQUOTED(DARWIN,1,[This is an Apple Darwin system]) 73 AC_DEFINE_UNQUOTED(DARWIN,1,[This is an Apple Darwin system])
71 CPPFLAGS="-D_APPLE_C_SOURCE $CPPFLAGS" 74 CPPFLAGS="-D_APPLE_C_SOURCE $CPPFLAGS"
72 CFLAGS="-fno-common $CFLAGS" 75 CFLAGS="-fno-common $CFLAGS"
76 LDFLAGS="$OLD_LDFLAGS"
73 AC_MSG_WARN([WARNING: The VPN application cannot be compiled on your OS]) 77 AC_MSG_WARN([WARNING: The VPN application cannot be compiled on your OS])
74 AC_CHECK_LIB(intl, gettext) 78 AC_CHECK_LIB(intl, gettext)
75 build_target="darwin" 79 build_target="darwin"
diff --git a/contrib/scripts/gnunet-logread/Makefile.am b/contrib/scripts/gnunet-logread/Makefile.am
index 82c99494c..7903c07de 100644
--- a/contrib/scripts/gnunet-logread/Makefile.am
+++ b/contrib/scripts/gnunet-logread/Makefile.am
@@ -20,3 +20,8 @@ CLEANFILES= \
20noinst_SCRIPTS = \ 20noinst_SCRIPTS = \
21 $(CLEANFILES) \ 21 $(CLEANFILES) \
22 gnunet-logread-ipc 22 gnunet-logread-ipc
23
24EXTRA_DIST = \
25 gnunet-logread.in \
26 gnunet-logread-ipc-sdedit.in \
27 gnunet-logread-ipc
diff --git a/lint/Makefile.am b/lint/Makefile.am
index 0de8da54a..f78cdd5f6 100644
--- a/lint/Makefile.am
+++ b/lint/Makefile.am
@@ -57,3 +57,6 @@ check-texinfo:
57 @cd $(top_srcdir)/doc/tutorial ; find . -type f ! -path '*/.*' -name '*.texi' -print0 | xargs -0 awk '/XXX/ {print FILENAME":"NR":"$$0}' >> $(srcdir)/texinfo_tutorial.log || true 57 @cd $(top_srcdir)/doc/tutorial ; find . -type f ! -path '*/.*' -name '*.texi' -print0 | xargs -0 awk '/XXX/ {print FILENAME":"NR":"$$0}' >> $(srcdir)/texinfo_tutorial.log || true
58 58
59check-linters: check-bashism check-python check-man check-texinfo 59check-linters: check-bashism check-python check-man check-texinfo
60
61EXTRA_DIST = \
62 checkbashisms.pl.in
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 67c22aaed..f06457adc 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -262,9 +262,9 @@ src/nt/nt.c
262src/peerinfo/gnunet-service-peerinfo.c 262src/peerinfo/gnunet-service-peerinfo.c
263src/peerinfo/peerinfo_api.c 263src/peerinfo/peerinfo_api.c
264src/peerinfo/peerinfo_api_notify.c 264src/peerinfo/peerinfo_api_notify.c
265src/peerinfo/plugin_rest_peerinfo.c
266src/peerinfo-tool/gnunet-peerinfo.c 265src/peerinfo-tool/gnunet-peerinfo.c
267src/peerinfo-tool/gnunet-peerinfo_plugins.c 266src/peerinfo-tool/gnunet-peerinfo_plugins.c
267src/peerinfo-tool/plugin_rest_peerinfo.c
268src/peerstore/gnunet-peerstore.c 268src/peerstore/gnunet-peerstore.c
269src/peerstore/gnunet-service-peerstore.c 269src/peerstore/gnunet-service-peerstore.c
270src/peerstore/peerstore_api.c 270src/peerstore/peerstore_api.c
@@ -418,13 +418,12 @@ src/transport/plugin_transport_udp_broadcasting.c
418src/transport/plugin_transport_udp.c 418src/transport/plugin_transport_udp.c
419src/transport/plugin_transport_unix.c 419src/transport/plugin_transport_unix.c
420src/transport/plugin_transport_wlan.c 420src/transport/plugin_transport_wlan.c
421src/transport/plugin_transport_xt.c
422src/transport/plugin_transport_xu.c
423src/transport/tcp_connection_legacy.c 421src/transport/tcp_connection_legacy.c
424src/transport/tcp_server_legacy.c 422src/transport/tcp_server_legacy.c
425src/transport/tcp_server_mst_legacy.c 423src/transport/tcp_server_mst_legacy.c
426src/transport/tcp_service_legacy.c 424src/transport/tcp_service_legacy.c
427src/transport/transport_api2_address.c 425src/transport/transport_api2_address.c
426src/transport/transport_api2_application.c
428src/transport/transport_api2_communication.c 427src/transport/transport_api2_communication.c
429src/transport/transport_api2_core.c 428src/transport/transport_api2_core.c
430src/transport/transport_api2_monitor.c 429src/transport/transport_api2_monitor.c
diff --git a/po/de.po b/po/de.po
index 3d245bd55..b25091255 100644
--- a/po/de.po
+++ b/po/de.po
@@ -10,7 +10,7 @@ msgid ""
10msgstr "" 10msgstr ""
11"Project-Id-Version: gnunet 0.10.1\n" 11"Project-Id-Version: gnunet 0.10.1\n"
12"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" 12"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
13"POT-Creation-Date: 2019-02-28 11:41+0100\n" 13"POT-Creation-Date: 2019-04-04 12:39+0200\n"
14"PO-Revision-Date: 2015-03-08 16:16+0100\n" 14"PO-Revision-Date: 2015-03-08 16:16+0100\n"
15"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n" 15"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
16"Language-Team: German <translation-team-de@lists.sourceforge.net>\n" 16"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
@@ -226,8 +226,7 @@ msgid "Control services and the Automated Restart Manager (ARM)"
226msgstr "" 226msgstr ""
227 227
228#: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120 228#: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120
229#: src/transport/plugin_transport_xt.c:1120 229#: src/transport/tcp_service_legacy.c:557
230#: src/transport/tcp_service_legacy.c:557 src/util/service.c:1167
231#, c-format 230#, c-format
232msgid "" 231msgid ""
233"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n" 232"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
@@ -237,35 +236,29 @@ msgstr ""
237#: src/transport/plugin_transport_tcp.c:1139 236#: src/transport/plugin_transport_tcp.c:1139
238#: src/transport/plugin_transport_tcp.c:1145 237#: src/transport/plugin_transport_tcp.c:1145
239#: src/transport/plugin_transport_tcp.c:3835 238#: src/transport/plugin_transport_tcp.c:3835
240#: src/transport/plugin_transport_xt.c:1139
241#: src/transport/plugin_transport_xt.c:1145
242#: src/transport/plugin_transport_xt.c:3833
243#: src/transport/tcp_service_legacy.c:576 239#: src/transport/tcp_service_legacy.c:576
244#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1192 240#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1156
245#: src/util/service.c:1198 241#: src/util/service.c:1162
246#, c-format 242#, c-format
247msgid "Require valid port number for service `%s' in configuration!\n" 243msgid "Require valid port number for service `%s' in configuration!\n"
248msgstr "" 244msgstr ""
249 245
250#: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176 246#: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176
251#: src/transport/plugin_transport_xt.c:1176 247#: src/transport/tcp_service_legacy.c:613 src/util/client.c:521
252#: src/transport/tcp_service_legacy.c:613 src/util/client.c:506 248#: src/util/service.c:1201
253#: src/util/service.c:1237
254#, c-format 249#, c-format
255msgid "UNIXPATH `%s' too long, maximum length is %llu\n" 250msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
256msgstr "" 251msgstr ""
257 252
258#: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180 253#: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180
259#: src/transport/plugin_transport_xt.c:1180 254#: src/transport/tcp_service_legacy.c:617 src/util/client.c:526
260#: src/transport/tcp_service_legacy.c:617 src/util/client.c:511 255#: src/util/service.c:1206
261#: src/util/service.c:1242
262#, c-format 256#, c-format
263msgid "Using `%s' instead\n" 257msgid "Using `%s' instead\n"
264msgstr "" 258msgstr ""
265 259
266#: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211 260#: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211
267#: src/transport/plugin_transport_xt.c:1211 261#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1242
268#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1278
269#, c-format 262#, c-format
270msgid "" 263msgid ""
271"Disabling UNIX domain socket support for service `%s', failed to create UNIX " 264"Disabling UNIX domain socket support for service `%s', failed to create UNIX "
@@ -273,8 +266,7 @@ msgid ""
273msgstr "" 266msgstr ""
274 267
275#: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228 268#: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228
276#: src/transport/plugin_transport_xt.c:1228 269#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1260
277#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1296
278#, c-format 270#, c-format
279msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n" 271msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
280msgstr "" 272msgstr ""
@@ -282,8 +274,7 @@ msgstr ""
282#: src/arm/gnunet-service-arm.c:556 274#: src/arm/gnunet-service-arm.c:556
283#: src/transport/plugin_transport_http_server.c:2688 275#: src/transport/plugin_transport_http_server.c:2688
284#: src/transport/plugin_transport_tcp.c:1259 276#: src/transport/plugin_transport_tcp.c:1259
285#: src/transport/plugin_transport_xt.c:1259 277#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1301
286#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1337
287#, c-format 278#, c-format
288msgid "Failed to resolve `%s': %s\n" 279msgid "Failed to resolve `%s': %s\n"
289msgstr "»%s« konnte nicht aufgelöst werden: %s\n" 280msgstr "»%s« konnte nicht aufgelöst werden: %s\n"
@@ -291,8 +282,7 @@ msgstr "»%s« konnte nicht aufgelöst werden: %s\n"
291#: src/arm/gnunet-service-arm.c:575 282#: src/arm/gnunet-service-arm.c:575
292#: src/transport/plugin_transport_http_server.c:2706 283#: src/transport/plugin_transport_http_server.c:2706
293#: src/transport/plugin_transport_tcp.c:1278 284#: src/transport/plugin_transport_tcp.c:1278
294#: src/transport/plugin_transport_xt.c:1278 285#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1321
295#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1357
296#, fuzzy, c-format 286#, fuzzy, c-format
297msgid "Failed to find %saddress for `%s'.\n" 287msgid "Failed to find %saddress for `%s'.\n"
298msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n" 288msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
@@ -1603,6 +1593,11 @@ msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
1603msgid "Unable to parse ATTR record string `%s'\n" 1593msgid "Unable to parse ATTR record string `%s'\n"
1604msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':" 1594msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
1605 1595
1596#: src/credential/plugin_rest_credential.c:1128
1597#, fuzzy
1598msgid "GNS REST API initialized\n"
1599msgstr " Verbindung fehlgeschlagen\n"
1600
1606#: src/datacache/datacache.c:119 src/datacache/datacache.c:311 1601#: src/datacache/datacache.c:119 src/datacache/datacache.c:311
1607#: src/datastore/gnunet-service-datastore.c:757 1602#: src/datastore/gnunet-service-datastore.c:757
1608msgid "# bytes stored" 1603msgid "# bytes stored"
@@ -2107,7 +2102,7 @@ msgstr ""
2107msgid "Exiting as the number of peers is %u\n" 2102msgid "Exiting as the number of peers is %u\n"
2108msgstr "" 2103msgstr ""
2109 2104
2110#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2959 2105#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2981
2111#, fuzzy 2106#, fuzzy
2112msgid "number of peers to start" 2107msgid "number of peers to start"
2113msgstr "Anzahl an Durchläufen" 2108msgstr "Anzahl an Durchläufen"
@@ -3212,11 +3207,11 @@ msgstr "Sie dürfen nur eine Datei zum Deindizieren angeben.\n"
3212msgid "set the desired LEVEL of sender-anonymity" 3207msgid "set the desired LEVEL of sender-anonymity"
3213msgstr "Gewünschten Grad LEVEL an Sender-Anonymität festlegen" 3208msgstr "Gewünschten Grad LEVEL an Sender-Anonymität festlegen"
3214 3209
3215#: src/fs/gnunet-auto-share.c:772 src/fs/gnunet-publish.c:907 3210#: src/fs/gnunet-auto-share.c:772
3216msgid "disable adding the creation time to the metadata of the uploaded file" 3211msgid "disable adding the creation time to the metadata of the uploaded file"
3217msgstr "" 3212msgstr ""
3218 3213
3219#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:912 3214#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:907
3220msgid "do not use libextractor to add keywords or metadata" 3215msgid "do not use libextractor to add keywords or metadata"
3221msgstr "" 3216msgstr ""
3222 3217
@@ -3523,6 +3518,10 @@ msgstr "Option `%s' macht keinen Sinn ohne die Option `%s'.\n"
3523msgid "Option `%s' makes no sense without option `%s'.\n" 3518msgid "Option `%s' makes no sense without option `%s'.\n"
3524msgstr "Die Option »%s« ergibt keinen Sinn ohne die Option »%s«.\n" 3519msgstr "Die Option »%s« ergibt keinen Sinn ohne die Option »%s«.\n"
3525 3520
3521#: src/fs/gnunet-publish.c:911
3522msgid "enable adding the creation time to the metadata of the uploaded file"
3523msgstr ""
3524
3526#: src/fs/gnunet-publish.c:916 3525#: src/fs/gnunet-publish.c:916
3527msgid "" 3526msgid ""
3528"print list of extracted keywords that would be used, but do not perform " 3527"print list of extracted keywords that would be used, but do not perform "
@@ -4033,39 +4032,39 @@ msgstr ""
4033msgid "GNUnet HTTP server to create business cards" 4032msgid "GNUnet HTTP server to create business cards"
4034msgstr "" 4033msgstr ""
4035 4034
4036#: src/gns/gnunet-dns2gns.c:203 4035#: src/gns/gnunet-dns2gns.c:214
4037msgid "Failed to pack DNS response into UDP packet!\n" 4036msgid "Failed to pack DNS response into UDP packet!\n"
4038msgstr "" 4037msgstr ""
4039 4038
4040#: src/gns/gnunet-dns2gns.c:405 4039#: src/gns/gnunet-dns2gns.c:416
4041#, c-format 4040#, c-format
4042msgid "Cannot parse DNS request from %s\n" 4041msgid "Cannot parse DNS request from %s\n"
4043msgstr "" 4042msgstr ""
4044 4043
4045#: src/gns/gnunet-dns2gns.c:421 4044#: src/gns/gnunet-dns2gns.c:432
4046#, fuzzy, c-format 4045#, fuzzy, c-format
4047msgid "Received malformed DNS request from %s\n" 4046msgid "Received malformed DNS request from %s\n"
4048msgstr "Beschädigte Antwort auf `%s' von Knoten `%s' empfangen.\n" 4047msgstr "Beschädigte Antwort auf `%s' von Knoten `%s' empfangen.\n"
4049 4048
4050#: src/gns/gnunet-dns2gns.c:429 4049#: src/gns/gnunet-dns2gns.c:440
4051#, fuzzy, c-format 4050#, fuzzy, c-format
4052msgid "Received unsupported DNS request from %s\n" 4051msgid "Received unsupported DNS request from %s\n"
4053msgstr "Unbekannte Anfrageart %d empfangen bei %s:%d\n" 4052msgstr "Unbekannte Anfrageart %d empfangen bei %s:%d\n"
4054 4053
4055#: src/gns/gnunet-dns2gns.c:588 4054#: src/gns/gnunet-dns2gns.c:600
4056#, fuzzy 4055#, fuzzy
4057msgid "No DNS server specified!\n" 4056msgid "No DNS server specified!\n"
4058msgstr "Keine Schlüsselwörter angegeben!\n" 4057msgstr "Keine Schlüsselwörter angegeben!\n"
4059 4058
4060#: src/gns/gnunet-dns2gns.c:688 4059#: src/gns/gnunet-dns2gns.c:748
4061msgid "IP of recursive DNS resolver to use (required)" 4060msgid "IP of recursive DNS resolver to use (required)"
4062msgstr "" 4061msgstr ""
4063 4062
4064#: src/gns/gnunet-dns2gns.c:693 4063#: src/gns/gnunet-dns2gns.c:753
4065msgid "UDP port to listen on for inbound DNS requests; default: 2853" 4064msgid "UDP port to listen on for inbound DNS requests; default: 2853"
4066msgstr "" 4065msgstr ""
4067 4066
4068#: src/gns/gnunet-dns2gns.c:710 4067#: src/gns/gnunet-dns2gns.c:770
4069msgid "GNUnet DNS-to-GNS proxy (a DNS server)" 4068msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
4070msgstr "" 4069msgstr ""
4071 4070
@@ -4138,104 +4137,104 @@ msgstr ""
4138msgid "%s failed at %s:%d: `%s'\n" 4137msgid "%s failed at %s:%d: `%s'\n"
4139msgstr "»%s« schlug fehl bei %s:%d mit dem Fehler: »%s«.\n" 4138msgstr "»%s« schlug fehl bei %s:%d mit dem Fehler: »%s«.\n"
4140 4139
4141#: src/gns/gnunet-gns-proxy.c:980 4140#: src/gns/gnunet-gns-proxy.c:989
4142#, fuzzy, c-format 4141#, fuzzy, c-format
4143msgid "Unsupported CURL TLS backend %d\n" 4142msgid "Unsupported CURL TLS backend %d\n"
4144msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n" 4143msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
4145 4144
4146#: src/gns/gnunet-gns-proxy.c:1005 4145#: src/gns/gnunet-gns-proxy.c:1014
4147#, fuzzy, c-format 4146#, fuzzy, c-format
4148msgid "Failed to fetch CN from cert: %s\n" 4147msgid "Failed to fetch CN from cert: %s\n"
4149msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n" 4148msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
4150 4149
4151#: src/gns/gnunet-gns-proxy.c:1026 4150#: src/gns/gnunet-gns-proxy.c:1035
4152#, fuzzy, c-format 4151#, fuzzy, c-format
4153msgid "Failed to initialize DANE: %s\n" 4152msgid "Failed to initialize DANE: %s\n"
4154msgstr "SQLite Datenbank konnte nicht initialisiert werden.\n" 4153msgstr "SQLite Datenbank konnte nicht initialisiert werden.\n"
4155 4154
4156#: src/gns/gnunet-gns-proxy.c:1041 4155#: src/gns/gnunet-gns-proxy.c:1050
4157#, fuzzy, c-format 4156#, fuzzy, c-format
4158msgid "Failed to parse DANE record: %s\n" 4157msgid "Failed to parse DANE record: %s\n"
4159msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n" 4158msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n"
4160 4159
4161#: src/gns/gnunet-gns-proxy.c:1056 4160#: src/gns/gnunet-gns-proxy.c:1065
4162#, fuzzy, c-format 4161#, fuzzy, c-format
4163msgid "Failed to verify TLS connection using DANE: %s\n" 4162msgid "Failed to verify TLS connection using DANE: %s\n"
4164msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n" 4163msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
4165 4164
4166#: src/gns/gnunet-gns-proxy.c:1066 4165#: src/gns/gnunet-gns-proxy.c:1075
4167#, c-format 4166#, c-format
4168msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n" 4167msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
4169msgstr "" 4168msgstr ""
4170 4169
4171#: src/gns/gnunet-gns-proxy.c:1090 4170#: src/gns/gnunet-gns-proxy.c:1099
4172#, c-format 4171#, c-format
4173msgid "TLS certificate subject name (%s) does not match `%s': %d\n" 4172msgid "TLS certificate subject name (%s) does not match `%s': %d\n"
4174msgstr "" 4173msgstr ""
4175 4174
4176#: src/gns/gnunet-gns-proxy.c:1221 4175#: src/gns/gnunet-gns-proxy.c:1230
4177#, c-format 4176#, c-format
4178msgid "Cookie domain `%s' supplied by server is invalid\n" 4177msgid "Cookie domain `%s' supplied by server is invalid\n"
4179msgstr "" 4178msgstr ""
4180 4179
4181#: src/gns/gnunet-gns-proxy.c:2122 4180#: src/gns/gnunet-gns-proxy.c:2131
4182#, fuzzy, c-format 4181#, fuzzy, c-format
4183msgid "Unsupported HTTP method `%s'\n" 4182msgid "Unsupported HTTP method `%s'\n"
4184msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n" 4183msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
4185 4184
4186#: src/gns/gnunet-gns-proxy.c:2643 4185#: src/gns/gnunet-gns-proxy.c:2652
4187#, fuzzy, c-format 4186#, fuzzy, c-format
4188msgid "Unable to import private key from file `%s'\n" 4187msgid "Unable to import private key from file `%s'\n"
4189msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':" 4188msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
4190 4189
4191#: src/gns/gnunet-gns-proxy.c:2675 4190#: src/gns/gnunet-gns-proxy.c:2684
4192#, fuzzy, c-format 4191#, fuzzy, c-format
4193msgid "Unable to import certificate from `%s'\n" 4192msgid "Unable to import certificate from `%s'\n"
4194msgstr "SQLite Datenbank konnte nicht initialisiert werden: %s.\n" 4193msgstr "SQLite Datenbank konnte nicht initialisiert werden: %s.\n"
4195 4194
4196#: src/gns/gnunet-gns-proxy.c:2876 4195#: src/gns/gnunet-gns-proxy.c:2885
4197#, fuzzy, c-format 4196#, fuzzy, c-format
4198msgid "Failed to start HTTPS server for `%s'\n" 4197msgid "Failed to start HTTPS server for `%s'\n"
4199msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n" 4198msgstr "Der Transportdienst auf Port %d konnte nicht gestartet werden.\n"
4200 4199
4201#: src/gns/gnunet-gns-proxy.c:2898 src/rest/gnunet-rest-server.c:658 4200#: src/gns/gnunet-gns-proxy.c:2907 src/rest/gnunet-rest-server.c:668
4202#, fuzzy 4201#, fuzzy
4203msgid "Failed to pass client to MHD\n" 4202msgid "Failed to pass client to MHD\n"
4204msgstr "Fehler beim Starten der Collection.\n" 4203msgstr "Fehler beim Starten der Collection.\n"
4205 4204
4206#: src/gns/gnunet-gns-proxy.c:3234 4205#: src/gns/gnunet-gns-proxy.c:3243
4207#, c-format 4206#, c-format
4208msgid "Unsupported socks version %d\n" 4207msgid "Unsupported socks version %d\n"
4209msgstr "" 4208msgstr ""
4210 4209
4211#: src/gns/gnunet-gns-proxy.c:3263 4210#: src/gns/gnunet-gns-proxy.c:3272
4212#, fuzzy, c-format 4211#, fuzzy, c-format
4213msgid "Unsupported socks command %d\n" 4212msgid "Unsupported socks command %d\n"
4214msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n" 4213msgstr "Kommando `%s' wird nicht unterstützt. Vorgang wird abgebrochen.\n"
4215 4214
4216#: src/gns/gnunet-gns-proxy.c:3346 4215#: src/gns/gnunet-gns-proxy.c:3355
4217#, c-format 4216#, c-format
4218msgid "Unsupported socks address type %d\n" 4217msgid "Unsupported socks address type %d\n"
4219msgstr "" 4218msgstr ""
4220 4219
4221#: src/gns/gnunet-gns-proxy.c:3636 4220#: src/gns/gnunet-gns-proxy.c:3693
4222#, fuzzy, c-format 4221#, fuzzy, c-format
4223msgid "Failed to load X.509 key and certificate from `%s'\n" 4222msgid "Failed to load X.509 key and certificate from `%s'\n"
4224msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n" 4223msgstr "Fehler beim Lesen der Freunde-Liste von `%s'\n"
4225 4224
4226#: src/gns/gnunet-gns-proxy.c:3764 4225#: src/gns/gnunet-gns-proxy.c:3821
4227msgid "listen on specified port (default: 7777)" 4226msgid "listen on specified port (default: 7777)"
4228msgstr "" 4227msgstr ""
4229 4228
4230#: src/gns/gnunet-gns-proxy.c:3769 4229#: src/gns/gnunet-gns-proxy.c:3826
4231msgid "pem file to use as CA" 4230msgid "pem file to use as CA"
4232msgstr "" 4231msgstr ""
4233 4232
4234#: src/gns/gnunet-gns-proxy.c:3773 4233#: src/gns/gnunet-gns-proxy.c:3830
4235msgid "disable use of IPv6" 4234msgid "disable use of IPv6"
4236msgstr "" 4235msgstr ""
4237 4236
4238#: src/gns/gnunet-gns-proxy.c:3799 4237#: src/gns/gnunet-gns-proxy.c:3856
4239msgid "GNUnet GNS proxy" 4238msgid "GNUnet GNS proxy"
4240msgstr "" 4239msgstr ""
4241 4240
@@ -4345,6 +4344,11 @@ msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
4345msgid "Unable to parse BOX record string `%s'\n" 4344msgid "Unable to parse BOX record string `%s'\n"
4346msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':" 4345msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
4347 4346
4347#: src/gns/plugin_rest_gns.c:452
4348#, fuzzy
4349msgid "Gns REST API initialized\n"
4350msgstr " Verbindung fehlgeschlagen\n"
4351
4348#: src/gnsrecord/plugin_gnsrecord_dns.c:359 4352#: src/gnsrecord/plugin_gnsrecord_dns.c:359
4349#, c-format 4353#, c-format
4350msgid "Unable to parse IPv4 address `%s'\n" 4354msgid "Unable to parse IPv4 address `%s'\n"
@@ -4863,6 +4867,10 @@ msgstr "Fehler beim Speichern der Konfigurationsdatei `%s':"
4863msgid "Failed to create directory `%s' for storing egos\n" 4867msgid "Failed to create directory `%s' for storing egos\n"
4864msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n" 4868msgstr "Dateiformat fehlerhaft (kein GNUnet Verzeichnis?)\n"
4865 4869
4870#: src/identity/plugin_rest_identity.c:1297
4871msgid "Identity REST API initialized\n"
4872msgstr ""
4873
4866#: src/json/json.c:123 4874#: src/json/json.c:123
4867#, fuzzy, c-format 4875#, fuzzy, c-format
4868msgid "Failed to parse JSON in option `%s': %s (%s)\n" 4876msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -5258,6 +5266,11 @@ msgstr ""
5258msgid "heap file database running\n" 5266msgid "heap file database running\n"
5259msgstr "Sqlite-Datenbank läuft\n" 5267msgstr "Sqlite-Datenbank läuft\n"
5260 5268
5269#: src/namestore/plugin_rest_namestore.c:1079
5270#, fuzzy
5271msgid "Namestore REST API initialized\n"
5272msgstr " Verbindung fehlgeschlagen\n"
5273
5261#: src/nat-auto/gnunet-nat-auto.c:193 5274#: src/nat-auto/gnunet-nat-auto.c:193
5262#, fuzzy 5275#, fuzzy
5263msgid "Suggested configuration changes:\n" 5276msgid "Suggested configuration changes:\n"
@@ -5644,7 +5657,7 @@ msgid "\tExpires: %s \t %s\n"
5644msgstr "" 5657msgstr ""
5645 5658
5646#: src/peerinfo-tool/gnunet-peerinfo.c:299 5659#: src/peerinfo-tool/gnunet-peerinfo.c:299
5647#: src/rest-plugins/plugin_rest_peerinfo.c:501 5660#: src/peerinfo-tool/plugin_rest_peerinfo.c:501
5648#, fuzzy, c-format 5661#, fuzzy, c-format
5649msgid "Failure: Cannot convert address to string for peer `%s'\n" 5662msgid "Failure: Cannot convert address to string for peer `%s'\n"
5650msgstr "Adresse des Knotens `%s' konnte nicht ermittelt werden.\n" 5663msgstr "Adresse des Knotens `%s' konnte nicht ermittelt werden.\n"
@@ -5724,6 +5737,11 @@ msgstr "Teste Transport(e) %s\n"
5724msgid "Failed to load transport plugin for `%s'\n" 5737msgid "Failed to load transport plugin for `%s'\n"
5725msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n" 5738msgstr "Anwendung `%s' konnte nicht initialisiert werden.\n"
5726 5739
5740#: src/peerinfo-tool/plugin_rest_peerinfo.c:796
5741#, fuzzy
5742msgid "Peerinfo REST API initialized\n"
5743msgstr " Verbindung fehlgeschlagen\n"
5744
5727#: src/peerstore/gnunet-peerstore.c:91 5745#: src/peerstore/gnunet-peerstore.c:91
5728msgid "peerstore" 5746msgid "peerstore"
5729msgstr "" 5747msgstr ""
@@ -5888,6 +5906,12 @@ msgstr ""
5888msgid "Expiration interval of the attribute" 5906msgid "Expiration interval of the attribute"
5889msgstr "" 5907msgstr ""
5890 5908
5909#: src/reclaim/plugin_rest_openid_connect.c:2279
5910#: src/reclaim/plugin_rest_reclaim.c:1079
5911#, fuzzy
5912msgid "Identity Provider REST API initialized\n"
5913msgstr " Verbindung fehlgeschlagen\n"
5914
5891#: src/reclaim/reclaim_api.c:436 5915#: src/reclaim/reclaim_api.c:436
5892#, fuzzy 5916#, fuzzy
5893msgid "failed to store record\n" 5917msgid "failed to store record\n"
@@ -5977,50 +6001,20 @@ msgstr ""
5977msgid "Search string `%s' is too long!\n" 6001msgid "Search string `%s' is too long!\n"
5978msgstr "Dienst »%s« läuft nicht\n" 6002msgstr "Dienst »%s« läuft nicht\n"
5979 6003
5980#: src/rest/gnunet-rest-server.c:927 6004#: src/rest/gnunet-rest-server.c:986
5981msgid "listen on specified port (default: 7776)" 6005msgid "listen on specified port (default: 7776)"
5982msgstr "" 6006msgstr ""
5983 6007
5984#: src/rest/gnunet-rest-server.c:944 6008#: src/rest/gnunet-rest-server.c:1003
5985#, fuzzy 6009#, fuzzy
5986msgid "GNUnet REST server" 6010msgid "GNUnet REST server"
5987msgstr "GNUnet Netzwerk Topologie tracen." 6011msgstr "GNUnet Netzwerk Topologie tracen."
5988 6012
5989#: src/rest-plugins/plugin_rest_copying.c:209 6013#: src/rest/plugin_rest_copying.c:209
5990#, fuzzy 6014#, fuzzy
5991msgid "COPYING REST API initialized\n" 6015msgid "COPYING REST API initialized\n"
5992msgstr " Verbindung fehlgeschlagen\n" 6016msgstr " Verbindung fehlgeschlagen\n"
5993 6017
5994#: src/rest-plugins/plugin_rest_credential.c:1128
5995#, fuzzy
5996msgid "GNS REST API initialized\n"
5997msgstr " Verbindung fehlgeschlagen\n"
5998
5999#: src/rest-plugins/plugin_rest_gns.c:452
6000#, fuzzy
6001msgid "Gns REST API initialized\n"
6002msgstr " Verbindung fehlgeschlagen\n"
6003
6004#: src/rest-plugins/plugin_rest_identity.c:1297
6005msgid "Identity REST API initialized\n"
6006msgstr ""
6007
6008#: src/rest-plugins/plugin_rest_namestore.c:1079
6009#, fuzzy
6010msgid "Namestore REST API initialized\n"
6011msgstr " Verbindung fehlgeschlagen\n"
6012
6013#: src/rest-plugins/plugin_rest_openid_connect.c:2279
6014#: src/rest-plugins/plugin_rest_reclaim.c:1079
6015#, fuzzy
6016msgid "Identity Provider REST API initialized\n"
6017msgstr " Verbindung fehlgeschlagen\n"
6018
6019#: src/rest-plugins/plugin_rest_peerinfo.c:796
6020#, fuzzy
6021msgid "Peerinfo REST API initialized\n"
6022msgstr " Verbindung fehlgeschlagen\n"
6023
6024#: src/revocation/gnunet-revocation.c:129 6018#: src/revocation/gnunet-revocation.c:129
6025#, c-format 6019#, c-format
6026msgid "Key `%s' is valid\n" 6020msgid "Key `%s' is valid\n"
@@ -6167,20 +6161,20 @@ msgstr ""
6167msgid "Get peers from biased stream" 6161msgid "Get peers from biased stream"
6168msgstr "" 6162msgstr ""
6169 6163
6170#: src/rps/gnunet-rps-profiler.c:2964 6164#: src/rps/gnunet-rps-profiler.c:2986
6171msgid "duration of the profiling" 6165msgid "duration of the profiling"
6172msgstr "" 6166msgstr ""
6173 6167
6174#: src/rps/gnunet-rps-profiler.c:2969 6168#: src/rps/gnunet-rps-profiler.c:2991
6175msgid "timeout for the profiling" 6169msgid "timeout for the profiling"
6176msgstr "" 6170msgstr ""
6177 6171
6178#: src/rps/gnunet-rps-profiler.c:2974 6172#: src/rps/gnunet-rps-profiler.c:2996
6179#, fuzzy 6173#, fuzzy
6180msgid "number of PeerIDs to request" 6174msgid "number of PeerIDs to request"
6181msgstr "Anzahl an Durchläufen" 6175msgstr "Anzahl an Durchläufen"
6182 6176
6183#: src/rps/gnunet-rps-profiler.c:2990 6177#: src/rps/gnunet-rps-profiler.c:3012
6184msgid "Measure quality and performance of the RPS service." 6178msgid "Measure quality and performance of the RPS service."
6185msgstr "" 6179msgstr ""
6186 6180
@@ -6901,18 +6895,18 @@ msgstr "# HELLO-Meldungen empfangen"
6901msgid "GNUnet topology control" 6895msgid "GNUnet topology control"
6902msgstr "" 6896msgstr ""
6903 6897
6904#: src/transport/gnunet-communicator-tcp.c:2329 6898#: src/transport/gnunet-communicator-tcp.c:2328
6905#: src/transport/gnunet-communicator-udp.c:2883 6899#: src/transport/gnunet-communicator-udp.c:2882
6906#: src/transport/gnunet-service-tng.c:4747 6900#: src/transport/gnunet-service-tng.c:4888
6907#: src/transport/gnunet-service-transport.c:2795 6901#: src/transport/gnunet-service-transport.c:2795
6908msgid "Transport service is lacking key configuration settings. Exiting.\n" 6902msgid "Transport service is lacking key configuration settings. Exiting.\n"
6909msgstr "" 6903msgstr ""
6910 6904
6911#: src/transport/gnunet-communicator-tcp.c:2393 6905#: src/transport/gnunet-communicator-tcp.c:2392
6912msgid "GNUnet TCP communicator" 6906msgid "GNUnet TCP communicator"
6913msgstr "" 6907msgstr ""
6914 6908
6915#: src/transport/gnunet-communicator-udp.c:2954 6909#: src/transport/gnunet-communicator-udp.c:2953
6916msgid "GNUnet UDP communicator" 6910msgid "GNUnet UDP communicator"
6917msgstr "" 6911msgstr ""
6918 6912
@@ -7483,8 +7477,6 @@ msgstr ""
7483#: src/transport/plugin_transport_http_server.c:3530 7477#: src/transport/plugin_transport_http_server.c:3530
7484#: src/transport/plugin_transport_tcp.c:3901 7478#: src/transport/plugin_transport_tcp.c:3901
7485#: src/transport/plugin_transport_tcp.c:3908 7479#: src/transport/plugin_transport_tcp.c:3908
7486#: src/transport/plugin_transport_xt.c:3899
7487#: src/transport/plugin_transport_xt.c:3906
7488msgid "TCP_STEALTH not supported on this platform.\n" 7480msgid "TCP_STEALTH not supported on this platform.\n"
7489msgstr "" 7481msgstr ""
7490 7482
@@ -7554,7 +7546,6 @@ msgstr ""
7554 7546
7555#: src/transport/plugin_transport_http_server.c:2905 7547#: src/transport/plugin_transport_http_server.c:2905
7556#: src/transport/plugin_transport_udp.c:3627 7548#: src/transport/plugin_transport_udp.c:3627
7557#: src/transport/plugin_transport_xu.c:2049
7558msgid "Disabling IPv6 since it is not supported on this system!\n" 7549msgid "Disabling IPv6 since it is not supported on this system!\n"
7559msgstr "" 7550msgstr ""
7560 7551
@@ -7659,8 +7650,6 @@ msgstr "# Bytes verworfen von SMTP (ausgehend)"
7659 7650
7660#: src/transport/plugin_transport_tcp.c:1557 7651#: src/transport/plugin_transport_tcp.c:1557
7661#: src/transport/plugin_transport_tcp.c:2883 7652#: src/transport/plugin_transport_tcp.c:2883
7662#: src/transport/plugin_transport_xt.c:1553
7663#: src/transport/plugin_transport_xt.c:2879
7664#, c-format 7653#, c-format
7665msgid "Unexpected address length: %u bytes\n" 7654msgid "Unexpected address length: %u bytes\n"
7666msgstr "" 7655msgstr ""
@@ -7669,9 +7658,6 @@ msgstr ""
7669#: src/transport/plugin_transport_tcp.c:1964 7658#: src/transport/plugin_transport_tcp.c:1964
7670#: src/transport/plugin_transport_tcp.c:3147 7659#: src/transport/plugin_transport_tcp.c:3147
7671#: src/transport/plugin_transport_tcp.c:4024 7660#: src/transport/plugin_transport_tcp.c:4024
7672#: src/transport/plugin_transport_xt.c:1736
7673#: src/transport/plugin_transport_xt.c:1960
7674#: src/transport/plugin_transport_xt.c:3143
7675msgid "# TCP sessions active" 7661msgid "# TCP sessions active"
7676msgstr "# aktive TCP-Sitzungen" 7662msgstr "# aktive TCP-Sitzungen"
7677 7663
@@ -7681,87 +7667,66 @@ msgstr "# aktive TCP-Sitzungen"
7681#: src/transport/plugin_transport_tcp.c:2143 7667#: src/transport/plugin_transport_tcp.c:2143
7682#: src/transport/plugin_transport_tcp.c:2243 7668#: src/transport/plugin_transport_tcp.c:2243
7683#: src/transport/plugin_transport_tcp.c:2268 7669#: src/transport/plugin_transport_tcp.c:2268
7684#: src/transport/plugin_transport_xt.c:1778
7685#: src/transport/plugin_transport_xt.c:1942
7686#: src/transport/plugin_transport_xt.c:2066
7687#: src/transport/plugin_transport_xt.c:2139
7688#: src/transport/plugin_transport_xt.c:2239
7689#: src/transport/plugin_transport_xt.c:2264
7690msgid "# bytes currently in TCP buffers" 7670msgid "# bytes currently in TCP buffers"
7691msgstr "# Bytes derzeit in TCP-Puffern" 7671msgstr "# Bytes derzeit in TCP-Puffern"
7692 7672
7693#: src/transport/plugin_transport_tcp.c:1785 7673#: src/transport/plugin_transport_tcp.c:1785
7694#: src/transport/plugin_transport_xt.c:1781
7695msgid "# bytes discarded by TCP (disconnect)" 7674msgid "# bytes discarded by TCP (disconnect)"
7696msgstr "# Bytes verworfen von TCP (unterbrochen)" 7675msgstr "# Bytes verworfen von TCP (unterbrochen)"
7697 7676
7698#: src/transport/plugin_transport_tcp.c:2073 7677#: src/transport/plugin_transport_tcp.c:2073
7699#: src/transport/plugin_transport_xt.c:2069
7700msgid "# bytes discarded by TCP (timeout)" 7678msgid "# bytes discarded by TCP (timeout)"
7701msgstr "# Bytes verworfen von TCP (Zeitüberschreitung)" 7679msgstr "# Bytes verworfen von TCP (Zeitüberschreitung)"
7702 7680
7703#: src/transport/plugin_transport_tcp.c:2147 7681#: src/transport/plugin_transport_tcp.c:2147
7704#: src/transport/plugin_transport_xt.c:2143
7705msgid "# bytes transmitted via TCP" 7682msgid "# bytes transmitted via TCP"
7706msgstr "# Bytes über TCP übertragen" 7683msgstr "# Bytes über TCP übertragen"
7707 7684
7708#: src/transport/plugin_transport_tcp.c:2545 7685#: src/transport/plugin_transport_tcp.c:2545
7709#: src/transport/plugin_transport_xt.c:2541
7710msgid "# requests to create session with invalid address" 7686msgid "# requests to create session with invalid address"
7711msgstr "" 7687msgstr ""
7712 7688
7713#: src/transport/plugin_transport_tcp.c:2721 7689#: src/transport/plugin_transport_tcp.c:2721
7714#: src/transport/plugin_transport_xt.c:2717
7715msgid "# transport-service disconnect requests for TCP" 7690msgid "# transport-service disconnect requests for TCP"
7716msgstr "" 7691msgstr ""
7717 7692
7718#: src/transport/plugin_transport_tcp.c:3213 7693#: src/transport/plugin_transport_tcp.c:3213
7719#: src/transport/plugin_transport_xt.c:3209
7720#, fuzzy 7694#, fuzzy
7721msgid "# TCP WELCOME messages received" 7695msgid "# TCP WELCOME messages received"
7722msgstr "# verschlüsselter PONG Nachrichten empfangen" 7696msgstr "# verschlüsselter PONG Nachrichten empfangen"
7723 7697
7724#: src/transport/plugin_transport_tcp.c:3419 7698#: src/transport/plugin_transport_tcp.c:3419
7725#: src/transport/plugin_transport_xt.c:3415
7726msgid "# bytes received via TCP" 7699msgid "# bytes received via TCP"
7727msgstr "# Bytes empfangen über TCP" 7700msgstr "# Bytes empfangen über TCP"
7728 7701
7729#: src/transport/plugin_transport_tcp.c:3470 7702#: src/transport/plugin_transport_tcp.c:3470
7730#: src/transport/plugin_transport_tcp.c:3528 7703#: src/transport/plugin_transport_tcp.c:3528
7731#: src/transport/plugin_transport_xt.c:3466
7732#: src/transport/plugin_transport_xt.c:3524
7733#, fuzzy 7704#, fuzzy
7734msgid "# TCP server connections active" 7705msgid "# TCP server connections active"
7735msgstr " Verbindung fehlgeschlagen\n" 7706msgstr " Verbindung fehlgeschlagen\n"
7736 7707
7737#: src/transport/plugin_transport_tcp.c:3474 7708#: src/transport/plugin_transport_tcp.c:3474
7738#: src/transport/plugin_transport_xt.c:3470
7739#, fuzzy 7709#, fuzzy
7740msgid "# TCP server connect events" 7710msgid "# TCP server connect events"
7741msgstr "# verbundener Knoten" 7711msgstr "# verbundener Knoten"
7742 7712
7743#: src/transport/plugin_transport_tcp.c:3480 7713#: src/transport/plugin_transport_tcp.c:3480
7744#: src/transport/plugin_transport_xt.c:3476
7745msgid "TCP connection limit reached, suspending server\n" 7714msgid "TCP connection limit reached, suspending server\n"
7746msgstr "" 7715msgstr ""
7747 7716
7748#: src/transport/plugin_transport_tcp.c:3482 7717#: src/transport/plugin_transport_tcp.c:3482
7749#: src/transport/plugin_transport_xt.c:3478
7750msgid "# TCP service suspended" 7718msgid "# TCP service suspended"
7751msgstr "" 7719msgstr ""
7752 7720
7753#: src/transport/plugin_transport_tcp.c:3522 7721#: src/transport/plugin_transport_tcp.c:3522
7754#: src/transport/plugin_transport_xt.c:3518
7755msgid "# TCP service resumed" 7722msgid "# TCP service resumed"
7756msgstr "" 7723msgstr ""
7757 7724
7758#: src/transport/plugin_transport_tcp.c:3532 7725#: src/transport/plugin_transport_tcp.c:3532
7759#: src/transport/plugin_transport_xt.c:3528
7760msgid "# network-level TCP disconnect events" 7726msgid "# network-level TCP disconnect events"
7761msgstr "" 7727msgstr ""
7762 7728
7763#: src/transport/plugin_transport_tcp.c:3851 7729#: src/transport/plugin_transport_tcp.c:3851
7764#: src/transport/plugin_transport_xt.c:3849
7765msgid "Failed to start service.\n" 7730msgid "Failed to start service.\n"
7766msgstr "Fehler beim Starten des Dienstes.\n" 7731msgstr "Fehler beim Starten des Dienstes.\n"
7767 7732
@@ -7814,7 +7779,6 @@ msgid "Failed to bind UDP socket to %s: %s\n"
7814msgstr "UDP-Sockets können nicht geöffnet werden\n" 7779msgstr "UDP-Sockets können nicht geöffnet werden\n"
7815 7780
7816#: src/transport/plugin_transport_udp.c:3721 7781#: src/transport/plugin_transport_udp.c:3721
7817#: src/transport/plugin_transport_xu.c:2143
7818msgid "Disabling IPv4 since it is not supported on this system!\n" 7782msgid "Disabling IPv4 since it is not supported on this system!\n"
7819msgstr "" 7783msgstr ""
7820 7784
@@ -7824,19 +7788,15 @@ msgstr "UDP-Sockets können nicht geöffnet werden\n"
7824 7788
7825#: src/transport/plugin_transport_udp.c:3883 7789#: src/transport/plugin_transport_udp.c:3883
7826#: src/transport/plugin_transport_udp.c:3897 7790#: src/transport/plugin_transport_udp.c:3897
7827#: src/transport/plugin_transport_xu.c:2301
7828#: src/transport/plugin_transport_xu.c:2315
7829msgid "must be in [0,65535]" 7791msgid "must be in [0,65535]"
7830msgstr "" 7792msgstr ""
7831 7793
7832#: src/transport/plugin_transport_udp.c:3929 7794#: src/transport/plugin_transport_udp.c:3929
7833#: src/transport/plugin_transport_xu.c:2347
7834#, fuzzy 7795#, fuzzy
7835msgid "must be valid IPv4 address" 7796msgid "must be valid IPv4 address"
7836msgstr "»%s« ist keine gültige IP-Adresse.\n" 7797msgstr "»%s« ist keine gültige IP-Adresse.\n"
7837 7798
7838#: src/transport/plugin_transport_udp.c:3956 7799#: src/transport/plugin_transport_udp.c:3956
7839#: src/transport/plugin_transport_xu.c:2374
7840#, fuzzy 7800#, fuzzy
7841msgid "must be valid IPv6 address" 7801msgid "must be valid IPv6 address"
7842msgstr "»%s« ist keine gültige IP-Adresse.\n" 7802msgstr "»%s« ist keine gültige IP-Adresse.\n"
@@ -7922,55 +7882,6 @@ msgstr ""
7922msgid "# sessions allocated" 7882msgid "# sessions allocated"
7923msgstr "# Sitzungsschlüssel akzeptiert" 7883msgstr "# Sitzungsschlüssel akzeptiert"
7924 7884
7925#: src/transport/plugin_transport_xt.c:4010
7926#, fuzzy, c-format
7927msgid "XT transport listening on port %llu\n"
7928msgstr "TCP-Transportdienst wartet auf Port %llu\n"
7929
7930#: src/transport/plugin_transport_xt.c:4014
7931#, fuzzy
7932msgid "XT transport not listening on any port (client only)\n"
7933msgstr "TCP-Transportdienst wartet auf Port %llu\n"
7934
7935#: src/transport/plugin_transport_xt.c:4018
7936#, fuzzy, c-format
7937msgid "XT transport advertises itself as being on port %llu\n"
7938msgstr "TCP-Transportdienst wartet auf Port %llu\n"
7939
7940#: src/transport/plugin_transport_xt.c:4022
7941#, fuzzy
7942msgid "# XT sessions active"
7943msgstr "# aktive TCP-Sitzungen"
7944
7945#: src/transport/plugin_transport_xu.c:1237
7946#, c-format
7947msgid ""
7948"XU could not transmit message to `%s': Network seems down, please check your "
7949"network configuration\n"
7950msgstr ""
7951
7952#: src/transport/plugin_transport_xu.c:1251
7953msgid ""
7954"XU could not transmit IPv6 message! Please check your network configuration "
7955"and disable IPv6 if your connection does not have a global IPv6 address\n"
7956msgstr ""
7957
7958#: src/transport/plugin_transport_xu.c:2125
7959#: src/transport/plugin_transport_xu.c:2224
7960#, fuzzy, c-format
7961msgid "Failed to bind XU socket to %s: %s\n"
7962msgstr "UDP-Sockets können nicht geöffnet werden\n"
7963
7964#: src/transport/plugin_transport_xu.c:2234
7965#, fuzzy
7966msgid "Failed to open XU sockets\n"
7967msgstr "UDP-Sockets können nicht geöffnet werden\n"
7968
7969#: src/transport/plugin_transport_xu.c:2398
7970#, fuzzy
7971msgid "Failed to create XU network sockets\n"
7972msgstr "UDP-Sockets können nicht geöffnet werden\n"
7973
7974#: src/transport/tcp_connection_legacy.c:452 7885#: src/transport/tcp_connection_legacy.c:452
7975#, c-format 7886#, c-format
7976msgid "Access denied to `%s'\n" 7887msgid "Access denied to `%s'\n"
@@ -7981,17 +7892,17 @@ msgstr "Zugriff verweigert auf »%s«\n"
7981msgid "Accepting connection from `%s': %p\n" 7892msgid "Accepting connection from `%s': %p\n"
7982msgstr "" 7893msgstr ""
7983 7894
7984#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1666 7895#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1630
7985#, fuzzy, c-format 7896#, fuzzy, c-format
7986msgid "`%s' failed for port %d (%s).\n" 7897msgid "`%s' failed for port %d (%s).\n"
7987msgstr "`%s' fehlgeschlagen für Laufwerk %s: %u\n" 7898msgstr "`%s' fehlgeschlagen für Laufwerk %s: %u\n"
7988 7899
7989#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1676 7900#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1640
7990#, fuzzy, c-format 7901#, fuzzy, c-format
7991msgid "`%s' failed for port %d (%s): address already in use\n" 7902msgid "`%s' failed for port %d (%s): address already in use\n"
7992msgstr "`%s' schlug fehl für Port %d: %s. Läuft gnunetd bereits?\n" 7903msgstr "`%s' schlug fehl für Port %d: %s. Läuft gnunetd bereits?\n"
7993 7904
7994#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1682 7905#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1646
7995#, fuzzy, c-format 7906#, fuzzy, c-format
7996msgid "`%s' failed for `%s': address already in use\n" 7907msgid "`%s' failed for `%s': address already in use\n"
7997msgstr "%s schlug fehl, Nachrichten Typ %d ist bereits in Verwendung.\n" 7908msgstr "%s schlug fehl, Nachrichten Typ %d ist bereits in Verwendung.\n"
@@ -8023,17 +7934,17 @@ msgstr ""
8023msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n" 7934msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
8024msgstr "" 7935msgstr ""
8025 7936
8026#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1597 7937#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1561
8027msgid "Could not access a pre-bound socket, will try to bind myself\n" 7938msgid "Could not access a pre-bound socket, will try to bind myself\n"
8028msgstr "" 7939msgstr ""
8029 7940
8030#: src/transport/tcp_service_legacy.c:953 7941#: src/transport/tcp_service_legacy.c:953
8031#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1750 7942#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1714
8032#, c-format 7943#, c-format
8033msgid "Specified value for `%s' of service `%s' is invalid\n" 7944msgid "Specified value for `%s' of service `%s' is invalid\n"
8034msgstr "" 7945msgstr ""
8035 7946
8036#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1783 7947#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1747
8037#, c-format 7948#, c-format
8038msgid "Could not access pre-bound socket %u, will try to bind myself\n" 7949msgid "Could not access pre-bound socket %u, will try to bind myself\n"
8039msgstr "" 7950msgstr ""
@@ -8048,44 +7959,44 @@ msgstr "Es konnte keine Verbindung mit gnunetd hergestellt werden.\n"
8048msgid "Service `%s' runs at %s\n" 7959msgid "Service `%s' runs at %s\n"
8049msgstr "Dienst »%s« läuft auf %s\n" 7960msgstr "Dienst »%s« läuft auf %s\n"
8050 7961
8051#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2057 7962#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2021
8052msgid "Service process failed to initialize\n" 7963msgid "Service process failed to initialize\n"
8053msgstr "" 7964msgstr ""
8054 7965
8055#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2061 7966#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2025
8056msgid "Service process could not initialize server function\n" 7967msgid "Service process could not initialize server function\n"
8057msgstr "" 7968msgstr ""
8058 7969
8059#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2065 7970#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2029
8060msgid "Service process failed to report status\n" 7971msgid "Service process failed to report status\n"
8061msgstr "" 7972msgstr ""
8062 7973
8063#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535 7974#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535
8064#: src/util/service.c:1935 7975#: src/util/service.c:1899
8065#, fuzzy, c-format 7976#, fuzzy, c-format
8066msgid "Cannot obtain information about user `%s': %s\n" 7977msgid "Cannot obtain information about user `%s': %s\n"
8067msgstr "Fehler beim Speichern der Konfigurationsdatei: `%s': %s.\n" 7978msgstr "Fehler beim Speichern der Konfigurationsdatei: `%s': %s.\n"
8068 7979
8069#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1937 7980#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1901
8070msgid "No such user" 7981msgid "No such user"
8071msgstr "" 7982msgstr ""
8072 7983
8073#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1956 7984#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1920
8074#, c-format 7985#, c-format
8075msgid "Cannot change user/group to `%s': %s\n" 7986msgid "Cannot change user/group to `%s': %s\n"
8076msgstr "Benutzer/Gruppe kann nicht zu »%s« geändert werden: %s\n" 7987msgstr "Benutzer/Gruppe kann nicht zu »%s« geändert werden: %s\n"
8077 7988
8078#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2318 7989#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2282
8079msgid "do daemonize (detach from terminal)" 7990msgid "do daemonize (detach from terminal)"
8080msgstr "" 7991msgstr ""
8081 7992
8082#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2382 7993#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2346
8083#: src/util/service.c:2397 7994#: src/util/service.c:2361
8084#, fuzzy, c-format 7995#, fuzzy, c-format
8085msgid "Malformed configuration file `%s', exit ...\n" 7996msgid "Malformed configuration file `%s', exit ...\n"
8086msgstr "Konfigurationsdatei `%s' wurde erzeugt.\n" 7997msgstr "Konfigurationsdatei `%s' wurde erzeugt.\n"
8087 7998
8088#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2409 7999#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2373
8089#, fuzzy 8000#, fuzzy
8090msgid "Malformed configuration, exit ...\n" 8001msgid "Malformed configuration, exit ...\n"
8091msgstr "GNUnet Konfiguration" 8002msgstr "GNUnet Konfiguration"
@@ -8128,11 +8039,11 @@ msgstr ""
8128msgid "Metadata `%s' failed to deserialize" 8039msgid "Metadata `%s' failed to deserialize"
8129msgstr "" 8040msgstr ""
8130 8041
8131#: src/util/client.c:734 8042#: src/util/client.c:749
8132msgid "not a valid filename" 8043msgid "not a valid filename"
8133msgstr "" 8044msgstr ""
8134 8045
8135#: src/util/client.c:925 8046#: src/util/client.c:941
8136#, c-format 8047#, c-format
8137msgid "Need a non-empty hostname for service `%s'.\n" 8048msgid "Need a non-empty hostname for service `%s'.\n"
8138msgstr "" 8049msgstr ""
@@ -8425,7 +8336,7 @@ msgstr ""
8425msgid "print this help" 8336msgid "print this help"
8426msgstr "" 8337msgstr ""
8427 8338
8428#: src/util/getopt_helpers.c:282 8339#: src/util/getopt_helpers.c:282 src/util/gnunet-qr.c:300
8429msgid "be verbose" 8340msgid "be verbose"
8430msgstr "" 8341msgstr ""
8431 8342
@@ -8474,52 +8385,52 @@ msgstr "Sie müssen für die Option »%s« zusätzlich eine Zahl angeben.\n"
8474msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n" 8385msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n"
8475msgstr "" 8386msgstr ""
8476 8387
8477#: src/util/gnunet-config.c:160 8388#: src/util/gnunet-config.c:161
8478#, fuzzy, c-format 8389#, fuzzy, c-format
8479msgid "failed to load configuration defaults" 8390msgid "failed to load configuration defaults"
8480msgstr "Konfiguration konnte nicht aus %s geladen werden\n" 8391msgstr "Konfiguration konnte nicht aus %s geladen werden\n"
8481 8392
8482#: src/util/gnunet-config.c:173 8393#: src/util/gnunet-config.c:174
8483#, fuzzy, c-format 8394#, fuzzy, c-format
8484msgid "%s or %s argument is required\n" 8395msgid "%s or %s argument is required\n"
8485msgstr "Option `%s' macht keinen Sinn ohne die Option `%s'.\n" 8396msgstr "Option `%s' macht keinen Sinn ohne die Option `%s'.\n"
8486 8397
8487#: src/util/gnunet-config.c:181 8398#: src/util/gnunet-config.c:182
8488#, c-format 8399#, c-format
8489msgid "The following sections are available:\n" 8400msgid "The following sections are available:\n"
8490msgstr "" 8401msgstr ""
8491 8402
8492#: src/util/gnunet-config.c:232 8403#: src/util/gnunet-config.c:234
8493#, c-format 8404#, c-format
8494msgid "--option argument required to set value\n" 8405msgid "--option argument required to set value\n"
8495msgstr "" 8406msgstr ""
8496 8407
8497#: src/util/gnunet-config.c:286 8408#: src/util/gnunet-config.c:288
8498msgid "obtain option of value as a filename (with $-expansion)" 8409msgid "interpret option value as a filename (with $-expansion)"
8499msgstr "" 8410msgstr ""
8500 8411
8501#: src/util/gnunet-config.c:291 8412#: src/util/gnunet-config.c:293
8502msgid "name of the section to access" 8413msgid "name of the section to access"
8503msgstr "" 8414msgstr ""
8504 8415
8505#: src/util/gnunet-config.c:296 8416#: src/util/gnunet-config.c:298
8506msgid "name of the option to access" 8417msgid "name of the option to access"
8507msgstr "" 8418msgstr ""
8508 8419
8509#: src/util/gnunet-config.c:301 8420#: src/util/gnunet-config.c:303
8510msgid "value to set" 8421msgid "value to set"
8511msgstr "" 8422msgstr ""
8512 8423
8513#: src/util/gnunet-config.c:305 8424#: src/util/gnunet-config.c:307
8514#, fuzzy 8425#, fuzzy
8515msgid "print available configuration sections" 8426msgid "print available configuration sections"
8516msgstr "GNUnet Konfiguration" 8427msgstr "GNUnet Konfiguration"
8517 8428
8518#: src/util/gnunet-config.c:309 8429#: src/util/gnunet-config.c:311
8519msgid "write configuration file that only contains delta to defaults" 8430msgid "write configuration file that only contains delta to defaults"
8520msgstr "" 8431msgstr ""
8521 8432
8522#: src/util/gnunet-config.c:322 8433#: src/util/gnunet-config.c:324
8523msgid "Manipulate GNUnet configuration files" 8434msgid "Manipulate GNUnet configuration files"
8524msgstr "GNUnet-Konfigurationsdateien bearbeiten" 8435msgstr "GNUnet-Konfigurationsdateien bearbeiten"
8525 8436
@@ -8614,6 +8525,33 @@ msgstr ""
8614msgid "Manipulate GNUnet private ECC key files" 8525msgid "Manipulate GNUnet private ECC key files"
8615msgstr "" 8526msgstr ""
8616 8527
8528#: src/util/gnunet-qr.c:108 src/util/gnunet-uri.c:91
8529#, c-format
8530msgid "Invalid URI: does not start with `%s'\n"
8531msgstr "URL beginnt nicht mit »%s«\n"
8532
8533#: src/util/gnunet-qr.c:116 src/util/gnunet-uri.c:98
8534#, c-format
8535msgid "Invalid URI: fails to specify subsystem\n"
8536msgstr ""
8537
8538#: src/util/gnunet-qr.c:127 src/util/gnunet-uri.c:108
8539#, c-format
8540msgid "No handler known for subsystem `%s'\n"
8541msgstr ""
8542
8543#: src/util/gnunet-qr.c:297
8544msgid "use video-device DEVICE (default: /dev/video0"
8545msgstr ""
8546
8547#: src/util/gnunet-qr.c:303
8548msgid "do not show preview windows"
8549msgstr ""
8550
8551#: src/util/gnunet-qr.c:311
8552msgid "Scan a QR code using a video device and import the uri read"
8553msgstr ""
8554
8617#: src/util/gnunet-resolver.c:168 8555#: src/util/gnunet-resolver.c:168
8618msgid "perform a reverse lookup" 8556msgid "perform a reverse lookup"
8619msgstr "" 8557msgstr ""
@@ -8656,21 +8594,6 @@ msgstr ""
8656msgid "No URI specified on command line\n" 8594msgid "No URI specified on command line\n"
8657msgstr "" 8595msgstr ""
8658 8596
8659#: src/util/gnunet-uri.c:91
8660#, c-format
8661msgid "Invalid URI: does not start with `%s'\n"
8662msgstr "URL beginnt nicht mit »%s«\n"
8663
8664#: src/util/gnunet-uri.c:98
8665#, c-format
8666msgid "Invalid URI: fails to specify subsystem\n"
8667msgstr ""
8668
8669#: src/util/gnunet-uri.c:108
8670#, c-format
8671msgid "No handler known for subsystem `%s'\n"
8672msgstr ""
8673
8674#: src/util/gnunet-uri.c:170 8597#: src/util/gnunet-uri.c:170
8675msgid "Perform default-actions for GNUnet URIs" 8598msgid "Perform default-actions for GNUnet URIs"
8676msgstr "" 8599msgstr ""
@@ -8690,12 +8613,12 @@ msgstr "Fehler beim Parsen der Gerätedaten von `%s' bei %s:%d.\n"
8690msgid "Error writing to `%s': %s\n" 8613msgid "Error writing to `%s': %s\n"
8691msgstr "Verbindung zu %u.%u.%u.%u:%u fehlgeschlagen: %s\n" 8614msgstr "Verbindung zu %u.%u.%u.%u:%u fehlgeschlagen: %s\n"
8692 8615
8693#: src/util/network.c:136 8616#: src/util/network.c:176
8694#, c-format 8617#, c-format
8695msgid "Unable to shorten unix path `%s' while keeping name unique\n" 8618msgid "Unable to shorten unix path `%s' while keeping name unique\n"
8696msgstr "" 8619msgstr ""
8697 8620
8698#: src/util/network.c:1794 src/util/network.c:1978 8621#: src/util/network.c:1835 src/util/network.c:2019
8699#, c-format 8622#, c-format
8700msgid "" 8623msgid ""
8701"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" 8624"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8812,7 +8735,7 @@ msgid ""
8812"`GNUNET_SERVICE_client_continue' after %s\n" 8735"`GNUNET_SERVICE_client_continue' after %s\n"
8813msgstr "" 8736msgstr ""
8814 8737
8815#: src/util/service.c:1862 8738#: src/util/service.c:1826
8816msgid "" 8739msgid ""
8817"Could not bind to any of the ports I was supposed to, refusing to run!\n" 8740"Could not bind to any of the ports I was supposed to, refusing to run!\n"
8818msgstr "" 8741msgstr ""
@@ -9159,6 +9082,34 @@ msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
9159msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n" 9082msgstr "`%s' schlug bei Datei `%s' fehl. Ort: %s:%d. Fehler: %s\n"
9160 9083
9161#, fuzzy 9084#, fuzzy
9085#~ msgid "XT transport listening on port %llu\n"
9086#~ msgstr "TCP-Transportdienst wartet auf Port %llu\n"
9087
9088#, fuzzy
9089#~ msgid "XT transport not listening on any port (client only)\n"
9090#~ msgstr "TCP-Transportdienst wartet auf Port %llu\n"
9091
9092#, fuzzy
9093#~ msgid "XT transport advertises itself as being on port %llu\n"
9094#~ msgstr "TCP-Transportdienst wartet auf Port %llu\n"
9095
9096#, fuzzy
9097#~ msgid "# XT sessions active"
9098#~ msgstr "# aktive TCP-Sitzungen"
9099
9100#, fuzzy
9101#~ msgid "Failed to bind XU socket to %s: %s\n"
9102#~ msgstr "UDP-Sockets können nicht geöffnet werden\n"
9103
9104#, fuzzy
9105#~ msgid "Failed to open XU sockets\n"
9106#~ msgstr "UDP-Sockets können nicht geöffnet werden\n"
9107
9108#, fuzzy
9109#~ msgid "Failed to create XU network sockets\n"
9110#~ msgstr "UDP-Sockets können nicht geöffnet werden\n"
9111
9112#, fuzzy
9162#~ msgid "Print information about DV state" 9113#~ msgid "Print information about DV state"
9163#~ msgstr "Informationen über andere GNUnet Knoten ausgeben." 9114#~ msgstr "Informationen über andere GNUnet Knoten ausgeben."
9164 9115
diff --git a/po/es.po b/po/es.po
index 807d753ca..037759e54 100644
--- a/po/es.po
+++ b/po/es.po
@@ -8,7 +8,7 @@ msgid ""
8msgstr "" 8msgstr ""
9"Project-Id-Version: gnunet 0.9.5a\n" 9"Project-Id-Version: gnunet 0.9.5a\n"
10"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" 10"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
11"POT-Creation-Date: 2019-02-28 11:41+0100\n" 11"POT-Creation-Date: 2019-04-04 12:39+0200\n"
12"PO-Revision-Date: 2013-02-23 17:50+0100\n" 12"PO-Revision-Date: 2013-02-23 17:50+0100\n"
13"Last-Translator: Miguel Ángel Arruga Vivas <rosen644835@gmail.com>\n" 13"Last-Translator: Miguel Ángel Arruga Vivas <rosen644835@gmail.com>\n"
14"Language-Team: Spanish <es@li.org>\n" 14"Language-Team: Spanish <es@li.org>\n"
@@ -234,8 +234,7 @@ msgstr ""
234"Servicios de control y el Gestor de Reinicio Automático (ARM en inglés)" 234"Servicios de control y el Gestor de Reinicio Automático (ARM en inglés)"
235 235
236#: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120 236#: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120
237#: src/transport/plugin_transport_xt.c:1120 237#: src/transport/tcp_service_legacy.c:557
238#: src/transport/tcp_service_legacy.c:557 src/util/service.c:1167
239#, c-format 238#, c-format
240msgid "" 239msgid ""
241"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n" 240"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
@@ -247,12 +246,9 @@ msgstr ""
247#: src/transport/plugin_transport_tcp.c:1139 246#: src/transport/plugin_transport_tcp.c:1139
248#: src/transport/plugin_transport_tcp.c:1145 247#: src/transport/plugin_transport_tcp.c:1145
249#: src/transport/plugin_transport_tcp.c:3835 248#: src/transport/plugin_transport_tcp.c:3835
250#: src/transport/plugin_transport_xt.c:1139
251#: src/transport/plugin_transport_xt.c:1145
252#: src/transport/plugin_transport_xt.c:3833
253#: src/transport/tcp_service_legacy.c:576 249#: src/transport/tcp_service_legacy.c:576
254#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1192 250#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1156
255#: src/util/service.c:1198 251#: src/util/service.c:1162
256#, c-format 252#, c-format
257msgid "Require valid port number for service `%s' in configuration!\n" 253msgid "Require valid port number for service `%s' in configuration!\n"
258msgstr "" 254msgstr ""
@@ -260,25 +256,22 @@ msgstr ""
260"configuración!\n" 256"configuración!\n"
261 257
262#: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176 258#: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176
263#: src/transport/plugin_transport_xt.c:1176 259#: src/transport/tcp_service_legacy.c:613 src/util/client.c:521
264#: src/transport/tcp_service_legacy.c:613 src/util/client.c:506 260#: src/util/service.c:1201
265#: src/util/service.c:1237
266#, c-format 261#, c-format
267msgid "UNIXPATH `%s' too long, maximum length is %llu\n" 262msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
268msgstr "" 263msgstr ""
269"La ruta tipo UNIX «%s» es demasiado larga, la longitud máxima es %llu\n" 264"La ruta tipo UNIX «%s» es demasiado larga, la longitud máxima es %llu\n"
270 265
271#: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180 266#: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180
272#: src/transport/plugin_transport_xt.c:1180 267#: src/transport/tcp_service_legacy.c:617 src/util/client.c:526
273#: src/transport/tcp_service_legacy.c:617 src/util/client.c:511 268#: src/util/service.c:1206
274#: src/util/service.c:1242
275#, c-format 269#, c-format
276msgid "Using `%s' instead\n" 270msgid "Using `%s' instead\n"
277msgstr "Usando «%s» en su defecto\n" 271msgstr "Usando «%s» en su defecto\n"
278 272
279#: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211 273#: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211
280#: src/transport/plugin_transport_xt.c:1211 274#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1242
281#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1278
282#, c-format 275#, c-format
283msgid "" 276msgid ""
284"Disabling UNIX domain socket support for service `%s', failed to create UNIX " 277"Disabling UNIX domain socket support for service `%s', failed to create UNIX "
@@ -288,8 +281,7 @@ msgstr ""
288"«%s», no se pudo crear un «socket» UNIX: %s\n" 281"«%s», no se pudo crear un «socket» UNIX: %s\n"
289 282
290#: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228 283#: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228
291#: src/transport/plugin_transport_xt.c:1228 284#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1260
292#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1296
293#, c-format 285#, c-format
294msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n" 286msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
295msgstr "" 287msgstr ""
@@ -299,8 +291,7 @@ msgstr ""
299#: src/arm/gnunet-service-arm.c:556 291#: src/arm/gnunet-service-arm.c:556
300#: src/transport/plugin_transport_http_server.c:2688 292#: src/transport/plugin_transport_http_server.c:2688
301#: src/transport/plugin_transport_tcp.c:1259 293#: src/transport/plugin_transport_tcp.c:1259
302#: src/transport/plugin_transport_xt.c:1259 294#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1301
303#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1337
304#, c-format 295#, c-format
305msgid "Failed to resolve `%s': %s\n" 296msgid "Failed to resolve `%s': %s\n"
306msgstr "Se produjo un fallo al resolver «%s»: %s\n" 297msgstr "Se produjo un fallo al resolver «%s»: %s\n"
@@ -308,8 +299,7 @@ msgstr "Se produjo un fallo al resolver «%s»: %s\n"
308#: src/arm/gnunet-service-arm.c:575 299#: src/arm/gnunet-service-arm.c:575
309#: src/transport/plugin_transport_http_server.c:2706 300#: src/transport/plugin_transport_http_server.c:2706
310#: src/transport/plugin_transport_tcp.c:1278 301#: src/transport/plugin_transport_tcp.c:1278
311#: src/transport/plugin_transport_xt.c:1278 302#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1321
312#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1357
313#, c-format 303#, c-format
314msgid "Failed to find %saddress for `%s'.\n" 304msgid "Failed to find %saddress for `%s'.\n"
315msgstr "No se encontró la dirección %s para «%s».\n" 305msgstr "No se encontró la dirección %s para «%s».\n"
@@ -1679,6 +1669,11 @@ msgstr "Se produjo un fallo al conectar con el almacén de nombres\n"
1679msgid "Unable to parse ATTR record string `%s'\n" 1669msgid "Unable to parse ATTR record string `%s'\n"
1680msgstr "No se pudo procesar la cadena de registro TLSA «%s»\n" 1670msgstr "No se pudo procesar la cadena de registro TLSA «%s»\n"
1681 1671
1672#: src/credential/plugin_rest_credential.c:1128
1673#, fuzzy
1674msgid "GNS REST API initialized\n"
1675msgstr "Conexión fallida\n"
1676
1682#: src/datacache/datacache.c:119 src/datacache/datacache.c:311 1677#: src/datacache/datacache.c:119 src/datacache/datacache.c:311
1683#: src/datastore/gnunet-service-datastore.c:757 1678#: src/datastore/gnunet-service-datastore.c:757
1684msgid "# bytes stored" 1679msgid "# bytes stored"
@@ -2202,7 +2197,7 @@ msgstr "Imprime todos los paquetes que pasan por la DHT."
2202msgid "Exiting as the number of peers is %u\n" 2197msgid "Exiting as the number of peers is %u\n"
2203msgstr "El número máximo de conexiones es %u\n" 2198msgstr "El número máximo de conexiones es %u\n"
2204 2199
2205#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2959 2200#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2981
2206msgid "number of peers to start" 2201msgid "number of peers to start"
2207msgstr "número de pares para empezar" 2202msgstr "número de pares para empezar"
2208 2203
@@ -3342,12 +3337,12 @@ msgstr ""
3342msgid "set the desired LEVEL of sender-anonymity" 3337msgid "set the desired LEVEL of sender-anonymity"
3343msgstr "establece el nivel LEVEL deseado de anonimato del emisor" 3338msgstr "establece el nivel LEVEL deseado de anonimato del emisor"
3344 3339
3345#: src/fs/gnunet-auto-share.c:772 src/fs/gnunet-publish.c:907 3340#: src/fs/gnunet-auto-share.c:772
3346msgid "disable adding the creation time to the metadata of the uploaded file" 3341msgid "disable adding the creation time to the metadata of the uploaded file"
3347msgstr "" 3342msgstr ""
3348"deshabilitar añadir tiempo de creación a los metadatos del fichero subido" 3343"deshabilitar añadir tiempo de creación a los metadatos del fichero subido"
3349 3344
3350#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:912 3345#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:907
3351msgid "do not use libextractor to add keywords or metadata" 3346msgid "do not use libextractor to add keywords or metadata"
3352msgstr "no usar libextractor para añadir palabras clave o metadatos" 3347msgstr "no usar libextractor para añadir palabras clave o metadatos"
3353 3348
@@ -3656,6 +3651,12 @@ msgstr "La opción «%s» es obligatoria cuando se usa la opción «%s».\n"
3656msgid "Option `%s' makes no sense without option `%s'.\n" 3651msgid "Option `%s' makes no sense without option `%s'.\n"
3657msgstr "La opción «%s» no tiene sentido sin la opción «%s».\n" 3652msgstr "La opción «%s» no tiene sentido sin la opción «%s».\n"
3658 3653
3654#: src/fs/gnunet-publish.c:911
3655#, fuzzy
3656msgid "enable adding the creation time to the metadata of the uploaded file"
3657msgstr ""
3658"deshabilitar añadir tiempo de creación a los metadatos del fichero subido"
3659
3659#: src/fs/gnunet-publish.c:916 3660#: src/fs/gnunet-publish.c:916
3660msgid "" 3661msgid ""
3661"print list of extracted keywords that would be used, but do not perform " 3662"print list of extracted keywords that would be used, but do not perform "
@@ -4160,43 +4161,43 @@ msgstr ""
4160msgid "GNUnet HTTP server to create business cards" 4161msgid "GNUnet HTTP server to create business cards"
4161msgstr "" 4162msgstr ""
4162 4163
4163#: src/gns/gnunet-dns2gns.c:203 4164#: src/gns/gnunet-dns2gns.c:214
4164msgid "Failed to pack DNS response into UDP packet!\n" 4165msgid "Failed to pack DNS response into UDP packet!\n"
4165msgstr "" 4166msgstr ""
4166"¡Se produjo un fallo al empaquetar una respuesta DNS en un paquete UDP!\n" 4167"¡Se produjo un fallo al empaquetar una respuesta DNS en un paquete UDP!\n"
4167 4168
4168#: src/gns/gnunet-dns2gns.c:405 4169#: src/gns/gnunet-dns2gns.c:416
4169#, c-format 4170#, c-format
4170msgid "Cannot parse DNS request from %s\n" 4171msgid "Cannot parse DNS request from %s\n"
4171msgstr "No se puede procesar la petición DNS de %s\n" 4172msgstr "No se puede procesar la petición DNS de %s\n"
4172 4173
4173#: src/gns/gnunet-dns2gns.c:421 4174#: src/gns/gnunet-dns2gns.c:432
4174#, c-format 4175#, c-format
4175msgid "Received malformed DNS request from %s\n" 4176msgid "Received malformed DNS request from %s\n"
4176msgstr "Recibida petición DNS mal formada de %s\n" 4177msgstr "Recibida petición DNS mal formada de %s\n"
4177 4178
4178#: src/gns/gnunet-dns2gns.c:429 4179#: src/gns/gnunet-dns2gns.c:440
4179#, c-format 4180#, c-format
4180msgid "Received unsupported DNS request from %s\n" 4181msgid "Received unsupported DNS request from %s\n"
4181msgstr "Recibida petición DNS no soportada de %s\n" 4182msgstr "Recibida petición DNS no soportada de %s\n"
4182 4183
4183#: src/gns/gnunet-dns2gns.c:588 4184#: src/gns/gnunet-dns2gns.c:600
4184#, fuzzy 4185#, fuzzy
4185msgid "No DNS server specified!\n" 4186msgid "No DNS server specified!\n"
4186msgstr "¡Ninguna palabra clave especificada!\n" 4187msgstr "¡Ninguna palabra clave especificada!\n"
4187 4188
4188#: src/gns/gnunet-dns2gns.c:688 4189#: src/gns/gnunet-dns2gns.c:748
4189msgid "IP of recursive DNS resolver to use (required)" 4190msgid "IP of recursive DNS resolver to use (required)"
4190msgstr "IP del resolvedor recursivo DNS a usar (requerido)" 4191msgstr "IP del resolvedor recursivo DNS a usar (requerido)"
4191 4192
4192#: src/gns/gnunet-dns2gns.c:693 4193#: src/gns/gnunet-dns2gns.c:753
4193#, fuzzy 4194#, fuzzy
4194msgid "UDP port to listen on for inbound DNS requests; default: 2853" 4195msgid "UDP port to listen on for inbound DNS requests; default: 2853"
4195msgstr "" 4196msgstr ""
4196"Puerto UDP en el que escuchar para peticiones DNS entrantes; predeterminado: " 4197"Puerto UDP en el que escuchar para peticiones DNS entrantes; predeterminado: "
4197"53" 4198"53"
4198 4199
4199#: src/gns/gnunet-dns2gns.c:710 4200#: src/gns/gnunet-dns2gns.c:770
4200msgid "GNUnet DNS-to-GNS proxy (a DNS server)" 4201msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
4201msgstr "Pasarela GNUnet DNS-a-GNS (un servidor DNS)" 4202msgstr "Pasarela GNUnet DNS-a-GNS (un servidor DNS)"
4202 4203
@@ -4269,104 +4270,104 @@ msgstr ""
4269msgid "%s failed at %s:%d: `%s'\n" 4270msgid "%s failed at %s:%d: `%s'\n"
4270msgstr "%s falló en %s:%d: «%s».\n" 4271msgstr "%s falló en %s:%d: «%s».\n"
4271 4272
4272#: src/gns/gnunet-gns-proxy.c:980 4273#: src/gns/gnunet-gns-proxy.c:989
4273#, fuzzy, c-format 4274#, fuzzy, c-format
4274msgid "Unsupported CURL TLS backend %d\n" 4275msgid "Unsupported CURL TLS backend %d\n"
4275msgstr "Tipo de bloque %u no soportado\n" 4276msgstr "Tipo de bloque %u no soportado\n"
4276 4277
4277#: src/gns/gnunet-gns-proxy.c:1005 4278#: src/gns/gnunet-gns-proxy.c:1014
4278#, fuzzy, c-format 4279#, fuzzy, c-format
4279msgid "Failed to fetch CN from cert: %s\n" 4280msgid "Failed to fetch CN from cert: %s\n"
4280msgstr "Se produjo un fallo al mandar la petición DNS a %s\n" 4281msgstr "Se produjo un fallo al mandar la petición DNS a %s\n"
4281 4282
4282#: src/gns/gnunet-gns-proxy.c:1026 4283#: src/gns/gnunet-gns-proxy.c:1035
4283#, fuzzy, c-format 4284#, fuzzy, c-format
4284msgid "Failed to initialize DANE: %s\n" 4285msgid "Failed to initialize DANE: %s\n"
4285msgstr "¡No se puede inicializar el resolvedor!\n" 4286msgstr "¡No se puede inicializar el resolvedor!\n"
4286 4287
4287#: src/gns/gnunet-gns-proxy.c:1041 4288#: src/gns/gnunet-gns-proxy.c:1050
4288#, fuzzy, c-format 4289#, fuzzy, c-format
4289msgid "Failed to parse DANE record: %s\n" 4290msgid "Failed to parse DANE record: %s\n"
4290msgstr "Se produjo un fallo al procesar la petición DNS. Omitiendo.\n" 4291msgstr "Se produjo un fallo al procesar la petición DNS. Omitiendo.\n"
4291 4292
4292#: src/gns/gnunet-gns-proxy.c:1056 4293#: src/gns/gnunet-gns-proxy.c:1065
4293#, fuzzy, c-format 4294#, fuzzy, c-format
4294msgid "Failed to verify TLS connection using DANE: %s\n" 4295msgid "Failed to verify TLS connection using DANE: %s\n"
4295msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n" 4296msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
4296 4297
4297#: src/gns/gnunet-gns-proxy.c:1066 4298#: src/gns/gnunet-gns-proxy.c:1075
4298#, c-format 4299#, c-format
4299msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n" 4300msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
4300msgstr "" 4301msgstr ""
4301 4302
4302#: src/gns/gnunet-gns-proxy.c:1090 4303#: src/gns/gnunet-gns-proxy.c:1099
4303#, c-format 4304#, c-format
4304msgid "TLS certificate subject name (%s) does not match `%s': %d\n" 4305msgid "TLS certificate subject name (%s) does not match `%s': %d\n"
4305msgstr "" 4306msgstr ""
4306 4307
4307#: src/gns/gnunet-gns-proxy.c:1221 4308#: src/gns/gnunet-gns-proxy.c:1230
4308#, c-format 4309#, c-format
4309msgid "Cookie domain `%s' supplied by server is invalid\n" 4310msgid "Cookie domain `%s' supplied by server is invalid\n"
4310msgstr "" 4311msgstr ""
4311 4312
4312#: src/gns/gnunet-gns-proxy.c:2122 4313#: src/gns/gnunet-gns-proxy.c:2131
4313#, fuzzy, c-format 4314#, fuzzy, c-format
4314msgid "Unsupported HTTP method `%s'\n" 4315msgid "Unsupported HTTP method `%s'\n"
4315msgstr "Tipo no soportado «%s»\n" 4316msgstr "Tipo no soportado «%s»\n"
4316 4317
4317#: src/gns/gnunet-gns-proxy.c:2643 4318#: src/gns/gnunet-gns-proxy.c:2652
4318#, c-format 4319#, c-format
4319msgid "Unable to import private key from file `%s'\n" 4320msgid "Unable to import private key from file `%s'\n"
4320msgstr "No se pudo importar la clave privada del fichero «%s»\n" 4321msgstr "No se pudo importar la clave privada del fichero «%s»\n"
4321 4322
4322#: src/gns/gnunet-gns-proxy.c:2675 4323#: src/gns/gnunet-gns-proxy.c:2684
4323#, fuzzy, c-format 4324#, fuzzy, c-format
4324msgid "Unable to import certificate from `%s'\n" 4325msgid "Unable to import certificate from `%s'\n"
4325msgstr "No se pudo importar el certificado %s\n" 4326msgstr "No se pudo importar el certificado %s\n"
4326 4327
4327#: src/gns/gnunet-gns-proxy.c:2876 4328#: src/gns/gnunet-gns-proxy.c:2885
4328#, fuzzy, c-format 4329#, fuzzy, c-format
4329msgid "Failed to start HTTPS server for `%s'\n" 4330msgid "Failed to start HTTPS server for `%s'\n"
4330msgstr "Se produjo un fallo al iniciar el servidor HTTP\n" 4331msgstr "Se produjo un fallo al iniciar el servidor HTTP\n"
4331 4332
4332#: src/gns/gnunet-gns-proxy.c:2898 src/rest/gnunet-rest-server.c:658 4333#: src/gns/gnunet-gns-proxy.c:2907 src/rest/gnunet-rest-server.c:668
4333#, fuzzy 4334#, fuzzy
4334msgid "Failed to pass client to MHD\n" 4335msgid "Failed to pass client to MHD\n"
4335msgstr "Se produjo un fallo al conectar con GNS\n" 4336msgstr "Se produjo un fallo al conectar con GNS\n"
4336 4337
4337#: src/gns/gnunet-gns-proxy.c:3234 4338#: src/gns/gnunet-gns-proxy.c:3243
4338#, fuzzy, c-format 4339#, fuzzy, c-format
4339msgid "Unsupported socks version %d\n" 4340msgid "Unsupported socks version %d\n"
4340msgstr "Tipo de bloque %u no soportado\n" 4341msgstr "Tipo de bloque %u no soportado\n"
4341 4342
4342#: src/gns/gnunet-gns-proxy.c:3263 4343#: src/gns/gnunet-gns-proxy.c:3272
4343#, fuzzy, c-format 4344#, fuzzy, c-format
4344msgid "Unsupported socks command %d\n" 4345msgid "Unsupported socks command %d\n"
4345msgstr "Tipo de bloque %u no soportado\n" 4346msgstr "Tipo de bloque %u no soportado\n"
4346 4347
4347#: src/gns/gnunet-gns-proxy.c:3346 4348#: src/gns/gnunet-gns-proxy.c:3355
4348#, fuzzy, c-format 4349#, fuzzy, c-format
4349msgid "Unsupported socks address type %d\n" 4350msgid "Unsupported socks address type %d\n"
4350msgstr "Tipo de bloque %u no soportado\n" 4351msgstr "Tipo de bloque %u no soportado\n"
4351 4352
4352#: src/gns/gnunet-gns-proxy.c:3636 4353#: src/gns/gnunet-gns-proxy.c:3693
4353#, fuzzy, c-format 4354#, fuzzy, c-format
4354msgid "Failed to load X.509 key and certificate from `%s'\n" 4355msgid "Failed to load X.509 key and certificate from `%s'\n"
4355msgstr "Se produjo un fallo al leer la lista de amigos de «%s»\n" 4356msgstr "Se produjo un fallo al leer la lista de amigos de «%s»\n"
4356 4357
4357#: src/gns/gnunet-gns-proxy.c:3764 4358#: src/gns/gnunet-gns-proxy.c:3821
4358msgid "listen on specified port (default: 7777)" 4359msgid "listen on specified port (default: 7777)"
4359msgstr "escuchar en el puerto especificado (predeterminado: 7777)" 4360msgstr "escuchar en el puerto especificado (predeterminado: 7777)"
4360 4361
4361#: src/gns/gnunet-gns-proxy.c:3769 4362#: src/gns/gnunet-gns-proxy.c:3826
4362msgid "pem file to use as CA" 4363msgid "pem file to use as CA"
4363msgstr "fichero pem para usar como autoridad de certificación (CA)" 4364msgstr "fichero pem para usar como autoridad de certificación (CA)"
4364 4365
4365#: src/gns/gnunet-gns-proxy.c:3773 4366#: src/gns/gnunet-gns-proxy.c:3830
4366msgid "disable use of IPv6" 4367msgid "disable use of IPv6"
4367msgstr "" 4368msgstr ""
4368 4369
4369#: src/gns/gnunet-gns-proxy.c:3799 4370#: src/gns/gnunet-gns-proxy.c:3856
4370msgid "GNUnet GNS proxy" 4371msgid "GNUnet GNS proxy"
4371msgstr "Proxy GNUnet GNS" 4372msgstr "Proxy GNUnet GNS"
4372 4373
@@ -4477,6 +4478,11 @@ msgstr "No se pudo procesar la cadena de registro VPN «%s»\n"
4477msgid "Unable to parse BOX record string `%s'\n" 4478msgid "Unable to parse BOX record string `%s'\n"
4478msgstr "No se pudo procesar la cadena de registro VPN «%s»\n" 4479msgstr "No se pudo procesar la cadena de registro VPN «%s»\n"
4479 4480
4481#: src/gns/plugin_rest_gns.c:452
4482#, fuzzy
4483msgid "Gns REST API initialized\n"
4484msgstr "Conexión fallida\n"
4485
4480#: src/gnsrecord/plugin_gnsrecord_dns.c:359 4486#: src/gnsrecord/plugin_gnsrecord_dns.c:359
4481#, c-format 4487#, c-format
4482msgid "Unable to parse IPv4 address `%s'\n" 4488msgid "Unable to parse IPv4 address `%s'\n"
@@ -5033,6 +5039,11 @@ msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
5033msgid "Failed to create directory `%s' for storing egos\n" 5039msgid "Failed to create directory `%s' for storing egos\n"
5034msgstr "Se produjo un fallo al leer el directorio «%s»\n" 5040msgstr "Se produjo un fallo al leer el directorio «%s»\n"
5035 5041
5042#: src/identity/plugin_rest_identity.c:1297
5043#, fuzzy
5044msgid "Identity REST API initialized\n"
5045msgstr "Conexión fallida\n"
5046
5036#: src/json/json.c:123 5047#: src/json/json.c:123
5037#, fuzzy, c-format 5048#, fuzzy, c-format
5038msgid "Failed to parse JSON in option `%s': %s (%s)\n" 5049msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -5437,6 +5448,11 @@ msgstr "El almacén de nombres no pudo añadir el registro\n"
5437msgid "heap file database running\n" 5448msgid "heap file database running\n"
5438msgstr "Base de datos de plantilla ejecutándose\n" 5449msgstr "Base de datos de plantilla ejecutándose\n"
5439 5450
5451#: src/namestore/plugin_rest_namestore.c:1079
5452#, fuzzy
5453msgid "Namestore REST API initialized\n"
5454msgstr "Conexión fallida\n"
5455
5440#: src/nat-auto/gnunet-nat-auto.c:193 5456#: src/nat-auto/gnunet-nat-auto.c:193
5441#, fuzzy 5457#, fuzzy
5442msgid "Suggested configuration changes:\n" 5458msgid "Suggested configuration changes:\n"
@@ -5837,7 +5853,7 @@ msgid "\tExpires: %s \t %s\n"
5837msgstr "" 5853msgstr ""
5838 5854
5839#: src/peerinfo-tool/gnunet-peerinfo.c:299 5855#: src/peerinfo-tool/gnunet-peerinfo.c:299
5840#: src/rest-plugins/plugin_rest_peerinfo.c:501 5856#: src/peerinfo-tool/plugin_rest_peerinfo.c:501
5841#, fuzzy, c-format 5857#, fuzzy, c-format
5842msgid "Failure: Cannot convert address to string for peer `%s'\n" 5858msgid "Failure: Cannot convert address to string for peer `%s'\n"
5843msgstr "Se produjo un fallo al resolver la dirección para el par «%s»\n" 5859msgstr "Se produjo un fallo al resolver la dirección para el par «%s»\n"
@@ -5916,6 +5932,11 @@ msgstr "Cargando el módulo de transporte «%s»\n"
5916msgid "Failed to load transport plugin for `%s'\n" 5932msgid "Failed to load transport plugin for `%s'\n"
5917msgstr "Se produjo un fallo al cargar el módulo del transporte para «%s»\n" 5933msgstr "Se produjo un fallo al cargar el módulo del transporte para «%s»\n"
5918 5934
5935#: src/peerinfo-tool/plugin_rest_peerinfo.c:796
5936#, fuzzy
5937msgid "Peerinfo REST API initialized\n"
5938msgstr "Conexión fallida\n"
5939
5919#: src/peerstore/gnunet-peerstore.c:91 5940#: src/peerstore/gnunet-peerstore.c:91
5920msgid "peerstore" 5941msgid "peerstore"
5921msgstr "" 5942msgstr ""
@@ -6075,6 +6096,12 @@ msgstr ""
6075msgid "Expiration interval of the attribute" 6096msgid "Expiration interval of the attribute"
6076msgstr "" 6097msgstr ""
6077 6098
6099#: src/reclaim/plugin_rest_openid_connect.c:2279
6100#: src/reclaim/plugin_rest_reclaim.c:1079
6101#, fuzzy
6102msgid "Identity Provider REST API initialized\n"
6103msgstr "Conexión fallida\n"
6104
6078#: src/reclaim/reclaim_api.c:436 6105#: src/reclaim/reclaim_api.c:436
6079#, fuzzy 6106#, fuzzy
6080msgid "failed to store record\n" 6107msgid "failed to store record\n"
@@ -6175,52 +6202,21 @@ msgstr "El servicio «%s» no está ejecutandose\n"
6175msgid "Search string `%s' is too long!\n" 6202msgid "Search string `%s' is too long!\n"
6176msgstr "El servicio «%s» no está ejecutandose\n" 6203msgstr "El servicio «%s» no está ejecutandose\n"
6177 6204
6178#: src/rest/gnunet-rest-server.c:927 6205#: src/rest/gnunet-rest-server.c:986
6179#, fuzzy 6206#, fuzzy
6180msgid "listen on specified port (default: 7776)" 6207msgid "listen on specified port (default: 7776)"
6181msgstr "escuchar en el puerto especificado (predeterminado: 7777)" 6208msgstr "escuchar en el puerto especificado (predeterminado: 7777)"
6182 6209
6183#: src/rest/gnunet-rest-server.c:944 6210#: src/rest/gnunet-rest-server.c:1003
6184#, fuzzy 6211#, fuzzy
6185msgid "GNUnet REST server" 6212msgid "GNUnet REST server"
6186msgstr "Herramienta de acceso GNUnet GNS" 6213msgstr "Herramienta de acceso GNUnet GNS"
6187 6214
6188#: src/rest-plugins/plugin_rest_copying.c:209 6215#: src/rest/plugin_rest_copying.c:209
6189#, fuzzy 6216#, fuzzy
6190msgid "COPYING REST API initialized\n" 6217msgid "COPYING REST API initialized\n"
6191msgstr "Conexión fallida\n" 6218msgstr "Conexión fallida\n"
6192 6219
6193#: src/rest-plugins/plugin_rest_credential.c:1128
6194#, fuzzy
6195msgid "GNS REST API initialized\n"
6196msgstr "Conexión fallida\n"
6197
6198#: src/rest-plugins/plugin_rest_gns.c:452
6199#, fuzzy
6200msgid "Gns REST API initialized\n"
6201msgstr "Conexión fallida\n"
6202
6203#: src/rest-plugins/plugin_rest_identity.c:1297
6204#, fuzzy
6205msgid "Identity REST API initialized\n"
6206msgstr "Conexión fallida\n"
6207
6208#: src/rest-plugins/plugin_rest_namestore.c:1079
6209#, fuzzy
6210msgid "Namestore REST API initialized\n"
6211msgstr "Conexión fallida\n"
6212
6213#: src/rest-plugins/plugin_rest_openid_connect.c:2279
6214#: src/rest-plugins/plugin_rest_reclaim.c:1079
6215#, fuzzy
6216msgid "Identity Provider REST API initialized\n"
6217msgstr "Conexión fallida\n"
6218
6219#: src/rest-plugins/plugin_rest_peerinfo.c:796
6220#, fuzzy
6221msgid "Peerinfo REST API initialized\n"
6222msgstr "Conexión fallida\n"
6223
6224#: src/revocation/gnunet-revocation.c:129 6220#: src/revocation/gnunet-revocation.c:129
6225#, fuzzy, c-format 6221#, fuzzy, c-format
6226msgid "Key `%s' is valid\n" 6222msgid "Key `%s' is valid\n"
@@ -6373,23 +6369,23 @@ msgstr ""
6373msgid "Get peers from biased stream" 6369msgid "Get peers from biased stream"
6374msgstr "" 6370msgstr ""
6375 6371
6376#: src/rps/gnunet-rps-profiler.c:2964 6372#: src/rps/gnunet-rps-profiler.c:2986
6377#, fuzzy 6373#, fuzzy
6378msgid "duration of the profiling" 6374msgid "duration of the profiling"
6379msgstr "" 6375msgstr ""
6380"La configuración o la versión de GNUnet cambiaron. ¡Debes ejecutar '%s'!\n" 6376"La configuración o la versión de GNUnet cambiaron. ¡Debes ejecutar '%s'!\n"
6381 6377
6382#: src/rps/gnunet-rps-profiler.c:2969 6378#: src/rps/gnunet-rps-profiler.c:2991
6383#, fuzzy 6379#, fuzzy
6384msgid "timeout for the profiling" 6380msgid "timeout for the profiling"
6385msgstr "Especificar el tipo del registro a buscar" 6381msgstr "Especificar el tipo del registro a buscar"
6386 6382
6387#: src/rps/gnunet-rps-profiler.c:2974 6383#: src/rps/gnunet-rps-profiler.c:2996
6388#, fuzzy 6384#, fuzzy
6389msgid "number of PeerIDs to request" 6385msgid "number of PeerIDs to request"
6390msgstr "número de pares para empezar" 6386msgstr "número de pares para empezar"
6391 6387
6392#: src/rps/gnunet-rps-profiler.c:2990 6388#: src/rps/gnunet-rps-profiler.c:3012
6393#, fuzzy 6389#, fuzzy
6394msgid "Measure quality and performance of the RPS service." 6390msgid "Measure quality and performance of the RPS service."
6395msgstr "Medir la calidad y rendimiento del servicio NSE." 6391msgstr "Medir la calidad y rendimiento del servicio NSE."
@@ -7142,9 +7138,9 @@ msgstr "# mensajes «HELLO» recibidos"
7142msgid "GNUnet topology control" 7138msgid "GNUnet topology control"
7143msgstr "" 7139msgstr ""
7144 7140
7145#: src/transport/gnunet-communicator-tcp.c:2329 7141#: src/transport/gnunet-communicator-tcp.c:2328
7146#: src/transport/gnunet-communicator-udp.c:2883 7142#: src/transport/gnunet-communicator-udp.c:2882
7147#: src/transport/gnunet-service-tng.c:4747 7143#: src/transport/gnunet-service-tng.c:4888
7148#: src/transport/gnunet-service-transport.c:2795 7144#: src/transport/gnunet-service-transport.c:2795
7149#, fuzzy 7145#, fuzzy
7150msgid "Transport service is lacking key configuration settings. Exiting.\n" 7146msgid "Transport service is lacking key configuration settings. Exiting.\n"
@@ -7152,12 +7148,12 @@ msgstr ""
7152"El servicio de transporte carece de opciones de configuración de clave. " 7148"El servicio de transporte carece de opciones de configuración de clave. "
7153"Saliendo.\n" 7149"Saliendo.\n"
7154 7150
7155#: src/transport/gnunet-communicator-tcp.c:2393 7151#: src/transport/gnunet-communicator-tcp.c:2392
7156#, fuzzy 7152#, fuzzy
7157msgid "GNUnet TCP communicator" 7153msgid "GNUnet TCP communicator"
7158msgstr "Configurador Gtk de GNUnet" 7154msgstr "Configurador Gtk de GNUnet"
7159 7155
7160#: src/transport/gnunet-communicator-udp.c:2954 7156#: src/transport/gnunet-communicator-udp.c:2953
7161#, fuzzy 7157#, fuzzy
7162msgid "GNUnet UDP communicator" 7158msgid "GNUnet UDP communicator"
7163msgstr "Configurador Gtk de GNUnet" 7159msgstr "Configurador Gtk de GNUnet"
@@ -7761,8 +7757,6 @@ msgstr "tamaño del mensaje"
7761#: src/transport/plugin_transport_http_server.c:3530 7757#: src/transport/plugin_transport_http_server.c:3530
7762#: src/transport/plugin_transport_tcp.c:3901 7758#: src/transport/plugin_transport_tcp.c:3901
7763#: src/transport/plugin_transport_tcp.c:3908 7759#: src/transport/plugin_transport_tcp.c:3908
7764#: src/transport/plugin_transport_xt.c:3899
7765#: src/transport/plugin_transport_xt.c:3906
7766msgid "TCP_STEALTH not supported on this platform.\n" 7760msgid "TCP_STEALTH not supported on this platform.\n"
7767msgstr "" 7761msgstr ""
7768 7762
@@ -7842,7 +7836,6 @@ msgstr "Encontradas %u direcciones para comunicar al servicio NAT\n"
7842 7836
7843#: src/transport/plugin_transport_http_server.c:2905 7837#: src/transport/plugin_transport_http_server.c:2905
7844#: src/transport/plugin_transport_udp.c:3627 7838#: src/transport/plugin_transport_udp.c:3627
7845#: src/transport/plugin_transport_xu.c:2049
7846msgid "Disabling IPv6 since it is not supported on this system!\n" 7839msgid "Disabling IPv6 since it is not supported on this system!\n"
7847msgstr "¡Deshabilitando IPv6 ya que no está soportado en este sistema!\n" 7840msgstr "¡Deshabilitando IPv6 ya que no está soportado en este sistema!\n"
7848 7841
@@ -7950,8 +7943,6 @@ msgstr "# bytes omitidos por SMTP (salientes)"
7950 7943
7951#: src/transport/plugin_transport_tcp.c:1557 7944#: src/transport/plugin_transport_tcp.c:1557
7952#: src/transport/plugin_transport_tcp.c:2883 7945#: src/transport/plugin_transport_tcp.c:2883
7953#: src/transport/plugin_transport_xt.c:1553
7954#: src/transport/plugin_transport_xt.c:2879
7955#, c-format 7946#, c-format
7956msgid "Unexpected address length: %u bytes\n" 7947msgid "Unexpected address length: %u bytes\n"
7957msgstr "Longitud de dirección inesperada: %u bytes\n" 7948msgstr "Longitud de dirección inesperada: %u bytes\n"
@@ -7960,9 +7951,6 @@ msgstr "Longitud de dirección inesperada: %u bytes\n"
7960#: src/transport/plugin_transport_tcp.c:1964 7951#: src/transport/plugin_transport_tcp.c:1964
7961#: src/transport/plugin_transport_tcp.c:3147 7952#: src/transport/plugin_transport_tcp.c:3147
7962#: src/transport/plugin_transport_tcp.c:4024 7953#: src/transport/plugin_transport_tcp.c:4024
7963#: src/transport/plugin_transport_xt.c:1736
7964#: src/transport/plugin_transport_xt.c:1960
7965#: src/transport/plugin_transport_xt.c:3143
7966msgid "# TCP sessions active" 7954msgid "# TCP sessions active"
7967msgstr "# Sesiones TCP activas" 7955msgstr "# Sesiones TCP activas"
7968 7956
@@ -7972,86 +7960,65 @@ msgstr "# Sesiones TCP activas"
7972#: src/transport/plugin_transport_tcp.c:2143 7960#: src/transport/plugin_transport_tcp.c:2143
7973#: src/transport/plugin_transport_tcp.c:2243 7961#: src/transport/plugin_transport_tcp.c:2243
7974#: src/transport/plugin_transport_tcp.c:2268 7962#: src/transport/plugin_transport_tcp.c:2268
7975#: src/transport/plugin_transport_xt.c:1778
7976#: src/transport/plugin_transport_xt.c:1942
7977#: src/transport/plugin_transport_xt.c:2066
7978#: src/transport/plugin_transport_xt.c:2139
7979#: src/transport/plugin_transport_xt.c:2239
7980#: src/transport/plugin_transport_xt.c:2264
7981msgid "# bytes currently in TCP buffers" 7963msgid "# bytes currently in TCP buffers"
7982msgstr "# bytes actualmente en los buffer TCP" 7964msgstr "# bytes actualmente en los buffer TCP"
7983 7965
7984#: src/transport/plugin_transport_tcp.c:1785 7966#: src/transport/plugin_transport_tcp.c:1785
7985#: src/transport/plugin_transport_xt.c:1781
7986msgid "# bytes discarded by TCP (disconnect)" 7967msgid "# bytes discarded by TCP (disconnect)"
7987msgstr "# bytes descartados por TCP (desconectado)" 7968msgstr "# bytes descartados por TCP (desconectado)"
7988 7969
7989#: src/transport/plugin_transport_tcp.c:2073 7970#: src/transport/plugin_transport_tcp.c:2073
7990#: src/transport/plugin_transport_xt.c:2069
7991msgid "# bytes discarded by TCP (timeout)" 7971msgid "# bytes discarded by TCP (timeout)"
7992msgstr "# bytes omitidos por TCP (expirados)" 7972msgstr "# bytes omitidos por TCP (expirados)"
7993 7973
7994#: src/transport/plugin_transport_tcp.c:2147 7974#: src/transport/plugin_transport_tcp.c:2147
7995#: src/transport/plugin_transport_xt.c:2143
7996msgid "# bytes transmitted via TCP" 7975msgid "# bytes transmitted via TCP"
7997msgstr "# bytes recibidos vía TCP" 7976msgstr "# bytes recibidos vía TCP"
7998 7977
7999#: src/transport/plugin_transport_tcp.c:2545 7978#: src/transport/plugin_transport_tcp.c:2545
8000#: src/transport/plugin_transport_xt.c:2541
8001msgid "# requests to create session with invalid address" 7979msgid "# requests to create session with invalid address"
8002msgstr "" 7980msgstr ""
8003 7981
8004#: src/transport/plugin_transport_tcp.c:2721 7982#: src/transport/plugin_transport_tcp.c:2721
8005#: src/transport/plugin_transport_xt.c:2717
8006msgid "# transport-service disconnect requests for TCP" 7983msgid "# transport-service disconnect requests for TCP"
8007msgstr "# peticiones de desconexión del servicio de transporte por TCP" 7984msgstr "# peticiones de desconexión del servicio de transporte por TCP"
8008 7985
8009#: src/transport/plugin_transport_tcp.c:3213 7986#: src/transport/plugin_transport_tcp.c:3213
8010#: src/transport/plugin_transport_xt.c:3209
8011msgid "# TCP WELCOME messages received" 7987msgid "# TCP WELCOME messages received"
8012msgstr "# Mensajes «WELCOME» TCP recibidos" 7988msgstr "# Mensajes «WELCOME» TCP recibidos"
8013 7989
8014#: src/transport/plugin_transport_tcp.c:3419 7990#: src/transport/plugin_transport_tcp.c:3419
8015#: src/transport/plugin_transport_xt.c:3415
8016msgid "# bytes received via TCP" 7991msgid "# bytes received via TCP"
8017msgstr "# bytes recibidos vía TCP" 7992msgstr "# bytes recibidos vía TCP"
8018 7993
8019#: src/transport/plugin_transport_tcp.c:3470 7994#: src/transport/plugin_transport_tcp.c:3470
8020#: src/transport/plugin_transport_tcp.c:3528 7995#: src/transport/plugin_transport_tcp.c:3528
8021#: src/transport/plugin_transport_xt.c:3466
8022#: src/transport/plugin_transport_xt.c:3524
8023#, fuzzy 7996#, fuzzy
8024msgid "# TCP server connections active" 7997msgid "# TCP server connections active"
8025msgstr "# conexiones «stream» activas" 7998msgstr "# conexiones «stream» activas"
8026 7999
8027#: src/transport/plugin_transport_tcp.c:3474 8000#: src/transport/plugin_transport_tcp.c:3474
8028#: src/transport/plugin_transport_xt.c:3470
8029#, fuzzy 8001#, fuzzy
8030msgid "# TCP server connect events" 8002msgid "# TCP server connect events"
8031msgstr "# Pares conectados" 8003msgstr "# Pares conectados"
8032 8004
8033#: src/transport/plugin_transport_tcp.c:3480 8005#: src/transport/plugin_transport_tcp.c:3480
8034#: src/transport/plugin_transport_xt.c:3476
8035msgid "TCP connection limit reached, suspending server\n" 8006msgid "TCP connection limit reached, suspending server\n"
8036msgstr "" 8007msgstr ""
8037 8008
8038#: src/transport/plugin_transport_tcp.c:3482 8009#: src/transport/plugin_transport_tcp.c:3482
8039#: src/transport/plugin_transport_xt.c:3478
8040msgid "# TCP service suspended" 8010msgid "# TCP service suspended"
8041msgstr "" 8011msgstr ""
8042 8012
8043#: src/transport/plugin_transport_tcp.c:3522 8013#: src/transport/plugin_transport_tcp.c:3522
8044#: src/transport/plugin_transport_xt.c:3518
8045msgid "# TCP service resumed" 8014msgid "# TCP service resumed"
8046msgstr "" 8015msgstr ""
8047 8016
8048#: src/transport/plugin_transport_tcp.c:3532 8017#: src/transport/plugin_transport_tcp.c:3532
8049#: src/transport/plugin_transport_xt.c:3528
8050msgid "# network-level TCP disconnect events" 8018msgid "# network-level TCP disconnect events"
8051msgstr "# eventos de desconexión TCP a nivel de red" 8019msgstr "# eventos de desconexión TCP a nivel de red"
8052 8020
8053#: src/transport/plugin_transport_tcp.c:3851 8021#: src/transport/plugin_transport_tcp.c:3851
8054#: src/transport/plugin_transport_xt.c:3849
8055msgid "Failed to start service.\n" 8022msgid "Failed to start service.\n"
8056msgstr "Se produjo un fallo al iniciar el servicio.\n" 8023msgstr "Se produjo un fallo al iniciar el servicio.\n"
8057 8024
@@ -8112,7 +8079,6 @@ msgid "Failed to bind UDP socket to %s: %s\n"
8112msgstr "Se produjo un fallo al abrir los «sockets» UDP\n" 8079msgstr "Se produjo un fallo al abrir los «sockets» UDP\n"
8113 8080
8114#: src/transport/plugin_transport_udp.c:3721 8081#: src/transport/plugin_transport_udp.c:3721
8115#: src/transport/plugin_transport_xu.c:2143
8116#, fuzzy 8082#, fuzzy
8117msgid "Disabling IPv4 since it is not supported on this system!\n" 8083msgid "Disabling IPv4 since it is not supported on this system!\n"
8118msgstr "¡Deshabilitando IPv6 ya que no está soportado en este sistema!\n" 8084msgstr "¡Deshabilitando IPv6 ya que no está soportado en este sistema!\n"
@@ -8123,19 +8089,15 @@ msgstr "Se produjo un fallo al abrir los «sockets» UDP\n"
8123 8089
8124#: src/transport/plugin_transport_udp.c:3883 8090#: src/transport/plugin_transport_udp.c:3883
8125#: src/transport/plugin_transport_udp.c:3897 8091#: src/transport/plugin_transport_udp.c:3897
8126#: src/transport/plugin_transport_xu.c:2301
8127#: src/transport/plugin_transport_xu.c:2315
8128msgid "must be in [0,65535]" 8092msgid "must be in [0,65535]"
8129msgstr "" 8093msgstr ""
8130 8094
8131#: src/transport/plugin_transport_udp.c:3929 8095#: src/transport/plugin_transport_udp.c:3929
8132#: src/transport/plugin_transport_xu.c:2347
8133#, fuzzy 8096#, fuzzy
8134msgid "must be valid IPv4 address" 8097msgid "must be valid IPv4 address"
8135msgstr "«%s» no es una dirección IP válida.\n" 8098msgstr "«%s» no es una dirección IP válida.\n"
8136 8099
8137#: src/transport/plugin_transport_udp.c:3956 8100#: src/transport/plugin_transport_udp.c:3956
8138#: src/transport/plugin_transport_xu.c:2374
8139#, fuzzy 8101#, fuzzy
8140msgid "must be valid IPv6 address" 8102msgid "must be valid IPv6 address"
8141msgstr "«%s» no es una dirección IP válida.\n" 8103msgstr "«%s» no es una dirección IP válida.\n"
@@ -8225,61 +8187,6 @@ msgstr ""
8225msgid "# sessions allocated" 8187msgid "# sessions allocated"
8226msgstr "# sesiones WLAN alojadas" 8188msgstr "# sesiones WLAN alojadas"
8227 8189
8228#: src/transport/plugin_transport_xt.c:4010
8229#, fuzzy, c-format
8230msgid "XT transport listening on port %llu\n"
8231msgstr "Transporte TCP escuchando en el puerto %llu\n"
8232
8233#: src/transport/plugin_transport_xt.c:4014
8234#, fuzzy
8235msgid "XT transport not listening on any port (client only)\n"
8236msgstr "Transporte TCP no escuchando en ningún puerto (únicamente cliente)\n"
8237
8238#: src/transport/plugin_transport_xt.c:4018
8239#, fuzzy, c-format
8240msgid "XT transport advertises itself as being on port %llu\n"
8241msgstr "El transporte TCP anuncia que está en el puerto %llu\n"
8242
8243#: src/transport/plugin_transport_xt.c:4022
8244#, fuzzy
8245msgid "# XT sessions active"
8246msgstr "# Sesiones TCP activas"
8247
8248#: src/transport/plugin_transport_xu.c:1237
8249#, fuzzy, c-format
8250msgid ""
8251"XU could not transmit message to `%s': Network seems down, please check your "
8252"network configuration\n"
8253msgstr ""
8254"UDP no pudo transmitir el mensaje a «%s»: La red parece caída, por favor, "
8255"compruebe su configuración de red\n"
8256
8257#: src/transport/plugin_transport_xu.c:1251
8258#, fuzzy
8259msgid ""
8260"XU could not transmit IPv6 message! Please check your network configuration "
8261"and disable IPv6 if your connection does not have a global IPv6 address\n"
8262msgstr ""
8263"UDP no pudo transmitir el mensaje a «%s». Por favor, compruebe su "
8264"configuración de red y deshabilite IPv6 si su conexión carece de una "
8265"dirección IPv6 global\n"
8266
8267#: src/transport/plugin_transport_xu.c:2125
8268#: src/transport/plugin_transport_xu.c:2224
8269#, fuzzy, c-format
8270msgid "Failed to bind XU socket to %s: %s\n"
8271msgstr "Se produjo un fallo al abrir los «sockets» UDP\n"
8272
8273#: src/transport/plugin_transport_xu.c:2234
8274#, fuzzy
8275msgid "Failed to open XU sockets\n"
8276msgstr "Se produjo un fallo al abrir los «sockets» UDP\n"
8277
8278#: src/transport/plugin_transport_xu.c:2398
8279#, fuzzy
8280msgid "Failed to create XU network sockets\n"
8281msgstr "Se produjo un fallo al crear una nueva firma"
8282
8283#: src/transport/tcp_connection_legacy.c:452 8190#: src/transport/tcp_connection_legacy.c:452
8284#, c-format 8191#, c-format
8285msgid "Access denied to `%s'\n" 8192msgid "Access denied to `%s'\n"
@@ -8290,17 +8197,17 @@ msgstr "Acceso denegado a «%s»\n"
8290msgid "Accepting connection from `%s': %p\n" 8197msgid "Accepting connection from `%s': %p\n"
8291msgstr "Aceptando conexión desde «%s»: %p\n" 8198msgstr "Aceptando conexión desde «%s»: %p\n"
8292 8199
8293#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1666 8200#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1630
8294#, c-format 8201#, c-format
8295msgid "`%s' failed for port %d (%s).\n" 8202msgid "`%s' failed for port %d (%s).\n"
8296msgstr "«%s» falló para el puerto %d (%s).\n" 8203msgstr "«%s» falló para el puerto %d (%s).\n"
8297 8204
8298#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1676 8205#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1640
8299#, c-format 8206#, c-format
8300msgid "`%s' failed for port %d (%s): address already in use\n" 8207msgid "`%s' failed for port %d (%s): address already in use\n"
8301msgstr "«%s» falló para el puerto %d (%s): dirección en uso actualmente\n" 8208msgstr "«%s» falló para el puerto %d (%s): dirección en uso actualmente\n"
8302 8209
8303#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1682 8210#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1646
8304#, fuzzy, c-format 8211#, fuzzy, c-format
8305msgid "`%s' failed for `%s': address already in use\n" 8212msgid "`%s' failed for `%s': address already in use\n"
8306msgstr "«%s» falló para «%.*s»: dirección en uso actualmente\n" 8213msgstr "«%s» falló para «%.*s»: dirección en uso actualmente\n"
@@ -8334,19 +8241,19 @@ msgstr "No se pudo procesar la especificación de red IPv4 «%s» para «%s:%s»
8334msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n" 8241msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
8335msgstr "No se pudo procesar la especificación de red IPv6 «%s» para «%s:%s»\n" 8242msgstr "No se pudo procesar la especificación de red IPv6 «%s» para «%s:%s»\n"
8336 8243
8337#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1597 8244#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1561
8338msgid "Could not access a pre-bound socket, will try to bind myself\n" 8245msgid "Could not access a pre-bound socket, will try to bind myself\n"
8339msgstr "" 8246msgstr ""
8340"No se pudo acceder a un «socket» pre-ascociado, lo intentaré asociar yo " 8247"No se pudo acceder a un «socket» pre-ascociado, lo intentaré asociar yo "
8341"mismo\n" 8248"mismo\n"
8342 8249
8343#: src/transport/tcp_service_legacy.c:953 8250#: src/transport/tcp_service_legacy.c:953
8344#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1750 8251#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1714
8345#, c-format 8252#, c-format
8346msgid "Specified value for `%s' of service `%s' is invalid\n" 8253msgid "Specified value for `%s' of service `%s' is invalid\n"
8347msgstr "El valor especificado «%s» para el servicio «%s» no es válido\n" 8254msgstr "El valor especificado «%s» para el servicio «%s» no es válido\n"
8348 8255
8349#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1783 8256#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1747
8350#, c-format 8257#, c-format
8351msgid "Could not access pre-bound socket %u, will try to bind myself\n" 8258msgid "Could not access pre-bound socket %u, will try to bind myself\n"
8352msgstr "" 8259msgstr ""
@@ -8363,45 +8270,45 @@ msgstr "Se produjo un fallo al inciar «%s» en «%s»\n"
8363msgid "Service `%s' runs at %s\n" 8270msgid "Service `%s' runs at %s\n"
8364msgstr "El servicio «%s» se ejecuta en %s\n" 8271msgstr "El servicio «%s» se ejecuta en %s\n"
8365 8272
8366#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2057 8273#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2021
8367msgid "Service process failed to initialize\n" 8274msgid "Service process failed to initialize\n"
8368msgstr "No se pudo inicializar el proceso del servicio\n" 8275msgstr "No se pudo inicializar el proceso del servicio\n"
8369 8276
8370#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2061 8277#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2025
8371msgid "Service process could not initialize server function\n" 8278msgid "Service process could not initialize server function\n"
8372msgstr "" 8279msgstr ""
8373"No se pudo inicializar la función del servidor en el proceso del servicio\n" 8280"No se pudo inicializar la función del servidor en el proceso del servicio\n"
8374 8281
8375#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2065 8282#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2029
8376msgid "Service process failed to report status\n" 8283msgid "Service process failed to report status\n"
8377msgstr "El proceso del servicio no devolvió un estado\n" 8284msgstr "El proceso del servicio no devolvió un estado\n"
8378 8285
8379#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535 8286#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535
8380#: src/util/service.c:1935 8287#: src/util/service.c:1899
8381#, c-format 8288#, c-format
8382msgid "Cannot obtain information about user `%s': %s\n" 8289msgid "Cannot obtain information about user `%s': %s\n"
8383msgstr "No se pudo obtener información acerca del usuario «%s»: %s\n" 8290msgstr "No se pudo obtener información acerca del usuario «%s»: %s\n"
8384 8291
8385#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1937 8292#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1901
8386msgid "No such user" 8293msgid "No such user"
8387msgstr "No existe tal usuario" 8294msgstr "No existe tal usuario"
8388 8295
8389#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1956 8296#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1920
8390#, c-format 8297#, c-format
8391msgid "Cannot change user/group to `%s': %s\n" 8298msgid "Cannot change user/group to `%s': %s\n"
8392msgstr "Imposible cambiar el usuario/grupo a «%s»: %s\n" 8299msgstr "Imposible cambiar el usuario/grupo a «%s»: %s\n"
8393 8300
8394#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2318 8301#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2282
8395msgid "do daemonize (detach from terminal)" 8302msgid "do daemonize (detach from terminal)"
8396msgstr "demonizar (desasociar del terminal)" 8303msgstr "demonizar (desasociar del terminal)"
8397 8304
8398#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2382 8305#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2346
8399#: src/util/service.c:2397 8306#: src/util/service.c:2361
8400#, fuzzy, c-format 8307#, fuzzy, c-format
8401msgid "Malformed configuration file `%s', exit ...\n" 8308msgid "Malformed configuration file `%s', exit ...\n"
8402msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n" 8309msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
8403 8310
8404#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2409 8311#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2373
8405#, fuzzy 8312#, fuzzy
8406msgid "Malformed configuration, exit ...\n" 8313msgid "Malformed configuration, exit ...\n"
8407msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n" 8314msgstr "Se produjo un fallo al borrar el fichero de configuración %s\n"
@@ -8444,11 +8351,11 @@ msgstr "Los metadatos serializados «%s» son mayores de lo permitido (%u>%u)"
8444msgid "Metadata `%s' failed to deserialize" 8351msgid "Metadata `%s' failed to deserialize"
8445msgstr "Se produjo un fallo al deserializar los metadatos «%s»" 8352msgstr "Se produjo un fallo al deserializar los metadatos «%s»"
8446 8353
8447#: src/util/client.c:734 8354#: src/util/client.c:749
8448msgid "not a valid filename" 8355msgid "not a valid filename"
8449msgstr "" 8356msgstr ""
8450 8357
8451#: src/util/client.c:925 8358#: src/util/client.c:941
8452#, c-format 8359#, c-format
8453msgid "Need a non-empty hostname for service `%s'.\n" 8360msgid "Need a non-empty hostname for service `%s'.\n"
8454msgstr "Se necesita un nombre de máquina no vacío para el servicio «%s».\n" 8361msgstr "Se necesita un nombre de máquina no vacío para el servicio «%s».\n"
@@ -8752,7 +8659,7 @@ msgstr ""
8752msgid "print this help" 8659msgid "print this help"
8753msgstr "imprime esta ayuda" 8660msgstr "imprime esta ayuda"
8754 8661
8755#: src/util/getopt_helpers.c:282 8662#: src/util/getopt_helpers.c:282 src/util/gnunet-qr.c:300
8756msgid "be verbose" 8663msgid "be verbose"
8757msgstr "" 8664msgstr ""
8758 8665
@@ -8800,53 +8707,54 @@ msgstr "Tienes que introducir un número en la opción «%s».\n"
8800msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n" 8707msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n"
8801msgstr "" 8708msgstr ""
8802 8709
8803#: src/util/gnunet-config.c:160 8710#: src/util/gnunet-config.c:161
8804#, fuzzy, c-format 8711#, fuzzy, c-format
8805msgid "failed to load configuration defaults" 8712msgid "failed to load configuration defaults"
8806msgstr "Se produjo un fallo al cargar la configuración de %s\n" 8713msgstr "Se produjo un fallo al cargar la configuración de %s\n"
8807 8714
8808#: src/util/gnunet-config.c:173 8715#: src/util/gnunet-config.c:174
8809#, fuzzy, c-format 8716#, fuzzy, c-format
8810msgid "%s or %s argument is required\n" 8717msgid "%s or %s argument is required\n"
8811msgstr "el parámetro --section es necesario\n" 8718msgstr "el parámetro --section es necesario\n"
8812 8719
8813#: src/util/gnunet-config.c:181 8720#: src/util/gnunet-config.c:182
8814#, c-format 8721#, c-format
8815msgid "The following sections are available:\n" 8722msgid "The following sections are available:\n"
8816msgstr "" 8723msgstr ""
8817 8724
8818#: src/util/gnunet-config.c:232 8725#: src/util/gnunet-config.c:234
8819#, c-format 8726#, c-format
8820msgid "--option argument required to set value\n" 8727msgid "--option argument required to set value\n"
8821msgstr "el parámetro --option es necesario para establecer un valor\n" 8728msgstr "el parámetro --option es necesario para establecer un valor\n"
8822 8729
8823#: src/util/gnunet-config.c:286 8730#: src/util/gnunet-config.c:288
8824msgid "obtain option of value as a filename (with $-expansion)" 8731#, fuzzy
8732msgid "interpret option value as a filename (with $-expansion)"
8825msgstr "" 8733msgstr ""
8826"obtener la opción del valor como un nombre de fichero (con expansión del $)" 8734"obtener la opción del valor como un nombre de fichero (con expansión del $)"
8827 8735
8828#: src/util/gnunet-config.c:291 8736#: src/util/gnunet-config.c:293
8829msgid "name of the section to access" 8737msgid "name of the section to access"
8830msgstr "nombre de la sección a la que acceder" 8738msgstr "nombre de la sección a la que acceder"
8831 8739
8832#: src/util/gnunet-config.c:296 8740#: src/util/gnunet-config.c:298
8833msgid "name of the option to access" 8741msgid "name of the option to access"
8834msgstr "nombre de la opción a la que acceder" 8742msgstr "nombre de la opción a la que acceder"
8835 8743
8836#: src/util/gnunet-config.c:301 8744#: src/util/gnunet-config.c:303
8837msgid "value to set" 8745msgid "value to set"
8838msgstr "valor a establecer" 8746msgstr "valor a establecer"
8839 8747
8840#: src/util/gnunet-config.c:305 8748#: src/util/gnunet-config.c:307
8841#, fuzzy 8749#, fuzzy
8842msgid "print available configuration sections" 8750msgid "print available configuration sections"
8843msgstr "Falta configuración sobre las opciones de claves.\n" 8751msgstr "Falta configuración sobre las opciones de claves.\n"
8844 8752
8845#: src/util/gnunet-config.c:309 8753#: src/util/gnunet-config.c:311
8846msgid "write configuration file that only contains delta to defaults" 8754msgid "write configuration file that only contains delta to defaults"
8847msgstr "" 8755msgstr ""
8848 8756
8849#: src/util/gnunet-config.c:322 8757#: src/util/gnunet-config.c:324
8850msgid "Manipulate GNUnet configuration files" 8758msgid "Manipulate GNUnet configuration files"
8851msgstr "Manipular ficheros de configuración de GNUnet" 8759msgstr "Manipular ficheros de configuración de GNUnet"
8852 8760
@@ -8941,6 +8849,33 @@ msgstr ""
8941msgid "Manipulate GNUnet private ECC key files" 8849msgid "Manipulate GNUnet private ECC key files"
8942msgstr "Manipular los ficheros de clave privada ECC de GNUnet" 8850msgstr "Manipular los ficheros de clave privada ECC de GNUnet"
8943 8851
8852#: src/util/gnunet-qr.c:108 src/util/gnunet-uri.c:91
8853#, c-format
8854msgid "Invalid URI: does not start with `%s'\n"
8855msgstr "URI no válida: no comienza con «%s»\n"
8856
8857#: src/util/gnunet-qr.c:116 src/util/gnunet-uri.c:98
8858#, c-format
8859msgid "Invalid URI: fails to specify subsystem\n"
8860msgstr "URI no válida: falla al especificar el subsistema\n"
8861
8862#: src/util/gnunet-qr.c:127 src/util/gnunet-uri.c:108
8863#, c-format
8864msgid "No handler known for subsystem `%s'\n"
8865msgstr "No hay un manejador conocido para el subsistema «%s»\n"
8866
8867#: src/util/gnunet-qr.c:297
8868msgid "use video-device DEVICE (default: /dev/video0"
8869msgstr ""
8870
8871#: src/util/gnunet-qr.c:303
8872msgid "do not show preview windows"
8873msgstr ""
8874
8875#: src/util/gnunet-qr.c:311
8876msgid "Scan a QR code using a video device and import the uri read"
8877msgstr ""
8878
8944#: src/util/gnunet-resolver.c:168 8879#: src/util/gnunet-resolver.c:168
8945msgid "perform a reverse lookup" 8880msgid "perform a reverse lookup"
8946msgstr "realizar una búsqueda inversa" 8881msgstr "realizar una búsqueda inversa"
@@ -8984,21 +8919,6 @@ msgstr ""
8984msgid "No URI specified on command line\n" 8919msgid "No URI specified on command line\n"
8985msgstr "No se ha especificado una URI en la línea de comandos. Saliendo.\n" 8920msgstr "No se ha especificado una URI en la línea de comandos. Saliendo.\n"
8986 8921
8987#: src/util/gnunet-uri.c:91
8988#, c-format
8989msgid "Invalid URI: does not start with `%s'\n"
8990msgstr "URI no válida: no comienza con «%s»\n"
8991
8992#: src/util/gnunet-uri.c:98
8993#, c-format
8994msgid "Invalid URI: fails to specify subsystem\n"
8995msgstr "URI no válida: falla al especificar el subsistema\n"
8996
8997#: src/util/gnunet-uri.c:108
8998#, c-format
8999msgid "No handler known for subsystem `%s'\n"
9000msgstr "No hay un manejador conocido para el subsistema «%s»\n"
9001
9002#: src/util/gnunet-uri.c:170 8922#: src/util/gnunet-uri.c:170
9003msgid "Perform default-actions for GNUnet URIs" 8923msgid "Perform default-actions for GNUnet URIs"
9004msgstr "Realizar las acciones predeterminadas para URI de GNUnet" 8924msgstr "Realizar las acciones predeterminadas para URI de GNUnet"
@@ -9020,12 +8940,12 @@ msgstr ""
9020msgid "Error writing to `%s': %s\n" 8940msgid "Error writing to `%s': %s\n"
9021msgstr "Error escribiendo a «%s»: %s\n" 8941msgstr "Error escribiendo a «%s»: %s\n"
9022 8942
9023#: src/util/network.c:136 8943#: src/util/network.c:176
9024#, c-format 8944#, c-format
9025msgid "Unable to shorten unix path `%s' while keeping name unique\n" 8945msgid "Unable to shorten unix path `%s' while keeping name unique\n"
9026msgstr "Imposible acortar la ruta unix «%s» manteniendo el nombre único\n" 8946msgstr "Imposible acortar la ruta unix «%s» manteniendo el nombre único\n"
9027 8947
9028#: src/util/network.c:1794 src/util/network.c:1978 8948#: src/util/network.c:1835 src/util/network.c:2019
9029#, c-format 8949#, c-format
9030msgid "" 8950msgid ""
9031"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" 8951"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -9150,7 +9070,7 @@ msgstr ""
9150"El código de procesado para el mensaje del tipo %u no llamó a " 9070"El código de procesado para el mensaje del tipo %u no llamó a "
9151"«GNUNET_SERVER_receive_done» después de %s\n" 9071"«GNUNET_SERVER_receive_done» después de %s\n"
9152 9072
9153#: src/util/service.c:1862 9073#: src/util/service.c:1826
9154msgid "" 9074msgid ""
9155"Could not bind to any of the ports I was supposed to, refusing to run!\n" 9075"Could not bind to any of the ports I was supposed to, refusing to run!\n"
9156msgstr "" 9076msgstr ""
@@ -9506,6 +9426,53 @@ msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
9506msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n" 9426msgstr "«%s» falló en el fichero «%s» en %s:%d con el error: %s\n"
9507 9427
9508#, fuzzy 9428#, fuzzy
9429#~ msgid "XT transport listening on port %llu\n"
9430#~ msgstr "Transporte TCP escuchando en el puerto %llu\n"
9431
9432#, fuzzy
9433#~ msgid "XT transport not listening on any port (client only)\n"
9434#~ msgstr ""
9435#~ "Transporte TCP no escuchando en ningún puerto (únicamente cliente)\n"
9436
9437#, fuzzy
9438#~ msgid "XT transport advertises itself as being on port %llu\n"
9439#~ msgstr "El transporte TCP anuncia que está en el puerto %llu\n"
9440
9441#, fuzzy
9442#~ msgid "# XT sessions active"
9443#~ msgstr "# Sesiones TCP activas"
9444
9445#, fuzzy
9446#~ msgid ""
9447#~ "XU could not transmit message to `%s': Network seems down, please check "
9448#~ "your network configuration\n"
9449#~ msgstr ""
9450#~ "UDP no pudo transmitir el mensaje a «%s»: La red parece caída, por favor, "
9451#~ "compruebe su configuración de red\n"
9452
9453#, fuzzy
9454#~ msgid ""
9455#~ "XU could not transmit IPv6 message! Please check your network "
9456#~ "configuration and disable IPv6 if your connection does not have a global "
9457#~ "IPv6 address\n"
9458#~ msgstr ""
9459#~ "UDP no pudo transmitir el mensaje a «%s». Por favor, compruebe su "
9460#~ "configuración de red y deshabilite IPv6 si su conexión carece de una "
9461#~ "dirección IPv6 global\n"
9462
9463#, fuzzy
9464#~ msgid "Failed to bind XU socket to %s: %s\n"
9465#~ msgstr "Se produjo un fallo al abrir los «sockets» UDP\n"
9466
9467#, fuzzy
9468#~ msgid "Failed to open XU sockets\n"
9469#~ msgstr "Se produjo un fallo al abrir los «sockets» UDP\n"
9470
9471#, fuzzy
9472#~ msgid "Failed to create XU network sockets\n"
9473#~ msgstr "Se produjo un fallo al crear una nueva firma"
9474
9475#, fuzzy
9509#~ msgid "Print information about DV state" 9476#~ msgid "Print information about DV state"
9510#~ msgstr "Imprime información acerca del estado del ATS" 9477#~ msgstr "Imprime información acerca del estado del ATS"
9511 9478
diff --git a/po/fr.po b/po/fr.po
index 29351499b..474372b3e 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -7,7 +7,7 @@ msgid ""
7msgstr "" 7msgstr ""
8"Project-Id-Version: gnunet 0.10.1\n" 8"Project-Id-Version: gnunet 0.10.1\n"
9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" 9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
10"POT-Creation-Date: 2019-02-28 11:41+0100\n" 10"POT-Creation-Date: 2019-04-04 12:39+0200\n"
11"PO-Revision-Date: 2015-12-24 01:20+0100\n" 11"PO-Revision-Date: 2015-12-24 01:20+0100\n"
12"Last-Translator: Stéphane Aulery <lkppo@free.fr>\n" 12"Last-Translator: Stéphane Aulery <lkppo@free.fr>\n"
13"Language-Team: French <traduc@traduc.org>\n" 13"Language-Team: French <traduc@traduc.org>\n"
@@ -221,8 +221,7 @@ msgid "Control services and the Automated Restart Manager (ARM)"
221msgstr "" 221msgstr ""
222 222
223#: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120 223#: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120
224#: src/transport/plugin_transport_xt.c:1120 224#: src/transport/tcp_service_legacy.c:557
225#: src/transport/tcp_service_legacy.c:557 src/util/service.c:1167
226#, c-format 225#, c-format
227msgid "" 226msgid ""
228"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n" 227"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
@@ -232,35 +231,29 @@ msgstr ""
232#: src/transport/plugin_transport_tcp.c:1139 231#: src/transport/plugin_transport_tcp.c:1139
233#: src/transport/plugin_transport_tcp.c:1145 232#: src/transport/plugin_transport_tcp.c:1145
234#: src/transport/plugin_transport_tcp.c:3835 233#: src/transport/plugin_transport_tcp.c:3835
235#: src/transport/plugin_transport_xt.c:1139
236#: src/transport/plugin_transport_xt.c:1145
237#: src/transport/plugin_transport_xt.c:3833
238#: src/transport/tcp_service_legacy.c:576 234#: src/transport/tcp_service_legacy.c:576
239#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1192 235#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1156
240#: src/util/service.c:1198 236#: src/util/service.c:1162
241#, c-format 237#, c-format
242msgid "Require valid port number for service `%s' in configuration!\n" 238msgid "Require valid port number for service `%s' in configuration!\n"
243msgstr "" 239msgstr ""
244 240
245#: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176 241#: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176
246#: src/transport/plugin_transport_xt.c:1176 242#: src/transport/tcp_service_legacy.c:613 src/util/client.c:521
247#: src/transport/tcp_service_legacy.c:613 src/util/client.c:506 243#: src/util/service.c:1201
248#: src/util/service.c:1237
249#, c-format 244#, c-format
250msgid "UNIXPATH `%s' too long, maximum length is %llu\n" 245msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
251msgstr "" 246msgstr ""
252 247
253#: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180 248#: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180
254#: src/transport/plugin_transport_xt.c:1180 249#: src/transport/tcp_service_legacy.c:617 src/util/client.c:526
255#: src/transport/tcp_service_legacy.c:617 src/util/client.c:511 250#: src/util/service.c:1206
256#: src/util/service.c:1242
257#, c-format 251#, c-format
258msgid "Using `%s' instead\n" 252msgid "Using `%s' instead\n"
259msgstr "" 253msgstr ""
260 254
261#: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211 255#: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211
262#: src/transport/plugin_transport_xt.c:1211 256#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1242
263#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1278
264#, c-format 257#, c-format
265msgid "" 258msgid ""
266"Disabling UNIX domain socket support for service `%s', failed to create UNIX " 259"Disabling UNIX domain socket support for service `%s', failed to create UNIX "
@@ -268,8 +261,7 @@ msgid ""
268msgstr "" 261msgstr ""
269 262
270#: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228 263#: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228
271#: src/transport/plugin_transport_xt.c:1228 264#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1260
272#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1296
273#, c-format 265#, c-format
274msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n" 266msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
275msgstr "" 267msgstr ""
@@ -277,8 +269,7 @@ msgstr ""
277#: src/arm/gnunet-service-arm.c:556 269#: src/arm/gnunet-service-arm.c:556
278#: src/transport/plugin_transport_http_server.c:2688 270#: src/transport/plugin_transport_http_server.c:2688
279#: src/transport/plugin_transport_tcp.c:1259 271#: src/transport/plugin_transport_tcp.c:1259
280#: src/transport/plugin_transport_xt.c:1259 272#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1301
281#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1337
282#, c-format 273#, c-format
283msgid "Failed to resolve `%s': %s\n" 274msgid "Failed to resolve `%s': %s\n"
284msgstr "Résolution de « %s » échouée : %s\n" 275msgstr "Résolution de « %s » échouée : %s\n"
@@ -286,8 +277,7 @@ msgstr "Résolution de « %s » échouée : %s\n"
286#: src/arm/gnunet-service-arm.c:575 277#: src/arm/gnunet-service-arm.c:575
287#: src/transport/plugin_transport_http_server.c:2706 278#: src/transport/plugin_transport_http_server.c:2706
288#: src/transport/plugin_transport_tcp.c:1278 279#: src/transport/plugin_transport_tcp.c:1278
289#: src/transport/plugin_transport_xt.c:1278 280#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1321
290#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1357
291#, c-format 281#, c-format
292msgid "Failed to find %saddress for `%s'.\n" 282msgid "Failed to find %saddress for `%s'.\n"
293msgstr "" 283msgstr ""
@@ -1555,6 +1545,10 @@ msgstr ""
1555msgid "Unable to parse ATTR record string `%s'\n" 1545msgid "Unable to parse ATTR record string `%s'\n"
1556msgstr "Résolution de « %s » échouée\n" 1546msgstr "Résolution de « %s » échouée\n"
1557 1547
1548#: src/credential/plugin_rest_credential.c:1128
1549msgid "GNS REST API initialized\n"
1550msgstr ""
1551
1558#: src/datacache/datacache.c:119 src/datacache/datacache.c:311 1552#: src/datacache/datacache.c:119 src/datacache/datacache.c:311
1559#: src/datastore/gnunet-service-datastore.c:757 1553#: src/datastore/gnunet-service-datastore.c:757
1560msgid "# bytes stored" 1554msgid "# bytes stored"
@@ -2045,7 +2039,7 @@ msgstr ""
2045msgid "Exiting as the number of peers is %u\n" 2039msgid "Exiting as the number of peers is %u\n"
2046msgstr "" 2040msgstr ""
2047 2041
2048#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2959 2042#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2981
2049#, fuzzy 2043#, fuzzy
2050msgid "number of peers to start" 2044msgid "number of peers to start"
2051msgstr "nombre de valeurs" 2045msgstr "nombre de valeurs"
@@ -3085,11 +3079,11 @@ msgstr ""
3085msgid "set the desired LEVEL of sender-anonymity" 3079msgid "set the desired LEVEL of sender-anonymity"
3086msgstr "" 3080msgstr ""
3087 3081
3088#: src/fs/gnunet-auto-share.c:772 src/fs/gnunet-publish.c:907 3082#: src/fs/gnunet-auto-share.c:772
3089msgid "disable adding the creation time to the metadata of the uploaded file" 3083msgid "disable adding the creation time to the metadata of the uploaded file"
3090msgstr "" 3084msgstr ""
3091 3085
3092#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:912 3086#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:907
3093msgid "do not use libextractor to add keywords or metadata" 3087msgid "do not use libextractor to add keywords or metadata"
3094msgstr "" 3088msgstr ""
3095 3089
@@ -3384,6 +3378,10 @@ msgstr ""
3384msgid "Option `%s' makes no sense without option `%s'.\n" 3378msgid "Option `%s' makes no sense without option `%s'.\n"
3385msgstr "" 3379msgstr ""
3386 3380
3381#: src/fs/gnunet-publish.c:911
3382msgid "enable adding the creation time to the metadata of the uploaded file"
3383msgstr ""
3384
3387#: src/fs/gnunet-publish.c:916 3385#: src/fs/gnunet-publish.c:916
3388msgid "" 3386msgid ""
3389"print list of extracted keywords that would be used, but do not perform " 3387"print list of extracted keywords that would be used, but do not perform "
@@ -3849,38 +3847,38 @@ msgstr ""
3849msgid "GNUnet HTTP server to create business cards" 3847msgid "GNUnet HTTP server to create business cards"
3850msgstr "" 3848msgstr ""
3851 3849
3852#: src/gns/gnunet-dns2gns.c:203 3850#: src/gns/gnunet-dns2gns.c:214
3853msgid "Failed to pack DNS response into UDP packet!\n" 3851msgid "Failed to pack DNS response into UDP packet!\n"
3854msgstr "" 3852msgstr ""
3855 3853
3856#: src/gns/gnunet-dns2gns.c:405 3854#: src/gns/gnunet-dns2gns.c:416
3857#, c-format 3855#, c-format
3858msgid "Cannot parse DNS request from %s\n" 3856msgid "Cannot parse DNS request from %s\n"
3859msgstr "" 3857msgstr ""
3860 3858
3861#: src/gns/gnunet-dns2gns.c:421 3859#: src/gns/gnunet-dns2gns.c:432
3862#, c-format 3860#, c-format
3863msgid "Received malformed DNS request from %s\n" 3861msgid "Received malformed DNS request from %s\n"
3864msgstr "" 3862msgstr ""
3865 3863
3866#: src/gns/gnunet-dns2gns.c:429 3864#: src/gns/gnunet-dns2gns.c:440
3867#, c-format 3865#, c-format
3868msgid "Received unsupported DNS request from %s\n" 3866msgid "Received unsupported DNS request from %s\n"
3869msgstr "" 3867msgstr ""
3870 3868
3871#: src/gns/gnunet-dns2gns.c:588 3869#: src/gns/gnunet-dns2gns.c:600
3872msgid "No DNS server specified!\n" 3870msgid "No DNS server specified!\n"
3873msgstr "" 3871msgstr ""
3874 3872
3875#: src/gns/gnunet-dns2gns.c:688 3873#: src/gns/gnunet-dns2gns.c:748
3876msgid "IP of recursive DNS resolver to use (required)" 3874msgid "IP of recursive DNS resolver to use (required)"
3877msgstr "" 3875msgstr ""
3878 3876
3879#: src/gns/gnunet-dns2gns.c:693 3877#: src/gns/gnunet-dns2gns.c:753
3880msgid "UDP port to listen on for inbound DNS requests; default: 2853" 3878msgid "UDP port to listen on for inbound DNS requests; default: 2853"
3881msgstr "" 3879msgstr ""
3882 3880
3883#: src/gns/gnunet-dns2gns.c:710 3881#: src/gns/gnunet-dns2gns.c:770
3884msgid "GNUnet DNS-to-GNS proxy (a DNS server)" 3882msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
3885msgstr "" 3883msgstr ""
3886 3884
@@ -3951,103 +3949,103 @@ msgstr ""
3951msgid "%s failed at %s:%d: `%s'\n" 3949msgid "%s failed at %s:%d: `%s'\n"
3952msgstr "" 3950msgstr ""
3953 3951
3954#: src/gns/gnunet-gns-proxy.c:980 3952#: src/gns/gnunet-gns-proxy.c:989
3955#, c-format 3953#, c-format
3956msgid "Unsupported CURL TLS backend %d\n" 3954msgid "Unsupported CURL TLS backend %d\n"
3957msgstr "" 3955msgstr ""
3958 3956
3959#: src/gns/gnunet-gns-proxy.c:1005 3957#: src/gns/gnunet-gns-proxy.c:1014
3960#, c-format 3958#, c-format
3961msgid "Failed to fetch CN from cert: %s\n" 3959msgid "Failed to fetch CN from cert: %s\n"
3962msgstr "" 3960msgstr ""
3963 3961
3964#: src/gns/gnunet-gns-proxy.c:1026 3962#: src/gns/gnunet-gns-proxy.c:1035
3965#, c-format 3963#, c-format
3966msgid "Failed to initialize DANE: %s\n" 3964msgid "Failed to initialize DANE: %s\n"
3967msgstr "" 3965msgstr ""
3968 3966
3969#: src/gns/gnunet-gns-proxy.c:1041 3967#: src/gns/gnunet-gns-proxy.c:1050
3970#, c-format 3968#, c-format
3971msgid "Failed to parse DANE record: %s\n" 3969msgid "Failed to parse DANE record: %s\n"
3972msgstr "" 3970msgstr ""
3973 3971
3974#: src/gns/gnunet-gns-proxy.c:1056 3972#: src/gns/gnunet-gns-proxy.c:1065
3975#, c-format 3973#, c-format
3976msgid "Failed to verify TLS connection using DANE: %s\n" 3974msgid "Failed to verify TLS connection using DANE: %s\n"
3977msgstr "" 3975msgstr ""
3978 3976
3979#: src/gns/gnunet-gns-proxy.c:1066 3977#: src/gns/gnunet-gns-proxy.c:1075
3980#, c-format 3978#, c-format
3981msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n" 3979msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
3982msgstr "" 3980msgstr ""
3983 3981
3984#: src/gns/gnunet-gns-proxy.c:1090 3982#: src/gns/gnunet-gns-proxy.c:1099
3985#, c-format 3983#, c-format
3986msgid "TLS certificate subject name (%s) does not match `%s': %d\n" 3984msgid "TLS certificate subject name (%s) does not match `%s': %d\n"
3987msgstr "" 3985msgstr ""
3988 3986
3989#: src/gns/gnunet-gns-proxy.c:1221 3987#: src/gns/gnunet-gns-proxy.c:1230
3990#, c-format 3988#, c-format
3991msgid "Cookie domain `%s' supplied by server is invalid\n" 3989msgid "Cookie domain `%s' supplied by server is invalid\n"
3992msgstr "" 3990msgstr ""
3993 3991
3994#: src/gns/gnunet-gns-proxy.c:2122 3992#: src/gns/gnunet-gns-proxy.c:2131
3995#, c-format 3993#, c-format
3996msgid "Unsupported HTTP method `%s'\n" 3994msgid "Unsupported HTTP method `%s'\n"
3997msgstr "" 3995msgstr ""
3998 3996
3999#: src/gns/gnunet-gns-proxy.c:2643 3997#: src/gns/gnunet-gns-proxy.c:2652
4000#, c-format 3998#, c-format
4001msgid "Unable to import private key from file `%s'\n" 3999msgid "Unable to import private key from file `%s'\n"
4002msgstr "" 4000msgstr ""
4003 4001
4004#: src/gns/gnunet-gns-proxy.c:2675 4002#: src/gns/gnunet-gns-proxy.c:2684
4005#, c-format 4003#, c-format
4006msgid "Unable to import certificate from `%s'\n" 4004msgid "Unable to import certificate from `%s'\n"
4007msgstr "" 4005msgstr ""
4008 4006
4009#: src/gns/gnunet-gns-proxy.c:2876 4007#: src/gns/gnunet-gns-proxy.c:2885
4010#, c-format 4008#, c-format
4011msgid "Failed to start HTTPS server for `%s'\n" 4009msgid "Failed to start HTTPS server for `%s'\n"
4012msgstr "" 4010msgstr ""
4013 4011
4014#: src/gns/gnunet-gns-proxy.c:2898 src/rest/gnunet-rest-server.c:658 4012#: src/gns/gnunet-gns-proxy.c:2907 src/rest/gnunet-rest-server.c:668
4015msgid "Failed to pass client to MHD\n" 4013msgid "Failed to pass client to MHD\n"
4016msgstr "" 4014msgstr ""
4017 4015
4018#: src/gns/gnunet-gns-proxy.c:3234 4016#: src/gns/gnunet-gns-proxy.c:3243
4019#, c-format 4017#, c-format
4020msgid "Unsupported socks version %d\n" 4018msgid "Unsupported socks version %d\n"
4021msgstr "" 4019msgstr ""
4022 4020
4023#: src/gns/gnunet-gns-proxy.c:3263 4021#: src/gns/gnunet-gns-proxy.c:3272
4024#, c-format 4022#, c-format
4025msgid "Unsupported socks command %d\n" 4023msgid "Unsupported socks command %d\n"
4026msgstr "" 4024msgstr ""
4027 4025
4028#: src/gns/gnunet-gns-proxy.c:3346 4026#: src/gns/gnunet-gns-proxy.c:3355
4029#, c-format 4027#, c-format
4030msgid "Unsupported socks address type %d\n" 4028msgid "Unsupported socks address type %d\n"
4031msgstr "" 4029msgstr ""
4032 4030
4033#: src/gns/gnunet-gns-proxy.c:3636 4031#: src/gns/gnunet-gns-proxy.c:3693
4034#, c-format 4032#, c-format
4035msgid "Failed to load X.509 key and certificate from `%s'\n" 4033msgid "Failed to load X.509 key and certificate from `%s'\n"
4036msgstr "" 4034msgstr ""
4037 4035
4038#: src/gns/gnunet-gns-proxy.c:3764 4036#: src/gns/gnunet-gns-proxy.c:3821
4039msgid "listen on specified port (default: 7777)" 4037msgid "listen on specified port (default: 7777)"
4040msgstr "" 4038msgstr ""
4041 4039
4042#: src/gns/gnunet-gns-proxy.c:3769 4040#: src/gns/gnunet-gns-proxy.c:3826
4043msgid "pem file to use as CA" 4041msgid "pem file to use as CA"
4044msgstr "" 4042msgstr ""
4045 4043
4046#: src/gns/gnunet-gns-proxy.c:3773 4044#: src/gns/gnunet-gns-proxy.c:3830
4047msgid "disable use of IPv6" 4045msgid "disable use of IPv6"
4048msgstr "" 4046msgstr ""
4049 4047
4050#: src/gns/gnunet-gns-proxy.c:3799 4048#: src/gns/gnunet-gns-proxy.c:3856
4051msgid "GNUnet GNS proxy" 4049msgid "GNUnet GNS proxy"
4052msgstr "" 4050msgstr ""
4053 4051
@@ -4151,6 +4149,10 @@ msgstr ""
4151msgid "Unable to parse BOX record string `%s'\n" 4149msgid "Unable to parse BOX record string `%s'\n"
4152msgstr "" 4150msgstr ""
4153 4151
4152#: src/gns/plugin_rest_gns.c:452
4153msgid "Gns REST API initialized\n"
4154msgstr ""
4155
4154#: src/gnsrecord/plugin_gnsrecord_dns.c:359 4156#: src/gnsrecord/plugin_gnsrecord_dns.c:359
4155#, c-format 4157#, c-format
4156msgid "Unable to parse IPv4 address `%s'\n" 4158msgid "Unable to parse IPv4 address `%s'\n"
@@ -4657,6 +4659,10 @@ msgstr ""
4657msgid "Failed to create directory `%s' for storing egos\n" 4659msgid "Failed to create directory `%s' for storing egos\n"
4658msgstr "" 4660msgstr ""
4659 4661
4662#: src/identity/plugin_rest_identity.c:1297
4663msgid "Identity REST API initialized\n"
4664msgstr ""
4665
4660#: src/json/json.c:123 4666#: src/json/json.c:123
4661#, fuzzy, c-format 4667#, fuzzy, c-format
4662msgid "Failed to parse JSON in option `%s': %s (%s)\n" 4668msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -5045,6 +5051,10 @@ msgstr ""
5045msgid "heap file database running\n" 5051msgid "heap file database running\n"
5046msgstr "" 5052msgstr ""
5047 5053
5054#: src/namestore/plugin_rest_namestore.c:1079
5055msgid "Namestore REST API initialized\n"
5056msgstr ""
5057
5048#: src/nat-auto/gnunet-nat-auto.c:193 5058#: src/nat-auto/gnunet-nat-auto.c:193
5049msgid "Suggested configuration changes:\n" 5059msgid "Suggested configuration changes:\n"
5050msgstr "" 5060msgstr ""
@@ -5414,7 +5424,7 @@ msgid "\tExpires: %s \t %s\n"
5414msgstr "" 5424msgstr ""
5415 5425
5416#: src/peerinfo-tool/gnunet-peerinfo.c:299 5426#: src/peerinfo-tool/gnunet-peerinfo.c:299
5417#: src/rest-plugins/plugin_rest_peerinfo.c:501 5427#: src/peerinfo-tool/plugin_rest_peerinfo.c:501
5418#, c-format 5428#, c-format
5419msgid "Failure: Cannot convert address to string for peer `%s'\n" 5429msgid "Failure: Cannot convert address to string for peer `%s'\n"
5420msgstr "" 5430msgstr ""
@@ -5493,6 +5503,10 @@ msgstr ""
5493msgid "Failed to load transport plugin for `%s'\n" 5503msgid "Failed to load transport plugin for `%s'\n"
5494msgstr "" 5504msgstr ""
5495 5505
5506#: src/peerinfo-tool/plugin_rest_peerinfo.c:796
5507msgid "Peerinfo REST API initialized\n"
5508msgstr ""
5509
5496#: src/peerstore/gnunet-peerstore.c:91 5510#: src/peerstore/gnunet-peerstore.c:91
5497msgid "peerstore" 5511msgid "peerstore"
5498msgstr "" 5512msgstr ""
@@ -5648,6 +5662,11 @@ msgstr ""
5648msgid "Expiration interval of the attribute" 5662msgid "Expiration interval of the attribute"
5649msgstr "" 5663msgstr ""
5650 5664
5665#: src/reclaim/plugin_rest_openid_connect.c:2279
5666#: src/reclaim/plugin_rest_reclaim.c:1079
5667msgid "Identity Provider REST API initialized\n"
5668msgstr ""
5669
5651#: src/reclaim/reclaim_api.c:436 5670#: src/reclaim/reclaim_api.c:436
5652#, fuzzy 5671#, fuzzy
5653msgid "failed to store record\n" 5672msgid "failed to store record\n"
@@ -5737,43 +5756,18 @@ msgstr ""
5737msgid "Search string `%s' is too long!\n" 5756msgid "Search string `%s' is too long!\n"
5738msgstr "" 5757msgstr ""
5739 5758
5740#: src/rest/gnunet-rest-server.c:927 5759#: src/rest/gnunet-rest-server.c:986
5741msgid "listen on specified port (default: 7776)" 5760msgid "listen on specified port (default: 7776)"
5742msgstr "" 5761msgstr ""
5743 5762
5744#: src/rest/gnunet-rest-server.c:944 5763#: src/rest/gnunet-rest-server.c:1003
5745msgid "GNUnet REST server" 5764msgid "GNUnet REST server"
5746msgstr "" 5765msgstr ""
5747 5766
5748#: src/rest-plugins/plugin_rest_copying.c:209 5767#: src/rest/plugin_rest_copying.c:209
5749msgid "COPYING REST API initialized\n" 5768msgid "COPYING REST API initialized\n"
5750msgstr "" 5769msgstr ""
5751 5770
5752#: src/rest-plugins/plugin_rest_credential.c:1128
5753msgid "GNS REST API initialized\n"
5754msgstr ""
5755
5756#: src/rest-plugins/plugin_rest_gns.c:452
5757msgid "Gns REST API initialized\n"
5758msgstr ""
5759
5760#: src/rest-plugins/plugin_rest_identity.c:1297
5761msgid "Identity REST API initialized\n"
5762msgstr ""
5763
5764#: src/rest-plugins/plugin_rest_namestore.c:1079
5765msgid "Namestore REST API initialized\n"
5766msgstr ""
5767
5768#: src/rest-plugins/plugin_rest_openid_connect.c:2279
5769#: src/rest-plugins/plugin_rest_reclaim.c:1079
5770msgid "Identity Provider REST API initialized\n"
5771msgstr ""
5772
5773#: src/rest-plugins/plugin_rest_peerinfo.c:796
5774msgid "Peerinfo REST API initialized\n"
5775msgstr ""
5776
5777#: src/revocation/gnunet-revocation.c:129 5771#: src/revocation/gnunet-revocation.c:129
5778#, c-format 5772#, c-format
5779msgid "Key `%s' is valid\n" 5773msgid "Key `%s' is valid\n"
@@ -5915,20 +5909,20 @@ msgstr ""
5915msgid "Get peers from biased stream" 5909msgid "Get peers from biased stream"
5916msgstr "" 5910msgstr ""
5917 5911
5918#: src/rps/gnunet-rps-profiler.c:2964 5912#: src/rps/gnunet-rps-profiler.c:2986
5919msgid "duration of the profiling" 5913msgid "duration of the profiling"
5920msgstr "" 5914msgstr ""
5921 5915
5922#: src/rps/gnunet-rps-profiler.c:2969 5916#: src/rps/gnunet-rps-profiler.c:2991
5923msgid "timeout for the profiling" 5917msgid "timeout for the profiling"
5924msgstr "" 5918msgstr ""
5925 5919
5926#: src/rps/gnunet-rps-profiler.c:2974 5920#: src/rps/gnunet-rps-profiler.c:2996
5927#, fuzzy 5921#, fuzzy
5928msgid "number of PeerIDs to request" 5922msgid "number of PeerIDs to request"
5929msgstr "nombre de valeurs" 5923msgstr "nombre de valeurs"
5930 5924
5931#: src/rps/gnunet-rps-profiler.c:2990 5925#: src/rps/gnunet-rps-profiler.c:3012
5932msgid "Measure quality and performance of the RPS service." 5926msgid "Measure quality and performance of the RPS service."
5933msgstr "" 5927msgstr ""
5934 5928
@@ -6634,18 +6628,18 @@ msgstr ""
6634msgid "GNUnet topology control" 6628msgid "GNUnet topology control"
6635msgstr "" 6629msgstr ""
6636 6630
6637#: src/transport/gnunet-communicator-tcp.c:2329 6631#: src/transport/gnunet-communicator-tcp.c:2328
6638#: src/transport/gnunet-communicator-udp.c:2883 6632#: src/transport/gnunet-communicator-udp.c:2882
6639#: src/transport/gnunet-service-tng.c:4747 6633#: src/transport/gnunet-service-tng.c:4888
6640#: src/transport/gnunet-service-transport.c:2795 6634#: src/transport/gnunet-service-transport.c:2795
6641msgid "Transport service is lacking key configuration settings. Exiting.\n" 6635msgid "Transport service is lacking key configuration settings. Exiting.\n"
6642msgstr "" 6636msgstr ""
6643 6637
6644#: src/transport/gnunet-communicator-tcp.c:2393 6638#: src/transport/gnunet-communicator-tcp.c:2392
6645msgid "GNUnet TCP communicator" 6639msgid "GNUnet TCP communicator"
6646msgstr "" 6640msgstr ""
6647 6641
6648#: src/transport/gnunet-communicator-udp.c:2954 6642#: src/transport/gnunet-communicator-udp.c:2953
6649msgid "GNUnet UDP communicator" 6643msgid "GNUnet UDP communicator"
6650msgstr "" 6644msgstr ""
6651 6645
@@ -7191,8 +7185,6 @@ msgstr ""
7191#: src/transport/plugin_transport_http_server.c:3530 7185#: src/transport/plugin_transport_http_server.c:3530
7192#: src/transport/plugin_transport_tcp.c:3901 7186#: src/transport/plugin_transport_tcp.c:3901
7193#: src/transport/plugin_transport_tcp.c:3908 7187#: src/transport/plugin_transport_tcp.c:3908
7194#: src/transport/plugin_transport_xt.c:3899
7195#: src/transport/plugin_transport_xt.c:3906
7196msgid "TCP_STEALTH not supported on this platform.\n" 7188msgid "TCP_STEALTH not supported on this platform.\n"
7197msgstr "" 7189msgstr ""
7198 7190
@@ -7262,7 +7254,6 @@ msgstr ""
7262 7254
7263#: src/transport/plugin_transport_http_server.c:2905 7255#: src/transport/plugin_transport_http_server.c:2905
7264#: src/transport/plugin_transport_udp.c:3627 7256#: src/transport/plugin_transport_udp.c:3627
7265#: src/transport/plugin_transport_xu.c:2049
7266msgid "Disabling IPv6 since it is not supported on this system!\n" 7257msgid "Disabling IPv6 since it is not supported on this system!\n"
7267msgstr "" 7258msgstr ""
7268 7259
@@ -7362,8 +7353,6 @@ msgstr ""
7362 7353
7363#: src/transport/plugin_transport_tcp.c:1557 7354#: src/transport/plugin_transport_tcp.c:1557
7364#: src/transport/plugin_transport_tcp.c:2883 7355#: src/transport/plugin_transport_tcp.c:2883
7365#: src/transport/plugin_transport_xt.c:1553
7366#: src/transport/plugin_transport_xt.c:2879
7367#, c-format 7356#, c-format
7368msgid "Unexpected address length: %u bytes\n" 7357msgid "Unexpected address length: %u bytes\n"
7369msgstr "" 7358msgstr ""
@@ -7372,9 +7361,6 @@ msgstr ""
7372#: src/transport/plugin_transport_tcp.c:1964 7361#: src/transport/plugin_transport_tcp.c:1964
7373#: src/transport/plugin_transport_tcp.c:3147 7362#: src/transport/plugin_transport_tcp.c:3147
7374#: src/transport/plugin_transport_tcp.c:4024 7363#: src/transport/plugin_transport_tcp.c:4024
7375#: src/transport/plugin_transport_xt.c:1736
7376#: src/transport/plugin_transport_xt.c:1960
7377#: src/transport/plugin_transport_xt.c:3143
7378msgid "# TCP sessions active" 7364msgid "# TCP sessions active"
7379msgstr "# Session TCP active" 7365msgstr "# Session TCP active"
7380 7366
@@ -7384,85 +7370,64 @@ msgstr "# Session TCP active"
7384#: src/transport/plugin_transport_tcp.c:2143 7370#: src/transport/plugin_transport_tcp.c:2143
7385#: src/transport/plugin_transport_tcp.c:2243 7371#: src/transport/plugin_transport_tcp.c:2243
7386#: src/transport/plugin_transport_tcp.c:2268 7372#: src/transport/plugin_transport_tcp.c:2268
7387#: src/transport/plugin_transport_xt.c:1778
7388#: src/transport/plugin_transport_xt.c:1942
7389#: src/transport/plugin_transport_xt.c:2066
7390#: src/transport/plugin_transport_xt.c:2139
7391#: src/transport/plugin_transport_xt.c:2239
7392#: src/transport/plugin_transport_xt.c:2264
7393msgid "# bytes currently in TCP buffers" 7373msgid "# bytes currently in TCP buffers"
7394msgstr "" 7374msgstr ""
7395 7375
7396#: src/transport/plugin_transport_tcp.c:1785 7376#: src/transport/plugin_transport_tcp.c:1785
7397#: src/transport/plugin_transport_xt.c:1781
7398msgid "# bytes discarded by TCP (disconnect)" 7377msgid "# bytes discarded by TCP (disconnect)"
7399msgstr "" 7378msgstr ""
7400 7379
7401#: src/transport/plugin_transport_tcp.c:2073 7380#: src/transport/plugin_transport_tcp.c:2073
7402#: src/transport/plugin_transport_xt.c:2069
7403msgid "# bytes discarded by TCP (timeout)" 7381msgid "# bytes discarded by TCP (timeout)"
7404msgstr "" 7382msgstr ""
7405 7383
7406#: src/transport/plugin_transport_tcp.c:2147 7384#: src/transport/plugin_transport_tcp.c:2147
7407#: src/transport/plugin_transport_xt.c:2143
7408msgid "# bytes transmitted via TCP" 7385msgid "# bytes transmitted via TCP"
7409msgstr "" 7386msgstr ""
7410 7387
7411#: src/transport/plugin_transport_tcp.c:2545 7388#: src/transport/plugin_transport_tcp.c:2545
7412#: src/transport/plugin_transport_xt.c:2541
7413msgid "# requests to create session with invalid address" 7389msgid "# requests to create session with invalid address"
7414msgstr "" 7390msgstr ""
7415 7391
7416#: src/transport/plugin_transport_tcp.c:2721 7392#: src/transport/plugin_transport_tcp.c:2721
7417#: src/transport/plugin_transport_xt.c:2717
7418msgid "# transport-service disconnect requests for TCP" 7393msgid "# transport-service disconnect requests for TCP"
7419msgstr "" 7394msgstr ""
7420 7395
7421#: src/transport/plugin_transport_tcp.c:3213 7396#: src/transport/plugin_transport_tcp.c:3213
7422#: src/transport/plugin_transport_xt.c:3209
7423msgid "# TCP WELCOME messages received" 7397msgid "# TCP WELCOME messages received"
7424msgstr "" 7398msgstr ""
7425 7399
7426#: src/transport/plugin_transport_tcp.c:3419 7400#: src/transport/plugin_transport_tcp.c:3419
7427#: src/transport/plugin_transport_xt.c:3415
7428msgid "# bytes received via TCP" 7401msgid "# bytes received via TCP"
7429msgstr "" 7402msgstr ""
7430 7403
7431#: src/transport/plugin_transport_tcp.c:3470 7404#: src/transport/plugin_transport_tcp.c:3470
7432#: src/transport/plugin_transport_tcp.c:3528 7405#: src/transport/plugin_transport_tcp.c:3528
7433#: src/transport/plugin_transport_xt.c:3466
7434#: src/transport/plugin_transport_xt.c:3524
7435#, fuzzy 7406#, fuzzy
7436msgid "# TCP server connections active" 7407msgid "# TCP server connections active"
7437msgstr "# Session TCP active" 7408msgstr "# Session TCP active"
7438 7409
7439#: src/transport/plugin_transport_tcp.c:3474 7410#: src/transport/plugin_transport_tcp.c:3474
7440#: src/transport/plugin_transport_xt.c:3470
7441msgid "# TCP server connect events" 7411msgid "# TCP server connect events"
7442msgstr "" 7412msgstr ""
7443 7413
7444#: src/transport/plugin_transport_tcp.c:3480 7414#: src/transport/plugin_transport_tcp.c:3480
7445#: src/transport/plugin_transport_xt.c:3476
7446msgid "TCP connection limit reached, suspending server\n" 7415msgid "TCP connection limit reached, suspending server\n"
7447msgstr "" 7416msgstr ""
7448 7417
7449#: src/transport/plugin_transport_tcp.c:3482 7418#: src/transport/plugin_transport_tcp.c:3482
7450#: src/transport/plugin_transport_xt.c:3478
7451msgid "# TCP service suspended" 7419msgid "# TCP service suspended"
7452msgstr "" 7420msgstr ""
7453 7421
7454#: src/transport/plugin_transport_tcp.c:3522 7422#: src/transport/plugin_transport_tcp.c:3522
7455#: src/transport/plugin_transport_xt.c:3518
7456msgid "# TCP service resumed" 7423msgid "# TCP service resumed"
7457msgstr "" 7424msgstr ""
7458 7425
7459#: src/transport/plugin_transport_tcp.c:3532 7426#: src/transport/plugin_transport_tcp.c:3532
7460#: src/transport/plugin_transport_xt.c:3528
7461msgid "# network-level TCP disconnect events" 7427msgid "# network-level TCP disconnect events"
7462msgstr "" 7428msgstr ""
7463 7429
7464#: src/transport/plugin_transport_tcp.c:3851 7430#: src/transport/plugin_transport_tcp.c:3851
7465#: src/transport/plugin_transport_xt.c:3849
7466msgid "Failed to start service.\n" 7431msgid "Failed to start service.\n"
7467msgstr "" 7432msgstr ""
7468 7433
@@ -7514,7 +7479,6 @@ msgid "Failed to bind UDP socket to %s: %s\n"
7514msgstr "Résolution de « %s » échouée : %s\n" 7479msgstr "Résolution de « %s » échouée : %s\n"
7515 7480
7516#: src/transport/plugin_transport_udp.c:3721 7481#: src/transport/plugin_transport_udp.c:3721
7517#: src/transport/plugin_transport_xu.c:2143
7518msgid "Disabling IPv4 since it is not supported on this system!\n" 7482msgid "Disabling IPv4 since it is not supported on this system!\n"
7519msgstr "" 7483msgstr ""
7520 7484
@@ -7524,19 +7488,15 @@ msgstr ""
7524 7488
7525#: src/transport/plugin_transport_udp.c:3883 7489#: src/transport/plugin_transport_udp.c:3883
7526#: src/transport/plugin_transport_udp.c:3897 7490#: src/transport/plugin_transport_udp.c:3897
7527#: src/transport/plugin_transport_xu.c:2301
7528#: src/transport/plugin_transport_xu.c:2315
7529msgid "must be in [0,65535]" 7491msgid "must be in [0,65535]"
7530msgstr "" 7492msgstr ""
7531 7493
7532#: src/transport/plugin_transport_udp.c:3929 7494#: src/transport/plugin_transport_udp.c:3929
7533#: src/transport/plugin_transport_xu.c:2347
7534#, fuzzy 7495#, fuzzy
7535msgid "must be valid IPv4 address" 7496msgid "must be valid IPv4 address"
7536msgstr "adresse invalide" 7497msgstr "adresse invalide"
7537 7498
7538#: src/transport/plugin_transport_udp.c:3956 7499#: src/transport/plugin_transport_udp.c:3956
7539#: src/transport/plugin_transport_xu.c:2374
7540#, fuzzy 7500#, fuzzy
7541msgid "must be valid IPv6 address" 7501msgid "must be valid IPv6 address"
7542msgstr "adresse invalide" 7502msgstr "adresse invalide"
@@ -7612,54 +7572,6 @@ msgstr ""
7612msgid "# sessions allocated" 7572msgid "# sessions allocated"
7613msgstr "# Session TCP active" 7573msgstr "# Session TCP active"
7614 7574
7615#: src/transport/plugin_transport_xt.c:4010
7616#, c-format
7617msgid "XT transport listening on port %llu\n"
7618msgstr ""
7619
7620#: src/transport/plugin_transport_xt.c:4014
7621msgid "XT transport not listening on any port (client only)\n"
7622msgstr ""
7623
7624#: src/transport/plugin_transport_xt.c:4018
7625#, c-format
7626msgid "XT transport advertises itself as being on port %llu\n"
7627msgstr ""
7628
7629#: src/transport/plugin_transport_xt.c:4022
7630#, fuzzy
7631msgid "# XT sessions active"
7632msgstr "# Session TCP active"
7633
7634#: src/transport/plugin_transport_xu.c:1237
7635#, c-format
7636msgid ""
7637"XU could not transmit message to `%s': Network seems down, please check your "
7638"network configuration\n"
7639msgstr ""
7640
7641#: src/transport/plugin_transport_xu.c:1251
7642msgid ""
7643"XU could not transmit IPv6 message! Please check your network configuration "
7644"and disable IPv6 if your connection does not have a global IPv6 address\n"
7645msgstr ""
7646
7647#: src/transport/plugin_transport_xu.c:2125
7648#: src/transport/plugin_transport_xu.c:2224
7649#, fuzzy, c-format
7650msgid "Failed to bind XU socket to %s: %s\n"
7651msgstr "Résolution de « %s » échouée : %s\n"
7652
7653#: src/transport/plugin_transport_xu.c:2234
7654#, fuzzy
7655msgid "Failed to open XU sockets\n"
7656msgstr "Résolution de « %s » échouée : %s\n"
7657
7658#: src/transport/plugin_transport_xu.c:2398
7659#, fuzzy
7660msgid "Failed to create XU network sockets\n"
7661msgstr "Résolution de « %s » échouée : %s\n"
7662
7663#: src/transport/tcp_connection_legacy.c:452 7575#: src/transport/tcp_connection_legacy.c:452
7664#, c-format 7576#, c-format
7665msgid "Access denied to `%s'\n" 7577msgid "Access denied to `%s'\n"
@@ -7670,17 +7582,17 @@ msgstr ""
7670msgid "Accepting connection from `%s': %p\n" 7582msgid "Accepting connection from `%s': %p\n"
7671msgstr "" 7583msgstr ""
7672 7584
7673#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1666 7585#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1630
7674#, c-format 7586#, c-format
7675msgid "`%s' failed for port %d (%s).\n" 7587msgid "`%s' failed for port %d (%s).\n"
7676msgstr "" 7588msgstr ""
7677 7589
7678#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1676 7590#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1640
7679#, c-format 7591#, c-format
7680msgid "`%s' failed for port %d (%s): address already in use\n" 7592msgid "`%s' failed for port %d (%s): address already in use\n"
7681msgstr "" 7593msgstr ""
7682 7594
7683#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1682 7595#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1646
7684#, c-format 7596#, c-format
7685msgid "`%s' failed for `%s': address already in use\n" 7597msgid "`%s' failed for `%s': address already in use\n"
7686msgstr "" 7598msgstr ""
@@ -7712,17 +7624,17 @@ msgstr ""
7712msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n" 7624msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
7713msgstr "" 7625msgstr ""
7714 7626
7715#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1597 7627#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1561
7716msgid "Could not access a pre-bound socket, will try to bind myself\n" 7628msgid "Could not access a pre-bound socket, will try to bind myself\n"
7717msgstr "" 7629msgstr ""
7718 7630
7719#: src/transport/tcp_service_legacy.c:953 7631#: src/transport/tcp_service_legacy.c:953
7720#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1750 7632#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1714
7721#, c-format 7633#, c-format
7722msgid "Specified value for `%s' of service `%s' is invalid\n" 7634msgid "Specified value for `%s' of service `%s' is invalid\n"
7723msgstr "" 7635msgstr ""
7724 7636
7725#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1783 7637#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1747
7726#, c-format 7638#, c-format
7727msgid "Could not access pre-bound socket %u, will try to bind myself\n" 7639msgid "Could not access pre-bound socket %u, will try to bind myself\n"
7728msgstr "" 7640msgstr ""
@@ -7737,44 +7649,44 @@ msgstr ""
7737msgid "Service `%s' runs at %s\n" 7649msgid "Service `%s' runs at %s\n"
7738msgstr "" 7650msgstr ""
7739 7651
7740#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2057 7652#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2021
7741msgid "Service process failed to initialize\n" 7653msgid "Service process failed to initialize\n"
7742msgstr "" 7654msgstr ""
7743 7655
7744#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2061 7656#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2025
7745msgid "Service process could not initialize server function\n" 7657msgid "Service process could not initialize server function\n"
7746msgstr "" 7658msgstr ""
7747 7659
7748#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2065 7660#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2029
7749msgid "Service process failed to report status\n" 7661msgid "Service process failed to report status\n"
7750msgstr "" 7662msgstr ""
7751 7663
7752#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535 7664#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535
7753#: src/util/service.c:1935 7665#: src/util/service.c:1899
7754#, c-format 7666#, c-format
7755msgid "Cannot obtain information about user `%s': %s\n" 7667msgid "Cannot obtain information about user `%s': %s\n"
7756msgstr "" 7668msgstr ""
7757 7669
7758#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1937 7670#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1901
7759msgid "No such user" 7671msgid "No such user"
7760msgstr "Aucun utilisateur trouvé" 7672msgstr "Aucun utilisateur trouvé"
7761 7673
7762#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1956 7674#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1920
7763#, c-format 7675#, c-format
7764msgid "Cannot change user/group to `%s': %s\n" 7676msgid "Cannot change user/group to `%s': %s\n"
7765msgstr "" 7677msgstr ""
7766 7678
7767#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2318 7679#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2282
7768msgid "do daemonize (detach from terminal)" 7680msgid "do daemonize (detach from terminal)"
7769msgstr "" 7681msgstr ""
7770 7682
7771#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2382 7683#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2346
7772#: src/util/service.c:2397 7684#: src/util/service.c:2361
7773#, c-format 7685#, c-format
7774msgid "Malformed configuration file `%s', exit ...\n" 7686msgid "Malformed configuration file `%s', exit ...\n"
7775msgstr "" 7687msgstr ""
7776 7688
7777#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2409 7689#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2373
7778msgid "Malformed configuration, exit ...\n" 7690msgid "Malformed configuration, exit ...\n"
7779msgstr "" 7691msgstr ""
7780 7692
@@ -7816,11 +7728,11 @@ msgstr ""
7816msgid "Metadata `%s' failed to deserialize" 7728msgid "Metadata `%s' failed to deserialize"
7817msgstr "" 7729msgstr ""
7818 7730
7819#: src/util/client.c:734 7731#: src/util/client.c:749
7820msgid "not a valid filename" 7732msgid "not a valid filename"
7821msgstr "" 7733msgstr ""
7822 7734
7823#: src/util/client.c:925 7735#: src/util/client.c:941
7824#, c-format 7736#, c-format
7825msgid "Need a non-empty hostname for service `%s'.\n" 7737msgid "Need a non-empty hostname for service `%s'.\n"
7826msgstr "" 7738msgstr ""
@@ -8104,7 +8016,7 @@ msgstr ""
8104msgid "print this help" 8016msgid "print this help"
8105msgstr "" 8017msgstr ""
8106 8018
8107#: src/util/getopt_helpers.c:282 8019#: src/util/getopt_helpers.c:282 src/util/gnunet-qr.c:300
8108msgid "be verbose" 8020msgid "be verbose"
8109msgstr "" 8021msgstr ""
8110 8022
@@ -8152,51 +8064,51 @@ msgstr ""
8152msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n" 8064msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n"
8153msgstr "" 8065msgstr ""
8154 8066
8155#: src/util/gnunet-config.c:160 8067#: src/util/gnunet-config.c:161
8156#, fuzzy, c-format 8068#, fuzzy, c-format
8157msgid "failed to load configuration defaults" 8069msgid "failed to load configuration defaults"
8158msgstr "fornat invalide : « %s »\n" 8070msgstr "fornat invalide : « %s »\n"
8159 8071
8160#: src/util/gnunet-config.c:173 8072#: src/util/gnunet-config.c:174
8161#, c-format 8073#, c-format
8162msgid "%s or %s argument is required\n" 8074msgid "%s or %s argument is required\n"
8163msgstr "" 8075msgstr ""
8164 8076
8165#: src/util/gnunet-config.c:181 8077#: src/util/gnunet-config.c:182
8166#, c-format 8078#, c-format
8167msgid "The following sections are available:\n" 8079msgid "The following sections are available:\n"
8168msgstr "" 8080msgstr ""
8169 8081
8170#: src/util/gnunet-config.c:232 8082#: src/util/gnunet-config.c:234
8171#, c-format 8083#, c-format
8172msgid "--option argument required to set value\n" 8084msgid "--option argument required to set value\n"
8173msgstr "" 8085msgstr ""
8174 8086
8175#: src/util/gnunet-config.c:286 8087#: src/util/gnunet-config.c:288
8176msgid "obtain option of value as a filename (with $-expansion)" 8088msgid "interpret option value as a filename (with $-expansion)"
8177msgstr "" 8089msgstr ""
8178 8090
8179#: src/util/gnunet-config.c:291 8091#: src/util/gnunet-config.c:293
8180msgid "name of the section to access" 8092msgid "name of the section to access"
8181msgstr "" 8093msgstr ""
8182 8094
8183#: src/util/gnunet-config.c:296 8095#: src/util/gnunet-config.c:298
8184msgid "name of the option to access" 8096msgid "name of the option to access"
8185msgstr "" 8097msgstr ""
8186 8098
8187#: src/util/gnunet-config.c:301 8099#: src/util/gnunet-config.c:303
8188msgid "value to set" 8100msgid "value to set"
8189msgstr "" 8101msgstr ""
8190 8102
8191#: src/util/gnunet-config.c:305 8103#: src/util/gnunet-config.c:307
8192msgid "print available configuration sections" 8104msgid "print available configuration sections"
8193msgstr "" 8105msgstr ""
8194 8106
8195#: src/util/gnunet-config.c:309 8107#: src/util/gnunet-config.c:311
8196msgid "write configuration file that only contains delta to defaults" 8108msgid "write configuration file that only contains delta to defaults"
8197msgstr "" 8109msgstr ""
8198 8110
8199#: src/util/gnunet-config.c:322 8111#: src/util/gnunet-config.c:324
8200msgid "Manipulate GNUnet configuration files" 8112msgid "Manipulate GNUnet configuration files"
8201msgstr "" 8113msgstr ""
8202 8114
@@ -8289,6 +8201,33 @@ msgstr ""
8289msgid "Manipulate GNUnet private ECC key files" 8201msgid "Manipulate GNUnet private ECC key files"
8290msgstr "" 8202msgstr ""
8291 8203
8204#: src/util/gnunet-qr.c:108 src/util/gnunet-uri.c:91
8205#, c-format
8206msgid "Invalid URI: does not start with `%s'\n"
8207msgstr ""
8208
8209#: src/util/gnunet-qr.c:116 src/util/gnunet-uri.c:98
8210#, c-format
8211msgid "Invalid URI: fails to specify subsystem\n"
8212msgstr ""
8213
8214#: src/util/gnunet-qr.c:127 src/util/gnunet-uri.c:108
8215#, c-format
8216msgid "No handler known for subsystem `%s'\n"
8217msgstr ""
8218
8219#: src/util/gnunet-qr.c:297
8220msgid "use video-device DEVICE (default: /dev/video0"
8221msgstr ""
8222
8223#: src/util/gnunet-qr.c:303
8224msgid "do not show preview windows"
8225msgstr ""
8226
8227#: src/util/gnunet-qr.c:311
8228msgid "Scan a QR code using a video device and import the uri read"
8229msgstr ""
8230
8292#: src/util/gnunet-resolver.c:168 8231#: src/util/gnunet-resolver.c:168
8293msgid "perform a reverse lookup" 8232msgid "perform a reverse lookup"
8294msgstr "" 8233msgstr ""
@@ -8331,21 +8270,6 @@ msgstr ""
8331msgid "No URI specified on command line\n" 8270msgid "No URI specified on command line\n"
8332msgstr "" 8271msgstr ""
8333 8272
8334#: src/util/gnunet-uri.c:91
8335#, c-format
8336msgid "Invalid URI: does not start with `%s'\n"
8337msgstr ""
8338
8339#: src/util/gnunet-uri.c:98
8340#, c-format
8341msgid "Invalid URI: fails to specify subsystem\n"
8342msgstr ""
8343
8344#: src/util/gnunet-uri.c:108
8345#, c-format
8346msgid "No handler known for subsystem `%s'\n"
8347msgstr ""
8348
8349#: src/util/gnunet-uri.c:170 8273#: src/util/gnunet-uri.c:170
8350msgid "Perform default-actions for GNUnet URIs" 8274msgid "Perform default-actions for GNUnet URIs"
8351msgstr "" 8275msgstr ""
@@ -8365,12 +8289,12 @@ msgstr ""
8365msgid "Error writing to `%s': %s\n" 8289msgid "Error writing to `%s': %s\n"
8366msgstr "" 8290msgstr ""
8367 8291
8368#: src/util/network.c:136 8292#: src/util/network.c:176
8369#, c-format 8293#, c-format
8370msgid "Unable to shorten unix path `%s' while keeping name unique\n" 8294msgid "Unable to shorten unix path `%s' while keeping name unique\n"
8371msgstr "" 8295msgstr ""
8372 8296
8373#: src/util/network.c:1794 src/util/network.c:1978 8297#: src/util/network.c:1835 src/util/network.c:2019
8374#, c-format 8298#, c-format
8375msgid "" 8299msgid ""
8376"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" 8300"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8482,7 +8406,7 @@ msgid ""
8482"`GNUNET_SERVICE_client_continue' after %s\n" 8406"`GNUNET_SERVICE_client_continue' after %s\n"
8483msgstr "" 8407msgstr ""
8484 8408
8485#: src/util/service.c:1862 8409#: src/util/service.c:1826
8486msgid "" 8410msgid ""
8487"Could not bind to any of the ports I was supposed to, refusing to run!\n" 8411"Could not bind to any of the ports I was supposed to, refusing to run!\n"
8488msgstr "" 8412msgstr ""
@@ -8818,6 +8742,22 @@ msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
8818msgstr "" 8742msgstr ""
8819 8743
8820#, fuzzy 8744#, fuzzy
8745#~ msgid "# XT sessions active"
8746#~ msgstr "# Session TCP active"
8747
8748#, fuzzy
8749#~ msgid "Failed to bind XU socket to %s: %s\n"
8750#~ msgstr "Résolution de « %s » échouée : %s\n"
8751
8752#, fuzzy
8753#~ msgid "Failed to open XU sockets\n"
8754#~ msgstr "Résolution de « %s » échouée : %s\n"
8755
8756#, fuzzy
8757#~ msgid "Failed to create XU network sockets\n"
8758#~ msgstr "Résolution de « %s » échouée : %s\n"
8759
8760#, fuzzy
8821#~ msgid "Dropping invalid fragment\n" 8761#~ msgid "Dropping invalid fragment\n"
8822#~ msgstr "Argument invalide « %s »\n" 8762#~ msgstr "Argument invalide « %s »\n"
8823 8763
diff --git a/po/it.po b/po/it.po
index 25c43ecd6..e53b24d99 100644
--- a/po/it.po
+++ b/po/it.po
@@ -7,7 +7,7 @@ msgid ""
7msgstr "" 7msgstr ""
8"Project-Id-Version: gnunet 0.10.1\n" 8"Project-Id-Version: gnunet 0.10.1\n"
9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" 9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
10"POT-Creation-Date: 2019-02-28 11:41+0100\n" 10"POT-Creation-Date: 2019-04-04 12:39+0200\n"
11"PO-Revision-Date: 2018-08-29 13:48+0200\n" 11"PO-Revision-Date: 2018-08-29 13:48+0200\n"
12"Last-Translator: Sebastiano Pistore <SebastianoPistore.info@protonmail.ch>\n" 12"Last-Translator: Sebastiano Pistore <SebastianoPistore.info@protonmail.ch>\n"
13"Language-Team: Italian <tp@lists.linux.it>\n" 13"Language-Team: Italian <tp@lists.linux.it>\n"
@@ -217,8 +217,7 @@ msgid "Control services and the Automated Restart Manager (ARM)"
217msgstr "" 217msgstr ""
218 218
219#: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120 219#: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120
220#: src/transport/plugin_transport_xt.c:1120 220#: src/transport/tcp_service_legacy.c:557
221#: src/transport/tcp_service_legacy.c:557 src/util/service.c:1167
222#, c-format 221#, c-format
223msgid "" 222msgid ""
224"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n" 223"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
@@ -228,35 +227,29 @@ msgstr ""
228#: src/transport/plugin_transport_tcp.c:1139 227#: src/transport/plugin_transport_tcp.c:1139
229#: src/transport/plugin_transport_tcp.c:1145 228#: src/transport/plugin_transport_tcp.c:1145
230#: src/transport/plugin_transport_tcp.c:3835 229#: src/transport/plugin_transport_tcp.c:3835
231#: src/transport/plugin_transport_xt.c:1139
232#: src/transport/plugin_transport_xt.c:1145
233#: src/transport/plugin_transport_xt.c:3833
234#: src/transport/tcp_service_legacy.c:576 230#: src/transport/tcp_service_legacy.c:576
235#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1192 231#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1156
236#: src/util/service.c:1198 232#: src/util/service.c:1162
237#, c-format 233#, c-format
238msgid "Require valid port number for service `%s' in configuration!\n" 234msgid "Require valid port number for service `%s' in configuration!\n"
239msgstr "" 235msgstr ""
240 236
241#: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176 237#: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176
242#: src/transport/plugin_transport_xt.c:1176 238#: src/transport/tcp_service_legacy.c:613 src/util/client.c:521
243#: src/transport/tcp_service_legacy.c:613 src/util/client.c:506 239#: src/util/service.c:1201
244#: src/util/service.c:1237
245#, c-format 240#, c-format
246msgid "UNIXPATH `%s' too long, maximum length is %llu\n" 241msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
247msgstr "" 242msgstr ""
248 243
249#: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180 244#: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180
250#: src/transport/plugin_transport_xt.c:1180 245#: src/transport/tcp_service_legacy.c:617 src/util/client.c:526
251#: src/transport/tcp_service_legacy.c:617 src/util/client.c:511 246#: src/util/service.c:1206
252#: src/util/service.c:1242
253#, c-format 247#, c-format
254msgid "Using `%s' instead\n" 248msgid "Using `%s' instead\n"
255msgstr "" 249msgstr ""
256 250
257#: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211 251#: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211
258#: src/transport/plugin_transport_xt.c:1211 252#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1242
259#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1278
260#, c-format 253#, c-format
261msgid "" 254msgid ""
262"Disabling UNIX domain socket support for service `%s', failed to create UNIX " 255"Disabling UNIX domain socket support for service `%s', failed to create UNIX "
@@ -264,8 +257,7 @@ msgid ""
264msgstr "" 257msgstr ""
265 258
266#: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228 259#: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228
267#: src/transport/plugin_transport_xt.c:1228 260#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1260
268#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1296
269#, c-format 261#, c-format
270msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n" 262msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
271msgstr "" 263msgstr ""
@@ -273,8 +265,7 @@ msgstr ""
273#: src/arm/gnunet-service-arm.c:556 265#: src/arm/gnunet-service-arm.c:556
274#: src/transport/plugin_transport_http_server.c:2688 266#: src/transport/plugin_transport_http_server.c:2688
275#: src/transport/plugin_transport_tcp.c:1259 267#: src/transport/plugin_transport_tcp.c:1259
276#: src/transport/plugin_transport_xt.c:1259 268#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1301
277#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1337
278#, c-format 269#, c-format
279msgid "Failed to resolve `%s': %s\n" 270msgid "Failed to resolve `%s': %s\n"
280msgstr "" 271msgstr ""
@@ -282,8 +273,7 @@ msgstr ""
282#: src/arm/gnunet-service-arm.c:575 273#: src/arm/gnunet-service-arm.c:575
283#: src/transport/plugin_transport_http_server.c:2706 274#: src/transport/plugin_transport_http_server.c:2706
284#: src/transport/plugin_transport_tcp.c:1278 275#: src/transport/plugin_transport_tcp.c:1278
285#: src/transport/plugin_transport_xt.c:1278 276#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1321
286#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1357
287#, c-format 277#, c-format
288msgid "Failed to find %saddress for `%s'.\n" 278msgid "Failed to find %saddress for `%s'.\n"
289msgstr "" 279msgstr ""
@@ -1553,6 +1543,10 @@ msgstr ""
1553msgid "Unable to parse ATTR record string `%s'\n" 1543msgid "Unable to parse ATTR record string `%s'\n"
1554msgstr "" 1544msgstr ""
1555 1545
1546#: src/credential/plugin_rest_credential.c:1128
1547msgid "GNS REST API initialized\n"
1548msgstr ""
1549
1556#: src/datacache/datacache.c:119 src/datacache/datacache.c:311 1550#: src/datacache/datacache.c:119 src/datacache/datacache.c:311
1557#: src/datastore/gnunet-service-datastore.c:757 1551#: src/datastore/gnunet-service-datastore.c:757
1558msgid "# bytes stored" 1552msgid "# bytes stored"
@@ -2038,7 +2032,7 @@ msgstr ""
2038msgid "Exiting as the number of peers is %u\n" 2032msgid "Exiting as the number of peers is %u\n"
2039msgstr "" 2033msgstr ""
2040 2034
2041#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2959 2035#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2981
2042msgid "number of peers to start" 2036msgid "number of peers to start"
2043msgstr "" 2037msgstr ""
2044 2038
@@ -3075,11 +3069,11 @@ msgstr ""
3075msgid "set the desired LEVEL of sender-anonymity" 3069msgid "set the desired LEVEL of sender-anonymity"
3076msgstr "" 3070msgstr ""
3077 3071
3078#: src/fs/gnunet-auto-share.c:772 src/fs/gnunet-publish.c:907 3072#: src/fs/gnunet-auto-share.c:772
3079msgid "disable adding the creation time to the metadata of the uploaded file" 3073msgid "disable adding the creation time to the metadata of the uploaded file"
3080msgstr "" 3074msgstr ""
3081 3075
3082#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:912 3076#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:907
3083msgid "do not use libextractor to add keywords or metadata" 3077msgid "do not use libextractor to add keywords or metadata"
3084msgstr "" 3078msgstr ""
3085 3079
@@ -3378,6 +3372,10 @@ msgstr ""
3378msgid "Option `%s' makes no sense without option `%s'.\n" 3372msgid "Option `%s' makes no sense without option `%s'.\n"
3379msgstr "" 3373msgstr ""
3380 3374
3375#: src/fs/gnunet-publish.c:911
3376msgid "enable adding the creation time to the metadata of the uploaded file"
3377msgstr ""
3378
3381#: src/fs/gnunet-publish.c:916 3379#: src/fs/gnunet-publish.c:916
3382msgid "" 3380msgid ""
3383"print list of extracted keywords that would be used, but do not perform " 3381"print list of extracted keywords that would be used, but do not perform "
@@ -3844,38 +3842,38 @@ msgstr ""
3844msgid "GNUnet HTTP server to create business cards" 3842msgid "GNUnet HTTP server to create business cards"
3845msgstr "" 3843msgstr ""
3846 3844
3847#: src/gns/gnunet-dns2gns.c:203 3845#: src/gns/gnunet-dns2gns.c:214
3848msgid "Failed to pack DNS response into UDP packet!\n" 3846msgid "Failed to pack DNS response into UDP packet!\n"
3849msgstr "" 3847msgstr ""
3850 3848
3851#: src/gns/gnunet-dns2gns.c:405 3849#: src/gns/gnunet-dns2gns.c:416
3852#, c-format 3850#, c-format
3853msgid "Cannot parse DNS request from %s\n" 3851msgid "Cannot parse DNS request from %s\n"
3854msgstr "" 3852msgstr ""
3855 3853
3856#: src/gns/gnunet-dns2gns.c:421 3854#: src/gns/gnunet-dns2gns.c:432
3857#, c-format 3855#, c-format
3858msgid "Received malformed DNS request from %s\n" 3856msgid "Received malformed DNS request from %s\n"
3859msgstr "" 3857msgstr ""
3860 3858
3861#: src/gns/gnunet-dns2gns.c:429 3859#: src/gns/gnunet-dns2gns.c:440
3862#, c-format 3860#, c-format
3863msgid "Received unsupported DNS request from %s\n" 3861msgid "Received unsupported DNS request from %s\n"
3864msgstr "" 3862msgstr ""
3865 3863
3866#: src/gns/gnunet-dns2gns.c:588 3864#: src/gns/gnunet-dns2gns.c:600
3867msgid "No DNS server specified!\n" 3865msgid "No DNS server specified!\n"
3868msgstr "" 3866msgstr ""
3869 3867
3870#: src/gns/gnunet-dns2gns.c:688 3868#: src/gns/gnunet-dns2gns.c:748
3871msgid "IP of recursive DNS resolver to use (required)" 3869msgid "IP of recursive DNS resolver to use (required)"
3872msgstr "" 3870msgstr ""
3873 3871
3874#: src/gns/gnunet-dns2gns.c:693 3872#: src/gns/gnunet-dns2gns.c:753
3875msgid "UDP port to listen on for inbound DNS requests; default: 2853" 3873msgid "UDP port to listen on for inbound DNS requests; default: 2853"
3876msgstr "" 3874msgstr ""
3877 3875
3878#: src/gns/gnunet-dns2gns.c:710 3876#: src/gns/gnunet-dns2gns.c:770
3879msgid "GNUnet DNS-to-GNS proxy (a DNS server)" 3877msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
3880msgstr "" 3878msgstr ""
3881 3879
@@ -3946,103 +3944,103 @@ msgstr ""
3946msgid "%s failed at %s:%d: `%s'\n" 3944msgid "%s failed at %s:%d: `%s'\n"
3947msgstr "" 3945msgstr ""
3948 3946
3949#: src/gns/gnunet-gns-proxy.c:980 3947#: src/gns/gnunet-gns-proxy.c:989
3950#, c-format 3948#, c-format
3951msgid "Unsupported CURL TLS backend %d\n" 3949msgid "Unsupported CURL TLS backend %d\n"
3952msgstr "" 3950msgstr ""
3953 3951
3954#: src/gns/gnunet-gns-proxy.c:1005 3952#: src/gns/gnunet-gns-proxy.c:1014
3955#, c-format 3953#, c-format
3956msgid "Failed to fetch CN from cert: %s\n" 3954msgid "Failed to fetch CN from cert: %s\n"
3957msgstr "" 3955msgstr ""
3958 3956
3959#: src/gns/gnunet-gns-proxy.c:1026 3957#: src/gns/gnunet-gns-proxy.c:1035
3960#, c-format 3958#, c-format
3961msgid "Failed to initialize DANE: %s\n" 3959msgid "Failed to initialize DANE: %s\n"
3962msgstr "" 3960msgstr ""
3963 3961
3964#: src/gns/gnunet-gns-proxy.c:1041 3962#: src/gns/gnunet-gns-proxy.c:1050
3965#, c-format 3963#, c-format
3966msgid "Failed to parse DANE record: %s\n" 3964msgid "Failed to parse DANE record: %s\n"
3967msgstr "" 3965msgstr ""
3968 3966
3969#: src/gns/gnunet-gns-proxy.c:1056 3967#: src/gns/gnunet-gns-proxy.c:1065
3970#, c-format 3968#, c-format
3971msgid "Failed to verify TLS connection using DANE: %s\n" 3969msgid "Failed to verify TLS connection using DANE: %s\n"
3972msgstr "" 3970msgstr ""
3973 3971
3974#: src/gns/gnunet-gns-proxy.c:1066 3972#: src/gns/gnunet-gns-proxy.c:1075
3975#, c-format 3973#, c-format
3976msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n" 3974msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
3977msgstr "" 3975msgstr ""
3978 3976
3979#: src/gns/gnunet-gns-proxy.c:1090 3977#: src/gns/gnunet-gns-proxy.c:1099
3980#, c-format 3978#, c-format
3981msgid "TLS certificate subject name (%s) does not match `%s': %d\n" 3979msgid "TLS certificate subject name (%s) does not match `%s': %d\n"
3982msgstr "" 3980msgstr ""
3983 3981
3984#: src/gns/gnunet-gns-proxy.c:1221 3982#: src/gns/gnunet-gns-proxy.c:1230
3985#, c-format 3983#, c-format
3986msgid "Cookie domain `%s' supplied by server is invalid\n" 3984msgid "Cookie domain `%s' supplied by server is invalid\n"
3987msgstr "" 3985msgstr ""
3988 3986
3989#: src/gns/gnunet-gns-proxy.c:2122 3987#: src/gns/gnunet-gns-proxy.c:2131
3990#, c-format 3988#, c-format
3991msgid "Unsupported HTTP method `%s'\n" 3989msgid "Unsupported HTTP method `%s'\n"
3992msgstr "" 3990msgstr ""
3993 3991
3994#: src/gns/gnunet-gns-proxy.c:2643 3992#: src/gns/gnunet-gns-proxy.c:2652
3995#, c-format 3993#, c-format
3996msgid "Unable to import private key from file `%s'\n" 3994msgid "Unable to import private key from file `%s'\n"
3997msgstr "" 3995msgstr ""
3998 3996
3999#: src/gns/gnunet-gns-proxy.c:2675 3997#: src/gns/gnunet-gns-proxy.c:2684
4000#, c-format 3998#, c-format
4001msgid "Unable to import certificate from `%s'\n" 3999msgid "Unable to import certificate from `%s'\n"
4002msgstr "" 4000msgstr ""
4003 4001
4004#: src/gns/gnunet-gns-proxy.c:2876 4002#: src/gns/gnunet-gns-proxy.c:2885
4005#, c-format 4003#, c-format
4006msgid "Failed to start HTTPS server for `%s'\n" 4004msgid "Failed to start HTTPS server for `%s'\n"
4007msgstr "" 4005msgstr ""
4008 4006
4009#: src/gns/gnunet-gns-proxy.c:2898 src/rest/gnunet-rest-server.c:658 4007#: src/gns/gnunet-gns-proxy.c:2907 src/rest/gnunet-rest-server.c:668
4010msgid "Failed to pass client to MHD\n" 4008msgid "Failed to pass client to MHD\n"
4011msgstr "" 4009msgstr ""
4012 4010
4013#: src/gns/gnunet-gns-proxy.c:3234 4011#: src/gns/gnunet-gns-proxy.c:3243
4014#, c-format 4012#, c-format
4015msgid "Unsupported socks version %d\n" 4013msgid "Unsupported socks version %d\n"
4016msgstr "" 4014msgstr ""
4017 4015
4018#: src/gns/gnunet-gns-proxy.c:3263 4016#: src/gns/gnunet-gns-proxy.c:3272
4019#, c-format 4017#, c-format
4020msgid "Unsupported socks command %d\n" 4018msgid "Unsupported socks command %d\n"
4021msgstr "" 4019msgstr ""
4022 4020
4023#: src/gns/gnunet-gns-proxy.c:3346 4021#: src/gns/gnunet-gns-proxy.c:3355
4024#, c-format 4022#, c-format
4025msgid "Unsupported socks address type %d\n" 4023msgid "Unsupported socks address type %d\n"
4026msgstr "" 4024msgstr ""
4027 4025
4028#: src/gns/gnunet-gns-proxy.c:3636 4026#: src/gns/gnunet-gns-proxy.c:3693
4029#, c-format 4027#, c-format
4030msgid "Failed to load X.509 key and certificate from `%s'\n" 4028msgid "Failed to load X.509 key and certificate from `%s'\n"
4031msgstr "" 4029msgstr ""
4032 4030
4033#: src/gns/gnunet-gns-proxy.c:3764 4031#: src/gns/gnunet-gns-proxy.c:3821
4034msgid "listen on specified port (default: 7777)" 4032msgid "listen on specified port (default: 7777)"
4035msgstr "" 4033msgstr ""
4036 4034
4037#: src/gns/gnunet-gns-proxy.c:3769 4035#: src/gns/gnunet-gns-proxy.c:3826
4038msgid "pem file to use as CA" 4036msgid "pem file to use as CA"
4039msgstr "" 4037msgstr ""
4040 4038
4041#: src/gns/gnunet-gns-proxy.c:3773 4039#: src/gns/gnunet-gns-proxy.c:3830
4042msgid "disable use of IPv6" 4040msgid "disable use of IPv6"
4043msgstr "" 4041msgstr ""
4044 4042
4045#: src/gns/gnunet-gns-proxy.c:3799 4043#: src/gns/gnunet-gns-proxy.c:3856
4046msgid "GNUnet GNS proxy" 4044msgid "GNUnet GNS proxy"
4047msgstr "" 4045msgstr ""
4048 4046
@@ -4146,6 +4144,10 @@ msgstr ""
4146msgid "Unable to parse BOX record string `%s'\n" 4144msgid "Unable to parse BOX record string `%s'\n"
4147msgstr "" 4145msgstr ""
4148 4146
4147#: src/gns/plugin_rest_gns.c:452
4148msgid "Gns REST API initialized\n"
4149msgstr ""
4150
4149#: src/gnsrecord/plugin_gnsrecord_dns.c:359 4151#: src/gnsrecord/plugin_gnsrecord_dns.c:359
4150#, c-format 4152#, c-format
4151msgid "Unable to parse IPv4 address `%s'\n" 4153msgid "Unable to parse IPv4 address `%s'\n"
@@ -4652,6 +4654,10 @@ msgstr ""
4652msgid "Failed to create directory `%s' for storing egos\n" 4654msgid "Failed to create directory `%s' for storing egos\n"
4653msgstr "" 4655msgstr ""
4654 4656
4657#: src/identity/plugin_rest_identity.c:1297
4658msgid "Identity REST API initialized\n"
4659msgstr ""
4660
4655#: src/json/json.c:123 4661#: src/json/json.c:123
4656#, c-format 4662#, c-format
4657msgid "Failed to parse JSON in option `%s': %s (%s)\n" 4663msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -5040,6 +5046,10 @@ msgstr ""
5040msgid "heap file database running\n" 5046msgid "heap file database running\n"
5041msgstr "" 5047msgstr ""
5042 5048
5049#: src/namestore/plugin_rest_namestore.c:1079
5050msgid "Namestore REST API initialized\n"
5051msgstr ""
5052
5043#: src/nat-auto/gnunet-nat-auto.c:193 5053#: src/nat-auto/gnunet-nat-auto.c:193
5044msgid "Suggested configuration changes:\n" 5054msgid "Suggested configuration changes:\n"
5045msgstr "" 5055msgstr ""
@@ -5408,7 +5418,7 @@ msgid "\tExpires: %s \t %s\n"
5408msgstr "" 5418msgstr ""
5409 5419
5410#: src/peerinfo-tool/gnunet-peerinfo.c:299 5420#: src/peerinfo-tool/gnunet-peerinfo.c:299
5411#: src/rest-plugins/plugin_rest_peerinfo.c:501 5421#: src/peerinfo-tool/plugin_rest_peerinfo.c:501
5412#, c-format 5422#, c-format
5413msgid "Failure: Cannot convert address to string for peer `%s'\n" 5423msgid "Failure: Cannot convert address to string for peer `%s'\n"
5414msgstr "" 5424msgstr ""
@@ -5487,6 +5497,10 @@ msgstr ""
5487msgid "Failed to load transport plugin for `%s'\n" 5497msgid "Failed to load transport plugin for `%s'\n"
5488msgstr "" 5498msgstr ""
5489 5499
5500#: src/peerinfo-tool/plugin_rest_peerinfo.c:796
5501msgid "Peerinfo REST API initialized\n"
5502msgstr ""
5503
5490#: src/peerstore/gnunet-peerstore.c:91 5504#: src/peerstore/gnunet-peerstore.c:91
5491msgid "peerstore" 5505msgid "peerstore"
5492msgstr "" 5506msgstr ""
@@ -5642,6 +5656,11 @@ msgstr ""
5642msgid "Expiration interval of the attribute" 5656msgid "Expiration interval of the attribute"
5643msgstr "" 5657msgstr ""
5644 5658
5659#: src/reclaim/plugin_rest_openid_connect.c:2279
5660#: src/reclaim/plugin_rest_reclaim.c:1079
5661msgid "Identity Provider REST API initialized\n"
5662msgstr ""
5663
5645#: src/reclaim/reclaim_api.c:436 5664#: src/reclaim/reclaim_api.c:436
5646msgid "failed to store record\n" 5665msgid "failed to store record\n"
5647msgstr "" 5666msgstr ""
@@ -5730,43 +5749,18 @@ msgstr ""
5730msgid "Search string `%s' is too long!\n" 5749msgid "Search string `%s' is too long!\n"
5731msgstr "" 5750msgstr ""
5732 5751
5733#: src/rest/gnunet-rest-server.c:927 5752#: src/rest/gnunet-rest-server.c:986
5734msgid "listen on specified port (default: 7776)" 5753msgid "listen on specified port (default: 7776)"
5735msgstr "" 5754msgstr ""
5736 5755
5737#: src/rest/gnunet-rest-server.c:944 5756#: src/rest/gnunet-rest-server.c:1003
5738msgid "GNUnet REST server" 5757msgid "GNUnet REST server"
5739msgstr "" 5758msgstr ""
5740 5759
5741#: src/rest-plugins/plugin_rest_copying.c:209 5760#: src/rest/plugin_rest_copying.c:209
5742msgid "COPYING REST API initialized\n" 5761msgid "COPYING REST API initialized\n"
5743msgstr "" 5762msgstr ""
5744 5763
5745#: src/rest-plugins/plugin_rest_credential.c:1128
5746msgid "GNS REST API initialized\n"
5747msgstr ""
5748
5749#: src/rest-plugins/plugin_rest_gns.c:452
5750msgid "Gns REST API initialized\n"
5751msgstr ""
5752
5753#: src/rest-plugins/plugin_rest_identity.c:1297
5754msgid "Identity REST API initialized\n"
5755msgstr ""
5756
5757#: src/rest-plugins/plugin_rest_namestore.c:1079
5758msgid "Namestore REST API initialized\n"
5759msgstr ""
5760
5761#: src/rest-plugins/plugin_rest_openid_connect.c:2279
5762#: src/rest-plugins/plugin_rest_reclaim.c:1079
5763msgid "Identity Provider REST API initialized\n"
5764msgstr ""
5765
5766#: src/rest-plugins/plugin_rest_peerinfo.c:796
5767msgid "Peerinfo REST API initialized\n"
5768msgstr ""
5769
5770#: src/revocation/gnunet-revocation.c:129 5764#: src/revocation/gnunet-revocation.c:129
5771#, c-format 5765#, c-format
5772msgid "Key `%s' is valid\n" 5766msgid "Key `%s' is valid\n"
@@ -5908,19 +5902,19 @@ msgstr ""
5908msgid "Get peers from biased stream" 5902msgid "Get peers from biased stream"
5909msgstr "" 5903msgstr ""
5910 5904
5911#: src/rps/gnunet-rps-profiler.c:2964 5905#: src/rps/gnunet-rps-profiler.c:2986
5912msgid "duration of the profiling" 5906msgid "duration of the profiling"
5913msgstr "" 5907msgstr ""
5914 5908
5915#: src/rps/gnunet-rps-profiler.c:2969 5909#: src/rps/gnunet-rps-profiler.c:2991
5916msgid "timeout for the profiling" 5910msgid "timeout for the profiling"
5917msgstr "" 5911msgstr ""
5918 5912
5919#: src/rps/gnunet-rps-profiler.c:2974 5913#: src/rps/gnunet-rps-profiler.c:2996
5920msgid "number of PeerIDs to request" 5914msgid "number of PeerIDs to request"
5921msgstr "" 5915msgstr ""
5922 5916
5923#: src/rps/gnunet-rps-profiler.c:2990 5917#: src/rps/gnunet-rps-profiler.c:3012
5924msgid "Measure quality and performance of the RPS service." 5918msgid "Measure quality and performance of the RPS service."
5925msgstr "" 5919msgstr ""
5926 5920
@@ -6625,18 +6619,18 @@ msgstr ""
6625msgid "GNUnet topology control" 6619msgid "GNUnet topology control"
6626msgstr "" 6620msgstr ""
6627 6621
6628#: src/transport/gnunet-communicator-tcp.c:2329 6622#: src/transport/gnunet-communicator-tcp.c:2328
6629#: src/transport/gnunet-communicator-udp.c:2883 6623#: src/transport/gnunet-communicator-udp.c:2882
6630#: src/transport/gnunet-service-tng.c:4747 6624#: src/transport/gnunet-service-tng.c:4888
6631#: src/transport/gnunet-service-transport.c:2795 6625#: src/transport/gnunet-service-transport.c:2795
6632msgid "Transport service is lacking key configuration settings. Exiting.\n" 6626msgid "Transport service is lacking key configuration settings. Exiting.\n"
6633msgstr "" 6627msgstr ""
6634 6628
6635#: src/transport/gnunet-communicator-tcp.c:2393 6629#: src/transport/gnunet-communicator-tcp.c:2392
6636msgid "GNUnet TCP communicator" 6630msgid "GNUnet TCP communicator"
6637msgstr "" 6631msgstr ""
6638 6632
6639#: src/transport/gnunet-communicator-udp.c:2954 6633#: src/transport/gnunet-communicator-udp.c:2953
6640msgid "GNUnet UDP communicator" 6634msgid "GNUnet UDP communicator"
6641msgstr "" 6635msgstr ""
6642 6636
@@ -7186,8 +7180,6 @@ msgstr ""
7186#: src/transport/plugin_transport_http_server.c:3530 7180#: src/transport/plugin_transport_http_server.c:3530
7187#: src/transport/plugin_transport_tcp.c:3901 7181#: src/transport/plugin_transport_tcp.c:3901
7188#: src/transport/plugin_transport_tcp.c:3908 7182#: src/transport/plugin_transport_tcp.c:3908
7189#: src/transport/plugin_transport_xt.c:3899
7190#: src/transport/plugin_transport_xt.c:3906
7191msgid "TCP_STEALTH not supported on this platform.\n" 7183msgid "TCP_STEALTH not supported on this platform.\n"
7192msgstr "" 7184msgstr ""
7193 7185
@@ -7257,7 +7249,6 @@ msgstr ""
7257 7249
7258#: src/transport/plugin_transport_http_server.c:2905 7250#: src/transport/plugin_transport_http_server.c:2905
7259#: src/transport/plugin_transport_udp.c:3627 7251#: src/transport/plugin_transport_udp.c:3627
7260#: src/transport/plugin_transport_xu.c:2049
7261msgid "Disabling IPv6 since it is not supported on this system!\n" 7252msgid "Disabling IPv6 since it is not supported on this system!\n"
7262msgstr "" 7253msgstr ""
7263 7254
@@ -7357,8 +7348,6 @@ msgstr ""
7357 7348
7358#: src/transport/plugin_transport_tcp.c:1557 7349#: src/transport/plugin_transport_tcp.c:1557
7359#: src/transport/plugin_transport_tcp.c:2883 7350#: src/transport/plugin_transport_tcp.c:2883
7360#: src/transport/plugin_transport_xt.c:1553
7361#: src/transport/plugin_transport_xt.c:2879
7362#, c-format 7351#, c-format
7363msgid "Unexpected address length: %u bytes\n" 7352msgid "Unexpected address length: %u bytes\n"
7364msgstr "" 7353msgstr ""
@@ -7367,9 +7356,6 @@ msgstr ""
7367#: src/transport/plugin_transport_tcp.c:1964 7356#: src/transport/plugin_transport_tcp.c:1964
7368#: src/transport/plugin_transport_tcp.c:3147 7357#: src/transport/plugin_transport_tcp.c:3147
7369#: src/transport/plugin_transport_tcp.c:4024 7358#: src/transport/plugin_transport_tcp.c:4024
7370#: src/transport/plugin_transport_xt.c:1736
7371#: src/transport/plugin_transport_xt.c:1960
7372#: src/transport/plugin_transport_xt.c:3143
7373msgid "# TCP sessions active" 7359msgid "# TCP sessions active"
7374msgstr "" 7360msgstr ""
7375 7361
@@ -7379,85 +7365,64 @@ msgstr ""
7379#: src/transport/plugin_transport_tcp.c:2143 7365#: src/transport/plugin_transport_tcp.c:2143
7380#: src/transport/plugin_transport_tcp.c:2243 7366#: src/transport/plugin_transport_tcp.c:2243
7381#: src/transport/plugin_transport_tcp.c:2268 7367#: src/transport/plugin_transport_tcp.c:2268
7382#: src/transport/plugin_transport_xt.c:1778
7383#: src/transport/plugin_transport_xt.c:1942
7384#: src/transport/plugin_transport_xt.c:2066
7385#: src/transport/plugin_transport_xt.c:2139
7386#: src/transport/plugin_transport_xt.c:2239
7387#: src/transport/plugin_transport_xt.c:2264
7388msgid "# bytes currently in TCP buffers" 7368msgid "# bytes currently in TCP buffers"
7389msgstr "" 7369msgstr ""
7390 7370
7391#: src/transport/plugin_transport_tcp.c:1785 7371#: src/transport/plugin_transport_tcp.c:1785
7392#: src/transport/plugin_transport_xt.c:1781
7393msgid "# bytes discarded by TCP (disconnect)" 7372msgid "# bytes discarded by TCP (disconnect)"
7394msgstr "" 7373msgstr ""
7395 7374
7396#: src/transport/plugin_transport_tcp.c:2073 7375#: src/transport/plugin_transport_tcp.c:2073
7397#: src/transport/plugin_transport_xt.c:2069
7398msgid "# bytes discarded by TCP (timeout)" 7376msgid "# bytes discarded by TCP (timeout)"
7399msgstr "" 7377msgstr ""
7400 7378
7401#: src/transport/plugin_transport_tcp.c:2147 7379#: src/transport/plugin_transport_tcp.c:2147
7402#: src/transport/plugin_transport_xt.c:2143
7403msgid "# bytes transmitted via TCP" 7380msgid "# bytes transmitted via TCP"
7404msgstr "" 7381msgstr ""
7405 7382
7406#: src/transport/plugin_transport_tcp.c:2545 7383#: src/transport/plugin_transport_tcp.c:2545
7407#: src/transport/plugin_transport_xt.c:2541
7408msgid "# requests to create session with invalid address" 7384msgid "# requests to create session with invalid address"
7409msgstr "" 7385msgstr ""
7410 7386
7411#: src/transport/plugin_transport_tcp.c:2721 7387#: src/transport/plugin_transport_tcp.c:2721
7412#: src/transport/plugin_transport_xt.c:2717
7413msgid "# transport-service disconnect requests for TCP" 7388msgid "# transport-service disconnect requests for TCP"
7414msgstr "" 7389msgstr ""
7415 7390
7416#: src/transport/plugin_transport_tcp.c:3213 7391#: src/transport/plugin_transport_tcp.c:3213
7417#: src/transport/plugin_transport_xt.c:3209
7418msgid "# TCP WELCOME messages received" 7392msgid "# TCP WELCOME messages received"
7419msgstr "" 7393msgstr ""
7420 7394
7421#: src/transport/plugin_transport_tcp.c:3419 7395#: src/transport/plugin_transport_tcp.c:3419
7422#: src/transport/plugin_transport_xt.c:3415
7423msgid "# bytes received via TCP" 7396msgid "# bytes received via TCP"
7424msgstr "" 7397msgstr ""
7425 7398
7426#: src/transport/plugin_transport_tcp.c:3470 7399#: src/transport/plugin_transport_tcp.c:3470
7427#: src/transport/plugin_transport_tcp.c:3528 7400#: src/transport/plugin_transport_tcp.c:3528
7428#: src/transport/plugin_transport_xt.c:3466
7429#: src/transport/plugin_transport_xt.c:3524
7430#, fuzzy 7401#, fuzzy
7431msgid "# TCP server connections active" 7402msgid "# TCP server connections active"
7432msgstr "# connessioni attive" 7403msgstr "# connessioni attive"
7433 7404
7434#: src/transport/plugin_transport_tcp.c:3474 7405#: src/transport/plugin_transport_tcp.c:3474
7435#: src/transport/plugin_transport_xt.c:3470
7436msgid "# TCP server connect events" 7406msgid "# TCP server connect events"
7437msgstr "" 7407msgstr ""
7438 7408
7439#: src/transport/plugin_transport_tcp.c:3480 7409#: src/transport/plugin_transport_tcp.c:3480
7440#: src/transport/plugin_transport_xt.c:3476
7441msgid "TCP connection limit reached, suspending server\n" 7410msgid "TCP connection limit reached, suspending server\n"
7442msgstr "" 7411msgstr ""
7443 7412
7444#: src/transport/plugin_transport_tcp.c:3482 7413#: src/transport/plugin_transport_tcp.c:3482
7445#: src/transport/plugin_transport_xt.c:3478
7446msgid "# TCP service suspended" 7414msgid "# TCP service suspended"
7447msgstr "" 7415msgstr ""
7448 7416
7449#: src/transport/plugin_transport_tcp.c:3522 7417#: src/transport/plugin_transport_tcp.c:3522
7450#: src/transport/plugin_transport_xt.c:3518
7451msgid "# TCP service resumed" 7418msgid "# TCP service resumed"
7452msgstr "" 7419msgstr ""
7453 7420
7454#: src/transport/plugin_transport_tcp.c:3532 7421#: src/transport/plugin_transport_tcp.c:3532
7455#: src/transport/plugin_transport_xt.c:3528
7456msgid "# network-level TCP disconnect events" 7422msgid "# network-level TCP disconnect events"
7457msgstr "" 7423msgstr ""
7458 7424
7459#: src/transport/plugin_transport_tcp.c:3851 7425#: src/transport/plugin_transport_tcp.c:3851
7460#: src/transport/plugin_transport_xt.c:3849
7461msgid "Failed to start service.\n" 7426msgid "Failed to start service.\n"
7462msgstr "" 7427msgstr ""
7463 7428
@@ -7509,7 +7474,6 @@ msgid "Failed to bind UDP socket to %s: %s\n"
7509msgstr "" 7474msgstr ""
7510 7475
7511#: src/transport/plugin_transport_udp.c:3721 7476#: src/transport/plugin_transport_udp.c:3721
7512#: src/transport/plugin_transport_xu.c:2143
7513msgid "Disabling IPv4 since it is not supported on this system!\n" 7477msgid "Disabling IPv4 since it is not supported on this system!\n"
7514msgstr "" 7478msgstr ""
7515 7479
@@ -7519,19 +7483,15 @@ msgstr ""
7519 7483
7520#: src/transport/plugin_transport_udp.c:3883 7484#: src/transport/plugin_transport_udp.c:3883
7521#: src/transport/plugin_transport_udp.c:3897 7485#: src/transport/plugin_transport_udp.c:3897
7522#: src/transport/plugin_transport_xu.c:2301
7523#: src/transport/plugin_transport_xu.c:2315
7524msgid "must be in [0,65535]" 7486msgid "must be in [0,65535]"
7525msgstr "" 7487msgstr ""
7526 7488
7527#: src/transport/plugin_transport_udp.c:3929 7489#: src/transport/plugin_transport_udp.c:3929
7528#: src/transport/plugin_transport_xu.c:2347
7529#, fuzzy 7490#, fuzzy
7530msgid "must be valid IPv4 address" 7491msgid "must be valid IPv4 address"
7531msgstr "`%s' non è un indirizzo IP valido.\n" 7492msgstr "`%s' non è un indirizzo IP valido.\n"
7532 7493
7533#: src/transport/plugin_transport_udp.c:3956 7494#: src/transport/plugin_transport_udp.c:3956
7534#: src/transport/plugin_transport_xu.c:2374
7535#, fuzzy 7495#, fuzzy
7536msgid "must be valid IPv6 address" 7496msgid "must be valid IPv6 address"
7537msgstr "`%s' non è un indirizzo IP valido.\n" 7497msgstr "`%s' non è un indirizzo IP valido.\n"
@@ -7609,51 +7569,6 @@ msgstr ""
7609msgid "# sessions allocated" 7569msgid "# sessions allocated"
7610msgstr "" 7570msgstr ""
7611 7571
7612#: src/transport/plugin_transport_xt.c:4010
7613#, c-format
7614msgid "XT transport listening on port %llu\n"
7615msgstr ""
7616
7617#: src/transport/plugin_transport_xt.c:4014
7618msgid "XT transport not listening on any port (client only)\n"
7619msgstr ""
7620
7621#: src/transport/plugin_transport_xt.c:4018
7622#, c-format
7623msgid "XT transport advertises itself as being on port %llu\n"
7624msgstr ""
7625
7626#: src/transport/plugin_transport_xt.c:4022
7627msgid "# XT sessions active"
7628msgstr ""
7629
7630#: src/transport/plugin_transport_xu.c:1237
7631#, c-format
7632msgid ""
7633"XU could not transmit message to `%s': Network seems down, please check your "
7634"network configuration\n"
7635msgstr ""
7636
7637#: src/transport/plugin_transport_xu.c:1251
7638msgid ""
7639"XU could not transmit IPv6 message! Please check your network configuration "
7640"and disable IPv6 if your connection does not have a global IPv6 address\n"
7641msgstr ""
7642
7643#: src/transport/plugin_transport_xu.c:2125
7644#: src/transport/plugin_transport_xu.c:2224
7645#, c-format
7646msgid "Failed to bind XU socket to %s: %s\n"
7647msgstr ""
7648
7649#: src/transport/plugin_transport_xu.c:2234
7650msgid "Failed to open XU sockets\n"
7651msgstr ""
7652
7653#: src/transport/plugin_transport_xu.c:2398
7654msgid "Failed to create XU network sockets\n"
7655msgstr ""
7656
7657#: src/transport/tcp_connection_legacy.c:452 7572#: src/transport/tcp_connection_legacy.c:452
7658#, c-format 7573#, c-format
7659msgid "Access denied to `%s'\n" 7574msgid "Access denied to `%s'\n"
@@ -7664,17 +7579,17 @@ msgstr ""
7664msgid "Accepting connection from `%s': %p\n" 7579msgid "Accepting connection from `%s': %p\n"
7665msgstr "" 7580msgstr ""
7666 7581
7667#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1666 7582#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1630
7668#, c-format 7583#, c-format
7669msgid "`%s' failed for port %d (%s).\n" 7584msgid "`%s' failed for port %d (%s).\n"
7670msgstr "" 7585msgstr ""
7671 7586
7672#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1676 7587#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1640
7673#, c-format 7588#, c-format
7674msgid "`%s' failed for port %d (%s): address already in use\n" 7589msgid "`%s' failed for port %d (%s): address already in use\n"
7675msgstr "" 7590msgstr ""
7676 7591
7677#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1682 7592#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1646
7678#, c-format 7593#, c-format
7679msgid "`%s' failed for `%s': address already in use\n" 7594msgid "`%s' failed for `%s': address already in use\n"
7680msgstr "" 7595msgstr ""
@@ -7706,17 +7621,17 @@ msgstr ""
7706msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n" 7621msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
7707msgstr "" 7622msgstr ""
7708 7623
7709#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1597 7624#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1561
7710msgid "Could not access a pre-bound socket, will try to bind myself\n" 7625msgid "Could not access a pre-bound socket, will try to bind myself\n"
7711msgstr "" 7626msgstr ""
7712 7627
7713#: src/transport/tcp_service_legacy.c:953 7628#: src/transport/tcp_service_legacy.c:953
7714#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1750 7629#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1714
7715#, c-format 7630#, c-format
7716msgid "Specified value for `%s' of service `%s' is invalid\n" 7631msgid "Specified value for `%s' of service `%s' is invalid\n"
7717msgstr "" 7632msgstr ""
7718 7633
7719#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1783 7634#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1747
7720#, c-format 7635#, c-format
7721msgid "Could not access pre-bound socket %u, will try to bind myself\n" 7636msgid "Could not access pre-bound socket %u, will try to bind myself\n"
7722msgstr "" 7637msgstr ""
@@ -7731,44 +7646,44 @@ msgstr ""
7731msgid "Service `%s' runs at %s\n" 7646msgid "Service `%s' runs at %s\n"
7732msgstr "" 7647msgstr ""
7733 7648
7734#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2057 7649#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2021
7735msgid "Service process failed to initialize\n" 7650msgid "Service process failed to initialize\n"
7736msgstr "" 7651msgstr ""
7737 7652
7738#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2061 7653#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2025
7739msgid "Service process could not initialize server function\n" 7654msgid "Service process could not initialize server function\n"
7740msgstr "" 7655msgstr ""
7741 7656
7742#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2065 7657#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2029
7743msgid "Service process failed to report status\n" 7658msgid "Service process failed to report status\n"
7744msgstr "" 7659msgstr ""
7745 7660
7746#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535 7661#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535
7747#: src/util/service.c:1935 7662#: src/util/service.c:1899
7748#, c-format 7663#, c-format
7749msgid "Cannot obtain information about user `%s': %s\n" 7664msgid "Cannot obtain information about user `%s': %s\n"
7750msgstr "" 7665msgstr ""
7751 7666
7752#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1937 7667#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1901
7753msgid "No such user" 7668msgid "No such user"
7754msgstr "" 7669msgstr ""
7755 7670
7756#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1956 7671#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1920
7757#, c-format 7672#, c-format
7758msgid "Cannot change user/group to `%s': %s\n" 7673msgid "Cannot change user/group to `%s': %s\n"
7759msgstr "" 7674msgstr ""
7760 7675
7761#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2318 7676#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2282
7762msgid "do daemonize (detach from terminal)" 7677msgid "do daemonize (detach from terminal)"
7763msgstr "" 7678msgstr ""
7764 7679
7765#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2382 7680#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2346
7766#: src/util/service.c:2397 7681#: src/util/service.c:2361
7767#, c-format 7682#, c-format
7768msgid "Malformed configuration file `%s', exit ...\n" 7683msgid "Malformed configuration file `%s', exit ...\n"
7769msgstr "" 7684msgstr ""
7770 7685
7771#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2409 7686#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2373
7772msgid "Malformed configuration, exit ...\n" 7687msgid "Malformed configuration, exit ...\n"
7773msgstr "" 7688msgstr ""
7774 7689
@@ -7810,11 +7725,11 @@ msgstr ""
7810msgid "Metadata `%s' failed to deserialize" 7725msgid "Metadata `%s' failed to deserialize"
7811msgstr "" 7726msgstr ""
7812 7727
7813#: src/util/client.c:734 7728#: src/util/client.c:749
7814msgid "not a valid filename" 7729msgid "not a valid filename"
7815msgstr "" 7730msgstr ""
7816 7731
7817#: src/util/client.c:925 7732#: src/util/client.c:941
7818#, c-format 7733#, c-format
7819msgid "Need a non-empty hostname for service `%s'.\n" 7734msgid "Need a non-empty hostname for service `%s'.\n"
7820msgstr "" 7735msgstr ""
@@ -8098,7 +8013,7 @@ msgstr ""
8098msgid "print this help" 8013msgid "print this help"
8099msgstr "" 8014msgstr ""
8100 8015
8101#: src/util/getopt_helpers.c:282 8016#: src/util/getopt_helpers.c:282 src/util/gnunet-qr.c:300
8102msgid "be verbose" 8017msgid "be verbose"
8103msgstr "" 8018msgstr ""
8104 8019
@@ -8145,51 +8060,51 @@ msgstr ""
8145msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n" 8060msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n"
8146msgstr "" 8061msgstr ""
8147 8062
8148#: src/util/gnunet-config.c:160 8063#: src/util/gnunet-config.c:161
8149#, c-format 8064#, c-format
8150msgid "failed to load configuration defaults" 8065msgid "failed to load configuration defaults"
8151msgstr "" 8066msgstr ""
8152 8067
8153#: src/util/gnunet-config.c:173 8068#: src/util/gnunet-config.c:174
8154#, c-format 8069#, c-format
8155msgid "%s or %s argument is required\n" 8070msgid "%s or %s argument is required\n"
8156msgstr "" 8071msgstr ""
8157 8072
8158#: src/util/gnunet-config.c:181 8073#: src/util/gnunet-config.c:182
8159#, c-format 8074#, c-format
8160msgid "The following sections are available:\n" 8075msgid "The following sections are available:\n"
8161msgstr "" 8076msgstr ""
8162 8077
8163#: src/util/gnunet-config.c:232 8078#: src/util/gnunet-config.c:234
8164#, c-format 8079#, c-format
8165msgid "--option argument required to set value\n" 8080msgid "--option argument required to set value\n"
8166msgstr "" 8081msgstr ""
8167 8082
8168#: src/util/gnunet-config.c:286 8083#: src/util/gnunet-config.c:288
8169msgid "obtain option of value as a filename (with $-expansion)" 8084msgid "interpret option value as a filename (with $-expansion)"
8170msgstr "" 8085msgstr ""
8171 8086
8172#: src/util/gnunet-config.c:291 8087#: src/util/gnunet-config.c:293
8173msgid "name of the section to access" 8088msgid "name of the section to access"
8174msgstr "" 8089msgstr ""
8175 8090
8176#: src/util/gnunet-config.c:296 8091#: src/util/gnunet-config.c:298
8177msgid "name of the option to access" 8092msgid "name of the option to access"
8178msgstr "" 8093msgstr ""
8179 8094
8180#: src/util/gnunet-config.c:301 8095#: src/util/gnunet-config.c:303
8181msgid "value to set" 8096msgid "value to set"
8182msgstr "" 8097msgstr ""
8183 8098
8184#: src/util/gnunet-config.c:305 8099#: src/util/gnunet-config.c:307
8185msgid "print available configuration sections" 8100msgid "print available configuration sections"
8186msgstr "" 8101msgstr ""
8187 8102
8188#: src/util/gnunet-config.c:309 8103#: src/util/gnunet-config.c:311
8189msgid "write configuration file that only contains delta to defaults" 8104msgid "write configuration file that only contains delta to defaults"
8190msgstr "" 8105msgstr ""
8191 8106
8192#: src/util/gnunet-config.c:322 8107#: src/util/gnunet-config.c:324
8193msgid "Manipulate GNUnet configuration files" 8108msgid "Manipulate GNUnet configuration files"
8194msgstr "" 8109msgstr ""
8195 8110
@@ -8282,6 +8197,33 @@ msgstr ""
8282msgid "Manipulate GNUnet private ECC key files" 8197msgid "Manipulate GNUnet private ECC key files"
8283msgstr "" 8198msgstr ""
8284 8199
8200#: src/util/gnunet-qr.c:108 src/util/gnunet-uri.c:91
8201#, c-format
8202msgid "Invalid URI: does not start with `%s'\n"
8203msgstr ""
8204
8205#: src/util/gnunet-qr.c:116 src/util/gnunet-uri.c:98
8206#, c-format
8207msgid "Invalid URI: fails to specify subsystem\n"
8208msgstr ""
8209
8210#: src/util/gnunet-qr.c:127 src/util/gnunet-uri.c:108
8211#, c-format
8212msgid "No handler known for subsystem `%s'\n"
8213msgstr ""
8214
8215#: src/util/gnunet-qr.c:297
8216msgid "use video-device DEVICE (default: /dev/video0"
8217msgstr ""
8218
8219#: src/util/gnunet-qr.c:303
8220msgid "do not show preview windows"
8221msgstr ""
8222
8223#: src/util/gnunet-qr.c:311
8224msgid "Scan a QR code using a video device and import the uri read"
8225msgstr ""
8226
8285#: src/util/gnunet-resolver.c:168 8227#: src/util/gnunet-resolver.c:168
8286msgid "perform a reverse lookup" 8228msgid "perform a reverse lookup"
8287msgstr "" 8229msgstr ""
@@ -8324,21 +8266,6 @@ msgstr ""
8324msgid "No URI specified on command line\n" 8266msgid "No URI specified on command line\n"
8325msgstr "" 8267msgstr ""
8326 8268
8327#: src/util/gnunet-uri.c:91
8328#, c-format
8329msgid "Invalid URI: does not start with `%s'\n"
8330msgstr ""
8331
8332#: src/util/gnunet-uri.c:98
8333#, c-format
8334msgid "Invalid URI: fails to specify subsystem\n"
8335msgstr ""
8336
8337#: src/util/gnunet-uri.c:108
8338#, c-format
8339msgid "No handler known for subsystem `%s'\n"
8340msgstr ""
8341
8342#: src/util/gnunet-uri.c:170 8269#: src/util/gnunet-uri.c:170
8343msgid "Perform default-actions for GNUnet URIs" 8270msgid "Perform default-actions for GNUnet URIs"
8344msgstr "" 8271msgstr ""
@@ -8358,12 +8285,12 @@ msgstr ""
8358msgid "Error writing to `%s': %s\n" 8285msgid "Error writing to `%s': %s\n"
8359msgstr "" 8286msgstr ""
8360 8287
8361#: src/util/network.c:136 8288#: src/util/network.c:176
8362#, c-format 8289#, c-format
8363msgid "Unable to shorten unix path `%s' while keeping name unique\n" 8290msgid "Unable to shorten unix path `%s' while keeping name unique\n"
8364msgstr "" 8291msgstr ""
8365 8292
8366#: src/util/network.c:1794 src/util/network.c:1978 8293#: src/util/network.c:1835 src/util/network.c:2019
8367#, c-format 8294#, c-format
8368msgid "" 8295msgid ""
8369"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" 8296"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8474,7 +8401,7 @@ msgid ""
8474"`GNUNET_SERVICE_client_continue' after %s\n" 8401"`GNUNET_SERVICE_client_continue' after %s\n"
8475msgstr "" 8402msgstr ""
8476 8403
8477#: src/util/service.c:1862 8404#: src/util/service.c:1826
8478msgid "" 8405msgid ""
8479"Could not bind to any of the ports I was supposed to, refusing to run!\n" 8406"Could not bind to any of the ports I was supposed to, refusing to run!\n"
8480msgstr "" 8407msgstr ""
diff --git a/po/sv.po b/po/sv.po
index 33331164d..d70b89a56 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
7msgstr "" 7msgstr ""
8"Project-Id-Version: GNUnet 0.7.0b\n" 8"Project-Id-Version: GNUnet 0.7.0b\n"
9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" 9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
10"POT-Creation-Date: 2019-02-28 11:41+0100\n" 10"POT-Creation-Date: 2019-04-04 12:39+0200\n"
11"PO-Revision-Date: 2006-01-21 17:16+0100\n" 11"PO-Revision-Date: 2006-01-21 17:16+0100\n"
12"Last-Translator: Daniel Nylander <po@danielnylander.se>\n" 12"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
13"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" 13"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -227,8 +227,7 @@ msgid "Control services and the Automated Restart Manager (ARM)"
227msgstr "" 227msgstr ""
228 228
229#: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120 229#: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120
230#: src/transport/plugin_transport_xt.c:1120 230#: src/transport/tcp_service_legacy.c:557
231#: src/transport/tcp_service_legacy.c:557 src/util/service.c:1167
232#, c-format 231#, c-format
233msgid "" 232msgid ""
234"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n" 233"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
@@ -238,35 +237,29 @@ msgstr ""
238#: src/transport/plugin_transport_tcp.c:1139 237#: src/transport/plugin_transport_tcp.c:1139
239#: src/transport/plugin_transport_tcp.c:1145 238#: src/transport/plugin_transport_tcp.c:1145
240#: src/transport/plugin_transport_tcp.c:3835 239#: src/transport/plugin_transport_tcp.c:3835
241#: src/transport/plugin_transport_xt.c:1139
242#: src/transport/plugin_transport_xt.c:1145
243#: src/transport/plugin_transport_xt.c:3833
244#: src/transport/tcp_service_legacy.c:576 240#: src/transport/tcp_service_legacy.c:576
245#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1192 241#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1156
246#: src/util/service.c:1198 242#: src/util/service.c:1162
247#, c-format 243#, c-format
248msgid "Require valid port number for service `%s' in configuration!\n" 244msgid "Require valid port number for service `%s' in configuration!\n"
249msgstr "" 245msgstr ""
250 246
251#: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176 247#: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176
252#: src/transport/plugin_transport_xt.c:1176 248#: src/transport/tcp_service_legacy.c:613 src/util/client.c:521
253#: src/transport/tcp_service_legacy.c:613 src/util/client.c:506 249#: src/util/service.c:1201
254#: src/util/service.c:1237
255#, c-format 250#, c-format
256msgid "UNIXPATH `%s' too long, maximum length is %llu\n" 251msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
257msgstr "" 252msgstr ""
258 253
259#: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180 254#: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180
260#: src/transport/plugin_transport_xt.c:1180 255#: src/transport/tcp_service_legacy.c:617 src/util/client.c:526
261#: src/transport/tcp_service_legacy.c:617 src/util/client.c:511 256#: src/util/service.c:1206
262#: src/util/service.c:1242
263#, fuzzy, c-format 257#, fuzzy, c-format
264msgid "Using `%s' instead\n" 258msgid "Using `%s' instead\n"
265msgstr "%s: flagga \"%s\" är tvetydig\n" 259msgstr "%s: flagga \"%s\" är tvetydig\n"
266 260
267#: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211 261#: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211
268#: src/transport/plugin_transport_xt.c:1211 262#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1242
269#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1278
270#, c-format 263#, c-format
271msgid "" 264msgid ""
272"Disabling UNIX domain socket support for service `%s', failed to create UNIX " 265"Disabling UNIX domain socket support for service `%s', failed to create UNIX "
@@ -274,8 +267,7 @@ msgid ""
274msgstr "" 267msgstr ""
275 268
276#: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228 269#: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228
277#: src/transport/plugin_transport_xt.c:1228 270#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1260
278#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1296
279#, c-format 271#, c-format
280msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n" 272msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
281msgstr "" 273msgstr ""
@@ -283,8 +275,7 @@ msgstr ""
283#: src/arm/gnunet-service-arm.c:556 275#: src/arm/gnunet-service-arm.c:556
284#: src/transport/plugin_transport_http_server.c:2688 276#: src/transport/plugin_transport_http_server.c:2688
285#: src/transport/plugin_transport_tcp.c:1259 277#: src/transport/plugin_transport_tcp.c:1259
286#: src/transport/plugin_transport_xt.c:1259 278#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1301
287#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1337
288#, fuzzy, c-format 279#, fuzzy, c-format
289msgid "Failed to resolve `%s': %s\n" 280msgid "Failed to resolve `%s': %s\n"
290msgstr "Misslyckades att leverera \"%s\" meddelande.\n" 281msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
@@ -292,8 +283,7 @@ msgstr "Misslyckades att leverera \"%s\" meddelande.\n"
292#: src/arm/gnunet-service-arm.c:575 283#: src/arm/gnunet-service-arm.c:575
293#: src/transport/plugin_transport_http_server.c:2706 284#: src/transport/plugin_transport_http_server.c:2706
294#: src/transport/plugin_transport_tcp.c:1278 285#: src/transport/plugin_transport_tcp.c:1278
295#: src/transport/plugin_transport_xt.c:1278 286#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1321
296#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1357
297#, fuzzy, c-format 287#, fuzzy, c-format
298msgid "Failed to find %saddress for `%s'.\n" 288msgid "Failed to find %saddress for `%s'.\n"
299msgstr "Misslyckades att binda till UDP-port %d.\n" 289msgstr "Misslyckades att binda till UDP-port %d.\n"
@@ -1632,6 +1622,11 @@ msgstr "Misslyckades att ansluta till gnunetd.\n"
1632msgid "Unable to parse ATTR record string `%s'\n" 1622msgid "Unable to parse ATTR record string `%s'\n"
1633msgstr "Misslyckades att läsa kompislista från \"%s\"\n" 1623msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
1634 1624
1625#: src/credential/plugin_rest_credential.c:1128
1626#, fuzzy
1627msgid "GNS REST API initialized\n"
1628msgstr " Anslutning misslyckades\n"
1629
1635#: src/datacache/datacache.c:119 src/datacache/datacache.c:311 1630#: src/datacache/datacache.c:119 src/datacache/datacache.c:311
1636#: src/datastore/gnunet-service-datastore.c:757 1631#: src/datastore/gnunet-service-datastore.c:757
1637#, fuzzy 1632#, fuzzy
@@ -2142,7 +2137,7 @@ msgstr ""
2142msgid "Exiting as the number of peers is %u\n" 2137msgid "Exiting as the number of peers is %u\n"
2143msgstr "Maximalt antal chattklienter uppnått.\n" 2138msgstr "Maximalt antal chattklienter uppnått.\n"
2144 2139
2145#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2959 2140#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2981
2146#, fuzzy 2141#, fuzzy
2147msgid "number of peers to start" 2142msgid "number of peers to start"
2148msgstr "antal iterationer" 2143msgstr "antal iterationer"
@@ -3256,11 +3251,11 @@ msgstr "Du måste ange en och endast en fil att avindexera.\n"
3256msgid "set the desired LEVEL of sender-anonymity" 3251msgid "set the desired LEVEL of sender-anonymity"
3257msgstr "" 3252msgstr ""
3258 3253
3259#: src/fs/gnunet-auto-share.c:772 src/fs/gnunet-publish.c:907 3254#: src/fs/gnunet-auto-share.c:772
3260msgid "disable adding the creation time to the metadata of the uploaded file" 3255msgid "disable adding the creation time to the metadata of the uploaded file"
3261msgstr "" 3256msgstr ""
3262 3257
3263#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:912 3258#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:907
3264msgid "do not use libextractor to add keywords or metadata" 3259msgid "do not use libextractor to add keywords or metadata"
3265msgstr "" 3260msgstr ""
3266 3261
@@ -3567,6 +3562,10 @@ msgstr "Kommando \"%s\" kräver ett argument (\"%s\").\n"
3567msgid "Option `%s' makes no sense without option `%s'.\n" 3562msgid "Option `%s' makes no sense without option `%s'.\n"
3568msgstr "" 3563msgstr ""
3569 3564
3565#: src/fs/gnunet-publish.c:911
3566msgid "enable adding the creation time to the metadata of the uploaded file"
3567msgstr ""
3568
3570#: src/fs/gnunet-publish.c:916 3569#: src/fs/gnunet-publish.c:916
3571msgid "" 3570msgid ""
3572"print list of extracted keywords that would be used, but do not perform " 3571"print list of extracted keywords that would be used, but do not perform "
@@ -4064,40 +4063,40 @@ msgstr ""
4064msgid "GNUnet HTTP server to create business cards" 4063msgid "GNUnet HTTP server to create business cards"
4065msgstr "" 4064msgstr ""
4066 4065
4067#: src/gns/gnunet-dns2gns.c:203 4066#: src/gns/gnunet-dns2gns.c:214
4068#, fuzzy 4067#, fuzzy
4069msgid "Failed to pack DNS response into UDP packet!\n" 4068msgid "Failed to pack DNS response into UDP packet!\n"
4070msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n" 4069msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n"
4071 4070
4072#: src/gns/gnunet-dns2gns.c:405 4071#: src/gns/gnunet-dns2gns.c:416
4073#, fuzzy, c-format 4072#, fuzzy, c-format
4074msgid "Cannot parse DNS request from %s\n" 4073msgid "Cannot parse DNS request from %s\n"
4075msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n" 4074msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n"
4076 4075
4077#: src/gns/gnunet-dns2gns.c:421 4076#: src/gns/gnunet-dns2gns.c:432
4078#, fuzzy, c-format 4077#, fuzzy, c-format
4079msgid "Received malformed DNS request from %s\n" 4078msgid "Received malformed DNS request from %s\n"
4080msgstr "Mottog ogiltig \"%s\" begäran (storlek %d)\n" 4079msgstr "Mottog ogiltig \"%s\" begäran (storlek %d)\n"
4081 4080
4082#: src/gns/gnunet-dns2gns.c:429 4081#: src/gns/gnunet-dns2gns.c:440
4083#, fuzzy, c-format 4082#, fuzzy, c-format
4084msgid "Received unsupported DNS request from %s\n" 4083msgid "Received unsupported DNS request from %s\n"
4085msgstr "Mottog okänd typ av begäran %d vid %s:%d\n" 4084msgstr "Mottog okänd typ av begäran %d vid %s:%d\n"
4086 4085
4087#: src/gns/gnunet-dns2gns.c:588 4086#: src/gns/gnunet-dns2gns.c:600
4088#, fuzzy 4087#, fuzzy
4089msgid "No DNS server specified!\n" 4088msgid "No DNS server specified!\n"
4090msgstr "Inga nyckelord angivna!\n" 4089msgstr "Inga nyckelord angivna!\n"
4091 4090
4092#: src/gns/gnunet-dns2gns.c:688 4091#: src/gns/gnunet-dns2gns.c:748
4093msgid "IP of recursive DNS resolver to use (required)" 4092msgid "IP of recursive DNS resolver to use (required)"
4094msgstr "" 4093msgstr ""
4095 4094
4096#: src/gns/gnunet-dns2gns.c:693 4095#: src/gns/gnunet-dns2gns.c:753
4097msgid "UDP port to listen on for inbound DNS requests; default: 2853" 4096msgid "UDP port to listen on for inbound DNS requests; default: 2853"
4098msgstr "" 4097msgstr ""
4099 4098
4100#: src/gns/gnunet-dns2gns.c:710 4099#: src/gns/gnunet-dns2gns.c:770
4101msgid "GNUnet DNS-to-GNS proxy (a DNS server)" 4100msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
4102msgstr "" 4101msgstr ""
4103 4102
@@ -4170,104 +4169,104 @@ msgstr ""
4170msgid "%s failed at %s:%d: `%s'\n" 4169msgid "%s failed at %s:%d: `%s'\n"
4171msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n" 4170msgstr "\"%s\" misslyckades vid %s:%d med fel: \"%s\".\n"
4172 4171
4173#: src/gns/gnunet-gns-proxy.c:980 4172#: src/gns/gnunet-gns-proxy.c:989
4174#, fuzzy, c-format 4173#, fuzzy, c-format
4175msgid "Unsupported CURL TLS backend %d\n" 4174msgid "Unsupported CURL TLS backend %d\n"
4176msgstr "Kommando \"%s\" stöds ej. Avbryter.\n" 4175msgstr "Kommando \"%s\" stöds ej. Avbryter.\n"
4177 4176
4178#: src/gns/gnunet-gns-proxy.c:1005 4177#: src/gns/gnunet-gns-proxy.c:1014
4179#, fuzzy, c-format 4178#, fuzzy, c-format
4180msgid "Failed to fetch CN from cert: %s\n" 4179msgid "Failed to fetch CN from cert: %s\n"
4181msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n" 4180msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n"
4182 4181
4183#: src/gns/gnunet-gns-proxy.c:1026 4182#: src/gns/gnunet-gns-proxy.c:1035
4184#, fuzzy, c-format 4183#, fuzzy, c-format
4185msgid "Failed to initialize DANE: %s\n" 4184msgid "Failed to initialize DANE: %s\n"
4186msgstr "Kunde inte initiera SQLite.\n" 4185msgstr "Kunde inte initiera SQLite.\n"
4187 4186
4188#: src/gns/gnunet-gns-proxy.c:1041 4187#: src/gns/gnunet-gns-proxy.c:1050
4189#, fuzzy, c-format 4188#, fuzzy, c-format
4190msgid "Failed to parse DANE record: %s\n" 4189msgid "Failed to parse DANE record: %s\n"
4191msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n" 4190msgstr "Misslyckades att skicka HTTP-begäran till värd \"%s\": %s\n"
4192 4191
4193#: src/gns/gnunet-gns-proxy.c:1056 4192#: src/gns/gnunet-gns-proxy.c:1065
4194#, fuzzy, c-format 4193#, fuzzy, c-format
4195msgid "Failed to verify TLS connection using DANE: %s\n" 4194msgid "Failed to verify TLS connection using DANE: %s\n"
4196msgstr "Kunde inte spara konfigurationsfil \"%s\":" 4195msgstr "Kunde inte spara konfigurationsfil \"%s\":"
4197 4196
4198#: src/gns/gnunet-gns-proxy.c:1066 4197#: src/gns/gnunet-gns-proxy.c:1075
4199#, c-format 4198#, c-format
4200msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n" 4199msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
4201msgstr "" 4200msgstr ""
4202 4201
4203#: src/gns/gnunet-gns-proxy.c:1090 4202#: src/gns/gnunet-gns-proxy.c:1099
4204#, c-format 4203#, c-format
4205msgid "TLS certificate subject name (%s) does not match `%s': %d\n" 4204msgid "TLS certificate subject name (%s) does not match `%s': %d\n"
4206msgstr "" 4205msgstr ""
4207 4206
4208#: src/gns/gnunet-gns-proxy.c:1221 4207#: src/gns/gnunet-gns-proxy.c:1230
4209#, c-format 4208#, c-format
4210msgid "Cookie domain `%s' supplied by server is invalid\n" 4209msgid "Cookie domain `%s' supplied by server is invalid\n"
4211msgstr "" 4210msgstr ""
4212 4211
4213#: src/gns/gnunet-gns-proxy.c:2122 4212#: src/gns/gnunet-gns-proxy.c:2131
4214#, fuzzy, c-format 4213#, fuzzy, c-format
4215msgid "Unsupported HTTP method `%s'\n" 4214msgid "Unsupported HTTP method `%s'\n"
4216msgstr "Kommando \"%s\" stöds ej. Avbryter.\n" 4215msgstr "Kommando \"%s\" stöds ej. Avbryter.\n"
4217 4216
4218#: src/gns/gnunet-gns-proxy.c:2643 4217#: src/gns/gnunet-gns-proxy.c:2652
4219#, fuzzy, c-format 4218#, fuzzy, c-format
4220msgid "Unable to import private key from file `%s'\n" 4219msgid "Unable to import private key from file `%s'\n"
4221msgstr "Kunde inte skapa användarkonto:" 4220msgstr "Kunde inte skapa användarkonto:"
4222 4221
4223#: src/gns/gnunet-gns-proxy.c:2675 4222#: src/gns/gnunet-gns-proxy.c:2684
4224#, fuzzy, c-format 4223#, fuzzy, c-format
4225msgid "Unable to import certificate from `%s'\n" 4224msgid "Unable to import certificate from `%s'\n"
4226msgstr "Kunde inte spara konfigurationsfil \"%s\":" 4225msgstr "Kunde inte spara konfigurationsfil \"%s\":"
4227 4226
4228#: src/gns/gnunet-gns-proxy.c:2876 4227#: src/gns/gnunet-gns-proxy.c:2885
4229#, fuzzy, c-format 4228#, fuzzy, c-format
4230msgid "Failed to start HTTPS server for `%s'\n" 4229msgid "Failed to start HTTPS server for `%s'\n"
4231msgstr "Misslyckades att starta samling.\n" 4230msgstr "Misslyckades att starta samling.\n"
4232 4231
4233#: src/gns/gnunet-gns-proxy.c:2898 src/rest/gnunet-rest-server.c:658 4232#: src/gns/gnunet-gns-proxy.c:2907 src/rest/gnunet-rest-server.c:668
4234#, fuzzy 4233#, fuzzy
4235msgid "Failed to pass client to MHD\n" 4234msgid "Failed to pass client to MHD\n"
4236msgstr "Misslyckades att ansluta till gnunetd.\n" 4235msgstr "Misslyckades att ansluta till gnunetd.\n"
4237 4236
4238#: src/gns/gnunet-gns-proxy.c:3234 4237#: src/gns/gnunet-gns-proxy.c:3243
4239#, fuzzy, c-format 4238#, fuzzy, c-format
4240msgid "Unsupported socks version %d\n" 4239msgid "Unsupported socks version %d\n"
4241msgstr "Kommando \"%s\" stöds ej. Avbryter.\n" 4240msgstr "Kommando \"%s\" stöds ej. Avbryter.\n"
4242 4241
4243#: src/gns/gnunet-gns-proxy.c:3263 4242#: src/gns/gnunet-gns-proxy.c:3272
4244#, fuzzy, c-format 4243#, fuzzy, c-format
4245msgid "Unsupported socks command %d\n" 4244msgid "Unsupported socks command %d\n"
4246msgstr "Kommando \"%s\" stöds ej. Avbryter.\n" 4245msgstr "Kommando \"%s\" stöds ej. Avbryter.\n"
4247 4246
4248#: src/gns/gnunet-gns-proxy.c:3346 4247#: src/gns/gnunet-gns-proxy.c:3355
4249#, fuzzy, c-format 4248#, fuzzy, c-format
4250msgid "Unsupported socks address type %d\n" 4249msgid "Unsupported socks address type %d\n"
4251msgstr "Kommando \"%s\" stöds ej. Avbryter.\n" 4250msgstr "Kommando \"%s\" stöds ej. Avbryter.\n"
4252 4251
4253#: src/gns/gnunet-gns-proxy.c:3636 4252#: src/gns/gnunet-gns-proxy.c:3693
4254#, fuzzy, c-format 4253#, fuzzy, c-format
4255msgid "Failed to load X.509 key and certificate from `%s'\n" 4254msgid "Failed to load X.509 key and certificate from `%s'\n"
4256msgstr "Misslyckades att läsa kompislista från \"%s\"\n" 4255msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
4257 4256
4258#: src/gns/gnunet-gns-proxy.c:3764 4257#: src/gns/gnunet-gns-proxy.c:3821
4259msgid "listen on specified port (default: 7777)" 4258msgid "listen on specified port (default: 7777)"
4260msgstr "" 4259msgstr ""
4261 4260
4262#: src/gns/gnunet-gns-proxy.c:3769 4261#: src/gns/gnunet-gns-proxy.c:3826
4263msgid "pem file to use as CA" 4262msgid "pem file to use as CA"
4264msgstr "" 4263msgstr ""
4265 4264
4266#: src/gns/gnunet-gns-proxy.c:3773 4265#: src/gns/gnunet-gns-proxy.c:3830
4267msgid "disable use of IPv6" 4266msgid "disable use of IPv6"
4268msgstr "" 4267msgstr ""
4269 4268
4270#: src/gns/gnunet-gns-proxy.c:3799 4269#: src/gns/gnunet-gns-proxy.c:3856
4271msgid "GNUnet GNS proxy" 4270msgid "GNUnet GNS proxy"
4272msgstr "" 4271msgstr ""
4273 4272
@@ -4376,6 +4375,11 @@ msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
4376msgid "Unable to parse BOX record string `%s'\n" 4375msgid "Unable to parse BOX record string `%s'\n"
4377msgstr "Misslyckades att läsa kompislista från \"%s\"\n" 4376msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
4378 4377
4378#: src/gns/plugin_rest_gns.c:452
4379#, fuzzy
4380msgid "Gns REST API initialized\n"
4381msgstr " Anslutning misslyckades\n"
4382
4379#: src/gnsrecord/plugin_gnsrecord_dns.c:359 4383#: src/gnsrecord/plugin_gnsrecord_dns.c:359
4380#, fuzzy, c-format 4384#, fuzzy, c-format
4381msgid "Unable to parse IPv4 address `%s'\n" 4385msgid "Unable to parse IPv4 address `%s'\n"
@@ -4893,6 +4897,11 @@ msgstr "Kunde inte spara konfigurationsfil \"%s\":"
4893msgid "Failed to create directory `%s' for storing egos\n" 4897msgid "Failed to create directory `%s' for storing egos\n"
4894msgstr "Misslyckades att läsa kompislista från \"%s\"\n" 4898msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
4895 4899
4900#: src/identity/plugin_rest_identity.c:1297
4901#, fuzzy
4902msgid "Identity REST API initialized\n"
4903msgstr " Anslutning misslyckades\n"
4904
4896#: src/json/json.c:123 4905#: src/json/json.c:123
4897#, fuzzy, c-format 4906#, fuzzy, c-format
4898msgid "Failed to parse JSON in option `%s': %s (%s)\n" 4907msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -5296,6 +5305,11 @@ msgstr ""
5296msgid "heap file database running\n" 5305msgid "heap file database running\n"
5297msgstr "" 5306msgstr ""
5298 5307
5308#: src/namestore/plugin_rest_namestore.c:1079
5309#, fuzzy
5310msgid "Namestore REST API initialized\n"
5311msgstr " Anslutning misslyckades\n"
5312
5299#: src/nat-auto/gnunet-nat-auto.c:193 5313#: src/nat-auto/gnunet-nat-auto.c:193
5300#, fuzzy 5314#, fuzzy
5301msgid "Suggested configuration changes:\n" 5315msgid "Suggested configuration changes:\n"
@@ -5684,7 +5698,7 @@ msgid "\tExpires: %s \t %s\n"
5684msgstr "" 5698msgstr ""
5685 5699
5686#: src/peerinfo-tool/gnunet-peerinfo.c:299 5700#: src/peerinfo-tool/gnunet-peerinfo.c:299
5687#: src/rest-plugins/plugin_rest_peerinfo.c:501 5701#: src/peerinfo-tool/plugin_rest_peerinfo.c:501
5688#, fuzzy, c-format 5702#, fuzzy, c-format
5689msgid "Failure: Cannot convert address to string for peer `%s'\n" 5703msgid "Failure: Cannot convert address to string for peer `%s'\n"
5690msgstr "Misslyckades att binda till UDP-port %d.\n" 5704msgstr "Misslyckades att binda till UDP-port %d.\n"
@@ -5764,6 +5778,11 @@ msgstr "Testar transport(er) %s\n"
5764msgid "Failed to load transport plugin for `%s'\n" 5778msgid "Failed to load transport plugin for `%s'\n"
5765msgstr "Kunde inte slå upp \"%s\": %s\n" 5779msgstr "Kunde inte slå upp \"%s\": %s\n"
5766 5780
5781#: src/peerinfo-tool/plugin_rest_peerinfo.c:796
5782#, fuzzy
5783msgid "Peerinfo REST API initialized\n"
5784msgstr " Anslutning misslyckades\n"
5785
5767#: src/peerstore/gnunet-peerstore.c:91 5786#: src/peerstore/gnunet-peerstore.c:91
5768msgid "peerstore" 5787msgid "peerstore"
5769msgstr "" 5788msgstr ""
@@ -5930,6 +5949,12 @@ msgstr ""
5930msgid "Expiration interval of the attribute" 5949msgid "Expiration interval of the attribute"
5931msgstr "" 5950msgstr ""
5932 5951
5952#: src/reclaim/plugin_rest_openid_connect.c:2279
5953#: src/reclaim/plugin_rest_reclaim.c:1079
5954#, fuzzy
5955msgid "Identity Provider REST API initialized\n"
5956msgstr " Anslutning misslyckades\n"
5957
5933#: src/reclaim/reclaim_api.c:436 5958#: src/reclaim/reclaim_api.c:436
5934#, fuzzy 5959#, fuzzy
5935msgid "failed to store record\n" 5960msgid "failed to store record\n"
@@ -6025,51 +6050,20 @@ msgstr "\"%s\" är inte en fil.\n"
6025msgid "Search string `%s' is too long!\n" 6050msgid "Search string `%s' is too long!\n"
6026msgstr "\"%s\" är inte en fil.\n" 6051msgstr "\"%s\" är inte en fil.\n"
6027 6052
6028#: src/rest/gnunet-rest-server.c:927 6053#: src/rest/gnunet-rest-server.c:986
6029msgid "listen on specified port (default: 7776)" 6054msgid "listen on specified port (default: 7776)"
6030msgstr "" 6055msgstr ""
6031 6056
6032#: src/rest/gnunet-rest-server.c:944 6057#: src/rest/gnunet-rest-server.c:1003
6033#, fuzzy 6058#, fuzzy
6034msgid "GNUnet REST server" 6059msgid "GNUnet REST server"
6035msgstr "Spåra GNUnets nätverkstopologi." 6060msgstr "Spåra GNUnets nätverkstopologi."
6036 6061
6037#: src/rest-plugins/plugin_rest_copying.c:209 6062#: src/rest/plugin_rest_copying.c:209
6038#, fuzzy 6063#, fuzzy
6039msgid "COPYING REST API initialized\n" 6064msgid "COPYING REST API initialized\n"
6040msgstr " Anslutning misslyckades\n" 6065msgstr " Anslutning misslyckades\n"
6041 6066
6042#: src/rest-plugins/plugin_rest_credential.c:1128
6043#, fuzzy
6044msgid "GNS REST API initialized\n"
6045msgstr " Anslutning misslyckades\n"
6046
6047#: src/rest-plugins/plugin_rest_gns.c:452
6048#, fuzzy
6049msgid "Gns REST API initialized\n"
6050msgstr " Anslutning misslyckades\n"
6051
6052#: src/rest-plugins/plugin_rest_identity.c:1297
6053#, fuzzy
6054msgid "Identity REST API initialized\n"
6055msgstr " Anslutning misslyckades\n"
6056
6057#: src/rest-plugins/plugin_rest_namestore.c:1079
6058#, fuzzy
6059msgid "Namestore REST API initialized\n"
6060msgstr " Anslutning misslyckades\n"
6061
6062#: src/rest-plugins/plugin_rest_openid_connect.c:2279
6063#: src/rest-plugins/plugin_rest_reclaim.c:1079
6064#, fuzzy
6065msgid "Identity Provider REST API initialized\n"
6066msgstr " Anslutning misslyckades\n"
6067
6068#: src/rest-plugins/plugin_rest_peerinfo.c:796
6069#, fuzzy
6070msgid "Peerinfo REST API initialized\n"
6071msgstr " Anslutning misslyckades\n"
6072
6073#: src/revocation/gnunet-revocation.c:129 6067#: src/revocation/gnunet-revocation.c:129
6074#, fuzzy, c-format 6068#, fuzzy, c-format
6075msgid "Key `%s' is valid\n" 6069msgid "Key `%s' is valid\n"
@@ -6220,21 +6214,21 @@ msgstr ""
6220msgid "Get peers from biased stream" 6214msgid "Get peers from biased stream"
6221msgstr "" 6215msgstr ""
6222 6216
6223#: src/rps/gnunet-rps-profiler.c:2964 6217#: src/rps/gnunet-rps-profiler.c:2986
6224msgid "duration of the profiling" 6218msgid "duration of the profiling"
6225msgstr "" 6219msgstr ""
6226 6220
6227#: src/rps/gnunet-rps-profiler.c:2969 6221#: src/rps/gnunet-rps-profiler.c:2991
6228#, fuzzy 6222#, fuzzy
6229msgid "timeout for the profiling" 6223msgid "timeout for the profiling"
6230msgstr "ange prioritet för innehållet" 6224msgstr "ange prioritet för innehållet"
6231 6225
6232#: src/rps/gnunet-rps-profiler.c:2974 6226#: src/rps/gnunet-rps-profiler.c:2996
6233#, fuzzy 6227#, fuzzy
6234msgid "number of PeerIDs to request" 6228msgid "number of PeerIDs to request"
6235msgstr "antal iterationer" 6229msgstr "antal iterationer"
6236 6230
6237#: src/rps/gnunet-rps-profiler.c:2990 6231#: src/rps/gnunet-rps-profiler.c:3012
6238#, fuzzy 6232#, fuzzy
6239msgid "Measure quality and performance of the RPS service." 6233msgid "Measure quality and performance of the RPS service."
6240msgstr "Kan inte tillgå tjänsten" 6234msgstr "Kan inte tillgå tjänsten"
@@ -6958,19 +6952,19 @@ msgstr "# krypterade PONG-meddelanden mottagna"
6958msgid "GNUnet topology control" 6952msgid "GNUnet topology control"
6959msgstr "" 6953msgstr ""
6960 6954
6961#: src/transport/gnunet-communicator-tcp.c:2329 6955#: src/transport/gnunet-communicator-tcp.c:2328
6962#: src/transport/gnunet-communicator-udp.c:2883 6956#: src/transport/gnunet-communicator-udp.c:2882
6963#: src/transport/gnunet-service-tng.c:4747 6957#: src/transport/gnunet-service-tng.c:4888
6964#: src/transport/gnunet-service-transport.c:2795 6958#: src/transport/gnunet-service-transport.c:2795
6965#, fuzzy 6959#, fuzzy
6966msgid "Transport service is lacking key configuration settings. Exiting.\n" 6960msgid "Transport service is lacking key configuration settings. Exiting.\n"
6967msgstr "GNUnet-konfiguration" 6961msgstr "GNUnet-konfiguration"
6968 6962
6969#: src/transport/gnunet-communicator-tcp.c:2393 6963#: src/transport/gnunet-communicator-tcp.c:2392
6970msgid "GNUnet TCP communicator" 6964msgid "GNUnet TCP communicator"
6971msgstr "" 6965msgstr ""
6972 6966
6973#: src/transport/gnunet-communicator-udp.c:2954 6967#: src/transport/gnunet-communicator-udp.c:2953
6974msgid "GNUnet UDP communicator" 6968msgid "GNUnet UDP communicator"
6975msgstr "" 6969msgstr ""
6976 6970
@@ -7565,8 +7559,6 @@ msgstr "meddelandestorlek"
7565#: src/transport/plugin_transport_http_server.c:3530 7559#: src/transport/plugin_transport_http_server.c:3530
7566#: src/transport/plugin_transport_tcp.c:3901 7560#: src/transport/plugin_transport_tcp.c:3901
7567#: src/transport/plugin_transport_tcp.c:3908 7561#: src/transport/plugin_transport_tcp.c:3908
7568#: src/transport/plugin_transport_xt.c:3899
7569#: src/transport/plugin_transport_xt.c:3906
7570msgid "TCP_STEALTH not supported on this platform.\n" 7562msgid "TCP_STEALTH not supported on this platform.\n"
7571msgstr "" 7563msgstr ""
7572 7564
@@ -7638,7 +7630,6 @@ msgstr ""
7638 7630
7639#: src/transport/plugin_transport_http_server.c:2905 7631#: src/transport/plugin_transport_http_server.c:2905
7640#: src/transport/plugin_transport_udp.c:3627 7632#: src/transport/plugin_transport_udp.c:3627
7641#: src/transport/plugin_transport_xu.c:2049
7642msgid "Disabling IPv6 since it is not supported on this system!\n" 7633msgid "Disabling IPv6 since it is not supported on this system!\n"
7643msgstr "" 7634msgstr ""
7644 7635
@@ -7750,8 +7741,6 @@ msgstr "# byte kastade via TCP (utgående)"
7750 7741
7751#: src/transport/plugin_transport_tcp.c:1557 7742#: src/transport/plugin_transport_tcp.c:1557
7752#: src/transport/plugin_transport_tcp.c:2883 7743#: src/transport/plugin_transport_tcp.c:2883
7753#: src/transport/plugin_transport_xt.c:1553
7754#: src/transport/plugin_transport_xt.c:2879
7755#, c-format 7744#, c-format
7756msgid "Unexpected address length: %u bytes\n" 7745msgid "Unexpected address length: %u bytes\n"
7757msgstr "" 7746msgstr ""
@@ -7760,9 +7749,6 @@ msgstr ""
7760#: src/transport/plugin_transport_tcp.c:1964 7749#: src/transport/plugin_transport_tcp.c:1964
7761#: src/transport/plugin_transport_tcp.c:3147 7750#: src/transport/plugin_transport_tcp.c:3147
7762#: src/transport/plugin_transport_tcp.c:4024 7751#: src/transport/plugin_transport_tcp.c:4024
7763#: src/transport/plugin_transport_xt.c:1736
7764#: src/transport/plugin_transport_xt.c:1960
7765#: src/transport/plugin_transport_xt.c:3143
7766#, fuzzy 7752#, fuzzy
7767msgid "# TCP sessions active" 7753msgid "# TCP sessions active"
7768msgstr "# sessionsnycklar accepterade" 7754msgstr "# sessionsnycklar accepterade"
@@ -7773,91 +7759,70 @@ msgstr "# sessionsnycklar accepterade"
7773#: src/transport/plugin_transport_tcp.c:2143 7759#: src/transport/plugin_transport_tcp.c:2143
7774#: src/transport/plugin_transport_tcp.c:2243 7760#: src/transport/plugin_transport_tcp.c:2243
7775#: src/transport/plugin_transport_tcp.c:2268 7761#: src/transport/plugin_transport_tcp.c:2268
7776#: src/transport/plugin_transport_xt.c:1778
7777#: src/transport/plugin_transport_xt.c:1942
7778#: src/transport/plugin_transport_xt.c:2066
7779#: src/transport/plugin_transport_xt.c:2139
7780#: src/transport/plugin_transport_xt.c:2239
7781#: src/transport/plugin_transport_xt.c:2264
7782#, fuzzy 7762#, fuzzy
7783msgid "# bytes currently in TCP buffers" 7763msgid "# bytes currently in TCP buffers"
7784msgstr "# byte skickades via TCP" 7764msgstr "# byte skickades via TCP"
7785 7765
7786#: src/transport/plugin_transport_tcp.c:1785 7766#: src/transport/plugin_transport_tcp.c:1785
7787#: src/transport/plugin_transport_xt.c:1781
7788#, fuzzy 7767#, fuzzy
7789msgid "# bytes discarded by TCP (disconnect)" 7768msgid "# bytes discarded by TCP (disconnect)"
7790msgstr "# byte kastade via TCP (utgående)" 7769msgstr "# byte kastade via TCP (utgående)"
7791 7770
7792#: src/transport/plugin_transport_tcp.c:2073 7771#: src/transport/plugin_transport_tcp.c:2073
7793#: src/transport/plugin_transport_xt.c:2069
7794#, fuzzy 7772#, fuzzy
7795msgid "# bytes discarded by TCP (timeout)" 7773msgid "# bytes discarded by TCP (timeout)"
7796msgstr "# byte kastade via TCP (utgående)" 7774msgstr "# byte kastade via TCP (utgående)"
7797 7775
7798#: src/transport/plugin_transport_tcp.c:2147 7776#: src/transport/plugin_transport_tcp.c:2147
7799#: src/transport/plugin_transport_xt.c:2143
7800#, fuzzy 7777#, fuzzy
7801msgid "# bytes transmitted via TCP" 7778msgid "# bytes transmitted via TCP"
7802msgstr "# byte skickade av typen %d" 7779msgstr "# byte skickade av typen %d"
7803 7780
7804#: src/transport/plugin_transport_tcp.c:2545 7781#: src/transport/plugin_transport_tcp.c:2545
7805#: src/transport/plugin_transport_xt.c:2541
7806msgid "# requests to create session with invalid address" 7782msgid "# requests to create session with invalid address"
7807msgstr "" 7783msgstr ""
7808 7784
7809#: src/transport/plugin_transport_tcp.c:2721 7785#: src/transport/plugin_transport_tcp.c:2721
7810#: src/transport/plugin_transport_xt.c:2717
7811msgid "# transport-service disconnect requests for TCP" 7786msgid "# transport-service disconnect requests for TCP"
7812msgstr "" 7787msgstr ""
7813 7788
7814#: src/transport/plugin_transport_tcp.c:3213 7789#: src/transport/plugin_transport_tcp.c:3213
7815#: src/transport/plugin_transport_xt.c:3209
7816#, fuzzy 7790#, fuzzy
7817msgid "# TCP WELCOME messages received" 7791msgid "# TCP WELCOME messages received"
7818msgstr "# krypterade PONG-meddelanden mottagna" 7792msgstr "# krypterade PONG-meddelanden mottagna"
7819 7793
7820#: src/transport/plugin_transport_tcp.c:3419 7794#: src/transport/plugin_transport_tcp.c:3419
7821#: src/transport/plugin_transport_xt.c:3415
7822msgid "# bytes received via TCP" 7795msgid "# bytes received via TCP"
7823msgstr "# byte mottogs via TCP" 7796msgstr "# byte mottogs via TCP"
7824 7797
7825#: src/transport/plugin_transport_tcp.c:3470 7798#: src/transport/plugin_transport_tcp.c:3470
7826#: src/transport/plugin_transport_tcp.c:3528 7799#: src/transport/plugin_transport_tcp.c:3528
7827#: src/transport/plugin_transport_xt.c:3466
7828#: src/transport/plugin_transport_xt.c:3524
7829#, fuzzy 7800#, fuzzy
7830msgid "# TCP server connections active" 7801msgid "# TCP server connections active"
7831msgstr "Nätverksanslutning" 7802msgstr "Nätverksanslutning"
7832 7803
7833#: src/transport/plugin_transport_tcp.c:3474 7804#: src/transport/plugin_transport_tcp.c:3474
7834#: src/transport/plugin_transport_xt.c:3470
7835#, fuzzy 7805#, fuzzy
7836msgid "# TCP server connect events" 7806msgid "# TCP server connect events"
7837msgstr "# av anslutna parter" 7807msgstr "# av anslutna parter"
7838 7808
7839#: src/transport/plugin_transport_tcp.c:3480 7809#: src/transport/plugin_transport_tcp.c:3480
7840#: src/transport/plugin_transport_xt.c:3476
7841msgid "TCP connection limit reached, suspending server\n" 7810msgid "TCP connection limit reached, suspending server\n"
7842msgstr "" 7811msgstr ""
7843 7812
7844#: src/transport/plugin_transport_tcp.c:3482 7813#: src/transport/plugin_transport_tcp.c:3482
7845#: src/transport/plugin_transport_xt.c:3478
7846msgid "# TCP service suspended" 7814msgid "# TCP service suspended"
7847msgstr "" 7815msgstr ""
7848 7816
7849#: src/transport/plugin_transport_tcp.c:3522 7817#: src/transport/plugin_transport_tcp.c:3522
7850#: src/transport/plugin_transport_xt.c:3518
7851msgid "# TCP service resumed" 7818msgid "# TCP service resumed"
7852msgstr "" 7819msgstr ""
7853 7820
7854#: src/transport/plugin_transport_tcp.c:3532 7821#: src/transport/plugin_transport_tcp.c:3532
7855#: src/transport/plugin_transport_xt.c:3528
7856msgid "# network-level TCP disconnect events" 7822msgid "# network-level TCP disconnect events"
7857msgstr "" 7823msgstr ""
7858 7824
7859#: src/transport/plugin_transport_tcp.c:3851 7825#: src/transport/plugin_transport_tcp.c:3851
7860#: src/transport/plugin_transport_xt.c:3849
7861#, fuzzy 7826#, fuzzy
7862msgid "Failed to start service.\n" 7827msgid "Failed to start service.\n"
7863msgstr "Misslyckades att starta samling.\n" 7828msgstr "Misslyckades att starta samling.\n"
@@ -7911,7 +7876,6 @@ msgid "Failed to bind UDP socket to %s: %s\n"
7911msgstr "Misslyckades att binda till UDP6-port %d.\n" 7876msgstr "Misslyckades att binda till UDP6-port %d.\n"
7912 7877
7913#: src/transport/plugin_transport_udp.c:3721 7878#: src/transport/plugin_transport_udp.c:3721
7914#: src/transport/plugin_transport_xu.c:2143
7915msgid "Disabling IPv4 since it is not supported on this system!\n" 7879msgid "Disabling IPv4 since it is not supported on this system!\n"
7916msgstr "" 7880msgstr ""
7917 7881
@@ -7922,19 +7886,15 @@ msgstr "Misslyckades att binda till UDP6-port %d.\n"
7922 7886
7923#: src/transport/plugin_transport_udp.c:3883 7887#: src/transport/plugin_transport_udp.c:3883
7924#: src/transport/plugin_transport_udp.c:3897 7888#: src/transport/plugin_transport_udp.c:3897
7925#: src/transport/plugin_transport_xu.c:2301
7926#: src/transport/plugin_transport_xu.c:2315
7927msgid "must be in [0,65535]" 7889msgid "must be in [0,65535]"
7928msgstr "" 7890msgstr ""
7929 7891
7930#: src/transport/plugin_transport_udp.c:3929 7892#: src/transport/plugin_transport_udp.c:3929
7931#: src/transport/plugin_transport_xu.c:2347
7932#, fuzzy 7893#, fuzzy
7933msgid "must be valid IPv4 address" 7894msgid "must be valid IPv4 address"
7934msgstr "\"%s\" är inte tillgänglig." 7895msgstr "\"%s\" är inte tillgänglig."
7935 7896
7936#: src/transport/plugin_transport_udp.c:3956 7897#: src/transport/plugin_transport_udp.c:3956
7937#: src/transport/plugin_transport_xu.c:2374
7938#, fuzzy 7898#, fuzzy
7939msgid "must be valid IPv6 address" 7899msgid "must be valid IPv6 address"
7940msgstr "\"%s\" är inte tillgänglig." 7900msgstr "\"%s\" är inte tillgänglig."
@@ -8021,54 +7981,6 @@ msgstr ""
8021msgid "# sessions allocated" 7981msgid "# sessions allocated"
8022msgstr "# sessionsnycklar accepterade" 7982msgstr "# sessionsnycklar accepterade"
8023 7983
8024#: src/transport/plugin_transport_xt.c:4010
8025#, c-format
8026msgid "XT transport listening on port %llu\n"
8027msgstr ""
8028
8029#: src/transport/plugin_transport_xt.c:4014
8030msgid "XT transport not listening on any port (client only)\n"
8031msgstr ""
8032
8033#: src/transport/plugin_transport_xt.c:4018
8034#, c-format
8035msgid "XT transport advertises itself as being on port %llu\n"
8036msgstr ""
8037
8038#: src/transport/plugin_transport_xt.c:4022
8039#, fuzzy
8040msgid "# XT sessions active"
8041msgstr "# sessionsnycklar accepterade"
8042
8043#: src/transport/plugin_transport_xu.c:1237
8044#, c-format
8045msgid ""
8046"XU could not transmit message to `%s': Network seems down, please check your "
8047"network configuration\n"
8048msgstr ""
8049
8050#: src/transport/plugin_transport_xu.c:1251
8051msgid ""
8052"XU could not transmit IPv6 message! Please check your network configuration "
8053"and disable IPv6 if your connection does not have a global IPv6 address\n"
8054msgstr ""
8055
8056#: src/transport/plugin_transport_xu.c:2125
8057#: src/transport/plugin_transport_xu.c:2224
8058#, fuzzy, c-format
8059msgid "Failed to bind XU socket to %s: %s\n"
8060msgstr "Misslyckades att binda till UDP6-port %d.\n"
8061
8062#: src/transport/plugin_transport_xu.c:2234
8063#, fuzzy
8064msgid "Failed to open XU sockets\n"
8065msgstr "Misslyckades att binda till UDP6-port %d.\n"
8066
8067#: src/transport/plugin_transport_xu.c:2398
8068#, fuzzy
8069msgid "Failed to create XU network sockets\n"
8070msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
8071
8072#: src/transport/tcp_connection_legacy.c:452 7984#: src/transport/tcp_connection_legacy.c:452
8073#, fuzzy, c-format 7985#, fuzzy, c-format
8074msgid "Access denied to `%s'\n" 7986msgid "Access denied to `%s'\n"
@@ -8080,17 +7992,17 @@ msgid "Accepting connection from `%s': %p\n"
8080msgstr "" 7992msgstr ""
8081 7993
8082# drive = hard drive ? 7994# drive = hard drive ?
8083#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1666 7995#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1630
8084#, fuzzy, c-format 7996#, fuzzy, c-format
8085msgid "`%s' failed for port %d (%s).\n" 7997msgid "`%s' failed for port %d (%s).\n"
8086msgstr "\"%s\" misslyckades för enhet %s: %u\n" 7998msgstr "\"%s\" misslyckades för enhet %s: %u\n"
8087 7999
8088#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1676 8000#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1640
8089#, fuzzy, c-format 8001#, fuzzy, c-format
8090msgid "`%s' failed for port %d (%s): address already in use\n" 8002msgid "`%s' failed for port %d (%s): address already in use\n"
8091msgstr "\"%s\" misslyckades för port %d: %s. Körs verkligen gnunetd?\n" 8003msgstr "\"%s\" misslyckades för port %d: %s. Körs verkligen gnunetd?\n"
8092 8004
8093#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1682 8005#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1646
8094#, fuzzy, c-format 8006#, fuzzy, c-format
8095msgid "`%s' failed for `%s': address already in use\n" 8007msgid "`%s' failed for `%s': address already in use\n"
8096msgstr "\"%s\" misslyckades för port %d: %s. Körs verkligen gnunetd?\n" 8008msgstr "\"%s\" misslyckades för port %d: %s. Körs verkligen gnunetd?\n"
@@ -8122,17 +8034,17 @@ msgstr ""
8122msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n" 8034msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
8123msgstr "" 8035msgstr ""
8124 8036
8125#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1597 8037#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1561
8126msgid "Could not access a pre-bound socket, will try to bind myself\n" 8038msgid "Could not access a pre-bound socket, will try to bind myself\n"
8127msgstr "" 8039msgstr ""
8128 8040
8129#: src/transport/tcp_service_legacy.c:953 8041#: src/transport/tcp_service_legacy.c:953
8130#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1750 8042#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1714
8131#, c-format 8043#, c-format
8132msgid "Specified value for `%s' of service `%s' is invalid\n" 8044msgid "Specified value for `%s' of service `%s' is invalid\n"
8133msgstr "" 8045msgstr ""
8134 8046
8135#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1783 8047#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1747
8136#, c-format 8048#, c-format
8137msgid "Could not access pre-bound socket %u, will try to bind myself\n" 8049msgid "Could not access pre-bound socket %u, will try to bind myself\n"
8138msgstr "" 8050msgstr ""
@@ -8147,44 +8059,44 @@ msgstr "Fel vid %s:%d.\n"
8147msgid "Service `%s' runs at %s\n" 8059msgid "Service `%s' runs at %s\n"
8148msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n" 8060msgstr "Motpart \"%s\" med pålitlighet %8u och adress \"%s\"\n"
8149 8061
8150#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2057 8062#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2021
8151msgid "Service process failed to initialize\n" 8063msgid "Service process failed to initialize\n"
8152msgstr "" 8064msgstr ""
8153 8065
8154#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2061 8066#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2025
8155msgid "Service process could not initialize server function\n" 8067msgid "Service process could not initialize server function\n"
8156msgstr "" 8068msgstr ""
8157 8069
8158#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2065 8070#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2029
8159msgid "Service process failed to report status\n" 8071msgid "Service process failed to report status\n"
8160msgstr "" 8072msgstr ""
8161 8073
8162#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535 8074#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535
8163#: src/util/service.c:1935 8075#: src/util/service.c:1899
8164#, fuzzy, c-format 8076#, fuzzy, c-format
8165msgid "Cannot obtain information about user `%s': %s\n" 8077msgid "Cannot obtain information about user `%s': %s\n"
8166msgstr "Kan inte öppna konfigurationsfil \"%s\".\n" 8078msgstr "Kan inte öppna konfigurationsfil \"%s\".\n"
8167 8079
8168#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1937 8080#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1901
8169msgid "No such user" 8081msgid "No such user"
8170msgstr "" 8082msgstr ""
8171 8083
8172#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1956 8084#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1920
8173#, c-format 8085#, c-format
8174msgid "Cannot change user/group to `%s': %s\n" 8086msgid "Cannot change user/group to `%s': %s\n"
8175msgstr "Kan inte ändra användare/grupp till \"%s\": %s\n" 8087msgstr "Kan inte ändra användare/grupp till \"%s\": %s\n"
8176 8088
8177#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2318 8089#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2282
8178msgid "do daemonize (detach from terminal)" 8090msgid "do daemonize (detach from terminal)"
8179msgstr "" 8091msgstr ""
8180 8092
8181#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2382 8093#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2346
8182#: src/util/service.c:2397 8094#: src/util/service.c:2361
8183#, fuzzy, c-format 8095#, fuzzy, c-format
8184msgid "Malformed configuration file `%s', exit ...\n" 8096msgid "Malformed configuration file `%s', exit ...\n"
8185msgstr "Kunde inte spara konfigurationsfil \"%s\":" 8097msgstr "Kunde inte spara konfigurationsfil \"%s\":"
8186 8098
8187#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2409 8099#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2373
8188#, fuzzy 8100#, fuzzy
8189msgid "Malformed configuration, exit ...\n" 8101msgid "Malformed configuration, exit ...\n"
8190msgstr "Kunde inte spara konfigurationsfil \"%s\":" 8102msgstr "Kunde inte spara konfigurationsfil \"%s\":"
@@ -8228,11 +8140,11 @@ msgstr ""
8228msgid "Metadata `%s' failed to deserialize" 8140msgid "Metadata `%s' failed to deserialize"
8229msgstr "" 8141msgstr ""
8230 8142
8231#: src/util/client.c:734 8143#: src/util/client.c:749
8232msgid "not a valid filename" 8144msgid "not a valid filename"
8233msgstr "" 8145msgstr ""
8234 8146
8235#: src/util/client.c:925 8147#: src/util/client.c:941
8236#, c-format 8148#, c-format
8237msgid "Need a non-empty hostname for service `%s'.\n" 8149msgid "Need a non-empty hostname for service `%s'.\n"
8238msgstr "" 8150msgstr ""
@@ -8521,7 +8433,7 @@ msgstr ""
8521msgid "print this help" 8433msgid "print this help"
8522msgstr "skriv ut denna hjälp" 8434msgstr "skriv ut denna hjälp"
8523 8435
8524#: src/util/getopt_helpers.c:282 8436#: src/util/getopt_helpers.c:282 src/util/gnunet-qr.c:300
8525msgid "be verbose" 8437msgid "be verbose"
8526msgstr "var informativ" 8438msgstr "var informativ"
8527 8439
@@ -8569,53 +8481,53 @@ msgstr "Du måste skicka med ett nummer till flaggan \"%s\".\n"
8569msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n" 8481msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n"
8570msgstr "" 8482msgstr ""
8571 8483
8572#: src/util/gnunet-config.c:160 8484#: src/util/gnunet-config.c:161
8573#, fuzzy, c-format 8485#, fuzzy, c-format
8574msgid "failed to load configuration defaults" 8486msgid "failed to load configuration defaults"
8575msgstr "Kunde inte spara konfigurationsfil \"%s\":" 8487msgstr "Kunde inte spara konfigurationsfil \"%s\":"
8576 8488
8577#: src/util/gnunet-config.c:173 8489#: src/util/gnunet-config.c:174
8578#, fuzzy, c-format 8490#, fuzzy, c-format
8579msgid "%s or %s argument is required\n" 8491msgid "%s or %s argument is required\n"
8580msgstr "%s: flagga \"%s\" är tvetydig\n" 8492msgstr "%s: flagga \"%s\" är tvetydig\n"
8581 8493
8582#: src/util/gnunet-config.c:181 8494#: src/util/gnunet-config.c:182
8583#, c-format 8495#, c-format
8584msgid "The following sections are available:\n" 8496msgid "The following sections are available:\n"
8585msgstr "" 8497msgstr ""
8586 8498
8587#: src/util/gnunet-config.c:232 8499#: src/util/gnunet-config.c:234
8588#, c-format 8500#, c-format
8589msgid "--option argument required to set value\n" 8501msgid "--option argument required to set value\n"
8590msgstr "" 8502msgstr ""
8591 8503
8592#: src/util/gnunet-config.c:286 8504#: src/util/gnunet-config.c:288
8593msgid "obtain option of value as a filename (with $-expansion)" 8505msgid "interpret option value as a filename (with $-expansion)"
8594msgstr "" 8506msgstr ""
8595 8507
8596#: src/util/gnunet-config.c:291 8508#: src/util/gnunet-config.c:293
8597msgid "name of the section to access" 8509msgid "name of the section to access"
8598msgstr "" 8510msgstr ""
8599 8511
8600#: src/util/gnunet-config.c:296 8512#: src/util/gnunet-config.c:298
8601#, fuzzy 8513#, fuzzy
8602msgid "name of the option to access" 8514msgid "name of the option to access"
8603msgstr "Visa värde av alternativet" 8515msgstr "Visa värde av alternativet"
8604 8516
8605#: src/util/gnunet-config.c:301 8517#: src/util/gnunet-config.c:303
8606msgid "value to set" 8518msgid "value to set"
8607msgstr "" 8519msgstr ""
8608 8520
8609#: src/util/gnunet-config.c:305 8521#: src/util/gnunet-config.c:307
8610#, fuzzy 8522#, fuzzy
8611msgid "print available configuration sections" 8523msgid "print available configuration sections"
8612msgstr "GNUnet-konfiguration" 8524msgstr "GNUnet-konfiguration"
8613 8525
8614#: src/util/gnunet-config.c:309 8526#: src/util/gnunet-config.c:311
8615msgid "write configuration file that only contains delta to defaults" 8527msgid "write configuration file that only contains delta to defaults"
8616msgstr "" 8528msgstr ""
8617 8529
8618#: src/util/gnunet-config.c:322 8530#: src/util/gnunet-config.c:324
8619#, fuzzy 8531#, fuzzy
8620msgid "Manipulate GNUnet configuration files" 8532msgid "Manipulate GNUnet configuration files"
8621msgstr "skriv ut ett värde från konfigurationsfilen till standard ut" 8533msgstr "skriv ut ett värde från konfigurationsfilen till standard ut"
@@ -8708,6 +8620,33 @@ msgstr ""
8708msgid "Manipulate GNUnet private ECC key files" 8620msgid "Manipulate GNUnet private ECC key files"
8709msgstr "skriv ut ett värde från konfigurationsfilen till standard ut" 8621msgstr "skriv ut ett värde från konfigurationsfilen till standard ut"
8710 8622
8623#: src/util/gnunet-qr.c:108 src/util/gnunet-uri.c:91
8624#, fuzzy, c-format
8625msgid "Invalid URI: does not start with `%s'\n"
8626msgstr "Ogiltig nätverksnotation (slutar inte med \";\": \"%s\")\n"
8627
8628#: src/util/gnunet-qr.c:116 src/util/gnunet-uri.c:98
8629#, c-format
8630msgid "Invalid URI: fails to specify subsystem\n"
8631msgstr ""
8632
8633#: src/util/gnunet-qr.c:127 src/util/gnunet-uri.c:108
8634#, c-format
8635msgid "No handler known for subsystem `%s'\n"
8636msgstr ""
8637
8638#: src/util/gnunet-qr.c:297
8639msgid "use video-device DEVICE (default: /dev/video0"
8640msgstr ""
8641
8642#: src/util/gnunet-qr.c:303
8643msgid "do not show preview windows"
8644msgstr ""
8645
8646#: src/util/gnunet-qr.c:311
8647msgid "Scan a QR code using a video device and import the uri read"
8648msgstr ""
8649
8711#: src/util/gnunet-resolver.c:168 8650#: src/util/gnunet-resolver.c:168
8712msgid "perform a reverse lookup" 8651msgid "perform a reverse lookup"
8713msgstr "" 8652msgstr ""
@@ -8751,21 +8690,6 @@ msgstr ""
8751msgid "No URI specified on command line\n" 8690msgid "No URI specified on command line\n"
8752msgstr "" 8691msgstr ""
8753 8692
8754#: src/util/gnunet-uri.c:91
8755#, fuzzy, c-format
8756msgid "Invalid URI: does not start with `%s'\n"
8757msgstr "Ogiltig nätverksnotation (slutar inte med \";\": \"%s\")\n"
8758
8759#: src/util/gnunet-uri.c:98
8760#, c-format
8761msgid "Invalid URI: fails to specify subsystem\n"
8762msgstr ""
8763
8764#: src/util/gnunet-uri.c:108
8765#, c-format
8766msgid "No handler known for subsystem `%s'\n"
8767msgstr ""
8768
8769#: src/util/gnunet-uri.c:170 8693#: src/util/gnunet-uri.c:170
8770msgid "Perform default-actions for GNUnet URIs" 8694msgid "Perform default-actions for GNUnet URIs"
8771msgstr "" 8695msgstr ""
@@ -8785,12 +8709,12 @@ msgstr "Misslyckades att läsa kompislista från \"%s\"\n"
8785msgid "Error writing to `%s': %s\n" 8709msgid "Error writing to `%s': %s\n"
8786msgstr "Fel vid skapandet av användare" 8710msgstr "Fel vid skapandet av användare"
8787 8711
8788#: src/util/network.c:136 8712#: src/util/network.c:176
8789#, c-format 8713#, c-format
8790msgid "Unable to shorten unix path `%s' while keeping name unique\n" 8714msgid "Unable to shorten unix path `%s' while keeping name unique\n"
8791msgstr "" 8715msgstr ""
8792 8716
8793#: src/util/network.c:1794 src/util/network.c:1978 8717#: src/util/network.c:1835 src/util/network.c:2019
8794#, c-format 8718#, c-format
8795msgid "" 8719msgid ""
8796"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" 8720"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8906,7 +8830,7 @@ msgid ""
8906"`GNUNET_SERVICE_client_continue' after %s\n" 8830"`GNUNET_SERVICE_client_continue' after %s\n"
8907msgstr "" 8831msgstr ""
8908 8832
8909#: src/util/service.c:1862 8833#: src/util/service.c:1826
8910msgid "" 8834msgid ""
8911"Could not bind to any of the ports I was supposed to, refusing to run!\n" 8835"Could not bind to any of the ports I was supposed to, refusing to run!\n"
8912msgstr "" 8836msgstr ""
@@ -9259,6 +9183,22 @@ msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
9259msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n" 9183msgstr "\"%s\" misslyckades för fil \"%s\" vid %s:%d med fel: %s\n"
9260 9184
9261#, fuzzy 9185#, fuzzy
9186#~ msgid "# XT sessions active"
9187#~ msgstr "# sessionsnycklar accepterade"
9188
9189#, fuzzy
9190#~ msgid "Failed to bind XU socket to %s: %s\n"
9191#~ msgstr "Misslyckades att binda till UDP6-port %d.\n"
9192
9193#, fuzzy
9194#~ msgid "Failed to open XU sockets\n"
9195#~ msgstr "Misslyckades att binda till UDP6-port %d.\n"
9196
9197#, fuzzy
9198#~ msgid "Failed to create XU network sockets\n"
9199#~ msgstr "Kunde inte skapa namnrymd \"%s\" (existerar?).\n"
9200
9201#, fuzzy
9262#~ msgid "Print information about DV state" 9202#~ msgid "Print information about DV state"
9263#~ msgstr "Skriv ut information om GNUnets motparter." 9203#~ msgstr "Skriv ut information om GNUnets motparter."
9264 9204
diff --git a/po/vi.po b/po/vi.po
index b58495063..d4e506304 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -8,7 +8,7 @@ msgid ""
8msgstr "" 8msgstr ""
9"Project-Id-Version: gnunet 0.8.0a\n" 9"Project-Id-Version: gnunet 0.8.0a\n"
10"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" 10"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
11"POT-Creation-Date: 2019-02-28 11:41+0100\n" 11"POT-Creation-Date: 2019-04-04 12:39+0200\n"
12"PO-Revision-Date: 2008-09-10 22:05+0930\n" 12"PO-Revision-Date: 2008-09-10 22:05+0930\n"
13"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n" 13"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
14"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n" 14"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
@@ -234,8 +234,7 @@ msgid "Control services and the Automated Restart Manager (ARM)"
234msgstr "" 234msgstr ""
235 235
236#: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120 236#: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120
237#: src/transport/plugin_transport_xt.c:1120 237#: src/transport/tcp_service_legacy.c:557
238#: src/transport/tcp_service_legacy.c:557 src/util/service.c:1167
239#, c-format 238#, c-format
240msgid "" 239msgid ""
241"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n" 240"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
@@ -245,35 +244,29 @@ msgstr ""
245#: src/transport/plugin_transport_tcp.c:1139 244#: src/transport/plugin_transport_tcp.c:1139
246#: src/transport/plugin_transport_tcp.c:1145 245#: src/transport/plugin_transport_tcp.c:1145
247#: src/transport/plugin_transport_tcp.c:3835 246#: src/transport/plugin_transport_tcp.c:3835
248#: src/transport/plugin_transport_xt.c:1139
249#: src/transport/plugin_transport_xt.c:1145
250#: src/transport/plugin_transport_xt.c:3833
251#: src/transport/tcp_service_legacy.c:576 247#: src/transport/tcp_service_legacy.c:576
252#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1192 248#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1156
253#: src/util/service.c:1198 249#: src/util/service.c:1162
254#, c-format 250#, c-format
255msgid "Require valid port number for service `%s' in configuration!\n" 251msgid "Require valid port number for service `%s' in configuration!\n"
256msgstr "" 252msgstr ""
257 253
258#: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176 254#: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176
259#: src/transport/plugin_transport_xt.c:1176 255#: src/transport/tcp_service_legacy.c:613 src/util/client.c:521
260#: src/transport/tcp_service_legacy.c:613 src/util/client.c:506 256#: src/util/service.c:1201
261#: src/util/service.c:1237
262#, c-format 257#, c-format
263msgid "UNIXPATH `%s' too long, maximum length is %llu\n" 258msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
264msgstr "" 259msgstr ""
265 260
266#: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180 261#: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180
267#: src/transport/plugin_transport_xt.c:1180 262#: src/transport/tcp_service_legacy.c:617 src/util/client.c:526
268#: src/transport/tcp_service_legacy.c:617 src/util/client.c:511 263#: src/util/service.c:1206
269#: src/util/service.c:1242
270#, fuzzy, c-format 264#, fuzzy, c-format
271msgid "Using `%s' instead\n" 265msgid "Using `%s' instead\n"
272msgstr "%s: tùy chọn « %s » là mơ hồ\n" 266msgstr "%s: tùy chọn « %s » là mơ hồ\n"
273 267
274#: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211 268#: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211
275#: src/transport/plugin_transport_xt.c:1211 269#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1242
276#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1278
277#, c-format 270#, c-format
278msgid "" 271msgid ""
279"Disabling UNIX domain socket support for service `%s', failed to create UNIX " 272"Disabling UNIX domain socket support for service `%s', failed to create UNIX "
@@ -281,8 +274,7 @@ msgid ""
281msgstr "" 274msgstr ""
282 275
283#: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228 276#: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228
284#: src/transport/plugin_transport_xt.c:1228 277#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1260
285#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1296
286#, c-format 278#, c-format
287msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n" 279msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
288msgstr "" 280msgstr ""
@@ -290,8 +282,7 @@ msgstr ""
290#: src/arm/gnunet-service-arm.c:556 282#: src/arm/gnunet-service-arm.c:556
291#: src/transport/plugin_transport_http_server.c:2688 283#: src/transport/plugin_transport_http_server.c:2688
292#: src/transport/plugin_transport_tcp.c:1259 284#: src/transport/plugin_transport_tcp.c:1259
293#: src/transport/plugin_transport_xt.c:1259 285#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1301
294#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1337
295#, fuzzy, c-format 286#, fuzzy, c-format
296msgid "Failed to resolve `%s': %s\n" 287msgid "Failed to resolve `%s': %s\n"
297msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n" 288msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
@@ -299,8 +290,7 @@ msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
299#: src/arm/gnunet-service-arm.c:575 290#: src/arm/gnunet-service-arm.c:575
300#: src/transport/plugin_transport_http_server.c:2706 291#: src/transport/plugin_transport_http_server.c:2706
301#: src/transport/plugin_transport_tcp.c:1278 292#: src/transport/plugin_transport_tcp.c:1278
302#: src/transport/plugin_transport_xt.c:1278 293#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1321
303#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1357
304#, fuzzy, c-format 294#, fuzzy, c-format
305msgid "Failed to find %saddress for `%s'.\n" 295msgid "Failed to find %saddress for `%s'.\n"
306msgstr "Lỗi đóng kết đến cổng %s %d.\n" 296msgstr "Lỗi đóng kết đến cổng %s %d.\n"
@@ -1641,6 +1631,11 @@ msgstr "Không kết nối được đến trình nền gnunetd."
1641msgid "Unable to parse ATTR record string `%s'\n" 1631msgid "Unable to parse ATTR record string `%s'\n"
1642msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n" 1632msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
1643 1633
1634#: src/credential/plugin_rest_credential.c:1128
1635#, fuzzy
1636msgid "GNS REST API initialized\n"
1637msgstr "Lỗi sơ khởi lõi.\n"
1638
1644#: src/datacache/datacache.c:119 src/datacache/datacache.c:311 1639#: src/datacache/datacache.c:119 src/datacache/datacache.c:311
1645#: src/datastore/gnunet-service-datastore.c:757 1640#: src/datastore/gnunet-service-datastore.c:757
1646#, fuzzy 1641#, fuzzy
@@ -2164,7 +2159,7 @@ msgstr ""
2164msgid "Exiting as the number of peers is %u\n" 2159msgid "Exiting as the number of peers is %u\n"
2165msgstr "tăng sổ tối đa các kết nối TCP/IP" 2160msgstr "tăng sổ tối đa các kết nối TCP/IP"
2166 2161
2167#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2959 2162#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2981
2168#, fuzzy 2163#, fuzzy
2169msgid "number of peers to start" 2164msgid "number of peers to start"
2170msgstr "số lần lặp lại" 2165msgstr "số lần lặp lại"
@@ -3275,11 +3270,11 @@ msgstr "Phải ghi rõ chỉ một tên tập tin để chèn.\n"
3275msgid "set the desired LEVEL of sender-anonymity" 3270msgid "set the desired LEVEL of sender-anonymity"
3276msgstr "đặt CẤP mong muốn của tình trạng nặc danh của người gửi" 3271msgstr "đặt CẤP mong muốn của tình trạng nặc danh của người gửi"
3277 3272
3278#: src/fs/gnunet-auto-share.c:772 src/fs/gnunet-publish.c:907 3273#: src/fs/gnunet-auto-share.c:772
3279msgid "disable adding the creation time to the metadata of the uploaded file" 3274msgid "disable adding the creation time to the metadata of the uploaded file"
3280msgstr "tắt thêm giờ tạo vào siêu dữ liệu của tập tin đã tải lên" 3275msgstr "tắt thêm giờ tạo vào siêu dữ liệu của tập tin đã tải lên"
3281 3276
3282#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:912 3277#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:907
3283msgid "do not use libextractor to add keywords or metadata" 3278msgid "do not use libextractor to add keywords or metadata"
3284msgstr "" 3279msgstr ""
3285 3280
@@ -3589,6 +3584,11 @@ msgstr "Tùy chọn « %s » cần thiết khi dùng tùy chọn « %s ».\n"
3589msgid "Option `%s' makes no sense without option `%s'.\n" 3584msgid "Option `%s' makes no sense without option `%s'.\n"
3590msgstr "Tùy chọn « %s » không có nghĩa khi không có tùy chọn « %s ».\n" 3585msgstr "Tùy chọn « %s » không có nghĩa khi không có tùy chọn « %s ».\n"
3591 3586
3587#: src/fs/gnunet-publish.c:911
3588#, fuzzy
3589msgid "enable adding the creation time to the metadata of the uploaded file"
3590msgstr "tắt thêm giờ tạo vào siêu dữ liệu của tập tin đã tải lên"
3591
3592#: src/fs/gnunet-publish.c:916 3592#: src/fs/gnunet-publish.c:916
3593msgid "" 3593msgid ""
3594"print list of extracted keywords that would be used, but do not perform " 3594"print list of extracted keywords that would be used, but do not perform "
@@ -4110,40 +4110,40 @@ msgstr ""
4110msgid "GNUnet HTTP server to create business cards" 4110msgid "GNUnet HTTP server to create business cards"
4111msgstr "" 4111msgstr ""
4112 4112
4113#: src/gns/gnunet-dns2gns.c:203 4113#: src/gns/gnunet-dns2gns.c:214
4114#, fuzzy 4114#, fuzzy
4115msgid "Failed to pack DNS response into UDP packet!\n" 4115msgid "Failed to pack DNS response into UDP packet!\n"
4116msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n" 4116msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
4117 4117
4118#: src/gns/gnunet-dns2gns.c:405 4118#: src/gns/gnunet-dns2gns.c:416
4119#, c-format 4119#, c-format
4120msgid "Cannot parse DNS request from %s\n" 4120msgid "Cannot parse DNS request from %s\n"
4121msgstr "" 4121msgstr ""
4122 4122
4123#: src/gns/gnunet-dns2gns.c:421 4123#: src/gns/gnunet-dns2gns.c:432
4124#, fuzzy, c-format 4124#, fuzzy, c-format
4125msgid "Received malformed DNS request from %s\n" 4125msgid "Received malformed DNS request from %s\n"
4126msgstr "Nhận yêu cầu định tuyến\n" 4126msgstr "Nhận yêu cầu định tuyến\n"
4127 4127
4128#: src/gns/gnunet-dns2gns.c:429 4128#: src/gns/gnunet-dns2gns.c:440
4129#, fuzzy, c-format 4129#, fuzzy, c-format
4130msgid "Received unsupported DNS request from %s\n" 4130msgid "Received unsupported DNS request from %s\n"
4131msgstr "Nhận yêu cầu định tuyến\n" 4131msgstr "Nhận yêu cầu định tuyến\n"
4132 4132
4133#: src/gns/gnunet-dns2gns.c:588 4133#: src/gns/gnunet-dns2gns.c:600
4134#, fuzzy 4134#, fuzzy
4135msgid "No DNS server specified!\n" 4135msgid "No DNS server specified!\n"
4136msgstr "Chưa ghi rõ từ khoá.\n" 4136msgstr "Chưa ghi rõ từ khoá.\n"
4137 4137
4138#: src/gns/gnunet-dns2gns.c:688 4138#: src/gns/gnunet-dns2gns.c:748
4139msgid "IP of recursive DNS resolver to use (required)" 4139msgid "IP of recursive DNS resolver to use (required)"
4140msgstr "" 4140msgstr ""
4141 4141
4142#: src/gns/gnunet-dns2gns.c:693 4142#: src/gns/gnunet-dns2gns.c:753
4143msgid "UDP port to listen on for inbound DNS requests; default: 2853" 4143msgid "UDP port to listen on for inbound DNS requests; default: 2853"
4144msgstr "" 4144msgstr ""
4145 4145
4146#: src/gns/gnunet-dns2gns.c:710 4146#: src/gns/gnunet-dns2gns.c:770
4147msgid "GNUnet DNS-to-GNS proxy (a DNS server)" 4147msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
4148msgstr "" 4148msgstr ""
4149 4149
@@ -4216,104 +4216,104 @@ msgstr ""
4216msgid "%s failed at %s:%d: `%s'\n" 4216msgid "%s failed at %s:%d: `%s'\n"
4217msgstr "%s bị lỗi tại %s:%d: « %s »\n" 4217msgstr "%s bị lỗi tại %s:%d: « %s »\n"
4218 4218
4219#: src/gns/gnunet-gns-proxy.c:980 4219#: src/gns/gnunet-gns-proxy.c:989
4220#, fuzzy, c-format 4220#, fuzzy, c-format
4221msgid "Unsupported CURL TLS backend %d\n" 4221msgid "Unsupported CURL TLS backend %d\n"
4222msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n" 4222msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
4223 4223
4224#: src/gns/gnunet-gns-proxy.c:1005 4224#: src/gns/gnunet-gns-proxy.c:1014
4225#, fuzzy, c-format 4225#, fuzzy, c-format
4226msgid "Failed to fetch CN from cert: %s\n" 4226msgid "Failed to fetch CN from cert: %s\n"
4227msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n" 4227msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
4228 4228
4229#: src/gns/gnunet-gns-proxy.c:1026 4229#: src/gns/gnunet-gns-proxy.c:1035
4230#, fuzzy, c-format 4230#, fuzzy, c-format
4231msgid "Failed to initialize DANE: %s\n" 4231msgid "Failed to initialize DANE: %s\n"
4232msgstr "Không thể sơ khởi SQLite: %s.\n" 4232msgstr "Không thể sơ khởi SQLite: %s.\n"
4233 4233
4234#: src/gns/gnunet-gns-proxy.c:1041 4234#: src/gns/gnunet-gns-proxy.c:1050
4235#, fuzzy, c-format 4235#, fuzzy, c-format
4236msgid "Failed to parse DANE record: %s\n" 4236msgid "Failed to parse DANE record: %s\n"
4237msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n" 4237msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
4238 4238
4239#: src/gns/gnunet-gns-proxy.c:1056 4239#: src/gns/gnunet-gns-proxy.c:1065
4240#, fuzzy, c-format 4240#, fuzzy, c-format
4241msgid "Failed to verify TLS connection using DANE: %s\n" 4241msgid "Failed to verify TLS connection using DANE: %s\n"
4242msgstr "Không thể lưu tập tin cấu hình « %s »:" 4242msgstr "Không thể lưu tập tin cấu hình « %s »:"
4243 4243
4244#: src/gns/gnunet-gns-proxy.c:1066 4244#: src/gns/gnunet-gns-proxy.c:1075
4245#, c-format 4245#, c-format
4246msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n" 4246msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
4247msgstr "" 4247msgstr ""
4248 4248
4249#: src/gns/gnunet-gns-proxy.c:1090 4249#: src/gns/gnunet-gns-proxy.c:1099
4250#, c-format 4250#, c-format
4251msgid "TLS certificate subject name (%s) does not match `%s': %d\n" 4251msgid "TLS certificate subject name (%s) does not match `%s': %d\n"
4252msgstr "" 4252msgstr ""
4253 4253
4254#: src/gns/gnunet-gns-proxy.c:1221 4254#: src/gns/gnunet-gns-proxy.c:1230
4255#, c-format 4255#, c-format
4256msgid "Cookie domain `%s' supplied by server is invalid\n" 4256msgid "Cookie domain `%s' supplied by server is invalid\n"
4257msgstr "" 4257msgstr ""
4258 4258
4259#: src/gns/gnunet-gns-proxy.c:2122 4259#: src/gns/gnunet-gns-proxy.c:2131
4260#, fuzzy, c-format 4260#, fuzzy, c-format
4261msgid "Unsupported HTTP method `%s'\n" 4261msgid "Unsupported HTTP method `%s'\n"
4262msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n" 4262msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
4263 4263
4264#: src/gns/gnunet-gns-proxy.c:2643 4264#: src/gns/gnunet-gns-proxy.c:2652
4265#, fuzzy, c-format 4265#, fuzzy, c-format
4266msgid "Unable to import private key from file `%s'\n" 4266msgid "Unable to import private key from file `%s'\n"
4267msgstr "Không thể tạo tài khoản người dùng:" 4267msgstr "Không thể tạo tài khoản người dùng:"
4268 4268
4269#: src/gns/gnunet-gns-proxy.c:2675 4269#: src/gns/gnunet-gns-proxy.c:2684
4270#, fuzzy, c-format 4270#, fuzzy, c-format
4271msgid "Unable to import certificate from `%s'\n" 4271msgid "Unable to import certificate from `%s'\n"
4272msgstr "Không thể lưu tập tin cấu hình « %s »:" 4272msgstr "Không thể lưu tập tin cấu hình « %s »:"
4273 4273
4274#: src/gns/gnunet-gns-proxy.c:2876 4274#: src/gns/gnunet-gns-proxy.c:2885
4275#, fuzzy, c-format 4275#, fuzzy, c-format
4276msgid "Failed to start HTTPS server for `%s'\n" 4276msgid "Failed to start HTTPS server for `%s'\n"
4277msgstr "Lỗi bắt đầu thu thập.\n" 4277msgstr "Lỗi bắt đầu thu thập.\n"
4278 4278
4279#: src/gns/gnunet-gns-proxy.c:2898 src/rest/gnunet-rest-server.c:658 4279#: src/gns/gnunet-gns-proxy.c:2907 src/rest/gnunet-rest-server.c:668
4280#, fuzzy 4280#, fuzzy
4281msgid "Failed to pass client to MHD\n" 4281msgid "Failed to pass client to MHD\n"
4282msgstr "Lỗi kết nối đến gnunetd.\n" 4282msgstr "Lỗi kết nối đến gnunetd.\n"
4283 4283
4284#: src/gns/gnunet-gns-proxy.c:3234 4284#: src/gns/gnunet-gns-proxy.c:3243
4285#, fuzzy, c-format 4285#, fuzzy, c-format
4286msgid "Unsupported socks version %d\n" 4286msgid "Unsupported socks version %d\n"
4287msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n" 4287msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
4288 4288
4289#: src/gns/gnunet-gns-proxy.c:3263 4289#: src/gns/gnunet-gns-proxy.c:3272
4290#, fuzzy, c-format 4290#, fuzzy, c-format
4291msgid "Unsupported socks command %d\n" 4291msgid "Unsupported socks command %d\n"
4292msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n" 4292msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
4293 4293
4294#: src/gns/gnunet-gns-proxy.c:3346 4294#: src/gns/gnunet-gns-proxy.c:3355
4295#, fuzzy, c-format 4295#, fuzzy, c-format
4296msgid "Unsupported socks address type %d\n" 4296msgid "Unsupported socks address type %d\n"
4297msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n" 4297msgstr "Lệnh không được hỗ trợ « %s ». Đang hủy bỏ.\n"
4298 4298
4299#: src/gns/gnunet-gns-proxy.c:3636 4299#: src/gns/gnunet-gns-proxy.c:3693
4300#, fuzzy, c-format 4300#, fuzzy, c-format
4301msgid "Failed to load X.509 key and certificate from `%s'\n" 4301msgid "Failed to load X.509 key and certificate from `%s'\n"
4302msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n" 4302msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
4303 4303
4304#: src/gns/gnunet-gns-proxy.c:3764 4304#: src/gns/gnunet-gns-proxy.c:3821
4305msgid "listen on specified port (default: 7777)" 4305msgid "listen on specified port (default: 7777)"
4306msgstr "" 4306msgstr ""
4307 4307
4308#: src/gns/gnunet-gns-proxy.c:3769 4308#: src/gns/gnunet-gns-proxy.c:3826
4309msgid "pem file to use as CA" 4309msgid "pem file to use as CA"
4310msgstr "" 4310msgstr ""
4311 4311
4312#: src/gns/gnunet-gns-proxy.c:3773 4312#: src/gns/gnunet-gns-proxy.c:3830
4313msgid "disable use of IPv6" 4313msgid "disable use of IPv6"
4314msgstr "" 4314msgstr ""
4315 4315
4316#: src/gns/gnunet-gns-proxy.c:3799 4316#: src/gns/gnunet-gns-proxy.c:3856
4317msgid "GNUnet GNS proxy" 4317msgid "GNUnet GNS proxy"
4318msgstr "" 4318msgstr ""
4319 4319
@@ -4423,6 +4423,11 @@ msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
4423msgid "Unable to parse BOX record string `%s'\n" 4423msgid "Unable to parse BOX record string `%s'\n"
4424msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n" 4424msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
4425 4425
4426#: src/gns/plugin_rest_gns.c:452
4427#, fuzzy
4428msgid "Gns REST API initialized\n"
4429msgstr "Lỗi sơ khởi lõi.\n"
4430
4426#: src/gnsrecord/plugin_gnsrecord_dns.c:359 4431#: src/gnsrecord/plugin_gnsrecord_dns.c:359
4427#, fuzzy, c-format 4432#, fuzzy, c-format
4428msgid "Unable to parse IPv4 address `%s'\n" 4433msgid "Unable to parse IPv4 address `%s'\n"
@@ -4952,6 +4957,11 @@ msgstr "Không thể lưu tập tin cấu hình « %s »:"
4952msgid "Failed to create directory `%s' for storing egos\n" 4957msgid "Failed to create directory `%s' for storing egos\n"
4953msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n" 4958msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
4954 4959
4960#: src/identity/plugin_rest_identity.c:1297
4961#, fuzzy
4962msgid "Identity REST API initialized\n"
4963msgstr "Lỗi sơ khởi lõi.\n"
4964
4955#: src/json/json.c:123 4965#: src/json/json.c:123
4956#, fuzzy, c-format 4966#, fuzzy, c-format
4957msgid "Failed to parse JSON in option `%s': %s (%s)\n" 4967msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -5350,6 +5360,11 @@ msgstr ""
5350msgid "heap file database running\n" 5360msgid "heap file database running\n"
5351msgstr "kho dữ liệu sqlite" 5361msgstr "kho dữ liệu sqlite"
5352 5362
5363#: src/namestore/plugin_rest_namestore.c:1079
5364#, fuzzy
5365msgid "Namestore REST API initialized\n"
5366msgstr "Lỗi sơ khởi lõi.\n"
5367
5353#: src/nat-auto/gnunet-nat-auto.c:193 5368#: src/nat-auto/gnunet-nat-auto.c:193
5354#, fuzzy 5369#, fuzzy
5355msgid "Suggested configuration changes:\n" 5370msgid "Suggested configuration changes:\n"
@@ -5739,7 +5754,7 @@ msgid "\tExpires: %s \t %s\n"
5739msgstr "" 5754msgstr ""
5740 5755
5741#: src/peerinfo-tool/gnunet-peerinfo.c:299 5756#: src/peerinfo-tool/gnunet-peerinfo.c:299
5742#: src/rest-plugins/plugin_rest_peerinfo.c:501 5757#: src/peerinfo-tool/plugin_rest_peerinfo.c:501
5743#, fuzzy, c-format 5758#, fuzzy, c-format
5744msgid "Failure: Cannot convert address to string for peer `%s'\n" 5759msgid "Failure: Cannot convert address to string for peer `%s'\n"
5745msgstr "Lỗi đóng kết đến cổng %s %d.\n" 5760msgstr "Lỗi đóng kết đến cổng %s %d.\n"
@@ -5820,6 +5835,11 @@ msgstr "Đang nạp các truyền tải « %s »\n"
5820msgid "Failed to load transport plugin for `%s'\n" 5835msgid "Failed to load transport plugin for `%s'\n"
5821msgstr "Không thể nạp phần bổ sung truyền tải « %s »\n" 5836msgstr "Không thể nạp phần bổ sung truyền tải « %s »\n"
5822 5837
5838#: src/peerinfo-tool/plugin_rest_peerinfo.c:796
5839#, fuzzy
5840msgid "Peerinfo REST API initialized\n"
5841msgstr "Lỗi sơ khởi lõi.\n"
5842
5823#: src/peerstore/gnunet-peerstore.c:91 5843#: src/peerstore/gnunet-peerstore.c:91
5824msgid "peerstore" 5844msgid "peerstore"
5825msgstr "" 5845msgstr ""
@@ -5985,6 +6005,12 @@ msgstr ""
5985msgid "Expiration interval of the attribute" 6005msgid "Expiration interval of the attribute"
5986msgstr "" 6006msgstr ""
5987 6007
6008#: src/reclaim/plugin_rest_openid_connect.c:2279
6009#: src/reclaim/plugin_rest_reclaim.c:1079
6010#, fuzzy
6011msgid "Identity Provider REST API initialized\n"
6012msgstr "Lỗi sơ khởi lõi.\n"
6013
5988#: src/reclaim/reclaim_api.c:436 6014#: src/reclaim/reclaim_api.c:436
5989#, fuzzy 6015#, fuzzy
5990msgid "failed to store record\n" 6016msgid "failed to store record\n"
@@ -6079,51 +6105,20 @@ msgstr "« %s » không phải là một tập tin.\n"
6079msgid "Search string `%s' is too long!\n" 6105msgid "Search string `%s' is too long!\n"
6080msgstr "« %s » không phải là một tập tin.\n" 6106msgstr "« %s » không phải là một tập tin.\n"
6081 6107
6082#: src/rest/gnunet-rest-server.c:927 6108#: src/rest/gnunet-rest-server.c:986
6083msgid "listen on specified port (default: 7776)" 6109msgid "listen on specified port (default: 7776)"
6084msgstr "" 6110msgstr ""
6085 6111
6086#: src/rest/gnunet-rest-server.c:944 6112#: src/rest/gnunet-rest-server.c:1003
6087#, fuzzy 6113#, fuzzy
6088msgid "GNUnet REST server" 6114msgid "GNUnet REST server"
6089msgstr "Bản ghi lỗi GNUnet" 6115msgstr "Bản ghi lỗi GNUnet"
6090 6116
6091#: src/rest-plugins/plugin_rest_copying.c:209 6117#: src/rest/plugin_rest_copying.c:209
6092#, fuzzy 6118#, fuzzy
6093msgid "COPYING REST API initialized\n" 6119msgid "COPYING REST API initialized\n"
6094msgstr "Lỗi sơ khởi lõi.\n" 6120msgstr "Lỗi sơ khởi lõi.\n"
6095 6121
6096#: src/rest-plugins/plugin_rest_credential.c:1128
6097#, fuzzy
6098msgid "GNS REST API initialized\n"
6099msgstr "Lỗi sơ khởi lõi.\n"
6100
6101#: src/rest-plugins/plugin_rest_gns.c:452
6102#, fuzzy
6103msgid "Gns REST API initialized\n"
6104msgstr "Lỗi sơ khởi lõi.\n"
6105
6106#: src/rest-plugins/plugin_rest_identity.c:1297
6107#, fuzzy
6108msgid "Identity REST API initialized\n"
6109msgstr "Lỗi sơ khởi lõi.\n"
6110
6111#: src/rest-plugins/plugin_rest_namestore.c:1079
6112#, fuzzy
6113msgid "Namestore REST API initialized\n"
6114msgstr "Lỗi sơ khởi lõi.\n"
6115
6116#: src/rest-plugins/plugin_rest_openid_connect.c:2279
6117#: src/rest-plugins/plugin_rest_reclaim.c:1079
6118#, fuzzy
6119msgid "Identity Provider REST API initialized\n"
6120msgstr "Lỗi sơ khởi lõi.\n"
6121
6122#: src/rest-plugins/plugin_rest_peerinfo.c:796
6123#, fuzzy
6124msgid "Peerinfo REST API initialized\n"
6125msgstr "Lỗi sơ khởi lõi.\n"
6126
6127#: src/revocation/gnunet-revocation.c:129 6122#: src/revocation/gnunet-revocation.c:129
6128#, fuzzy, c-format 6123#, fuzzy, c-format
6129msgid "Key `%s' is valid\n" 6124msgid "Key `%s' is valid\n"
@@ -6274,21 +6269,21 @@ msgstr ""
6274msgid "Get peers from biased stream" 6269msgid "Get peers from biased stream"
6275msgstr "" 6270msgstr ""
6276 6271
6277#: src/rps/gnunet-rps-profiler.c:2964 6272#: src/rps/gnunet-rps-profiler.c:2986
6278msgid "duration of the profiling" 6273msgid "duration of the profiling"
6279msgstr "" 6274msgstr ""
6280 6275
6281#: src/rps/gnunet-rps-profiler.c:2969 6276#: src/rps/gnunet-rps-profiler.c:2991
6282#, fuzzy 6277#, fuzzy
6283msgid "timeout for the profiling" 6278msgid "timeout for the profiling"
6284msgstr "xác định mức ưu tiên của nội dung" 6279msgstr "xác định mức ưu tiên của nội dung"
6285 6280
6286#: src/rps/gnunet-rps-profiler.c:2974 6281#: src/rps/gnunet-rps-profiler.c:2996
6287#, fuzzy 6282#, fuzzy
6288msgid "number of PeerIDs to request" 6283msgid "number of PeerIDs to request"
6289msgstr "số lần lặp lại" 6284msgstr "số lần lặp lại"
6290 6285
6291#: src/rps/gnunet-rps-profiler.c:2990 6286#: src/rps/gnunet-rps-profiler.c:3012
6292#, fuzzy 6287#, fuzzy
6293msgid "Measure quality and performance of the RPS service." 6288msgid "Measure quality and performance of the RPS service."
6294msgstr "Không thể truy cập đến dịch vụ" 6289msgstr "Không thể truy cập đến dịch vụ"
@@ -7018,19 +7013,19 @@ msgstr "# các thông báo PONG đã mật mã được nhận"
7018msgid "GNUnet topology control" 7013msgid "GNUnet topology control"
7019msgstr "" 7014msgstr ""
7020 7015
7021#: src/transport/gnunet-communicator-tcp.c:2329 7016#: src/transport/gnunet-communicator-tcp.c:2328
7022#: src/transport/gnunet-communicator-udp.c:2883 7017#: src/transport/gnunet-communicator-udp.c:2882
7023#: src/transport/gnunet-service-tng.c:4747 7018#: src/transport/gnunet-service-tng.c:4888
7024#: src/transport/gnunet-service-transport.c:2795 7019#: src/transport/gnunet-service-transport.c:2795
7025#, fuzzy 7020#, fuzzy
7026msgid "Transport service is lacking key configuration settings. Exiting.\n" 7021msgid "Transport service is lacking key configuration settings. Exiting.\n"
7027msgstr "Lưu cấu hình ngay bây giờ không?" 7022msgstr "Lưu cấu hình ngay bây giờ không?"
7028 7023
7029#: src/transport/gnunet-communicator-tcp.c:2393 7024#: src/transport/gnunet-communicator-tcp.c:2392
7030msgid "GNUnet TCP communicator" 7025msgid "GNUnet TCP communicator"
7031msgstr "" 7026msgstr ""
7032 7027
7033#: src/transport/gnunet-communicator-udp.c:2954 7028#: src/transport/gnunet-communicator-udp.c:2953
7034msgid "GNUnet UDP communicator" 7029msgid "GNUnet UDP communicator"
7035msgstr "" 7030msgstr ""
7036 7031
@@ -7629,8 +7624,6 @@ msgstr "kích cỡ tin nhắn"
7629#: src/transport/plugin_transport_http_server.c:3530 7624#: src/transport/plugin_transport_http_server.c:3530
7630#: src/transport/plugin_transport_tcp.c:3901 7625#: src/transport/plugin_transport_tcp.c:3901
7631#: src/transport/plugin_transport_tcp.c:3908 7626#: src/transport/plugin_transport_tcp.c:3908
7632#: src/transport/plugin_transport_xt.c:3899
7633#: src/transport/plugin_transport_xt.c:3906
7634msgid "TCP_STEALTH not supported on this platform.\n" 7627msgid "TCP_STEALTH not supported on this platform.\n"
7635msgstr "" 7628msgstr ""
7636 7629
@@ -7701,7 +7694,6 @@ msgstr ""
7701 7694
7702#: src/transport/plugin_transport_http_server.c:2905 7695#: src/transport/plugin_transport_http_server.c:2905
7703#: src/transport/plugin_transport_udp.c:3627 7696#: src/transport/plugin_transport_udp.c:3627
7704#: src/transport/plugin_transport_xu.c:2049
7705msgid "Disabling IPv6 since it is not supported on this system!\n" 7697msgid "Disabling IPv6 since it is not supported on this system!\n"
7706msgstr "" 7698msgstr ""
7707 7699
@@ -7805,8 +7797,6 @@ msgstr "# các byte loại đi bởi SMTP (đi ra)"
7805 7797
7806#: src/transport/plugin_transport_tcp.c:1557 7798#: src/transport/plugin_transport_tcp.c:1557
7807#: src/transport/plugin_transport_tcp.c:2883 7799#: src/transport/plugin_transport_tcp.c:2883
7808#: src/transport/plugin_transport_xt.c:1553
7809#: src/transport/plugin_transport_xt.c:2879
7810#, fuzzy, c-format 7800#, fuzzy, c-format
7811msgid "Unexpected address length: %u bytes\n" 7801msgid "Unexpected address length: %u bytes\n"
7812msgstr "Gặp sự kiện bất thường: %d\n" 7802msgstr "Gặp sự kiện bất thường: %d\n"
@@ -7815,9 +7805,6 @@ msgstr "Gặp sự kiện bất thường: %d\n"
7815#: src/transport/plugin_transport_tcp.c:1964 7805#: src/transport/plugin_transport_tcp.c:1964
7816#: src/transport/plugin_transport_tcp.c:3147 7806#: src/transport/plugin_transport_tcp.c:3147
7817#: src/transport/plugin_transport_tcp.c:4024 7807#: src/transport/plugin_transport_tcp.c:4024
7818#: src/transport/plugin_transport_xt.c:1736
7819#: src/transport/plugin_transport_xt.c:1960
7820#: src/transport/plugin_transport_xt.c:3143
7821#, fuzzy 7808#, fuzzy
7822msgid "# TCP sessions active" 7809msgid "# TCP sessions active"
7823msgstr "# các khoá phiên chạy được chấp nhận" 7810msgstr "# các khoá phiên chạy được chấp nhận"
@@ -7828,91 +7815,70 @@ msgstr "# các khoá phiên chạy được chấp nhận"
7828#: src/transport/plugin_transport_tcp.c:2143 7815#: src/transport/plugin_transport_tcp.c:2143
7829#: src/transport/plugin_transport_tcp.c:2243 7816#: src/transport/plugin_transport_tcp.c:2243
7830#: src/transport/plugin_transport_tcp.c:2268 7817#: src/transport/plugin_transport_tcp.c:2268
7831#: src/transport/plugin_transport_xt.c:1778
7832#: src/transport/plugin_transport_xt.c:1942
7833#: src/transport/plugin_transport_xt.c:2066
7834#: src/transport/plugin_transport_xt.c:2139
7835#: src/transport/plugin_transport_xt.c:2239
7836#: src/transport/plugin_transport_xt.c:2264
7837#, fuzzy 7818#, fuzzy
7838msgid "# bytes currently in TCP buffers" 7819msgid "# bytes currently in TCP buffers"
7839msgstr "# các byte đã gừi qua TCP" 7820msgstr "# các byte đã gừi qua TCP"
7840 7821
7841#: src/transport/plugin_transport_tcp.c:1785 7822#: src/transport/plugin_transport_tcp.c:1785
7842#: src/transport/plugin_transport_xt.c:1781
7843#, fuzzy 7823#, fuzzy
7844msgid "# bytes discarded by TCP (disconnect)" 7824msgid "# bytes discarded by TCP (disconnect)"
7845msgstr "# các byte loại đi bởi TCP (đi ra)" 7825msgstr "# các byte loại đi bởi TCP (đi ra)"
7846 7826
7847#: src/transport/plugin_transport_tcp.c:2073 7827#: src/transport/plugin_transport_tcp.c:2073
7848#: src/transport/plugin_transport_xt.c:2069
7849#, fuzzy 7828#, fuzzy
7850msgid "# bytes discarded by TCP (timeout)" 7829msgid "# bytes discarded by TCP (timeout)"
7851msgstr "# các byte loại đi bởi TCP (đi ra)" 7830msgstr "# các byte loại đi bởi TCP (đi ra)"
7852 7831
7853#: src/transport/plugin_transport_tcp.c:2147 7832#: src/transport/plugin_transport_tcp.c:2147
7854#: src/transport/plugin_transport_xt.c:2143
7855#, fuzzy 7833#, fuzzy
7856msgid "# bytes transmitted via TCP" 7834msgid "# bytes transmitted via TCP"
7857msgstr "# các byte được gửi" 7835msgstr "# các byte được gửi"
7858 7836
7859#: src/transport/plugin_transport_tcp.c:2545 7837#: src/transport/plugin_transport_tcp.c:2545
7860#: src/transport/plugin_transport_xt.c:2541
7861msgid "# requests to create session with invalid address" 7838msgid "# requests to create session with invalid address"
7862msgstr "" 7839msgstr ""
7863 7840
7864#: src/transport/plugin_transport_tcp.c:2721 7841#: src/transport/plugin_transport_tcp.c:2721
7865#: src/transport/plugin_transport_xt.c:2717
7866msgid "# transport-service disconnect requests for TCP" 7842msgid "# transport-service disconnect requests for TCP"
7867msgstr "" 7843msgstr ""
7868 7844
7869#: src/transport/plugin_transport_tcp.c:3213 7845#: src/transport/plugin_transport_tcp.c:3213
7870#: src/transport/plugin_transport_xt.c:3209
7871#, fuzzy 7846#, fuzzy
7872msgid "# TCP WELCOME messages received" 7847msgid "# TCP WELCOME messages received"
7873msgstr "# các thông báo PONG đã mật mã được nhận" 7848msgstr "# các thông báo PONG đã mật mã được nhận"
7874 7849
7875#: src/transport/plugin_transport_tcp.c:3419 7850#: src/transport/plugin_transport_tcp.c:3419
7876#: src/transport/plugin_transport_xt.c:3415
7877msgid "# bytes received via TCP" 7851msgid "# bytes received via TCP"
7878msgstr "# các byte đã nhận qua TCP" 7852msgstr "# các byte đã nhận qua TCP"
7879 7853
7880#: src/transport/plugin_transport_tcp.c:3470 7854#: src/transport/plugin_transport_tcp.c:3470
7881#: src/transport/plugin_transport_tcp.c:3528 7855#: src/transport/plugin_transport_tcp.c:3528
7882#: src/transport/plugin_transport_xt.c:3466
7883#: src/transport/plugin_transport_xt.c:3524
7884#, fuzzy 7856#, fuzzy
7885msgid "# TCP server connections active" 7857msgid "# TCP server connections active"
7886msgstr "# các kết nối dht" 7858msgstr "# các kết nối dht"
7887 7859
7888#: src/transport/plugin_transport_tcp.c:3474 7860#: src/transport/plugin_transport_tcp.c:3474
7889#: src/transport/plugin_transport_xt.c:3470
7890#, fuzzy 7861#, fuzzy
7891msgid "# TCP server connect events" 7862msgid "# TCP server connect events"
7892msgstr "# của các đồng đẳng đã kết nối" 7863msgstr "# của các đồng đẳng đã kết nối"
7893 7864
7894#: src/transport/plugin_transport_tcp.c:3480 7865#: src/transport/plugin_transport_tcp.c:3480
7895#: src/transport/plugin_transport_xt.c:3476
7896msgid "TCP connection limit reached, suspending server\n" 7866msgid "TCP connection limit reached, suspending server\n"
7897msgstr "" 7867msgstr ""
7898 7868
7899#: src/transport/plugin_transport_tcp.c:3482 7869#: src/transport/plugin_transport_tcp.c:3482
7900#: src/transport/plugin_transport_xt.c:3478
7901msgid "# TCP service suspended" 7870msgid "# TCP service suspended"
7902msgstr "" 7871msgstr ""
7903 7872
7904#: src/transport/plugin_transport_tcp.c:3522 7873#: src/transport/plugin_transport_tcp.c:3522
7905#: src/transport/plugin_transport_xt.c:3518
7906msgid "# TCP service resumed" 7874msgid "# TCP service resumed"
7907msgstr "" 7875msgstr ""
7908 7876
7909#: src/transport/plugin_transport_tcp.c:3532 7877#: src/transport/plugin_transport_tcp.c:3532
7910#: src/transport/plugin_transport_xt.c:3528
7911msgid "# network-level TCP disconnect events" 7878msgid "# network-level TCP disconnect events"
7912msgstr "" 7879msgstr ""
7913 7880
7914#: src/transport/plugin_transport_tcp.c:3851 7881#: src/transport/plugin_transport_tcp.c:3851
7915#: src/transport/plugin_transport_xt.c:3849
7916#, fuzzy 7882#, fuzzy
7917msgid "Failed to start service.\n" 7883msgid "Failed to start service.\n"
7918msgstr "Lỗi bắt đầu thu thập.\n" 7884msgstr "Lỗi bắt đầu thu thập.\n"
@@ -7966,7 +7932,6 @@ msgid "Failed to bind UDP socket to %s: %s\n"
7966msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n" 7932msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
7967 7933
7968#: src/transport/plugin_transport_udp.c:3721 7934#: src/transport/plugin_transport_udp.c:3721
7969#: src/transport/plugin_transport_xu.c:2143
7970msgid "Disabling IPv4 since it is not supported on this system!\n" 7935msgid "Disabling IPv4 since it is not supported on this system!\n"
7971msgstr "" 7936msgstr ""
7972 7937
@@ -7977,19 +7942,15 @@ msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
7977 7942
7978#: src/transport/plugin_transport_udp.c:3883 7943#: src/transport/plugin_transport_udp.c:3883
7979#: src/transport/plugin_transport_udp.c:3897 7944#: src/transport/plugin_transport_udp.c:3897
7980#: src/transport/plugin_transport_xu.c:2301
7981#: src/transport/plugin_transport_xu.c:2315
7982msgid "must be in [0,65535]" 7945msgid "must be in [0,65535]"
7983msgstr "" 7946msgstr ""
7984 7947
7985#: src/transport/plugin_transport_udp.c:3929 7948#: src/transport/plugin_transport_udp.c:3929
7986#: src/transport/plugin_transport_xu.c:2347
7987#, fuzzy 7949#, fuzzy
7988msgid "must be valid IPv4 address" 7950msgid "must be valid IPv4 address"
7989msgstr "« %s » không sẵn sàng.\n" 7951msgstr "« %s » không sẵn sàng.\n"
7990 7952
7991#: src/transport/plugin_transport_udp.c:3956 7953#: src/transport/plugin_transport_udp.c:3956
7992#: src/transport/plugin_transport_xu.c:2374
7993#, fuzzy 7954#, fuzzy
7994msgid "must be valid IPv6 address" 7955msgid "must be valid IPv6 address"
7995msgstr "« %s » không sẵn sàng.\n" 7956msgstr "« %s » không sẵn sàng.\n"
@@ -8076,54 +8037,6 @@ msgstr ""
8076msgid "# sessions allocated" 8037msgid "# sessions allocated"
8077msgstr "# các khoá phiên chạy được chấp nhận" 8038msgstr "# các khoá phiên chạy được chấp nhận"
8078 8039
8079#: src/transport/plugin_transport_xt.c:4010
8080#, c-format
8081msgid "XT transport listening on port %llu\n"
8082msgstr ""
8083
8084#: src/transport/plugin_transport_xt.c:4014
8085msgid "XT transport not listening on any port (client only)\n"
8086msgstr ""
8087
8088#: src/transport/plugin_transport_xt.c:4018
8089#, c-format
8090msgid "XT transport advertises itself as being on port %llu\n"
8091msgstr ""
8092
8093#: src/transport/plugin_transport_xt.c:4022
8094#, fuzzy
8095msgid "# XT sessions active"
8096msgstr "# các khoá phiên chạy được chấp nhận"
8097
8098#: src/transport/plugin_transport_xu.c:1237
8099#, c-format
8100msgid ""
8101"XU could not transmit message to `%s': Network seems down, please check your "
8102"network configuration\n"
8103msgstr ""
8104
8105#: src/transport/plugin_transport_xu.c:1251
8106msgid ""
8107"XU could not transmit IPv6 message! Please check your network configuration "
8108"and disable IPv6 if your connection does not have a global IPv6 address\n"
8109msgstr ""
8110
8111#: src/transport/plugin_transport_xu.c:2125
8112#: src/transport/plugin_transport_xu.c:2224
8113#, fuzzy, c-format
8114msgid "Failed to bind XU socket to %s: %s\n"
8115msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
8116
8117#: src/transport/plugin_transport_xu.c:2234
8118#, fuzzy
8119msgid "Failed to open XU sockets\n"
8120msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
8121
8122#: src/transport/plugin_transport_xu.c:2398
8123#, fuzzy
8124msgid "Failed to create XU network sockets\n"
8125msgstr "Không thể tạo miền tên.\n"
8126
8127#: src/transport/tcp_connection_legacy.c:452 8040#: src/transport/tcp_connection_legacy.c:452
8128#, fuzzy, c-format 8041#, fuzzy, c-format
8129msgid "Access denied to `%s'\n" 8042msgid "Access denied to `%s'\n"
@@ -8134,17 +8047,17 @@ msgstr "Không đủ quyền cho « %s ».\n"
8134msgid "Accepting connection from `%s': %p\n" 8047msgid "Accepting connection from `%s': %p\n"
8135msgstr "" 8048msgstr ""
8136 8049
8137#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1666 8050#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1630
8138#, fuzzy, c-format 8051#, fuzzy, c-format
8139msgid "`%s' failed for port %d (%s).\n" 8052msgid "`%s' failed for port %d (%s).\n"
8140msgstr "« %s » thất bại cho ổ đĩa « %s »: %u\n" 8053msgstr "« %s » thất bại cho ổ đĩa « %s »: %u\n"
8141 8054
8142#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1676 8055#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1640
8143#, fuzzy, c-format 8056#, fuzzy, c-format
8144msgid "`%s' failed for port %d (%s): address already in use\n" 8057msgid "`%s' failed for port %d (%s): address already in use\n"
8145msgstr "« %s » bị lỗi cho cổng %d. Trình gnunetd có chạy chưa?\n" 8058msgstr "« %s » bị lỗi cho cổng %d. Trình gnunetd có chạy chưa?\n"
8146 8059
8147#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1682 8060#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1646
8148#, fuzzy, c-format 8061#, fuzzy, c-format
8149msgid "`%s' failed for `%s': address already in use\n" 8062msgid "`%s' failed for `%s': address already in use\n"
8150msgstr "« %s » bị lỗi cho cổng %d. Trình gnunetd có chạy chưa?\n" 8063msgstr "« %s » bị lỗi cho cổng %d. Trình gnunetd có chạy chưa?\n"
@@ -8176,17 +8089,17 @@ msgstr ""
8176msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n" 8089msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
8177msgstr "" 8090msgstr ""
8178 8091
8179#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1597 8092#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1561
8180msgid "Could not access a pre-bound socket, will try to bind myself\n" 8093msgid "Could not access a pre-bound socket, will try to bind myself\n"
8181msgstr "" 8094msgstr ""
8182 8095
8183#: src/transport/tcp_service_legacy.c:953 8096#: src/transport/tcp_service_legacy.c:953
8184#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1750 8097#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1714
8185#, c-format 8098#, c-format
8186msgid "Specified value for `%s' of service `%s' is invalid\n" 8099msgid "Specified value for `%s' of service `%s' is invalid\n"
8187msgstr "" 8100msgstr ""
8188 8101
8189#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1783 8102#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1747
8190#, c-format 8103#, c-format
8191msgid "Could not access pre-bound socket %u, will try to bind myself\n" 8104msgid "Could not access pre-bound socket %u, will try to bind myself\n"
8192msgstr "" 8105msgstr ""
@@ -8201,44 +8114,44 @@ msgstr "Lỗi chạy %s: %s %d\n"
8201msgid "Service `%s' runs at %s\n" 8114msgid "Service `%s' runs at %s\n"
8202msgstr "Đồng đẳng « %s » có mức tin cậy %8u\n" 8115msgstr "Đồng đẳng « %s » có mức tin cậy %8u\n"
8203 8116
8204#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2057 8117#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2021
8205msgid "Service process failed to initialize\n" 8118msgid "Service process failed to initialize\n"
8206msgstr "" 8119msgstr ""
8207 8120
8208#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2061 8121#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2025
8209msgid "Service process could not initialize server function\n" 8122msgid "Service process could not initialize server function\n"
8210msgstr "" 8123msgstr ""
8211 8124
8212#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2065 8125#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2029
8213msgid "Service process failed to report status\n" 8126msgid "Service process failed to report status\n"
8214msgstr "" 8127msgstr ""
8215 8128
8216#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535 8129#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535
8217#: src/util/service.c:1935 8130#: src/util/service.c:1899
8218#, c-format 8131#, c-format
8219msgid "Cannot obtain information about user `%s': %s\n" 8132msgid "Cannot obtain information about user `%s': %s\n"
8220msgstr "Không thể lấy thông tin về người dùng « %s »: %s\n" 8133msgstr "Không thể lấy thông tin về người dùng « %s »: %s\n"
8221 8134
8222#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1937 8135#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1901
8223msgid "No such user" 8136msgid "No such user"
8224msgstr "Không có người dùng như vậy" 8137msgstr "Không có người dùng như vậy"
8225 8138
8226#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1956 8139#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1920
8227#, c-format 8140#, c-format
8228msgid "Cannot change user/group to `%s': %s\n" 8141msgid "Cannot change user/group to `%s': %s\n"
8229msgstr "Không thể thay đổi người dùng/nhóm thành « %s »: %s\n" 8142msgstr "Không thể thay đổi người dùng/nhóm thành « %s »: %s\n"
8230 8143
8231#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2318 8144#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2282
8232msgid "do daemonize (detach from terminal)" 8145msgid "do daemonize (detach from terminal)"
8233msgstr "" 8146msgstr ""
8234 8147
8235#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2382 8148#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2346
8236#: src/util/service.c:2397 8149#: src/util/service.c:2361
8237#, fuzzy, c-format 8150#, fuzzy, c-format
8238msgid "Malformed configuration file `%s', exit ...\n" 8151msgid "Malformed configuration file `%s', exit ...\n"
8239msgstr "Không thể lưu tập tin cấu hình « %s »:" 8152msgstr "Không thể lưu tập tin cấu hình « %s »:"
8240 8153
8241#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2409 8154#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2373
8242#, fuzzy 8155#, fuzzy
8243msgid "Malformed configuration, exit ...\n" 8156msgid "Malformed configuration, exit ...\n"
8244msgstr "Không thể lưu tập tin cấu hình « %s »:" 8157msgstr "Không thể lưu tập tin cấu hình « %s »:"
@@ -8281,11 +8194,11 @@ msgstr ""
8281msgid "Metadata `%s' failed to deserialize" 8194msgid "Metadata `%s' failed to deserialize"
8282msgstr "" 8195msgstr ""
8283 8196
8284#: src/util/client.c:734 8197#: src/util/client.c:749
8285msgid "not a valid filename" 8198msgid "not a valid filename"
8286msgstr "" 8199msgstr ""
8287 8200
8288#: src/util/client.c:925 8201#: src/util/client.c:941
8289#, c-format 8202#, c-format
8290msgid "Need a non-empty hostname for service `%s'.\n" 8203msgid "Need a non-empty hostname for service `%s'.\n"
8291msgstr "" 8204msgstr ""
@@ -8579,7 +8492,7 @@ msgstr ""
8579msgid "print this help" 8492msgid "print this help"
8580msgstr "hiển thị trợ giúp này" 8493msgstr "hiển thị trợ giúp này"
8581 8494
8582#: src/util/getopt_helpers.c:282 8495#: src/util/getopt_helpers.c:282 src/util/gnunet-qr.c:300
8583msgid "be verbose" 8496msgid "be verbose"
8584msgstr "xuất chi tiết" 8497msgstr "xuất chi tiết"
8585 8498
@@ -8628,52 +8541,52 @@ msgstr "Phải gửi một con số cho tùy chọn « %s ».\n"
8628msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n" 8541msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n"
8629msgstr "" 8542msgstr ""
8630 8543
8631#: src/util/gnunet-config.c:160 8544#: src/util/gnunet-config.c:161
8632#, fuzzy, c-format 8545#, fuzzy, c-format
8633msgid "failed to load configuration defaults" 8546msgid "failed to load configuration defaults"
8634msgstr "Không thể lưu tập tin cấu hình « %s »:" 8547msgstr "Không thể lưu tập tin cấu hình « %s »:"
8635 8548
8636#: src/util/gnunet-config.c:173 8549#: src/util/gnunet-config.c:174
8637#, fuzzy, c-format 8550#, fuzzy, c-format
8638msgid "%s or %s argument is required\n" 8551msgid "%s or %s argument is required\n"
8639msgstr "đặt tên hiệu cần dùng (cần thiết)" 8552msgstr "đặt tên hiệu cần dùng (cần thiết)"
8640 8553
8641#: src/util/gnunet-config.c:181 8554#: src/util/gnunet-config.c:182
8642#, c-format 8555#, c-format
8643msgid "The following sections are available:\n" 8556msgid "The following sections are available:\n"
8644msgstr "" 8557msgstr ""
8645 8558
8646#: src/util/gnunet-config.c:232 8559#: src/util/gnunet-config.c:234
8647#, c-format 8560#, c-format
8648msgid "--option argument required to set value\n" 8561msgid "--option argument required to set value\n"
8649msgstr "" 8562msgstr ""
8650 8563
8651#: src/util/gnunet-config.c:286 8564#: src/util/gnunet-config.c:288
8652msgid "obtain option of value as a filename (with $-expansion)" 8565msgid "interpret option value as a filename (with $-expansion)"
8653msgstr "" 8566msgstr ""
8654 8567
8655#: src/util/gnunet-config.c:291 8568#: src/util/gnunet-config.c:293
8656msgid "name of the section to access" 8569msgid "name of the section to access"
8657msgstr "" 8570msgstr ""
8658 8571
8659#: src/util/gnunet-config.c:296 8572#: src/util/gnunet-config.c:298
8660msgid "name of the option to access" 8573msgid "name of the option to access"
8661msgstr "" 8574msgstr ""
8662 8575
8663#: src/util/gnunet-config.c:301 8576#: src/util/gnunet-config.c:303
8664msgid "value to set" 8577msgid "value to set"
8665msgstr "" 8578msgstr ""
8666 8579
8667#: src/util/gnunet-config.c:305 8580#: src/util/gnunet-config.c:307
8668#, fuzzy 8581#, fuzzy
8669msgid "print available configuration sections" 8582msgid "print available configuration sections"
8670msgstr "Lưu cấu hình ngay bây giờ không?" 8583msgstr "Lưu cấu hình ngay bây giờ không?"
8671 8584
8672#: src/util/gnunet-config.c:309 8585#: src/util/gnunet-config.c:311
8673msgid "write configuration file that only contains delta to defaults" 8586msgid "write configuration file that only contains delta to defaults"
8674msgstr "" 8587msgstr ""
8675 8588
8676#: src/util/gnunet-config.c:322 8589#: src/util/gnunet-config.c:324
8677#, fuzzy 8590#, fuzzy
8678msgid "Manipulate GNUnet configuration files" 8591msgid "Manipulate GNUnet configuration files"
8679msgstr "cập nhật một giá trị trong tập tin cấu hình" 8592msgstr "cập nhật một giá trị trong tập tin cấu hình"
@@ -8766,6 +8679,33 @@ msgstr ""
8766msgid "Manipulate GNUnet private ECC key files" 8679msgid "Manipulate GNUnet private ECC key files"
8767msgstr "cập nhật một giá trị trong tập tin cấu hình" 8680msgstr "cập nhật một giá trị trong tập tin cấu hình"
8768 8681
8682#: src/util/gnunet-qr.c:108 src/util/gnunet-uri.c:91
8683#, fuzzy, c-format
8684msgid "Invalid URI: does not start with `%s'\n"
8685msgstr "Ký hiệu mạng sai (không kết thúc với « ; »: « %s »)\n"
8686
8687#: src/util/gnunet-qr.c:116 src/util/gnunet-uri.c:98
8688#, c-format
8689msgid "Invalid URI: fails to specify subsystem\n"
8690msgstr ""
8691
8692#: src/util/gnunet-qr.c:127 src/util/gnunet-uri.c:108
8693#, c-format
8694msgid "No handler known for subsystem `%s'\n"
8695msgstr ""
8696
8697#: src/util/gnunet-qr.c:297
8698msgid "use video-device DEVICE (default: /dev/video0"
8699msgstr ""
8700
8701#: src/util/gnunet-qr.c:303
8702msgid "do not show preview windows"
8703msgstr ""
8704
8705#: src/util/gnunet-qr.c:311
8706msgid "Scan a QR code using a video device and import the uri read"
8707msgstr ""
8708
8769#: src/util/gnunet-resolver.c:168 8709#: src/util/gnunet-resolver.c:168
8770msgid "perform a reverse lookup" 8710msgid "perform a reverse lookup"
8771msgstr "" 8711msgstr ""
@@ -8809,21 +8749,6 @@ msgstr ""
8809msgid "No URI specified on command line\n" 8749msgid "No URI specified on command line\n"
8810msgstr "" 8750msgstr ""
8811 8751
8812#: src/util/gnunet-uri.c:91
8813#, fuzzy, c-format
8814msgid "Invalid URI: does not start with `%s'\n"
8815msgstr "Ký hiệu mạng sai (không kết thúc với « ; »: « %s »)\n"
8816
8817#: src/util/gnunet-uri.c:98
8818#, c-format
8819msgid "Invalid URI: fails to specify subsystem\n"
8820msgstr ""
8821
8822#: src/util/gnunet-uri.c:108
8823#, c-format
8824msgid "No handler known for subsystem `%s'\n"
8825msgstr ""
8826
8827#: src/util/gnunet-uri.c:170 8752#: src/util/gnunet-uri.c:170
8828msgid "Perform default-actions for GNUnet URIs" 8753msgid "Perform default-actions for GNUnet URIs"
8829msgstr "" 8754msgstr ""
@@ -8843,12 +8768,12 @@ msgstr "Lỗi đọc danh sách bạn bè từ « %s »\n"
8843msgid "Error writing to `%s': %s\n" 8768msgid "Error writing to `%s': %s\n"
8844msgstr "Gặp lỗi khi tạo người dùng" 8769msgstr "Gặp lỗi khi tạo người dùng"
8845 8770
8846#: src/util/network.c:136 8771#: src/util/network.c:176
8847#, c-format 8772#, c-format
8848msgid "Unable to shorten unix path `%s' while keeping name unique\n" 8773msgid "Unable to shorten unix path `%s' while keeping name unique\n"
8849msgstr "" 8774msgstr ""
8850 8775
8851#: src/util/network.c:1794 src/util/network.c:1978 8776#: src/util/network.c:1835 src/util/network.c:2019
8852#, c-format 8777#, c-format
8853msgid "" 8778msgid ""
8854"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" 8779"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8961,7 +8886,7 @@ msgid ""
8961"`GNUNET_SERVICE_client_continue' after %s\n" 8886"`GNUNET_SERVICE_client_continue' after %s\n"
8962msgstr "" 8887msgstr ""
8963 8888
8964#: src/util/service.c:1862 8889#: src/util/service.c:1826
8965msgid "" 8890msgid ""
8966"Could not bind to any of the ports I was supposed to, refusing to run!\n" 8891"Could not bind to any of the ports I was supposed to, refusing to run!\n"
8967msgstr "" 8892msgstr ""
@@ -9315,6 +9240,22 @@ msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
9315msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s\n" 9240msgstr "« %s » thất bại ở tập tin « %s » tại %s:%d với lỗi: %s\n"
9316 9241
9317#, fuzzy 9242#, fuzzy
9243#~ msgid "# XT sessions active"
9244#~ msgstr "# các khoá phiên chạy được chấp nhận"
9245
9246#, fuzzy
9247#~ msgid "Failed to bind XU socket to %s: %s\n"
9248#~ msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
9249
9250#, fuzzy
9251#~ msgid "Failed to open XU sockets\n"
9252#~ msgstr "Lỗi mở tập tin ghi sự kiện « %s »: %s\n"
9253
9254#, fuzzy
9255#~ msgid "Failed to create XU network sockets\n"
9256#~ msgstr "Không thể tạo miền tên.\n"
9257
9258#, fuzzy
9318#~ msgid "Print information about DV state" 9259#~ msgid "Print information about DV state"
9319#~ msgstr "In ra thông tin về các đồng đẳng GNUnet." 9260#~ msgstr "In ra thông tin về các đồng đẳng GNUnet."
9320 9261
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 45d99f161..c77a87581 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -7,7 +7,7 @@ msgid ""
7msgstr "" 7msgstr ""
8"Project-Id-Version: gnunet-0.8.1\n" 8"Project-Id-Version: gnunet-0.8.1\n"
9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n" 9"Report-Msgid-Bugs-To: gnunet-developers@mail.gnu.org\n"
10"POT-Creation-Date: 2019-02-28 11:41+0100\n" 10"POT-Creation-Date: 2019-04-04 12:39+0200\n"
11"PO-Revision-Date: 2011-07-09 12:12+0800\n" 11"PO-Revision-Date: 2011-07-09 12:12+0800\n"
12"Last-Translator: Wylmer Wang <wantinghard@gmail.com>\n" 12"Last-Translator: Wylmer Wang <wantinghard@gmail.com>\n"
13"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n" 13"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
@@ -221,8 +221,7 @@ msgid "Control services and the Automated Restart Manager (ARM)"
221msgstr "" 221msgstr ""
222 222
223#: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120 223#: src/arm/gnunet-service-arm.c:388 src/transport/plugin_transport_tcp.c:1120
224#: src/transport/plugin_transport_xt.c:1120 224#: src/transport/tcp_service_legacy.c:557
225#: src/transport/tcp_service_legacy.c:557 src/util/service.c:1167
226#, c-format 225#, c-format
227msgid "" 226msgid ""
228"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n" 227"Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"
@@ -232,35 +231,29 @@ msgstr ""
232#: src/transport/plugin_transport_tcp.c:1139 231#: src/transport/plugin_transport_tcp.c:1139
233#: src/transport/plugin_transport_tcp.c:1145 232#: src/transport/plugin_transport_tcp.c:1145
234#: src/transport/plugin_transport_tcp.c:3835 233#: src/transport/plugin_transport_tcp.c:3835
235#: src/transport/plugin_transport_xt.c:1139
236#: src/transport/plugin_transport_xt.c:1145
237#: src/transport/plugin_transport_xt.c:3833
238#: src/transport/tcp_service_legacy.c:576 234#: src/transport/tcp_service_legacy.c:576
239#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1192 235#: src/transport/tcp_service_legacy.c:582 src/util/service.c:1156
240#: src/util/service.c:1198 236#: src/util/service.c:1162
241#, c-format 237#, c-format
242msgid "Require valid port number for service `%s' in configuration!\n" 238msgid "Require valid port number for service `%s' in configuration!\n"
243msgstr "" 239msgstr ""
244 240
245#: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176 241#: src/arm/gnunet-service-arm.c:457 src/transport/plugin_transport_tcp.c:1176
246#: src/transport/plugin_transport_xt.c:1176 242#: src/transport/tcp_service_legacy.c:613 src/util/client.c:521
247#: src/transport/tcp_service_legacy.c:613 src/util/client.c:506 243#: src/util/service.c:1201
248#: src/util/service.c:1237
249#, c-format 244#, c-format
250msgid "UNIXPATH `%s' too long, maximum length is %llu\n" 245msgid "UNIXPATH `%s' too long, maximum length is %llu\n"
251msgstr "" 246msgstr ""
252 247
253#: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180 248#: src/arm/gnunet-service-arm.c:462 src/transport/plugin_transport_tcp.c:1180
254#: src/transport/plugin_transport_xt.c:1180 249#: src/transport/tcp_service_legacy.c:617 src/util/client.c:526
255#: src/transport/tcp_service_legacy.c:617 src/util/client.c:511 250#: src/util/service.c:1206
256#: src/util/service.c:1242
257#, fuzzy, c-format 251#, fuzzy, c-format
258msgid "Using `%s' instead\n" 252msgid "Using `%s' instead\n"
259msgstr "%s:选项“%s”有歧义\n" 253msgstr "%s:选项“%s”有歧义\n"
260 254
261#: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211 255#: src/arm/gnunet-service-arm.c:495 src/transport/plugin_transport_tcp.c:1211
262#: src/transport/plugin_transport_xt.c:1211 256#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1242
263#: src/transport/tcp_service_legacy.c:648 src/util/service.c:1278
264#, c-format 257#, c-format
265msgid "" 258msgid ""
266"Disabling UNIX domain socket support for service `%s', failed to create UNIX " 259"Disabling UNIX domain socket support for service `%s', failed to create UNIX "
@@ -268,8 +261,7 @@ msgid ""
268msgstr "" 261msgstr ""
269 262
270#: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228 263#: src/arm/gnunet-service-arm.c:517 src/transport/plugin_transport_tcp.c:1228
271#: src/transport/plugin_transport_xt.c:1228 264#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1260
272#: src/transport/tcp_service_legacy.c:665 src/util/service.c:1296
273#, c-format 265#, c-format
274msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n" 266msgid "Have neither PORT nor UNIXPATH for service `%s', but one is required\n"
275msgstr "" 267msgstr ""
@@ -277,8 +269,7 @@ msgstr ""
277#: src/arm/gnunet-service-arm.c:556 269#: src/arm/gnunet-service-arm.c:556
278#: src/transport/plugin_transport_http_server.c:2688 270#: src/transport/plugin_transport_http_server.c:2688
279#: src/transport/plugin_transport_tcp.c:1259 271#: src/transport/plugin_transport_tcp.c:1259
280#: src/transport/plugin_transport_xt.c:1259 272#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1301
281#: src/transport/tcp_service_legacy.c:696 src/util/service.c:1337
282#, fuzzy, c-format 273#, fuzzy, c-format
283msgid "Failed to resolve `%s': %s\n" 274msgid "Failed to resolve `%s': %s\n"
284msgstr "打开日志文件“%s”失败:%s\n" 275msgstr "打开日志文件“%s”失败:%s\n"
@@ -286,8 +277,7 @@ msgstr "打开日志文件“%s”失败:%s\n"
286#: src/arm/gnunet-service-arm.c:575 277#: src/arm/gnunet-service-arm.c:575
287#: src/transport/plugin_transport_http_server.c:2706 278#: src/transport/plugin_transport_http_server.c:2706
288#: src/transport/plugin_transport_tcp.c:1278 279#: src/transport/plugin_transport_tcp.c:1278
289#: src/transport/plugin_transport_xt.c:1278 280#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1321
290#: src/transport/tcp_service_legacy.c:715 src/util/service.c:1357
291#, fuzzy, c-format 281#, fuzzy, c-format
292msgid "Failed to find %saddress for `%s'.\n" 282msgid "Failed to find %saddress for `%s'.\n"
293msgstr "找不到接口“%s”的一个 IP 地址。\n" 283msgstr "找不到接口“%s”的一个 IP 地址。\n"
@@ -1587,6 +1577,10 @@ msgstr "初始化“%s”服务失败。\n"
1587msgid "Unable to parse ATTR record string `%s'\n" 1577msgid "Unable to parse ATTR record string `%s'\n"
1588msgstr "解析配置文件“%s”失败\n" 1578msgstr "解析配置文件“%s”失败\n"
1589 1579
1580#: src/credential/plugin_rest_credential.c:1128
1581msgid "GNS REST API initialized\n"
1582msgstr ""
1583
1590#: src/datacache/datacache.c:119 src/datacache/datacache.c:311 1584#: src/datacache/datacache.c:119 src/datacache/datacache.c:311
1591#: src/datastore/gnunet-service-datastore.c:757 1585#: src/datastore/gnunet-service-datastore.c:757
1592msgid "# bytes stored" 1586msgid "# bytes stored"
@@ -2085,7 +2079,7 @@ msgstr ""
2085msgid "Exiting as the number of peers is %u\n" 2079msgid "Exiting as the number of peers is %u\n"
2086msgstr "增加 TCP/IP 的最大连接数" 2080msgstr "增加 TCP/IP 的最大连接数"
2087 2081
2088#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2959 2082#: src/dht/gnunet_dht_profiler.c:949 src/rps/gnunet-rps-profiler.c:2981
2089#, fuzzy 2083#, fuzzy
2090msgid "number of peers to start" 2084msgid "number of peers to start"
2091msgstr "迭代次数" 2085msgstr "迭代次数"
@@ -3142,11 +3136,11 @@ msgstr ""
3142msgid "set the desired LEVEL of sender-anonymity" 3136msgid "set the desired LEVEL of sender-anonymity"
3143msgstr "" 3137msgstr ""
3144 3138
3145#: src/fs/gnunet-auto-share.c:772 src/fs/gnunet-publish.c:907 3139#: src/fs/gnunet-auto-share.c:772
3146msgid "disable adding the creation time to the metadata of the uploaded file" 3140msgid "disable adding the creation time to the metadata of the uploaded file"
3147msgstr "" 3141msgstr ""
3148 3142
3149#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:912 3143#: src/fs/gnunet-auto-share.c:777 src/fs/gnunet-publish.c:907
3150msgid "do not use libextractor to add keywords or metadata" 3144msgid "do not use libextractor to add keywords or metadata"
3151msgstr "" 3145msgstr ""
3152 3146
@@ -3447,6 +3441,10 @@ msgstr ""
3447msgid "Option `%s' makes no sense without option `%s'.\n" 3441msgid "Option `%s' makes no sense without option `%s'.\n"
3448msgstr "" 3442msgstr ""
3449 3443
3444#: src/fs/gnunet-publish.c:911
3445msgid "enable adding the creation time to the metadata of the uploaded file"
3446msgstr ""
3447
3450#: src/fs/gnunet-publish.c:916 3448#: src/fs/gnunet-publish.c:916
3451msgid "" 3449msgid ""
3452"print list of extracted keywords that would be used, but do not perform " 3450"print list of extracted keywords that would be used, but do not perform "
@@ -3918,39 +3916,39 @@ msgstr ""
3918msgid "GNUnet HTTP server to create business cards" 3916msgid "GNUnet HTTP server to create business cards"
3919msgstr "" 3917msgstr ""
3920 3918
3921#: src/gns/gnunet-dns2gns.c:203 3919#: src/gns/gnunet-dns2gns.c:214
3922#, fuzzy 3920#, fuzzy
3923msgid "Failed to pack DNS response into UDP packet!\n" 3921msgid "Failed to pack DNS response into UDP packet!\n"
3924msgstr "打开日志文件“%s”失败:%s\n" 3922msgstr "打开日志文件“%s”失败:%s\n"
3925 3923
3926#: src/gns/gnunet-dns2gns.c:405 3924#: src/gns/gnunet-dns2gns.c:416
3927#, c-format 3925#, c-format
3928msgid "Cannot parse DNS request from %s\n" 3926msgid "Cannot parse DNS request from %s\n"
3929msgstr "" 3927msgstr ""
3930 3928
3931#: src/gns/gnunet-dns2gns.c:421 3929#: src/gns/gnunet-dns2gns.c:432
3932#, c-format 3930#, c-format
3933msgid "Received malformed DNS request from %s\n" 3931msgid "Received malformed DNS request from %s\n"
3934msgstr "" 3932msgstr ""
3935 3933
3936#: src/gns/gnunet-dns2gns.c:429 3934#: src/gns/gnunet-dns2gns.c:440
3937#, c-format 3935#, c-format
3938msgid "Received unsupported DNS request from %s\n" 3936msgid "Received unsupported DNS request from %s\n"
3939msgstr "" 3937msgstr ""
3940 3938
3941#: src/gns/gnunet-dns2gns.c:588 3939#: src/gns/gnunet-dns2gns.c:600
3942msgid "No DNS server specified!\n" 3940msgid "No DNS server specified!\n"
3943msgstr "" 3941msgstr ""
3944 3942
3945#: src/gns/gnunet-dns2gns.c:688 3943#: src/gns/gnunet-dns2gns.c:748
3946msgid "IP of recursive DNS resolver to use (required)" 3944msgid "IP of recursive DNS resolver to use (required)"
3947msgstr "" 3945msgstr ""
3948 3946
3949#: src/gns/gnunet-dns2gns.c:693 3947#: src/gns/gnunet-dns2gns.c:753
3950msgid "UDP port to listen on for inbound DNS requests; default: 2853" 3948msgid "UDP port to listen on for inbound DNS requests; default: 2853"
3951msgstr "" 3949msgstr ""
3952 3950
3953#: src/gns/gnunet-dns2gns.c:710 3951#: src/gns/gnunet-dns2gns.c:770
3954msgid "GNUnet DNS-to-GNS proxy (a DNS server)" 3952msgid "GNUnet DNS-to-GNS proxy (a DNS server)"
3955msgstr "" 3953msgstr ""
3956 3954
@@ -4022,104 +4020,104 @@ msgstr ""
4022msgid "%s failed at %s:%d: `%s'\n" 4020msgid "%s failed at %s:%d: `%s'\n"
4023msgstr "" 4021msgstr ""
4024 4022
4025#: src/gns/gnunet-gns-proxy.c:980 4023#: src/gns/gnunet-gns-proxy.c:989
4026#, fuzzy, c-format 4024#, fuzzy, c-format
4027msgid "Unsupported CURL TLS backend %d\n" 4025msgid "Unsupported CURL TLS backend %d\n"
4028msgstr "未知的命令“%s”。\n" 4026msgstr "未知的命令“%s”。\n"
4029 4027
4030#: src/gns/gnunet-gns-proxy.c:1005 4028#: src/gns/gnunet-gns-proxy.c:1014
4031#, fuzzy, c-format 4029#, fuzzy, c-format
4032msgid "Failed to fetch CN from cert: %s\n" 4030msgid "Failed to fetch CN from cert: %s\n"
4033msgstr "打开日志文件“%s”失败:%s\n" 4031msgstr "打开日志文件“%s”失败:%s\n"
4034 4032
4035#: src/gns/gnunet-gns-proxy.c:1026 4033#: src/gns/gnunet-gns-proxy.c:1035
4036#, fuzzy, c-format 4034#, fuzzy, c-format
4037msgid "Failed to initialize DANE: %s\n" 4035msgid "Failed to initialize DANE: %s\n"
4038msgstr "无法初始化 SQLite:%s。\n" 4036msgstr "无法初始化 SQLite:%s。\n"
4039 4037
4040#: src/gns/gnunet-gns-proxy.c:1041 4038#: src/gns/gnunet-gns-proxy.c:1050
4041#, fuzzy, c-format 4039#, fuzzy, c-format
4042msgid "Failed to parse DANE record: %s\n" 4040msgid "Failed to parse DANE record: %s\n"
4043msgstr "打开日志文件“%s”失败:%s\n" 4041msgstr "打开日志文件“%s”失败:%s\n"
4044 4042
4045#: src/gns/gnunet-gns-proxy.c:1056 4043#: src/gns/gnunet-gns-proxy.c:1065
4046#, fuzzy, c-format 4044#, fuzzy, c-format
4047msgid "Failed to verify TLS connection using DANE: %s\n" 4045msgid "Failed to verify TLS connection using DANE: %s\n"
4048msgstr "解析配置文件“%s”失败\n" 4046msgstr "解析配置文件“%s”失败\n"
4049 4047
4050#: src/gns/gnunet-gns-proxy.c:1066 4048#: src/gns/gnunet-gns-proxy.c:1075
4051#, c-format 4049#, c-format
4052msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n" 4050msgid "Failed DANE verification failed with GnuTLS verify status code: %u\n"
4053msgstr "" 4051msgstr ""
4054 4052
4055#: src/gns/gnunet-gns-proxy.c:1090 4053#: src/gns/gnunet-gns-proxy.c:1099
4056#, c-format 4054#, c-format
4057msgid "TLS certificate subject name (%s) does not match `%s': %d\n" 4055msgid "TLS certificate subject name (%s) does not match `%s': %d\n"
4058msgstr "" 4056msgstr ""
4059 4057
4060#: src/gns/gnunet-gns-proxy.c:1221 4058#: src/gns/gnunet-gns-proxy.c:1230
4061#, c-format 4059#, c-format
4062msgid "Cookie domain `%s' supplied by server is invalid\n" 4060msgid "Cookie domain `%s' supplied by server is invalid\n"
4063msgstr "" 4061msgstr ""
4064 4062
4065#: src/gns/gnunet-gns-proxy.c:2122 4063#: src/gns/gnunet-gns-proxy.c:2131
4066#, fuzzy, c-format 4064#, fuzzy, c-format
4067msgid "Unsupported HTTP method `%s'\n" 4065msgid "Unsupported HTTP method `%s'\n"
4068msgstr "未知的命令“%s”。\n" 4066msgstr "未知的命令“%s”。\n"
4069 4067
4070#: src/gns/gnunet-gns-proxy.c:2643 4068#: src/gns/gnunet-gns-proxy.c:2652
4071#, fuzzy, c-format 4069#, fuzzy, c-format
4072msgid "Unable to import private key from file `%s'\n" 4070msgid "Unable to import private key from file `%s'\n"
4073msgstr "无法创建用户账户:" 4071msgstr "无法创建用户账户:"
4074 4072
4075#: src/gns/gnunet-gns-proxy.c:2675 4073#: src/gns/gnunet-gns-proxy.c:2684
4076#, fuzzy, c-format 4074#, fuzzy, c-format
4077msgid "Unable to import certificate from `%s'\n" 4075msgid "Unable to import certificate from `%s'\n"
4078msgstr "无法保存配置文件“%s”:" 4076msgstr "无法保存配置文件“%s”:"
4079 4077
4080#: src/gns/gnunet-gns-proxy.c:2876 4078#: src/gns/gnunet-gns-proxy.c:2885
4081#, fuzzy, c-format 4079#, fuzzy, c-format
4082msgid "Failed to start HTTPS server for `%s'\n" 4080msgid "Failed to start HTTPS server for `%s'\n"
4083msgstr "初始化“%s”服务失败。\n" 4081msgstr "初始化“%s”服务失败。\n"
4084 4082
4085#: src/gns/gnunet-gns-proxy.c:2898 src/rest/gnunet-rest-server.c:658 4083#: src/gns/gnunet-gns-proxy.c:2907 src/rest/gnunet-rest-server.c:668
4086#, fuzzy 4084#, fuzzy
4087msgid "Failed to pass client to MHD\n" 4085msgid "Failed to pass client to MHD\n"
4088msgstr "初始化“%s”服务失败。\n" 4086msgstr "初始化“%s”服务失败。\n"
4089 4087
4090#: src/gns/gnunet-gns-proxy.c:3234 4088#: src/gns/gnunet-gns-proxy.c:3243
4091#, fuzzy, c-format 4089#, fuzzy, c-format
4092msgid "Unsupported socks version %d\n" 4090msgid "Unsupported socks version %d\n"
4093msgstr "未知的命令“%s”。\n" 4091msgstr "未知的命令“%s”。\n"
4094 4092
4095#: src/gns/gnunet-gns-proxy.c:3263 4093#: src/gns/gnunet-gns-proxy.c:3272
4096#, fuzzy, c-format 4094#, fuzzy, c-format
4097msgid "Unsupported socks command %d\n" 4095msgid "Unsupported socks command %d\n"
4098msgstr "未知的命令“%s”。\n" 4096msgstr "未知的命令“%s”。\n"
4099 4097
4100#: src/gns/gnunet-gns-proxy.c:3346 4098#: src/gns/gnunet-gns-proxy.c:3355
4101#, fuzzy, c-format 4099#, fuzzy, c-format
4102msgid "Unsupported socks address type %d\n" 4100msgid "Unsupported socks address type %d\n"
4103msgstr "未知的命令“%s”。\n" 4101msgstr "未知的命令“%s”。\n"
4104 4102
4105#: src/gns/gnunet-gns-proxy.c:3636 4103#: src/gns/gnunet-gns-proxy.c:3693
4106#, fuzzy, c-format 4104#, fuzzy, c-format
4107msgid "Failed to load X.509 key and certificate from `%s'\n" 4105msgid "Failed to load X.509 key and certificate from `%s'\n"
4108msgstr "解析配置文件“%s”失败\n" 4106msgstr "解析配置文件“%s”失败\n"
4109 4107
4110#: src/gns/gnunet-gns-proxy.c:3764 4108#: src/gns/gnunet-gns-proxy.c:3821
4111msgid "listen on specified port (default: 7777)" 4109msgid "listen on specified port (default: 7777)"
4112msgstr "" 4110msgstr ""
4113 4111
4114#: src/gns/gnunet-gns-proxy.c:3769 4112#: src/gns/gnunet-gns-proxy.c:3826
4115msgid "pem file to use as CA" 4113msgid "pem file to use as CA"
4116msgstr "" 4114msgstr ""
4117 4115
4118#: src/gns/gnunet-gns-proxy.c:3773 4116#: src/gns/gnunet-gns-proxy.c:3830
4119msgid "disable use of IPv6" 4117msgid "disable use of IPv6"
4120msgstr "" 4118msgstr ""
4121 4119
4122#: src/gns/gnunet-gns-proxy.c:3799 4120#: src/gns/gnunet-gns-proxy.c:3856
4123msgid "GNUnet GNS proxy" 4121msgid "GNUnet GNS proxy"
4124msgstr "" 4122msgstr ""
4125 4123
@@ -4228,6 +4226,10 @@ msgstr "解析配置文件“%s”失败\n"
4228msgid "Unable to parse BOX record string `%s'\n" 4226msgid "Unable to parse BOX record string `%s'\n"
4229msgstr "解析配置文件“%s”失败\n" 4227msgstr "解析配置文件“%s”失败\n"
4230 4228
4229#: src/gns/plugin_rest_gns.c:452
4230msgid "Gns REST API initialized\n"
4231msgstr ""
4232
4231#: src/gnsrecord/plugin_gnsrecord_dns.c:359 4233#: src/gnsrecord/plugin_gnsrecord_dns.c:359
4232#, fuzzy, c-format 4234#, fuzzy, c-format
4233msgid "Unable to parse IPv4 address `%s'\n" 4235msgid "Unable to parse IPv4 address `%s'\n"
@@ -4739,6 +4741,10 @@ msgstr "解析配置文件“%s”失败\n"
4739msgid "Failed to create directory `%s' for storing egos\n" 4741msgid "Failed to create directory `%s' for storing egos\n"
4740msgstr "解析配置文件“%s”失败\n" 4742msgstr "解析配置文件“%s”失败\n"
4741 4743
4744#: src/identity/plugin_rest_identity.c:1297
4745msgid "Identity REST API initialized\n"
4746msgstr ""
4747
4742#: src/json/json.c:123 4748#: src/json/json.c:123
4743#, fuzzy, c-format 4749#, fuzzy, c-format
4744msgid "Failed to parse JSON in option `%s': %s (%s)\n" 4750msgid "Failed to parse JSON in option `%s': %s (%s)\n"
@@ -5136,6 +5142,10 @@ msgstr ""
5136msgid "heap file database running\n" 5142msgid "heap file database running\n"
5137msgstr "sqlite 数据仓库" 5143msgstr "sqlite 数据仓库"
5138 5144
5145#: src/namestore/plugin_rest_namestore.c:1079
5146msgid "Namestore REST API initialized\n"
5147msgstr ""
5148
5139#: src/nat-auto/gnunet-nat-auto.c:193 5149#: src/nat-auto/gnunet-nat-auto.c:193
5140#, fuzzy 5150#, fuzzy
5141msgid "Suggested configuration changes:\n" 5151msgid "Suggested configuration changes:\n"
@@ -5515,7 +5525,7 @@ msgid "\tExpires: %s \t %s\n"
5515msgstr "" 5525msgstr ""
5516 5526
5517#: src/peerinfo-tool/gnunet-peerinfo.c:299 5527#: src/peerinfo-tool/gnunet-peerinfo.c:299
5518#: src/rest-plugins/plugin_rest_peerinfo.c:501 5528#: src/peerinfo-tool/plugin_rest_peerinfo.c:501
5519#, fuzzy, c-format 5529#, fuzzy, c-format
5520msgid "Failure: Cannot convert address to string for peer `%s'\n" 5530msgid "Failure: Cannot convert address to string for peer `%s'\n"
5521msgstr "找不到接口“%s”的一个 IP 地址。\n" 5531msgstr "找不到接口“%s”的一个 IP 地址。\n"
@@ -5596,6 +5606,10 @@ msgstr ""
5596msgid "Failed to load transport plugin for `%s'\n" 5606msgid "Failed to load transport plugin for `%s'\n"
5597msgstr "解析配置文件“%s”失败\n" 5607msgstr "解析配置文件“%s”失败\n"
5598 5608
5609#: src/peerinfo-tool/plugin_rest_peerinfo.c:796
5610msgid "Peerinfo REST API initialized\n"
5611msgstr ""
5612
5599#: src/peerstore/gnunet-peerstore.c:91 5613#: src/peerstore/gnunet-peerstore.c:91
5600msgid "peerstore" 5614msgid "peerstore"
5601msgstr "" 5615msgstr ""
@@ -5753,6 +5767,11 @@ msgstr ""
5753msgid "Expiration interval of the attribute" 5767msgid "Expiration interval of the attribute"
5754msgstr "" 5768msgstr ""
5755 5769
5770#: src/reclaim/plugin_rest_openid_connect.c:2279
5771#: src/reclaim/plugin_rest_reclaim.c:1079
5772msgid "Identity Provider REST API initialized\n"
5773msgstr ""
5774
5756#: src/reclaim/reclaim_api.c:436 5775#: src/reclaim/reclaim_api.c:436
5757#, fuzzy 5776#, fuzzy
5758msgid "failed to store record\n" 5777msgid "failed to store record\n"
@@ -5846,44 +5865,19 @@ msgstr "服务已删除。\n"
5846msgid "Search string `%s' is too long!\n" 5865msgid "Search string `%s' is too long!\n"
5847msgstr "服务已删除。\n" 5866msgstr "服务已删除。\n"
5848 5867
5849#: src/rest/gnunet-rest-server.c:927 5868#: src/rest/gnunet-rest-server.c:986
5850msgid "listen on specified port (default: 7776)" 5869msgid "listen on specified port (default: 7776)"
5851msgstr "" 5870msgstr ""
5852 5871
5853#: src/rest/gnunet-rest-server.c:944 5872#: src/rest/gnunet-rest-server.c:1003
5854#, fuzzy 5873#, fuzzy
5855msgid "GNUnet REST server" 5874msgid "GNUnet REST server"
5856msgstr "GNUnet 错误日志" 5875msgstr "GNUnet 错误日志"
5857 5876
5858#: src/rest-plugins/plugin_rest_copying.c:209 5877#: src/rest/plugin_rest_copying.c:209
5859msgid "COPYING REST API initialized\n" 5878msgid "COPYING REST API initialized\n"
5860msgstr "" 5879msgstr ""
5861 5880
5862#: src/rest-plugins/plugin_rest_credential.c:1128
5863msgid "GNS REST API initialized\n"
5864msgstr ""
5865
5866#: src/rest-plugins/plugin_rest_gns.c:452
5867msgid "Gns REST API initialized\n"
5868msgstr ""
5869
5870#: src/rest-plugins/plugin_rest_identity.c:1297
5871msgid "Identity REST API initialized\n"
5872msgstr ""
5873
5874#: src/rest-plugins/plugin_rest_namestore.c:1079
5875msgid "Namestore REST API initialized\n"
5876msgstr ""
5877
5878#: src/rest-plugins/plugin_rest_openid_connect.c:2279
5879#: src/rest-plugins/plugin_rest_reclaim.c:1079
5880msgid "Identity Provider REST API initialized\n"
5881msgstr ""
5882
5883#: src/rest-plugins/plugin_rest_peerinfo.c:796
5884msgid "Peerinfo REST API initialized\n"
5885msgstr ""
5886
5887#: src/revocation/gnunet-revocation.c:129 5881#: src/revocation/gnunet-revocation.c:129
5888#, c-format 5882#, c-format
5889msgid "Key `%s' is valid\n" 5883msgid "Key `%s' is valid\n"
@@ -6032,20 +6026,20 @@ msgstr ""
6032msgid "Get peers from biased stream" 6026msgid "Get peers from biased stream"
6033msgstr "" 6027msgstr ""
6034 6028
6035#: src/rps/gnunet-rps-profiler.c:2964 6029#: src/rps/gnunet-rps-profiler.c:2986
6036msgid "duration of the profiling" 6030msgid "duration of the profiling"
6037msgstr "" 6031msgstr ""
6038 6032
6039#: src/rps/gnunet-rps-profiler.c:2969 6033#: src/rps/gnunet-rps-profiler.c:2991
6040msgid "timeout for the profiling" 6034msgid "timeout for the profiling"
6041msgstr "" 6035msgstr ""
6042 6036
6043#: src/rps/gnunet-rps-profiler.c:2974 6037#: src/rps/gnunet-rps-profiler.c:2996
6044#, fuzzy 6038#, fuzzy
6045msgid "number of PeerIDs to request" 6039msgid "number of PeerIDs to request"
6046msgstr "迭代次数" 6040msgstr "迭代次数"
6047 6041
6048#: src/rps/gnunet-rps-profiler.c:2990 6042#: src/rps/gnunet-rps-profiler.c:3012
6049#, fuzzy 6043#, fuzzy
6050msgid "Measure quality and performance of the RPS service." 6044msgid "Measure quality and performance of the RPS service."
6051msgstr "无法访问该服务" 6045msgstr "无法访问该服务"
@@ -6768,19 +6762,19 @@ msgstr ""
6768msgid "GNUnet topology control" 6762msgid "GNUnet topology control"
6769msgstr "" 6763msgstr ""
6770 6764
6771#: src/transport/gnunet-communicator-tcp.c:2329 6765#: src/transport/gnunet-communicator-tcp.c:2328
6772#: src/transport/gnunet-communicator-udp.c:2883 6766#: src/transport/gnunet-communicator-udp.c:2882
6773#: src/transport/gnunet-service-tng.c:4747 6767#: src/transport/gnunet-service-tng.c:4888
6774#: src/transport/gnunet-service-transport.c:2795 6768#: src/transport/gnunet-service-transport.c:2795
6775#, fuzzy 6769#, fuzzy
6776msgid "Transport service is lacking key configuration settings. Exiting.\n" 6770msgid "Transport service is lacking key configuration settings. Exiting.\n"
6777msgstr "立即保存配置?" 6771msgstr "立即保存配置?"
6778 6772
6779#: src/transport/gnunet-communicator-tcp.c:2393 6773#: src/transport/gnunet-communicator-tcp.c:2392
6780msgid "GNUnet TCP communicator" 6774msgid "GNUnet TCP communicator"
6781msgstr "" 6775msgstr ""
6782 6776
6783#: src/transport/gnunet-communicator-udp.c:2954 6777#: src/transport/gnunet-communicator-udp.c:2953
6784msgid "GNUnet UDP communicator" 6778msgid "GNUnet UDP communicator"
6785msgstr "" 6779msgstr ""
6786 6780
@@ -7339,8 +7333,6 @@ msgstr "消息尺寸"
7339#: src/transport/plugin_transport_http_server.c:3530 7333#: src/transport/plugin_transport_http_server.c:3530
7340#: src/transport/plugin_transport_tcp.c:3901 7334#: src/transport/plugin_transport_tcp.c:3901
7341#: src/transport/plugin_transport_tcp.c:3908 7335#: src/transport/plugin_transport_tcp.c:3908
7342#: src/transport/plugin_transport_xt.c:3899
7343#: src/transport/plugin_transport_xt.c:3906
7344msgid "TCP_STEALTH not supported on this platform.\n" 7336msgid "TCP_STEALTH not supported on this platform.\n"
7345msgstr "" 7337msgstr ""
7346 7338
@@ -7411,7 +7403,6 @@ msgstr ""
7411 7403
7412#: src/transport/plugin_transport_http_server.c:2905 7404#: src/transport/plugin_transport_http_server.c:2905
7413#: src/transport/plugin_transport_udp.c:3627 7405#: src/transport/plugin_transport_udp.c:3627
7414#: src/transport/plugin_transport_xu.c:2049
7415msgid "Disabling IPv6 since it is not supported on this system!\n" 7406msgid "Disabling IPv6 since it is not supported on this system!\n"
7416msgstr "" 7407msgstr ""
7417 7408
@@ -7515,8 +7506,6 @@ msgstr ""
7515 7506
7516#: src/transport/plugin_transport_tcp.c:1557 7507#: src/transport/plugin_transport_tcp.c:1557
7517#: src/transport/plugin_transport_tcp.c:2883 7508#: src/transport/plugin_transport_tcp.c:2883
7518#: src/transport/plugin_transport_xt.c:1553
7519#: src/transport/plugin_transport_xt.c:2879
7520#, c-format 7509#, c-format
7521msgid "Unexpected address length: %u bytes\n" 7510msgid "Unexpected address length: %u bytes\n"
7522msgstr "" 7511msgstr ""
@@ -7525,9 +7514,6 @@ msgstr ""
7525#: src/transport/plugin_transport_tcp.c:1964 7514#: src/transport/plugin_transport_tcp.c:1964
7526#: src/transport/plugin_transport_tcp.c:3147 7515#: src/transport/plugin_transport_tcp.c:3147
7527#: src/transport/plugin_transport_tcp.c:4024 7516#: src/transport/plugin_transport_tcp.c:4024
7528#: src/transport/plugin_transport_xt.c:1736
7529#: src/transport/plugin_transport_xt.c:1960
7530#: src/transport/plugin_transport_xt.c:3143
7531msgid "# TCP sessions active" 7517msgid "# TCP sessions active"
7532msgstr "" 7518msgstr ""
7533 7519
@@ -7537,54 +7523,39 @@ msgstr ""
7537#: src/transport/plugin_transport_tcp.c:2143 7523#: src/transport/plugin_transport_tcp.c:2143
7538#: src/transport/plugin_transport_tcp.c:2243 7524#: src/transport/plugin_transport_tcp.c:2243
7539#: src/transport/plugin_transport_tcp.c:2268 7525#: src/transport/plugin_transport_tcp.c:2268
7540#: src/transport/plugin_transport_xt.c:1778
7541#: src/transport/plugin_transport_xt.c:1942
7542#: src/transport/plugin_transport_xt.c:2066
7543#: src/transport/plugin_transport_xt.c:2139
7544#: src/transport/plugin_transport_xt.c:2239
7545#: src/transport/plugin_transport_xt.c:2264
7546msgid "# bytes currently in TCP buffers" 7526msgid "# bytes currently in TCP buffers"
7547msgstr "" 7527msgstr ""
7548 7528
7549#: src/transport/plugin_transport_tcp.c:1785 7529#: src/transport/plugin_transport_tcp.c:1785
7550#: src/transport/plugin_transport_xt.c:1781
7551msgid "# bytes discarded by TCP (disconnect)" 7530msgid "# bytes discarded by TCP (disconnect)"
7552msgstr "" 7531msgstr ""
7553 7532
7554#: src/transport/plugin_transport_tcp.c:2073 7533#: src/transport/plugin_transport_tcp.c:2073
7555#: src/transport/plugin_transport_xt.c:2069
7556msgid "# bytes discarded by TCP (timeout)" 7534msgid "# bytes discarded by TCP (timeout)"
7557msgstr "" 7535msgstr ""
7558 7536
7559#: src/transport/plugin_transport_tcp.c:2147 7537#: src/transport/plugin_transport_tcp.c:2147
7560#: src/transport/plugin_transport_xt.c:2143
7561msgid "# bytes transmitted via TCP" 7538msgid "# bytes transmitted via TCP"
7562msgstr "" 7539msgstr ""
7563 7540
7564#: src/transport/plugin_transport_tcp.c:2545 7541#: src/transport/plugin_transport_tcp.c:2545
7565#: src/transport/plugin_transport_xt.c:2541
7566msgid "# requests to create session with invalid address" 7542msgid "# requests to create session with invalid address"
7567msgstr "" 7543msgstr ""
7568 7544
7569#: src/transport/plugin_transport_tcp.c:2721 7545#: src/transport/plugin_transport_tcp.c:2721
7570#: src/transport/plugin_transport_xt.c:2717
7571msgid "# transport-service disconnect requests for TCP" 7546msgid "# transport-service disconnect requests for TCP"
7572msgstr "" 7547msgstr ""
7573 7548
7574#: src/transport/plugin_transport_tcp.c:3213 7549#: src/transport/plugin_transport_tcp.c:3213
7575#: src/transport/plugin_transport_xt.c:3209
7576msgid "# TCP WELCOME messages received" 7550msgid "# TCP WELCOME messages received"
7577msgstr "" 7551msgstr ""
7578 7552
7579#: src/transport/plugin_transport_tcp.c:3419 7553#: src/transport/plugin_transport_tcp.c:3419
7580#: src/transport/plugin_transport_xt.c:3415
7581msgid "# bytes received via TCP" 7554msgid "# bytes received via TCP"
7582msgstr "" 7555msgstr ""
7583 7556
7584#: src/transport/plugin_transport_tcp.c:3470 7557#: src/transport/plugin_transport_tcp.c:3470
7585#: src/transport/plugin_transport_tcp.c:3528 7558#: src/transport/plugin_transport_tcp.c:3528
7586#: src/transport/plugin_transport_xt.c:3466
7587#: src/transport/plugin_transport_xt.c:3524
7588#, fuzzy 7559#, fuzzy
7589msgid "# TCP server connections active" 7560msgid "# TCP server connections active"
7590msgstr "" 7561msgstr ""
@@ -7592,7 +7563,6 @@ msgstr ""
7592"按任意键继续\n" 7563"按任意键继续\n"
7593 7564
7594#: src/transport/plugin_transport_tcp.c:3474 7565#: src/transport/plugin_transport_tcp.c:3474
7595#: src/transport/plugin_transport_xt.c:3470
7596#, fuzzy 7566#, fuzzy
7597msgid "# TCP server connect events" 7567msgid "# TCP server connect events"
7598msgstr "" 7568msgstr ""
@@ -7600,27 +7570,22 @@ msgstr ""
7600"按任意键继续\n" 7570"按任意键继续\n"
7601 7571
7602#: src/transport/plugin_transport_tcp.c:3480 7572#: src/transport/plugin_transport_tcp.c:3480
7603#: src/transport/plugin_transport_xt.c:3476
7604msgid "TCP connection limit reached, suspending server\n" 7573msgid "TCP connection limit reached, suspending server\n"
7605msgstr "" 7574msgstr ""
7606 7575
7607#: src/transport/plugin_transport_tcp.c:3482 7576#: src/transport/plugin_transport_tcp.c:3482
7608#: src/transport/plugin_transport_xt.c:3478
7609msgid "# TCP service suspended" 7577msgid "# TCP service suspended"
7610msgstr "" 7578msgstr ""
7611 7579
7612#: src/transport/plugin_transport_tcp.c:3522 7580#: src/transport/plugin_transport_tcp.c:3522
7613#: src/transport/plugin_transport_xt.c:3518
7614msgid "# TCP service resumed" 7581msgid "# TCP service resumed"
7615msgstr "" 7582msgstr ""
7616 7583
7617#: src/transport/plugin_transport_tcp.c:3532 7584#: src/transport/plugin_transport_tcp.c:3532
7618#: src/transport/plugin_transport_xt.c:3528
7619msgid "# network-level TCP disconnect events" 7585msgid "# network-level TCP disconnect events"
7620msgstr "" 7586msgstr ""
7621 7587
7622#: src/transport/plugin_transport_tcp.c:3851 7588#: src/transport/plugin_transport_tcp.c:3851
7623#: src/transport/plugin_transport_xt.c:3849
7624#, fuzzy 7589#, fuzzy
7625msgid "Failed to start service.\n" 7590msgid "Failed to start service.\n"
7626msgstr "初始化“%s”服务失败。\n" 7591msgstr "初始化“%s”服务失败。\n"
@@ -7673,7 +7638,6 @@ msgid "Failed to bind UDP socket to %s: %s\n"
7673msgstr "打开日志文件“%s”失败:%s\n" 7638msgstr "打开日志文件“%s”失败:%s\n"
7674 7639
7675#: src/transport/plugin_transport_udp.c:3721 7640#: src/transport/plugin_transport_udp.c:3721
7676#: src/transport/plugin_transport_xu.c:2143
7677msgid "Disabling IPv4 since it is not supported on this system!\n" 7641msgid "Disabling IPv4 since it is not supported on this system!\n"
7678msgstr "" 7642msgstr ""
7679 7643
@@ -7684,19 +7648,15 @@ msgstr "打开日志文件“%s”失败:%s\n"
7684 7648
7685#: src/transport/plugin_transport_udp.c:3883 7649#: src/transport/plugin_transport_udp.c:3883
7686#: src/transport/plugin_transport_udp.c:3897 7650#: src/transport/plugin_transport_udp.c:3897
7687#: src/transport/plugin_transport_xu.c:2301
7688#: src/transport/plugin_transport_xu.c:2315
7689msgid "must be in [0,65535]" 7651msgid "must be in [0,65535]"
7690msgstr "" 7652msgstr ""
7691 7653
7692#: src/transport/plugin_transport_udp.c:3929 7654#: src/transport/plugin_transport_udp.c:3929
7693#: src/transport/plugin_transport_xu.c:2347
7694#, fuzzy 7655#, fuzzy
7695msgid "must be valid IPv4 address" 7656msgid "must be valid IPv4 address"
7696msgstr "“%s”不可用。\n" 7657msgstr "“%s”不可用。\n"
7697 7658
7698#: src/transport/plugin_transport_udp.c:3956 7659#: src/transport/plugin_transport_udp.c:3956
7699#: src/transport/plugin_transport_xu.c:2374
7700#, fuzzy 7660#, fuzzy
7701msgid "must be valid IPv6 address" 7661msgid "must be valid IPv6 address"
7702msgstr "“%s”不可用。\n" 7662msgstr "“%s”不可用。\n"
@@ -7773,56 +7733,6 @@ msgstr ""
7773msgid "# sessions allocated" 7733msgid "# sessions allocated"
7774msgstr "" 7734msgstr ""
7775 7735
7776#: src/transport/plugin_transport_xt.c:4010
7777#, c-format
7778msgid "XT transport listening on port %llu\n"
7779msgstr ""
7780
7781#: src/transport/plugin_transport_xt.c:4014
7782msgid "XT transport not listening on any port (client only)\n"
7783msgstr ""
7784
7785#: src/transport/plugin_transport_xt.c:4018
7786#, c-format
7787msgid "XT transport advertises itself as being on port %llu\n"
7788msgstr ""
7789
7790#: src/transport/plugin_transport_xt.c:4022
7791#, fuzzy
7792msgid "# XT sessions active"
7793msgstr ""
7794"\n"
7795"按任意键继续\n"
7796
7797#: src/transport/plugin_transport_xu.c:1237
7798#, c-format
7799msgid ""
7800"XU could not transmit message to `%s': Network seems down, please check your "
7801"network configuration\n"
7802msgstr ""
7803
7804#: src/transport/plugin_transport_xu.c:1251
7805msgid ""
7806"XU could not transmit IPv6 message! Please check your network configuration "
7807"and disable IPv6 if your connection does not have a global IPv6 address\n"
7808msgstr ""
7809
7810#: src/transport/plugin_transport_xu.c:2125
7811#: src/transport/plugin_transport_xu.c:2224
7812#, fuzzy, c-format
7813msgid "Failed to bind XU socket to %s: %s\n"
7814msgstr "打开日志文件“%s”失败:%s\n"
7815
7816#: src/transport/plugin_transport_xu.c:2234
7817#, fuzzy
7818msgid "Failed to open XU sockets\n"
7819msgstr "打开日志文件“%s”失败:%s\n"
7820
7821#: src/transport/plugin_transport_xu.c:2398
7822#, fuzzy
7823msgid "Failed to create XU network sockets\n"
7824msgstr "发送消息失败。\n"
7825
7826#: src/transport/tcp_connection_legacy.c:452 7736#: src/transport/tcp_connection_legacy.c:452
7827#, fuzzy, c-format 7737#, fuzzy, c-format
7828msgid "Access denied to `%s'\n" 7738msgid "Access denied to `%s'\n"
@@ -7833,17 +7743,17 @@ msgstr "“%s”已连接到“%s”。\n"
7833msgid "Accepting connection from `%s': %p\n" 7743msgid "Accepting connection from `%s': %p\n"
7834msgstr "" 7744msgstr ""
7835 7745
7836#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1666 7746#: src/transport/tcp_server_legacy.c:474 src/util/service.c:1630
7837#, fuzzy, c-format 7747#, fuzzy, c-format
7838msgid "`%s' failed for port %d (%s).\n" 7748msgid "`%s' failed for port %d (%s).\n"
7839msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n" 7749msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n"
7840 7750
7841#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1676 7751#: src/transport/tcp_server_legacy.c:484 src/util/service.c:1640
7842#, c-format 7752#, c-format
7843msgid "`%s' failed for port %d (%s): address already in use\n" 7753msgid "`%s' failed for port %d (%s): address already in use\n"
7844msgstr "" 7754msgstr ""
7845 7755
7846#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1682 7756#: src/transport/tcp_server_legacy.c:490 src/util/service.c:1646
7847#, fuzzy, c-format 7757#, fuzzy, c-format
7848msgid "`%s' failed for `%s': address already in use\n" 7758msgid "`%s' failed for `%s': address already in use\n"
7849msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n" 7759msgstr "对驱动器“%2$s”的“%1$s”操作失败:%3$u\n"
@@ -7875,17 +7785,17 @@ msgstr ""
7875msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n" 7785msgid "Could not parse IPv6 network specification `%s' for `%s:%s'\n"
7876msgstr "" 7786msgstr ""
7877 7787
7878#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1597 7788#: src/transport/tcp_service_legacy.c:904 src/util/service.c:1561
7879msgid "Could not access a pre-bound socket, will try to bind myself\n" 7789msgid "Could not access a pre-bound socket, will try to bind myself\n"
7880msgstr "" 7790msgstr ""
7881 7791
7882#: src/transport/tcp_service_legacy.c:953 7792#: src/transport/tcp_service_legacy.c:953
7883#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1750 7793#: src/transport/tcp_service_legacy.c:971 src/util/service.c:1714
7884#, c-format 7794#, c-format
7885msgid "Specified value for `%s' of service `%s' is invalid\n" 7795msgid "Specified value for `%s' of service `%s' is invalid\n"
7886msgstr "" 7796msgstr ""
7887 7797
7888#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1783 7798#: src/transport/tcp_service_legacy.c:996 src/util/service.c:1747
7889#, c-format 7799#, c-format
7890msgid "Could not access pre-bound socket %u, will try to bind myself\n" 7800msgid "Could not access pre-bound socket %u, will try to bind myself\n"
7891msgstr "" 7801msgstr ""
@@ -7900,44 +7810,44 @@ msgstr "运行 %s失败:%s %d\n"
7900msgid "Service `%s' runs at %s\n" 7810msgid "Service `%s' runs at %s\n"
7901msgstr "" 7811msgstr ""
7902 7812
7903#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2057 7813#: src/transport/tcp_service_legacy.c:1251 src/util/service.c:2021
7904msgid "Service process failed to initialize\n" 7814msgid "Service process failed to initialize\n"
7905msgstr "" 7815msgstr ""
7906 7816
7907#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2061 7817#: src/transport/tcp_service_legacy.c:1255 src/util/service.c:2025
7908msgid "Service process could not initialize server function\n" 7818msgid "Service process could not initialize server function\n"
7909msgstr "" 7819msgstr ""
7910 7820
7911#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2065 7821#: src/transport/tcp_service_legacy.c:1259 src/util/service.c:2029
7912msgid "Service process failed to report status\n" 7822msgid "Service process failed to report status\n"
7913msgstr "" 7823msgstr ""
7914 7824
7915#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535 7825#: src/transport/tcp_service_legacy.c:1313 src/util/disk.c:1535
7916#: src/util/service.c:1935 7826#: src/util/service.c:1899
7917#, c-format 7827#, c-format
7918msgid "Cannot obtain information about user `%s': %s\n" 7828msgid "Cannot obtain information about user `%s': %s\n"
7919msgstr "无法获取有关用户“%s”的信息:%s\n" 7829msgstr "无法获取有关用户“%s”的信息:%s\n"
7920 7830
7921#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1937 7831#: src/transport/tcp_service_legacy.c:1314 src/util/service.c:1901
7922msgid "No such user" 7832msgid "No such user"
7923msgstr "无此用户" 7833msgstr "无此用户"
7924 7834
7925#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1956 7835#: src/transport/tcp_service_legacy.c:1327 src/util/service.c:1920
7926#, c-format 7836#, c-format
7927msgid "Cannot change user/group to `%s': %s\n" 7837msgid "Cannot change user/group to `%s': %s\n"
7928msgstr "无法更改用户/组为“%s”:%s\n" 7838msgstr "无法更改用户/组为“%s”:%s\n"
7929 7839
7930#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2318 7840#: src/transport/tcp_service_legacy.c:1398 src/util/service.c:2282
7931msgid "do daemonize (detach from terminal)" 7841msgid "do daemonize (detach from terminal)"
7932msgstr "" 7842msgstr ""
7933 7843
7934#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2382 7844#: src/transport/tcp_service_legacy.c:1448 src/util/service.c:2346
7935#: src/util/service.c:2397 7845#: src/util/service.c:2361
7936#, fuzzy, c-format 7846#, fuzzy, c-format
7937msgid "Malformed configuration file `%s', exit ...\n" 7847msgid "Malformed configuration file `%s', exit ...\n"
7938msgstr "解析配置文件“%s”失败\n" 7848msgstr "解析配置文件“%s”失败\n"
7939 7849
7940#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2409 7850#: src/transport/tcp_service_legacy.c:1458 src/util/service.c:2373
7941#, fuzzy 7851#, fuzzy
7942msgid "Malformed configuration, exit ...\n" 7852msgid "Malformed configuration, exit ...\n"
7943msgstr "解析配置文件“%s”失败\n" 7853msgstr "解析配置文件“%s”失败\n"
@@ -7980,11 +7890,11 @@ msgstr ""
7980msgid "Metadata `%s' failed to deserialize" 7890msgid "Metadata `%s' failed to deserialize"
7981msgstr "" 7891msgstr ""
7982 7892
7983#: src/util/client.c:734 7893#: src/util/client.c:749
7984msgid "not a valid filename" 7894msgid "not a valid filename"
7985msgstr "" 7895msgstr ""
7986 7896
7987#: src/util/client.c:925 7897#: src/util/client.c:941
7988#, c-format 7898#, c-format
7989msgid "Need a non-empty hostname for service `%s'.\n" 7899msgid "Need a non-empty hostname for service `%s'.\n"
7990msgstr "" 7900msgstr ""
@@ -8271,7 +8181,7 @@ msgstr "长选项的必选参数对短选项也是必选的。\n"
8271msgid "print this help" 8181msgid "print this help"
8272msgstr "" 8182msgstr ""
8273 8183
8274#: src/util/getopt_helpers.c:282 8184#: src/util/getopt_helpers.c:282 src/util/gnunet-qr.c:300
8275msgid "be verbose" 8185msgid "be verbose"
8276msgstr "" 8186msgstr ""
8277 8187
@@ -8319,52 +8229,52 @@ msgstr "您必须向“%s”选项传递一个数字。\n"
8319msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n" 8229msgid "Argument `%s' malformed. Expected base32 (Crockford) encoded value.\n"
8320msgstr "" 8230msgstr ""
8321 8231
8322#: src/util/gnunet-config.c:160 8232#: src/util/gnunet-config.c:161
8323#, fuzzy, c-format 8233#, fuzzy, c-format
8324msgid "failed to load configuration defaults" 8234msgid "failed to load configuration defaults"
8325msgstr "解析配置文件“%s”失败\n" 8235msgstr "解析配置文件“%s”失败\n"
8326 8236
8327#: src/util/gnunet-config.c:173 8237#: src/util/gnunet-config.c:174
8328#, fuzzy, c-format 8238#, fuzzy, c-format
8329msgid "%s or %s argument is required\n" 8239msgid "%s or %s argument is required\n"
8330msgstr "设置要使用的昵称(必须)" 8240msgstr "设置要使用的昵称(必须)"
8331 8241
8332#: src/util/gnunet-config.c:181 8242#: src/util/gnunet-config.c:182
8333#, c-format 8243#, c-format
8334msgid "The following sections are available:\n" 8244msgid "The following sections are available:\n"
8335msgstr "" 8245msgstr ""
8336 8246
8337#: src/util/gnunet-config.c:232 8247#: src/util/gnunet-config.c:234
8338#, c-format 8248#, c-format
8339msgid "--option argument required to set value\n" 8249msgid "--option argument required to set value\n"
8340msgstr "" 8250msgstr ""
8341 8251
8342#: src/util/gnunet-config.c:286 8252#: src/util/gnunet-config.c:288
8343msgid "obtain option of value as a filename (with $-expansion)" 8253msgid "interpret option value as a filename (with $-expansion)"
8344msgstr "" 8254msgstr ""
8345 8255
8346#: src/util/gnunet-config.c:291 8256#: src/util/gnunet-config.c:293
8347msgid "name of the section to access" 8257msgid "name of the section to access"
8348msgstr "" 8258msgstr ""
8349 8259
8350#: src/util/gnunet-config.c:296 8260#: src/util/gnunet-config.c:298
8351msgid "name of the option to access" 8261msgid "name of the option to access"
8352msgstr "" 8262msgstr ""
8353 8263
8354#: src/util/gnunet-config.c:301 8264#: src/util/gnunet-config.c:303
8355msgid "value to set" 8265msgid "value to set"
8356msgstr "" 8266msgstr ""
8357 8267
8358#: src/util/gnunet-config.c:305 8268#: src/util/gnunet-config.c:307
8359#, fuzzy 8269#, fuzzy
8360msgid "print available configuration sections" 8270msgid "print available configuration sections"
8361msgstr "立即保存配置?" 8271msgstr "立即保存配置?"
8362 8272
8363#: src/util/gnunet-config.c:309 8273#: src/util/gnunet-config.c:311
8364msgid "write configuration file that only contains delta to defaults" 8274msgid "write configuration file that only contains delta to defaults"
8365msgstr "" 8275msgstr ""
8366 8276
8367#: src/util/gnunet-config.c:322 8277#: src/util/gnunet-config.c:324
8368#, fuzzy 8278#, fuzzy
8369msgid "Manipulate GNUnet configuration files" 8279msgid "Manipulate GNUnet configuration files"
8370msgstr "更改配置文件中的一个值" 8280msgstr "更改配置文件中的一个值"
@@ -8457,6 +8367,33 @@ msgstr ""
8457msgid "Manipulate GNUnet private ECC key files" 8367msgid "Manipulate GNUnet private ECC key files"
8458msgstr "更改配置文件中的一个值" 8368msgstr "更改配置文件中的一个值"
8459 8369
8370#: src/util/gnunet-qr.c:108 src/util/gnunet-uri.c:91
8371#, fuzzy, c-format
8372msgid "Invalid URI: does not start with `%s'\n"
8373msgstr "无效的网络表示法(没有以“;”结尾:“%s”)\n"
8374
8375#: src/util/gnunet-qr.c:116 src/util/gnunet-uri.c:98
8376#, c-format
8377msgid "Invalid URI: fails to specify subsystem\n"
8378msgstr ""
8379
8380#: src/util/gnunet-qr.c:127 src/util/gnunet-uri.c:108
8381#, c-format
8382msgid "No handler known for subsystem `%s'\n"
8383msgstr ""
8384
8385#: src/util/gnunet-qr.c:297
8386msgid "use video-device DEVICE (default: /dev/video0"
8387msgstr ""
8388
8389#: src/util/gnunet-qr.c:303
8390msgid "do not show preview windows"
8391msgstr ""
8392
8393#: src/util/gnunet-qr.c:311
8394msgid "Scan a QR code using a video device and import the uri read"
8395msgstr ""
8396
8460#: src/util/gnunet-resolver.c:168 8397#: src/util/gnunet-resolver.c:168
8461msgid "perform a reverse lookup" 8398msgid "perform a reverse lookup"
8462msgstr "" 8399msgstr ""
@@ -8500,21 +8437,6 @@ msgstr ""
8500msgid "No URI specified on command line\n" 8437msgid "No URI specified on command line\n"
8501msgstr "" 8438msgstr ""
8502 8439
8503#: src/util/gnunet-uri.c:91
8504#, fuzzy, c-format
8505msgid "Invalid URI: does not start with `%s'\n"
8506msgstr "无效的网络表示法(没有以“;”结尾:“%s”)\n"
8507
8508#: src/util/gnunet-uri.c:98
8509#, c-format
8510msgid "Invalid URI: fails to specify subsystem\n"
8511msgstr ""
8512
8513#: src/util/gnunet-uri.c:108
8514#, c-format
8515msgid "No handler known for subsystem `%s'\n"
8516msgstr ""
8517
8518#: src/util/gnunet-uri.c:170 8440#: src/util/gnunet-uri.c:170
8519msgid "Perform default-actions for GNUnet URIs" 8441msgid "Perform default-actions for GNUnet URIs"
8520msgstr "" 8442msgstr ""
@@ -8534,12 +8456,12 @@ msgstr "打开日志文件“%s”失败:%s\n"
8534msgid "Error writing to `%s': %s\n" 8456msgid "Error writing to `%s': %s\n"
8535msgstr "创建用户出错" 8457msgstr "创建用户出错"
8536 8458
8537#: src/util/network.c:136 8459#: src/util/network.c:176
8538#, c-format 8460#, c-format
8539msgid "Unable to shorten unix path `%s' while keeping name unique\n" 8461msgid "Unable to shorten unix path `%s' while keeping name unique\n"
8540msgstr "" 8462msgstr ""
8541 8463
8542#: src/util/network.c:1794 src/util/network.c:1978 8464#: src/util/network.c:1835 src/util/network.c:2019
8543#, c-format 8465#, c-format
8544msgid "" 8466msgid ""
8545"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n" 8467"Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"
@@ -8652,7 +8574,7 @@ msgid ""
8652"`GNUNET_SERVICE_client_continue' after %s\n" 8574"`GNUNET_SERVICE_client_continue' after %s\n"
8653msgstr "" 8575msgstr ""
8654 8576
8655#: src/util/service.c:1862 8577#: src/util/service.c:1826
8656msgid "" 8578msgid ""
8657"Could not bind to any of the ports I was supposed to, refusing to run!\n" 8579"Could not bind to any of the ports I was supposed to, refusing to run!\n"
8658msgstr "" 8580msgstr ""
@@ -8997,6 +8919,24 @@ msgid "`%s' failed on file `%s' at %s:%d with error: %s\n"
8997msgstr "" 8919msgstr ""
8998 8920
8999#, fuzzy 8921#, fuzzy
8922#~ msgid "# XT sessions active"
8923#~ msgstr ""
8924#~ "\n"
8925#~ "按任意键继续\n"
8926
8927#, fuzzy
8928#~ msgid "Failed to bind XU socket to %s: %s\n"
8929#~ msgstr "打开日志文件“%s”失败:%s\n"
8930
8931#, fuzzy
8932#~ msgid "Failed to open XU sockets\n"
8933#~ msgstr "打开日志文件“%s”失败:%s\n"
8934
8935#, fuzzy
8936#~ msgid "Failed to create XU network sockets\n"
8937#~ msgstr "发送消息失败。\n"
8938
8939#, fuzzy
9000#~ msgid "Print information about DV state" 8940#~ msgid "Print information about DV state"
9001#~ msgstr "无法获取有关用户“%s”的信息:%s\n" 8941#~ msgstr "无法获取有关用户“%s”的信息:%s\n"
9002 8942
diff --git a/src/ats/gnunet-service-ats-new.c b/src/ats/gnunet-service-ats-new.c
index a1666d8d3..f2bc1de7f 100644
--- a/src/ats/gnunet-service-ats-new.c
+++ b/src/ats/gnunet-service-ats-new.c
@@ -304,7 +304,7 @@ prop_ntoh (const struct PropertiesNBO *properties,
304 */ 304 */
305static void 305static void
306handle_suggest (void *cls, 306handle_suggest (void *cls,
307 const struct ExpressPreferenceMessage *msg) 307 const struct ExpressPreferenceMessage *msg)
308{ 308{
309 struct Client *c = cls; 309 struct Client *c = cls;
310 struct ClientPreference *cp; 310 struct ClientPreference *cp;
@@ -344,7 +344,7 @@ handle_suggest (void *cls,
344 */ 344 */
345static void 345static void
346handle_suggest_cancel (void *cls, 346handle_suggest_cancel (void *cls,
347 const struct ExpressPreferenceMessage *msg) 347 const struct ExpressPreferenceMessage *msg)
348{ 348{
349 struct Client *c = cls; 349 struct Client *c = cls;
350 struct ClientPreference *cp; 350 struct ClientPreference *cp;
@@ -772,13 +772,13 @@ GNUNET_SERVICE_MAIN
772 &client_disconnect_cb, 772 &client_disconnect_cb,
773 NULL, 773 NULL,
774 GNUNET_MQ_hd_fixed_size (suggest, 774 GNUNET_MQ_hd_fixed_size (suggest,
775 GNUNET_MESSAGE_TYPE_ATS_SUGGEST, 775 GNUNET_MESSAGE_TYPE_ATS_SUGGEST,
776 struct ExpressPreferenceMessage, 776 struct ExpressPreferenceMessage,
777 NULL), 777 NULL),
778 GNUNET_MQ_hd_fixed_size (suggest_cancel, 778 GNUNET_MQ_hd_fixed_size (suggest_cancel,
779 GNUNET_MESSAGE_TYPE_ATS_SUGGEST_CANCEL, 779 GNUNET_MESSAGE_TYPE_ATS_SUGGEST_CANCEL,
780 struct ExpressPreferenceMessage, 780 struct ExpressPreferenceMessage,
781 NULL), 781 NULL),
782 GNUNET_MQ_hd_fixed_size (start, 782 GNUNET_MQ_hd_fixed_size (start,
783 GNUNET_MESSAGE_TYPE_ATS_START, 783 GNUNET_MESSAGE_TYPE_ATS_START,
784 struct GNUNET_MessageHeader, 784 struct GNUNET_MessageHeader,
diff --git a/src/include/Makefile.am b/src/include/Makefile.am
index ca0f6050d..bd8eca256 100644
--- a/src/include/Makefile.am
+++ b/src/include/Makefile.am
@@ -127,6 +127,7 @@ gnunetinclude_HEADERS = \
127 gnunet_time_lib.h \ 127 gnunet_time_lib.h \
128 gnunet_transport_service.h \ 128 gnunet_transport_service.h \
129 gnunet_transport_address_service.h \ 129 gnunet_transport_address_service.h \
130 gnunet_transport_application_service.h \
130 gnunet_transport_communication_service.h \ 131 gnunet_transport_communication_service.h \
131 gnunet_transport_core_service.h \ 132 gnunet_transport_core_service.h \
132 gnunet_transport_hello_service.h \ 133 gnunet_transport_hello_service.h \
diff --git a/src/include/gnunet_ats_application_service.h b/src/include/gnunet_ats_application_service.h
index e942ca4d8..fbc6f48ac 100644
--- a/src/include/gnunet_ats_application_service.h
+++ b/src/include/gnunet_ats_application_service.h
@@ -83,9 +83,9 @@ struct GNUNET_ATS_ApplicationSuggestHandle;
83 */ 83 */
84struct GNUNET_ATS_ApplicationSuggestHandle * 84struct GNUNET_ATS_ApplicationSuggestHandle *
85GNUNET_ATS_application_suggest (struct GNUNET_ATS_ApplicationHandle *ch, 85GNUNET_ATS_application_suggest (struct GNUNET_ATS_ApplicationHandle *ch,
86 const struct GNUNET_PeerIdentity *peer, 86 const struct GNUNET_PeerIdentity *peer,
87 enum GNUNET_MQ_PreferenceKind pk, 87 enum GNUNET_MQ_PreferenceKind pk,
88 struct GNUNET_BANDWIDTH_Value32NBO bw); 88 struct GNUNET_BANDWIDTH_Value32NBO bw);
89 89
90 90
91/** 91/**
diff --git a/src/include/gnunet_peerstore_service.h b/src/include/gnunet_peerstore_service.h
index 55f371399..31567c004 100644
--- a/src/include/gnunet_peerstore_service.h
+++ b/src/include/gnunet_peerstore_service.h
@@ -1,6 +1,6 @@
1/* 1/*
2 This file is part of GNUnet 2 This file is part of GNUnet
3 Copyright (C) 3 Copyright (C) GNUnet e.V. 2004--2019
4 4
5 GNUnet is free software: you can redistribute it and/or modify it 5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published 6 under the terms of the GNU Affero General Public License as published
@@ -11,7 +11,7 @@
11 WITHOUT ANY WARRANTY; without even the implied warranty of 11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details. 13 Affero General Public License for more details.
14 14
15 You should have received a copy of the GNU Affero General Public License 15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. 16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 17
diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h
index 46620b829..7f1667d51 100644
--- a/src/include/gnunet_protocols.h
+++ b/src/include/gnunet_protocols.h
@@ -3177,6 +3177,18 @@ extern "C"
3177 */ 3177 */
3178#define GNUNET_MESSAGE_TYPE_TRANSPORT_COMMUNICATOR_FC_LIMITS 1276 3178#define GNUNET_MESSAGE_TYPE_TRANSPORT_COMMUNICATOR_FC_LIMITS 1276
3179 3179
3180/**
3181 * Type of the 'struct ExpressPreferenceMessage' send by clients to TRANSPORT
3182 * to establish bandwidth preference.
3183 */
3184#define GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST 1300
3185
3186/**
3187 * Type of the 'struct ExpressPreferenceMessage' send by clients to TRANSPORT
3188 * to abandon bandwidth preference.
3189 */
3190#define GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST_CANCEL 1301
3191
3180 3192
3181/* ************** NEW (NG) ATS Messages ************* */ 3193/* ************** NEW (NG) ATS Messages ************* */
3182 3194
diff --git a/src/include/gnunet_transport_application_service.h b/src/include/gnunet_transport_application_service.h
new file mode 100644
index 000000000..31097b88e
--- /dev/null
+++ b/src/include/gnunet_transport_application_service.h
@@ -0,0 +1,100 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2010-2015, 2018, 2019 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20/**
21 * @file
22 * Bandwidth allocation API for applications to interact with
23 *
24 * @author Christian Grothoff
25 * @author Matthias Wachs
26 *
27 * @defgroup TRANSPORT service
28 * Bandwidth allocation
29 *
30 * @{
31 */
32#ifndef GNUNET_TRANSPORT_APPLICATION_SERVICE_H
33#define GNUNET_TRANSPORT_APPLICATION_SERVICE_H
34
35#include "gnunet_constants.h"
36#include "gnunet_util_lib.h"
37
38/**
39 * Handle to the TRANSPORT subsystem for making suggestions about
40 * connections the peer would like to have.
41 */
42struct GNUNET_TRANSPORT_ApplicationHandle;
43
44
45/**
46 * Initialize the TRANSPORT application client handle.
47 *
48 * @param cfg configuration to use
49 * @return ats application handle, NULL on error
50 */
51struct GNUNET_TRANSPORT_ApplicationHandle *
52GNUNET_TRANSPORT_application_init (const struct GNUNET_CONFIGURATION_Handle *cfg);
53
54
55/**
56 * Shutdown TRANSPORT application client.
57 *
58 * @param ch handle to destroy
59 */
60void
61GNUNET_TRANSPORT_application_done (struct GNUNET_TRANSPORT_ApplicationHandle *ch);
62
63
64/**
65 * Handle for suggestion requests.
66 */
67struct GNUNET_TRANSPORT_ApplicationSuggestHandle;
68
69
70/**
71 * An application would like to communicate with a peer. TRANSPORT should
72 * allocate bandwith using a suitable address for requiremetns @a pk
73 * to transport.
74 *
75 * @param ch handle
76 * @param peer identity of the peer we need an address for
77 * @param pk what kind of application will the application require (can be
78 * #GNUNET_MQ_PREFERENCE_NONE, we will still try to connect)
79 * @param bw desired bandwith, can be zero (we will still try to connect)
80 * @return suggestion handle, NULL if request is already pending
81 */
82struct GNUNET_TRANSPORT_ApplicationSuggestHandle *
83GNUNET_TRANSPORT_application_suggest (struct GNUNET_TRANSPORT_ApplicationHandle *ch,
84 const struct GNUNET_PeerIdentity *peer,
85 enum GNUNET_MQ_PreferenceKind pk,
86 struct GNUNET_BANDWIDTH_Value32NBO bw);
87
88
89/**
90 * We no longer care about communicating with a peer.
91 *
92 * @param sh handle
93 */
94void
95GNUNET_TRANSPORT_application_suggest_cancel (struct GNUNET_TRANSPORT_ApplicationSuggestHandle *sh);
96
97/** @} */ /* end of group */
98
99#endif
100/* end of file gnunet_ats_application_service.h */
diff --git a/src/include/gnunet_util_lib.h b/src/include/gnunet_util_lib.h
index 40a0ca641..a7bd7ce4b 100644
--- a/src/include/gnunet_util_lib.h
+++ b/src/include/gnunet_util_lib.h
@@ -11,7 +11,7 @@
11 WITHOUT ANY WARRANTY; without even the implied warranty of 11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details. 13 Affero General Public License for more details.
14 14
15 You should have received a copy of the GNU Affero General Public License 15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. 16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 17
diff --git a/src/namestore/test_namestore_delete.sh b/src/namestore/test_namestore_delete.sh
index 8c776104a..44ea1e66c 100755
--- a/src/namestore/test_namestore_delete.sh
+++ b/src/namestore/test_namestore_delete.sh
@@ -61,15 +61,15 @@ for LINE in $OUTPUT ;
61stop_peer 61stop_peer
62 62
63 63
64if [ $FOUND_NAME == false -a $FOUND_IP != false ] 64if [ $FOUND_NAME = false -a $FOUND_IP != false ]
65then 65then
66 echo "PASS: Delete name in namestore" 66 echo "PASS: Delete name in namestore"
67 exit 0 67 exit 0
68elif [ $FOUND_NAME == true ] 68elif [ $FOUND_NAME = true ]
69then 69then
70 echo "FAIL: Delete name in namestore: name returned" 70 echo "FAIL: Delete name in namestore: name returned"
71 exit 1 71 exit 1
72elif [ $FOUND_IP == true ] 72elif [ $FOUND_IP = true ]
73then 73then
74 echo "FAIL: Delete name in namestore: IP returned" 74 echo "FAIL: Delete name in namestore: IP returned"
75 exit 1 75 exit 1
diff --git a/src/namestore/test_namestore_lookup.sh b/src/namestore/test_namestore_lookup.sh
index 90735b17e..1c96e102a 100755
--- a/src/namestore/test_namestore_lookup.sh
+++ b/src/namestore/test_namestore_lookup.sh
@@ -19,20 +19,10 @@ TEST_IP_PLUS="127.0.0.1"
19TEST_RECORD_NAME_DNS="www3" 19TEST_RECORD_NAME_DNS="www3"
20which timeout &> /dev/null && DO_TIMEOUT="timeout 5" 20which timeout &> /dev/null && DO_TIMEOUT="timeout 5"
21 21
22function start_peer 22# start peer
23{ 23gnunet-arm -s -c $CONFIGURATION
24 gnunet-arm -s -c $CONFIGURATION 24gnunet-identity -C testego -c $CONFIGURATION
25 gnunet-identity -C testego -c $CONFIGURATION
26}
27 25
28function stop_peer
29{
30 gnunet-identity -D testego -c $CONFIGURATION
31 gnunet-arm -e -c $CONFIGURATION
32}
33
34
35start_peer
36# Create a public record 26# Create a public record
37gnunet-namestore -p -z testego -a -n $TEST_RECORD_NAME_DNS -t A -V $TEST_IP_PLUS -e never -c $CONFIGURATION 27gnunet-namestore -p -z testego -a -n $TEST_RECORD_NAME_DNS -t A -V $TEST_IP_PLUS -e never -c $CONFIGURATION
38NAMESTORE_RES=$? 28NAMESTORE_RES=$?
@@ -52,19 +42,21 @@ for LINE in $OUTPUT ;
52 FOUND_IP=true; 42 FOUND_IP=true;
53 #echo $FOUND_IP 43 #echo $FOUND_IP
54 fi 44 fi
55 done 45done
56stop_peer 46# stop peer
47gnunet-identity -D testego -c $CONFIGURATION
48gnunet-arm -e -c $CONFIGURATION
57 49
58 50
59if [ $FOUND_NAME == true -a $FOUND_IP == true ] 51if [ $FOUND_NAME = true -a $FOUND_IP = true ]
60then 52then
61 echo "PASS: Lookup name in namestore" 53 echo "PASS: Lookup name in namestore"
62 exit 0 54 exit 0
63elif [ $FOUND_NAME == false ] 55elif [ $FOUND_NAME = false ]
64then 56then
65 echo "FAIL: Lookup name in namestore: name not returned" 57 echo "FAIL: Lookup name in namestore: name not returned"
66 exit 1 58 exit 1
67elif [ $FOUND_IP == false ] 59elif [ $FOUND_IP = false ]
68then 60then
69 echo "FAIL: Lookup name in namestore: IP not returned" 61 echo "FAIL: Lookup name in namestore: IP not returned"
70 exit 1 62 exit 1
diff --git a/src/namestore/test_namestore_put.sh b/src/namestore/test_namestore_put.sh
index 6b6647d5f..eaf7d44b4 100755
--- a/src/namestore/test_namestore_put.sh
+++ b/src/namestore/test_namestore_put.sh
@@ -46,7 +46,7 @@ gnunet-namestore -p -z testego -a -n $TEST_RECORD_NAME_DNS -t A -V $TEST_IP_PLUS
46NAMESTORE_RES=$? 46NAMESTORE_RES=$?
47stop_peer 47stop_peer
48 48
49if [ $NAMESTORE_RES == 0 ] 49if [ $NAMESTORE_RES = 0 ]
50then 50then
51 echo "PASS: Creating name in namestore" 51 echo "PASS: Creating name in namestore"
52else 52else
diff --git a/src/peerinfo-tool/Makefile.am b/src/peerinfo-tool/Makefile.am
index 429224650..a5fd60246 100644
--- a/src/peerinfo-tool/Makefile.am
+++ b/src/peerinfo-tool/Makefile.am
@@ -10,11 +10,33 @@ if USE_COVERAGE
10 XLIB = -lgcov 10 XLIB = -lgcov
11endif 11endif
12 12
13if HAVE_MHD
14if HAVE_JSON
15REST_PLUGIN = libgnunet_plugin_rest_peerinfo.la
16endif
17endif
18
13plugindir = $(libdir)/gnunet 19plugindir = $(libdir)/gnunet
14 20
21plugin_LTLIBRARIES = $(REST_PLUGIN)
22
15bin_PROGRAMS = \ 23bin_PROGRAMS = \
16 gnunet-peerinfo 24 gnunet-peerinfo
17 25
26libgnunet_plugin_rest_peerinfo_la_SOURCES = \
27 plugin_rest_peerinfo.c
28libgnunet_plugin_rest_peerinfo_la_LIBADD = \
29 $(top_builddir)/src/hello/libgnunethello.la \
30 $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
31 $(top_builddir)/src/transport/libgnunettransport.la \
32 $(top_builddir)/src/rest/libgnunetrest.la \
33 $(top_builddir)/src/json/libgnunetjson.la \
34 $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) \
35 $(LTLIBINTL) -ljansson -lmicrohttpd
36libgnunet_plugin_rest_peerinfo_la_LDFLAGS = \
37 $(GN_PLUGIN_LDFLAGS)
38
39
18gnunet_peerinfo_SOURCES = \ 40gnunet_peerinfo_SOURCES = \
19 gnunet-peerinfo.c \ 41 gnunet-peerinfo.c \
20 gnunet-peerinfo_plugins.c gnunet-peerinfo_plugins.h 42 gnunet-peerinfo_plugins.c gnunet-peerinfo_plugins.h
diff --git a/src/peerinfo/plugin_rest_peerinfo.c b/src/peerinfo-tool/plugin_rest_peerinfo.c
index 24af2c193..24af2c193 100644
--- a/src/peerinfo/plugin_rest_peerinfo.c
+++ b/src/peerinfo-tool/plugin_rest_peerinfo.c
diff --git a/src/peerinfo/Makefile.am b/src/peerinfo/Makefile.am
index 3c710eb93..d07ed3a5b 100644
--- a/src/peerinfo/Makefile.am
+++ b/src/peerinfo/Makefile.am
@@ -19,28 +19,8 @@ if USE_COVERAGE
19 XLIB = -lgcov 19 XLIB = -lgcov
20endif 20endif
21 21
22if HAVE_MHD
23if HAVE_JSON
24REST_PLUGIN = libgnunet_plugin_rest_peerinfo.la
25endif
26endif
27
28lib_LTLIBRARIES = libgnunetpeerinfo.la 22lib_LTLIBRARIES = libgnunetpeerinfo.la
29 23
30plugin_LTLIBRARIES = $(REST_PLUGIN)
31
32libgnunet_plugin_rest_peerinfo_la_SOURCES = \
33 plugin_rest_peerinfo.c
34libgnunet_plugin_rest_peerinfo_la_LIBADD = \
35 $(top_builddir)/src/hello/libgnunethello.la \
36 libgnunetpeerinfo.la \
37 $(top_builddir)/src/rest/libgnunetrest.la \
38 $(top_builddir)/src/json/libgnunetjson.la \
39 $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) \
40 $(LTLIBINTL) -ljansson -lmicrohttpd
41libgnunet_plugin_rest_peerinfo_la_LDFLAGS = \
42 $(GN_PLUGIN_LDFLAGS)
43
44 24
45libgnunetpeerinfo_la_SOURCES = \ 25libgnunetpeerinfo_la_SOURCES = \
46 peerinfo_api.c peerinfo.h \ 26 peerinfo_api.c peerinfo.h \
diff --git a/src/rps/Makefile.am b/src/rps/Makefile.am
index b391eb8ae..ce73caa0f 100644
--- a/src/rps/Makefile.am
+++ b/src/rps/Makefile.am
@@ -36,6 +36,7 @@ libgnunetrps_la_SOURCES = \
36 rps-sampler_client.h rps-sampler_client.c \ 36 rps-sampler_client.h rps-sampler_client.c \
37 rps_api.c rps.h 37 rps_api.c rps.h
38libgnunetrps_la_LIBADD = \ 38libgnunetrps_la_LIBADD = \
39 $(top_builddir)/src/nse/libgnunetnse.la \
39 $(top_builddir)/src/util/libgnunetutil.la \ 40 $(top_builddir)/src/util/libgnunetutil.la \
40 $(GN_LIBINTL) $(XLIB) 41 $(GN_LIBINTL) $(XLIB)
41libgnunetrps_la_LDFLAGS = \ 42libgnunetrps_la_LDFLAGS = \
@@ -87,11 +88,14 @@ check_PROGRAMS = \
87 test_rps_sub \ 88 test_rps_sub \
88 test_rps_seed_request \ 89 test_rps_seed_request \
89 test_rps_seed_big \ 90 test_rps_seed_big \
90 test_rps_churn \ 91 test_rps_churn
92if ENABLE_MALICIOUS
93check_PROGRAMS += \
91 test_rps_malicious_1 \ 94 test_rps_malicious_1 \
92 test_rps_malicious_2 \ 95 test_rps_malicious_2 \
93 test_rps_malicious_3 96 test_rps_malicious_3
94endif 97endif
98endif
95 99
96rps_test_src = \ 100rps_test_src = \
97 test_rps.c \ 101 test_rps.c \
diff --git a/src/rps/gnunet-rps-profiler.c b/src/rps/gnunet-rps-profiler.c
index af27546f2..a852d94b1 100644
--- a/src/rps/gnunet-rps-profiler.c
+++ b/src/rps/gnunet-rps-profiler.c
@@ -1041,7 +1041,9 @@ cancel_request (struct PendingReply *pending_rep)
1041 "Cancelling rps get reply\n"); 1041 "Cancelling rps get reply\n");
1042 GNUNET_assert (NULL != pending_rep->req_handle); 1042 GNUNET_assert (NULL != pending_rep->req_handle);
1043 GNUNET_RPS_request_cancel (pending_rep->req_handle); 1043 GNUNET_RPS_request_cancel (pending_rep->req_handle);
1044 pending_rep->req_handle = NULL;
1044 GNUNET_free (pending_rep); 1045 GNUNET_free (pending_rep);
1046 pending_rep = NULL;
1045} 1047}
1046 1048
1047void 1049void
@@ -2061,29 +2063,8 @@ profiler_eval (void)
2061 return evaluate (); 2063 return evaluate ();
2062} 2064}
2063 2065
2064static uint32_t fac (uint32_t x)
2065{
2066 if (1 >= x)
2067 {
2068 return x;
2069 }
2070 return x * fac (x - 1);
2071}
2072 2066
2073static uint32_t binom (uint32_t n, uint32_t k) 2067/** @brief is b in view of a?
2074{
2075 //GNUNET_assert (n >= k);
2076 if (k > n) return 0;
2077 /* if (0 > n) return 0; - always false */
2078 /* if (0 > k) return 0; - always false */
2079 if (0 == k) return 1;
2080 return fac (n)
2081 /
2082 fac(k) * fac(n - k);
2083}
2084
2085/**
2086 * @brief is b in view of a?
2087 * 2068 *
2088 * @param a 2069 * @param a
2089 * @param b 2070 * @param b
diff --git a/src/rps/gnunet-service-rps_sampler.h b/src/rps/gnunet-service-rps_sampler.h
index 921570f7d..d8e5f3efd 100644
--- a/src/rps/gnunet-service-rps_sampler.h
+++ b/src/rps/gnunet-service-rps_sampler.h
@@ -70,7 +70,7 @@ RPS_sampler_resize (struct RPS_Sampler *sampler, unsigned int new_size);
70 */ 70 */
71struct RPS_Sampler * 71struct RPS_Sampler *
72RPS_sampler_init (size_t init_size, 72RPS_sampler_init (size_t init_size,
73 struct GNUNET_TIME_Relative max_round_interval); 73 struct GNUNET_TIME_Relative max_round_interval);
74 74
75 75
76/** 76/**
diff --git a/src/rps/profiler_rps.conf b/src/rps/profiler_rps.conf
index 6049da5a0..5edd6d3ff 100644
--- a/src/rps/profiler_rps.conf
+++ b/src/rps/profiler_rps.conf
@@ -22,6 +22,9 @@ FILENAME_VALID_PEERS = $GNUNET_DATA_HOME/rps/valid_peers.txt
22# So, 50 is enough for a network of size 50^3 = 125000 22# So, 50 is enough for a network of size 50^3 = 125000
23MINSIZE = 4 23MINSIZE = 4
24 24
25DESIRED_PROBABILITY = 0.75
26
27DEFICIENCY_FACTOR = 0.4
25 28
26 29
27[testbed] 30[testbed]
diff --git a/src/rps/rps-sampler_client.c b/src/rps/rps-sampler_client.c
index 1ba60e1a8..0de25df07 100644
--- a/src/rps/rps-sampler_client.c
+++ b/src/rps/rps-sampler_client.c
@@ -219,6 +219,41 @@ RPS_sampler_mod_init (size_t init_size,
219 219
220 220
221/** 221/**
222 * @brief Compute the probability that we already observed all peers from a
223 * biased stream of peer ids.
224 *
225 * Deficiency factor:
226 * As introduced by Brahms: Factor between the number of unique ids in a
227 * truly random stream and number of unique ids in the gossip stream.
228 *
229 * @param num_peers_estim The estimated number of peers in the network
230 * @param num_peers_observed The number of peers the given element has observed
231 * @param deficiency_factor A factor that catches the 'bias' of a random stream
232 * of peer ids
233 *
234 * @return The estimated probability
235 */
236static double
237prob_observed_n_peers (uint32_t num_peers_estim,
238 uint32_t num_peers_observed,
239 double deficiency_factor)
240{
241 uint32_t num_peers = num_peers_estim * (1/deficiency_factor);
242 uint64_t sum = 0;
243
244 for (uint32_t i = 0; i < num_peers; i++)
245 {
246 uint64_t a = pow (-1, num_peers-i);
247 uint64_t b = binom (num_peers, i);
248 uint64_t c = pow (i, num_peers_observed);
249 sum += a * b * c;
250 }
251
252 return sum / (double) pow (num_peers, num_peers_observed);
253}
254
255
256/**
222 * Get one random peer out of the sampled peers. 257 * Get one random peer out of the sampled peers.
223 * 258 *
224 * This reinitialises the queried sampler element. 259 * This reinitialises the queried sampler element.
@@ -230,6 +265,7 @@ sampler_mod_get_rand_peer (void *cls)
230 struct RPS_SamplerElement *s_elem; 265 struct RPS_SamplerElement *s_elem;
231 struct GNUNET_TIME_Relative last_request_diff; 266 struct GNUNET_TIME_Relative last_request_diff;
232 struct RPS_Sampler *sampler; 267 struct RPS_Sampler *sampler;
268 double prob_observed_n;
233 269
234 gpc->get_peer_task = NULL; 270 gpc->get_peer_task = NULL;
235 gpc->notify_ctx = NULL; 271 gpc->notify_ctx = NULL;
@@ -294,6 +330,24 @@ sampler_mod_get_rand_peer (void *cls)
294 gpc); 330 gpc);
295 return; 331 return;
296 } 332 }
333 /* compute probability */
334 prob_observed_n = prob_observed_n_peers (sampler->num_peers_estim,
335 s_elem->num_peers,
336 sampler->deficiency_factor);
337 /* check if probability is above desired */
338 if (prob_observed_n >= sampler->desired_probability)
339 {
340 LOG (GNUNET_ERROR_TYPE_DEBUG,
341 "Probability of having observed all peers (%d) too small ( < %d).\n",
342 prob_observed_n,
343 sampler->desired_probability);
344 GNUNET_assert (NULL == gpc->notify_ctx);
345 gpc->notify_ctx =
346 sampler_notify_on_update (sampler,
347 &sampler_mod_get_rand_peer,
348 gpc);
349 return;
350 }
297 /* More reasons to wait could be added here */ 351 /* More reasons to wait could be added here */
298 352
299// GNUNET_STATISTICS_set (stats, 353// GNUNET_STATISTICS_set (stats,
diff --git a/src/rps/rps-sampler_common.c b/src/rps/rps-sampler_common.c
index 2b0569c61..3ed4ef989 100644
--- a/src/rps/rps-sampler_common.c
+++ b/src/rps/rps-sampler_common.c
@@ -116,6 +116,60 @@ struct RPS_SamplerRequestHandle
116 116
117 117
118/** 118/**
119 * @brief Update the current estimate of the network size stored at the sampler
120 *
121 * Used for computing the condition when to return elements to the client
122 *
123 * Only used/useful with the client sampler
124 * (Maybe move to rps-sampler_client.{h|c} ?)
125 *
126 * @param sampler The sampler to update
127 * @param num_peers The estimated value
128 */
129void
130RPS_sampler_update_with_nw_size (struct RPS_Sampler *sampler,
131 uint32_t num_peers)
132{
133 sampler->num_peers_estim = num_peers;
134}
135
136
137/**
138 * @brief Set the probability that is needed at least with what a sampler
139 * element has to have observed all elements from the network.
140 *
141 * Only used/useful with the client sampler
142 * (Maybe move to rps-sampler_client.{h|c} ?)
143 *
144 * @param sampler
145 * @param desired_probability
146 */
147void
148RPS_sampler_set_desired_probability (struct RPS_Sampler *sampler,
149 double desired_probability)
150{
151 sampler->desired_probability = desired_probability;
152}
153
154
155/**
156 * @brief Set the deficiency factor.
157 *
158 * Only used/useful with the client sampler
159 * (Maybe move to rps-sampler_client.{h|c} ?)
160 *
161 * @param sampler
162 * @param desired_probability
163 */
164void
165RPS_sampler_set_deficiency_factor (struct RPS_Sampler *sampler,
166 double deficiency_factor)
167{
168 sampler->deficiency_factor = deficiency_factor;
169}
170
171
172/**
119 * @brief Add a callback that will be called when the next peer is inserted 173 * @brief Add a callback that will be called when the next peer is inserted
120 * into the sampler 174 * into the sampler
121 * 175 *
diff --git a/src/rps/rps-sampler_common.h b/src/rps/rps-sampler_common.h
index e36f6e834..1abe43720 100644
--- a/src/rps/rps-sampler_common.h
+++ b/src/rps/rps-sampler_common.h
@@ -147,6 +147,25 @@ struct RPS_Sampler
147 struct GNUNET_TIME_Relative max_round_interval; 147 struct GNUNET_TIME_Relative max_round_interval;
148 148
149 /** 149 /**
150 * @brief The estimated total number of peers in the network
151 */
152 uint32_t num_peers_estim;
153
154 /**
155 * @brief The desired probability with which we want to have observed all
156 * peers.
157 */
158 double desired_probability;
159
160 /**
161 * @brief A factor that catches the 'bias' of a random stream of peer ids.
162 *
163 * As introduced by Brahms: Factor between the number of unique ids in a
164 * truly random stream and number of unique ids in the gossip stream.
165 */
166 double deficiency_factor;
167
168 /**
150 * Stores the function to return peers. Which one it is depends on whether 169 * Stores the function to return peers. Which one it is depends on whether
151 * the Sampler is the modified one or not. 170 * the Sampler is the modified one or not.
152 */ 171 */
@@ -164,6 +183,48 @@ struct RPS_Sampler
164 183
165 184
166/** 185/**
186 * @brief Update the current estimate of the network size stored at the sampler
187 *
188 * Used for computing the condition when to return elements to the client
189 *
190 * @param sampler The sampler to update
191 * @param num_peers The estimated value
192 */
193void
194RPS_sampler_update_with_nw_size (struct RPS_Sampler *sampler,
195 uint32_t num_peers);
196
197
198/**
199 * @brief Set the probability that is needed at least with what a sampler
200 * element has to have observed all elements from the network.
201 *
202 * Only used/useful with the client sampler
203 * (Maybe move to rps-sampler_client.{h|c} ?)
204 *
205 * @param sampler
206 * @param desired_probability
207 */
208void
209RPS_sampler_set_desired_probability (struct RPS_Sampler *sampler,
210 double desired_probability);
211
212
213/**
214 * @brief Set the deficiency factor.
215 *
216 * Only used/useful with the client sampler
217 * (Maybe move to rps-sampler_client.{h|c} ?)
218 *
219 * @param sampler
220 * @param desired_probability
221 */
222void
223RPS_sampler_set_deficiency_factor (struct RPS_Sampler *sampler,
224 double deficiency_factor);
225
226
227/**
167 * @brief Add a callback that will be called when the next peer is inserted 228 * @brief Add a callback that will be called when the next peer is inserted
168 * into the sampler 229 * into the sampler
169 * 230 *
diff --git a/src/rps/rps-test_util.c b/src/rps/rps-test_util.c
index 077750329..fcb4f59a0 100644
--- a/src/rps/rps-test_util.c
+++ b/src/rps/rps-test_util.c
@@ -487,4 +487,42 @@ store_prefix_file_name (const struct GNUNET_PeerIdentity *peer,
487 return file_name; 487 return file_name;
488} 488}
489 489
490
491/**
492 * @brief Factorial
493 *
494 * @param x Number of which to compute the factorial
495 *
496 * @return Factorial of @a x
497 */
498uint32_t fac (uint32_t x)
499{
500 if (1 >= x)
501 {
502 return x;
503 }
504 return x * fac (x - 1);
505}
506
507/**
508 * @brief Binomial coefficient (n choose k)
509 *
510 * @param n
511 * @param k
512 *
513 * @return Binomial coefficient of @a n and @a k
514 */
515uint32_t binom (uint32_t n, uint32_t k)
516{
517 //GNUNET_assert (n >= k);
518 if (k > n) return 0;
519 /* if (0 > n) return 0; - always false */
520 /* if (0 > k) return 0; - always false */
521 if (0 == k) return 1;
522 return fac (n)
523 /
524 fac(k) * fac(n - k);
525}
526
527
490/* end of gnunet-service-rps.c */ 528/* end of gnunet-service-rps.c */
diff --git a/src/rps/rps-test_util.h b/src/rps/rps-test_util.h
index 5009073d0..6b5f568d7 100644
--- a/src/rps/rps-test_util.h
+++ b/src/rps/rps-test_util.h
@@ -107,5 +107,26 @@ to_file_raw_unaligned (const char *file_name,
107 size_t size_buf, 107 size_t size_buf,
108 unsigned bits_needed); 108 unsigned bits_needed);
109 109
110
111/**
112 * @brief Factorial
113 *
114 * @param x Number of which to compute the factorial
115 *
116 * @return Factorial of @a x
117 */
118uint32_t fac (uint32_t x);
119
120
121/**
122 * @brief Binomial coefficient (n choose k)
123 *
124 * @param n
125 * @param k
126 *
127 * @return Binomial coefficient of @a n and @a k
128 */
129uint32_t binom (uint32_t n, uint32_t k);
130
110#endif /* RPS_TEST_UTIL_H */ 131#endif /* RPS_TEST_UTIL_H */
111/* end of gnunet-service-rps.c */ 132/* end of gnunet-service-rps.c */
diff --git a/src/rps/rps.conf.in b/src/rps/rps.conf.in
index ff701e371..9619c9889 100644
--- a/src/rps/rps.conf.in
+++ b/src/rps/rps.conf.in
@@ -26,3 +26,13 @@ FILENAME_VALID_PEERS = $GNUNET_DATA_HOME/rps/valid_peers.txt
26# Keep in mind, that (networksize)^(1/3) should be enough. 26# Keep in mind, that (networksize)^(1/3) should be enough.
27# So, 50 is enough for a network of size 50^3 = 125000 27# So, 50 is enough for a network of size 50^3 = 125000
28MINSIZE = 10 28MINSIZE = 10
29
30# The probability whith which we want a sampler element to have observed all
31# peer ids in the network at least
32DESIRED_PROBABILITY = 0.9
33
34# A factor that catches the 'bias' of a random stream of peer ids.
35#
36# As introduced by Brahms: Factor between the number of unique ids in a
37# truly random stream and number of unique ids in the gossip stream.
38DEFICIENCY_FACTOR = 0.4
diff --git a/src/rps/rps_api.c b/src/rps/rps_api.c
index d0b241a2b..7a3adfa94 100644
--- a/src/rps/rps_api.c
+++ b/src/rps/rps_api.c
@@ -29,6 +29,8 @@
29#include "gnunet_rps_service.h" 29#include "gnunet_rps_service.h"
30#include "rps-sampler_client.h" 30#include "rps-sampler_client.h"
31 31
32#include "gnunet_nse_service.h"
33
32#include <inttypes.h> 34#include <inttypes.h>
33 35
34#define LOG(kind,...) GNUNET_log_from (kind, "rps-api",__VA_ARGS__) 36#define LOG(kind,...) GNUNET_log_from (kind, "rps-api",__VA_ARGS__)
@@ -109,6 +111,35 @@ struct GNUNET_RPS_Handle
109 * @brief Tail of the DLL of stream requests 111 * @brief Tail of the DLL of stream requests
110 */ 112 */
111 struct GNUNET_RPS_StreamRequestHandle *stream_requests_tail; 113 struct GNUNET_RPS_StreamRequestHandle *stream_requests_tail;
114
115 /**
116 * @brief Handle to nse service
117 */
118 struct GNUNET_NSE_Handle *nse;
119
120 /**
121 * @brief Pointer to the head element in DLL of request handles
122 */
123 struct GNUNET_RPS_Request_Handle *rh_head;
124
125 /**
126 * @brief Pointer to the tail element in DLL of request handles
127 */
128 struct GNUNET_RPS_Request_Handle *rh_tail;
129
130 /**
131 * @brief The desired probability with which we want to have observed all
132 * peers.
133 */
134 float desired_probability;
135
136 /**
137 * @brief A factor that catches the 'bias' of a random stream of peer ids.
138 *
139 * As introduced by Brahms: Factor between the number of unique ids in a
140 * truly random stream and number of unique ids in the gossip stream.
141 */
142 float deficiency_factor;
112}; 143};
113 144
114 145
@@ -152,6 +183,16 @@ struct GNUNET_RPS_Request_Handle
152 * The closure for the callback. 183 * The closure for the callback.
153 */ 184 */
154 void *ready_cb_cls; 185 void *ready_cb_cls;
186
187 /**
188 * @brief Pointer to next element in DLL
189 */
190 struct GNUNET_RPS_Request_Handle *next;
191
192 /**
193 * @brief Pointer to previous element in DLL
194 */
195 struct GNUNET_RPS_Request_Handle *prev;
155}; 196};
156 197
157 198
@@ -263,10 +304,7 @@ peers_ready_cb (const struct GNUNET_PeerIdentity *peers,
263 rh->ready_cb (rh->ready_cb_cls, 304 rh->ready_cb (rh->ready_cb_cls,
264 num_peers, 305 num_peers,
265 peers); 306 peers);
266 GNUNET_RPS_stream_cancel (rh->srh); 307 GNUNET_RPS_request_cancel (rh);
267 rh->srh = NULL;
268 RPS_sampler_destroy (rh->sampler);
269 rh->sampler = NULL;
270} 308}
271 309
272 310
@@ -607,6 +645,37 @@ hash_from_share_val (const char *share_val,
607 645
608 646
609/** 647/**
648 * @brief Callback for network size estimate - called with new estimates about
649 * the network size, updates all samplers with the new estimate
650 *
651 * Implements #GNUNET_NSE_Callback
652 *
653 * @param cls the rps handle
654 * @param timestamp unused
655 * @param logestimate the estimate
656 * @param std_dev the standard distribution
657 */
658static void
659nse_cb (void *cls,
660 struct GNUNET_TIME_Absolute timestamp,
661 double logestimate,
662 double std_dev)
663{
664 struct GNUNET_RPS_Handle *h = cls;
665 (void) timestamp;
666 (void) std_dev;
667
668 for (struct GNUNET_RPS_Request_Handle *rh_iter = h->rh_head;
669 NULL != rh_iter && NULL != rh_iter->next;
670 rh_iter = rh_iter->next)
671 {
672 RPS_sampler_update_with_nw_size (rh_iter->sampler,
673 GNUNET_NSE_log_estimate_to_n (logestimate));
674 }
675}
676
677
678/**
610 * Reconnect to the service 679 * Reconnect to the service
611 */ 680 */
612static void 681static void
@@ -631,6 +700,9 @@ reconnect (struct GNUNET_RPS_Handle *h)
631 mq_handlers, 700 mq_handlers,
632 &mq_error_handler, 701 &mq_error_handler,
633 h); 702 h);
703 if (NULL != h->nse)
704 GNUNET_NSE_disconnect (h->nse);
705 h->nse = GNUNET_NSE_connect (h->cfg, &nse_cb, h);
634} 706}
635 707
636 708
@@ -638,7 +710,7 @@ reconnect (struct GNUNET_RPS_Handle *h)
638 * Connect to the rps service 710 * Connect to the rps service
639 * 711 *
640 * @param cfg configuration to use 712 * @param cfg configuration to use
641 * @return a handle to the service 713 * @return a handle to the service, NULL on error
642 */ 714 */
643struct GNUNET_RPS_Handle * 715struct GNUNET_RPS_Handle *
644GNUNET_RPS_connect (const struct GNUNET_CONFIGURATION_Handle *cfg) 716GNUNET_RPS_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
@@ -647,6 +719,44 @@ GNUNET_RPS_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
647 719
648 h = GNUNET_new (struct GNUNET_RPS_Handle); 720 h = GNUNET_new (struct GNUNET_RPS_Handle);
649 h->cfg = cfg; 721 h->cfg = cfg;
722 if (GNUNET_OK !=
723 GNUNET_CONFIGURATION_get_value_float (cfg,
724 "RPS",
725 "DESIRED_PROBABILITY",
726 &h->desired_probability))
727 {
728 GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
729 "RPS", "DESIRED_PROBABILITY");
730 GNUNET_free (h);
731 return NULL;
732 }
733 if (0 > h->desired_probability ||
734 1 < h->desired_probability)
735 {
736 LOG (GNUNET_ERROR_TYPE_ERROR,
737 "The desired probability must be in the interval [0;1]\n");
738 GNUNET_free (h);
739 return NULL;
740 }
741 if (GNUNET_OK !=
742 GNUNET_CONFIGURATION_get_value_float (cfg,
743 "RPS",
744 "DEFICIENCY_FACTOR",
745 &h->deficiency_factor))
746 {
747 GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
748 "RPS", "DEFICIENCY_FACTOR");
749 GNUNET_free (h);
750 return NULL;
751 }
752 if (0 > h->desired_probability ||
753 1 < h->desired_probability)
754 {
755 LOG (GNUNET_ERROR_TYPE_ERROR,
756 "The deficiency factor must be in the interval [0;1]\n");
757 GNUNET_free (h);
758 return NULL;
759 }
650 reconnect (h); 760 reconnect (h);
651 if (NULL == h->mq) 761 if (NULL == h->mq)
652 { 762 {
@@ -725,6 +835,10 @@ GNUNET_RPS_request_peers (struct GNUNET_RPS_Handle *rps_handle,
725 rh->num_requests = num_req_peers; 835 rh->num_requests = num_req_peers;
726 rh->sampler = RPS_sampler_mod_init (num_req_peers, 836 rh->sampler = RPS_sampler_mod_init (num_req_peers,
727 GNUNET_TIME_UNIT_SECONDS); // TODO remove this time-stuff 837 GNUNET_TIME_UNIT_SECONDS); // TODO remove this time-stuff
838 RPS_sampler_set_desired_probability (rh->sampler,
839 rps_handle->desired_probability);
840 RPS_sampler_set_deficiency_factor (rh->sampler,
841 rps_handle->deficiency_factor);
728 rh->sampler_rh = RPS_sampler_get_n_rand_peers (rh->sampler, 842 rh->sampler_rh = RPS_sampler_get_n_rand_peers (rh->sampler,
729 num_req_peers, 843 num_req_peers,
730 peers_ready_cb, 844 peers_ready_cb,
@@ -734,6 +848,9 @@ GNUNET_RPS_request_peers (struct GNUNET_RPS_Handle *rps_handle,
734 rh); /* cls */ 848 rh); /* cls */
735 rh->ready_cb = ready_cb; 849 rh->ready_cb = ready_cb;
736 rh->ready_cb_cls = cls; 850 rh->ready_cb_cls = cls;
851 GNUNET_CONTAINER_DLL_insert (rps_handle->rh_head,
852 rps_handle->rh_tail,
853 rh);
737 854
738 return rh; 855 return rh;
739} 856}
@@ -911,6 +1028,7 @@ GNUNET_RPS_request_cancel (struct GNUNET_RPS_Request_Handle *rh)
911 1028
912 h = rh->rps_handle; 1029 h = rh->rps_handle;
913 GNUNET_assert (NULL != rh); 1030 GNUNET_assert (NULL != rh);
1031 GNUNET_assert (NULL != rh->srh);
914 GNUNET_assert (h == rh->srh->rps_handle); 1032 GNUNET_assert (h == rh->srh->rps_handle);
915 GNUNET_RPS_stream_cancel (rh->srh); 1033 GNUNET_RPS_stream_cancel (rh->srh);
916 rh->srh = NULL; 1034 rh->srh = NULL;
@@ -920,6 +1038,10 @@ GNUNET_RPS_request_cancel (struct GNUNET_RPS_Request_Handle *rh)
920 RPS_sampler_request_cancel (rh->sampler_rh); 1038 RPS_sampler_request_cancel (rh->sampler_rh);
921 } 1039 }
922 RPS_sampler_destroy (rh->sampler); 1040 RPS_sampler_destroy (rh->sampler);
1041 rh->sampler = NULL;
1042 GNUNET_CONTAINER_DLL_remove (h->rh_head,
1043 h->rh_tail,
1044 rh);
923 GNUNET_free (rh); 1045 GNUNET_free (rh);
924} 1046}
925 1047
@@ -939,13 +1061,24 @@ GNUNET_RPS_disconnect (struct GNUNET_RPS_Handle *h)
939 LOG (GNUNET_ERROR_TYPE_WARNING, 1061 LOG (GNUNET_ERROR_TYPE_WARNING,
940 "Still waiting for replies\n"); 1062 "Still waiting for replies\n");
941 for (struct GNUNET_RPS_StreamRequestHandle *srh_iter = h->stream_requests_head; 1063 for (struct GNUNET_RPS_StreamRequestHandle *srh_iter = h->stream_requests_head;
942 NULL != srh_iter; 1064 NULL != srh_iter;
943 srh_iter = srh_next) 1065 srh_iter = srh_next)
944 { 1066 {
945 srh_next = srh_iter->next; 1067 srh_next = srh_iter->next;
946 GNUNET_RPS_stream_cancel (srh_iter); 1068 GNUNET_RPS_stream_cancel (srh_iter);
947 } 1069 }
948 } 1070 }
1071 if (NULL != h->rh_head)
1072 {
1073 LOG (GNUNET_ERROR_TYPE_WARNING,
1074 "Not all requests were cancelled!\n");
1075 for (struct GNUNET_RPS_Request_Handle *rh_iter = h->rh_head;
1076 h->rh_head != NULL;
1077 rh_iter = h->rh_head)
1078 {
1079 GNUNET_RPS_request_cancel (rh_iter);
1080 }
1081 }
949 if (NULL != srh_callback_peers) 1082 if (NULL != srh_callback_peers)
950 { 1083 {
951 GNUNET_free (srh_callback_peers); 1084 GNUNET_free (srh_callback_peers);
@@ -957,6 +1090,8 @@ GNUNET_RPS_disconnect (struct GNUNET_RPS_Handle *h)
957 "Still waiting for view updates\n"); 1090 "Still waiting for view updates\n");
958 GNUNET_RPS_view_request_cancel (h); 1091 GNUNET_RPS_view_request_cancel (h);
959 } 1092 }
1093 if (NULL != h->nse)
1094 GNUNET_NSE_disconnect (h->nse);
960 GNUNET_MQ_destroy (h->mq); 1095 GNUNET_MQ_destroy (h->mq);
961 GNUNET_free (h); 1096 GNUNET_free (h);
962} 1097}
diff --git a/src/rps/test_rps.c b/src/rps/test_rps.c
index 26066bf10..7fc91743b 100644
--- a/src/rps/test_rps.c
+++ b/src/rps/test_rps.c
@@ -1964,26 +1964,6 @@ profiler_eval (void)
1964 return evaluate (); 1964 return evaluate ();
1965} 1965}
1966 1966
1967static uint32_t fac (uint32_t x)
1968{
1969 if (1 >= x)
1970 {
1971 return x;
1972 }
1973 return x * fac (x - 1);
1974}
1975
1976static uint32_t binom (uint32_t n, uint32_t k)
1977{
1978 //GNUNET_assert (n >= k);
1979 if (k > n) return 0;
1980 if (0 > n) return 0;
1981 if (0 > k) return 0;
1982 if (0 == k) return 1;
1983 return fac (n)
1984 /
1985 fac(k) * fac(n - k);
1986}
1987 1967
1988/** 1968/**
1989 * @brief is b in view of a? 1969 * @brief is b in view of a?
diff --git a/src/rps/test_rps.conf b/src/rps/test_rps.conf
index c22113af5..68f3982ec 100644
--- a/src/rps/test_rps.conf
+++ b/src/rps/test_rps.conf
@@ -22,6 +22,10 @@ FILENAME_VALID_PEERS = $GNUNET_DATA_HOME/rps/valid_peers.txt
22# So, 50 is enough for a network of size 50^3 = 125000 22# So, 50 is enough for a network of size 50^3 = 125000
23MINSIZE = 4 23MINSIZE = 4
24 24
25DESIRED_PROBABILITY = 0.75
26
27DEFICIENCY_FACTOR = 0.4
28
25 29
26 30
27[testbed] 31[testbed]
diff --git a/src/transport/Makefile.am b/src/transport/Makefile.am
index 9cf16ddb6..2865460fd 100644
--- a/src/transport/Makefile.am
+++ b/src/transport/Makefile.am
@@ -155,6 +155,7 @@ endif
155lib_LTLIBRARIES = \ 155lib_LTLIBRARIES = \
156 libgnunettransport.la \ 156 libgnunettransport.la \
157 libgnunettransportaddress.la \ 157 libgnunettransportaddress.la \
158 libgnunettransportapplication.la \
158 libgnunettransportcore.la \ 159 libgnunettransportcore.la \
159 libgnunettransportcommunicator.la \ 160 libgnunettransportcommunicator.la \
160 libgnunettransportmonitor.la \ 161 libgnunettransportmonitor.la \
@@ -196,6 +197,14 @@ libgnunettransport_la_LDFLAGS = \
196 $(GN_LIB_LDFLAGS) $(WINFLAGS) \ 197 $(GN_LIB_LDFLAGS) $(WINFLAGS) \
197 -version-info 4:0:2 198 -version-info 4:0:2
198 199
200libgnunettransportapplication_la_SOURCES = \
201 transport_api2_application.c
202libgnunettransportapplication_la_LIBADD = \
203 $(top_builddir)/src/util/libgnunetutil.la \
204 $(LTLIBINTL)
205libgnunettransportapplication_la_LDFLAGS = \
206 $(GN_LIB_LDFLAGS) $(WINFLAGS) \
207 -version-info 0:0:0
199 208
200 209
201libgnunettransportaddress_la_SOURCES = \ 210libgnunettransportaddress_la_SOURCES = \
@@ -360,7 +369,6 @@ gnunet_service_transport_CFLAGS = \
360gnunet_service_tng_SOURCES = \ 369gnunet_service_tng_SOURCES = \
361 gnunet-service-tng.c 370 gnunet-service-tng.c
362gnunet_service_tng_LDADD = \ 371gnunet_service_tng_LDADD = \
363 $(top_builddir)/src/ats/libgnunetatstransport.la \
364 $(top_builddir)/src/peerstore/libgnunetpeerstore.la \ 372 $(top_builddir)/src/peerstore/libgnunetpeerstore.la \
365 $(top_builddir)/src/hello/libgnunethello.la \ 373 $(top_builddir)/src/hello/libgnunethello.la \
366 $(top_builddir)/src/statistics/libgnunetstatistics.la \ 374 $(top_builddir)/src/statistics/libgnunetstatistics.la \
@@ -378,12 +386,6 @@ plugin_LTLIBRARIES = \
378 $(WLAN_PLUGIN_LA) \ 386 $(WLAN_PLUGIN_LA) \
379 $(BT_PLUGIN_LA) 387 $(BT_PLUGIN_LA)
380 388
381if HAVE_EXPERIMENTAL
382plugin_LTLIBRARIES += \
383 libgnunet_plugin_transport_xt.la \
384 libgnunet_plugin_transport_xu.la
385endif
386
387# Note: real plugins of course need to be added 389# Note: real plugins of course need to be added
388# to the plugin_LTLIBRARIES above 390# to the plugin_LTLIBRARIES above
389noinst_LTLIBRARIES = \ 391noinst_LTLIBRARIES = \
@@ -401,18 +403,6 @@ libgnunet_plugin_transport_tcp_la_LIBADD = \
401libgnunet_plugin_transport_tcp_la_LDFLAGS = \ 403libgnunet_plugin_transport_tcp_la_LDFLAGS = \
402 $(GN_PLUGIN_LDFLAGS) 404 $(GN_PLUGIN_LDFLAGS)
403 405
404libgnunet_plugin_transport_xt_la_SOURCES = \
405 plugin_transport_xt.c
406libgnunet_plugin_transport_xt_la_LIBADD = \
407 $(top_builddir)/src/hello/libgnunethello.la \
408 $(top_builddir)/src/statistics/libgnunetstatistics.la \
409 $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
410 $(top_builddir)/src/nat/libgnunetnatnew.la \
411 $(top_builddir)/src/util/libgnunetutil.la \
412 $(LTLIBINTL)
413libgnunet_plugin_transport_xt_la_LDFLAGS = \
414 $(GN_PLUGIN_LDFLAGS)
415
416libgnunet_plugin_transport_template_la_SOURCES = \ 406libgnunet_plugin_transport_template_la_SOURCES = \
417 plugin_transport_template.c 407 plugin_transport_template.c
418libgnunet_plugin_transport_template_la_LIBADD = \ 408libgnunet_plugin_transport_template_la_LIBADD = \
@@ -461,19 +451,6 @@ libgnunet_plugin_transport_udp_la_LIBADD = \
461libgnunet_plugin_transport_udp_la_LDFLAGS = \ 451libgnunet_plugin_transport_udp_la_LDFLAGS = \
462 $(GN_PLUGIN_LDFLAGS) 452 $(GN_PLUGIN_LDFLAGS)
463 453
464libgnunet_plugin_transport_xu_la_SOURCES = \
465 plugin_transport_xu.c plugin_transport_xu.h
466libgnunet_plugin_transport_xu_la_LIBADD = \
467 $(top_builddir)/src/hello/libgnunethello.la \
468 $(top_builddir)/src/fragmentation/libgnunetfragmentation.la \
469 $(top_builddir)/src/statistics/libgnunetstatistics.la \
470 $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
471 $(top_builddir)/src/nat/libgnunetnatnew.la \
472 $(top_builddir)/src/util/libgnunetutil.la \
473 $(LTLIBINTL)
474libgnunet_plugin_transport_xu_la_LDFLAGS = \
475 $(GN_PLUGIN_LDFLAGS)
476
477libgnunet_plugin_transport_unix_la_SOURCES = \ 454libgnunet_plugin_transport_unix_la_SOURCES = \
478 plugin_transport_unix.c 455 plugin_transport_unix.c
479libgnunet_plugin_transport_unix_la_LIBADD = \ 456libgnunet_plugin_transport_unix_la_LIBADD = \
diff --git a/src/transport/gnunet-service-tng.c b/src/transport/gnunet-service-tng.c
index 7d7d04375..6494a5dfd 100644
--- a/src/transport/gnunet-service-tng.c
+++ b/src/transport/gnunet-service-tng.c
@@ -41,11 +41,11 @@
41 * #3 transport should use validation to also establish 41 * #3 transport should use validation to also establish
42 * effective flow control (for uni-directional transports!) 42 * effective flow control (for uni-directional transports!)
43 * #4 UDP broadcasting logic must be extended to use the new API 43 * #4 UDP broadcasting logic must be extended to use the new API
44 * #5 only validated addresses go to ATS for scheduling; that 44 * #5 only validated addresses are selected for scheduling; that
45 * also ensures we know the RTT 45 * also ensures we know the RTT
46 * #6 to ensure flow control and RTT are OK, we always do the 46 * #6 to ensure flow control and RTT are OK, we always do the
47 * 'validation', even if address comes from PEERSTORE 47 * 'validation', even if address comes from PEERSTORE
48 * #7 48 * #7
49 * - ACK handling / retransmission 49 * - ACK handling / retransmission
50 * - address verification 50 * - address verification
51 * - track RTT, distance, loss, etc. 51 * - track RTT, distance, loss, etc.
@@ -59,10 +59,7 @@
59 * - 59 * -
60 * 60 *
61 * Easy: 61 * Easy:
62 * - use ATS bandwidth allocation callback and schedule transmissions! 62 * - figure out how to call XXX_suggestion_cb!
63 *
64 * Plan:
65 * - inform ATS about RTT, goodput/loss, overheads, etc. (GNUNET_ATS_session_update())
66 * 63 *
67 * Later: 64 * Later:
68 * - change transport-core API to provide proper flow control in both 65 * - change transport-core API to provide proper flow control in both
@@ -98,8 +95,6 @@
98 * "latest timestamps seen" data 95 * "latest timestamps seen" data
99 * - if transport implements DV, we likely need a 3rd peermap 96 * - if transport implements DV, we likely need a 3rd peermap
100 * in addition to ephemerals and (direct) neighbours 97 * in addition to ephemerals and (direct) neighbours
101 * => in this data structure, we should track ATS metrics (distance, RTT, etc.)
102 * as well as latest timestamps seen, goodput, fragments for transmission, etc.
103 * ==> check if stuff needs to be moved out of "Neighbour" 98 * ==> check if stuff needs to be moved out of "Neighbour"
104 * - transport should encapsualte core-level messages and do its 99 * - transport should encapsualte core-level messages and do its
105 * own ACKing for RTT/goodput/loss measurements _and_ fragment 100 * own ACKing for RTT/goodput/loss measurements _and_ fragment
@@ -111,7 +106,6 @@
111#include "gnunet_transport_monitor_service.h" 106#include "gnunet_transport_monitor_service.h"
112#include "gnunet_peerstore_service.h" 107#include "gnunet_peerstore_service.h"
113#include "gnunet_hello_lib.h" 108#include "gnunet_hello_lib.h"
114#include "gnunet_ats_transport_service.h"
115#include "gnunet_signatures.h" 109#include "gnunet_signatures.h"
116#include "transport.h" 110#include "transport.h"
117 111
@@ -148,18 +142,11 @@
148#define COMMUNICATOR_TOTAL_QUEUE_LIMIT 512 142#define COMMUNICATOR_TOTAL_QUEUE_LIMIT 512
149 143
150/** 144/**
151 * How many messages can we have pending for a given session (queue to 145 * How many messages can we have pending for a given queue (queue to
152 * a particular peer via a communicator) process before we start to 146 * a particular peer via a communicator) process before we start to
153 * throttle that queue? 147 * throttle that queue?
154 *
155 * Used if ATS assigns more bandwidth to a particular transmission
156 * method than that transmission method can right now handle. (Yes,
157 * ATS should eventually notice utilization below allocation and
158 * adjust, but we don't want to queue up tons of messages in the
159 * meantime). Must be significantly below
160 * #COMMUNICATOR_TOTAL_QUEUE_LIMIT.
161 */ 148 */
162#define SESSION_QUEUE_LIMIT 32 149#define QUEUE_LENGTH_LIMIT 32
163 150
164 151
165GNUNET_NETWORK_STRUCT_BEGIN 152GNUNET_NETWORK_STRUCT_BEGIN
@@ -547,7 +534,6 @@ struct TransportDVBox
547GNUNET_NETWORK_STRUCT_END 534GNUNET_NETWORK_STRUCT_END
548 535
549 536
550
551/** 537/**
552 * What type of client is the `struct TransportClient` about? 538 * What type of client is the `struct TransportClient` about?
553 */ 539 */
@@ -571,7 +557,12 @@ enum ClientType
571 /** 557 /**
572 * It is a communicator, use for communication. 558 * It is a communicator, use for communication.
573 */ 559 */
574 CT_COMMUNICATOR = 3 560 CT_COMMUNICATOR = 3,
561
562 /**
563 * "Application" telling us where to connect (i.e. TOPOLOGY, DHT or CADET).
564 */
565 CT_APPLICATION = 4
575}; 566};
576 567
577 568
@@ -725,11 +716,18 @@ struct DistanceVector
725 716
726 717
727/** 718/**
719 * A queue is a message queue provided by a communicator
720 * via which we can reach a particular neighbour.
721 */
722struct Queue;
723
724
725/**
728 * Entry identifying transmission in one of our `struct 726 * Entry identifying transmission in one of our `struct
729 * GNUNET_ATS_Sessions` which still awaits an ACK. This is used to 727 * Queue` which still awaits an ACK. This is used to
730 * ensure we do not overwhelm a communicator and limit the number of 728 * ensure we do not overwhelm a communicator and limit the number of
731 * messages outstanding per communicator (say in case communicator is 729 * messages outstanding per communicator (say in case communicator is
732 * CPU bound) and per queue (in case ATS bandwidth allocation exceeds 730 * CPU bound) and per queue (in case bandwidth allocation exceeds
733 * what the communicator can actually provide towards a particular 731 * what the communicator can actually provide towards a particular
734 * peer/target). 732 * peer/target).
735 */ 733 */
@@ -747,9 +745,9 @@ struct QueueEntry
747 struct QueueEntry *prev; 745 struct QueueEntry *prev;
748 746
749 /** 747 /**
750 * ATS session this entry is queued with. 748 * Queue this entry is queued with.
751 */ 749 */
752 struct GNUNET_ATS_Session *session; 750 struct Queue *queue;
753 751
754 /** 752 /**
755 * Message ID used for this message with the queue used for transmission. 753 * Message ID used for this message with the queue used for transmission.
@@ -759,30 +757,30 @@ struct QueueEntry
759 757
760 758
761/** 759/**
762 * An ATS session is a message queue provided by a communicator 760 * A queue is a message queue provided by a communicator
763 * via which we can reach a particular neighbour. 761 * via which we can reach a particular neighbour.
764 */ 762 */
765struct GNUNET_ATS_Session 763struct Queue
766{ 764{
767 /** 765 /**
768 * Kept in a MDLL. 766 * Kept in a MDLL.
769 */ 767 */
770 struct GNUNET_ATS_Session *next_neighbour; 768 struct Queue *next_neighbour;
771 769
772 /** 770 /**
773 * Kept in a MDLL. 771 * Kept in a MDLL.
774 */ 772 */
775 struct GNUNET_ATS_Session *prev_neighbour; 773 struct Queue *prev_neighbour;
776 774
777 /** 775 /**
778 * Kept in a MDLL. 776 * Kept in a MDLL.
779 */ 777 */
780 struct GNUNET_ATS_Session *prev_client; 778 struct Queue *prev_client;
781 779
782 /** 780 /**
783 * Kept in a MDLL. 781 * Kept in a MDLL.
784 */ 782 */
785 struct GNUNET_ATS_Session *next_client; 783 struct Queue *next_client;
786 784
787 /** 785 /**
788 * Head of DLL of unacked transmission requests. 786 * Head of DLL of unacked transmission requests.
@@ -795,33 +793,28 @@ struct GNUNET_ATS_Session
795 struct QueueEntry *queue_tail; 793 struct QueueEntry *queue_tail;
796 794
797 /** 795 /**
798 * Which neighbour is this ATS session for? 796 * Which neighbour is this queue for?
799 */ 797 */
800 struct Neighbour *neighbour; 798 struct Neighbour *neighbour;
801 799
802 /** 800 /**
803 * Which communicator offers this ATS session? 801 * Which communicator offers this queue?
804 */ 802 */
805 struct TransportClient *tc; 803 struct TransportClient *tc;
806 804
807 /** 805 /**
808 * Address served by the ATS session. 806 * Address served by the queue.
809 */ 807 */
810 const char *address; 808 const char *address;
811 809
812 /** 810 /**
813 * Handle by which we inform ATS about this queue.
814 */
815 struct GNUNET_ATS_SessionRecord *sr;
816
817 /**
818 * Task scheduled for the time when this queue can (likely) transmit the 811 * Task scheduled for the time when this queue can (likely) transmit the
819 * next message. Still needs to check with the @e tracker_out to be sure. 812 * next message. Still needs to check with the @e tracker_out to be sure.
820 */ 813 */
821 struct GNUNET_SCHEDULER_Task *transmit_task; 814 struct GNUNET_SCHEDULER_Task *transmit_task;
822 815
823 /** 816 /**
824 * Our current RTT estimate for this ATS session. 817 * Our current RTT estimate for this queue.
825 */ 818 */
826 struct GNUNET_TIME_Relative rtt; 819 struct GNUNET_TIME_Relative rtt;
827 820
@@ -831,17 +824,17 @@ struct GNUNET_ATS_Session
831 uint64_t mid_gen; 824 uint64_t mid_gen;
832 825
833 /** 826 /**
834 * Unique identifier of this ATS session with the communicator. 827 * Unique identifier of this queue with the communicator.
835 */ 828 */
836 uint32_t qid; 829 uint32_t qid;
837 830
838 /** 831 /**
839 * Maximum transmission unit supported by this ATS session. 832 * Maximum transmission unit supported by this queue.
840 */ 833 */
841 uint32_t mtu; 834 uint32_t mtu;
842 835
843 /** 836 /**
844 * Distance to the target of this ATS session. 837 * Distance to the target of this queue.
845 */ 838 */
846 uint32_t distance; 839 uint32_t distance;
847 840
@@ -861,22 +854,22 @@ struct GNUNET_ATS_Session
861 unsigned int queue_length; 854 unsigned int queue_length;
862 855
863 /** 856 /**
864 * Network type offered by this ATS session. 857 * Network type offered by this queue.
865 */ 858 */
866 enum GNUNET_NetworkType nt; 859 enum GNUNET_NetworkType nt;
867 860
868 /** 861 /**
869 * Connection status for this ATS session. 862 * Connection status for this queue.
870 */ 863 */
871 enum GNUNET_TRANSPORT_ConnectionStatus cs; 864 enum GNUNET_TRANSPORT_ConnectionStatus cs;
872 865
873 /** 866 /**
874 * How much outbound bandwidth do we have available for this session? 867 * How much outbound bandwidth do we have available for this queue?
875 */ 868 */
876 struct GNUNET_BANDWIDTH_Tracker tracker_out; 869 struct GNUNET_BANDWIDTH_Tracker tracker_out;
877 870
878 /** 871 /**
879 * How much inbound bandwidth do we have available for this session? 872 * How much inbound bandwidth do we have available for this queue?
880 */ 873 */
881 struct GNUNET_BANDWIDTH_Tracker tracker_in; 874 struct GNUNET_BANDWIDTH_Tracker tracker_in;
882}; 875};
@@ -1025,14 +1018,14 @@ struct Neighbour
1025 struct DistanceVectorHop *dv_tail; 1018 struct DistanceVectorHop *dv_tail;
1026 1019
1027 /** 1020 /**
1028 * Head of DLL of ATS sessions to this peer. 1021 * Head of DLL of queues to this peer.
1029 */ 1022 */
1030 struct GNUNET_ATS_Session *session_head; 1023 struct Queue *queue_head;
1031 1024
1032 /** 1025 /**
1033 * Tail of DLL of ATS sessions to this peer. 1026 * Tail of DLL of queues to this peer.
1034 */ 1027 */
1035 struct GNUNET_ATS_Session *session_tail; 1028 struct Queue *queue_tail;
1036 1029
1037 /** 1030 /**
1038 * Task run to cleanup pending messages that have exceeded their timeout. 1031 * Task run to cleanup pending messages that have exceeded their timeout.
@@ -1040,13 +1033,12 @@ struct Neighbour
1040 struct GNUNET_SCHEDULER_Task *timeout_task; 1033 struct GNUNET_SCHEDULER_Task *timeout_task;
1041 1034
1042 /** 1035 /**
1043 * Quota at which CORE is allowed to transmit to this peer 1036 * Quota at which CORE is allowed to transmit to this peer.
1044 * according to ATS.
1045 * 1037 *
1046 * FIXME: not yet used, tricky to get right given multiple queues! 1038 * FIXME: not yet used, tricky to get right given multiple queues!
1047 * (=> Idea: let ATS set a quota per queue and we add them up here?) 1039 * (=> Idea: measure???)
1048 * FIXME: how do we set this value initially when we tell CORE? 1040 * FIXME: how do we set this value initially when we tell CORE?
1049 * Options: start at a minimum value or at literally zero (before ATS?) 1041 * Options: start at a minimum value or at literally zero?
1050 * (=> Current thought: clean would be zero!) 1042 * (=> Current thought: clean would be zero!)
1051 */ 1043 */
1052 struct GNUNET_BANDWIDTH_Value32NBO quota_out; 1044 struct GNUNET_BANDWIDTH_Value32NBO quota_out;
@@ -1060,6 +1052,40 @@ struct Neighbour
1060 1052
1061 1053
1062/** 1054/**
1055 * A peer that an application (client) would like us to talk to directly.
1056 */
1057struct PeerRequest
1058{
1059
1060 /**
1061 * Which peer is this about?
1062 */
1063 struct GNUNET_PeerIdentity pid;
1064
1065 /**
1066 * Client responsible for the request.
1067 */
1068 struct TransportClient *tc;
1069
1070 /**
1071 * Handle for watching the peerstore for HELLOs for this peer.
1072 */
1073 struct GNUNET_PEERSTORE_WatchContext *wc;
1074
1075 /**
1076 * What kind of performance preference does this @e tc have?
1077 */
1078 enum GNUNET_MQ_PreferenceKind pk;
1079
1080 /**
1081 * How much bandwidth would this @e tc like to see?
1082 */
1083 struct GNUNET_BANDWIDTH_Value32NBO bw;
1084
1085};
1086
1087
1088/**
1063 * Types of different pending messages. 1089 * Types of different pending messages.
1064 */ 1090 */
1065enum PendingMessageType 1091enum PendingMessageType
@@ -1362,12 +1388,12 @@ struct TransportClient
1362 /** 1388 /**
1363 * Head of DLL of queues offered by this communicator. 1389 * Head of DLL of queues offered by this communicator.
1364 */ 1390 */
1365 struct GNUNET_ATS_Session *session_head; 1391 struct Queue *queue_head;
1366 1392
1367 /** 1393 /**
1368 * Tail of DLL of queues offered by this communicator. 1394 * Tail of DLL of queues offered by this communicator.
1369 */ 1395 */
1370 struct GNUNET_ATS_Session *session_tail; 1396 struct Queue *queue_tail;
1371 1397
1372 /** 1398 /**
1373 * Head of list of the addresses of this peer offered by this communicator. 1399 * Head of list of the addresses of this peer offered by this communicator.
@@ -1393,6 +1419,19 @@ struct TransportClient
1393 1419
1394 } communicator; 1420 } communicator;
1395 1421
1422 /**
1423 * Information for @e type #CT_APPLICATION
1424 */
1425 struct {
1426
1427 /**
1428 * Map of requests for peers the given client application would like to
1429 * see connections for. Maps from PIDs to `struct PeerRequest`.
1430 */
1431 struct GNUNET_CONTAINER_MultiPeerMap *requests;
1432
1433 } application;
1434
1396 } details; 1435 } details;
1397 1436
1398}; 1437};
@@ -1465,11 +1504,6 @@ static struct GNUNET_CONTAINER_MultiPeerMap *ephemeral_map;
1465 */ 1504 */
1466static struct GNUNET_SCHEDULER_Task *ephemeral_task; 1505static struct GNUNET_SCHEDULER_Task *ephemeral_task;
1467 1506
1468/**
1469 * Our connection to ATS for allocation and bootstrapping.
1470 */
1471static struct GNUNET_ATS_TransportHandle *ats;
1472
1473 1507
1474/** 1508/**
1475 * Free cached ephemeral key. 1509 * Free cached ephemeral key.
@@ -1497,7 +1531,7 @@ static struct Neighbour *
1497lookup_neighbour (const struct GNUNET_PeerIdentity *pid) 1531lookup_neighbour (const struct GNUNET_PeerIdentity *pid)
1498{ 1532{
1499 return GNUNET_CONTAINER_multipeermap_get (neighbours, 1533 return GNUNET_CONTAINER_multipeermap_get (neighbours,
1500 pid); 1534 pid);
1501} 1535}
1502 1536
1503 1537
@@ -1561,9 +1595,9 @@ free_distance_vector_hop (struct DistanceVectorHop *dvh)
1561 if (NULL == dv->dv_head) 1595 if (NULL == dv->dv_head)
1562 { 1596 {
1563 GNUNET_assert (GNUNET_YES == 1597 GNUNET_assert (GNUNET_YES ==
1564 GNUNET_CONTAINER_multipeermap_remove (dv_routes, 1598 GNUNET_CONTAINER_multipeermap_remove (dv_routes,
1565 &dv->target, 1599 &dv->target,
1566 dv)); 1600 dv));
1567 if (NULL != dv->timeout_task) 1601 if (NULL != dv->timeout_task)
1568 GNUNET_SCHEDULER_cancel (dv->timeout_task); 1602 GNUNET_SCHEDULER_cancel (dv->timeout_task);
1569 GNUNET_free (dv); 1603 GNUNET_free (dv);
@@ -1602,18 +1636,18 @@ free_dv_route (struct DistanceVector *dv)
1602 */ 1636 */
1603static void 1637static void
1604notify_monitor (struct TransportClient *tc, 1638notify_monitor (struct TransportClient *tc,
1605 const struct GNUNET_PeerIdentity *peer, 1639 const struct GNUNET_PeerIdentity *peer,
1606 const char *address, 1640 const char *address,
1607 enum GNUNET_NetworkType nt, 1641 enum GNUNET_NetworkType nt,
1608 const struct MonitorEvent *me) 1642 const struct MonitorEvent *me)
1609{ 1643{
1610 struct GNUNET_MQ_Envelope *env; 1644 struct GNUNET_MQ_Envelope *env;
1611 struct GNUNET_TRANSPORT_MonitorData *md; 1645 struct GNUNET_TRANSPORT_MonitorData *md;
1612 size_t addr_len = strlen (address) + 1; 1646 size_t addr_len = strlen (address) + 1;
1613 1647
1614 env = GNUNET_MQ_msg_extra (md, 1648 env = GNUNET_MQ_msg_extra (md,
1615 addr_len, 1649 addr_len,
1616 GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_DATA); 1650 GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_DATA);
1617 md->nt = htonl ((uint32_t) nt); 1651 md->nt = htonl ((uint32_t) nt);
1618 md->peer = *peer; 1652 md->peer = *peer;
1619 md->last_validation = GNUNET_TIME_absolute_hton (me->last_validation); 1653 md->last_validation = GNUNET_TIME_absolute_hton (me->last_validation);
@@ -1624,10 +1658,10 @@ notify_monitor (struct TransportClient *tc,
1624 md->num_msg_pending = htonl (me->num_msg_pending); 1658 md->num_msg_pending = htonl (me->num_msg_pending);
1625 md->num_bytes_pending = htonl (me->num_bytes_pending); 1659 md->num_bytes_pending = htonl (me->num_bytes_pending);
1626 memcpy (&md[1], 1660 memcpy (&md[1],
1627 address, 1661 address,
1628 addr_len); 1662 addr_len);
1629 GNUNET_MQ_send (tc->mq, 1663 GNUNET_MQ_send (tc->mq,
1630 env); 1664 env);
1631} 1665}
1632 1666
1633 1667
@@ -1642,9 +1676,9 @@ notify_monitor (struct TransportClient *tc,
1642 */ 1676 */
1643static void 1677static void
1644notify_monitors (const struct GNUNET_PeerIdentity *peer, 1678notify_monitors (const struct GNUNET_PeerIdentity *peer,
1645 const char *address, 1679 const char *address,
1646 enum GNUNET_NetworkType nt, 1680 enum GNUNET_NetworkType nt,
1647 const struct MonitorEvent *me) 1681 const struct MonitorEvent *me)
1648{ 1682{
1649 static struct GNUNET_PeerIdentity zero; 1683 static struct GNUNET_PeerIdentity zero;
1650 1684
@@ -1657,17 +1691,17 @@ notify_monitors (const struct GNUNET_PeerIdentity *peer,
1657 if (tc->details.monitor.one_shot) 1691 if (tc->details.monitor.one_shot)
1658 continue; 1692 continue;
1659 if ( (0 != memcmp (&tc->details.monitor.peer, 1693 if ( (0 != memcmp (&tc->details.monitor.peer,
1660 &zero, 1694 &zero,
1661 sizeof (zero))) && 1695 sizeof (zero))) &&
1662 (0 != memcmp (&tc->details.monitor.peer, 1696 (0 != memcmp (&tc->details.monitor.peer,
1663 peer, 1697 peer,
1664 sizeof (*peer))) ) 1698 sizeof (*peer))) )
1665 continue; 1699 continue;
1666 notify_monitor (tc, 1700 notify_monitor (tc,
1667 peer, 1701 peer,
1668 address, 1702 address,
1669 nt, 1703 nt,
1670 me); 1704 me);
1671 } 1705 }
1672} 1706}
1673 1707
@@ -1683,8 +1717,8 @@ notify_monitors (const struct GNUNET_PeerIdentity *peer,
1683 */ 1717 */
1684static void * 1718static void *
1685client_connect_cb (void *cls, 1719client_connect_cb (void *cls,
1686 struct GNUNET_SERVICE_Client *client, 1720 struct GNUNET_SERVICE_Client *client,
1687 struct GNUNET_MQ_Handle *mq) 1721 struct GNUNET_MQ_Handle *mq)
1688{ 1722{
1689 struct TransportClient *tc; 1723 struct TransportClient *tc;
1690 1724
@@ -1712,11 +1746,11 @@ free_reassembly_context (struct ReassemblyContext *rc)
1712 struct Neighbour *n = rc->neighbour; 1746 struct Neighbour *n = rc->neighbour;
1713 1747
1714 GNUNET_assert (rc == 1748 GNUNET_assert (rc ==
1715 GNUNET_CONTAINER_heap_remove_node (rc->hn)); 1749 GNUNET_CONTAINER_heap_remove_node (rc->hn));
1716 GNUNET_assert (GNUNET_OK == 1750 GNUNET_assert (GNUNET_OK ==
1717 GNUNET_CONTAINER_multishortmap_remove (n->reassembly_map, 1751 GNUNET_CONTAINER_multishortmap_remove (n->reassembly_map,
1718 &rc->msg_uuid, 1752 &rc->msg_uuid,
1719 rc)); 1753 rc));
1720 GNUNET_free (rc); 1754 GNUNET_free (rc);
1721} 1755}
1722 1756
@@ -1742,8 +1776,8 @@ reassembly_cleanup_task (void *cls)
1742 } 1776 }
1743 GNUNET_assert (NULL == n->reassembly_timeout_task); 1777 GNUNET_assert (NULL == n->reassembly_timeout_task);
1744 n->reassembly_timeout_task = GNUNET_SCHEDULER_add_at (rc->reassembly_timeout, 1778 n->reassembly_timeout_task = GNUNET_SCHEDULER_add_at (rc->reassembly_timeout,
1745 &reassembly_cleanup_task, 1779 &reassembly_cleanup_task,
1746 n); 1780 n);
1747 return; 1781 return;
1748 } 1782 }
1749} 1783}
@@ -1781,18 +1815,18 @@ free_neighbour (struct Neighbour *neighbour)
1781{ 1815{
1782 struct DistanceVectorHop *dvh; 1816 struct DistanceVectorHop *dvh;
1783 1817
1784 GNUNET_assert (NULL == neighbour->session_head); 1818 GNUNET_assert (NULL == neighbour->queue_head);
1785 GNUNET_assert (GNUNET_YES == 1819 GNUNET_assert (GNUNET_YES ==
1786 GNUNET_CONTAINER_multipeermap_remove (neighbours, 1820 GNUNET_CONTAINER_multipeermap_remove (neighbours,
1787 &neighbour->pid, 1821 &neighbour->pid,
1788 neighbour)); 1822 neighbour));
1789 if (NULL != neighbour->timeout_task) 1823 if (NULL != neighbour->timeout_task)
1790 GNUNET_SCHEDULER_cancel (neighbour->timeout_task); 1824 GNUNET_SCHEDULER_cancel (neighbour->timeout_task);
1791 if (NULL != neighbour->reassembly_map) 1825 if (NULL != neighbour->reassembly_map)
1792 { 1826 {
1793 GNUNET_CONTAINER_multishortmap_iterate (neighbour->reassembly_map, 1827 GNUNET_CONTAINER_multishortmap_iterate (neighbour->reassembly_map,
1794 &free_reassembly_cb, 1828 &free_reassembly_cb,
1795 NULL); 1829 NULL);
1796 GNUNET_CONTAINER_multishortmap_destroy (neighbour->reassembly_map); 1830 GNUNET_CONTAINER_multishortmap_destroy (neighbour->reassembly_map);
1797 neighbour->reassembly_map = NULL; 1831 neighbour->reassembly_map = NULL;
1798 GNUNET_CONTAINER_heap_destroy (neighbour->reassembly_heap); 1832 GNUNET_CONTAINER_heap_destroy (neighbour->reassembly_heap);
@@ -1815,15 +1849,15 @@ free_neighbour (struct Neighbour *neighbour)
1815 */ 1849 */
1816static void 1850static void
1817core_send_connect_info (struct TransportClient *tc, 1851core_send_connect_info (struct TransportClient *tc,
1818 const struct GNUNET_PeerIdentity *pid, 1852 const struct GNUNET_PeerIdentity *pid,
1819 struct GNUNET_BANDWIDTH_Value32NBO quota_out) 1853 struct GNUNET_BANDWIDTH_Value32NBO quota_out)
1820{ 1854{
1821 struct GNUNET_MQ_Envelope *env; 1855 struct GNUNET_MQ_Envelope *env;
1822 struct ConnectInfoMessage *cim; 1856 struct ConnectInfoMessage *cim;
1823 1857
1824 GNUNET_assert (CT_CORE == tc->type); 1858 GNUNET_assert (CT_CORE == tc->type);
1825 env = GNUNET_MQ_msg (cim, 1859 env = GNUNET_MQ_msg (cim,
1826 GNUNET_MESSAGE_TYPE_TRANSPORT_CONNECT); 1860 GNUNET_MESSAGE_TYPE_TRANSPORT_CONNECT);
1827 cim->quota_out = quota_out; 1861 cim->quota_out = quota_out;
1828 cim->id = *pid; 1862 cim->id = *pid;
1829 GNUNET_MQ_send (tc->mq, 1863 GNUNET_MQ_send (tc->mq,
@@ -1839,7 +1873,7 @@ core_send_connect_info (struct TransportClient *tc,
1839 */ 1873 */
1840static void 1874static void
1841cores_send_connect_info (const struct GNUNET_PeerIdentity *pid, 1875cores_send_connect_info (const struct GNUNET_PeerIdentity *pid,
1842 struct GNUNET_BANDWIDTH_Value32NBO quota_out) 1876 struct GNUNET_BANDWIDTH_Value32NBO quota_out)
1843{ 1877{
1844 for (struct TransportClient *tc = clients_head; 1878 for (struct TransportClient *tc = clients_head;
1845 NULL != tc; 1879 NULL != tc;
@@ -1848,8 +1882,8 @@ cores_send_connect_info (const struct GNUNET_PeerIdentity *pid,
1848 if (CT_CORE != tc->type) 1882 if (CT_CORE != tc->type)
1849 continue; 1883 continue;
1850 core_send_connect_info (tc, 1884 core_send_connect_info (tc,
1851 pid, 1885 pid,
1852 quota_out); 1886 quota_out);
1853 } 1887 }
1854} 1888}
1855 1889
@@ -1872,10 +1906,10 @@ cores_send_disconnect_info (const struct GNUNET_PeerIdentity *pid)
1872 if (CT_CORE != tc->type) 1906 if (CT_CORE != tc->type)
1873 continue; 1907 continue;
1874 env = GNUNET_MQ_msg (dim, 1908 env = GNUNET_MQ_msg (dim,
1875 GNUNET_MESSAGE_TYPE_TRANSPORT_DISCONNECT); 1909 GNUNET_MESSAGE_TYPE_TRANSPORT_DISCONNECT);
1876 dim->peer = *pid; 1910 dim->peer = *pid;
1877 GNUNET_MQ_send (tc->mq, 1911 GNUNET_MQ_send (tc->mq,
1878 env); 1912 env);
1879 } 1913 }
1880} 1914}
1881 1915
@@ -1886,7 +1920,7 @@ cores_send_disconnect_info (const struct GNUNET_PeerIdentity *pid)
1886 * communicator for transmission (updating the tracker, and re-scheduling 1920 * communicator for transmission (updating the tracker, and re-scheduling
1887 * itself if applicable). 1921 * itself if applicable).
1888 * 1922 *
1889 * @param cls the `struct GNUNET_ATS_Session` to process transmissions for 1923 * @param cls the `struct Queue` to process transmissions for
1890 */ 1924 */
1891static void 1925static void
1892transmit_on_queue (void *cls); 1926transmit_on_queue (void *cls);
@@ -1902,7 +1936,7 @@ transmit_on_queue (void *cls);
1902 * @param queue the queue to do scheduling for 1936 * @param queue the queue to do scheduling for
1903 */ 1937 */
1904static void 1938static void
1905schedule_transmit_on_queue (struct GNUNET_ATS_Session *queue) 1939schedule_transmit_on_queue (struct Queue *queue)
1906{ 1940{
1907 struct Neighbour *n = queue->neighbour; 1941 struct Neighbour *n = queue->neighbour;
1908 struct PendingMessage *pm = n->pending_msg_head; 1942 struct PendingMessage *pm = n->pending_msg_head;
@@ -1910,20 +1944,21 @@ schedule_transmit_on_queue (struct GNUNET_ATS_Session *queue)
1910 unsigned int wsize; 1944 unsigned int wsize;
1911 1945
1912 GNUNET_assert (NULL != pm); 1946 GNUNET_assert (NULL != pm);
1913 if (queue->tc->details.communicator.total_queue_length >= COMMUNICATOR_TOTAL_QUEUE_LIMIT) 1947 if (queue->tc->details.communicator.total_queue_length >=
1948 COMMUNICATOR_TOTAL_QUEUE_LIMIT)
1914 { 1949 {
1915 GNUNET_STATISTICS_update (GST_stats, 1950 GNUNET_STATISTICS_update (GST_stats,
1916 "# Transmission throttled due to communicator queue limit", 1951 "# Transmission throttled due to communicator queue limit",
1917 1, 1952 1,
1918 GNUNET_NO); 1953 GNUNET_NO);
1919 return; 1954 return;
1920 } 1955 }
1921 if (queue->queue_length >= SESSION_QUEUE_LIMIT) 1956 if (queue->queue_length >= QUEUE_LENGTH_LIMIT)
1922 { 1957 {
1923 GNUNET_STATISTICS_update (GST_stats, 1958 GNUNET_STATISTICS_update (GST_stats,
1924 "# Transmission throttled due to session queue limit", 1959 "# Transmission throttled due to queue queue limit",
1925 1, 1960 1,
1926 GNUNET_NO); 1961 GNUNET_NO);
1927 return; 1962 return;
1928 } 1963 }
1929 1964
@@ -1931,40 +1966,41 @@ schedule_transmit_on_queue (struct GNUNET_ATS_Session *queue)
1931 ? pm->bytes_msg /* FIXME: add overheads? */ 1966 ? pm->bytes_msg /* FIXME: add overheads? */
1932 : queue->mtu; 1967 : queue->mtu;
1933 out_delay = GNUNET_BANDWIDTH_tracker_get_delay (&queue->tracker_out, 1968 out_delay = GNUNET_BANDWIDTH_tracker_get_delay (&queue->tracker_out,
1934 wsize); 1969 wsize);
1935 out_delay = GNUNET_TIME_relative_max (GNUNET_TIME_absolute_get_remaining (pm->next_attempt), 1970 out_delay = GNUNET_TIME_relative_max (GNUNET_TIME_absolute_get_remaining (pm->next_attempt),
1936 out_delay); 1971 out_delay);
1937 if (0 == out_delay.rel_value_us) 1972 if (0 == out_delay.rel_value_us)
1938 return; /* we should run immediately! */ 1973 return; /* we should run immediately! */
1939 /* queue has changed since we were scheduled, reschedule again */ 1974 /* queue has changed since we were scheduled, reschedule again */
1940 queue->transmit_task = GNUNET_SCHEDULER_add_delayed (out_delay, 1975 queue->transmit_task
1941 &transmit_on_queue, 1976 = GNUNET_SCHEDULER_add_delayed (out_delay,
1942 queue); 1977 &transmit_on_queue,
1978 queue);
1943 if (out_delay.rel_value_us > DELAY_WARN_THRESHOLD.rel_value_us) 1979 if (out_delay.rel_value_us > DELAY_WARN_THRESHOLD.rel_value_us)
1944 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 1980 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
1945 "Next transmission on queue `%s' in %s (high delay)\n", 1981 "Next transmission on queue `%s' in %s (high delay)\n",
1946 queue->address, 1982 queue->address,
1947 GNUNET_STRINGS_relative_time_to_string (out_delay, 1983 GNUNET_STRINGS_relative_time_to_string (out_delay,
1948 GNUNET_YES)); 1984 GNUNET_YES));
1949 else 1985 else
1950 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1986 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1951 "Next transmission on queue `%s' in %s\n", 1987 "Next transmission on queue `%s' in %s\n",
1952 queue->address, 1988 queue->address,
1953 GNUNET_STRINGS_relative_time_to_string (out_delay, 1989 GNUNET_STRINGS_relative_time_to_string (out_delay,
1954 GNUNET_YES)); 1990 GNUNET_YES));
1955} 1991}
1956 1992
1957 1993
1958/** 1994/**
1959 * Free @a session. 1995 * Free @a queue.
1960 * 1996 *
1961 * @param session the session to free 1997 * @param queue the queue to free
1962 */ 1998 */
1963static void 1999static void
1964free_session (struct GNUNET_ATS_Session *session) 2000free_queue (struct Queue *queue)
1965{ 2001{
1966 struct Neighbour *neighbour = session->neighbour; 2002 struct Neighbour *neighbour = queue->neighbour;
1967 struct TransportClient *tc = session->tc; 2003 struct TransportClient *tc = queue->tc;
1968 struct MonitorEvent me = { 2004 struct MonitorEvent me = {
1969 .cs = GNUNET_TRANSPORT_CS_DOWN, 2005 .cs = GNUNET_TRANSPORT_CS_DOWN,
1970 .rtt = GNUNET_TIME_UNIT_FOREVER_REL 2006 .rtt = GNUNET_TIME_UNIT_FOREVER_REL
@@ -1972,52 +2008,51 @@ free_session (struct GNUNET_ATS_Session *session)
1972 struct QueueEntry *qe; 2008 struct QueueEntry *qe;
1973 int maxxed; 2009 int maxxed;
1974 2010
1975 if (NULL != session->transmit_task) 2011 if (NULL != queue->transmit_task)
1976 { 2012 {
1977 GNUNET_SCHEDULER_cancel (session->transmit_task); 2013 GNUNET_SCHEDULER_cancel (queue->transmit_task);
1978 session->transmit_task = NULL; 2014 queue->transmit_task = NULL;
1979 } 2015 }
1980 GNUNET_CONTAINER_MDLL_remove (neighbour, 2016 GNUNET_CONTAINER_MDLL_remove (neighbour,
1981 neighbour->session_head, 2017 neighbour->queue_head,
1982 neighbour->session_tail, 2018 neighbour->queue_tail,
1983 session); 2019 queue);
1984 GNUNET_CONTAINER_MDLL_remove (client, 2020 GNUNET_CONTAINER_MDLL_remove (client,
1985 tc->details.communicator.session_head, 2021 tc->details.communicator.queue_head,
1986 tc->details.communicator.session_tail, 2022 tc->details.communicator.queue_tail,
1987 session); 2023 queue);
1988 maxxed = (COMMUNICATOR_TOTAL_QUEUE_LIMIT >= tc->details.communicator.total_queue_length); 2024 maxxed = (COMMUNICATOR_TOTAL_QUEUE_LIMIT >= tc->details.communicator.total_queue_length);
1989 while (NULL != (qe = session->queue_head)) 2025 while (NULL != (qe = queue->queue_head))
1990 { 2026 {
1991 GNUNET_CONTAINER_DLL_remove (session->queue_head, 2027 GNUNET_CONTAINER_DLL_remove (queue->queue_head,
1992 session->queue_tail, 2028 queue->queue_tail,
1993 qe); 2029 qe);
1994 session->queue_length--; 2030 queue->queue_length--;
1995 tc->details.communicator.total_queue_length--; 2031 tc->details.communicator.total_queue_length--;
1996 GNUNET_free (qe); 2032 GNUNET_free (qe);
1997 } 2033 }
1998 GNUNET_assert (0 == session->queue_length); 2034 GNUNET_assert (0 == queue->queue_length);
1999 if ( (maxxed) && 2035 if ( (maxxed) &&
2000 (COMMUNICATOR_TOTAL_QUEUE_LIMIT < tc->details.communicator.total_queue_length) ) 2036 (COMMUNICATOR_TOTAL_QUEUE_LIMIT < tc->details.communicator.total_queue_length) )
2001 { 2037 {
2002 /* Communicator dropped below threshold, resume all queues */ 2038 /* Communicator dropped below threshold, resume all queues */
2003 GNUNET_STATISTICS_update (GST_stats, 2039 GNUNET_STATISTICS_update (GST_stats,
2004 "# Transmission throttled due to communicator queue limit", 2040 "# Transmission throttled due to communicator queue limit",
2005 -1, 2041 -1,
2006 GNUNET_NO); 2042 GNUNET_NO);
2007 for (struct GNUNET_ATS_Session *s = tc->details.communicator.session_head; 2043 for (struct Queue *s = tc->details.communicator.queue_head;
2008 NULL != s; 2044 NULL != s;
2009 s = s->next_client) 2045 s = s->next_client)
2010 schedule_transmit_on_queue (s); 2046 schedule_transmit_on_queue (s);
2011 } 2047 }
2012 notify_monitors (&neighbour->pid, 2048 notify_monitors (&neighbour->pid,
2013 session->address, 2049 queue->address,
2014 session->nt, 2050 queue->nt,
2015 &me); 2051 &me);
2016 GNUNET_ATS_session_del (session->sr); 2052 GNUNET_BANDWIDTH_tracker_notification_stop (&queue->tracker_in);
2017 GNUNET_BANDWIDTH_tracker_notification_stop (&session->tracker_in); 2053 GNUNET_BANDWIDTH_tracker_notification_stop (&queue->tracker_out);
2018 GNUNET_BANDWIDTH_tracker_notification_stop (&session->tracker_out); 2054 GNUNET_free (queue);
2019 GNUNET_free (session); 2055 if (NULL == neighbour->queue_head)
2020 if (NULL == neighbour->session_head)
2021 { 2056 {
2022 cores_send_disconnect_info (&neighbour->pid); 2057 cores_send_disconnect_info (&neighbour->pid);
2023 free_neighbour (neighbour); 2058 free_neighbour (neighbour);
@@ -2036,8 +2071,8 @@ free_address_list_entry (struct AddressListEntry *ale)
2036 struct TransportClient *tc = ale->tc; 2071 struct TransportClient *tc = ale->tc;
2037 2072
2038 GNUNET_CONTAINER_DLL_remove (tc->details.communicator.addr_head, 2073 GNUNET_CONTAINER_DLL_remove (tc->details.communicator.addr_head,
2039 tc->details.communicator.addr_tail, 2074 tc->details.communicator.addr_tail,
2040 ale); 2075 ale);
2041 if (NULL != ale->sc) 2076 if (NULL != ale->sc)
2042 { 2077 {
2043 GNUNET_PEERSTORE_store_cancel (ale->sc); 2078 GNUNET_PEERSTORE_store_cancel (ale->sc);
@@ -2053,6 +2088,33 @@ free_address_list_entry (struct AddressListEntry *ale)
2053 2088
2054 2089
2055/** 2090/**
2091 * Stop the peer request in @a value.
2092 *
2093 * @param cls a `struct TransportClient` that no longer makes the request
2094 * @param pid the peer's identity
2095 * @param value a `struct PeerRequest`
2096 * @return #GNUNET_YES (always)
2097 */
2098static int
2099stop_peer_request (void *cls,
2100 const struct GNUNET_PeerIdentity *pid,
2101 void *value)
2102{
2103 struct TransportClient *tc = cls;
2104 struct PeerRequest *pr = value;
2105
2106 GNUNET_PEERSTORE_watch_cancel (pr->wc);
2107 GNUNET_assert (GNUNET_YES ==
2108 GNUNET_CONTAINER_multipeermap_remove (tc->details.application.requests,
2109 pid,
2110 pr));
2111 GNUNET_free (pr);
2112
2113 return GNUNET_OK;
2114}
2115
2116
2117/**
2056 * Called whenever a client is disconnected. Frees our 2118 * Called whenever a client is disconnected. Frees our
2057 * resources associated with that client. 2119 * resources associated with that client.
2058 * 2120 *
@@ -2062,8 +2124,8 @@ free_address_list_entry (struct AddressListEntry *ale)
2062 */ 2124 */
2063static void 2125static void
2064client_disconnect_cb (void *cls, 2126client_disconnect_cb (void *cls,
2065 struct GNUNET_SERVICE_Client *client, 2127 struct GNUNET_SERVICE_Client *client,
2066 void *app_ctx) 2128 void *app_ctx)
2067{ 2129{
2068 struct TransportClient *tc = app_ctx; 2130 struct TransportClient *tc = app_ctx;
2069 2131
@@ -2083,11 +2145,11 @@ client_disconnect_cb (void *cls,
2083 2145
2084 while (NULL != (pm = tc->details.core.pending_msg_head)) 2146 while (NULL != (pm = tc->details.core.pending_msg_head))
2085 { 2147 {
2086 GNUNET_CONTAINER_MDLL_remove (client, 2148 GNUNET_CONTAINER_MDLL_remove (client,
2087 tc->details.core.pending_msg_head, 2149 tc->details.core.pending_msg_head,
2088 tc->details.core.pending_msg_tail, 2150 tc->details.core.pending_msg_tail,
2089 pm); 2151 pm);
2090 pm->client = NULL; 2152 pm->client = NULL;
2091 } 2153 }
2092 } 2154 }
2093 break; 2155 break;
@@ -2095,16 +2157,22 @@ client_disconnect_cb (void *cls,
2095 break; 2157 break;
2096 case CT_COMMUNICATOR: 2158 case CT_COMMUNICATOR:
2097 { 2159 {
2098 struct GNUNET_ATS_Session *q; 2160 struct Queue *q;
2099 struct AddressListEntry *ale; 2161 struct AddressListEntry *ale;
2100 2162
2101 while (NULL != (q = tc->details.communicator.session_head)) 2163 while (NULL != (q = tc->details.communicator.queue_head))
2102 free_session (q); 2164 free_queue (q);
2103 while (NULL != (ale = tc->details.communicator.addr_head)) 2165 while (NULL != (ale = tc->details.communicator.addr_head))
2104 free_address_list_entry (ale); 2166 free_address_list_entry (ale);
2105 GNUNET_free (tc->details.communicator.address_prefix); 2167 GNUNET_free (tc->details.communicator.address_prefix);
2106 } 2168 }
2107 break; 2169 break;
2170 case CT_APPLICATION:
2171 GNUNET_CONTAINER_multipeermap_iterate (tc->details.application.requests,
2172 &stop_peer_request,
2173 tc);
2174 GNUNET_CONTAINER_multipeermap_destroy (tc->details.application.requests);
2175 break;
2108 } 2176 }
2109 GNUNET_free (tc); 2177 GNUNET_free (tc);
2110} 2178}
@@ -2121,15 +2189,15 @@ client_disconnect_cb (void *cls,
2121 */ 2189 */
2122static int 2190static int
2123notify_client_connect_info (void *cls, 2191notify_client_connect_info (void *cls,
2124 const struct GNUNET_PeerIdentity *pid, 2192 const struct GNUNET_PeerIdentity *pid,
2125 void *value) 2193 void *value)
2126{ 2194{
2127 struct TransportClient *tc = cls; 2195 struct TransportClient *tc = cls;
2128 struct Neighbour *neighbour = value; 2196 struct Neighbour *neighbour = value;
2129 2197
2130 core_send_connect_info (tc, 2198 core_send_connect_info (tc,
2131 pid, 2199 pid,
2132 neighbour->quota_out); 2200 neighbour->quota_out);
2133 return GNUNET_OK; 2201 return GNUNET_OK;
2134} 2202}
2135 2203
@@ -2144,7 +2212,7 @@ notify_client_connect_info (void *cls,
2144 */ 2212 */
2145static void 2213static void
2146handle_client_start (void *cls, 2214handle_client_start (void *cls,
2147 const struct StartMessage *start) 2215 const struct StartMessage *start)
2148{ 2216{
2149 struct TransportClient *tc = cls; 2217 struct TransportClient *tc = cls;
2150 uint32_t options; 2218 uint32_t options;
@@ -2169,8 +2237,8 @@ handle_client_start (void *cls,
2169 } 2237 }
2170 tc->type = CT_CORE; 2238 tc->type = CT_CORE;
2171 GNUNET_CONTAINER_multipeermap_iterate (neighbours, 2239 GNUNET_CONTAINER_multipeermap_iterate (neighbours,
2172 &notify_client_connect_info, 2240 &notify_client_connect_info,
2173 tc); 2241 tc);
2174 GNUNET_SERVICE_client_continue (tc->client); 2242 GNUNET_SERVICE_client_continue (tc->client);
2175} 2243}
2176 2244
@@ -2183,7 +2251,7 @@ handle_client_start (void *cls,
2183 */ 2251 */
2184static int 2252static int
2185check_client_send (void *cls, 2253check_client_send (void *cls,
2186 const struct OutboundMessage *obm) 2254 const struct OutboundMessage *obm)
2187{ 2255{
2188 struct TransportClient *tc = cls; 2256 struct TransportClient *tc = cls;
2189 uint16_t size; 2257 uint16_t size;
@@ -2248,14 +2316,14 @@ free_pending_message (struct PendingMessage *pm)
2248 if (NULL != tc) 2316 if (NULL != tc)
2249 { 2317 {
2250 GNUNET_CONTAINER_MDLL_remove (client, 2318 GNUNET_CONTAINER_MDLL_remove (client,
2251 tc->details.core.pending_msg_head, 2319 tc->details.core.pending_msg_head,
2252 tc->details.core.pending_msg_tail, 2320 tc->details.core.pending_msg_tail,
2253 pm); 2321 pm);
2254 } 2322 }
2255 GNUNET_CONTAINER_MDLL_remove (neighbour, 2323 GNUNET_CONTAINER_MDLL_remove (neighbour,
2256 target->pending_msg_head, 2324 target->pending_msg_head,
2257 target->pending_msg_tail, 2325 target->pending_msg_tail,
2258 pm); 2326 pm);
2259 free_fragment_tree (pm); 2327 free_fragment_tree (pm);
2260 GNUNET_free_non_null (pm->bpm); 2328 GNUNET_free_non_null (pm->bpm);
2261 GNUNET_free (pm); 2329 GNUNET_free (pm);
@@ -2276,8 +2344,8 @@ free_pending_message (struct PendingMessage *pm)
2276 */ 2344 */
2277static void 2345static void
2278client_send_response (struct PendingMessage *pm, 2346client_send_response (struct PendingMessage *pm,
2279 int success, 2347 int success,
2280 uint32_t bytes_physical) 2348 uint32_t bytes_physical)
2281{ 2349{
2282 struct TransportClient *tc = pm->client; 2350 struct TransportClient *tc = pm->client;
2283 struct Neighbour *target = pm->target; 2351 struct Neighbour *target = pm->target;
@@ -2287,7 +2355,7 @@ client_send_response (struct PendingMessage *pm,
2287 if (NULL != tc) 2355 if (NULL != tc)
2288 { 2356 {
2289 env = GNUNET_MQ_msg (som, 2357 env = GNUNET_MQ_msg (som,
2290 GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK); 2358 GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK);
2291 som->success = htonl ((uint32_t) success); 2359 som->success = htonl ((uint32_t) success);
2292 som->bytes_msg = htons (pm->bytes_msg); 2360 som->bytes_msg = htons (pm->bytes_msg);
2293 som->bytes_physical = htonl (bytes_physical); 2361 som->bytes_physical = htonl (bytes_physical);
@@ -2324,22 +2392,22 @@ check_queue_timeouts (void *cls)
2324 if (pos->timeout.abs_value_us <= now.abs_value_us) 2392 if (pos->timeout.abs_value_us <= now.abs_value_us)
2325 { 2393 {
2326 GNUNET_STATISTICS_update (GST_stats, 2394 GNUNET_STATISTICS_update (GST_stats,
2327 "# messages dropped (timeout before confirmation)", 2395 "# messages dropped (timeout before confirmation)",
2328 1, 2396 1,
2329 GNUNET_NO); 2397 GNUNET_NO);
2330 client_send_response (pm, 2398 client_send_response (pm,
2331 GNUNET_NO, 2399 GNUNET_NO,
2332 0); 2400 0);
2333 continue; 2401 continue;
2334 } 2402 }
2335 earliest_timeout = GNUNET_TIME_absolute_min (earliest_timeout, 2403 earliest_timeout = GNUNET_TIME_absolute_min (earliest_timeout,
2336 pos->timeout); 2404 pos->timeout);
2337 } 2405 }
2338 n->earliest_timeout = earliest_timeout; 2406 n->earliest_timeout = earliest_timeout;
2339 if (NULL != n->pending_msg_head) 2407 if (NULL != n->pending_msg_head)
2340 n->timeout_task = GNUNET_SCHEDULER_add_at (earliest_timeout, 2408 n->timeout_task = GNUNET_SCHEDULER_add_at (earliest_timeout,
2341 &check_queue_timeouts, 2409 &check_queue_timeouts,
2342 n); 2410 n);
2343} 2411}
2344 2412
2345 2413
@@ -2351,13 +2419,14 @@ check_queue_timeouts (void *cls)
2351 */ 2419 */
2352static void 2420static void
2353handle_client_send (void *cls, 2421handle_client_send (void *cls,
2354 const struct OutboundMessage *obm) 2422 const struct OutboundMessage *obm)
2355{ 2423{
2356 struct TransportClient *tc = cls; 2424 struct TransportClient *tc = cls;
2357 struct PendingMessage *pm; 2425 struct PendingMessage *pm;
2358 const struct GNUNET_MessageHeader *obmm; 2426 const struct GNUNET_MessageHeader *obmm;
2359 struct Neighbour *target; 2427 struct Neighbour *target;
2360 uint32_t bytes_msg; 2428 uint32_t bytes_msg;
2429 int was_empty;
2361 2430
2362 GNUNET_assert (CT_CORE == tc->type); 2431 GNUNET_assert (CT_CORE == tc->type);
2363 obmm = (const struct GNUNET_MessageHeader *) &obm[1]; 2432 obmm = (const struct GNUNET_MessageHeader *) &obm[1];
@@ -2373,36 +2442,37 @@ handle_client_send (void *cls,
2373 struct SendOkMessage *som; 2442 struct SendOkMessage *som;
2374 2443
2375 env = GNUNET_MQ_msg (som, 2444 env = GNUNET_MQ_msg (som,
2376 GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK); 2445 GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK);
2377 som->success = htonl (GNUNET_SYSERR); 2446 som->success = htonl (GNUNET_SYSERR);
2378 som->bytes_msg = htonl (bytes_msg); 2447 som->bytes_msg = htonl (bytes_msg);
2379 som->bytes_physical = htonl (0); 2448 som->bytes_physical = htonl (0);
2380 som->peer = obm->peer; 2449 som->peer = obm->peer;
2381 GNUNET_MQ_send (tc->mq, 2450 GNUNET_MQ_send (tc->mq,
2382 env); 2451 env);
2383 GNUNET_SERVICE_client_continue (tc->client); 2452 GNUNET_SERVICE_client_continue (tc->client);
2384 GNUNET_STATISTICS_update (GST_stats, 2453 GNUNET_STATISTICS_update (GST_stats,
2385 "# messages dropped (neighbour unknown)", 2454 "# messages dropped (neighbour unknown)",
2386 1, 2455 1,
2387 GNUNET_NO); 2456 GNUNET_NO);
2388 return; 2457 return;
2389 } 2458 }
2459 was_empty = (NULL == target->pending_msg_head);
2390 pm = GNUNET_malloc (sizeof (struct PendingMessage) + bytes_msg); 2460 pm = GNUNET_malloc (sizeof (struct PendingMessage) + bytes_msg);
2391 pm->client = tc; 2461 pm->client = tc;
2392 pm->target = target; 2462 pm->target = target;
2393 pm->bytes_msg = bytes_msg; 2463 pm->bytes_msg = bytes_msg;
2394 pm->timeout = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_relative_ntoh (obm->timeout)); 2464 pm->timeout = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_relative_ntoh (obm->timeout));
2395 memcpy (&pm[1], 2465 memcpy (&pm[1],
2396 &obm[1], 2466 &obm[1],
2397 bytes_msg); 2467 bytes_msg);
2398 GNUNET_CONTAINER_MDLL_insert (neighbour, 2468 GNUNET_CONTAINER_MDLL_insert (neighbour,
2399 target->pending_msg_head, 2469 target->pending_msg_head,
2400 target->pending_msg_tail, 2470 target->pending_msg_tail,
2401 pm); 2471 pm);
2402 GNUNET_CONTAINER_MDLL_insert (client, 2472 GNUNET_CONTAINER_MDLL_insert (client,
2403 tc->details.core.pending_msg_head, 2473 tc->details.core.pending_msg_head,
2404 tc->details.core.pending_msg_tail, 2474 tc->details.core.pending_msg_tail,
2405 pm); 2475 pm);
2406 if (target->earliest_timeout.abs_value_us > pm->timeout.abs_value_us) 2476 if (target->earliest_timeout.abs_value_us > pm->timeout.abs_value_us)
2407 { 2477 {
2408 target->earliest_timeout.abs_value_us = pm->timeout.abs_value_us; 2478 target->earliest_timeout.abs_value_us = pm->timeout.abs_value_us;
@@ -2410,8 +2480,19 @@ handle_client_send (void *cls,
2410 GNUNET_SCHEDULER_cancel (target->timeout_task); 2480 GNUNET_SCHEDULER_cancel (target->timeout_task);
2411 target->timeout_task 2481 target->timeout_task
2412 = GNUNET_SCHEDULER_add_at (target->earliest_timeout, 2482 = GNUNET_SCHEDULER_add_at (target->earliest_timeout,
2413 &check_queue_timeouts, 2483 &check_queue_timeouts,
2414 target); 2484 target);
2485 }
2486 if (! was_empty)
2487 return; /* all queues must already be busy */
2488 for (struct Queue *queue = target->queue_head;
2489 NULL != queue;
2490 queue = queue->next_neighbour)
2491 {
2492 /* try transmission on any queue that is idle */
2493 if (NULL == queue->transmit_task)
2494 queue->transmit_task = GNUNET_SCHEDULER_add_now (&transmit_on_queue,
2495 queue);
2415 } 2496 }
2416} 2497}
2417 2498
@@ -2476,7 +2557,7 @@ handle_communicator_available (void *cls,
2476 */ 2557 */
2477static int 2558static int
2478check_communicator_backchannel (void *cls, 2559check_communicator_backchannel (void *cls,
2479 const struct GNUNET_TRANSPORT_CommunicatorBackchannel *cb) 2560 const struct GNUNET_TRANSPORT_CommunicatorBackchannel *cb)
2480{ 2561{
2481 const struct GNUNET_MessageHeader *inbox; 2562 const struct GNUNET_MessageHeader *inbox;
2482 const char *is; 2563 const char *is;
@@ -2550,10 +2631,10 @@ expire_ephemerals (void *cls)
2550 */ 2631 */
2551static void 2632static void
2552lookup_ephemeral (const struct GNUNET_PeerIdentity *pid, 2633lookup_ephemeral (const struct GNUNET_PeerIdentity *pid,
2553 struct GNUNET_CRYPTO_EcdhePrivateKey *private_key, 2634 struct GNUNET_CRYPTO_EcdhePrivateKey *private_key,
2554 struct GNUNET_CRYPTO_EcdhePublicKey *ephemeral_key, 2635 struct GNUNET_CRYPTO_EcdhePublicKey *ephemeral_key,
2555 struct GNUNET_CRYPTO_EddsaSignature *ephemeral_sender_sig, 2636 struct GNUNET_CRYPTO_EddsaSignature *ephemeral_sender_sig,
2556 struct GNUNET_TIME_Absolute *ephemeral_validity) 2637 struct GNUNET_TIME_Absolute *ephemeral_validity)
2557{ 2638{
2558 struct EphemeralCacheEntry *ece; 2639 struct EphemeralCacheEntry *ece;
2559 struct EphemeralConfirmation ec; 2640 struct EphemeralConfirmation ec;
@@ -2628,7 +2709,7 @@ route_message (const struct GNUNET_PeerIdentity *target,
2628 */ 2709 */
2629static void 2710static void
2630handle_communicator_backchannel (void *cls, 2711handle_communicator_backchannel (void *cls,
2631 const struct GNUNET_TRANSPORT_CommunicatorBackchannel *cb) 2712 const struct GNUNET_TRANSPORT_CommunicatorBackchannel *cb)
2632{ 2713{
2633 struct TransportClient *tc = cls; 2714 struct TransportClient *tc = cls;
2634 struct GNUNET_CRYPTO_EcdhePrivateKey private_key; 2715 struct GNUNET_CRYPTO_EcdhePrivateKey private_key;
@@ -2714,7 +2795,7 @@ store_pi (void *cls);
2714 */ 2795 */
2715static void 2796static void
2716peerstore_store_cb (void *cls, 2797peerstore_store_cb (void *cls,
2717 int success) 2798 int success)
2718{ 2799{
2719 struct AddressListEntry *ale = cls; 2800 struct AddressListEntry *ale = cls;
2720 2801
@@ -3163,7 +3244,7 @@ handle_fragment_box (void *cls,
3163 if (65 == rc->num_acks) /* FIXME: maybe use smaller threshold? This is very aggressive. */ 3244 if (65 == rc->num_acks) /* FIXME: maybe use smaller threshold? This is very aggressive. */
3164 ack_now = GNUNET_YES; /* maximum acks received */ 3245 ack_now = GNUNET_YES; /* maximum acks received */
3165 // FIXME: possibly also ACK based on RTT (but for that we'd need to 3246 // FIXME: possibly also ACK based on RTT (but for that we'd need to
3166 // determine the session used for the ACK first!) 3247 // determine the queue used for the ACK first!)
3167 3248
3168 /* is reassembly complete? */ 3249 /* is reassembly complete? */
3169 if (0 != rc->msg_missing) 3250 if (0 != rc->msg_missing)
@@ -3274,7 +3355,7 @@ handle_reliability_box (void *cls,
3274 */ 3355 */
3275static void 3356static void
3276handle_reliability_ack (void *cls, 3357handle_reliability_ack (void *cls,
3277 const struct TransportReliabilityAckMessage *ra) 3358 const struct TransportReliabilityAckMessage *ra)
3278{ 3359{
3279 struct CommunicatorMessageContext *cmc = cls; 3360 struct CommunicatorMessageContext *cmc = cls;
3280 3361
@@ -3293,7 +3374,7 @@ handle_reliability_ack (void *cls,
3293 */ 3374 */
3294static int 3375static int
3295check_backchannel_encapsulation (void *cls, 3376check_backchannel_encapsulation (void *cls,
3296 const struct TransportBackchannelEncapsulationMessage *be) 3377 const struct TransportBackchannelEncapsulationMessage *be)
3297{ 3378{
3298 uint16_t size = ntohs (be->header.size); 3379 uint16_t size = ntohs (be->header.size);
3299 3380
@@ -3314,7 +3395,7 @@ check_backchannel_encapsulation (void *cls,
3314 */ 3395 */
3315static void 3396static void
3316handle_backchannel_encapsulation (void *cls, 3397handle_backchannel_encapsulation (void *cls,
3317 const struct TransportBackchannelEncapsulationMessage *be) 3398 const struct TransportBackchannelEncapsulationMessage *be)
3318{ 3399{
3319 struct CommunicatorMessageContext *cmc = cls; 3400 struct CommunicatorMessageContext *cmc = cls;
3320 3401
@@ -3346,7 +3427,7 @@ handle_backchannel_encapsulation (void *cls,
3346 */ 3427 */
3347static int 3428static int
3348check_dv_learn (void *cls, 3429check_dv_learn (void *cls,
3349 const struct TransportDVLearn *dvl) 3430 const struct TransportDVLearn *dvl)
3350{ 3431{
3351 uint16_t size = ntohs (dvl->header.size); 3432 uint16_t size = ntohs (dvl->header.size);
3352 uint16_t num_hops = ntohs (dvl->num_hops); 3433 uint16_t num_hops = ntohs (dvl->num_hops);
@@ -3360,15 +3441,15 @@ check_dv_learn (void *cls,
3360 for (unsigned int i=0;i<num_hops;i++) 3441 for (unsigned int i=0;i<num_hops;i++)
3361 { 3442 {
3362 if (0 == memcmp (&dvl->initiator, 3443 if (0 == memcmp (&dvl->initiator,
3363 &hops[i], 3444 &hops[i],
3364 sizeof (struct GNUNET_PeerIdentity))) 3445 sizeof (struct GNUNET_PeerIdentity)))
3365 { 3446 {
3366 GNUNET_break_op (0); 3447 GNUNET_break_op (0);
3367 return GNUNET_SYSERR; 3448 return GNUNET_SYSERR;
3368 } 3449 }
3369 if (0 == memcmp (&GST_my_identity, 3450 if (0 == memcmp (&GST_my_identity,
3370 &hops[i], 3451 &hops[i],
3371 sizeof (struct GNUNET_PeerIdentity))) 3452 sizeof (struct GNUNET_PeerIdentity)))
3372 { 3453 {
3373 GNUNET_break_op (0); 3454 GNUNET_break_op (0);
3374 return GNUNET_SYSERR; 3455 return GNUNET_SYSERR;
@@ -3386,7 +3467,7 @@ check_dv_learn (void *cls,
3386 */ 3467 */
3387static void 3468static void
3388handle_dv_learn (void *cls, 3469handle_dv_learn (void *cls,
3389 const struct TransportDVLearn *dvl) 3470 const struct TransportDVLearn *dvl)
3390{ 3471{
3391 struct CommunicatorMessageContext *cmc = cls; 3472 struct CommunicatorMessageContext *cmc = cls;
3392 3473
@@ -3405,7 +3486,7 @@ handle_dv_learn (void *cls,
3405 */ 3486 */
3406static int 3487static int
3407check_dv_box (void *cls, 3488check_dv_box (void *cls,
3408 const struct TransportDVBox *dvb) 3489 const struct TransportDVBox *dvb)
3409{ 3490{
3410 uint16_t size = ntohs (dvb->header.size); 3491 uint16_t size = ntohs (dvb->header.size);
3411 uint16_t num_hops = ntohs (dvb->num_hops); 3492 uint16_t num_hops = ntohs (dvb->num_hops);
@@ -3599,12 +3680,12 @@ check_add_queue_message (void *cls,
3599 * Bandwidth tracker informs us that the delay until we should receive 3680 * Bandwidth tracker informs us that the delay until we should receive
3600 * more has changed. 3681 * more has changed.
3601 * 3682 *
3602 * @param cls a `struct GNUNET_ATS_Session` for which the delay changed 3683 * @param cls a `struct Queue` for which the delay changed
3603 */ 3684 */
3604static void 3685static void
3605tracker_update_in_cb (void *cls) 3686tracker_update_in_cb (void *cls)
3606{ 3687{
3607 struct GNUNET_ATS_Session *queue = cls; 3688 struct Queue *queue = cls;
3608 struct GNUNET_TIME_Relative in_delay; 3689 struct GNUNET_TIME_Relative in_delay;
3609 unsigned int rsize; 3690 unsigned int rsize;
3610 3691
@@ -3801,12 +3882,12 @@ reliability_box_message (struct PendingMessage *pm)
3801 * communicator for transmission (updating the tracker, and re-scheduling 3882 * communicator for transmission (updating the tracker, and re-scheduling
3802 * itself if applicable). 3883 * itself if applicable).
3803 * 3884 *
3804 * @param cls the `struct GNUNET_ATS_Session` to process transmissions for 3885 * @param cls the `struct Queue` to process transmissions for
3805 */ 3886 */
3806static void 3887static void
3807transmit_on_queue (void *cls) 3888transmit_on_queue (void *cls)
3808{ 3889{
3809 struct GNUNET_ATS_Session *queue = cls; 3890 struct Queue *queue = cls;
3810 struct Neighbour *n = queue->neighbour; 3891 struct Neighbour *n = queue->neighbour;
3811 struct QueueEntry *qe; 3892 struct QueueEntry *qe;
3812 struct PendingMessage *pm; 3893 struct PendingMessage *pm;
@@ -3835,9 +3916,9 @@ transmit_on_queue (void *cls)
3835 respect that even if MTU is 0 for 3916 respect that even if MTU is 0 for
3836 this queue */) ) 3917 this queue */) )
3837 s = fragment_message (s, 3918 s = fragment_message (s,
3838 (0 == queue->mtu) 3919 (0 == queue->mtu)
3839 ? UINT16_MAX - sizeof (struct GNUNET_TRANSPORT_SendMessageTo) 3920 ? UINT16_MAX - sizeof (struct GNUNET_TRANSPORT_SendMessageTo)
3840 : queue->mtu); 3921 : queue->mtu);
3841 if (NULL == s) 3922 if (NULL == s)
3842 { 3923 {
3843 /* Fragmentation failed, try next message... */ 3924 /* Fragmentation failed, try next message... */
@@ -3856,7 +3937,7 @@ transmit_on_queue (void *cls)
3856 /* Pass 's' for transission to the communicator */ 3937 /* Pass 's' for transission to the communicator */
3857 qe = GNUNET_new (struct QueueEntry); 3938 qe = GNUNET_new (struct QueueEntry);
3858 qe->mid = queue->mid_gen++; 3939 qe->mid = queue->mid_gen++;
3859 qe->session = queue; 3940 qe->queue = queue;
3860 // qe->pm = s; // FIXME: not so easy, reference management on 'free(s)'! 3941 // qe->pm = s; // FIXME: not so easy, reference management on 'free(s)'!
3861 GNUNET_CONTAINER_DLL_insert (queue->queue_head, 3942 GNUNET_CONTAINER_DLL_insert (queue->queue_head,
3862 queue->queue_tail, 3943 queue->queue_tail,
@@ -3868,13 +3949,13 @@ transmit_on_queue (void *cls)
3868 smt->mid = qe->mid; 3949 smt->mid = qe->mid;
3869 smt->receiver = n->pid; 3950 smt->receiver = n->pid;
3870 memcpy (&smt[1], 3951 memcpy (&smt[1],
3871 &s[1], 3952 &s[1],
3872 s->bytes_msg); 3953 s->bytes_msg);
3873 GNUNET_assert (CT_COMMUNICATOR == queue->tc->type); 3954 GNUNET_assert (CT_COMMUNICATOR == queue->tc->type);
3874 queue->queue_length++; 3955 queue->queue_length++;
3875 queue->tc->details.communicator.total_queue_length++; 3956 queue->tc->details.communicator.total_queue_length++;
3876 GNUNET_MQ_send (queue->tc->mq, 3957 GNUNET_MQ_send (queue->tc->mq,
3877 env); 3958 env);
3878 3959
3879 // FIXME: do something similar to the logic below 3960 // FIXME: do something similar to the logic below
3880 // in defragmentation / reliability ACK handling! 3961 // in defragmentation / reliability ACK handling!
@@ -3886,8 +3967,8 @@ transmit_on_queue (void *cls)
3886 { 3967 {
3887 /* Full message sent, and over reliabile channel */ 3968 /* Full message sent, and over reliabile channel */
3888 client_send_response (pm, 3969 client_send_response (pm,
3889 GNUNET_YES, 3970 GNUNET_YES,
3890 pm->bytes_msg); 3971 pm->bytes_msg);
3891 } 3972 }
3892 else if ( (GNUNET_TRANSPORT_CC_RELIABLE == queue->tc->details.communicator.cc) && 3973 else if ( (GNUNET_TRANSPORT_CC_RELIABLE == queue->tc->details.communicator.cc) &&
3893 (PMT_FRAGMENT_BOX == s->pmt) ) 3974 (PMT_FRAGMENT_BOX == s->pmt) )
@@ -3898,9 +3979,9 @@ transmit_on_queue (void *cls)
3898 free_fragment_tree (s); 3979 free_fragment_tree (s);
3899 pos = s->frag_parent; 3980 pos = s->frag_parent;
3900 GNUNET_CONTAINER_MDLL_remove (frag, 3981 GNUNET_CONTAINER_MDLL_remove (frag,
3901 pos->head_frag, 3982 pos->head_frag,
3902 pos->tail_frag, 3983 pos->tail_frag,
3903 s); 3984 s);
3904 GNUNET_free (s); 3985 GNUNET_free (s);
3905 /* check if subtree is done */ 3986 /* check if subtree is done */
3906 while ( (NULL == pos->head_frag) && 3987 while ( (NULL == pos->head_frag) &&
@@ -3910,9 +3991,9 @@ transmit_on_queue (void *cls)
3910 s = pos; 3991 s = pos;
3911 pos = s->frag_parent; 3992 pos = s->frag_parent;
3912 GNUNET_CONTAINER_MDLL_remove (frag, 3993 GNUNET_CONTAINER_MDLL_remove (frag,
3913 pos->head_frag, 3994 pos->head_frag,
3914 pos->tail_frag, 3995 pos->tail_frag,
3915 s); 3996 s);
3916 GNUNET_free (s); 3997 GNUNET_free (s);
3917 } 3998 }
3918 3999
@@ -3920,8 +4001,8 @@ transmit_on_queue (void *cls)
3920 if ( (NULL == pm->head_frag) && 4001 if ( (NULL == pm->head_frag) &&
3921 (pm->frag_off == pm->bytes_msg) ) 4002 (pm->frag_off == pm->bytes_msg) )
3922 client_send_response (pm, 4003 client_send_response (pm,
3923 GNUNET_YES, 4004 GNUNET_YES,
3924 pm->bytes_msg /* FIXME: calculate and add overheads! */); 4005 pm->bytes_msg /* FIXME: calculate and add overheads! */);
3925 } 4006 }
3926 else if (PMT_CORE != pm->pmt) 4007 else if (PMT_CORE != pm->pmt)
3927 { 4008 {
@@ -3941,25 +4022,25 @@ transmit_on_queue (void *cls)
3941 message urgency and size when delaying ACKs, etc.) */ 4022 message urgency and size when delaying ACKs, etc.) */
3942 s->next_attempt = GNUNET_TIME_relative_to_absolute 4023 s->next_attempt = GNUNET_TIME_relative_to_absolute
3943 (GNUNET_TIME_relative_multiply (queue->rtt, 4024 (GNUNET_TIME_relative_multiply (queue->rtt,
3944 4)); 4025 4));
3945 if (s == pm) 4026 if (s == pm)
3946 { 4027 {
3947 struct PendingMessage *pos; 4028 struct PendingMessage *pos;
3948 4029
3949 /* re-insert sort in neighbour list */ 4030 /* re-insert sort in neighbour list */
3950 GNUNET_CONTAINER_MDLL_remove (neighbour, 4031 GNUNET_CONTAINER_MDLL_remove (neighbour,
3951 neighbour->pending_msg_head, 4032 neighbour->pending_msg_head,
3952 neighbour->pending_msg_tail, 4033 neighbour->pending_msg_tail,
3953 pm); 4034 pm);
3954 pos = neighbour->pending_msg_tail; 4035 pos = neighbour->pending_msg_tail;
3955 while ( (NULL != pos) && 4036 while ( (NULL != pos) &&
3956 (pm->next_attempt.abs_value_us > pos->next_attempt.abs_value_us) ) 4037 (pm->next_attempt.abs_value_us > pos->next_attempt.abs_value_us) )
3957 pos = pos->prev_neighbour; 4038 pos = pos->prev_neighbour;
3958 GNUNET_CONTAINER_MDLL_insert_after (neighbour, 4039 GNUNET_CONTAINER_MDLL_insert_after (neighbour,
3959 neighbour->pending_msg_head, 4040 neighbour->pending_msg_head,
3960 neighbour->pending_msg_tail, 4041 neighbour->pending_msg_tail,
3961 pos, 4042 pos,
3962 pm); 4043 pm);
3963 } 4044 }
3964 else 4045 else
3965 { 4046 {
@@ -3968,18 +4049,18 @@ transmit_on_queue (void *cls)
3968 struct PendingMessage *pos; 4049 struct PendingMessage *pos;
3969 4050
3970 GNUNET_CONTAINER_MDLL_remove (frag, 4051 GNUNET_CONTAINER_MDLL_remove (frag,
3971 fp->head_frag, 4052 fp->head_frag,
3972 fp->tail_frag, 4053 fp->tail_frag,
3973 s); 4054 s);
3974 pos = fp->tail_frag; 4055 pos = fp->tail_frag;
3975 while ( (NULL != pos) && 4056 while ( (NULL != pos) &&
3976 (s->next_attempt.abs_value_us > pos->next_attempt.abs_value_us) ) 4057 (s->next_attempt.abs_value_us > pos->next_attempt.abs_value_us) )
3977 pos = pos->prev_frag; 4058 pos = pos->prev_frag;
3978 GNUNET_CONTAINER_MDLL_insert_after (frag, 4059 GNUNET_CONTAINER_MDLL_insert_after (frag,
3979 fp->head_frag, 4060 fp->head_frag,
3980 fp->tail_frag, 4061 fp->tail_frag,
3981 pos, 4062 pos,
3982 s); 4063 s);
3983 } 4064 }
3984 } 4065 }
3985 4066
@@ -3992,12 +4073,12 @@ transmit_on_queue (void *cls)
3992 * Bandwidth tracker informs us that the delay until we 4073 * Bandwidth tracker informs us that the delay until we
3993 * can transmit again changed. 4074 * can transmit again changed.
3994 * 4075 *
3995 * @param cls a `struct GNUNET_ATS_Session` for which the delay changed 4076 * @param cls a `struct Queue` for which the delay changed
3996 */ 4077 */
3997static void 4078static void
3998tracker_update_out_cb (void *cls) 4079tracker_update_out_cb (void *cls)
3999{ 4080{
4000 struct GNUNET_ATS_Session *queue = cls; 4081 struct Queue *queue = cls;
4001 struct Neighbour *n = queue->neighbour; 4082 struct Neighbour *n = queue->neighbour;
4002 4083
4003 if (NULL == n->pending_msg_head) 4084 if (NULL == n->pending_msg_head)
@@ -4017,7 +4098,7 @@ tracker_update_out_cb (void *cls)
4017 * Bandwidth tracker informs us that excessive outbound bandwidth was 4098 * Bandwidth tracker informs us that excessive outbound bandwidth was
4018 * allocated which is not being used. 4099 * allocated which is not being used.
4019 * 4100 *
4020 * @param cls a `struct GNUNET_ATS_Session` for which the excess was noted 4101 * @param cls a `struct Queue` for which the excess was noted
4021 */ 4102 */
4022static void 4103static void
4023tracker_excess_out_cb (void *cls) 4104tracker_excess_out_cb (void *cls)
@@ -4026,11 +4107,11 @@ tracker_excess_out_cb (void *cls)
4026 this is done internally within transport_api2_core already, 4107 this is done internally within transport_api2_core already,
4027 but we probably want to change the logic and trigger it 4108 but we probably want to change the logic and trigger it
4028 from here via a message instead! */ 4109 from here via a message instead! */
4029 /* TODO: maybe inform ATS at this point? */ 4110 /* TODO: maybe inform someone at this point? */
4030 GNUNET_STATISTICS_update (GST_stats, 4111 GNUNET_STATISTICS_update (GST_stats,
4031 "# Excess outbound bandwidth reported", 4112 "# Excess outbound bandwidth reported",
4032 1, 4113 1,
4033 GNUNET_NO); 4114 GNUNET_NO);
4034} 4115}
4035 4116
4036 4117
@@ -4039,16 +4120,16 @@ tracker_excess_out_cb (void *cls)
4039 * Bandwidth tracker informs us that excessive inbound bandwidth was allocated 4120 * Bandwidth tracker informs us that excessive inbound bandwidth was allocated
4040 * which is not being used. 4121 * which is not being used.
4041 * 4122 *
4042 * @param cls a `struct GNUNET_ATS_Session` for which the excess was noted 4123 * @param cls a `struct Queue` for which the excess was noted
4043 */ 4124 */
4044static void 4125static void
4045tracker_excess_in_cb (void *cls) 4126tracker_excess_in_cb (void *cls)
4046{ 4127{
4047 /* TODO: maybe inform ATS at this point? */ 4128 /* TODO: maybe inform somone at this point? */
4048 GNUNET_STATISTICS_update (GST_stats, 4129 GNUNET_STATISTICS_update (GST_stats,
4049 "# Excess inbound bandwidth reported", 4130 "# Excess inbound bandwidth reported",
4050 1, 4131 1,
4051 GNUNET_NO); 4132 GNUNET_NO);
4052} 4133}
4053 4134
4054 4135
@@ -4063,7 +4144,7 @@ handle_add_queue_message (void *cls,
4063 const struct GNUNET_TRANSPORT_AddQueueMessage *aqm) 4144 const struct GNUNET_TRANSPORT_AddQueueMessage *aqm)
4064{ 4145{
4065 struct TransportClient *tc = cls; 4146 struct TransportClient *tc = cls;
4066 struct GNUNET_ATS_Session *queue; 4147 struct Queue *queue;
4067 struct Neighbour *neighbour; 4148 struct Neighbour *neighbour;
4068 const char *addr; 4149 const char *addr;
4069 uint16_t addr_len; 4150 uint16_t addr_len;
@@ -4083,17 +4164,17 @@ handle_add_queue_message (void *cls,
4083 neighbour->earliest_timeout = GNUNET_TIME_UNIT_FOREVER_ABS; 4164 neighbour->earliest_timeout = GNUNET_TIME_UNIT_FOREVER_ABS;
4084 neighbour->pid = aqm->receiver; 4165 neighbour->pid = aqm->receiver;
4085 GNUNET_assert (GNUNET_OK == 4166 GNUNET_assert (GNUNET_OK ==
4086 GNUNET_CONTAINER_multipeermap_put (neighbours, 4167 GNUNET_CONTAINER_multipeermap_put (neighbours,
4087 &neighbour->pid, 4168 &neighbour->pid,
4088 neighbour, 4169 neighbour,
4089 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); 4170 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
4090 cores_send_connect_info (&neighbour->pid, 4171 cores_send_connect_info (&neighbour->pid,
4091 GNUNET_BANDWIDTH_ZERO); 4172 GNUNET_BANDWIDTH_ZERO);
4092 } 4173 }
4093 addr_len = ntohs (aqm->header.size) - sizeof (*aqm); 4174 addr_len = ntohs (aqm->header.size) - sizeof (*aqm);
4094 addr = (const char *) &aqm[1]; 4175 addr = (const char *) &aqm[1];
4095 4176
4096 queue = GNUNET_malloc (sizeof (struct GNUNET_ATS_Session) + addr_len); 4177 queue = GNUNET_malloc (sizeof (struct Queue) + addr_len);
4097 queue->tc = tc; 4178 queue->tc = tc;
4098 queue->address = (const char *) &queue[1]; 4179 queue->address = (const char *) &queue[1];
4099 queue->rtt = GNUNET_TIME_UNIT_FOREVER_REL; 4180 queue->rtt = GNUNET_TIME_UNIT_FOREVER_REL;
@@ -4117,40 +4198,8 @@ handle_add_queue_message (void *cls,
4117 &tracker_excess_out_cb, 4198 &tracker_excess_out_cb,
4118 queue); 4199 queue);
4119 memcpy (&queue[1], 4200 memcpy (&queue[1],
4120 addr, 4201 addr,
4121 addr_len); 4202 addr_len);
4122 /* notify ATS about new queue */
4123 {
4124 struct GNUNET_ATS_Properties prop = {
4125 .delay = GNUNET_TIME_UNIT_FOREVER_REL,
4126 .mtu = queue->mtu,
4127 .nt = queue->nt,
4128 .cc = tc->details.communicator.cc
4129 };
4130
4131 queue->sr = GNUNET_ATS_session_add (ats,
4132 &neighbour->pid,
4133 queue->address,
4134 queue,
4135 &prop);
4136 if (NULL == queue->sr)
4137 {
4138 /* This can only happen if the 'address' was way too long for ATS
4139 (approaching 64k in strlen()!). In this case, the communicator
4140 must be buggy and we drop it. */
4141 GNUNET_break (0);
4142 GNUNET_BANDWIDTH_tracker_notification_stop (&queue->tracker_in);
4143 GNUNET_BANDWIDTH_tracker_notification_stop (&queue->tracker_out);
4144 GNUNET_free (queue);
4145 if (NULL == neighbour->session_head)
4146 {
4147 cores_send_disconnect_info (&neighbour->pid);
4148 free_neighbour (neighbour);
4149 }
4150 GNUNET_SERVICE_client_drop (tc->client);
4151 return;
4152 }
4153 }
4154 /* notify monitors about new queue */ 4203 /* notify monitors about new queue */
4155 { 4204 {
4156 struct MonitorEvent me = { 4205 struct MonitorEvent me = {
@@ -4159,18 +4208,18 @@ handle_add_queue_message (void *cls,
4159 }; 4208 };
4160 4209
4161 notify_monitors (&neighbour->pid, 4210 notify_monitors (&neighbour->pid,
4162 queue->address, 4211 queue->address,
4163 queue->nt, 4212 queue->nt,
4164 &me); 4213 &me);
4165 } 4214 }
4166 GNUNET_CONTAINER_MDLL_insert (neighbour, 4215 GNUNET_CONTAINER_MDLL_insert (neighbour,
4167 neighbour->session_head, 4216 neighbour->queue_head,
4168 neighbour->session_tail, 4217 neighbour->queue_tail,
4169 queue); 4218 queue);
4170 GNUNET_CONTAINER_MDLL_insert (client, 4219 GNUNET_CONTAINER_MDLL_insert (client,
4171 tc->details.communicator.session_head, 4220 tc->details.communicator.queue_head,
4172 tc->details.communicator.session_tail, 4221 tc->details.communicator.queue_tail,
4173 queue); 4222 queue);
4174 GNUNET_SERVICE_client_continue (tc->client); 4223 GNUNET_SERVICE_client_continue (tc->client);
4175} 4224}
4176 4225
@@ -4193,18 +4242,18 @@ handle_del_queue_message (void *cls,
4193 GNUNET_SERVICE_client_drop (tc->client); 4242 GNUNET_SERVICE_client_drop (tc->client);
4194 return; 4243 return;
4195 } 4244 }
4196 for (struct GNUNET_ATS_Session *session = tc->details.communicator.session_head; 4245 for (struct Queue *queue = tc->details.communicator.queue_head;
4197 NULL != session; 4246 NULL != queue;
4198 session = session->next_client) 4247 queue = queue->next_client)
4199 { 4248 {
4200 struct Neighbour *neighbour = session->neighbour; 4249 struct Neighbour *neighbour = queue->neighbour;
4201 4250
4202 if ( (dqm->qid != session->qid) || 4251 if ( (dqm->qid != queue->qid) ||
4203 (0 != memcmp (&dqm->receiver, 4252 (0 != memcmp (&dqm->receiver,
4204 &neighbour->pid, 4253 &neighbour->pid,
4205 sizeof (struct GNUNET_PeerIdentity))) ) 4254 sizeof (struct GNUNET_PeerIdentity))) )
4206 continue; 4255 continue;
4207 free_session (session); 4256 free_queue (queue);
4208 GNUNET_SERVICE_client_continue (tc->client); 4257 GNUNET_SERVICE_client_continue (tc->client);
4209 return; 4258 return;
4210 } 4259 }
@@ -4224,7 +4273,7 @@ handle_send_message_ack (void *cls,
4224 const struct GNUNET_TRANSPORT_SendMessageToAck *sma) 4273 const struct GNUNET_TRANSPORT_SendMessageToAck *sma)
4225{ 4274{
4226 struct TransportClient *tc = cls; 4275 struct TransportClient *tc = cls;
4227 struct QueueEntry *queue; 4276 struct QueueEntry *qe;
4228 4277
4229 if (CT_COMMUNICATOR != tc->type) 4278 if (CT_COMMUNICATOR != tc->type)
4230 { 4279 {
@@ -4234,37 +4283,37 @@ handle_send_message_ack (void *cls,
4234 } 4283 }
4235 4284
4236 /* find our queue entry matching the ACK */ 4285 /* find our queue entry matching the ACK */
4237 queue = NULL; 4286 qe = NULL;
4238 for (struct GNUNET_ATS_Session *session = tc->details.communicator.session_head; 4287 for (struct Queue *queue = tc->details.communicator.queue_head;
4239 NULL != session; 4288 NULL != queue;
4240 session = session->next_client) 4289 queue = queue->next_client)
4241 { 4290 {
4242 if (0 != memcmp (&session->neighbour->pid, 4291 if (0 != memcmp (&queue->neighbour->pid,
4243 &sma->receiver, 4292 &sma->receiver,
4244 sizeof (struct GNUNET_PeerIdentity))) 4293 sizeof (struct GNUNET_PeerIdentity)))
4245 continue; 4294 continue;
4246 for (struct QueueEntry *qe = session->queue_head; 4295 for (struct QueueEntry *qep = queue->queue_head;
4247 NULL != qe; 4296 NULL != qep;
4248 qe = qe->next) 4297 qep = qep->next)
4249 { 4298 {
4250 if (qe->mid != sma->mid) 4299 if (qep->mid != sma->mid)
4251 continue; 4300 continue;
4252 queue = qe; 4301 qe = qep;
4253 break; 4302 break;
4254 } 4303 }
4255 break; 4304 break;
4256 } 4305 }
4257 if (NULL == queue) 4306 if (NULL == qe)
4258 { 4307 {
4259 /* this should never happen */ 4308 /* this should never happen */
4260 GNUNET_break (0); 4309 GNUNET_break (0);
4261 GNUNET_SERVICE_client_drop (tc->client); 4310 GNUNET_SERVICE_client_drop (tc->client);
4262 return; 4311 return;
4263 } 4312 }
4264 GNUNET_CONTAINER_DLL_remove (queue->session->queue_head, 4313 GNUNET_CONTAINER_DLL_remove (qe->queue->queue_head,
4265 queue->session->queue_tail, 4314 qe->queue->queue_tail,
4266 queue); 4315 qe);
4267 queue->session->queue_length--; 4316 qe->queue->queue_length--;
4268 tc->details.communicator.total_queue_length--; 4317 tc->details.communicator.total_queue_length--;
4269 GNUNET_SERVICE_client_continue (tc->client); 4318 GNUNET_SERVICE_client_continue (tc->client);
4270 4319
@@ -4273,22 +4322,22 @@ handle_send_message_ack (void *cls,
4273 { 4322 {
4274 /* Communicator dropped below threshold, resume all queues */ 4323 /* Communicator dropped below threshold, resume all queues */
4275 GNUNET_STATISTICS_update (GST_stats, 4324 GNUNET_STATISTICS_update (GST_stats,
4276 "# Transmission throttled due to communicator queue limit", 4325 "# Transmission throttled due to communicator queue limit",
4277 -1, 4326 -1,
4278 GNUNET_NO); 4327 GNUNET_NO);
4279 for (struct GNUNET_ATS_Session *session = tc->details.communicator.session_head; 4328 for (struct Queue *queue = tc->details.communicator.queue_head;
4280 NULL != session; 4329 NULL != queue;
4281 session = session->next_client) 4330 queue = queue->next_client)
4282 schedule_transmit_on_queue (session); 4331 schedule_transmit_on_queue (queue);
4283 } 4332 }
4284 else if (SESSION_QUEUE_LIMIT - 1 == queue->session->queue_length) 4333 else if (QUEUE_LENGTH_LIMIT - 1 == qe->queue->queue_length)
4285 { 4334 {
4286 /* queue dropped below threshold; only resume this one queue */ 4335 /* queue dropped below threshold; only resume this one queue */
4287 GNUNET_STATISTICS_update (GST_stats, 4336 GNUNET_STATISTICS_update (GST_stats,
4288 "# Transmission throttled due to session queue limit", 4337 "# Transmission throttled due to queue queue limit",
4289 -1, 4338 -1,
4290 GNUNET_NO); 4339 GNUNET_NO);
4291 schedule_transmit_on_queue (queue->session); 4340 schedule_transmit_on_queue (qe->queue);
4292 } 4341 }
4293 4342
4294 /* TODO: we also should react on the status! */ 4343 /* TODO: we also should react on the status! */
@@ -4296,7 +4345,7 @@ handle_send_message_ack (void *cls,
4296 // FIXME: react to communicator status about transmission request. We got: 4345 // FIXME: react to communicator status about transmission request. We got:
4297 sma->status; // OK success, SYSERR failure 4346 sma->status; // OK success, SYSERR failure
4298 4347
4299 GNUNET_free (queue); 4348 GNUNET_free (qe);
4300} 4349}
4301 4350
4302 4351
@@ -4318,7 +4367,7 @@ notify_client_queues (void *cls,
4318 struct Neighbour *neighbour = value; 4367 struct Neighbour *neighbour = value;
4319 4368
4320 GNUNET_assert (CT_MONITOR == tc->type); 4369 GNUNET_assert (CT_MONITOR == tc->type);
4321 for (struct GNUNET_ATS_Session *q = neighbour->session_head; 4370 for (struct Queue *q = neighbour->queue_head;
4322 NULL != q; 4371 NULL != q;
4323 q = q->next_neighbour) 4372 q = q->next_neighbour)
4324 { 4373 {
@@ -4361,39 +4410,14 @@ handle_monitor_start (void *cls,
4361 tc->details.monitor.peer = start->peer; 4410 tc->details.monitor.peer = start->peer;
4362 tc->details.monitor.one_shot = ntohl (start->one_shot); 4411 tc->details.monitor.one_shot = ntohl (start->one_shot);
4363 GNUNET_CONTAINER_multipeermap_iterate (neighbours, 4412 GNUNET_CONTAINER_multipeermap_iterate (neighbours,
4364 &notify_client_queues, 4413 &notify_client_queues,
4365 tc); 4414 tc);
4366 GNUNET_SERVICE_client_mark_monitor (tc->client); 4415 GNUNET_SERVICE_client_mark_monitor (tc->client);
4367 GNUNET_SERVICE_client_continue (tc->client); 4416 GNUNET_SERVICE_client_continue (tc->client);
4368} 4417}
4369 4418
4370 4419
4371/** 4420/**
4372 * Signature of a function called by ATS with the current bandwidth
4373 * allocation to be used as determined by ATS.
4374 *
4375 * @param cls closure, NULL
4376 * @param session session this is about
4377 * @param bandwidth_out assigned outbound bandwidth for the connection,
4378 * 0 to signal disconnect
4379 * @param bandwidth_in assigned inbound bandwidth for the connection,
4380 * 0 to signal disconnect
4381 */
4382static void
4383ats_allocation_cb (void *cls,
4384 struct GNUNET_ATS_Session *session,
4385 struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
4386 struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
4387{
4388 (void) cls;
4389 GNUNET_BANDWIDTH_tracker_update_quota (&session->tracker_out,
4390 bandwidth_out);
4391 GNUNET_BANDWIDTH_tracker_update_quota (&session->tracker_in,
4392 bandwidth_in);
4393}
4394
4395
4396/**
4397 * Find transport client providing communication service 4421 * Find transport client providing communication service
4398 * for the protocol @a prefix. 4422 * for the protocol @a prefix.
4399 * 4423 *
@@ -4414,24 +4438,22 @@ lookup_communicator (const char *prefix)
4414 return tc; 4438 return tc;
4415 } 4439 }
4416 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 4440 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
4417 "ATS suggested use of communicator for `%s', but we do not have such a communicator!\n", 4441 "Somone suggested use of communicator for `%s', but we do not have such a communicator!\n",
4418 prefix); 4442 prefix);
4419 return NULL; 4443 return NULL;
4420} 4444}
4421 4445
4422 4446
4423/** 4447/**
4424 * Signature of a function called by ATS suggesting transport to 4448 * Signature of a function called with a communicator @a address of a peer
4425 * try connecting with a particular address. 4449 * @a pid that an application wants us to connect to.
4426 * 4450 *
4427 * @param cls closure, NULL
4428 * @param pid target peer 4451 * @param pid target peer
4429 * @param address the address to try 4452 * @param address the address to try
4430 */ 4453 */
4431static void 4454static void
4432ats_suggestion_cb (void *cls, 4455suggest_to_connect (const struct GNUNET_PeerIdentity *pid,
4433 const struct GNUNET_PeerIdentity *pid, 4456 const char *address)
4434 const char *address)
4435{ 4457{
4436 static uint32_t idgen; 4458 static uint32_t idgen;
4437 struct TransportClient *tc; 4459 struct TransportClient *tc;
@@ -4440,32 +4462,31 @@ ats_suggestion_cb (void *cls,
4440 struct GNUNET_MQ_Envelope *env; 4462 struct GNUNET_MQ_Envelope *env;
4441 size_t alen; 4463 size_t alen;
4442 4464
4443 (void) cls;
4444 prefix = GNUNET_HELLO_address_to_prefix (address); 4465 prefix = GNUNET_HELLO_address_to_prefix (address);
4445 if (NULL == prefix) 4466 if (NULL == prefix)
4446 { 4467 {
4447 GNUNET_break (0); /* ATS gave invalid address!? */ 4468 GNUNET_break (0); /* We got an invalid address!? */
4448 return; 4469 return;
4449 } 4470 }
4450 tc = lookup_communicator (prefix); 4471 tc = lookup_communicator (prefix);
4451 if (NULL == tc) 4472 if (NULL == tc)
4452 { 4473 {
4453 GNUNET_STATISTICS_update (GST_stats, 4474 GNUNET_STATISTICS_update (GST_stats,
4454 "# ATS suggestions ignored due to missing communicator", 4475 "# Suggestions ignored due to missing communicator",
4455 1, 4476 1,
4456 GNUNET_NO); 4477 GNUNET_NO);
4457 return; 4478 return;
4458 } 4479 }
4459 /* forward suggestion for queue creation to communicator */ 4480 /* forward suggestion for queue creation to communicator */
4460 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 4481 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
4461 "Request #%u for `%s' communicator to create queue to `%s'\n", 4482 "Request #%u for `%s' communicator to create queue to `%s'\n",
4462 (unsigned int) idgen, 4483 (unsigned int) idgen,
4463 prefix, 4484 prefix,
4464 address); 4485 address);
4465 alen = strlen (address) + 1; 4486 alen = strlen (address) + 1;
4466 env = GNUNET_MQ_msg_extra (cqm, 4487 env = GNUNET_MQ_msg_extra (cqm,
4467 alen, 4488 alen,
4468 GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE); 4489 GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE);
4469 cqm->request_id = htonl (idgen++); 4490 cqm->request_id = htonl (idgen++);
4470 cqm->receiver = *pid; 4491 cqm->receiver = *pid;
4471 memcpy (&cqm[1], 4492 memcpy (&cqm[1],
@@ -4485,7 +4506,7 @@ ats_suggestion_cb (void *cls,
4485 */ 4506 */
4486static void 4507static void
4487handle_queue_create_ok (void *cls, 4508handle_queue_create_ok (void *cls,
4488 const struct GNUNET_TRANSPORT_CreateQueueResponse *cqr) 4509 const struct GNUNET_TRANSPORT_CreateQueueResponse *cqr)
4489{ 4510{
4490 struct TransportClient *tc = cls; 4511 struct TransportClient *tc = cls;
4491 4512
@@ -4496,12 +4517,12 @@ handle_queue_create_ok (void *cls,
4496 return; 4517 return;
4497 } 4518 }
4498 GNUNET_STATISTICS_update (GST_stats, 4519 GNUNET_STATISTICS_update (GST_stats,
4499 "# ATS suggestions succeeded at communicator", 4520 "# Suggestions succeeded at communicator",
4500 1, 4521 1,
4501 GNUNET_NO); 4522 GNUNET_NO);
4502 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 4523 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
4503 "Request #%u for communicator to create queue succeeded\n", 4524 "Request #%u for communicator to create queue succeeded\n",
4504 (unsigned int) ntohs (cqr->request_id)); 4525 (unsigned int) ntohs (cqr->request_id));
4505 GNUNET_SERVICE_client_continue (tc->client); 4526 GNUNET_SERVICE_client_continue (tc->client);
4506} 4527}
4507 4528
@@ -4516,7 +4537,7 @@ handle_queue_create_ok (void *cls,
4516 */ 4537 */
4517static void 4538static void
4518handle_queue_create_fail (void *cls, 4539handle_queue_create_fail (void *cls,
4519 const struct GNUNET_TRANSPORT_CreateQueueResponse *cqr) 4540 const struct GNUNET_TRANSPORT_CreateQueueResponse *cqr)
4520{ 4541{
4521 struct TransportClient *tc = cls; 4542 struct TransportClient *tc = cls;
4522 4543
@@ -4527,12 +4548,137 @@ handle_queue_create_fail (void *cls,
4527 return; 4548 return;
4528 } 4549 }
4529 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 4550 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
4530 "Request #%u for communicator to create queue failed\n", 4551 "Request #%u for communicator to create queue failed\n",
4531 (unsigned int) ntohs (cqr->request_id)); 4552 (unsigned int) ntohs (cqr->request_id));
4532 GNUNET_STATISTICS_update (GST_stats, 4553 GNUNET_STATISTICS_update (GST_stats,
4533 "# ATS suggestions failed in queue creation at communicator", 4554 "# Suggestions failed in queue creation at communicator",
4534 1, 4555 1,
4535 GNUNET_NO); 4556 GNUNET_NO);
4557 GNUNET_SERVICE_client_continue (tc->client);
4558}
4559
4560
4561/**
4562 * Function called by PEERSTORE for each matching record.
4563 *
4564 * @param cls closure
4565 * @param record peerstore record information
4566 * @param emsg error message, or NULL if no errors
4567 */
4568static void
4569handle_hello (void *cls,
4570 const struct GNUNET_PEERSTORE_Record *record,
4571 const char *emsg)
4572{
4573 struct PeerRequest *pr = cls;
4574 const char *val;
4575
4576 if (NULL != emsg)
4577 {
4578 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
4579 "Got failure from PEERSTORE: %s\n",
4580 emsg);
4581 return;
4582 }
4583 val = record->value;
4584 if ( (0 == record->value_size) ||
4585 ('\0' != val[record->value_size - 1]) )
4586 {
4587 GNUNET_break (0);
4588 return;
4589 }
4590 suggest_to_connect (&pr->pid,
4591 (const char *) record->value);
4592}
4593
4594
4595/**
4596 * We have received a `struct ExpressPreferenceMessage` from an application client.
4597 *
4598 * @param cls handle to the client
4599 * @param msg the start message
4600 */
4601static void
4602handle_suggest (void *cls,
4603 const struct ExpressPreferenceMessage *msg)
4604{
4605 struct TransportClient *tc = cls;
4606 struct PeerRequest *pr;
4607
4608 if (CT_NONE == tc->type)
4609 {
4610 tc->type = CT_APPLICATION;
4611 tc->details.application.requests
4612 = GNUNET_CONTAINER_multipeermap_create (16,
4613 GNUNET_YES);
4614 }
4615 if (CT_APPLICATION != tc->type)
4616 {
4617 GNUNET_break (0);
4618 GNUNET_SERVICE_client_drop (tc->client);
4619 return;
4620 }
4621 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
4622 "Client suggested we talk to %s with preference %d at rate %u\n",
4623 GNUNET_i2s (&msg->peer),
4624 (int) ntohl (msg->pk),
4625 (int) ntohl (msg->bw.value__));
4626 pr = GNUNET_new (struct PeerRequest);
4627 pr->tc = tc;
4628 pr->pid = msg->peer;
4629 pr->bw = msg->bw;
4630 pr->pk = (enum GNUNET_MQ_PreferenceKind) ntohl (msg->pk);
4631 if (GNUNET_YES !=
4632 GNUNET_CONTAINER_multipeermap_put (tc->details.application.requests,
4633 &pr->pid,
4634 pr,
4635 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY))
4636 {
4637 GNUNET_break (0);
4638 GNUNET_free (pr);
4639 GNUNET_SERVICE_client_drop (tc->client);
4640 return;
4641 }
4642 pr->wc = GNUNET_PEERSTORE_watch (peerstore,
4643 "transport",
4644 &pr->pid,
4645 "hello",
4646 &handle_hello,
4647 pr);
4648 GNUNET_SERVICE_client_continue (tc->client);
4649}
4650
4651
4652/**
4653 * We have received a `struct ExpressPreferenceMessage` from an application client.
4654 *
4655 * @param cls handle to the client
4656 * @param msg the start message
4657 */
4658static void
4659handle_suggest_cancel (void *cls,
4660 const struct ExpressPreferenceMessage *msg)
4661{
4662 struct TransportClient *tc = cls;
4663 struct PeerRequest *pr;
4664
4665 if (CT_APPLICATION != tc->type)
4666 {
4667 GNUNET_break (0);
4668 GNUNET_SERVICE_client_drop (tc->client);
4669 return;
4670 }
4671 pr = GNUNET_CONTAINER_multipeermap_get (tc->details.application.requests,
4672 &msg->peer);
4673 if (NULL == pr)
4674 {
4675 GNUNET_break (0);
4676 GNUNET_SERVICE_client_drop (tc->client);
4677 return;
4678 }
4679 (void) stop_peer_request (tc,
4680 &pr->pid,
4681 pr);
4536 GNUNET_SERVICE_client_continue (tc->client); 4682 GNUNET_SERVICE_client_continue (tc->client);
4537} 4683}
4538 4684
@@ -4601,8 +4747,8 @@ handle_address_consider_verify (void *cls,
4601 */ 4747 */
4602static int 4748static int
4603free_neighbour_cb (void *cls, 4749free_neighbour_cb (void *cls,
4604 const struct GNUNET_PeerIdentity *pid, 4750 const struct GNUNET_PeerIdentity *pid,
4605 void *value) 4751 void *value)
4606{ 4752{
4607 struct Neighbour *neighbour = value; 4753 struct Neighbour *neighbour = value;
4608 4754
@@ -4625,8 +4771,8 @@ free_neighbour_cb (void *cls,
4625 */ 4771 */
4626static int 4772static int
4627free_dv_routes_cb (void *cls, 4773free_dv_routes_cb (void *cls,
4628 const struct GNUNET_PeerIdentity *pid, 4774 const struct GNUNET_PeerIdentity *pid,
4629 void *value) 4775 void *value)
4630{ 4776{
4631 struct DistanceVector *dv = value; 4777 struct DistanceVector *dv = value;
4632 4778
@@ -4648,8 +4794,8 @@ free_dv_routes_cb (void *cls,
4648 */ 4794 */
4649static int 4795static int
4650free_ephemeral_cb (void *cls, 4796free_ephemeral_cb (void *cls,
4651 const struct GNUNET_PeerIdentity *pid, 4797 const struct GNUNET_PeerIdentity *pid,
4652 void *value) 4798 void *value)
4653{ 4799{
4654 struct EphemeralCacheEntry *ece = value; 4800 struct EphemeralCacheEntry *ece = value;
4655 4801
@@ -4677,13 +4823,8 @@ do_shutdown (void *cls)
4677 ephemeral_task = NULL; 4823 ephemeral_task = NULL;
4678 } 4824 }
4679 GNUNET_CONTAINER_multipeermap_iterate (neighbours, 4825 GNUNET_CONTAINER_multipeermap_iterate (neighbours,
4680 &free_neighbour_cb, 4826 &free_neighbour_cb,
4681 NULL); 4827 NULL);
4682 if (NULL != ats)
4683 {
4684 GNUNET_ATS_transport_done (ats);
4685 ats = NULL;
4686 }
4687 if (NULL != peerstore) 4828 if (NULL != peerstore)
4688 { 4829 {
4689 GNUNET_PEERSTORE_disconnect (peerstore, 4830 GNUNET_PEERSTORE_disconnect (peerstore,
@@ -4734,9 +4875,9 @@ run (void *cls,
4734 /* setup globals */ 4875 /* setup globals */
4735 GST_cfg = c; 4876 GST_cfg = c;
4736 neighbours = GNUNET_CONTAINER_multipeermap_create (1024, 4877 neighbours = GNUNET_CONTAINER_multipeermap_create (1024,
4737 GNUNET_YES); 4878 GNUNET_YES);
4738 dv_routes = GNUNET_CONTAINER_multipeermap_create (1024, 4879 dv_routes = GNUNET_CONTAINER_multipeermap_create (1024,
4739 GNUNET_YES); 4880 GNUNET_YES);
4740 ephemeral_map = GNUNET_CONTAINER_multipeermap_create (32, 4881 ephemeral_map = GNUNET_CONTAINER_multipeermap_create (32,
4741 GNUNET_YES); 4882 GNUNET_YES);
4742 ephemeral_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN); 4883 ephemeral_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
@@ -4764,17 +4905,6 @@ run (void *cls,
4764 GNUNET_SCHEDULER_shutdown (); 4905 GNUNET_SCHEDULER_shutdown ();
4765 return; 4906 return;
4766 } 4907 }
4767 ats = GNUNET_ATS_transport_init (GST_cfg,
4768 &ats_allocation_cb,
4769 NULL,
4770 &ats_suggestion_cb,
4771 NULL);
4772 if (NULL == ats)
4773 {
4774 GNUNET_break (0);
4775 GNUNET_SCHEDULER_shutdown ();
4776 return;
4777 }
4778} 4908}
4779 4909
4780 4910
@@ -4788,52 +4918,61 @@ GNUNET_SERVICE_MAIN
4788 &client_connect_cb, 4918 &client_connect_cb,
4789 &client_disconnect_cb, 4919 &client_disconnect_cb,
4790 NULL, 4920 NULL,
4921 /* communication with applications */
4922 GNUNET_MQ_hd_fixed_size (suggest,
4923 GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST,
4924 struct ExpressPreferenceMessage,
4925 NULL),
4926 GNUNET_MQ_hd_fixed_size (suggest_cancel,
4927 GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST_CANCEL,
4928 struct ExpressPreferenceMessage,
4929 NULL),
4791 /* communication with core */ 4930 /* communication with core */
4792 GNUNET_MQ_hd_fixed_size (client_start, 4931 GNUNET_MQ_hd_fixed_size (client_start,
4793 GNUNET_MESSAGE_TYPE_TRANSPORT_START, 4932 GNUNET_MESSAGE_TYPE_TRANSPORT_START,
4794 struct StartMessage, 4933 struct StartMessage,
4795 NULL), 4934 NULL),
4796 GNUNET_MQ_hd_var_size (client_send, 4935 GNUNET_MQ_hd_var_size (client_send,
4797 GNUNET_MESSAGE_TYPE_TRANSPORT_SEND, 4936 GNUNET_MESSAGE_TYPE_TRANSPORT_SEND,
4798 struct OutboundMessage, 4937 struct OutboundMessage,
4799 NULL), 4938 NULL),
4800 /* communication with communicators */ 4939 /* communication with communicators */
4801 GNUNET_MQ_hd_var_size (communicator_available, 4940 GNUNET_MQ_hd_var_size (communicator_available,
4802 GNUNET_MESSAGE_TYPE_TRANSPORT_NEW_COMMUNICATOR, 4941 GNUNET_MESSAGE_TYPE_TRANSPORT_NEW_COMMUNICATOR,
4803 struct GNUNET_TRANSPORT_CommunicatorAvailableMessage, 4942 struct GNUNET_TRANSPORT_CommunicatorAvailableMessage,
4804 NULL), 4943 NULL),
4805 GNUNET_MQ_hd_var_size (communicator_backchannel, 4944 GNUNET_MQ_hd_var_size (communicator_backchannel,
4806 GNUNET_MESSAGE_TYPE_TRANSPORT_COMMUNICATOR_BACKCHANNEL, 4945 GNUNET_MESSAGE_TYPE_TRANSPORT_COMMUNICATOR_BACKCHANNEL,
4807 struct GNUNET_TRANSPORT_CommunicatorBackchannel, 4946 struct GNUNET_TRANSPORT_CommunicatorBackchannel,
4808 NULL), 4947 NULL),
4809 GNUNET_MQ_hd_var_size (add_address, 4948 GNUNET_MQ_hd_var_size (add_address,
4810 GNUNET_MESSAGE_TYPE_TRANSPORT_ADD_ADDRESS, 4949 GNUNET_MESSAGE_TYPE_TRANSPORT_ADD_ADDRESS,
4811 struct GNUNET_TRANSPORT_AddAddressMessage, 4950 struct GNUNET_TRANSPORT_AddAddressMessage,
4812 NULL), 4951 NULL),
4813 GNUNET_MQ_hd_fixed_size (del_address, 4952 GNUNET_MQ_hd_fixed_size (del_address,
4814 GNUNET_MESSAGE_TYPE_TRANSPORT_DEL_ADDRESS, 4953 GNUNET_MESSAGE_TYPE_TRANSPORT_DEL_ADDRESS,
4815 struct GNUNET_TRANSPORT_DelAddressMessage, 4954 struct GNUNET_TRANSPORT_DelAddressMessage,
4816 NULL), 4955 NULL),
4817 GNUNET_MQ_hd_var_size (incoming_msg, 4956 GNUNET_MQ_hd_var_size (incoming_msg,
4818 GNUNET_MESSAGE_TYPE_TRANSPORT_INCOMING_MSG, 4957 GNUNET_MESSAGE_TYPE_TRANSPORT_INCOMING_MSG,
4819 struct GNUNET_TRANSPORT_IncomingMessage, 4958 struct GNUNET_TRANSPORT_IncomingMessage,
4820 NULL), 4959 NULL),
4821 GNUNET_MQ_hd_fixed_size (queue_create_ok, 4960 GNUNET_MQ_hd_fixed_size (queue_create_ok,
4822 GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_OK, 4961 GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_OK,
4823 struct GNUNET_TRANSPORT_CreateQueueResponse, 4962 struct GNUNET_TRANSPORT_CreateQueueResponse,
4824 NULL), 4963 NULL),
4825 GNUNET_MQ_hd_fixed_size (queue_create_fail, 4964 GNUNET_MQ_hd_fixed_size (queue_create_fail,
4826 GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_FAIL, 4965 GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_CREATE_FAIL,
4827 struct GNUNET_TRANSPORT_CreateQueueResponse, 4966 struct GNUNET_TRANSPORT_CreateQueueResponse,
4828 NULL), 4967 NULL),
4829 GNUNET_MQ_hd_var_size (add_queue_message, 4968 GNUNET_MQ_hd_var_size (add_queue_message,
4830 GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_SETUP, 4969 GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_SETUP,
4831 struct GNUNET_TRANSPORT_AddQueueMessage, 4970 struct GNUNET_TRANSPORT_AddQueueMessage,
4832 NULL), 4971 NULL),
4833 GNUNET_MQ_hd_var_size (address_consider_verify, 4972 GNUNET_MQ_hd_var_size (address_consider_verify,
4834 GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_CONSIDER_VERIFY, 4973 GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_CONSIDER_VERIFY,
4835 struct GNUNET_TRANSPORT_AddressToVerify, 4974 struct GNUNET_TRANSPORT_AddressToVerify,
4836 NULL), 4975 NULL),
4837 GNUNET_MQ_hd_fixed_size (del_queue_message, 4976 GNUNET_MQ_hd_fixed_size (del_queue_message,
4838 GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_TEARDOWN, 4977 GNUNET_MESSAGE_TYPE_TRANSPORT_QUEUE_TEARDOWN,
4839 struct GNUNET_TRANSPORT_DelQueueMessage, 4978 struct GNUNET_TRANSPORT_DelQueueMessage,
diff --git a/src/transport/plugin_transport_xt.c b/src/transport/plugin_transport_xt.c
deleted file mode 100644
index df5e8a127..000000000
--- a/src/transport/plugin_transport_xt.c
+++ /dev/null
@@ -1,4107 +0,0 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2002--2015 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20/**
21 * @file transport/plugin_transport_xt.c
22 * @brief Implementation of the TCP transport service
23 * @author Christian Grothoff
24 */
25#include "platform.h"
26#include "gnunet_hello_lib.h"
27#include "gnunet_constants.h"
28#include "gnunet_util_lib.h"
29#include "gnunet_nat_service.h"
30#include "gnunet_protocols.h"
31#include "gnunet_resolver_service.h"
32#include "gnunet_signatures.h"
33#include "gnunet_statistics_service.h"
34#include "gnunet_transport_service.h"
35#include "gnunet_transport_plugin.h"
36#include "transport.h"
37
38#define LOG(kind,...) GNUNET_log_from (kind, "transport-xt",__VA_ARGS__)
39
40#define PLUGIN_NAME "xt"
41
42/**
43 * How long until we give up on establishing an NAT connection?
44 * Must be > 4 RTT
45 */
46#define NAT_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
47
48/**
49 * Opaque handle that can be used to cancel
50 * a transmit-ready notification.
51 */
52struct GNUNET_CONNECTION_TransmitHandle;
53
54/**
55 * @brief handle for a server
56 */
57struct GNUNET_SERVER_Handle;
58
59/**
60 * @brief opaque handle for a client of the server
61 */
62struct GNUNET_SERVER_Client;
63
64/**
65 * @brief opaque handle server returns for aborting transmission to a client.
66 */
67struct GNUNET_SERVER_TransmitHandle;
68
69/**
70 * @brief handle for a network connection
71 */
72struct GNUNET_CONNECTION_Handle;
73
74/**
75 * @brief handle for a network service
76 */
77struct LEGACY_SERVICE_Context;
78
79
80/**
81 * Stops a service that was started with #GNUNET_SERVICE_start().
82 *
83 * @param srv service to stop
84 */
85void
86LEGACY_SERVICE_stop (struct LEGACY_SERVICE_Context *srv);
87
88
89
90/**
91 * Function called to notify a client about the connection begin ready
92 * to queue more data. @a buf will be NULL and @a size zero if the
93 * connection was closed for writing in the meantime.
94 *
95 * @param cls closure
96 * @param size number of bytes available in @a buf
97 * @param buf where the callee should write the message
98 * @return number of bytes written to @a buf
99 */
100typedef size_t
101(*GNUNET_CONNECTION_TransmitReadyNotify) (void *cls,
102 size_t size,
103 void *buf);
104
105/**
106 * Credentials for UNIX domain sockets.
107 */
108struct GNUNET_CONNECTION_Credentials
109{
110 /**
111 * UID of the other end of the connection.
112 */
113 uid_t uid;
114
115 /**
116 * GID of the other end of the connection.
117 */
118 gid_t gid;
119};
120
121
122/**
123 * Functions with this signature are called whenever a client
124 * is disconnected on the network level.
125 *
126 * @param cls closure
127 * @param client identification of the client; NULL
128 * for the last call when the server is destroyed
129 */
130typedef void
131(*GNUNET_SERVER_DisconnectCallback) (void *cls,
132 struct GNUNET_SERVER_Client *client);
133
134
135/**
136 * Functions with this signature are called whenever a client
137 * is connected on the network level.
138 *
139 * @param cls closure
140 * @param client identification of the client
141 */
142typedef void
143(*GNUNET_SERVER_ConnectCallback) (void *cls,
144 struct GNUNET_SERVER_Client *client);
145
146
147
148
149/**
150 * Function to call for access control checks.
151 *
152 * @param cls closure
153 * @param ucred credentials, if available, otherwise NULL
154 * @param addr address
155 * @param addrlen length of address
156 * @return GNUNET_YES to allow, GNUNET_NO to deny, GNUNET_SYSERR
157 * for unknown address family (will be denied).
158 */
159typedef int
160(*GNUNET_CONNECTION_AccessCheck) (void *cls,
161 const struct
162 GNUNET_CONNECTION_Credentials *
163 ucred,
164 const struct sockaddr * addr,
165 socklen_t addrlen);
166
167/**
168 * Callback function for data received from the network. Note that
169 * both "available" and "err" would be 0 if the read simply timed out.
170 *
171 * @param cls closure
172 * @param buf pointer to received data
173 * @param available number of bytes availabe in "buf",
174 * possibly 0 (on errors)
175 * @param addr address of the sender
176 * @param addrlen size of addr
177 * @param errCode value of errno (on errors receiving)
178 */
179typedef void
180(*GNUNET_CONNECTION_Receiver) (void *cls, const void *buf,
181 size_t available,
182 const struct sockaddr * addr,
183 socklen_t addrlen, int errCode);
184
185
186
187/**
188 * Close the connection and free associated resources. There must
189 * not be any pending requests for reading or writing to the
190 * connection at this time.
191 *
192 * @param connection connection to destroy
193 */
194void
195GNUNET_CONNECTION_destroy (struct GNUNET_CONNECTION_Handle *connection);
196
197
198/**
199 * Signature of a function to create a custom tokenizer.
200 *
201 * @param cls closure from #GNUNET_SERVER_set_callbacks
202 * @param client handle to client the tokenzier will be used for
203 * @return handle to custom tokenizer ('mst')
204 */
205typedef void*
206(*GNUNET_SERVER_MstCreateCallback) (void *cls,
207 struct GNUNET_SERVER_Client *client);
208
209
210/**
211 * Signature of a function to destroy a custom tokenizer.
212 *
213 * @param cls closure from #GNUNET_SERVER_set_callbacks
214 * @param mst custom tokenizer handle
215 */
216typedef void
217(*GNUNET_SERVER_MstDestroyCallback) (void *cls,
218 void *mst);
219
220/**
221 * Signature of a function to receive data for a custom tokenizer.
222 *
223 * @param cls closure from #GNUNET_SERVER_set_callbacks
224 * @param mst custom tokenizer handle
225 * @param client_identity ID of client for which this is a buffer,
226 * can be NULL (will be passed back to 'cb')
227 * @param buf input data to add
228 * @param size number of bytes in @a buf
229 * @param purge should any excess bytes in the buffer be discarded
230 * (i.e. for packet-based services like UDP)
231 * @param one_shot only call callback once, keep rest of message in buffer
232 * @return #GNUNET_OK if we are done processing (need more data)
233 * #GNUNET_NO if one_shot was set and we have another message ready
234 * #GNUNET_SYSERR if the data stream is corrupt
235 */
236typedef int
237(*GNUNET_SERVER_MstReceiveCallback) (void *cls, void *mst,
238 struct GNUNET_SERVER_Client *client,
239 const char *buf,
240 size_t size,
241 int purge,
242 int one_shot);
243/**
244 * Functions with this signature are called whenever a message is
245 * received.
246 *
247 * @param cls closure
248 * @param client identification of the client
249 * @param message the actual message
250 */
251typedef void
252(*GNUNET_SERVER_MessageCallback) (void *cls,
253 struct GNUNET_SERVER_Client *client,
254 const struct GNUNET_MessageHeader *message);
255
256/**
257 * Message handler. Each struct specifies how to handle on particular
258 * type of message received.
259 */
260struct GNUNET_SERVER_MessageHandler
261{
262 /**
263 * Function to call for messages of "type".
264 */
265 GNUNET_SERVER_MessageCallback callback;
266
267 /**
268 * Closure argument for @e callback.
269 */
270 void *callback_cls;
271
272 /**
273 * Type of the message this handler covers.
274 */
275 uint16_t type;
276
277 /**
278 * Expected size of messages of this type. Use 0 for
279 * variable-size. If non-zero, messages of the given
280 * type will be discarded (and the connection closed)
281 * if they do not have the right size.
282 */
283 uint16_t expected_size;
284
285};
286
287
288/**
289 * Options for the service (bitmask).
290 */
291enum LEGACY_SERVICE_Options
292{
293 /**
294 * Use defaults. Terminates all client connections and the listen
295 * sockets immediately upon receiving the shutdown signal.
296 */
297 LEGACY_SERVICE_OPTION_NONE = 0,
298
299 /**
300 * Do not trigger server shutdown on signal at all; instead, allow
301 * for the user to terminate the server explicitly when needed
302 * by calling #LEGACY_SERVICE_shutdown().
303 */
304 LEGACY_SERVICE_OPTION_MANUAL_SHUTDOWN = 1,
305
306 /**
307 * Trigger a SOFT server shutdown on signals, allowing active
308 * non-monitor clients to complete their transactions.
309 */
310 LEGACY_SERVICE_OPTION_SOFT_SHUTDOWN = 2
311};
312
313
314
315/**
316 * Ask the server to disconnect from the given client. This is the
317 * same as passing #GNUNET_SYSERR to #GNUNET_SERVER_receive_done,
318 * except that it allows dropping of a client even when not handling a
319 * message from that client.
320 *
321 * @param client the client to disconnect from
322 */
323void
324GNUNET_SERVER_client_disconnect (struct GNUNET_SERVER_Client *client);
325
326/**
327 * Return user context associated with the given client.
328 * Note: you should probably use the macro (call without the underscore).
329 *
330 * @param client client to query
331 * @param size number of bytes in user context struct (for verification only)
332 * @return pointer to user context
333 */
334void *
335GNUNET_SERVER_client_get_user_context_ (struct GNUNET_SERVER_Client *client,
336 size_t size);
337
338
339/**
340 * Functions with this signature are called whenever a
341 * complete message is received by the tokenizer.
342 *
343 * Do not call #GNUNET_SERVER_mst_destroy from within
344 * the scope of this callback.
345 *
346 * @param cls closure
347 * @param client identification of the client
348 * @param message the actual message
349 * @return #GNUNET_OK on success, #GNUNET_SYSERR to stop further processing
350 */
351typedef int
352(*GNUNET_SERVER_MessageTokenizerCallback) (void *cls,
353 void *client,
354 const struct GNUNET_MessageHeader *message);
355
356
357/**
358 * Create a message stream tokenizer.
359 *
360 * @param cb function to call on completed messages
361 * @param cb_cls closure for @a cb
362 * @return handle to tokenizer
363 */
364struct GNUNET_SERVER_MessageStreamTokenizer *
365GNUNET_SERVER_mst_create (GNUNET_SERVER_MessageTokenizerCallback cb,
366 void *cb_cls);
367
368/**
369 * Add incoming data to the receive buffer and call the
370 * callback for all complete messages.
371 *
372 * @param mst tokenizer to use
373 * @param client_identity ID of client for which this is a buffer,
374 * can be NULL (will be passed back to 'cb')
375 * @param buf input data to add
376 * @param size number of bytes in @a buf
377 * @param purge should any excess bytes in the buffer be discarded
378 * (i.e. for packet-based services like UDP)
379 * @param one_shot only call callback once, keep rest of message in buffer
380 * @return #GNUNET_OK if we are done processing (need more data)
381 * #GNUNET_NO if one_shot was set and we have another message ready
382 * #GNUNET_SYSERR if the data stream is corrupt
383 */
384int
385GNUNET_SERVER_mst_receive (struct GNUNET_SERVER_MessageStreamTokenizer *mst,
386 void *client_identity,
387 const char *buf, size_t size,
388 int purge, int one_shot);
389
390
391
392/**
393 * Destroys a tokenizer.
394 *
395 * @param mst tokenizer to destroy
396 */
397void
398GNUNET_SERVER_mst_destroy (struct GNUNET_SERVER_MessageStreamTokenizer *mst);
399
400
401/**
402 * Set user context to be associated with the given client.
403 * Note: you should probably use the macro (call without the underscore).
404 *
405 * @param client client to query
406 * @param ptr pointer to user context
407 * @param size number of bytes in user context struct (for verification only)
408 */
409void
410GNUNET_SERVER_client_set_user_context_ (struct GNUNET_SERVER_Client *client,
411 void *ptr,
412 size_t size);
413/**
414 * Return user context associated with the given client.
415 *
416 * @param client client to query
417 * @param type expected return type (i.e. 'struct Foo')
418 * @return pointer to user context of type 'type *'.
419 */
420#define GNUNET_SERVER_client_get_user_context(client,type) \
421 (type *) GNUNET_SERVER_client_get_user_context_ (client, sizeof (type))
422
423/**
424 * Set user context to be associated with the given client.
425 *
426 * @param client client to query
427 * @param value pointer to user context
428 */
429#define GNUNET_SERVER_client_set_user_context(client,value) \
430 GNUNET_SERVER_client_set_user_context_ (client, value, sizeof (*value))
431
432
433
434/**
435 * Notify us when the server has enough space to transmit
436 * a message of the given size to the given client.
437 *
438 * @param client client to transmit message to
439 * @param size requested amount of buffer space
440 * @param timeout after how long should we give up (and call
441 * notify with buf NULL and size 0)?
442 * @param callback function to call when space is available
443 * @param callback_cls closure for @a callback
444 * @return non-NULL if the notify callback was queued; can be used
445 * to cancel the request using
446 * #GNUNET_SERVER_notify_transmit_ready_cancel.
447 * NULL if we are already going to notify someone else (busy)
448 */
449struct GNUNET_SERVER_TransmitHandle *
450GNUNET_SERVER_notify_transmit_ready (struct GNUNET_SERVER_Client *client,
451 size_t size,
452 struct GNUNET_TIME_Relative timeout,
453 GNUNET_CONNECTION_TransmitReadyNotify callback,
454 void *callback_cls);
455
456/**
457 * Abort transmission request.
458 *
459 * @param th request to abort
460 */
461void
462GNUNET_SERVER_notify_transmit_ready_cancel (struct GNUNET_SERVER_TransmitHandle *th);
463
464
465
466
467/**
468 * Notify the server that the given client handle should
469 * be kept (keeps the connection up if possible, increments
470 * the internal reference counter).
471 *
472 * @param client the client to keep
473 */
474void
475GNUNET_SERVER_client_keep (struct GNUNET_SERVER_Client *client);
476
477
478/**
479 * Notify the server that the given client handle is no
480 * longer required. Decrements the reference counter. If
481 * that counter reaches zero an inactive connection maybe
482 * closed.
483 *
484 * @param client the client to drop
485 */
486void
487GNUNET_SERVER_client_drop (struct GNUNET_SERVER_Client *client);
488
489
490/**
491 * Function called by the service's run
492 * method to run service-specific setup code.
493 *
494 * @param cls closure
495 * @param server the initialized server
496 * @param cfg configuration to use
497 */
498typedef void
499(*LEGACY_SERVICE_Main) (void *cls,
500 struct GNUNET_SERVER_Handle *server,
501 const struct GNUNET_CONFIGURATION_Handle *cfg);
502
503
504
505/**
506 * Suspend accepting connections from the listen socket temporarily.
507 * Resume activity using #GNUNET_SERVER_resume.
508 *
509 * @param server server to stop accepting connections.
510 */
511void
512GNUNET_SERVER_suspend (struct GNUNET_SERVER_Handle *server);
513
514/**
515 * Notify us when the server has enough space to transmit
516 * a message of the given size to the given client.
517 *
518 * @param client client to transmit message to
519 * @param size requested amount of buffer space
520 * @param timeout after how long should we give up (and call
521 * notify with buf NULL and size 0)?
522 * @param callback function to call when space is available
523 * @param callback_cls closure for @a callback
524 * @return non-NULL if the notify callback was queued; can be used
525 * to cancel the request using
526 * #GNUNET_SERVER_notify_transmit_ready_cancel.
527 * NULL if we are already going to notify someone else (busy)
528 */
529struct GNUNET_SERVER_TransmitHandle *
530GNUNET_SERVER_notify_transmit_ready (struct GNUNET_SERVER_Client *client,
531 size_t size,
532 struct GNUNET_TIME_Relative timeout,
533 GNUNET_CONNECTION_TransmitReadyNotify callback,
534 void *callback_cls);
535
536
537/**
538 * Add a TCP socket-based connection to the set of handles managed by
539 * this server. Use this function for outgoing (P2P) connections that
540 * we initiated (and where this server should process incoming
541 * messages).
542 *
543 * @param server the server to use
544 * @param connection the connection to manage (client must
545 * stop using this connection from now on)
546 * @return the client handle
547 */
548struct GNUNET_SERVER_Client *
549GNUNET_SERVER_connect_socket (struct GNUNET_SERVER_Handle *server,
550 struct GNUNET_CONNECTION_Handle *connection);
551
552
553/**
554 * Resume accepting connections from the listen socket.
555 *
556 * @param server server to resume accepting connections.
557 */
558void
559GNUNET_SERVER_resume (struct GNUNET_SERVER_Handle *server);
560
561/**
562 * Free resources held by this server.
563 *
564 * @param server server to destroy
565 */
566void
567GNUNET_SERVER_destroy (struct GNUNET_SERVER_Handle *server);
568
569
570
571
572#include "tcp_connection_legacy.c"
573#include "tcp_server_mst_legacy.c"
574#include "tcp_server_legacy.c"
575#include "tcp_service_legacy.c"
576
577GNUNET_NETWORK_STRUCT_BEGIN
578
579/**
580 * Initial handshake message for a session.
581 */
582struct WelcomeMessage
583{
584 /**
585 * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_WELCOME.
586 */
587 struct GNUNET_MessageHeader header;
588
589 /**
590 * Identity of the node connecting (TCP client)
591 */
592 struct GNUNET_PeerIdentity clientIdentity;
593
594};
595
596/**
597 * Basically a WELCOME message, but with the purpose
598 * of giving the waiting peer a client handle to use
599 */
600struct TCP_NAT_ProbeMessage
601{
602 /**
603 * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_NAT_PROBE.
604 */
605 struct GNUNET_MessageHeader header;
606
607 /**
608 * Identity of the sender of the message.
609 */
610 struct GNUNET_PeerIdentity clientIdentity;
611
612};
613GNUNET_NETWORK_STRUCT_END
614
615/**
616 * Context for sending a NAT probe via TCP.
617 */
618struct TCPProbeContext
619{
620
621 /**
622 * Active probes are kept in a DLL.
623 */
624 struct TCPProbeContext *next;
625
626 /**
627 * Active probes are kept in a DLL.
628 */
629 struct TCPProbeContext *prev;
630
631 /**
632 * Probe connection.
633 */
634 struct GNUNET_CONNECTION_Handle *sock;
635
636 /**
637 * Message to be sent.
638 */
639 struct TCP_NAT_ProbeMessage message;
640
641 /**
642 * Handle to the transmission.
643 */
644 struct GNUNET_CONNECTION_TransmitHandle *transmit_handle;
645
646 /**
647 * Transport plugin handle.
648 */
649 struct Plugin *plugin;
650};
651
652/**
653 * Bits in the `options` field of TCP addresses.
654 */
655enum TcpAddressOptions
656{
657
658 /**
659 * No bits set.
660 */
661 TCP_OPTIONS_NONE = 0,
662
663 /**
664 * See #HTTP_OPTIONS_VERIFY_CERTIFICATE.
665 */
666 TCP_OPTIONS_RESERVED = 1,
667
668 /**
669 * Enable TCP Stealth-style port knocking.
670 */
671 TCP_OPTIONS_TCP_STEALTH = 2
672};
673
674GNUNET_NETWORK_STRUCT_BEGIN
675
676/**
677 * Network format for IPv4 addresses.
678 */
679struct IPv4TcpAddress
680{
681 /**
682 * Optional options and flags for this address,
683 * see `enum TcpAddressOptions`
684 */
685 uint32_t options GNUNET_PACKED;
686
687 /**
688 * IPv4 address, in network byte order.
689 */
690 uint32_t ipv4_addr GNUNET_PACKED;
691
692 /**
693 * Port number, in network byte order.
694 */
695 uint16_t t4_port GNUNET_PACKED;
696
697};
698
699/**
700 * Network format for IPv6 addresses.
701 */
702struct IPv6TcpAddress
703{
704 /**
705 * Optional flags for this address
706 * see `enum TcpAddressOptions`
707 */
708 uint32_t options GNUNET_PACKED;
709
710 /**
711 * IPv6 address.
712 */
713 struct in6_addr ipv6_addr GNUNET_PACKED;
714
715 /**
716 * Port number, in network byte order.
717 */
718 uint16_t t6_port GNUNET_PACKED;
719
720};
721GNUNET_NETWORK_STRUCT_END
722
723/**
724 * Encapsulation of all of the state of the plugin.
725 */
726struct Plugin;
727
728/**
729 * Information kept for each message that is yet to
730 * be transmitted.
731 */
732struct PendingMessage
733{
734
735 /**
736 * This is a doubly-linked list.
737 */
738 struct PendingMessage *next;
739
740 /**
741 * This is a doubly-linked list.
742 */
743 struct PendingMessage *prev;
744
745 /**
746 * The pending message
747 */
748 const char *msg;
749
750 /**
751 * Continuation function to call once the message
752 * has been sent. Can be NULL if there is no
753 * continuation to call.
754 */
755 GNUNET_TRANSPORT_TransmitContinuation transmit_cont;
756
757 /**
758 * Closure for @e transmit_cont.
759 */
760 void *transmit_cont_cls;
761
762 /**
763 * Timeout value for the pending message.
764 */
765 struct GNUNET_TIME_Absolute timeout;
766
767 /**
768 * So that the gnunet-service-transport can group messages together,
769 * these pending messages need to accept a message buffer and size
770 * instead of just a `struct GNUNET_MessageHeader`.
771 */
772 size_t message_size;
773
774};
775
776/**
777 * Session handle for TCP connections.
778 */
779struct GNUNET_ATS_Session
780{
781 /**
782 * To whom are we talking to (set to our identity
783 * if we are still waiting for the welcome message)
784 */
785 struct GNUNET_PeerIdentity target;
786
787 /**
788 * Pointer to the global plugin struct.
789 */
790 struct Plugin *plugin;
791
792 /**
793 * The client (used to identify this connection)
794 */
795 struct GNUNET_SERVER_Client *client;
796
797 /**
798 * Task cleaning up a NAT client connection establishment attempt;
799 */
800 struct GNUNET_SCHEDULER_Task *nat_connection_timeout;
801
802 /**
803 * Messages currently pending for transmission
804 * to this peer, if any.
805 */
806 struct PendingMessage *pending_messages_head;
807
808 /**
809 * Messages currently pending for transmission
810 * to this peer, if any.
811 */
812 struct PendingMessage *pending_messages_tail;
813
814 /**
815 * Handle for pending transmission request.
816 */
817 struct GNUNET_SERVER_TransmitHandle *transmit_handle;
818
819 /**
820 * Address of the other peer.
821 */
822 struct GNUNET_HELLO_Address *address;
823
824 /**
825 * ID of task used to delay receiving more to throttle sender.
826 */
827 struct GNUNET_SCHEDULER_Task *receive_delay_task;
828
829 /**
830 * Session timeout task
831 */
832 struct GNUNET_SCHEDULER_Task *timeout_task;
833
834 /**
835 * When will this session time out?
836 */
837 struct GNUNET_TIME_Absolute timeout;
838
839 /**
840 * When will we continue to read from the socket?
841 * (used to enforce inbound quota).
842 */
843 struct GNUNET_TIME_Absolute receive_delay;
844
845 /**
846 * Last activity on this connection. Used to select preferred
847 * connection.
848 */
849 struct GNUNET_TIME_Absolute last_activity;
850
851 /**
852 * Number of bytes waiting for transmission to this peer.
853 */
854 unsigned long long bytes_in_queue;
855
856 /**
857 * Number of messages waiting for transmission to this peer.
858 */
859 unsigned int msgs_in_queue;
860
861 /**
862 * Network type of the address.
863 */
864 enum GNUNET_NetworkType scope;
865
866 /**
867 * Are we still expecting the welcome message? (#GNUNET_YES/#GNUNET_NO)
868 */
869 int expecting_welcome;
870
871 /**
872 * Was this session created using NAT traversal?
873 */
874 int is_nat;
875
876};
877
878
879/**
880 * Context for address to string conversion, closure
881 * for #append_port().
882 */
883struct PrettyPrinterContext
884{
885 /**
886 * DLL
887 */
888 struct PrettyPrinterContext *next;
889
890 /**
891 * DLL
892 */
893 struct PrettyPrinterContext *prev;
894
895 /**
896 * Our plugin.
897 */
898 struct Plugin *plugin;
899
900 /**
901 * Timeout task
902 */
903 struct GNUNET_SCHEDULER_Task *timeout_task;
904
905 /**
906 * Resolver handle
907 */
908 struct GNUNET_RESOLVER_RequestHandle *resolver_handle;
909
910 /**
911 * Function to call with the result.
912 */
913 GNUNET_TRANSPORT_AddressStringCallback asc;
914
915 /**
916 * Clsoure for @e asc.
917 */
918 void *asc_cls;
919
920 /**
921 * IPv6 address
922 */
923 int ipv6;
924
925 /**
926 * Options
927 */
928 uint32_t options;
929
930 /**
931 * Port to add after the IP address.
932 */
933 uint16_t port;
934};
935
936
937/**
938 * Encapsulation of all of the state of the plugin.
939 */
940struct Plugin
941{
942 /**
943 * Our environment.
944 */
945 struct GNUNET_TRANSPORT_PluginEnvironment *env;
946
947 /**
948 * The listen socket.
949 */
950 struct GNUNET_CONNECTION_Handle *lsock;
951
952 /**
953 * Our handle to the NAT module.
954 */
955 struct GNUNET_NAT_Handle *nat;
956
957 /**
958 * Map from peer identities to sessions for the given peer.
959 */
960 struct GNUNET_CONTAINER_MultiPeerMap *sessionmap;
961
962 /**
963 * Handle to the network service.
964 */
965 struct LEGACY_SERVICE_Context *service;
966
967 /**
968 * Handle to the server for this service.
969 */
970 struct GNUNET_SERVER_Handle *server;
971
972 /**
973 * Copy of the handler array where the closures are
974 * set to this struct's instance.
975 */
976 struct GNUNET_SERVER_MessageHandler *handlers;
977
978 /**
979 * Map of peers we have tried to contact behind a NAT
980 */
981 struct GNUNET_CONTAINER_MultiPeerMap *nat_wait_conns;
982
983 /**
984 * List of active TCP probes.
985 */
986 struct TCPProbeContext *probe_head;
987
988 /**
989 * List of active TCP probes.
990 */
991 struct TCPProbeContext *probe_tail;
992
993 /**
994 * Function to call about session status changes.
995 */
996 GNUNET_TRANSPORT_SessionInfoCallback sic;
997
998 /**
999 * Closure for @e sic.
1000 */
1001 void *sic_cls;
1002
1003 /**
1004 * ID of task used to update our addresses when one expires.
1005 */
1006 struct GNUNET_SCHEDULER_Task *address_update_task;
1007
1008 /**
1009 * Running pretty printers: head
1010 */
1011 struct PrettyPrinterContext *ppc_dll_head;
1012
1013 /**
1014 * Running pretty printers: tail
1015 */
1016 struct PrettyPrinterContext *ppc_dll_tail;
1017
1018 /**
1019 * Welcome message used by this peer.
1020 */
1021 struct WelcomeMessage my_welcome;
1022
1023 /**
1024 * How many more TCP sessions are we allowed to open right now?
1025 */
1026 unsigned long long max_connections;
1027
1028 /**
1029 * How many more TCP sessions do we have right now?
1030 */
1031 unsigned long long cur_connections;
1032
1033 /**
1034 * Address options
1035 */
1036 uint32_t myoptions;
1037
1038 /**
1039 * Port that we are actually listening on.
1040 */
1041 uint16_t open_port;
1042
1043 /**
1044 * Port that the user said we would have visible to the
1045 * rest of the world.
1046 */
1047 uint16_t adv_port;
1048
1049};
1050
1051
1052/**
1053 * Get the list of addresses that a server for the given service
1054 * should bind to.
1055 *
1056 * @param service_name name of the service
1057 * @param cfg configuration (which specifies the addresses)
1058 * @param addrs set (call by reference) to an array of pointers to the
1059 * addresses the server should bind to and listen on; the
1060 * array will be NULL-terminated (on success)
1061 * @param addr_lens set (call by reference) to an array of the lengths
1062 * of the respective `struct sockaddr` struct in the @a addrs
1063 * array (on success)
1064 * @return number of addresses found on success,
1065 * #GNUNET_SYSERR if the configuration
1066 * did not specify reasonable finding information or
1067 * if it specified a hostname that could not be resolved;
1068 * #GNUNET_NO if the number of addresses configured is
1069 * zero (in this case, `*addrs` and `*addr_lens` will be
1070 * set to NULL).
1071 */
1072static int
1073get_server_addresses (const char *service_name,
1074 const struct GNUNET_CONFIGURATION_Handle *cfg,
1075 struct sockaddr ***addrs,
1076 socklen_t ** addr_lens)
1077{
1078 int disablev6;
1079 struct GNUNET_NETWORK_Handle *desc;
1080 unsigned long long port;
1081 char *unixpath;
1082 struct addrinfo hints;
1083 struct addrinfo *res;
1084 struct addrinfo *pos;
1085 struct addrinfo *next;
1086 unsigned int i;
1087 int resi;
1088 int ret;
1089 int abstract;
1090 struct sockaddr **saddrs;
1091 socklen_t *saddrlens;
1092 char *hostname;
1093
1094 *addrs = NULL;
1095 *addr_lens = NULL;
1096 desc = NULL;
1097 if (GNUNET_CONFIGURATION_have_value (cfg, service_name, "DISABLEV6"))
1098 {
1099 if (GNUNET_SYSERR ==
1100 (disablev6 =
1101 GNUNET_CONFIGURATION_get_value_yesno (cfg, service_name, "DISABLEV6")))
1102 return GNUNET_SYSERR;
1103 }
1104 else
1105 disablev6 = GNUNET_NO;
1106
1107 if (! disablev6)
1108 {
1109 /* probe IPv6 support */
1110 desc = GNUNET_NETWORK_socket_create (PF_INET6, SOCK_STREAM, 0);
1111 if (NULL == desc)
1112 {
1113 if ((ENOBUFS == errno) || (ENOMEM == errno) || (ENFILE == errno) ||
1114 (EACCES == errno))
1115 {
1116 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket");
1117 return GNUNET_SYSERR;
1118 }
1119 LOG (GNUNET_ERROR_TYPE_INFO,
1120 _("Disabling IPv6 support for service `%s', failed to create IPv6 socket: %s\n"),
1121 service_name, STRERROR (errno));
1122 disablev6 = GNUNET_YES;
1123 }
1124 else
1125 {
1126 GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (desc));
1127 desc = NULL;
1128 }
1129 }
1130
1131 port = 0;
1132 if (GNUNET_CONFIGURATION_have_value (cfg, service_name, "PORT"))
1133 {
1134 if (GNUNET_OK !=
1135 GNUNET_CONFIGURATION_get_value_number (cfg, service_name,
1136 "PORT", &port))
1137 {
1138 LOG (GNUNET_ERROR_TYPE_ERROR,
1139 _("Require valid port number for service `%s' in configuration!\n"),
1140 service_name);
1141 }
1142 if (port > 65535)
1143 {
1144 LOG (GNUNET_ERROR_TYPE_ERROR,
1145 _("Require valid port number for service `%s' in configuration!\n"),
1146 service_name);
1147 return GNUNET_SYSERR;
1148 }
1149 }
1150
1151 if (GNUNET_CONFIGURATION_have_value (cfg, service_name, "BINDTO"))
1152 {
1153 GNUNET_break (GNUNET_OK ==
1154 GNUNET_CONFIGURATION_get_value_string (cfg, service_name,
1155 "BINDTO", &hostname));
1156 }
1157 else
1158 hostname = NULL;
1159
1160 unixpath = NULL;
1161 abstract = GNUNET_NO;
1162#ifdef AF_UNIX
1163 if ((GNUNET_YES ==
1164 GNUNET_CONFIGURATION_have_value (cfg, service_name, "UNIXPATH")) &&
1165 (GNUNET_OK ==
1166 GNUNET_CONFIGURATION_get_value_filename (cfg, service_name, "UNIXPATH",
1167 &unixpath)) &&
1168 (0 < strlen (unixpath)))
1169 {
1170 /* probe UNIX support */
1171 struct sockaddr_un s_un;
1172
1173 if (strlen (unixpath) >= sizeof (s_un.sun_path))
1174 {
1175 LOG (GNUNET_ERROR_TYPE_WARNING,
1176 _("UNIXPATH `%s' too long, maximum length is %llu\n"), unixpath,
1177 (unsigned long long) sizeof (s_un.sun_path));
1178 unixpath = GNUNET_NETWORK_shorten_unixpath (unixpath);
1179 LOG (GNUNET_ERROR_TYPE_INFO,
1180 _("Using `%s' instead\n"),
1181 unixpath);
1182 }
1183#ifdef LINUX
1184 abstract = GNUNET_CONFIGURATION_get_value_yesno (cfg,
1185 "TESTING",
1186 "USE_ABSTRACT_SOCKETS");
1187 if (GNUNET_SYSERR == abstract)
1188 abstract = GNUNET_NO;
1189#endif
1190 if ((GNUNET_YES != abstract)
1191 && (GNUNET_OK !=
1192 GNUNET_DISK_directory_create_for_file (unixpath)))
1193 GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR,
1194 "mkdir",
1195 unixpath);
1196 }
1197 if (NULL != unixpath)
1198 {
1199 desc = GNUNET_NETWORK_socket_create (AF_UNIX, SOCK_STREAM, 0);
1200 if (NULL == desc)
1201 {
1202 if ((ENOBUFS == errno) || (ENOMEM == errno) || (ENFILE == errno) ||
1203 (EACCES == errno))
1204 {
1205 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket");
1206 GNUNET_free_non_null (hostname);
1207 GNUNET_free (unixpath);
1208 return GNUNET_SYSERR;
1209 }
1210 LOG (GNUNET_ERROR_TYPE_INFO,
1211 _("Disabling UNIX domain socket support for service `%s', failed to create UNIX domain socket: %s\n"),
1212 service_name,
1213 STRERROR (errno));
1214 GNUNET_free (unixpath);
1215 unixpath = NULL;
1216 }
1217 else
1218 {
1219 GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (desc));
1220 desc = NULL;
1221 }
1222 }
1223#endif
1224
1225 if ((0 == port) && (NULL == unixpath))
1226 {
1227 LOG (GNUNET_ERROR_TYPE_ERROR,
1228 _("Have neither PORT nor UNIXPATH for service `%s', but one is required\n"),
1229 service_name);
1230 GNUNET_free_non_null (hostname);
1231 return GNUNET_SYSERR;
1232 }
1233 if (0 == port)
1234 {
1235 saddrs = GNUNET_malloc (2 * sizeof (struct sockaddr *));
1236 saddrlens = GNUNET_malloc (2 * sizeof (socklen_t));
1237 add_unixpath (saddrs, saddrlens, unixpath, abstract);
1238 GNUNET_free_non_null (unixpath);
1239 GNUNET_free_non_null (hostname);
1240 *addrs = saddrs;
1241 *addr_lens = saddrlens;
1242 return 1;
1243 }
1244
1245 if (NULL != hostname)
1246 {
1247 LOG (GNUNET_ERROR_TYPE_DEBUG,
1248 "Resolving `%s' since that is where `%s' will bind to.\n",
1249 hostname,
1250 service_name);
1251 memset (&hints, 0, sizeof (struct addrinfo));
1252 if (disablev6)
1253 hints.ai_family = AF_INET;
1254 hints.ai_protocol = IPPROTO_TCP;
1255 if ((0 != (ret = getaddrinfo (hostname, NULL, &hints, &res))) ||
1256 (NULL == res))
1257 {
1258 LOG (GNUNET_ERROR_TYPE_ERROR,
1259 _("Failed to resolve `%s': %s\n"),
1260 hostname,
1261 gai_strerror (ret));
1262 GNUNET_free (hostname);
1263 GNUNET_free_non_null (unixpath);
1264 return GNUNET_SYSERR;
1265 }
1266 next = res;
1267 i = 0;
1268 while (NULL != (pos = next))
1269 {
1270 next = pos->ai_next;
1271 if ((disablev6) && (pos->ai_family == AF_INET6))
1272 continue;
1273 i++;
1274 }
1275 if (0 == i)
1276 {
1277 LOG (GNUNET_ERROR_TYPE_ERROR,
1278 _("Failed to find %saddress for `%s'.\n"),
1279 disablev6 ? "IPv4 " : "",
1280 hostname);
1281 freeaddrinfo (res);
1282 GNUNET_free (hostname);
1283 GNUNET_free_non_null (unixpath);
1284 return GNUNET_SYSERR;
1285 }
1286 resi = i;
1287 if (NULL != unixpath)
1288 resi++;
1289 saddrs = GNUNET_malloc ((resi + 1) * sizeof (struct sockaddr *));
1290 saddrlens = GNUNET_malloc ((resi + 1) * sizeof (socklen_t));
1291 i = 0;
1292 if (NULL != unixpath)
1293 {
1294 add_unixpath (saddrs, saddrlens, unixpath, abstract);
1295 i++;
1296 }
1297 next = res;
1298 while (NULL != (pos = next))
1299 {
1300 next = pos->ai_next;
1301 if ((disablev6) && (AF_INET6 == pos->ai_family))
1302 continue;
1303 if ((IPPROTO_TCP != pos->ai_protocol) && (0 != pos->ai_protocol))
1304 continue; /* not TCP */
1305 if ((SOCK_STREAM != pos->ai_socktype) && (0 != pos->ai_socktype))
1306 continue; /* huh? */
1307 LOG (GNUNET_ERROR_TYPE_DEBUG, "Service `%s' will bind to `%s'\n",
1308 service_name, GNUNET_a2s (pos->ai_addr, pos->ai_addrlen));
1309 if (AF_INET == pos->ai_family)
1310 {
1311 GNUNET_assert (sizeof (struct sockaddr_in) == pos->ai_addrlen);
1312 saddrlens[i] = pos->ai_addrlen;
1313 saddrs[i] = GNUNET_malloc (saddrlens[i]);
1314 GNUNET_memcpy (saddrs[i], pos->ai_addr, saddrlens[i]);
1315 ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
1316 }
1317 else
1318 {
1319 GNUNET_assert (AF_INET6 == pos->ai_family);
1320 GNUNET_assert (sizeof (struct sockaddr_in6) == pos->ai_addrlen);
1321 saddrlens[i] = pos->ai_addrlen;
1322 saddrs[i] = GNUNET_malloc (saddrlens[i]);
1323 GNUNET_memcpy (saddrs[i], pos->ai_addr, saddrlens[i]);
1324 ((struct sockaddr_in6 *) saddrs[i])->sin6_port = htons (port);
1325 }
1326 i++;
1327 }
1328 GNUNET_free (hostname);
1329 freeaddrinfo (res);
1330 resi = i;
1331 }
1332 else
1333 {
1334 /* will bind against everything, just set port */
1335 if (disablev6)
1336 {
1337 /* V4-only */
1338 resi = 1;
1339 if (NULL != unixpath)
1340 resi++;
1341 i = 0;
1342 saddrs = GNUNET_malloc ((resi + 1) * sizeof (struct sockaddr *));
1343 saddrlens = GNUNET_malloc ((resi + 1) * sizeof (socklen_t));
1344 if (NULL != unixpath)
1345 {
1346 add_unixpath (saddrs, saddrlens, unixpath, abstract);
1347 i++;
1348 }
1349 saddrlens[i] = sizeof (struct sockaddr_in);
1350 saddrs[i] = GNUNET_malloc (saddrlens[i]);
1351#if HAVE_SOCKADDR_IN_SIN_LEN
1352 ((struct sockaddr_in *) saddrs[i])->sin_len = saddrlens[i];
1353#endif
1354 ((struct sockaddr_in *) saddrs[i])->sin_family = AF_INET;
1355 ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
1356 }
1357 else
1358 {
1359 /* dual stack */
1360 resi = 2;
1361 if (NULL != unixpath)
1362 resi++;
1363 saddrs = GNUNET_malloc ((resi + 1) * sizeof (struct sockaddr *));
1364 saddrlens = GNUNET_malloc ((resi + 1) * sizeof (socklen_t));
1365 i = 0;
1366 if (NULL != unixpath)
1367 {
1368 add_unixpath (saddrs, saddrlens, unixpath, abstract);
1369 i++;
1370 }
1371 saddrlens[i] = sizeof (struct sockaddr_in6);
1372 saddrs[i] = GNUNET_malloc (saddrlens[i]);
1373#if HAVE_SOCKADDR_IN_SIN_LEN
1374 ((struct sockaddr_in6 *) saddrs[i])->sin6_len = saddrlens[0];
1375#endif
1376 ((struct sockaddr_in6 *) saddrs[i])->sin6_family = AF_INET6;
1377 ((struct sockaddr_in6 *) saddrs[i])->sin6_port = htons (port);
1378 i++;
1379 saddrlens[i] = sizeof (struct sockaddr_in);
1380 saddrs[i] = GNUNET_malloc (saddrlens[i]);
1381#if HAVE_SOCKADDR_IN_SIN_LEN
1382 ((struct sockaddr_in *) saddrs[i])->sin_len = saddrlens[1];
1383#endif
1384 ((struct sockaddr_in *) saddrs[i])->sin_family = AF_INET;
1385 ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
1386 }
1387 }
1388 GNUNET_free_non_null (unixpath);
1389 *addrs = saddrs;
1390 *addr_lens = saddrlens;
1391 return resi;
1392}
1393/* end ancient copy-and-paste */
1394
1395
1396/**
1397 * If a session monitor is attached, notify it about the new
1398 * session state.
1399 *
1400 * @param plugin our plugin
1401 * @param session session that changed state
1402 * @param state new state of the session
1403 */
1404static void
1405notify_session_monitor (struct Plugin *plugin,
1406 struct GNUNET_ATS_Session *session,
1407 enum GNUNET_TRANSPORT_SessionState state)
1408{
1409 struct GNUNET_TRANSPORT_SessionInfo info;
1410
1411 if (NULL == plugin->sic)
1412 return;
1413 memset (&info, 0, sizeof (info));
1414 info.state = state;
1415 info.is_inbound = GNUNET_HELLO_address_check_option (session->address,
1416 GNUNET_HELLO_ADDRESS_INFO_INBOUND);
1417 info.num_msg_pending = session->msgs_in_queue;
1418 info.num_bytes_pending = session->bytes_in_queue;
1419 if (NULL != session->receive_delay_task)
1420 info.receive_delay = session->receive_delay;
1421 info.session_timeout = session->timeout;
1422 info.address = session->address;
1423 plugin->sic (plugin->sic_cls,
1424 session,
1425 &info);
1426}
1427
1428
1429/**
1430 * Our external IP address/port mapping has changed.
1431 *
1432 * @param cls closure, the `struct Plugin`
1433 * @param add_remove #GNUNET_YES to mean the new public IP address, #GNUNET_NO to mean
1434 * the previous (now invalid) one
1435 * @param ac address class the address belongs to
1436 * @param addr either the previous or the new public IP address
1437 * @param addrlen actual length of @a addr
1438 */
1439static void
1440tcp_nat_port_map_callback (void *cls,
1441 int add_remove,
1442 enum GNUNET_NAT_AddressClass ac,
1443 const struct sockaddr *addr,
1444 socklen_t addrlen)
1445{
1446 struct Plugin *plugin = cls;
1447 struct GNUNET_HELLO_Address *address;
1448 struct IPv4TcpAddress t4;
1449 struct IPv6TcpAddress t6;
1450 void *arg;
1451 size_t args;
1452
1453 if (GNUNET_NAT_AC_LOOPBACK == ac)
1454 return;
1455 if (GNUNET_NAT_AC_LAN == ac)
1456 return;
1457 if (GNUNET_NAT_AC_LAN_PRIVATE == ac)
1458 return;
1459 LOG (GNUNET_ERROR_TYPE_INFO,
1460 "NAT notification to %s address `%s'\n",
1461 (GNUNET_YES == add_remove) ? "add" : "remove",
1462 GNUNET_a2s (addr, addrlen));
1463 /* convert 'addr' to our internal format */
1464 switch (addr->sa_family)
1465 {
1466 case AF_INET:
1467 GNUNET_assert(addrlen == sizeof(struct sockaddr_in));
1468 memset (&t4, 0, sizeof(t4));
1469 t4.options = htonl (plugin->myoptions);
1470 t4.ipv4_addr = ((struct sockaddr_in *) addr)->sin_addr.s_addr;
1471 t4.t4_port = ((struct sockaddr_in *) addr)->sin_port;
1472 arg = &t4;
1473 args = sizeof (t4);
1474 break;
1475 case AF_INET6:
1476 GNUNET_assert(addrlen == sizeof(struct sockaddr_in6));
1477 memset (&t6, 0, sizeof(t6));
1478 GNUNET_memcpy (&t6.ipv6_addr,
1479 &((struct sockaddr_in6 *) addr)->sin6_addr,
1480 sizeof(struct in6_addr));
1481 t6.options = htonl (plugin->myoptions);
1482 t6.t6_port = ((struct sockaddr_in6 *) addr)->sin6_port;
1483 arg = &t6;
1484 args = sizeof (t6);
1485 break;
1486 default:
1487 GNUNET_break(0);
1488 return;
1489 }
1490 /* modify our published address list */
1491 GNUNET_assert ((args == sizeof (struct IPv4TcpAddress)) ||
1492 (args == sizeof (struct IPv6TcpAddress)));
1493 /* TODO: use 'ac' here in the future... */
1494 address = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
1495 PLUGIN_NAME,
1496 arg,
1497 args,
1498 GNUNET_HELLO_ADDRESS_INFO_NONE);
1499 plugin->env->notify_address (plugin->env->cls,
1500 add_remove,
1501 address);
1502 GNUNET_HELLO_address_free (address);
1503}
1504
1505
1506/**
1507 * Function called for a quick conversion of the binary address to
1508 * a numeric address. Note that the caller must not free the
1509 * address and that the next call to this function is allowed
1510 * to override the address again.
1511 *
1512 * @param cls closure (`struct Plugin*`)
1513 * @param addr binary address
1514 * @param addrlen length of @a addr
1515 * @return string representing the same address
1516 */
1517static const char *
1518tcp_plugin_address_to_string (void *cls,
1519 const void *addr,
1520 size_t addrlen)
1521{
1522 static char rbuf[INET6_ADDRSTRLEN + 12];
1523 char buf[INET6_ADDRSTRLEN];
1524 const void *sb;
1525 struct in_addr a4;
1526 struct in6_addr a6;
1527 const struct IPv4TcpAddress *t4;
1528 const struct IPv6TcpAddress *t6;
1529 int af;
1530 uint16_t port;
1531 uint32_t options;
1532
1533 switch (addrlen)
1534 {
1535 case sizeof(struct IPv6TcpAddress):
1536 t6 = addr;
1537 af = AF_INET6;
1538 port = ntohs (t6->t6_port);
1539 options = ntohl (t6->options);
1540 GNUNET_memcpy (&a6, &t6->ipv6_addr, sizeof(a6));
1541 sb = &a6;
1542 break;
1543 case sizeof(struct IPv4TcpAddress):
1544 t4 = addr;
1545 af = AF_INET;
1546 port = ntohs (t4->t4_port);
1547 options = ntohl (t4->options);
1548 GNUNET_memcpy (&a4, &t4->ipv4_addr, sizeof(a4));
1549 sb = &a4;
1550 break;
1551 default:
1552 LOG (GNUNET_ERROR_TYPE_WARNING,
1553 _("Unexpected address length: %u bytes\n"),
1554 (unsigned int) addrlen);
1555 return NULL ;
1556 }
1557 if (NULL == inet_ntop (af, sb, buf, INET6_ADDRSTRLEN))
1558 {
1559 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
1560 "inet_ntop");
1561 return NULL ;
1562 }
1563 GNUNET_snprintf (rbuf, sizeof(rbuf),
1564 (af == AF_INET6) ? "%s.%u.[%s]:%u" : "%s.%u.%s:%u",
1565 PLUGIN_NAME,
1566 options,
1567 buf,
1568 port);
1569 return rbuf;
1570}
1571
1572
1573/**
1574 * Function called to convert a string address to
1575 * a binary address.
1576 *
1577 * @param cls closure (`struct Plugin*`)
1578 * @param addr string address
1579 * @param addrlen length of the address
1580 * @param buf location to store the buffer
1581 * @param added location to store the number of bytes in the buffer.
1582 * If the function returns #GNUNET_SYSERR, its contents are undefined.
1583 * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
1584 */
1585static int
1586tcp_plugin_string_to_address (void *cls,
1587 const char *addr,
1588 uint16_t addrlen,
1589 void **buf,
1590 size_t *added)
1591{
1592 struct sockaddr_storage socket_address;
1593 char *address;
1594 char *plugin;
1595 char *optionstr;
1596 uint32_t options;
1597
1598 /* Format tcp.options.address:port */
1599 address = NULL;
1600 plugin = NULL;
1601 optionstr = NULL;
1602 if ((NULL == addr) || (0 == addrlen))
1603 {
1604 GNUNET_break(0);
1605 return GNUNET_SYSERR;
1606 }
1607 if ('\0' != addr[addrlen - 1])
1608 {
1609 GNUNET_break(0);
1610 return GNUNET_SYSERR;
1611 }
1612 if (strlen (addr) != addrlen - 1)
1613 {
1614 GNUNET_break(0);
1615 return GNUNET_SYSERR;
1616 }
1617 plugin = GNUNET_strdup (addr);
1618 optionstr = strchr (plugin, '.');
1619 if (NULL == optionstr)
1620 {
1621 GNUNET_break(0);
1622 GNUNET_free(plugin);
1623 return GNUNET_SYSERR;
1624 }
1625 optionstr[0] = '\0';
1626 optionstr++;
1627 options = atol (optionstr);
1628 address = strchr (optionstr, '.');
1629 if (NULL == address)
1630 {
1631 GNUNET_break(0);
1632 GNUNET_free(plugin);
1633 return GNUNET_SYSERR;
1634 }
1635 address[0] = '\0';
1636 address++;
1637
1638 if (GNUNET_OK !=
1639 GNUNET_STRINGS_to_address_ip (address,
1640 strlen (address),
1641 &socket_address))
1642 {
1643 GNUNET_break(0);
1644 GNUNET_free(plugin);
1645 return GNUNET_SYSERR;
1646 }
1647
1648 GNUNET_free(plugin);
1649 switch (socket_address.ss_family)
1650 {
1651 case AF_INET:
1652 {
1653 struct IPv4TcpAddress *t4;
1654 struct sockaddr_in *in4 = (struct sockaddr_in *) &socket_address;
1655 t4 = GNUNET_new (struct IPv4TcpAddress);
1656 t4->options = htonl (options);
1657 t4->ipv4_addr = in4->sin_addr.s_addr;
1658 t4->t4_port = in4->sin_port;
1659 *buf = t4;
1660 *added = sizeof(struct IPv4TcpAddress);
1661 return GNUNET_OK;
1662 }
1663 case AF_INET6:
1664 {
1665 struct IPv6TcpAddress *t6;
1666 struct sockaddr_in6 *in6 = (struct sockaddr_in6 *) &socket_address;
1667 t6 = GNUNET_new (struct IPv6TcpAddress);
1668 t6->options = htonl (options);
1669 t6->ipv6_addr = in6->sin6_addr;
1670 t6->t6_port = in6->sin6_port;
1671 *buf = t6;
1672 *added = sizeof(struct IPv6TcpAddress);
1673 return GNUNET_OK;
1674 }
1675 default:
1676 return GNUNET_SYSERR;
1677 }
1678}
1679
1680
1681/**
1682 * Find the session handle for the given client.
1683 * Currently uses both the hashmap and the client
1684 * context, as the client context is new and the
1685 * logic still needs to be tested.
1686 *
1687 * @param plugin the plugin
1688 * @param client which client to find the session handle for
1689 * @return NULL if no matching session exists
1690 */
1691static struct GNUNET_ATS_Session *
1692lookup_session_by_client (struct Plugin *plugin,
1693 struct GNUNET_SERVER_Client *client)
1694{
1695 return GNUNET_SERVER_client_get_user_context (client,
1696 struct GNUNET_ATS_Session);
1697}
1698
1699
1700/**
1701 * Functions with this signature are called whenever we need
1702 * to close a session due to a disconnect or failure to
1703 * establish a connection.
1704 *
1705 * @param cls the `struct Plugin`
1706 * @param session session to close down
1707 * @return #GNUNET_OK on success
1708 */
1709static int
1710tcp_plugin_disconnect_session (void *cls,
1711 struct GNUNET_ATS_Session *session)
1712{
1713 struct Plugin *plugin = cls;
1714 struct PendingMessage *pm;
1715
1716 LOG (GNUNET_ERROR_TYPE_DEBUG,
1717 "Disconnecting session of peer `%s' address `%s'\n",
1718 GNUNET_i2s (&session->target),
1719 tcp_plugin_address_to_string (session->plugin,
1720 session->address->address,
1721 session->address->address_length));
1722
1723 if (NULL != session->timeout_task)
1724 {
1725 GNUNET_SCHEDULER_cancel (session->timeout_task);
1726 session->timeout_task = NULL;
1727 session->timeout = GNUNET_TIME_UNIT_ZERO_ABS;
1728 }
1729
1730 if (GNUNET_YES ==
1731 GNUNET_CONTAINER_multipeermap_remove (plugin->sessionmap,
1732 &session->target,
1733 session))
1734 {
1735 GNUNET_STATISTICS_update (session->plugin->env->stats,
1736 gettext_noop ("# TCP sessions active"),
1737 -1,
1738 GNUNET_NO);
1739 }
1740 else
1741 {
1742 GNUNET_assert (GNUNET_YES ==
1743 GNUNET_CONTAINER_multipeermap_remove (plugin->nat_wait_conns,
1744 &session->target,
1745 session));
1746 }
1747 if (NULL != session->client)
1748 GNUNET_SERVER_client_set_user_context (session->client,
1749 NULL);
1750
1751 /* clean up state */
1752 if (NULL != session->transmit_handle)
1753 {
1754 GNUNET_SERVER_notify_transmit_ready_cancel (session->transmit_handle);
1755 session->transmit_handle = NULL;
1756 }
1757 session->plugin->env->session_end (session->plugin->env->cls,
1758 session->address,
1759 session);
1760
1761 if (NULL != session->nat_connection_timeout)
1762 {
1763 GNUNET_SCHEDULER_cancel (session->nat_connection_timeout);
1764 session->nat_connection_timeout = NULL;
1765 }
1766
1767 while (NULL != (pm = session->pending_messages_head))
1768 {
1769 LOG (GNUNET_ERROR_TYPE_DEBUG,
1770 (NULL != pm->transmit_cont)
1771 ? "Could not deliver message to `%s' at %s.\n"
1772 : "Could not deliver message to `%s' at %s, notifying.\n",
1773 GNUNET_i2s (&session->target),
1774 tcp_plugin_address_to_string (session->plugin,
1775 session->address->address,
1776 session->address->address_length));
1777 GNUNET_STATISTICS_update (session->plugin->env->stats,
1778 gettext_noop ("# bytes currently in TCP buffers"),
1779 -(int64_t) pm->message_size, GNUNET_NO);
1780 GNUNET_STATISTICS_update (session->plugin->env->stats,
1781 gettext_noop ("# bytes discarded by TCP (disconnect)"),
1782 pm->message_size,
1783 GNUNET_NO);
1784 GNUNET_CONTAINER_DLL_remove (session->pending_messages_head,
1785 session->pending_messages_tail,
1786 pm);
1787 GNUNET_assert (0 < session->msgs_in_queue);
1788 session->msgs_in_queue--;
1789 GNUNET_assert (pm->message_size <= session->bytes_in_queue);
1790 session->bytes_in_queue -= pm->message_size;
1791 if (NULL != pm->transmit_cont)
1792 pm->transmit_cont (pm->transmit_cont_cls,
1793 &session->target,
1794 GNUNET_SYSERR,
1795 pm->message_size,
1796 0);
1797 GNUNET_free (pm);
1798 }
1799 GNUNET_assert (0 == session->msgs_in_queue);
1800 GNUNET_assert (0 == session->bytes_in_queue);
1801 notify_session_monitor (session->plugin,
1802 session,
1803 GNUNET_TRANSPORT_SS_DONE);
1804
1805 if (NULL != session->receive_delay_task)
1806 {
1807 GNUNET_SCHEDULER_cancel (session->receive_delay_task);
1808 session->receive_delay_task = NULL;
1809 }
1810 if (NULL != session->client)
1811 {
1812 GNUNET_SERVER_client_disconnect (session->client);
1813 session->client = NULL;
1814 }
1815 GNUNET_HELLO_address_free (session->address);
1816 GNUNET_assert (NULL == session->transmit_handle);
1817 GNUNET_free (session);
1818 return GNUNET_OK;
1819}
1820
1821
1822/**
1823 * Function that is called to get the keepalive factor.
1824 * #GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT is divided by this number to
1825 * calculate the interval between keepalive packets.
1826 *
1827 * @param cls closure with the `struct Plugin`
1828 * @return keepalive factor
1829 */
1830static unsigned int
1831tcp_plugin_query_keepalive_factor (void *cls)
1832{
1833 return 3;
1834}
1835
1836
1837/**
1838 * Session was idle for too long, so disconnect it
1839 *
1840 * @param cls the `struct GNUNET_ATS_Session` of the idle session
1841 */
1842static void
1843session_timeout (void *cls)
1844{
1845 struct GNUNET_ATS_Session *s = cls;
1846 struct GNUNET_TIME_Relative left;
1847
1848 s->timeout_task = NULL;
1849 left = GNUNET_TIME_absolute_get_remaining (s->timeout);
1850 if (0 != left.rel_value_us)
1851 {
1852 /* not actually our turn yet, but let's at least update
1853 the monitor, it may think we're about to die ... */
1854 notify_session_monitor (s->plugin,
1855 s,
1856 GNUNET_TRANSPORT_SS_UPDATE);
1857 s->timeout_task = GNUNET_SCHEDULER_add_delayed (left,
1858 &session_timeout,
1859 s);
1860 return;
1861 }
1862 LOG (GNUNET_ERROR_TYPE_DEBUG,
1863 "Session %p was idle for %s, disconnecting\n",
1864 s,
1865 GNUNET_STRINGS_relative_time_to_string (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
1866 GNUNET_YES));
1867 /* call session destroy function */
1868 tcp_plugin_disconnect_session (s->plugin,
1869 s);
1870}
1871
1872
1873/**
1874 * Increment session timeout due to activity.
1875 *
1876 * @param s session to increment timeout for
1877 */
1878static void
1879reschedule_session_timeout (struct GNUNET_ATS_Session *s)
1880{
1881 GNUNET_assert (NULL != s->timeout_task);
1882 s->timeout = GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
1883}
1884
1885
1886/**
1887 * Create a new session. Also queues a welcome message.
1888 *
1889 * @param plugin the plugin
1890 * @param address the address to create the session for
1891 * @param scope network scope the address is from
1892 * @param client client to use, reference counter must have already been increased
1893 * @param is_nat this a NAT session, we should wait for a client to
1894 * connect to us from an address, then assign that to
1895 * the session
1896 * @return new session object
1897 */
1898static struct GNUNET_ATS_Session *
1899create_session (struct Plugin *plugin,
1900 const struct GNUNET_HELLO_Address *address,
1901 enum GNUNET_NetworkType scope,
1902 struct GNUNET_SERVER_Client *client,
1903 int is_nat)
1904{
1905 struct GNUNET_ATS_Session *session;
1906 struct PendingMessage *pm;
1907
1908 if (GNUNET_YES != is_nat)
1909 GNUNET_assert (NULL != client);
1910 else
1911 GNUNET_assert (NULL == client);
1912
1913 LOG (GNUNET_ERROR_TYPE_DEBUG,
1914 "Creating new session for peer `%s' at address %s\n",
1915 GNUNET_i2s (&address->peer),
1916 tcp_plugin_address_to_string (plugin,
1917 address->address,
1918 address->address_length));
1919 session = GNUNET_new (struct GNUNET_ATS_Session);
1920 session->last_activity = GNUNET_TIME_absolute_get ();
1921 session->plugin = plugin;
1922 session->is_nat = is_nat;
1923 if (NULL != client)
1924 {
1925 session->client = client;
1926 GNUNET_SERVER_client_set_user_context (client,
1927 session);
1928 }
1929 session->address = GNUNET_HELLO_address_copy (address);
1930 session->target = address->peer;
1931 session->expecting_welcome = GNUNET_YES;
1932 session->scope = scope;
1933 pm = GNUNET_malloc (sizeof (struct PendingMessage) +
1934 sizeof (struct WelcomeMessage));
1935 pm->msg = (const char *) &pm[1];
1936 pm->message_size = sizeof(struct WelcomeMessage);
1937 GNUNET_memcpy (&pm[1],
1938 &plugin->my_welcome,
1939 sizeof(struct WelcomeMessage));
1940 pm->timeout = GNUNET_TIME_UNIT_FOREVER_ABS;
1941 GNUNET_STATISTICS_update (plugin->env->stats,
1942 gettext_noop ("# bytes currently in TCP buffers"),
1943 pm->message_size,
1944 GNUNET_NO);
1945 GNUNET_CONTAINER_DLL_insert (session->pending_messages_head,
1946 session->pending_messages_tail,
1947 pm);
1948 session->msgs_in_queue++;
1949 session->bytes_in_queue += pm->message_size;
1950 session->timeout = GNUNET_TIME_relative_to_absolute (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
1951 session->timeout_task = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
1952 &session_timeout,
1953 session);
1954 notify_session_monitor (session->plugin,
1955 session,
1956 GNUNET_TRANSPORT_SS_INIT);
1957 if (GNUNET_YES != is_nat)
1958 {
1959 GNUNET_STATISTICS_update (plugin->env->stats,
1960 gettext_noop ("# TCP sessions active"),
1961 1,
1962 GNUNET_NO);
1963 notify_session_monitor (session->plugin,
1964 session,
1965 GNUNET_TRANSPORT_SS_UP);
1966 }
1967 else
1968 {
1969 notify_session_monitor (session->plugin,
1970 session,
1971 GNUNET_TRANSPORT_SS_HANDSHAKE);
1972 }
1973 return session;
1974}
1975
1976
1977/**
1978 * If we have pending messages, ask the server to
1979 * transmit them (schedule the respective tasks, etc.)
1980 *
1981 * @param session for which session should we do this
1982 */
1983static void
1984process_pending_messages (struct GNUNET_ATS_Session *session);
1985
1986
1987/**
1988 * Function called to notify a client about the socket
1989 * being ready to queue more data. "buf" will be
1990 * NULL and "size" zero if the socket was closed for
1991 * writing in the meantime.
1992 *
1993 * @param cls closure
1994 * @param size number of bytes available in @a buf
1995 * @param buf where the callee should write the message
1996 * @return number of bytes written to @a buf
1997 */
1998static size_t
1999do_transmit (void *cls,
2000 size_t size,
2001 void *buf)
2002{
2003 struct GNUNET_ATS_Session *session = cls;
2004 struct GNUNET_PeerIdentity pid;
2005 struct Plugin *plugin;
2006 struct PendingMessage *pos;
2007 struct PendingMessage *hd;
2008 struct PendingMessage *tl;
2009 struct GNUNET_TIME_Absolute now;
2010 char *cbuf;
2011 size_t ret;
2012
2013 session->transmit_handle = NULL;
2014 plugin = session->plugin;
2015 if (NULL == buf)
2016 {
2017 LOG (GNUNET_ERROR_TYPE_DEBUG,
2018 "Timeout trying to transmit to peer `%s', discarding message queue.\n",
2019 GNUNET_i2s (&session->target));
2020 /* timeout; cancel all messages that have already expired */
2021 hd = NULL;
2022 tl = NULL;
2023 ret = 0;
2024 now = GNUNET_TIME_absolute_get ();
2025 while ( (NULL != (pos = session->pending_messages_head)) &&
2026 (pos->timeout.abs_value_us <= now.abs_value_us) )
2027 {
2028 GNUNET_CONTAINER_DLL_remove (session->pending_messages_head,
2029 session->pending_messages_tail,
2030 pos);
2031 GNUNET_assert (0 < session->msgs_in_queue);
2032 session->msgs_in_queue--;
2033 GNUNET_assert (pos->message_size <= session->bytes_in_queue);
2034 session->bytes_in_queue -= pos->message_size;
2035 LOG (GNUNET_ERROR_TYPE_DEBUG,
2036 "Failed to transmit %u byte message to `%s'.\n",
2037 pos->message_size,
2038 GNUNET_i2s (&session->target));
2039 ret += pos->message_size;
2040 GNUNET_CONTAINER_DLL_insert_after (hd,
2041 tl,
2042 tl,
2043 pos);
2044 }
2045 /* do this call before callbacks (so that if callbacks destroy
2046 * session, they have a chance to cancel actions done by this
2047 * call) */
2048 process_pending_messages (session);
2049 pid = session->target;
2050 /* no do callbacks and do not use session again since
2051 * the callbacks may abort the session */
2052 while (NULL != (pos = hd))
2053 {
2054 GNUNET_CONTAINER_DLL_remove (hd,
2055 tl,
2056 pos);
2057 if (NULL != pos->transmit_cont)
2058 pos->transmit_cont (pos->transmit_cont_cls,
2059 &pid,
2060 GNUNET_SYSERR,
2061 pos->message_size,
2062 0);
2063 GNUNET_free (pos);
2064 }
2065 GNUNET_STATISTICS_update (plugin->env->stats,
2066 gettext_noop ("# bytes currently in TCP buffers"), -(int64_t) ret,
2067 GNUNET_NO);
2068 GNUNET_STATISTICS_update (plugin->env->stats,
2069 gettext_noop ("# bytes discarded by TCP (timeout)"),
2070 ret,
2071 GNUNET_NO);
2072 if (0 < ret)
2073 notify_session_monitor (session->plugin,
2074 session,
2075 GNUNET_TRANSPORT_SS_UPDATE);
2076 return 0;
2077 }
2078 /* copy all pending messages that would fit */
2079 ret = 0;
2080 cbuf = buf;
2081 hd = NULL;
2082 tl = NULL;
2083 while (NULL != (pos = session->pending_messages_head))
2084 {
2085 if (ret + pos->message_size > size)
2086 break;
2087 GNUNET_CONTAINER_DLL_remove (session->pending_messages_head,
2088 session->pending_messages_tail,
2089 pos);
2090 GNUNET_assert (0 < session->msgs_in_queue);
2091 session->msgs_in_queue--;
2092 GNUNET_assert (pos->message_size <= session->bytes_in_queue);
2093 session->bytes_in_queue -= pos->message_size;
2094 GNUNET_assert(size >= pos->message_size);
2095 LOG (GNUNET_ERROR_TYPE_DEBUG,
2096 "Transmitting message of type %u size %u to peer %s at %s\n",
2097 ntohs (((struct GNUNET_MessageHeader *) pos->msg)->type),
2098 pos->message_size,
2099 GNUNET_i2s (&session->target),
2100 tcp_plugin_address_to_string (session->plugin,
2101 session->address->address,
2102 session->address->address_length));
2103 /* FIXME: this GNUNET_memcpy can be up to 7% of our total runtime */
2104 GNUNET_memcpy (cbuf,
2105 pos->msg,
2106 pos->message_size);
2107 cbuf += pos->message_size;
2108 ret += pos->message_size;
2109 size -= pos->message_size;
2110 GNUNET_CONTAINER_DLL_insert_tail (hd,
2111 tl,
2112 pos);
2113 }
2114 notify_session_monitor (session->plugin,
2115 session,
2116 GNUNET_TRANSPORT_SS_UPDATE);
2117 /* schedule 'continuation' before callbacks so that callbacks that
2118 * cancel everything don't cause us to use a session that no longer
2119 * exists... */
2120 process_pending_messages (session);
2121 session->last_activity = GNUNET_TIME_absolute_get ();
2122 pid = session->target;
2123 /* we'll now call callbacks that may cancel the session; hence
2124 * we should not use 'session' after this point */
2125 while (NULL != (pos = hd))
2126 {
2127 GNUNET_CONTAINER_DLL_remove (hd, tl, pos);
2128 if (NULL != pos->transmit_cont)
2129 pos->transmit_cont (pos->transmit_cont_cls,
2130 &pid,
2131 GNUNET_OK,
2132 pos->message_size,
2133 pos->message_size); /* FIXME: include TCP overhead */
2134 GNUNET_free (pos);
2135 }
2136 GNUNET_assert (NULL == hd);
2137 GNUNET_assert (NULL == tl);
2138 GNUNET_STATISTICS_update (plugin->env->stats,
2139 gettext_noop ("# bytes currently in TCP buffers"),
2140 - (int64_t) ret,
2141 GNUNET_NO);
2142 GNUNET_STATISTICS_update (plugin->env->stats,
2143 gettext_noop ("# bytes transmitted via TCP"),
2144 ret,
2145 GNUNET_NO);
2146 return ret;
2147}
2148
2149
2150/**
2151 * If we have pending messages, ask the server to
2152 * transmit them (schedule the respective tasks, etc.)
2153 *
2154 * @param session for which session should we do this
2155 */
2156static void
2157process_pending_messages (struct GNUNET_ATS_Session *session)
2158{
2159 struct PendingMessage *pm;
2160
2161 GNUNET_assert (NULL != session->client);
2162 if (NULL != session->transmit_handle)
2163 return;
2164 if (NULL == (pm = session->pending_messages_head))
2165 return;
2166
2167 session->transmit_handle
2168 = GNUNET_SERVER_notify_transmit_ready (session->client,
2169 pm->message_size,
2170 GNUNET_TIME_absolute_get_remaining (pm->timeout),
2171 &do_transmit,
2172 session);
2173}
2174
2175
2176/**
2177 * Function that can be used by the transport service to transmit
2178 * a message using the plugin. Note that in the case of a
2179 * peer disconnecting, the continuation MUST be called
2180 * prior to the disconnect notification itself. This function
2181 * will be called with this peer's HELLO message to initiate
2182 * a fresh connection to another peer.
2183 *
2184 * @param cls closure
2185 * @param session which session must be used
2186 * @param msgbuf the message to transmit
2187 * @param msgbuf_size number of bytes in @a msgbuf
2188 * @param priority how important is the message (most plugins will
2189 * ignore message priority and just FIFO)
2190 * @param to how long to wait at most for the transmission (does not
2191 * require plugins to discard the message after the timeout,
2192 * just advisory for the desired delay; most plugins will ignore
2193 * this as well)
2194 * @param cont continuation to call once the message has
2195 * been transmitted (or if the transport is ready
2196 * for the next transmission call; or if the
2197 * peer disconnected...); can be NULL
2198 * @param cont_cls closure for @a cont
2199 * @return number of bytes used (on the physical network, with overheads);
2200 * -1 on hard errors (i.e. address invalid); 0 is a legal value
2201 * and does NOT mean that the message was not transmitted (DV)
2202 */
2203static ssize_t
2204tcp_plugin_send (void *cls,
2205 struct GNUNET_ATS_Session *session,
2206 const char *msgbuf,
2207 size_t msgbuf_size,
2208 unsigned int priority,
2209 struct GNUNET_TIME_Relative to,
2210 GNUNET_TRANSPORT_TransmitContinuation cont,
2211 void *cont_cls)
2212{
2213 struct Plugin * plugin = cls;
2214 struct PendingMessage *pm;
2215
2216 /* create new message entry */
2217 pm = GNUNET_malloc (sizeof (struct PendingMessage) + msgbuf_size);
2218 pm->msg = (const char *) &pm[1];
2219 GNUNET_memcpy (&pm[1], msgbuf, msgbuf_size);
2220 pm->message_size = msgbuf_size;
2221 pm->timeout = GNUNET_TIME_relative_to_absolute (to);
2222 pm->transmit_cont = cont;
2223 pm->transmit_cont_cls = cont_cls;
2224
2225 LOG (GNUNET_ERROR_TYPE_DEBUG,
2226 "Asked to transmit %u bytes to `%s', added message to list.\n",
2227 msgbuf_size,
2228 GNUNET_i2s (&session->target));
2229
2230 if (GNUNET_YES ==
2231 GNUNET_CONTAINER_multipeermap_contains_value (plugin->sessionmap,
2232 &session->target,
2233 session))
2234 {
2235 GNUNET_assert (NULL != session->client);
2236 GNUNET_SERVER_client_set_timeout (session->client,
2237 GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
2238 GNUNET_STATISTICS_update (plugin->env->stats,
2239 gettext_noop ("# bytes currently in TCP buffers"),
2240 msgbuf_size,
2241 GNUNET_NO);
2242
2243 /* append pm to pending_messages list */
2244 GNUNET_CONTAINER_DLL_insert_tail (session->pending_messages_head,
2245 session->pending_messages_tail,
2246 pm);
2247 notify_session_monitor (session->plugin,
2248 session,
2249 GNUNET_TRANSPORT_SS_UPDATE);
2250 session->msgs_in_queue++;
2251 session->bytes_in_queue += pm->message_size;
2252 process_pending_messages (session);
2253 return msgbuf_size;
2254 }
2255 if (GNUNET_YES ==
2256 GNUNET_CONTAINER_multipeermap_contains_value (plugin->nat_wait_conns,
2257 &session->target,
2258 session))
2259 {
2260 LOG (GNUNET_ERROR_TYPE_DEBUG,
2261 "This NAT WAIT session for peer `%s' is not yet ready!\n",
2262 GNUNET_i2s (&session->target));
2263 GNUNET_STATISTICS_update (plugin->env->stats,
2264 gettext_noop ("# bytes currently in TCP buffers"), msgbuf_size,
2265 GNUNET_NO);
2266 /* append pm to pending_messages list */
2267 GNUNET_CONTAINER_DLL_insert_tail (session->pending_messages_head,
2268 session->pending_messages_tail,
2269 pm);
2270 session->msgs_in_queue++;
2271 session->bytes_in_queue += pm->message_size;
2272 notify_session_monitor (session->plugin,
2273 session,
2274 GNUNET_TRANSPORT_SS_HANDSHAKE);
2275 return msgbuf_size;
2276 }
2277 LOG (GNUNET_ERROR_TYPE_ERROR,
2278 "Invalid session %p\n",
2279 session);
2280 if (NULL != cont)
2281 cont (cont_cls,
2282 &session->target,
2283 GNUNET_SYSERR,
2284 pm->message_size,
2285 0);
2286 GNUNET_break (0);
2287 GNUNET_free (pm);
2288 return GNUNET_SYSERR; /* session does not exist here */
2289}
2290
2291
2292/**
2293 * Closure for #session_lookup_it().
2294 */
2295struct GNUNET_ATS_SessionItCtx
2296{
2297 /**
2298 * Address we are looking for.
2299 */
2300 const struct GNUNET_HELLO_Address *address;
2301
2302 /**
2303 * Where to store the session (if we found it).
2304 */
2305 struct GNUNET_ATS_Session *result;
2306
2307};
2308
2309
2310/**
2311 * Look for a session by address.
2312 *
2313 * @param cls the `struct GNUNET_ATS_SessionItCtx`
2314 * @param key unused
2315 * @param value a `struct GNUNET_ATS_Session`
2316 * @return #GNUNET_YES to continue looking, #GNUNET_NO if we found the session
2317 */
2318static int
2319session_lookup_it (void *cls,
2320 const struct GNUNET_PeerIdentity *key,
2321 void *value)
2322{
2323 struct GNUNET_ATS_SessionItCtx *si_ctx = cls;
2324 struct GNUNET_ATS_Session *session = value;
2325
2326 if (0 !=
2327 GNUNET_HELLO_address_cmp (si_ctx->address,
2328 session->address))
2329 return GNUNET_YES;
2330 si_ctx->result = session;
2331 return GNUNET_NO;
2332}
2333
2334
2335/**
2336 * Task cleaning up a NAT connection attempt after timeout
2337 *
2338 * @param cls the `struct GNUNET_ATS_Session`
2339 */
2340static void
2341nat_connect_timeout (void *cls)
2342{
2343 struct GNUNET_ATS_Session *session = cls;
2344
2345 session->nat_connection_timeout = NULL;
2346 LOG (GNUNET_ERROR_TYPE_DEBUG,
2347 "NAT WAIT connection to `%4s' at `%s' could not be established, removing session\n",
2348 GNUNET_i2s (&session->target),
2349 tcp_plugin_address_to_string (session->plugin,
2350 session->address->address,
2351 session->address->address_length));
2352 tcp_plugin_disconnect_session (session->plugin,
2353 session);
2354}
2355
2356
2357/**
2358 * Function that will be called whenever the transport service wants to
2359 * notify the plugin that a session is still active and in use and
2360 * therefore the session timeout for this session has to be updated
2361 *
2362 * @param cls closure
2363 * @param peer which peer was the session for
2364 * @param session which session is being updated
2365 */
2366static void
2367tcp_plugin_update_session_timeout (void *cls,
2368 const struct GNUNET_PeerIdentity *peer,
2369 struct GNUNET_ATS_Session *session)
2370{
2371 reschedule_session_timeout (session);
2372}
2373
2374
2375/**
2376 * Task to signal the server that we can continue
2377 * receiving from the TCP client now.
2378 *
2379 * @param cls the `struct GNUNET_ATS_Session *`
2380 */
2381static void
2382delayed_done (void *cls)
2383{
2384 struct GNUNET_ATS_Session *session = cls;
2385
2386 session->receive_delay_task = NULL;
2387 reschedule_session_timeout (session);
2388 GNUNET_SERVER_receive_done (session->client,
2389 GNUNET_OK);
2390}
2391
2392
2393/**
2394 * Function that will be called whenever the transport service wants to
2395 * notify the plugin that the inbound quota changed and that the plugin
2396 * should update it's delay for the next receive value
2397 *
2398 * @param cls closure
2399 * @param peer which peer was the session for
2400 * @param session which session is being updated
2401 * @param delay new delay to use for receiving
2402 */
2403static void
2404tcp_plugin_update_inbound_delay (void *cls,
2405 const struct GNUNET_PeerIdentity *peer,
2406 struct GNUNET_ATS_Session *session,
2407 struct GNUNET_TIME_Relative delay)
2408{
2409 if (NULL == session->receive_delay_task)
2410 return;
2411 LOG (GNUNET_ERROR_TYPE_DEBUG,
2412 "New inbound delay %s\n",
2413 GNUNET_STRINGS_relative_time_to_string (delay,
2414 GNUNET_NO));
2415 session->receive_delay = GNUNET_TIME_relative_to_absolute (delay);
2416 GNUNET_SCHEDULER_cancel (session->receive_delay_task);
2417 session->receive_delay_task = GNUNET_SCHEDULER_add_delayed (delay,
2418 &delayed_done,
2419 session);
2420}
2421
2422
2423/**
2424 * Create a new session to transmit data to the target
2425 * This session will used to send data to this peer and the plugin will
2426 * notify us by calling the env->session_end function
2427 *
2428 * @param cls closure
2429 * @param address the address to use
2430 * @return the session if the address is valid, NULL otherwise
2431 */
2432static struct GNUNET_ATS_Session *
2433tcp_plugin_get_session (void *cls,
2434 const struct GNUNET_HELLO_Address *address)
2435{
2436 struct Plugin *plugin = cls;
2437 struct GNUNET_ATS_Session *session = NULL;
2438 int af;
2439 const void *sb;
2440 size_t sbs;
2441 struct GNUNET_CONNECTION_Handle *sa;
2442 struct sockaddr_in a4;
2443 struct sockaddr_in6 a6;
2444 const struct IPv4TcpAddress *t4;
2445 const struct IPv6TcpAddress *t6;
2446 unsigned int options;
2447 enum GNUNET_NetworkType net_type;
2448 unsigned int is_natd = GNUNET_NO;
2449 size_t addrlen;
2450#ifdef TCP_STEALTH
2451 struct GNUNET_NETWORK_Handle *s;
2452#endif
2453
2454 addrlen = address->address_length;
2455 LOG (GNUNET_ERROR_TYPE_DEBUG,
2456 "Trying to get session for `%s' address of peer `%s'\n",
2457 tcp_plugin_address_to_string (plugin,
2458 address->address,
2459 address->address_length),
2460 GNUNET_i2s (&address->peer));
2461
2462 if (GNUNET_HELLO_address_check_option (address,
2463 GNUNET_HELLO_ADDRESS_INFO_INBOUND))
2464 {
2465 GNUNET_break (0);
2466 return NULL;
2467 }
2468
2469 /* look for existing session */
2470 if (GNUNET_YES ==
2471 GNUNET_CONTAINER_multipeermap_contains (plugin->sessionmap,
2472 &address->peer))
2473 {
2474 struct GNUNET_ATS_SessionItCtx si_ctx;
2475
2476 si_ctx.address = address;
2477 si_ctx.result = NULL;
2478 GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessionmap,
2479 &address->peer,
2480 &session_lookup_it,
2481 &si_ctx);
2482 if (NULL != si_ctx.result)
2483 {
2484 session = si_ctx.result;
2485 LOG (GNUNET_ERROR_TYPE_DEBUG,
2486 "Found existing session for `%s' address `%s'\n",
2487 GNUNET_i2s (&address->peer),
2488 tcp_plugin_address_to_string (plugin,
2489 address->address,
2490 address->address_length));
2491 return session;
2492 }
2493 /* This is a bit of a hack, limiting TCP to never allow more than
2494 one TCP connection to any given peer at the same time.
2495 Without this, peers sometimes disagree about which of the TCP
2496 connections they should use, causing one side to believe that
2497 they transmit successfully, while the other receives nothing. */
2498 return NULL; /* Refuse to have more than one TCP connection per
2499 peer pair at the same time. */
2500 }
2501
2502 if (addrlen == sizeof(struct IPv6TcpAddress))
2503 {
2504 GNUNET_assert (NULL != address->address); /* make static analysis happy */
2505 t6 = address->address;
2506 options = t6->options;
2507 af = AF_INET6;
2508 memset (&a6, 0, sizeof(a6));
2509#if HAVE_SOCKADDR_IN_SIN_LEN
2510 a6.sin6_len = sizeof (a6);
2511#endif
2512 a6.sin6_family = AF_INET6;
2513 a6.sin6_port = t6->t6_port;
2514 if (t6->t6_port == 0)
2515 is_natd = GNUNET_YES;
2516 GNUNET_memcpy (&a6.sin6_addr, &t6->ipv6_addr, sizeof(struct in6_addr));
2517 sb = &a6;
2518 sbs = sizeof(a6);
2519 }
2520 else if (addrlen == sizeof(struct IPv4TcpAddress))
2521 {
2522 GNUNET_assert(NULL != address->address); /* make static analysis happy */
2523 t4 = address->address;
2524 options = t4->options;
2525 af = AF_INET;
2526 memset (&a4, 0, sizeof(a4));
2527#if HAVE_SOCKADDR_IN_SIN_LEN
2528 a4.sin_len = sizeof (a4);
2529#endif
2530 a4.sin_family = AF_INET;
2531 a4.sin_port = t4->t4_port;
2532 if (t4->t4_port == 0)
2533 is_natd = GNUNET_YES;
2534 a4.sin_addr.s_addr = t4->ipv4_addr;
2535 sb = &a4;
2536 sbs = sizeof(a4);
2537 }
2538 else
2539 {
2540 GNUNET_STATISTICS_update (plugin->env->stats,
2541 gettext_noop ("# requests to create session with invalid address"),
2542 1,
2543 GNUNET_NO);
2544 return NULL;
2545 }
2546
2547 net_type = plugin->env->get_address_type (plugin->env->cls,
2548 sb,
2549 sbs);
2550 GNUNET_break (net_type != GNUNET_NT_UNSPECIFIED);
2551
2552 if ( (is_natd == GNUNET_YES) &&
2553 (addrlen == sizeof(struct IPv6TcpAddress)) )
2554 {
2555 /* NAT client only works with IPv4 addresses */
2556 return NULL;
2557 }
2558
2559 if (plugin->cur_connections >= plugin->max_connections)
2560 {
2561 /* saturated */
2562 return NULL;
2563 }
2564
2565 if ( (is_natd == GNUNET_YES) &&
2566 (GNUNET_YES ==
2567 GNUNET_CONTAINER_multipeermap_contains (plugin->nat_wait_conns,
2568 &address->peer)))
2569 {
2570 /* Only do one NAT punch attempt per peer identity */
2571 return NULL;
2572 }
2573
2574 if ( (is_natd == GNUNET_YES) &&
2575 (NULL != plugin->nat) &&
2576 (GNUNET_NO ==
2577 GNUNET_CONTAINER_multipeermap_contains (plugin->nat_wait_conns,
2578 &address->peer)))
2579 {
2580 struct sockaddr_in local_sa;
2581
2582 LOG (GNUNET_ERROR_TYPE_DEBUG,
2583 "Found valid IPv4 NAT address (creating session)!\n");
2584 session = create_session (plugin,
2585 address,
2586 net_type,
2587 NULL,
2588 GNUNET_YES);
2589 session->nat_connection_timeout = GNUNET_SCHEDULER_add_delayed (NAT_TIMEOUT,
2590 &nat_connect_timeout,
2591 session);
2592 GNUNET_assert (GNUNET_OK ==
2593 GNUNET_CONTAINER_multipeermap_put (plugin->nat_wait_conns,
2594 &session->target,
2595 session,
2596 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
2597
2598 LOG (GNUNET_ERROR_TYPE_DEBUG,
2599 "Created NAT WAIT connection to `%s' at `%s'\n",
2600 GNUNET_i2s (&session->target),
2601 GNUNET_a2s (sb, sbs));
2602 memset (&local_sa,
2603 0,
2604 sizeof (local_sa));
2605 local_sa.sin_family = AF_INET;
2606 local_sa.sin_port = htons (plugin->open_port);
2607 /* We leave sin_address at 0, let the kernel figure it out,
2608 even if our bind() is more specific. (May want to reconsider
2609 later.) */
2610 if (GNUNET_OK ==
2611 GNUNET_NAT_request_reversal (plugin->nat,
2612 &local_sa,
2613 &a4))
2614 return session;
2615 LOG (GNUNET_ERROR_TYPE_DEBUG,
2616 "Running NAT client for `%s' at `%s' failed\n",
2617 GNUNET_i2s (&session->target),
2618 GNUNET_a2s (sb, sbs));
2619 tcp_plugin_disconnect_session (plugin,
2620 session);
2621 return NULL;
2622 }
2623
2624 /* create new outbound session */
2625 if (0 != (options & TCP_OPTIONS_TCP_STEALTH))
2626 {
2627#ifdef TCP_STEALTH
2628 s = GNUNET_NETWORK_socket_create (af, SOCK_STREAM, 0);
2629 if (NULL == s)
2630 {
2631 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
2632 "socket");
2633 sa = NULL;
2634 }
2635 else
2636 {
2637 if ( (GNUNET_OK !=
2638 GNUNET_NETWORK_socket_setsockopt (s,
2639 IPPROTO_TCP,
2640 TCP_STEALTH,
2641 &session->target,
2642 sizeof (struct GNUNET_PeerIdentity))) ||
2643 (GNUNET_OK !=
2644 GNUNET_NETWORK_socket_setsockopt (s,
2645 IPPROTO_TCP,
2646 TCP_STEALTH_INTEGRITY,
2647 &plugin->my_welcome,
2648 sizeof (struct WelcomeMessage))) )
2649 {
2650 /* TCP STEALTH not supported by kernel */
2651 GNUNET_break (GNUNET_OK ==
2652 GNUNET_NETWORK_socket_close (s));
2653 sa = NULL;
2654 }
2655 else
2656 {
2657 sa = GNUNET_CONNECTION_connect_socket (s, sb, sbs);
2658 }
2659 }
2660#else
2661 sa = NULL;
2662#endif
2663 }
2664 else
2665 {
2666 sa = GNUNET_CONNECTION_create_from_sockaddr (af, sb, sbs);
2667 }
2668 if (NULL == sa)
2669 {
2670 LOG (GNUNET_ERROR_TYPE_DEBUG,
2671 "Failed to create connection to `%s' at `%s'\n",
2672 GNUNET_i2s (&address->peer),
2673 GNUNET_a2s (sb, sbs));
2674 return NULL;
2675 }
2676 LOG (GNUNET_ERROR_TYPE_DEBUG,
2677 "Asked to transmit to `%s', creating fresh session using address `%s'.\n",
2678 GNUNET_i2s (&address->peer),
2679 GNUNET_a2s (sb, sbs));
2680
2681 session = create_session (plugin,
2682 address,
2683 net_type,
2684 GNUNET_SERVER_connect_socket (plugin->server,
2685 sa),
2686 GNUNET_NO);
2687 (void) GNUNET_CONTAINER_multipeermap_put (plugin->sessionmap,
2688 &session->target,
2689 session,
2690 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
2691 /* Send TCP Welcome */
2692 process_pending_messages (session);
2693
2694 return session;
2695}
2696
2697
2698/**
2699 * We have been asked to destroy all connections to a particular peer.
2700 * This function is called on each applicable session and must tear it
2701 * down.
2702 *
2703 * @param cls the `struct Plugin *`
2704 * @param key the peer which the session belongs to (unused)
2705 * @param value the `struct GNUNET_ATS_Session`
2706 * @return #GNUNET_YES (continue to iterate)
2707 */
2708static int
2709session_disconnect_it (void *cls,
2710 const struct GNUNET_PeerIdentity *key,
2711 void *value)
2712{
2713 struct Plugin *plugin = cls;
2714 struct GNUNET_ATS_Session *session = value;
2715
2716 GNUNET_STATISTICS_update (session->plugin->env->stats,
2717 gettext_noop ("# transport-service disconnect requests for TCP"),
2718 1,
2719 GNUNET_NO);
2720 tcp_plugin_disconnect_session (plugin,
2721 session);
2722 return GNUNET_YES;
2723}
2724
2725
2726/**
2727 * Function that can be called to force a disconnect from the
2728 * specified neighbour. This should also cancel all previously
2729 * scheduled transmissions. Obviously the transmission may have been
2730 * partially completed already, which is OK. The plugin is supposed
2731 * to close the connection (if applicable) and no longer call the
2732 * transmit continuation(s).
2733 *
2734 * Finally, plugin MUST NOT call the services's receive function to
2735 * notify the service that the connection to the specified target was
2736 * closed after a getting this call.
2737 *
2738 * @param cls closure
2739 * @param target peer for which the last transmission is
2740 * to be cancelled
2741 */
2742static void
2743tcp_plugin_disconnect (void *cls,
2744 const struct GNUNET_PeerIdentity *target)
2745{
2746 struct Plugin *plugin = cls;
2747
2748 LOG (GNUNET_ERROR_TYPE_DEBUG,
2749 "Disconnecting peer `%s'\n",
2750 GNUNET_i2s (target));
2751 GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessionmap,
2752 target,
2753 &session_disconnect_it,
2754 plugin);
2755 GNUNET_CONTAINER_multipeermap_get_multiple (plugin->nat_wait_conns,
2756 target,
2757 &session_disconnect_it,
2758 plugin);
2759}
2760
2761
2762/**
2763 * We are processing an address pretty printing request and finished
2764 * the IP resolution (if applicable). Append our port and forward the
2765 * result. If called with @a hostname NULL, we are done and should
2766 * clean up the pretty printer (otherwise, there might be multiple
2767 * hostnames for the IP address and we might receive more).
2768 *
2769 * @param cls the `struct PrettyPrinterContext *`
2770 * @param hostname hostname part of the address
2771 */
2772static void
2773append_port (void *cls,
2774 const char *hostname)
2775{
2776 struct PrettyPrinterContext *ppc = cls;
2777 struct Plugin *plugin = ppc->plugin;
2778 char *ret;
2779
2780 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2781 "append_port called with hostname `%s'\n",
2782 hostname);
2783 if (NULL == hostname)
2784 {
2785 /* Final call, done */
2786 ppc->resolver_handle = NULL;
2787 GNUNET_CONTAINER_DLL_remove (plugin->ppc_dll_head,
2788 plugin->ppc_dll_tail,
2789 ppc);
2790 ppc->asc (ppc->asc_cls,
2791 NULL,
2792 GNUNET_OK);
2793 GNUNET_free (ppc);
2794 return;
2795 }
2796 if (GNUNET_YES == ppc->ipv6)
2797 GNUNET_asprintf (&ret,
2798 "%s.%u.[%s]:%d",
2799 PLUGIN_NAME,
2800 ppc->options,
2801 hostname,
2802 ppc->port);
2803 else
2804 GNUNET_asprintf (&ret,
2805 "%s.%u.%s:%d",
2806 PLUGIN_NAME,
2807 ppc->options,
2808 hostname,
2809 ppc->port);
2810 ppc->asc (ppc->asc_cls,
2811 ret,
2812 GNUNET_OK);
2813 GNUNET_free (ret);
2814}
2815
2816
2817/**
2818 * Convert the transports address to a nice, human-readable format.
2819 *
2820 * @param cls closure with the `struct Plugin`
2821 * @param type name of the transport that generated the address
2822 * @param addr one of the addresses of the host, NULL for the last address
2823 * the specific address format depends on the transport
2824 * @param addrlen length of the @a addr
2825 * @param numeric should (IP) addresses be displayed in numeric form?
2826 * @param timeout after how long should we give up?
2827 * @param asc function to call on each string
2828 * @param asc_cls closure for @a asc
2829 */
2830static void
2831tcp_plugin_address_pretty_printer (void *cls,
2832 const char *type,
2833 const void *addr,
2834 size_t addrlen,
2835 int numeric,
2836 struct GNUNET_TIME_Relative timeout,
2837 GNUNET_TRANSPORT_AddressStringCallback asc,
2838 void *asc_cls)
2839{
2840 struct Plugin *plugin = cls;
2841 struct PrettyPrinterContext *ppc;
2842 const void *sb;
2843 size_t sbs;
2844 struct sockaddr_in a4;
2845 struct sockaddr_in6 a6;
2846 const struct IPv4TcpAddress *t4;
2847 const struct IPv6TcpAddress *t6;
2848 uint16_t port;
2849 uint32_t options;
2850
2851 if (sizeof(struct IPv6TcpAddress) == addrlen)
2852 {
2853 t6 = addr;
2854 memset (&a6, 0, sizeof(a6));
2855 a6.sin6_family = AF_INET6;
2856 a6.sin6_port = t6->t6_port;
2857 GNUNET_memcpy (&a6.sin6_addr, &t6->ipv6_addr, sizeof(struct in6_addr));
2858 port = ntohs (t6->t6_port);
2859 options = ntohl (t6->options);
2860 sb = &a6;
2861 sbs = sizeof(a6);
2862 }
2863 else if (sizeof(struct IPv4TcpAddress) == addrlen)
2864 {
2865 t4 = addr;
2866 memset (&a4, 0, sizeof(a4));
2867 a4.sin_family = AF_INET;
2868 a4.sin_port = t4->t4_port;
2869 a4.sin_addr.s_addr = t4->ipv4_addr;
2870 port = ntohs (t4->t4_port);
2871 options = ntohl (t4->options);
2872 sb = &a4;
2873 sbs = sizeof(a4);
2874 }
2875 else
2876 {
2877 /* invalid address */
2878 LOG (GNUNET_ERROR_TYPE_WARNING,
2879 _("Unexpected address length: %u bytes\n"),
2880 (unsigned int) addrlen);
2881 asc (asc_cls, NULL, GNUNET_SYSERR);
2882 asc (asc_cls, NULL, GNUNET_OK);
2883 return;
2884 }
2885 ppc = GNUNET_new (struct PrettyPrinterContext);
2886 ppc->plugin = plugin;
2887 if (addrlen == sizeof(struct IPv6TcpAddress))
2888 ppc->ipv6 = GNUNET_YES;
2889 else
2890 ppc->ipv6 = GNUNET_NO;
2891 ppc->asc = asc;
2892 ppc->asc_cls = asc_cls;
2893 ppc->port = port;
2894 ppc->options = options;
2895 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2896 "Starting DNS reverse lookup\n");
2897 ppc->resolver_handle = GNUNET_RESOLVER_hostname_get (sb,
2898 sbs,
2899 ! numeric,
2900 timeout,
2901 &append_port,
2902 ppc);
2903 if (NULL == ppc->resolver_handle)
2904 {
2905 GNUNET_break (0);
2906 GNUNET_free (ppc);
2907 return;
2908 }
2909 GNUNET_CONTAINER_DLL_insert (plugin->ppc_dll_head,
2910 plugin->ppc_dll_tail,
2911 ppc);
2912}
2913
2914
2915/**
2916 * Function that will be called to check if a binary address for this
2917 * plugin is well-formed and corresponds to an address for THIS peer
2918 * (as per our configuration). Naturally, if absolutely necessary,
2919 * plugins can be a bit conservative in their answer, but in general
2920 * plugins should make sure that the address does not redirect
2921 * traffic to a 3rd party that might try to man-in-the-middle our
2922 * traffic.
2923 *
2924 * @param cls closure, our `struct Plugin *`
2925 * @param addr pointer to the address
2926 * @param addrlen length of @a addr
2927 * @return #GNUNET_OK if this is a plausible address for this peer
2928 * and transport, #GNUNET_SYSERR if not
2929 */
2930static int
2931tcp_plugin_check_address (void *cls,
2932 const void *addr,
2933 size_t addrlen)
2934{
2935 struct Plugin *plugin = cls;
2936 const struct IPv4TcpAddress *v4;
2937 const struct IPv6TcpAddress *v6;
2938
2939 if ( (addrlen != sizeof(struct IPv4TcpAddress)) &&
2940 (addrlen != sizeof(struct IPv6TcpAddress)) )
2941 {
2942 GNUNET_break_op (0);
2943 return GNUNET_SYSERR;
2944 }
2945
2946 if (addrlen == sizeof(struct IPv4TcpAddress))
2947 {
2948 struct sockaddr_in s4;
2949
2950 v4 = (const struct IPv4TcpAddress *) addr;
2951 if (0 != memcmp (&v4->options,
2952 &plugin->myoptions,
2953 sizeof(uint32_t)))
2954 {
2955 GNUNET_break (0);
2956 return GNUNET_SYSERR;
2957 }
2958 memset (&s4, 0, sizeof (s4));
2959 s4.sin_family = AF_INET;
2960#if HAVE_SOCKADDR_IN_SIN_LEN
2961 s4.sin_len = sizeof (s4);
2962#endif
2963 s4.sin_port = v4->t4_port;
2964 s4.sin_addr.s_addr = v4->ipv4_addr;
2965
2966 if (GNUNET_OK !=
2967 GNUNET_NAT_test_address (plugin->nat,
2968 &s4,
2969 sizeof (struct sockaddr_in)))
2970 return GNUNET_SYSERR;
2971 }
2972 else
2973 {
2974 struct sockaddr_in6 s6;
2975
2976 v6 = (const struct IPv6TcpAddress *) addr;
2977 if (IN6_IS_ADDR_LINKLOCAL (&v6->ipv6_addr))
2978 {
2979 GNUNET_break_op (0);
2980 return GNUNET_SYSERR;
2981 }
2982 if (0 != memcmp (&v6->options,
2983 &plugin->myoptions,
2984 sizeof (uint32_t)))
2985 {
2986 GNUNET_break (0);
2987 return GNUNET_SYSERR;
2988 }
2989 memset (&s6, 0, sizeof (s6));
2990 s6.sin6_family = AF_INET6;
2991#if HAVE_SOCKADDR_IN_SIN_LEN
2992 s6.sin6_len = sizeof (s6);
2993#endif
2994 s6.sin6_port = v6->t6_port;
2995 s6.sin6_addr = v6->ipv6_addr;
2996
2997 if (GNUNET_OK !=
2998 GNUNET_NAT_test_address (plugin->nat,
2999 &s6,
3000 sizeof(struct sockaddr_in6)))
3001 return GNUNET_SYSERR;
3002 }
3003 return GNUNET_OK;
3004}
3005
3006
3007/**
3008 * We've received a nat probe from this peer via TCP. Finish
3009 * creating the client session and resume sending of queued
3010 * messages.
3011 *
3012 * @param cls closure
3013 * @param client identification of the client
3014 * @param message the actual message
3015 */
3016static void
3017handle_tcp_nat_probe (void *cls,
3018 struct GNUNET_SERVER_Client *client,
3019 const struct GNUNET_MessageHeader *message)
3020{
3021 struct Plugin *plugin = cls;
3022 struct GNUNET_ATS_Session *session;
3023 const struct TCP_NAT_ProbeMessage *tcp_nat_probe;
3024 size_t alen;
3025 void *vaddr;
3026 struct IPv4TcpAddress *t4;
3027 struct IPv6TcpAddress *t6;
3028 const struct sockaddr_in *s4;
3029 const struct sockaddr_in6 *s6;
3030
3031 LOG (GNUNET_ERROR_TYPE_DEBUG,
3032 "Received NAT probe\n");
3033 /* We have received a TCP NAT probe, meaning we (hopefully) initiated
3034 * a connection to this peer by running gnunet-nat-client. This peer
3035 * received the punch message and now wants us to use the new connection
3036 * as the default for that peer. Do so and then send a WELCOME message
3037 * so we can really be connected!
3038 */
3039 if (ntohs (message->size) != sizeof(struct TCP_NAT_ProbeMessage))
3040 {
3041 GNUNET_break_op(0);
3042 GNUNET_SERVER_receive_done (client,
3043 GNUNET_SYSERR);
3044 return;
3045 }
3046
3047 tcp_nat_probe = (const struct TCP_NAT_ProbeMessage *) message;
3048 if (0 == memcmp (&tcp_nat_probe->clientIdentity, plugin->env->my_identity,
3049 sizeof(struct GNUNET_PeerIdentity)))
3050 {
3051 /* refuse connections from ourselves */
3052 GNUNET_SERVER_receive_done (client,
3053 GNUNET_SYSERR);
3054 return;
3055 }
3056
3057 session = GNUNET_CONTAINER_multipeermap_get (plugin->nat_wait_conns,
3058 &tcp_nat_probe->clientIdentity);
3059 if (NULL == session)
3060 {
3061 LOG (GNUNET_ERROR_TYPE_DEBUG,
3062 "Did NOT find session for NAT probe!\n");
3063 GNUNET_SERVER_receive_done (client,
3064 GNUNET_OK);
3065 return;
3066 }
3067 LOG (GNUNET_ERROR_TYPE_DEBUG,
3068 "Found session for NAT probe!\n");
3069
3070 if (NULL != session->nat_connection_timeout)
3071 {
3072 GNUNET_SCHEDULER_cancel (session->nat_connection_timeout);
3073 session->nat_connection_timeout = NULL;
3074 }
3075
3076 if (GNUNET_OK !=
3077 GNUNET_SERVER_client_get_address (client,
3078 &vaddr,
3079 &alen))
3080 {
3081 GNUNET_break(0);
3082 GNUNET_SERVER_receive_done (client,
3083 GNUNET_SYSERR);
3084 tcp_plugin_disconnect_session (plugin,
3085 session);
3086 return;
3087 }
3088 GNUNET_assert (GNUNET_YES ==
3089 GNUNET_CONTAINER_multipeermap_remove (plugin->nat_wait_conns,
3090 &tcp_nat_probe->clientIdentity,
3091 session));
3092 GNUNET_SERVER_client_set_user_context (client,
3093 session);
3094 (void) GNUNET_CONTAINER_multipeermap_put (plugin->sessionmap,
3095 &session->target,
3096 session,
3097 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
3098 session->last_activity = GNUNET_TIME_absolute_get ();
3099 LOG (GNUNET_ERROR_TYPE_DEBUG,
3100 "Found address `%s' for incoming connection\n",
3101 GNUNET_a2s (vaddr, alen));
3102 switch (((const struct sockaddr *) vaddr)->sa_family)
3103 {
3104 case AF_INET:
3105 s4 = vaddr;
3106 t4 = GNUNET_new (struct IPv4TcpAddress);
3107 t4->options = htonl (TCP_OPTIONS_NONE);
3108 t4->t4_port = s4->sin_port;
3109 t4->ipv4_addr = s4->sin_addr.s_addr;
3110 session->address = GNUNET_HELLO_address_allocate (&tcp_nat_probe->clientIdentity,
3111 PLUGIN_NAME,
3112 &t4,
3113 sizeof(struct IPv4TcpAddress),
3114 GNUNET_HELLO_ADDRESS_INFO_NONE);
3115 break;
3116 case AF_INET6:
3117 s6 = vaddr;
3118 t6 = GNUNET_new (struct IPv6TcpAddress);
3119 t6->options = htonl (TCP_OPTIONS_NONE);
3120 t6->t6_port = s6->sin6_port;
3121 GNUNET_memcpy (&t6->ipv6_addr, &s6->sin6_addr, sizeof(struct in6_addr));
3122 session->address = GNUNET_HELLO_address_allocate (&tcp_nat_probe->clientIdentity,
3123 PLUGIN_NAME,
3124 &t6,
3125 sizeof(struct IPv6TcpAddress),
3126 GNUNET_HELLO_ADDRESS_INFO_NONE);
3127 break;
3128 default:
3129 GNUNET_break_op(0);
3130 LOG(GNUNET_ERROR_TYPE_DEBUG,
3131 "Bad address for incoming connection!\n");
3132 GNUNET_free(vaddr);
3133 GNUNET_SERVER_receive_done (client,
3134 GNUNET_SYSERR);
3135 tcp_plugin_disconnect_session (plugin,
3136 session);
3137 return;
3138 }
3139 GNUNET_free (vaddr);
3140 GNUNET_break (NULL == session->client);
3141 session->client = client;
3142 GNUNET_STATISTICS_update (plugin->env->stats,
3143 gettext_noop ("# TCP sessions active"),
3144 1,
3145 GNUNET_NO);
3146 process_pending_messages (session);
3147 GNUNET_SERVER_receive_done (client,
3148 GNUNET_OK);
3149}
3150
3151
3152/**
3153 * We've received a welcome from this peer via TCP. Possibly create a
3154 * fresh client record and send back our welcome.
3155 *
3156 * @param cls closure
3157 * @param client identification of the client
3158 * @param message the actual message
3159 */
3160static void
3161handle_tcp_welcome (void *cls,
3162 struct GNUNET_SERVER_Client *client,
3163 const struct GNUNET_MessageHeader *message)
3164{
3165 struct Plugin *plugin = cls;
3166 const struct WelcomeMessage *wm = (const struct WelcomeMessage *) message;
3167 struct GNUNET_HELLO_Address *address;
3168 struct GNUNET_ATS_Session *session;
3169 size_t alen;
3170 void *vaddr;
3171 struct IPv4TcpAddress t4;
3172 struct IPv6TcpAddress t6;
3173 const struct sockaddr_in *s4;
3174 const struct sockaddr_in6 *s6;
3175
3176 if (0 == memcmp (&wm->clientIdentity,
3177 plugin->env->my_identity,
3178 sizeof(struct GNUNET_PeerIdentity)))
3179 {
3180 /* refuse connections from ourselves */
3181 if (GNUNET_OK ==
3182 GNUNET_SERVER_client_get_address (client,
3183 &vaddr,
3184 &alen))
3185 {
3186 LOG (GNUNET_ERROR_TYPE_INFO,
3187 "Received WELCOME message from my own identity `%s' on address `%s'\n",
3188 GNUNET_i2s (&wm->clientIdentity),
3189 GNUNET_a2s (vaddr, alen));
3190 GNUNET_free (vaddr);
3191 }
3192 GNUNET_SERVER_receive_done (client,
3193 GNUNET_SYSERR);
3194 return;
3195 }
3196
3197 if (GNUNET_OK ==
3198 GNUNET_SERVER_client_get_address (client,
3199 &vaddr,
3200 &alen))
3201 {
3202 LOG(GNUNET_ERROR_TYPE_DEBUG,
3203 "Received WELCOME message from `%s' on address `%s'\n",
3204 GNUNET_i2s (&wm->clientIdentity),
3205 GNUNET_a2s (vaddr, alen));
3206 GNUNET_free (vaddr);
3207 }
3208 GNUNET_STATISTICS_update (plugin->env->stats,
3209 gettext_noop ("# TCP WELCOME messages received"),
3210 1,
3211 GNUNET_NO);
3212 session = lookup_session_by_client (plugin,
3213 client);
3214 if (NULL != session)
3215 {
3216 if (GNUNET_OK ==
3217 GNUNET_SERVER_client_get_address (client,
3218 &vaddr,
3219 &alen))
3220 {
3221 LOG (GNUNET_ERROR_TYPE_DEBUG,
3222 "Found existing session %p for peer `%s'\n",
3223 session,
3224 GNUNET_a2s (vaddr, alen));
3225 GNUNET_free (vaddr);
3226 }
3227 }
3228 else
3229 {
3230 if (GNUNET_OK ==
3231 GNUNET_SERVER_client_get_address (client, &vaddr, &alen))
3232 {
3233 if (alen == sizeof(struct sockaddr_in))
3234 {
3235 s4 = vaddr;
3236 memset (&t4, '\0', sizeof (t4));
3237 t4.options = htonl (TCP_OPTIONS_NONE);
3238 t4.t4_port = s4->sin_port;
3239 t4.ipv4_addr = s4->sin_addr.s_addr;
3240 address = GNUNET_HELLO_address_allocate (&wm->clientIdentity,
3241 PLUGIN_NAME,
3242 &t4,
3243 sizeof(t4),
3244 GNUNET_HELLO_ADDRESS_INFO_INBOUND);
3245 }
3246 else if (alen == sizeof(struct sockaddr_in6))
3247 {
3248 s6 = vaddr;
3249 memset (&t6, '\0', sizeof (t6));
3250 t6.options = htonl (TCP_OPTIONS_NONE);
3251 t6.t6_port = s6->sin6_port;
3252 GNUNET_memcpy (&t6.ipv6_addr, &s6->sin6_addr, sizeof(struct in6_addr));
3253 address = GNUNET_HELLO_address_allocate (&wm->clientIdentity,
3254 PLUGIN_NAME,
3255 &t6,
3256 sizeof (t6),
3257 GNUNET_HELLO_ADDRESS_INFO_INBOUND);
3258 }
3259 else
3260 {
3261 GNUNET_break (0);
3262 GNUNET_free_non_null (vaddr);
3263 GNUNET_SERVER_receive_done (client,
3264 GNUNET_SYSERR);
3265 return;
3266 }
3267 session = create_session (plugin,
3268 address,
3269 plugin->env->get_address_type (plugin->env->cls,
3270 vaddr,
3271 alen),
3272 client,
3273 GNUNET_NO);
3274 GNUNET_break (GNUNET_NT_UNSPECIFIED != session->scope);
3275 GNUNET_HELLO_address_free (address);
3276 LOG (GNUNET_ERROR_TYPE_DEBUG,
3277 "Creating new%s session %p for peer `%s' client %p\n",
3278 GNUNET_HELLO_address_check_option (session->address,
3279 GNUNET_HELLO_ADDRESS_INFO_INBOUND)
3280 ? " inbound" : "",
3281 session,
3282 tcp_plugin_address_to_string (plugin,
3283 session->address->address,
3284 session->address->address_length),
3285 client);
3286 GNUNET_free (vaddr);
3287 (void) GNUNET_CONTAINER_multipeermap_put (plugin->sessionmap,
3288 &session->target,
3289 session,
3290 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
3291 /* Notify transport and ATS about new session */
3292 plugin->env->session_start (plugin->env->cls,
3293 session->address,
3294 session,
3295 session->scope);
3296 }
3297 else
3298 {
3299 LOG(GNUNET_ERROR_TYPE_DEBUG,
3300 "Did not obtain TCP socket address for incoming connection\n");
3301 GNUNET_break(0);
3302 GNUNET_SERVER_receive_done (client,
3303 GNUNET_SYSERR);
3304 return;
3305 }
3306 }
3307
3308 if (GNUNET_YES != session->expecting_welcome)
3309 {
3310 GNUNET_break_op (0);
3311 GNUNET_SERVER_receive_done (client,
3312 GNUNET_SYSERR);
3313 return;
3314 }
3315 session->last_activity = GNUNET_TIME_absolute_get ();
3316 session->expecting_welcome = GNUNET_NO;
3317
3318 process_pending_messages (session);
3319 GNUNET_SERVER_client_set_timeout (client,
3320 GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
3321 GNUNET_SERVER_receive_done (client,
3322 GNUNET_OK);
3323}
3324
3325
3326/**
3327 * We've received data for this peer via TCP. Unbox,
3328 * compute latency and forward.
3329 *
3330 * @param cls closure
3331 * @param client identification of the client
3332 * @param message the actual message
3333 */
3334static void
3335handle_tcp_data (void *cls,
3336 struct GNUNET_SERVER_Client *client,
3337 const struct GNUNET_MessageHeader *message)
3338{
3339 struct Plugin *plugin = cls;
3340 struct GNUNET_ATS_Session *session;
3341 struct GNUNET_TIME_Relative delay;
3342 uint16_t type;
3343
3344 type = ntohs (message->type);
3345 if ( (GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_WELCOME == type) ||
3346 (GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_NAT_PROBE == type) )
3347 {
3348 /* We don't want to propagate WELCOME and NAT Probe messages up! */
3349 GNUNET_SERVER_receive_done (client,
3350 GNUNET_OK);
3351 return;
3352 }
3353 session = lookup_session_by_client (plugin, client);
3354 if (NULL == session)
3355 {
3356 /* No inbound session found */
3357 void *vaddr = NULL;
3358 size_t alen;
3359
3360 GNUNET_assert (GNUNET_OK ==
3361 GNUNET_SERVER_client_get_address (client,
3362 &vaddr,
3363 &alen));
3364 LOG (GNUNET_ERROR_TYPE_ERROR,
3365 "Received unexpected %u bytes of type %u from `%s'\n",
3366 (unsigned int) ntohs (message->size),
3367 (unsigned int) ntohs (message->type),
3368 GNUNET_a2s (vaddr,
3369 alen));
3370 GNUNET_break_op(0);
3371 GNUNET_SERVER_receive_done (client,
3372 GNUNET_SYSERR);
3373 GNUNET_free_non_null (vaddr);
3374 return;
3375 }
3376 if (GNUNET_YES == session->expecting_welcome)
3377 {
3378 /* Session is expecting WELCOME message */
3379 void *vaddr = NULL;
3380 size_t alen;
3381
3382 GNUNET_SERVER_client_get_address (client,
3383 &vaddr,
3384 &alen);
3385 LOG (GNUNET_ERROR_TYPE_ERROR,
3386 "Received unexpected %u bytes of type %u from `%s'\n",
3387 (unsigned int) ntohs (message->size),
3388 (unsigned int) ntohs (message->type),
3389 GNUNET_a2s (vaddr, alen));
3390 GNUNET_break_op(0);
3391 GNUNET_SERVER_receive_done (client,
3392 GNUNET_SYSERR);
3393 GNUNET_free_non_null (vaddr);
3394 return;
3395 }
3396
3397 session->last_activity = GNUNET_TIME_absolute_get ();
3398 {
3399 void *vaddr = NULL;
3400 size_t alen;
3401
3402 GNUNET_SERVER_client_get_address (client,
3403 &vaddr,
3404 &alen);
3405 LOG (GNUNET_ERROR_TYPE_DEBUG,
3406 "Passing %u bytes of type %u from `%s' at %s to transport service.\n",
3407 (unsigned int) ntohs (message->size),
3408 (unsigned int) ntohs (message->type),
3409 GNUNET_i2s (&session->target),
3410 GNUNET_a2s (vaddr, alen));
3411 GNUNET_free_non_null (vaddr);
3412 }
3413
3414 GNUNET_STATISTICS_update (plugin->env->stats,
3415 gettext_noop ("# bytes received via TCP"),
3416 ntohs (message->size),
3417 GNUNET_NO);
3418
3419 GNUNET_assert (GNUNET_CONTAINER_multipeermap_contains_value (plugin->sessionmap,
3420 &session->target,
3421 session));
3422 delay = plugin->env->receive (plugin->env->cls,
3423 session->address,
3424 session,
3425 message);
3426 reschedule_session_timeout (session);
3427 if (0 == delay.rel_value_us)
3428 {
3429 GNUNET_SERVER_receive_done (client,
3430 GNUNET_OK);
3431 }
3432 else
3433 {
3434 LOG (GNUNET_ERROR_TYPE_DEBUG,
3435 "Throttling receiving from `%s' for %s\n",
3436 GNUNET_i2s (&session->target),
3437 GNUNET_STRINGS_relative_time_to_string (delay,
3438 GNUNET_YES));
3439 GNUNET_SERVER_disable_receive_done_warning (client);
3440 GNUNET_assert (NULL == session->receive_delay_task);
3441 session->receive_delay_task = GNUNET_SCHEDULER_add_delayed (delay,
3442 &delayed_done,
3443 session);
3444 }
3445}
3446
3447
3448/**
3449 * Function called whenever a peer is connected on the "SERVER" level.
3450 * Increments number of active connections and suspends server if we
3451 * have reached the limit.
3452 *
3453 * @param cls closure
3454 * @param client identification of the client
3455 */
3456static void
3457connect_notify (void *cls,
3458 struct GNUNET_SERVER_Client *client)
3459{
3460 struct Plugin *plugin = cls;
3461
3462 if (NULL == client)
3463 return;
3464 plugin->cur_connections++;
3465 GNUNET_STATISTICS_set (plugin->env->stats,
3466 gettext_noop ("# TCP server connections active"),
3467 plugin->cur_connections,
3468 GNUNET_NO);
3469 GNUNET_STATISTICS_update (plugin->env->stats,
3470 gettext_noop ("# TCP server connect events"),
3471 1,
3472 GNUNET_NO);
3473 if (plugin->cur_connections != plugin->max_connections)
3474 return;
3475 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
3476 _("TCP connection limit reached, suspending server\n"));
3477 GNUNET_STATISTICS_update (plugin->env->stats,
3478 gettext_noop ("# TCP service suspended"),
3479 1,
3480 GNUNET_NO);
3481 GNUNET_SERVER_suspend (plugin->server); /* Maximum number of connections rechead */
3482}
3483
3484
3485/**
3486 * Function called whenever a peer is disconnected on the "SERVER"
3487 * level. Cleans up the connection, decrements number of active
3488 * connections and if applicable resumes listening.
3489 *
3490 * @param cls closure
3491 * @param client identification of the client
3492 */
3493static void
3494disconnect_notify (void *cls,
3495 struct GNUNET_SERVER_Client *client)
3496{
3497 struct Plugin *plugin = cls;
3498 struct GNUNET_ATS_Session *session;
3499
3500 if (NULL == client)
3501 return;
3502 GNUNET_assert (plugin->cur_connections >= 1);
3503 plugin->cur_connections--;
3504 session = lookup_session_by_client (plugin,
3505 client);
3506 if (NULL == session)
3507 return; /* unknown, nothing to do */
3508 LOG (GNUNET_ERROR_TYPE_DEBUG,
3509 "Destroying session of `%s' with %s due to network-level disconnect.\n",
3510 GNUNET_i2s (&session->target),
3511 tcp_plugin_address_to_string (session->plugin,
3512 session->address->address,
3513 session->address->address_length));
3514
3515 if (plugin->cur_connections == plugin->max_connections)
3516 {
3517 GNUNET_STATISTICS_update (session->plugin->env->stats,
3518 gettext_noop ("# TCP service resumed"),
3519 1,
3520 GNUNET_NO);
3521 GNUNET_SERVER_resume (plugin->server); /* Resume server */
3522 }
3523 GNUNET_STATISTICS_set (plugin->env->stats,
3524 gettext_noop ("# TCP server connections active"),
3525 plugin->cur_connections,
3526 GNUNET_NO);
3527 GNUNET_STATISTICS_update (session->plugin->env->stats,
3528 gettext_noop ("# network-level TCP disconnect events"),
3529 1,
3530 GNUNET_NO);
3531 tcp_plugin_disconnect_session (plugin,
3532 session);
3533}
3534
3535
3536/**
3537 * We can now send a probe message, copy into buffer to really send.
3538 *
3539 * @param cls closure, a `struct TCPProbeContext`
3540 * @param size max size to copy
3541 * @param buf buffer to copy message to
3542 * @return number of bytes copied into @a buf
3543 */
3544static size_t
3545notify_send_probe (void *cls,
3546 size_t size,
3547 void *buf)
3548{
3549 struct TCPProbeContext *tcp_probe_ctx = cls;
3550 struct Plugin *plugin = tcp_probe_ctx->plugin;
3551 size_t ret;
3552
3553 tcp_probe_ctx->transmit_handle = NULL;
3554 GNUNET_CONTAINER_DLL_remove (plugin->probe_head,
3555 plugin->probe_tail,
3556 tcp_probe_ctx);
3557 if (NULL == buf)
3558 {
3559 GNUNET_CONNECTION_destroy (tcp_probe_ctx->sock);
3560 GNUNET_free(tcp_probe_ctx);
3561 return 0;
3562 }
3563 GNUNET_assert(size >= sizeof(tcp_probe_ctx->message));
3564 GNUNET_memcpy (buf,
3565 &tcp_probe_ctx->message,
3566 sizeof(tcp_probe_ctx->message));
3567 GNUNET_SERVER_connect_socket (tcp_probe_ctx->plugin->server,
3568 tcp_probe_ctx->sock);
3569 ret = sizeof(tcp_probe_ctx->message);
3570 GNUNET_free (tcp_probe_ctx);
3571 return ret;
3572}
3573
3574
3575/**
3576 * Function called by the NAT subsystem suggesting another peer wants
3577 * to connect to us via connection reversal. Try to connect back to the
3578 * given IP.
3579 *
3580 * @param cls closure
3581 * @param addr address to try
3582 * @param addrlen number of bytes in @a addr
3583 */
3584static void
3585try_connection_reversal (void *cls,
3586 const struct sockaddr *addr,
3587 socklen_t addrlen)
3588{
3589 struct Plugin *plugin = cls;
3590 struct GNUNET_CONNECTION_Handle *sock;
3591 struct TCPProbeContext *tcp_probe_ctx;
3592
3593 /**
3594 * We have received an ICMP response, ostensibly from a peer
3595 * that wants to connect to us! Send a message to establish a connection.
3596 */
3597 sock = GNUNET_CONNECTION_create_from_sockaddr (AF_INET,
3598 addr,
3599 addrlen);
3600 if (NULL == sock)
3601 {
3602 /* failed for some odd reason (out of sockets?); ignore attempt */
3603 return;
3604 }
3605
3606 tcp_probe_ctx = GNUNET_new (struct TCPProbeContext);
3607 tcp_probe_ctx->message.header.size
3608 = htons (sizeof (struct TCP_NAT_ProbeMessage));
3609 tcp_probe_ctx->message.header.type
3610 = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_NAT_PROBE);
3611 tcp_probe_ctx->message.clientIdentity
3612 = *plugin->env->my_identity;
3613 tcp_probe_ctx->plugin = plugin;
3614 tcp_probe_ctx->sock = sock;
3615 GNUNET_CONTAINER_DLL_insert (plugin->probe_head,
3616 plugin->probe_tail,
3617 tcp_probe_ctx);
3618 tcp_probe_ctx->transmit_handle
3619 = GNUNET_CONNECTION_notify_transmit_ready (sock,
3620 ntohs (tcp_probe_ctx->message.header.size),
3621 GNUNET_TIME_UNIT_FOREVER_REL,
3622 &notify_send_probe,
3623 tcp_probe_ctx);
3624}
3625
3626
3627/**
3628 * Function obtain the network type for a session
3629 *
3630 * @param cls closure (`struct Plugin *`)
3631 * @param session the session
3632 * @return the network type in HBO or #GNUNET_SYSERR
3633 */
3634static enum GNUNET_NetworkType
3635tcp_plugin_get_network (void *cls,
3636 struct GNUNET_ATS_Session *session)
3637{
3638 return session->scope;
3639}
3640
3641
3642/**
3643 * Function obtain the network type for an address.
3644 *
3645 * @param cls closure (`struct Plugin *`)
3646 * @param address the address
3647 * @return the network type
3648 */
3649static enum GNUNET_NetworkType
3650tcp_plugin_get_network_for_address (void *cls,
3651 const struct GNUNET_HELLO_Address *address)
3652{
3653 struct Plugin *plugin = cls;
3654 size_t addrlen;
3655 struct sockaddr_in a4;
3656 struct sockaddr_in6 a6;
3657 const struct IPv4TcpAddress *t4;
3658 const struct IPv6TcpAddress *t6;
3659 const void *sb;
3660 size_t sbs;
3661
3662 addrlen = address->address_length;
3663 if (addrlen == sizeof(struct IPv6TcpAddress))
3664 {
3665 GNUNET_assert (NULL != address->address); /* make static analysis happy */
3666 t6 = address->address;
3667 memset (&a6, 0, sizeof(a6));
3668#if HAVE_SOCKADDR_IN_SIN_LEN
3669 a6.sin6_len = sizeof (a6);
3670#endif
3671 a6.sin6_family = AF_INET6;
3672 a6.sin6_port = t6->t6_port;
3673 GNUNET_memcpy (&a6.sin6_addr, &t6->ipv6_addr, sizeof(struct in6_addr));
3674 sb = &a6;
3675 sbs = sizeof(a6);
3676 }
3677 else if (addrlen == sizeof(struct IPv4TcpAddress))
3678 {
3679 GNUNET_assert (NULL != address->address); /* make static analysis happy */
3680 t4 = address->address;
3681 memset (&a4, 0, sizeof(a4));
3682#if HAVE_SOCKADDR_IN_SIN_LEN
3683 a4.sin_len = sizeof (a4);
3684#endif
3685 a4.sin_family = AF_INET;
3686 a4.sin_port = t4->t4_port;
3687 a4.sin_addr.s_addr = t4->ipv4_addr;
3688 sb = &a4;
3689 sbs = sizeof(a4);
3690 }
3691 else
3692 {
3693 GNUNET_break (0);
3694 return GNUNET_NT_UNSPECIFIED;
3695 }
3696 return plugin->env->get_address_type (plugin->env->cls,
3697 sb,
3698 sbs);
3699}
3700
3701
3702/**
3703 * Return information about the given session to the
3704 * monitor callback.
3705 *
3706 * @param cls the `struct Plugin` with the monitor callback (`sic`)
3707 * @param peer peer we send information about
3708 * @param value our `struct GNUNET_ATS_Session` to send information about
3709 * @return #GNUNET_OK (continue to iterate)
3710 */
3711static int
3712send_session_info_iter (void *cls,
3713 const struct GNUNET_PeerIdentity *peer,
3714 void *value)
3715{
3716 struct Plugin *plugin = cls;
3717 struct GNUNET_ATS_Session *session = value;
3718
3719 notify_session_monitor (plugin,
3720 session,
3721 GNUNET_TRANSPORT_SS_INIT);
3722 /* FIXME: cannot tell if this is up or not from current
3723 session state... */
3724 notify_session_monitor (plugin,
3725 session,
3726 GNUNET_TRANSPORT_SS_UP);
3727 return GNUNET_OK;
3728}
3729
3730
3731/**
3732 * Begin monitoring sessions of a plugin. There can only
3733 * be one active monitor per plugin (i.e. if there are
3734 * multiple monitors, the transport service needs to
3735 * multiplex the generated events over all of them).
3736 *
3737 * @param cls closure of the plugin
3738 * @param sic callback to invoke, NULL to disable monitor;
3739 * plugin will being by iterating over all active
3740 * sessions immediately and then enter monitor mode
3741 * @param sic_cls closure for @a sic
3742 */
3743static void
3744tcp_plugin_setup_monitor (void *cls,
3745 GNUNET_TRANSPORT_SessionInfoCallback sic,
3746 void *sic_cls)
3747{
3748 struct Plugin *plugin = cls;
3749
3750 plugin->sic = sic;
3751 plugin->sic_cls = sic_cls;
3752 if (NULL != sic)
3753 {
3754 GNUNET_CONTAINER_multipeermap_iterate (plugin->sessionmap,
3755 &send_session_info_iter,
3756 plugin);
3757 /* signal end of first iteration */
3758 sic (sic_cls, NULL, NULL);
3759 }
3760}
3761
3762
3763/**
3764 * Entry point for the plugin.
3765 *
3766 * @param cls closure, the `struct GNUNET_TRANSPORT_PluginEnvironment *`
3767 * @return the `struct GNUNET_TRANSPORT_PluginFunctions *` or NULL on error
3768 */
3769void *
3770libgnunet_plugin_transport_xt_init (void *cls)
3771{
3772 static const struct GNUNET_SERVER_MessageHandler my_handlers[] = {
3773 { &handle_tcp_welcome, NULL,
3774 GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_WELCOME,
3775 sizeof(struct WelcomeMessage) },
3776 { &handle_tcp_nat_probe, NULL,
3777 GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_NAT_PROBE,
3778 sizeof(struct TCP_NAT_ProbeMessage) },
3779 { &handle_tcp_data, NULL,
3780 GNUNET_MESSAGE_TYPE_ALL, 0 },
3781 { NULL, NULL, 0, 0 }
3782 };
3783 struct GNUNET_TRANSPORT_PluginEnvironment *env = cls;
3784 struct GNUNET_TRANSPORT_PluginFunctions *api;
3785 struct Plugin *plugin;
3786 struct LEGACY_SERVICE_Context *service;
3787 unsigned long long aport;
3788 unsigned long long bport;
3789 unsigned long long max_connections;
3790 unsigned int i;
3791 struct GNUNET_TIME_Relative idle_timeout;
3792#ifdef TCP_STEALTH
3793 struct GNUNET_NETWORK_Handle *const*lsocks;
3794#endif
3795 int ret;
3796 int ret_s;
3797 struct sockaddr **addrs;
3798 socklen_t *addrlens;
3799
3800 if (NULL == env->receive)
3801 {
3802 /* run in 'stub' mode (i.e. as part of gnunet-peerinfo), don't fully
3803 initialze the plugin or the API */
3804 api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
3805 api->cls = NULL;
3806 api->address_pretty_printer = &tcp_plugin_address_pretty_printer;
3807 api->address_to_string = &tcp_plugin_address_to_string;
3808 api->string_to_address = &tcp_plugin_string_to_address;
3809 return api;
3810 }
3811
3812 GNUNET_assert (NULL != env->cfg);
3813 if (GNUNET_OK !=
3814 GNUNET_CONFIGURATION_get_value_number (env->cfg,
3815 "transport-xt",
3816 "MAX_CONNECTIONS",
3817 &max_connections))
3818 max_connections = 128;
3819
3820 aport = 0;
3821 if ((GNUNET_OK !=
3822 GNUNET_CONFIGURATION_get_value_number (env->cfg,
3823 "transport-xt",
3824 "PORT", &bport)) ||
3825 (bport > 65535) ||
3826 ((GNUNET_OK ==
3827 GNUNET_CONFIGURATION_get_value_number (env->cfg,
3828 "transport-xt",
3829 "ADVERTISED-PORT", &aport)) &&
3830 (aport > 65535) ))
3831 {
3832 LOG(GNUNET_ERROR_TYPE_ERROR,
3833 _("Require valid port number for service `%s' in configuration!\n"),
3834 "transport-xt");
3835 return NULL ;
3836 }
3837 if (0 == aport)
3838 aport = bport;
3839 if (0 == bport)
3840 aport = 0;
3841 if (0 != bport)
3842 {
3843 service = LEGACY_SERVICE_start ("transport-xt",
3844 env->cfg,
3845 LEGACY_SERVICE_OPTION_NONE);
3846 if (NULL == service)
3847 {
3848 LOG (GNUNET_ERROR_TYPE_WARNING,
3849 _("Failed to start service.\n"));
3850 return NULL;
3851 }
3852 }
3853 else
3854 service = NULL;
3855
3856 api = NULL;
3857 plugin = GNUNET_new (struct Plugin);
3858 plugin->sessionmap = GNUNET_CONTAINER_multipeermap_create (max_connections,
3859 GNUNET_YES);
3860 plugin->max_connections = max_connections;
3861 plugin->open_port = bport;
3862 plugin->adv_port = aport;
3863 plugin->env = env;
3864 plugin->my_welcome.header.size = htons (sizeof(struct WelcomeMessage));
3865 plugin->my_welcome.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_WELCOME);
3866 plugin->my_welcome.clientIdentity = *plugin->env->my_identity;
3867
3868 if ( (NULL != service) &&
3869 (GNUNET_YES ==
3870 GNUNET_CONFIGURATION_get_value_yesno (env->cfg,
3871 "transport-xt",
3872 "TCP_STEALTH")) )
3873 {
3874#ifdef TCP_STEALTH
3875 plugin->myoptions |= TCP_OPTIONS_TCP_STEALTH;
3876 lsocks = LEGACY_SERVICE_get_listen_sockets (service);
3877 if (NULL != lsocks)
3878 {
3879 uint32_t len = sizeof (struct WelcomeMessage);
3880
3881 for (i=0;NULL!=lsocks[i];i++)
3882 {
3883 if ( (GNUNET_OK !=
3884 GNUNET_NETWORK_socket_setsockopt (lsocks[i],
3885 IPPROTO_TCP,
3886 TCP_STEALTH,
3887 env->my_identity,
3888 sizeof (struct GNUNET_PeerIdentity))) ||
3889 (GNUNET_OK !=
3890 GNUNET_NETWORK_socket_setsockopt (lsocks[i],
3891 IPPROTO_TCP,
3892 TCP_STEALTH_INTEGRITY_LEN,
3893 &len,
3894 sizeof (len))) )
3895 {
3896 /* TCP STEALTH not supported by kernel */
3897 GNUNET_assert (0 == i);
3898 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
3899 _("TCP_STEALTH not supported on this platform.\n"));
3900 goto die;
3901 }
3902 }
3903 }
3904#else
3905 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
3906 _("TCP_STEALTH not supported on this platform.\n"));
3907 goto die;
3908#endif
3909 }
3910
3911 if ( (NULL != service) &&
3912 (GNUNET_SYSERR !=
3913 (ret_s =
3914 get_server_addresses ("transport-xt",
3915 env->cfg,
3916 &addrs,
3917 &addrlens))))
3918 {
3919 for (ret = ret_s-1; ret >= 0; ret--)
3920 LOG (GNUNET_ERROR_TYPE_INFO,
3921 "Binding to address `%s'\n",
3922 GNUNET_a2s (addrs[ret], addrlens[ret]));
3923 plugin->nat
3924 = GNUNET_NAT_register (env->cfg,
3925 "transport-xt",
3926 IPPROTO_TCP,
3927 (unsigned int) ret_s,
3928 (const struct sockaddr **) addrs,
3929 addrlens,
3930 &tcp_nat_port_map_callback,
3931 &try_connection_reversal,
3932 plugin);
3933 for (ret = ret_s -1; ret >= 0; ret--)
3934 GNUNET_free (addrs[ret]);
3935 GNUNET_free_non_null (addrs);
3936 GNUNET_free_non_null (addrlens);
3937 }
3938 else
3939 {
3940 plugin->nat = GNUNET_NAT_register (plugin->env->cfg,
3941 "transport-xt",
3942 IPPROTO_TCP,
3943 0,
3944 NULL,
3945 NULL,
3946 NULL,
3947 &try_connection_reversal,
3948 plugin);
3949 }
3950 api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
3951 api->cls = plugin;
3952 api->send = &tcp_plugin_send;
3953 api->get_session = &tcp_plugin_get_session;
3954 api->disconnect_session = &tcp_plugin_disconnect_session;
3955 api->query_keepalive_factor = &tcp_plugin_query_keepalive_factor;
3956 api->disconnect_peer = &tcp_plugin_disconnect;
3957 api->address_pretty_printer = &tcp_plugin_address_pretty_printer;
3958 api->check_address = &tcp_plugin_check_address;
3959 api->address_to_string = &tcp_plugin_address_to_string;
3960 api->string_to_address = &tcp_plugin_string_to_address;
3961 api->get_network = &tcp_plugin_get_network;
3962 api->get_network_for_address = &tcp_plugin_get_network_for_address;
3963 api->update_session_timeout = &tcp_plugin_update_session_timeout;
3964 api->update_inbound_delay = &tcp_plugin_update_inbound_delay;
3965 api->setup_monitor = &tcp_plugin_setup_monitor;
3966 plugin->service = service;
3967 if (NULL != service)
3968 {
3969 plugin->server = LEGACY_SERVICE_get_server (service);
3970 }
3971 else
3972 {
3973 if (GNUNET_OK !=
3974 GNUNET_CONFIGURATION_get_value_time (env->cfg,
3975 "transport-xt",
3976 "TIMEOUT",
3977 &idle_timeout))
3978 {
3979 GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
3980 "transport-xt",
3981 "TIMEOUT");
3982 goto die;
3983 }
3984 plugin->server
3985 = GNUNET_SERVER_create_with_sockets (NULL,
3986 plugin,
3987 NULL,
3988 idle_timeout,
3989 GNUNET_YES);
3990 }
3991 plugin->handlers = GNUNET_malloc (sizeof (my_handlers));
3992 GNUNET_memcpy (plugin->handlers,
3993 my_handlers,
3994 sizeof(my_handlers));
3995 for (i = 0;i < sizeof(my_handlers) / sizeof(struct GNUNET_SERVER_MessageHandler);i++)
3996 plugin->handlers[i].callback_cls = plugin;
3997
3998 GNUNET_SERVER_add_handlers (plugin->server,
3999 plugin->handlers);
4000 GNUNET_SERVER_connect_notify (plugin->server,
4001 &connect_notify,
4002 plugin);
4003 GNUNET_SERVER_disconnect_notify (plugin->server,
4004 &disconnect_notify,
4005 plugin);
4006 plugin->nat_wait_conns = GNUNET_CONTAINER_multipeermap_create (16,
4007 GNUNET_YES);
4008 if (0 != bport)
4009 LOG (GNUNET_ERROR_TYPE_INFO,
4010 _("XT transport listening on port %llu\n"),
4011 bport);
4012 else
4013 LOG (GNUNET_ERROR_TYPE_INFO,
4014 _("XT transport not listening on any port (client only)\n"));
4015 if ( (aport != bport) &&
4016 (0 != bport) )
4017 LOG (GNUNET_ERROR_TYPE_INFO,
4018 _("XT transport advertises itself as being on port %llu\n"),
4019 aport);
4020 /* Initially set connections to 0 */
4021 GNUNET_STATISTICS_set (plugin->env->stats,
4022 gettext_noop ("# XT sessions active"),
4023 0,
4024 GNUNET_NO);
4025 return api;
4026
4027 die:
4028 if (NULL != plugin->nat)
4029 GNUNET_NAT_unregister (plugin->nat);
4030 GNUNET_CONTAINER_multipeermap_destroy (plugin->sessionmap);
4031 if (NULL != service)
4032 LEGACY_SERVICE_stop (service);
4033 GNUNET_free (plugin);
4034 GNUNET_free_non_null (api);
4035 return NULL;
4036}
4037
4038
4039/**
4040 * Exit point from the plugin.
4041 *
4042 * @param cls the `struct GNUNET_TRANSPORT_PluginFunctions`
4043 * @return NULL
4044 */
4045void *
4046libgnunet_plugin_transport_xt_done (void *cls)
4047{
4048 struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
4049 struct Plugin *plugin = api->cls;
4050 struct TCPProbeContext *tcp_probe;
4051 struct PrettyPrinterContext *cur;
4052 struct PrettyPrinterContext *next;
4053
4054 if (NULL == plugin)
4055 {
4056 GNUNET_free(api);
4057 return NULL ;
4058 }
4059 LOG (GNUNET_ERROR_TYPE_DEBUG,
4060 "Shutting down XT plugin\n");
4061
4062 /* Removing leftover sessions */
4063 GNUNET_CONTAINER_multipeermap_iterate (plugin->sessionmap,
4064 &session_disconnect_it,
4065 plugin);
4066 /* Removing leftover NAT sessions */
4067 GNUNET_CONTAINER_multipeermap_iterate (plugin->nat_wait_conns,
4068 &session_disconnect_it,
4069 plugin);
4070
4071 for (cur = plugin->ppc_dll_head; NULL != cur; cur = next)
4072 {
4073 next = cur->next;
4074 GNUNET_CONTAINER_DLL_remove (plugin->ppc_dll_head,
4075 plugin->ppc_dll_tail,
4076 cur);
4077 GNUNET_RESOLVER_request_cancel (cur->resolver_handle);
4078 cur->asc (cur->asc_cls,
4079 NULL,
4080 GNUNET_OK);
4081 GNUNET_free (cur);
4082 }
4083
4084 if (NULL != plugin->service)
4085 LEGACY_SERVICE_stop (plugin->service);
4086 else
4087 GNUNET_SERVER_destroy (plugin->server);
4088 GNUNET_free (plugin->handlers);
4089 if (NULL != plugin->nat)
4090 GNUNET_NAT_unregister (plugin->nat);
4091 while (NULL != (tcp_probe = plugin->probe_head))
4092 {
4093 GNUNET_CONTAINER_DLL_remove (plugin->probe_head,
4094 plugin->probe_tail,
4095 tcp_probe);
4096 GNUNET_CONNECTION_destroy (tcp_probe->sock);
4097 GNUNET_free (tcp_probe);
4098 }
4099 GNUNET_CONTAINER_multipeermap_destroy (plugin->nat_wait_conns);
4100 GNUNET_CONTAINER_multipeermap_destroy (plugin->sessionmap);
4101 GNUNET_break (0 == plugin->cur_connections);
4102 GNUNET_free (plugin);
4103 GNUNET_free (api);
4104 return NULL;
4105}
4106
4107/* end of plugin_transport_xt.c */
diff --git a/src/transport/plugin_transport_xu.c b/src/transport/plugin_transport_xu.c
deleted file mode 100644
index b716c6878..000000000
--- a/src/transport/plugin_transport_xu.c
+++ /dev/null
@@ -1,2492 +0,0 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2010-2017 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20
21/**
22 * @file transport/plugin_transport_xu.c
23 * @brief Implementation of the XU transport protocol
24 * @author Christian Grothoff
25 * @author Nathan Evans
26 * @author Matthias Wachs
27 */
28#include "platform.h"
29#include "plugin_transport_xu.h"
30#include "gnunet_hello_lib.h"
31#include "gnunet_util_lib.h"
32#include "gnunet_fragmentation_lib.h"
33#include "gnunet_nat_service.h"
34#include "gnunet_protocols.h"
35#include "gnunet_resolver_service.h"
36#include "gnunet_signatures.h"
37#include "gnunet_constants.h"
38#include "gnunet_statistics_service.h"
39#include "gnunet_transport_service.h"
40#include "gnunet_transport_plugin.h"
41#include "transport.h"
42
43#define LOG(kind,...) GNUNET_log_from (kind, "transport-xu", __VA_ARGS__)
44
45/**
46 * After how much inactivity should a XU session time out?
47 */
48#define XU_SESSION_TIME_OUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 60)
49
50
51/**
52 * XU Message-Packet header (after defragmentation).
53 */
54struct XUMessage
55{
56 /**
57 * Message header.
58 */
59 struct GNUNET_MessageHeader header;
60
61 /**
62 * Always zero for now.
63 */
64 uint32_t reserved;
65
66 /**
67 * What is the identity of the sender
68 */
69 struct GNUNET_PeerIdentity sender;
70
71};
72
73
74/**
75 * Closure for #append_port().
76 */
77struct PrettyPrinterContext
78{
79 /**
80 * DLL
81 */
82 struct PrettyPrinterContext *next;
83
84 /**
85 * DLL
86 */
87 struct PrettyPrinterContext *prev;
88
89 /**
90 * Our plugin.
91 */
92 struct Plugin *plugin;
93
94 /**
95 * Resolver handle
96 */
97 struct GNUNET_RESOLVER_RequestHandle *resolver_handle;
98
99 /**
100 * Function to call with the result.
101 */
102 GNUNET_TRANSPORT_AddressStringCallback asc;
103
104 /**
105 * Clsoure for @e asc.
106 */
107 void *asc_cls;
108
109 /**
110 * Timeout task
111 */
112 struct GNUNET_SCHEDULER_Task *timeout_task;
113
114 /**
115 * Is this an IPv6 address?
116 */
117 int ipv6;
118
119 /**
120 * Options
121 */
122 uint32_t options;
123
124 /**
125 * Port to add after the IP address.
126 */
127 uint16_t port;
128
129};
130
131
132/**
133 * Session with another peer.
134 */
135struct GNUNET_ATS_Session
136{
137 /**
138 * Which peer is this session for?
139 */
140 struct GNUNET_PeerIdentity target;
141
142 /**
143 * Tokenizer for inbound messages.
144 */
145 struct GNUNET_MessageStreamTokenizer *mst;
146
147 /**
148 * Plugin this session belongs to.
149 */
150 struct Plugin *plugin;
151
152 /**
153 * Session timeout task
154 */
155 struct GNUNET_SCHEDULER_Task *timeout_task;
156
157 /**
158 * When does this session time out?
159 */
160 struct GNUNET_TIME_Absolute timeout;
161
162 /**
163 * What time did we last transmit?
164 */
165 struct GNUNET_TIME_Absolute last_transmit_time;
166
167 /**
168 * expected delay for ACKs
169 */
170 struct GNUNET_TIME_Relative last_expected_ack_delay;
171
172 /**
173 * desired delay between XU messages
174 */
175 struct GNUNET_TIME_Relative last_expected_msg_delay;
176
177 /**
178 */
179 struct GNUNET_TIME_Relative flow_delay_for_other_peer;
180 struct GNUNET_TIME_Relative flow_delay_from_other_peer;
181
182 /**
183 * Our own address.
184 */
185 struct GNUNET_HELLO_Address *address;
186
187 /**
188 * Number of bytes waiting for transmission to this peer.
189 */
190 unsigned long long bytes_in_queue;
191
192 /**
193 * Number of messages waiting for transmission to this peer.
194 */
195 unsigned int msgs_in_queue;
196
197 /**
198 * Reference counter to indicate that this session is
199 * currently being used and must not be destroyed;
200 * setting @e in_destroy will destroy it as soon as
201 * possible.
202 */
203 unsigned int rc;
204
205 /**
206 * Network type of the address.
207 */
208 enum GNUNET_NetworkType scope;
209
210 /**
211 * Is this session about to be destroyed (sometimes we cannot
212 * destroy a session immediately as below us on the stack
213 * there might be code that still uses it; in this case,
214 * @e rc is non-zero).
215 */
216 int in_destroy;
217};
218
219
220
221/**
222 * If a session monitor is attached, notify it about the new
223 * session state.
224 *
225 * @param plugin our plugin
226 * @param session session that changed state
227 * @param state new state of the session
228 */
229static void
230notify_session_monitor (struct Plugin *plugin,
231 struct GNUNET_ATS_Session *session,
232 enum GNUNET_TRANSPORT_SessionState state)
233{
234 struct GNUNET_TRANSPORT_SessionInfo info;
235
236 if (NULL == plugin->sic)
237 return;
238 if (GNUNET_YES == session->in_destroy)
239 return; /* already destroyed, just RC>0 left-over actions */
240 memset (&info,
241 0,
242 sizeof (info));
243 info.state = state;
244 info.is_inbound = GNUNET_SYSERR; /* hard to say */
245 info.num_msg_pending = session->msgs_in_queue;
246 info.num_bytes_pending = session->bytes_in_queue;
247 /* info.receive_delay remains zero as this is not supported by XU
248 (cannot selectively not receive from 'some' peer while continuing
249 to receive from others) */
250 info.session_timeout = session->timeout;
251 info.address = session->address;
252 plugin->sic (plugin->sic_cls,
253 session,
254 &info);
255}
256
257
258/**
259 * Return information about the given session to the monitor callback.
260 *
261 * @param cls the `struct Plugin` with the monitor callback (`sic`)
262 * @param peer peer we send information about
263 * @param value our `struct GNUNET_ATS_Session` to send information about
264 * @return #GNUNET_OK (continue to iterate)
265 */
266static int
267send_session_info_iter (void *cls,
268 const struct GNUNET_PeerIdentity *peer,
269 void *value)
270{
271 struct Plugin *plugin = cls;
272 struct GNUNET_ATS_Session *session = value;
273
274 (void) peer;
275 notify_session_monitor (plugin,
276 session,
277 GNUNET_TRANSPORT_SS_INIT);
278 notify_session_monitor (plugin,
279 session,
280 GNUNET_TRANSPORT_SS_UP);
281 return GNUNET_OK;
282}
283
284
285/**
286 * Begin monitoring sessions of a plugin. There can only
287 * be one active monitor per plugin (i.e. if there are
288 * multiple monitors, the transport service needs to
289 * multiplex the generated events over all of them).
290 *
291 * @param cls closure of the plugin
292 * @param sic callback to invoke, NULL to disable monitor;
293 * plugin will being by iterating over all active
294 * sessions immediately and then enter monitor mode
295 * @param sic_cls closure for @a sic
296 */
297static void
298xu_plugin_setup_monitor (void *cls,
299 GNUNET_TRANSPORT_SessionInfoCallback sic,
300 void *sic_cls)
301{
302 struct Plugin *plugin = cls;
303
304 plugin->sic = sic;
305 plugin->sic_cls = sic_cls;
306 if (NULL != sic)
307 {
308 GNUNET_CONTAINER_multipeermap_iterate (plugin->sessions,
309 &send_session_info_iter,
310 plugin);
311 /* signal end of first iteration */
312 sic (sic_cls,
313 NULL,
314 NULL);
315 }
316}
317
318
319/* ****************** Little Helpers ****************** */
320
321
322/**
323 * Function to free last resources associated with a session.
324 *
325 * @param s session to free
326 */
327static void
328free_session (struct GNUNET_ATS_Session *s)
329{
330 if (NULL != s->address)
331 {
332 GNUNET_HELLO_address_free (s->address);
333 s->address = NULL;
334 }
335 if (NULL != s->mst)
336 {
337 GNUNET_MST_destroy (s->mst);
338 s->mst = NULL;
339 }
340 GNUNET_free (s);
341}
342
343
344/**
345 * Function that is called to get the keepalive factor.
346 * #GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT is divided by this number to
347 * calculate the interval between keepalive packets.
348 *
349 * @param cls closure with the `struct Plugin`
350 * @return keepalive factor
351 */
352static unsigned int
353xu_query_keepalive_factor (void *cls)
354{
355 (void) cls;
356 return 15;
357}
358
359
360/**
361 * Function obtain the network type for a session
362 *
363 * @param cls closure (`struct Plugin *`)
364 * @param session the session
365 * @return the network type
366 */
367static enum GNUNET_NetworkType
368xu_plugin_get_network (void *cls,
369 struct GNUNET_ATS_Session *session)
370{
371 (void) cls;
372 return session->scope;
373}
374
375
376/**
377 * Function obtain the network type for an address.
378 *
379 * @param cls closure (`struct Plugin *`)
380 * @param address the address
381 * @return the network type
382 */
383static enum GNUNET_NetworkType
384xu_plugin_get_network_for_address (void *cls,
385 const struct GNUNET_HELLO_Address *address)
386{
387 struct Plugin *plugin = cls;
388 size_t addrlen;
389 struct sockaddr_in a4;
390 struct sockaddr_in6 a6;
391 const struct IPv4XuAddress *u4;
392 const struct IPv6XuAddress *u6;
393 const void *sb;
394 size_t sbs;
395
396 addrlen = address->address_length;
397 if (addrlen == sizeof(struct IPv6XuAddress))
398 {
399 GNUNET_assert (NULL != address->address); /* make static analysis happy */
400 u6 = address->address;
401 memset (&a6, 0, sizeof(a6));
402#if HAVE_SOCKADDR_IN_SIN_LEN
403 a6.sin6_len = sizeof (a6);
404#endif
405 a6.sin6_family = AF_INET6;
406 a6.sin6_port = u6->u6_port;
407 GNUNET_memcpy (&a6.sin6_addr, &u6->ipv6_addr, sizeof(struct in6_addr));
408 sb = &a6;
409 sbs = sizeof(a6);
410 }
411 else if (addrlen == sizeof(struct IPv4XuAddress))
412 {
413 GNUNET_assert (NULL != address->address); /* make static analysis happy */
414 u4 = address->address;
415 memset (&a4, 0, sizeof(a4));
416#if HAVE_SOCKADDR_IN_SIN_LEN
417 a4.sin_len = sizeof (a4);
418#endif
419 a4.sin_family = AF_INET;
420 a4.sin_port = u4->u4_port;
421 a4.sin_addr.s_addr = u4->ipv4_addr;
422 sb = &a4;
423 sbs = sizeof(a4);
424 }
425 else
426 {
427 GNUNET_break (0);
428 return GNUNET_NT_UNSPECIFIED;
429 }
430 return plugin->env->get_address_type (plugin->env->cls,
431 sb,
432 sbs);
433}
434
435
436/* ******************* Event loop ******************** */
437
438/**
439 * We have been notified that our readset has something to read. We don't
440 * know which socket needs to be read, so we have to check each one
441 * Then reschedule this function to be called again once more is available.
442 *
443 * @param cls the plugin handle
444 */
445static void
446xu_plugin_select_v4 (void *cls);
447
448
449/**
450 * We have been notified that our readset has something to read. We don't
451 * know which socket needs to be read, so we have to check each one
452 * Then reschedule this function to be called again once more is available.
453 *
454 * @param cls the plugin handle
455 */
456static void
457xu_plugin_select_v6 (void *cls);
458
459
460/**
461 * (re)schedule IPv4-select tasks for this plugin.
462 *
463 * @param plugin plugin to reschedule
464 */
465static void
466schedule_select_v4 (struct Plugin *plugin)
467{
468 if ( (GNUNET_YES != plugin->enable_ipv4) ||
469 (NULL == plugin->sockv4) )
470 return;
471 if (NULL != plugin->select_task_v4)
472 GNUNET_SCHEDULER_cancel (plugin->select_task_v4);
473 plugin->select_task_v4
474 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
475 plugin->sockv4,
476 &xu_plugin_select_v4,
477 plugin);
478}
479
480
481/**
482 * (re)schedule IPv6-select tasks for this plugin.
483 *
484 * @param plugin plugin to reschedule
485 */
486static void
487schedule_select_v6 (struct Plugin *plugin)
488{
489 if ( (GNUNET_YES != plugin->enable_ipv6) ||
490 (NULL == plugin->sockv6) )
491 return;
492 if (NULL != plugin->select_task_v6)
493 GNUNET_SCHEDULER_cancel (plugin->select_task_v6);
494 plugin->select_task_v6
495 = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
496 plugin->sockv6,
497 &xu_plugin_select_v6,
498 plugin);
499}
500
501
502/* ******************* Address to string and back ***************** */
503
504
505/**
506 * Function called for a quick conversion of the binary address to
507 * a numeric address. Note that the caller must not free the
508 * address and that the next call to this function is allowed
509 * to override the address again.
510 *
511 * @param cls closure
512 * @param addr binary address (a `union XuAddress`)
513 * @param addrlen length of the @a addr
514 * @return string representing the same address
515 */
516const char *
517xu_address_to_string (void *cls,
518 const void *addr,
519 size_t addrlen)
520{
521 static char rbuf[INET6_ADDRSTRLEN + 10];
522 char buf[INET6_ADDRSTRLEN];
523 const void *sb;
524 struct in_addr a4;
525 struct in6_addr a6;
526 const struct IPv4XuAddress *t4;
527 const struct IPv6XuAddress *t6;
528 int af;
529 uint16_t port;
530 uint32_t options;
531
532 (void) cls;
533 if (NULL == addr)
534 {
535 GNUNET_break_op (0);
536 return NULL;
537 }
538
539 if (addrlen == sizeof(struct IPv6XuAddress))
540 {
541 t6 = addr;
542 af = AF_INET6;
543 options = ntohl (t6->options);
544 port = ntohs (t6->u6_port);
545 a6 = t6->ipv6_addr;
546 sb = &a6;
547 }
548 else if (addrlen == sizeof(struct IPv4XuAddress))
549 {
550 t4 = addr;
551 af = AF_INET;
552 options = ntohl (t4->options);
553 port = ntohs (t4->u4_port);
554 a4.s_addr = t4->ipv4_addr;
555 sb = &a4;
556 }
557 else
558 {
559 GNUNET_break_op (0);
560 return NULL;
561 }
562 inet_ntop (af,
563 sb,
564 buf,
565 INET6_ADDRSTRLEN);
566 GNUNET_snprintf (rbuf,
567 sizeof(rbuf),
568 (af == AF_INET6)
569 ? "%s.%u.[%s]:%u"
570 : "%s.%u.%s:%u",
571 PLUGIN_NAME,
572 options,
573 buf,
574 port);
575 return rbuf;
576}
577
578
579/**
580 * Function called to convert a string address to a binary address.
581 *
582 * @param cls closure (`struct Plugin *`)
583 * @param addr string address
584 * @param addrlen length of the address
585 * @param buf location to store the buffer
586 * @param added location to store the number of bytes in the buffer.
587 * If the function returns #GNUNET_SYSERR, its contents are undefined.
588 * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
589 */
590static int
591xu_string_to_address (void *cls,
592 const char *addr,
593 uint16_t addrlen,
594 void **buf,
595 size_t *added)
596{
597 struct sockaddr_storage socket_address;
598 char *address;
599 char *plugin;
600 char *optionstr;
601 uint32_t options;
602
603 (void) cls;
604 /* Format tcp.options.address:port */
605 address = NULL;
606 plugin = NULL;
607 optionstr = NULL;
608
609 if ((NULL == addr) || (0 == addrlen))
610 {
611 GNUNET_break (0);
612 return GNUNET_SYSERR;
613 }
614 if ('\0' != addr[addrlen - 1])
615 {
616 GNUNET_break (0);
617 return GNUNET_SYSERR;
618 }
619 if (strlen (addr) + 1 != (size_t) addrlen)
620 {
621 GNUNET_break (0);
622 return GNUNET_SYSERR;
623 }
624 plugin = GNUNET_strdup (addr);
625 optionstr = strchr (plugin, '.');
626 if (NULL == optionstr)
627 {
628 GNUNET_break (0);
629 GNUNET_free (plugin);
630 return GNUNET_SYSERR;
631 }
632 optionstr[0] = '\0';
633 optionstr++;
634 options = atol (optionstr);
635 address = strchr (optionstr, '.');
636 if (NULL == address)
637 {
638 GNUNET_break (0);
639 GNUNET_free (plugin);
640 return GNUNET_SYSERR;
641 }
642 address[0] = '\0';
643 address++;
644
645 if (GNUNET_OK !=
646 GNUNET_STRINGS_to_address_ip (address,
647 strlen (address),
648 &socket_address))
649 {
650 GNUNET_break (0);
651 GNUNET_free (plugin);
652 return GNUNET_SYSERR;
653 }
654 GNUNET_free(plugin);
655
656 switch (socket_address.ss_family)
657 {
658 case AF_INET:
659 {
660 struct IPv4XuAddress *u4;
661 const struct sockaddr_in *in4 = (const struct sockaddr_in *) &socket_address;
662
663 u4 = GNUNET_new (struct IPv4XuAddress);
664 u4->options = htonl (options);
665 u4->ipv4_addr = in4->sin_addr.s_addr;
666 u4->u4_port = in4->sin_port;
667 *buf = u4;
668 *added = sizeof (struct IPv4XuAddress);
669 return GNUNET_OK;
670 }
671 case AF_INET6:
672 {
673 struct IPv6XuAddress *u6;
674 const struct sockaddr_in6 *in6 = (const struct sockaddr_in6 *) &socket_address;
675
676 u6 = GNUNET_new (struct IPv6XuAddress);
677 u6->options = htonl (options);
678 u6->ipv6_addr = in6->sin6_addr;
679 u6->u6_port = in6->sin6_port;
680 *buf = u6;
681 *added = sizeof (struct IPv6XuAddress);
682 return GNUNET_OK;
683 }
684 default:
685 GNUNET_break (0);
686 return GNUNET_SYSERR;
687 }
688}
689
690
691/**
692 * Append our port and forward the result.
693 *
694 * @param cls a `struct PrettyPrinterContext *`
695 * @param hostname result from DNS resolver
696 */
697static void
698append_port (void *cls,
699 const char *hostname)
700{
701 struct PrettyPrinterContext *ppc = cls;
702 struct Plugin *plugin = ppc->plugin;
703 char *ret;
704
705 if (NULL == hostname)
706 {
707 /* Final call, done */
708 GNUNET_CONTAINER_DLL_remove (plugin->ppc_dll_head,
709 plugin->ppc_dll_tail,
710 ppc);
711 ppc->resolver_handle = NULL;
712 ppc->asc (ppc->asc_cls,
713 NULL,
714 GNUNET_OK);
715 GNUNET_free (ppc);
716 return;
717 }
718 if (GNUNET_YES == ppc->ipv6)
719 GNUNET_asprintf (&ret,
720 "%s.%u.[%s]:%d",
721 PLUGIN_NAME,
722 ppc->options,
723 hostname,
724 ppc->port);
725 else
726 GNUNET_asprintf (&ret,
727 "%s.%u.%s:%d",
728 PLUGIN_NAME,
729 ppc->options,
730 hostname,
731 ppc->port);
732 ppc->asc (ppc->asc_cls,
733 ret,
734 GNUNET_OK);
735 GNUNET_free (ret);
736}
737
738
739/**
740 * Convert the transports address to a nice, human-readable format.
741 *
742 * @param cls closure with the `struct Plugin *`
743 * @param type name of the transport that generated the address
744 * @param addr one of the addresses of the host, NULL for the last address
745 * the specific address format depends on the transport;
746 * a `union XuAddress`
747 * @param addrlen length of the address
748 * @param numeric should (IP) addresses be displayed in numeric form?
749 * @param timeout after how long should we give up?
750 * @param asc function to call on each string
751 * @param asc_cls closure for @a asc
752 */
753static void
754xu_plugin_address_pretty_printer (void *cls,
755 const char *type,
756 const void *addr,
757 size_t addrlen,
758 int numeric,
759 struct GNUNET_TIME_Relative timeout,
760 GNUNET_TRANSPORT_AddressStringCallback asc,
761 void *asc_cls)
762{
763 struct Plugin *plugin = cls;
764 struct PrettyPrinterContext *ppc;
765 const struct sockaddr *sb;
766 size_t sbs;
767 struct sockaddr_in a4;
768 struct sockaddr_in6 a6;
769 const struct IPv4XuAddress *u4;
770 const struct IPv6XuAddress *u6;
771 uint16_t port;
772 uint32_t options;
773
774 (void) type;
775 if (addrlen == sizeof(struct IPv6XuAddress))
776 {
777 u6 = addr;
778 memset (&a6,
779 0,
780 sizeof (a6));
781 a6.sin6_family = AF_INET6;
782#if HAVE_SOCKADDR_IN_SIN_LEN
783 a6.sin6_len = sizeof (a6);
784#endif
785 a6.sin6_port = u6->u6_port;
786 a6.sin6_addr = u6->ipv6_addr;
787 port = ntohs (u6->u6_port);
788 options = ntohl (u6->options);
789 sb = (const struct sockaddr *) &a6;
790 sbs = sizeof (a6);
791 }
792 else if (addrlen == sizeof (struct IPv4XuAddress))
793 {
794 u4 = addr;
795 memset (&a4,
796 0,
797 sizeof(a4));
798 a4.sin_family = AF_INET;
799#if HAVE_SOCKADDR_IN_SIN_LEN
800 a4.sin_len = sizeof (a4);
801#endif
802 a4.sin_port = u4->u4_port;
803 a4.sin_addr.s_addr = u4->ipv4_addr;
804 port = ntohs (u4->u4_port);
805 options = ntohl (u4->options);
806 sb = (const struct sockaddr *) &a4;
807 sbs = sizeof(a4);
808 }
809 else
810 {
811 /* invalid address */
812 GNUNET_break_op (0);
813 asc (asc_cls,
814 NULL,
815 GNUNET_SYSERR);
816 asc (asc_cls,
817 NULL,
818 GNUNET_OK);
819 return;
820 }
821 ppc = GNUNET_new (struct PrettyPrinterContext);
822 ppc->plugin = plugin;
823 ppc->asc = asc;
824 ppc->asc_cls = asc_cls;
825 ppc->port = port;
826 ppc->options = options;
827 if (addrlen == sizeof (struct IPv6XuAddress))
828 ppc->ipv6 = GNUNET_YES;
829 else
830 ppc->ipv6 = GNUNET_NO;
831 GNUNET_CONTAINER_DLL_insert (plugin->ppc_dll_head,
832 plugin->ppc_dll_tail,
833 ppc);
834 ppc->resolver_handle
835 = GNUNET_RESOLVER_hostname_get (sb,
836 sbs,
837 ! numeric,
838 timeout,
839 &append_port,
840 ppc);
841}
842
843
844/**
845 * Check if the given port is plausible (must be either our listen
846 * port or our advertised port). If it is neither, we return
847 * #GNUNET_SYSERR.
848 *
849 * @param plugin global variables
850 * @param in_port port number to check
851 * @return #GNUNET_OK if port is either our open or advertised port
852 */
853static int
854check_port (const struct Plugin *plugin,
855 uint16_t in_port)
856{
857 if ( (plugin->port == in_port) ||
858 (plugin->aport == in_port) )
859 return GNUNET_OK;
860 return GNUNET_SYSERR;
861}
862
863
864/**
865 * Function that will be called to check if a binary address for this
866 * plugin is well-formed and corresponds to an address for THIS peer
867 * (as per our configuration). Naturally, if absolutely necessary,
868 * plugins can be a bit conservative in their answer, but in general
869 * plugins should make sure that the address does not redirect
870 * traffic to a 3rd party that might try to man-in-the-middle our
871 * traffic.
872 *
873 * @param cls closure, should be our handle to the Plugin
874 * @param addr pointer to a `union XuAddress`
875 * @param addrlen length of @a addr
876 * @return #GNUNET_OK if this is a plausible address for this peer
877 * and transport, #GNUNET_SYSERR if not
878 */
879static int
880xu_plugin_check_address (void *cls,
881 const void *addr,
882 size_t addrlen)
883{
884 struct Plugin *plugin = cls;
885 const struct IPv4XuAddress *v4;
886 const struct IPv6XuAddress *v6;
887
888 if (sizeof(struct IPv4XuAddress) == addrlen)
889 {
890 struct sockaddr_in s4;
891
892 v4 = (const struct IPv4XuAddress *) addr;
893 if (GNUNET_OK != check_port (plugin,
894 ntohs (v4->u4_port)))
895 return GNUNET_SYSERR;
896 memset (&s4, 0, sizeof (s4));
897 s4.sin_family = AF_INET;
898#if HAVE_SOCKADDR_IN_SIN_LEN
899 s4.sin_len = sizeof (s4);
900#endif
901 s4.sin_port = v4->u4_port;
902 s4.sin_addr.s_addr = v4->ipv4_addr;
903
904 if (GNUNET_OK !=
905 GNUNET_NAT_test_address (plugin->nat,
906 &s4,
907 sizeof (struct sockaddr_in)))
908 return GNUNET_SYSERR;
909 }
910 else if (sizeof(struct IPv6XuAddress) == addrlen)
911 {
912 struct sockaddr_in6 s6;
913
914 v6 = (const struct IPv6XuAddress *) addr;
915 if (IN6_IS_ADDR_LINKLOCAL (&v6->ipv6_addr))
916 return GNUNET_OK; /* plausible, if unlikely... */
917 memset (&s6, 0, sizeof (s6));
918 s6.sin6_family = AF_INET6;
919#if HAVE_SOCKADDR_IN_SIN_LEN
920 s6.sin6_len = sizeof (s6);
921#endif
922 s6.sin6_port = v6->u6_port;
923 s6.sin6_addr = v6->ipv6_addr;
924
925 if (GNUNET_OK !=
926 GNUNET_NAT_test_address (plugin->nat,
927 &s6,
928 sizeof(struct sockaddr_in6)))
929 return GNUNET_SYSERR;
930 }
931 else
932 {
933 GNUNET_break_op (0);
934 return GNUNET_SYSERR;
935 }
936 return GNUNET_OK;
937}
938
939
940/**
941 * Our external IP address/port mapping has changed.
942 *
943 * @param cls closure, the `struct Plugin`
944 * @param add_remove #GNUNET_YES to mean the new public IP address,
945 * #GNUNET_NO to mean the previous (now invalid) one
946 * @param ac address class the address belongs to
947 * @param addr either the previous or the new public IP address
948 * @param addrlen actual length of the @a addr
949 */
950static void
951xu_nat_port_map_callback (void *cls,
952 int add_remove,
953 enum GNUNET_NAT_AddressClass ac,
954 const struct sockaddr *addr,
955 socklen_t addrlen)
956{
957 struct Plugin *plugin = cls;
958 struct GNUNET_HELLO_Address *address;
959 struct IPv4XuAddress u4;
960 struct IPv6XuAddress u6;
961 void *arg;
962 size_t args;
963
964 if (GNUNET_NAT_AC_LOOPBACK == ac)
965 return;
966 if (GNUNET_NAT_AC_LAN == ac)
967 return;
968 if (GNUNET_NAT_AC_LAN_PRIVATE == ac)
969 return;
970 LOG (GNUNET_ERROR_TYPE_DEBUG,
971 (GNUNET_YES == add_remove)
972 ? "NAT notification to add address `%s'\n"
973 : "NAT notification to remove address `%s'\n",
974 GNUNET_a2s (addr,
975 addrlen));
976 /* convert 'address' to our internal format */
977 switch (addr->sa_family)
978 {
979 case AF_INET:
980 {
981 const struct sockaddr_in *i4;
982
983 GNUNET_assert (sizeof(struct sockaddr_in) == addrlen);
984 i4 = (const struct sockaddr_in *) addr;
985 if (0 == ntohs (i4->sin_port))
986 return; /* Port = 0 means unmapped, ignore these for XU. */
987 memset (&u4,
988 0,
989 sizeof(u4));
990 u4.options = htonl (plugin->myoptions);
991 u4.ipv4_addr = i4->sin_addr.s_addr;
992 u4.u4_port = i4->sin_port;
993 arg = &u4;
994 args = sizeof (struct IPv4XuAddress);
995 break;
996 }
997 case AF_INET6:
998 {
999 const struct sockaddr_in6 *i6;
1000
1001 GNUNET_assert (sizeof(struct sockaddr_in6) == addrlen);
1002 i6 = (const struct sockaddr_in6 *) addr;
1003 if (0 == ntohs (i6->sin6_port))
1004 return; /* Port = 0 means unmapped, ignore these for XU. */
1005 memset (&u6,
1006 0,
1007 sizeof(u6));
1008 u6.options = htonl (plugin->myoptions);
1009 u6.ipv6_addr = i6->sin6_addr;
1010 u6.u6_port = i6->sin6_port;
1011 arg = &u6;
1012 args = sizeof (struct IPv6XuAddress);
1013 break;
1014 }
1015 default:
1016 GNUNET_break (0);
1017 return;
1018 }
1019 /* modify our published address list */
1020 /* TODO: use 'ac' here in the future... */
1021 address = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
1022 PLUGIN_NAME,
1023 arg,
1024 args,
1025 GNUNET_HELLO_ADDRESS_INFO_NONE);
1026 plugin->env->notify_address (plugin->env->cls,
1027 add_remove,
1028 address);
1029 GNUNET_HELLO_address_free (address);
1030}
1031
1032
1033/* ********************* Finding sessions ******************* */
1034
1035
1036/**
1037 * Closure for #session_cmp_it().
1038 */
1039struct GNUNET_ATS_SessionCompareContext
1040{
1041 /**
1042 * Set to session matching the address.
1043 */
1044 struct GNUNET_ATS_Session *res;
1045
1046 /**
1047 * Address we are looking for.
1048 */
1049 const struct GNUNET_HELLO_Address *address;
1050};
1051
1052
1053/**
1054 * Find a session with a matching address.
1055 *
1056 * @param cls the `struct GNUNET_ATS_SessionCompareContext *`
1057 * @param key peer identity (unused)
1058 * @param value the `struct GNUNET_ATS_Session *`
1059 * @return #GNUNET_NO if we found the session, #GNUNET_OK if not
1060 */
1061static int
1062session_cmp_it (void *cls,
1063 const struct GNUNET_PeerIdentity *key,
1064 void *value)
1065{
1066 struct GNUNET_ATS_SessionCompareContext *cctx = cls;
1067 struct GNUNET_ATS_Session *s = value;
1068
1069 (void) key;
1070 if (0 == GNUNET_HELLO_address_cmp (s->address,
1071 cctx->address))
1072 {
1073 GNUNET_assert (GNUNET_NO == s->in_destroy);
1074 cctx->res = s;
1075 return GNUNET_NO;
1076 }
1077 return GNUNET_OK;
1078}
1079
1080
1081/**
1082 * Locate an existing session the transport service is using to
1083 * send data to another peer. Performs some basic sanity checks
1084 * on the address and then tries to locate a matching session.
1085 *
1086 * @param cls the plugin
1087 * @param address the address we should locate the session by
1088 * @return the session if it exists, or NULL if it is not found
1089 */
1090static struct GNUNET_ATS_Session *
1091xu_plugin_lookup_session (void *cls,
1092 const struct GNUNET_HELLO_Address *address)
1093{
1094 struct Plugin *plugin = cls;
1095 const struct IPv6XuAddress *xu_a6;
1096 const struct IPv4XuAddress *xu_a4;
1097 struct GNUNET_ATS_SessionCompareContext cctx;
1098
1099 if (NULL == address->address)
1100 {
1101 GNUNET_break (0);
1102 return NULL;
1103 }
1104 if (sizeof(struct IPv4XuAddress) == address->address_length)
1105 {
1106 if (NULL == plugin->sockv4)
1107 return NULL;
1108 xu_a4 = (const struct IPv4XuAddress *) address->address;
1109 if (0 == xu_a4->u4_port)
1110 {
1111 GNUNET_break (0);
1112 return NULL;
1113 }
1114 }
1115 else if (sizeof(struct IPv6XuAddress) == address->address_length)
1116 {
1117 if (NULL == plugin->sockv6)
1118 return NULL;
1119 xu_a6 = (const struct IPv6XuAddress *) address->address;
1120 if (0 == xu_a6->u6_port)
1121 {
1122 GNUNET_break (0);
1123 return NULL;
1124 }
1125 }
1126 else
1127 {
1128 GNUNET_break (0);
1129 return NULL;
1130 }
1131
1132 /* check if session already exists */
1133 cctx.address = address;
1134 cctx.res = NULL;
1135 LOG (GNUNET_ERROR_TYPE_DEBUG,
1136 "Looking for existing session for peer `%s' with address `%s'\n",
1137 GNUNET_i2s (&address->peer),
1138 xu_address_to_string (plugin,
1139 address->address,
1140 address->address_length));
1141 GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessions,
1142 &address->peer,
1143 &session_cmp_it,
1144 &cctx);
1145 if (NULL == cctx.res)
1146 return NULL;
1147 LOG (GNUNET_ERROR_TYPE_DEBUG,
1148 "Found existing session %p\n",
1149 cctx.res);
1150 return cctx.res;
1151}
1152
1153
1154/* ********************** Timeout ****************** */
1155
1156
1157/**
1158 * Increment session timeout due to activity.
1159 *
1160 * @param s session to reschedule timeout activity for
1161 */
1162static void
1163reschedule_session_timeout (struct GNUNET_ATS_Session *s)
1164{
1165 if (GNUNET_YES == s->in_destroy)
1166 return;
1167 GNUNET_assert (NULL != s->timeout_task);
1168 s->timeout = GNUNET_TIME_relative_to_absolute (XU_SESSION_TIME_OUT);
1169}
1170
1171
1172
1173/**
1174 * Function that will be called whenever the transport service wants to
1175 * notify the plugin that a session is still active and in use and
1176 * therefore the session timeout for this session has to be updated
1177 *
1178 * @param cls closure with the `struct Plugin`
1179 * @param peer which peer was the session for
1180 * @param session which session is being updated
1181 */
1182static void
1183xu_plugin_update_session_timeout (void *cls,
1184 const struct GNUNET_PeerIdentity *peer,
1185 struct GNUNET_ATS_Session *session)
1186{
1187 struct Plugin *plugin = cls;
1188
1189 if (GNUNET_YES !=
1190 GNUNET_CONTAINER_multipeermap_contains_value (plugin->sessions,
1191 peer,
1192 session))
1193 {
1194 GNUNET_break (0);
1195 return;
1196 }
1197 /* Reschedule session timeout */
1198 reschedule_session_timeout (session);
1199}
1200
1201
1202/* ************************* Sending ************************ */
1203
1204
1205/**
1206 * We failed to transmit a message via XU. Generate
1207 * a descriptive error message.
1208 *
1209 * @param plugin our plugin
1210 * @param sa target address we were trying to reach
1211 * @param slen number of bytes in @a sa
1212 * @param error the errno value returned from the sendto() call
1213 */
1214static void
1215analyze_send_error (struct Plugin *plugin,
1216 const struct sockaddr *sa,
1217 socklen_t slen,
1218 int error)
1219{
1220 enum GNUNET_NetworkType type;
1221
1222 type = plugin->env->get_address_type (plugin->env->cls,
1223 sa,
1224 slen);
1225 if ( ( (GNUNET_NT_LAN == type) ||
1226 (GNUNET_NT_WAN == type) ) &&
1227 ( (ENETUNREACH == errno) ||
1228 (ENETDOWN == errno) ) )
1229 {
1230 if (slen == sizeof (struct sockaddr_in))
1231 {
1232 /* IPv4: "Network unreachable" or "Network down"
1233 *
1234 * This indicates we do not have connectivity
1235 */
1236 LOG (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
1237 _("XU could not transmit message to `%s': "
1238 "Network seems down, please check your network configuration\n"),
1239 GNUNET_a2s (sa,
1240 slen));
1241 }
1242 if (slen == sizeof (struct sockaddr_in6))
1243 {
1244 /* IPv6: "Network unreachable" or "Network down"
1245 *
1246 * This indicates that this system is IPv6 enabled, but does not
1247 * have a valid global IPv6 address assigned or we do not have
1248 * connectivity
1249 */
1250 LOG (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
1251 _("XU could not transmit IPv6 message! "
1252 "Please check your network configuration and disable IPv6 if your "
1253 "connection does not have a global IPv6 address\n"));
1254 }
1255 }
1256 else
1257 {
1258 LOG (GNUNET_ERROR_TYPE_WARNING,
1259 "XU could not transmit message to `%s': `%s'\n",
1260 GNUNET_a2s (sa,
1261 slen),
1262 STRERROR (error));
1263 }
1264}
1265
1266
1267
1268
1269/**
1270 * Function that can be used by the transport service to transmit a
1271 * message using the plugin. Note that in the case of a peer
1272 * disconnecting, the continuation MUST be called prior to the
1273 * disconnect notification itself. This function will be called with
1274 * this peer's HELLO message to initiate a fresh connection to another
1275 * peer.
1276 *
1277 * @param cls closure
1278 * @param s which session must be used
1279 * @param msgbuf the message to transmit
1280 * @param msgbuf_size number of bytes in @a msgbuf
1281 * @param priority how important is the message (most plugins will
1282 * ignore message priority and just FIFO)
1283 * @param to how long to wait at most for the transmission (does not
1284 * require plugins to discard the message after the timeout,
1285 * just advisory for the desired delay; most plugins will ignore
1286 * this as well)
1287 * @param cont continuation to call once the message has
1288 * been transmitted (or if the transport is ready
1289 * for the next transmission call; or if the
1290 * peer disconnected...); can be NULL
1291 * @param cont_cls closure for @a cont
1292 * @return number of bytes used (on the physical network, with overheads);
1293 * -1 on hard errors (i.e. address invalid); 0 is a legal value
1294 * and does NOT mean that the message was not transmitted (DV)
1295 */
1296static ssize_t
1297xu_plugin_send (void *cls,
1298 struct GNUNET_ATS_Session *s,
1299 const char *msgbuf,
1300 size_t msgbuf_size,
1301 unsigned int priority,
1302 struct GNUNET_TIME_Relative to,
1303 GNUNET_TRANSPORT_TransmitContinuation cont,
1304 void *cont_cls)
1305{
1306 struct Plugin *plugin = cls;
1307 size_t xumlen = msgbuf_size + sizeof(struct XUMessage);
1308 struct XUMessage *xu;
1309 char mbuf[xumlen] GNUNET_ALIGN;
1310 ssize_t sent;
1311 socklen_t slen;
1312 const struct sockaddr *a;
1313 const struct IPv4XuAddress *u4;
1314 struct sockaddr_in a4;
1315 const struct IPv6XuAddress *u6;
1316 struct sockaddr_in6 a6;
1317 struct GNUNET_NETWORK_Handle *sock;
1318
1319 (void) priority;
1320 (void) to;
1321 if ( (sizeof(struct IPv6XuAddress) == s->address->address_length) &&
1322 (NULL == plugin->sockv6) )
1323 return GNUNET_SYSERR;
1324 if ( (sizeof(struct IPv4XuAddress) == s->address->address_length) &&
1325 (NULL == plugin->sockv4) )
1326 return GNUNET_SYSERR;
1327 if (xumlen >= GNUNET_MAX_MESSAGE_SIZE)
1328 {
1329 GNUNET_break (0);
1330 return GNUNET_SYSERR;
1331 }
1332 if (GNUNET_YES !=
1333 GNUNET_CONTAINER_multipeermap_contains_value (plugin->sessions,
1334 &s->target,
1335 s))
1336 {
1337 GNUNET_break (0);
1338 return GNUNET_SYSERR;
1339 }
1340 LOG (GNUNET_ERROR_TYPE_DEBUG,
1341 "XU transmits %u-byte message to `%s' using address `%s'\n",
1342 xumlen,
1343 GNUNET_i2s (&s->target),
1344 xu_address_to_string (plugin,
1345 s->address->address,
1346 s->address->address_length));
1347 xu = (struct XUMessage *) mbuf;
1348 xu->header.size = htons (xumlen);
1349 xu->header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_XU_MESSAGE);
1350 xu->reserved = htonl (0);
1351 xu->sender = *plugin->env->my_identity;
1352 GNUNET_memcpy (&xu[1],
1353 msgbuf,
1354 msgbuf_size);
1355
1356 if (sizeof (struct IPv4XuAddress) == s->address->address_length)
1357 {
1358 u4 = s->address->address;
1359 memset (&a4,
1360 0,
1361 sizeof(a4));
1362 a4.sin_family = AF_INET;
1363#if HAVE_SOCKADDR_IN_SIN_LEN
1364 a4.sin_len = sizeof (a4);
1365#endif
1366 a4.sin_port = u4->u4_port;
1367 a4.sin_addr.s_addr = u4->ipv4_addr;
1368 a = (const struct sockaddr *) &a4;
1369 slen = sizeof (a4);
1370 sock = plugin->sockv4;
1371 }
1372 else if (sizeof (struct IPv6XuAddress) == s->address->address_length)
1373 {
1374 u6 = s->address->address;
1375 memset (&a6,
1376 0,
1377 sizeof(a6));
1378 a6.sin6_family = AF_INET6;
1379#if HAVE_SOCKADDR_IN_SIN_LEN
1380 a6.sin6_len = sizeof (a6);
1381#endif
1382 a6.sin6_port = u6->u6_port;
1383 a6.sin6_addr = u6->ipv6_addr;
1384 a = (const struct sockaddr *) &a6;
1385 slen = sizeof (a6);
1386 sock = plugin->sockv6;
1387 }
1388 else
1389 {
1390 GNUNET_break (0);
1391 return GNUNET_SYSERR;
1392 }
1393
1394 sent = GNUNET_NETWORK_socket_sendto (sock,
1395 mbuf,
1396 xumlen,
1397 a,
1398 slen);
1399 s->last_transmit_time
1400 = GNUNET_TIME_absolute_max (GNUNET_TIME_absolute_get (),
1401 s->last_transmit_time);
1402
1403 if (GNUNET_SYSERR == sent)
1404 {
1405 /* Failure */
1406 analyze_send_error (plugin,
1407 a,
1408 slen,
1409 errno);
1410 GNUNET_STATISTICS_update (plugin->env->stats,
1411 "# XU, total, bytes, sent, failure",
1412 sent,
1413 GNUNET_NO);
1414 GNUNET_STATISTICS_update (plugin->env->stats,
1415 "# XU, total, messages, sent, failure",
1416 1,
1417 GNUNET_NO);
1418 return GNUNET_SYSERR;
1419 }
1420 /* Success */
1421 LOG (GNUNET_ERROR_TYPE_DEBUG,
1422 "XU transmitted %u-byte message to `%s' `%s' (%d: %s)\n",
1423 (unsigned int) (msgbuf_size),
1424 GNUNET_i2s (&s->target),
1425 GNUNET_a2s (a,
1426 slen),
1427 (int ) sent,
1428 (sent < 0) ? STRERROR (errno) : "ok");
1429 GNUNET_STATISTICS_update (plugin->env->stats,
1430 "# XU, total, bytes, sent, success",
1431 sent,
1432 GNUNET_NO);
1433 GNUNET_STATISTICS_update (plugin->env->stats,
1434 "# XU, total, messages, sent, success",
1435 1,
1436 GNUNET_NO);
1437 cont (cont_cls,
1438 &s->target,
1439 GNUNET_OK,
1440 msgbuf_size,
1441 xumlen);
1442 notify_session_monitor (s->plugin,
1443 s,
1444 GNUNET_TRANSPORT_SS_UPDATE);
1445 return xumlen;
1446}
1447
1448
1449/* ********************** Receiving ********************** */
1450
1451
1452/**
1453 * Functions with this signature are called whenever we need to close
1454 * a session due to a disconnect or failure to establish a connection.
1455 *
1456 * @param cls closure with the `struct Plugin`
1457 * @param s session to close down
1458 * @return #GNUNET_OK on success
1459 */
1460static int
1461xu_disconnect_session (void *cls,
1462 struct GNUNET_ATS_Session *s)
1463{
1464 struct Plugin *plugin = cls;
1465
1466 GNUNET_assert (GNUNET_YES != s->in_destroy);
1467 LOG (GNUNET_ERROR_TYPE_DEBUG,
1468 "Session %p to peer `%s' at address %s ended\n",
1469 s,
1470 GNUNET_i2s (&s->target),
1471 xu_address_to_string (plugin,
1472 s->address->address,
1473 s->address->address_length));
1474 if (NULL != s->timeout_task)
1475 {
1476 GNUNET_SCHEDULER_cancel (s->timeout_task);
1477 s->timeout_task = NULL;
1478 }
1479 GNUNET_assert (GNUNET_YES ==
1480 GNUNET_CONTAINER_multipeermap_remove (plugin->sessions,
1481 &s->target,
1482 s));
1483 s->in_destroy = GNUNET_YES;
1484 notify_session_monitor (s->plugin,
1485 s,
1486 GNUNET_TRANSPORT_SS_DONE);
1487 plugin->env->session_end (plugin->env->cls,
1488 s->address,
1489 s);
1490 GNUNET_STATISTICS_set (plugin->env->stats,
1491 "# XU sessions active",
1492 GNUNET_CONTAINER_multipeermap_size (plugin->sessions),
1493 GNUNET_NO);
1494 if (0 == s->rc)
1495 free_session (s);
1496 return GNUNET_OK;
1497}
1498
1499
1500/**
1501 * Message tokenizer has broken up an incomming message. Pass it on
1502 * to the service.
1503 *
1504 * @param cls the `struct GNUNET_ATS_Session *`
1505 * @param hdr the actual message
1506 * @return #GNUNET_OK (always)
1507 */
1508static int
1509process_inbound_tokenized_messages (void *cls,
1510 const struct GNUNET_MessageHeader *hdr)
1511{
1512 struct GNUNET_ATS_Session *session = cls;
1513 struct Plugin *plugin = session->plugin;
1514
1515 if (GNUNET_YES == session->in_destroy)
1516 return GNUNET_OK;
1517 reschedule_session_timeout (session);
1518 session->flow_delay_for_other_peer
1519 = plugin->env->receive (plugin->env->cls,
1520 session->address,
1521 session,
1522 hdr);
1523 return GNUNET_OK;
1524}
1525
1526
1527/**
1528 * Destroy a session, plugin is being unloaded.
1529 *
1530 * @param cls the `struct Plugin`
1531 * @param key hash of public key of target peer
1532 * @param value a `struct PeerSession *` to clean up
1533 * @return #GNUNET_OK (continue to iterate)
1534 */
1535static int
1536disconnect_and_free_it (void *cls,
1537 const struct GNUNET_PeerIdentity *key,
1538 void *value)
1539{
1540 struct Plugin *plugin = cls;
1541
1542 (void) key;
1543 xu_disconnect_session (plugin,
1544 value);
1545 return GNUNET_OK;
1546}
1547
1548
1549/**
1550 * Disconnect from a remote node. Clean up session if we have one for
1551 * this peer.
1552 *
1553 * @param cls closure for this call (should be handle to Plugin)
1554 * @param target the peeridentity of the peer to disconnect
1555 * @return #GNUNET_OK on success, #GNUNET_SYSERR if the operation failed
1556 */
1557static void
1558xu_disconnect (void *cls,
1559 const struct GNUNET_PeerIdentity *target)
1560{
1561 struct Plugin *plugin = cls;
1562
1563 LOG (GNUNET_ERROR_TYPE_DEBUG,
1564 "Disconnecting from peer `%s'\n",
1565 GNUNET_i2s (target));
1566 GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessions,
1567 target,
1568 &disconnect_and_free_it,
1569 plugin);
1570}
1571
1572
1573/**
1574 * Session was idle, so disconnect it.
1575 *
1576 * @param cls the `struct GNUNET_ATS_Session` to time out
1577 */
1578static void
1579session_timeout (void *cls)
1580{
1581 struct GNUNET_ATS_Session *s = cls;
1582 struct Plugin *plugin = s->plugin;
1583 struct GNUNET_TIME_Relative left;
1584
1585 s->timeout_task = NULL;
1586 left = GNUNET_TIME_absolute_get_remaining (s->timeout);
1587 if (left.rel_value_us > 0)
1588 {
1589 /* not actually our turn yet, but let's at least update
1590 the monitor, it may think we're about to die ... */
1591 notify_session_monitor (s->plugin,
1592 s,
1593 GNUNET_TRANSPORT_SS_UPDATE);
1594 s->timeout_task = GNUNET_SCHEDULER_add_delayed (left,
1595 &session_timeout,
1596 s);
1597 return;
1598 }
1599 LOG (GNUNET_ERROR_TYPE_DEBUG,
1600 "Session %p was idle for %s, disconnecting\n",
1601 s,
1602 GNUNET_STRINGS_relative_time_to_string (XU_SESSION_TIME_OUT,
1603 GNUNET_YES));
1604 /* call session destroy function */
1605 xu_disconnect_session (plugin,
1606 s);
1607}
1608
1609
1610/**
1611 * Allocate a new session for the given endpoint address.
1612 * Note that this function does not inform the service
1613 * of the new session, this is the responsibility of the
1614 * caller (if needed).
1615 *
1616 * @param cls the `struct Plugin`
1617 * @param address address of the other peer to use
1618 * @param network_type network type the address belongs to
1619 * @return NULL on error, otherwise session handle
1620 */
1621static struct GNUNET_ATS_Session *
1622xu_plugin_create_session (void *cls,
1623 const struct GNUNET_HELLO_Address *address,
1624 enum GNUNET_NetworkType network_type)
1625{
1626 struct Plugin *plugin = cls;
1627 struct GNUNET_ATS_Session *s;
1628
1629 s = GNUNET_new (struct GNUNET_ATS_Session);
1630 s->mst = GNUNET_MST_create (&process_inbound_tokenized_messages,
1631 s);
1632 s->plugin = plugin;
1633 s->address = GNUNET_HELLO_address_copy (address);
1634 s->target = address->peer;
1635 s->last_transmit_time = GNUNET_TIME_absolute_get ();
1636 s->last_expected_ack_delay = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS,
1637 250);
1638 s->last_expected_msg_delay = GNUNET_TIME_UNIT_MILLISECONDS;
1639 s->flow_delay_from_other_peer = GNUNET_TIME_UNIT_ZERO;
1640 s->flow_delay_for_other_peer = GNUNET_TIME_UNIT_ZERO;
1641 s->timeout = GNUNET_TIME_relative_to_absolute (XU_SESSION_TIME_OUT);
1642 s->timeout_task = GNUNET_SCHEDULER_add_delayed (XU_SESSION_TIME_OUT,
1643 &session_timeout,
1644 s);
1645 s->scope = network_type;
1646
1647 LOG (GNUNET_ERROR_TYPE_DEBUG,
1648 "Creating new session %p for peer `%s' address `%s'\n",
1649 s,
1650 GNUNET_i2s (&address->peer),
1651 xu_address_to_string (plugin,
1652 address->address,
1653 address->address_length));
1654 GNUNET_assert (GNUNET_OK ==
1655 GNUNET_CONTAINER_multipeermap_put (plugin->sessions,
1656 &s->target,
1657 s,
1658 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
1659 GNUNET_STATISTICS_set (plugin->env->stats,
1660 "# XU sessions active",
1661 GNUNET_CONTAINER_multipeermap_size (plugin->sessions),
1662 GNUNET_NO);
1663 notify_session_monitor (plugin,
1664 s,
1665 GNUNET_TRANSPORT_SS_INIT);
1666 return s;
1667}
1668
1669
1670/**
1671 * Creates a new outbound session the transport service will use to
1672 * send data to the peer.
1673 *
1674 * @param cls the `struct Plugin *`
1675 * @param address the address
1676 * @return the session or NULL of max connections exceeded
1677 */
1678static struct GNUNET_ATS_Session *
1679xu_plugin_get_session (void *cls,
1680 const struct GNUNET_HELLO_Address *address)
1681{
1682 struct Plugin *plugin = cls;
1683 struct GNUNET_ATS_Session *s;
1684 enum GNUNET_NetworkType network_type = GNUNET_NT_UNSPECIFIED;
1685 const struct IPv4XuAddress *xu_v4;
1686 const struct IPv6XuAddress *xu_v6;
1687
1688 if (NULL == address)
1689 {
1690 GNUNET_break (0);
1691 return NULL;
1692 }
1693 if ( (address->address_length != sizeof(struct IPv4XuAddress)) &&
1694 (address->address_length != sizeof(struct IPv6XuAddress)) )
1695 {
1696 GNUNET_break_op (0);
1697 return NULL;
1698 }
1699 if (NULL != (s = xu_plugin_lookup_session (cls,
1700 address)))
1701 return s;
1702
1703 /* need to create new session */
1704 if (sizeof (struct IPv4XuAddress) == address->address_length)
1705 {
1706 struct sockaddr_in v4;
1707
1708 xu_v4 = (const struct IPv4XuAddress *) address->address;
1709 memset (&v4, '\0', sizeof (v4));
1710 v4.sin_family = AF_INET;
1711#if HAVE_SOCKADDR_IN_SIN_LEN
1712 v4.sin_len = sizeof (struct sockaddr_in);
1713#endif
1714 v4.sin_port = xu_v4->u4_port;
1715 v4.sin_addr.s_addr = xu_v4->ipv4_addr;
1716 network_type = plugin->env->get_address_type (plugin->env->cls,
1717 (const struct sockaddr *) &v4,
1718 sizeof (v4));
1719 }
1720 if (sizeof (struct IPv6XuAddress) == address->address_length)
1721 {
1722 struct sockaddr_in6 v6;
1723
1724 xu_v6 = (const struct IPv6XuAddress *) address->address;
1725 memset (&v6, '\0', sizeof (v6));
1726 v6.sin6_family = AF_INET6;
1727#if HAVE_SOCKADDR_IN_SIN_LEN
1728 v6.sin6_len = sizeof (struct sockaddr_in6);
1729#endif
1730 v6.sin6_port = xu_v6->u6_port;
1731 v6.sin6_addr = xu_v6->ipv6_addr;
1732 network_type = plugin->env->get_address_type (plugin->env->cls,
1733 (const struct sockaddr *) &v6,
1734 sizeof (v6));
1735 }
1736 GNUNET_break (GNUNET_NT_UNSPECIFIED != network_type);
1737 return xu_plugin_create_session (cls,
1738 address,
1739 network_type);
1740}
1741
1742
1743/**
1744 * We've received a XU Message. Process it (pass contents to main service).
1745 *
1746 * @param plugin plugin context
1747 * @param msg the message
1748 * @param xu_addr sender address
1749 * @param xu_addr_len number of bytes in @a xu_addr
1750 * @param network_type network type the address belongs to
1751 */
1752static void
1753process_xu_message (struct Plugin *plugin,
1754 const struct XUMessage *msg,
1755 const union XuAddress *xu_addr,
1756 size_t xu_addr_len,
1757 enum GNUNET_NetworkType network_type)
1758{
1759 struct GNUNET_ATS_Session *s;
1760 struct GNUNET_HELLO_Address *address;
1761
1762 GNUNET_break (GNUNET_NT_UNSPECIFIED != network_type);
1763 if (0 != ntohl (msg->reserved))
1764 {
1765 GNUNET_break_op(0);
1766 return;
1767 }
1768 if (ntohs (msg->header.size)
1769 < sizeof(struct GNUNET_MessageHeader) + sizeof(struct XUMessage))
1770 {
1771 GNUNET_break_op(0);
1772 return;
1773 }
1774
1775 address = GNUNET_HELLO_address_allocate (&msg->sender,
1776 PLUGIN_NAME,
1777 xu_addr,
1778 xu_addr_len,
1779 GNUNET_HELLO_ADDRESS_INFO_NONE);
1780 if (NULL ==
1781 (s = xu_plugin_lookup_session (plugin,
1782 address)))
1783 {
1784 s = xu_plugin_create_session (plugin,
1785 address,
1786 network_type);
1787 plugin->env->session_start (plugin->env->cls,
1788 address,
1789 s,
1790 s->scope);
1791 notify_session_monitor (plugin,
1792 s,
1793 GNUNET_TRANSPORT_SS_UP);
1794 }
1795 GNUNET_free (address);
1796
1797 s->rc++;
1798 GNUNET_MST_from_buffer (s->mst,
1799 (const char *) &msg[1],
1800 ntohs (msg->header.size) - sizeof(struct XUMessage),
1801 GNUNET_YES,
1802 GNUNET_NO);
1803 s->rc--;
1804 if ( (0 == s->rc) &&
1805 (GNUNET_YES == s->in_destroy) )
1806 free_session (s);
1807}
1808
1809
1810/**
1811 * Read and process a message from the given socket.
1812 *
1813 * @param plugin the overall plugin
1814 * @param rsock socket to read from
1815 */
1816static void
1817xu_select_read (struct Plugin *plugin,
1818 struct GNUNET_NETWORK_Handle *rsock)
1819{
1820 socklen_t fromlen;
1821 struct sockaddr_storage addr;
1822 char buf[65536] GNUNET_ALIGN;
1823 ssize_t size;
1824 const struct GNUNET_MessageHeader *msg;
1825 struct IPv4XuAddress v4;
1826 struct IPv6XuAddress v6;
1827 const struct sockaddr *sa;
1828 const struct sockaddr_in *sa4;
1829 const struct sockaddr_in6 *sa6;
1830 const union XuAddress *int_addr;
1831 size_t int_addr_len;
1832 enum GNUNET_NetworkType network_type;
1833
1834 fromlen = sizeof (addr);
1835 memset (&addr,
1836 0,
1837 sizeof(addr));
1838 size = GNUNET_NETWORK_socket_recvfrom (rsock,
1839 buf,
1840 sizeof (buf),
1841 (struct sockaddr *) &addr,
1842 &fromlen);
1843 sa = (const struct sockaddr *) &addr;
1844#if MINGW
1845 /* On SOCK_DGRAM XU sockets recvfrom might fail with a
1846 * WSAECONNRESET error to indicate that previous sendto() (yes, sendto!)
1847 * on this socket has failed.
1848 * Quote from MSDN:
1849 * WSAECONNRESET - The virtual circuit was reset by the remote side
1850 * executing a hard or abortive close. The application should close
1851 * the socket; it is no longer usable. On a XU-datagram socket this
1852 * error indicates a previous send operation resulted in an ICMP Port
1853 * Unreachable message.
1854 */
1855 if ( (-1 == size) &&
1856 (ECONNRESET == errno) )
1857 return;
1858#endif
1859 if (-1 == size)
1860 {
1861 LOG (GNUNET_ERROR_TYPE_DEBUG,
1862 "XU failed to receive data: %s\n",
1863 STRERROR (errno));
1864 /* Connection failure or something. Not a protocol violation. */
1865 return;
1866 }
1867
1868 /* Check if this is a STUN packet */
1869 if (GNUNET_NO !=
1870 GNUNET_NAT_stun_handle_packet (plugin->nat,
1871 (const struct sockaddr *) &addr,
1872 fromlen,
1873 buf,
1874 size))
1875 return; /* was STUN, do not process further */
1876
1877 if (((size_t) size) < sizeof(struct GNUNET_MessageHeader))
1878 {
1879 LOG (GNUNET_ERROR_TYPE_WARNING,
1880 "XU got %u bytes from %s, which is not enough for a GNUnet message header\n",
1881 (unsigned int ) size,
1882 GNUNET_a2s (sa,
1883 fromlen));
1884 /* _MAY_ be a connection failure (got partial message) */
1885 /* But it _MAY_ also be that the other side uses non-GNUnet protocol. */
1886 GNUNET_break_op (0);
1887 return;
1888 }
1889
1890 msg = (const struct GNUNET_MessageHeader *) buf;
1891 LOG (GNUNET_ERROR_TYPE_DEBUG,
1892 "XU received %u-byte message from `%s' type %u\n",
1893 (unsigned int) size,
1894 GNUNET_a2s (sa,
1895 fromlen),
1896 ntohs (msg->type));
1897 if (size != ntohs (msg->size))
1898 {
1899 LOG (GNUNET_ERROR_TYPE_WARNING,
1900 "XU malformed message (size %u) header from %s\n",
1901 (unsigned int) size,
1902 GNUNET_a2s (sa,
1903 fromlen));
1904 GNUNET_break_op (0);
1905 return;
1906 }
1907 GNUNET_STATISTICS_update (plugin->env->stats,
1908 "# XU, total bytes received",
1909 size,
1910 GNUNET_NO);
1911 network_type = plugin->env->get_address_type (plugin->env->cls,
1912 sa,
1913 fromlen);
1914 switch (sa->sa_family)
1915 {
1916 case AF_INET:
1917 sa4 = (const struct sockaddr_in *) &addr;
1918 v4.options = 0;
1919 v4.ipv4_addr = sa4->sin_addr.s_addr;
1920 v4.u4_port = sa4->sin_port;
1921 int_addr = (union XuAddress *) &v4;
1922 int_addr_len = sizeof (v4);
1923 break;
1924 case AF_INET6:
1925 sa6 = (const struct sockaddr_in6 *) &addr;
1926 v6.options = 0;
1927 v6.ipv6_addr = sa6->sin6_addr;
1928 v6.u6_port = sa6->sin6_port;
1929 int_addr = (union XuAddress *) &v6;
1930 int_addr_len = sizeof (v6);
1931 break;
1932 default:
1933 GNUNET_break (0);
1934 return;
1935 }
1936
1937 switch (ntohs (msg->type))
1938 {
1939 case GNUNET_MESSAGE_TYPE_TRANSPORT_XU_MESSAGE:
1940 if (ntohs (msg->size) < sizeof(struct XUMessage))
1941 {
1942 GNUNET_break_op(0);
1943 return;
1944 }
1945 process_xu_message (plugin,
1946 (const struct XUMessage *) msg,
1947 int_addr,
1948 int_addr_len,
1949 network_type);
1950 return;
1951 default:
1952 GNUNET_break_op(0);
1953 return;
1954 }
1955}
1956
1957
1958/* ***************** Event loop (part 2) *************** */
1959
1960
1961/**
1962 * We have been notified that our readset has something to read. We don't
1963 * know which socket needs to be read, so we have to check each one
1964 * Then reschedule this function to be called again once more is available.
1965 *
1966 * @param cls the plugin handle
1967 */
1968static void
1969xu_plugin_select_v4 (void *cls)
1970{
1971 struct Plugin *plugin = cls;
1972 const struct GNUNET_SCHEDULER_TaskContext *tc;
1973
1974 plugin->select_task_v4 = NULL;
1975 if (NULL == plugin->sockv4)
1976 return;
1977 tc = GNUNET_SCHEDULER_get_task_context ();
1978 if ( (0 != (tc->reason & GNUNET_SCHEDULER_REASON_READ_READY)) &&
1979 (GNUNET_NETWORK_fdset_isset (tc->read_ready,
1980 plugin->sockv4)) )
1981 xu_select_read (plugin,
1982 plugin->sockv4);
1983 schedule_select_v4 (plugin);
1984}
1985
1986
1987/**
1988 * We have been notified that our readset has something to read. We don't
1989 * know which socket needs to be read, so we have to check each one
1990 * Then reschedule this function to be called again once more is available.
1991 *
1992 * @param cls the plugin handle
1993 */
1994static void
1995xu_plugin_select_v6 (void *cls)
1996{
1997 struct Plugin *plugin = cls;
1998 const struct GNUNET_SCHEDULER_TaskContext *tc;
1999
2000 plugin->select_task_v6 = NULL;
2001 if (NULL == plugin->sockv6)
2002 return;
2003 tc = GNUNET_SCHEDULER_get_task_context ();
2004 if ( (0 != (tc->reason & GNUNET_SCHEDULER_REASON_READ_READY)) &&
2005 (GNUNET_NETWORK_fdset_isset (tc->read_ready,
2006 plugin->sockv6)) )
2007 xu_select_read (plugin,
2008 plugin->sockv6);
2009 schedule_select_v6 (plugin);
2010}
2011
2012
2013/* ******************* Initialization *************** */
2014
2015
2016/**
2017 * Setup the XU sockets (for IPv4 and IPv6) for the plugin.
2018 *
2019 * @param plugin the plugin to initialize
2020 * @param bind_v6 IPv6 address to bind to (can be NULL, for 'any')
2021 * @param bind_v4 IPv4 address to bind to (can be NULL, for 'any')
2022 * @return number of sockets that were successfully bound
2023 */
2024static unsigned int
2025setup_sockets (struct Plugin *plugin,
2026 const struct sockaddr_in6 *bind_v6,
2027 const struct sockaddr_in *bind_v4)
2028{
2029 int tries;
2030 unsigned int sockets_created = 0;
2031 struct sockaddr_in6 server_addrv6;
2032 struct sockaddr_in server_addrv4;
2033 const struct sockaddr *server_addr;
2034 const struct sockaddr *addrs[2];
2035 socklen_t addrlens[2];
2036 socklen_t addrlen;
2037 int eno;
2038
2039 /* Create IPv6 socket */
2040 eno = EINVAL;
2041 if (GNUNET_YES == plugin->enable_ipv6)
2042 {
2043 plugin->sockv6 = GNUNET_NETWORK_socket_create (PF_INET6,
2044 SOCK_DGRAM,
2045 0);
2046 if (NULL == plugin->sockv6)
2047 {
2048 LOG (GNUNET_ERROR_TYPE_INFO,
2049 _("Disabling IPv6 since it is not supported on this system!\n"));
2050 plugin->enable_ipv6 = GNUNET_NO;
2051 }
2052 else
2053 {
2054 memset (&server_addrv6,
2055 0,
2056 sizeof(struct sockaddr_in6));
2057#if HAVE_SOCKADDR_IN_SIN_LEN
2058 server_addrv6.sin6_len = sizeof (struct sockaddr_in6);
2059#endif
2060 server_addrv6.sin6_family = AF_INET6;
2061 if (NULL != bind_v6)
2062 server_addrv6.sin6_addr = bind_v6->sin6_addr;
2063 else
2064 server_addrv6.sin6_addr = in6addr_any;
2065
2066 if (0 == plugin->port) /* autodetect */
2067 server_addrv6.sin6_port
2068 = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG,
2069 33537)
2070 + 32000);
2071 else
2072 server_addrv6.sin6_port = htons (plugin->port);
2073 addrlen = sizeof (struct sockaddr_in6);
2074 server_addr = (const struct sockaddr *) &server_addrv6;
2075
2076 tries = 0;
2077 while (tries < 10)
2078 {
2079 LOG(GNUNET_ERROR_TYPE_DEBUG,
2080 "Binding to IPv6 `%s'\n",
2081 GNUNET_a2s (server_addr,
2082 addrlen));
2083 /* binding */
2084 if (GNUNET_OK ==
2085 GNUNET_NETWORK_socket_bind (plugin->sockv6,
2086 server_addr,
2087 addrlen))
2088 break;
2089 eno = errno;
2090 if (0 != plugin->port)
2091 {
2092 tries = 10; /* fail immediately */
2093 break; /* bind failed on specific port */
2094 }
2095 /* autodetect */
2096 server_addrv6.sin6_port
2097 = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG,
2098 33537)
2099 + 32000);
2100 tries++;
2101 }
2102 if (tries >= 10)
2103 {
2104 GNUNET_NETWORK_socket_close (plugin->sockv6);
2105 plugin->enable_ipv6 = GNUNET_NO;
2106 plugin->sockv6 = NULL;
2107 }
2108 else
2109 {
2110 plugin->port = ntohs (server_addrv6.sin6_port);
2111 }
2112 if (NULL != plugin->sockv6)
2113 {
2114 LOG (GNUNET_ERROR_TYPE_DEBUG,
2115 "IPv6 XU socket created listinging at %s\n",
2116 GNUNET_a2s (server_addr,
2117 addrlen));
2118 addrs[sockets_created] = server_addr;
2119 addrlens[sockets_created] = addrlen;
2120 sockets_created++;
2121 }
2122 else
2123 {
2124 LOG (GNUNET_ERROR_TYPE_WARNING,
2125 _("Failed to bind XU socket to %s: %s\n"),
2126 GNUNET_a2s (server_addr,
2127 addrlen),
2128 STRERROR (eno));
2129 }
2130 }
2131 }
2132
2133 /* Create IPv4 socket */
2134 eno = EINVAL;
2135 plugin->sockv4 = GNUNET_NETWORK_socket_create (PF_INET,
2136 SOCK_DGRAM,
2137 0);
2138 if (NULL == plugin->sockv4)
2139 {
2140 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
2141 "socket");
2142 LOG (GNUNET_ERROR_TYPE_INFO,
2143 _("Disabling IPv4 since it is not supported on this system!\n"));
2144 plugin->enable_ipv4 = GNUNET_NO;
2145 }
2146 else
2147 {
2148 memset (&server_addrv4,
2149 0,
2150 sizeof(struct sockaddr_in));
2151#if HAVE_SOCKADDR_IN_SIN_LEN
2152 server_addrv4.sin_len = sizeof (struct sockaddr_in);
2153#endif
2154 server_addrv4.sin_family = AF_INET;
2155 if (NULL != bind_v4)
2156 server_addrv4.sin_addr = bind_v4->sin_addr;
2157 else
2158 server_addrv4.sin_addr.s_addr = INADDR_ANY;
2159
2160 if (0 == plugin->port)
2161 /* autodetect */
2162 server_addrv4.sin_port
2163 = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG,
2164 33537)
2165 + 32000);
2166 else
2167 server_addrv4.sin_port = htons (plugin->port);
2168
2169 addrlen = sizeof (struct sockaddr_in);
2170 server_addr = (const struct sockaddr *) &server_addrv4;
2171
2172 tries = 0;
2173 while (tries < 10)
2174 {
2175 LOG (GNUNET_ERROR_TYPE_DEBUG,
2176 "Binding to IPv4 `%s'\n",
2177 GNUNET_a2s (server_addr,
2178 addrlen));
2179
2180 /* binding */
2181 if (GNUNET_OK ==
2182 GNUNET_NETWORK_socket_bind (plugin->sockv4,
2183 server_addr,
2184 addrlen))
2185 break;
2186 eno = errno;
2187 if (0 != plugin->port)
2188 {
2189 tries = 10; /* fail */
2190 break; /* bind failed on specific port */
2191 }
2192
2193 /* autodetect */
2194 server_addrv4.sin_port
2195 = htons (GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG,
2196 33537)
2197 + 32000);
2198 tries++;
2199 }
2200 if (tries >= 10)
2201 {
2202 GNUNET_NETWORK_socket_close (plugin->sockv4);
2203 plugin->enable_ipv4 = GNUNET_NO;
2204 plugin->sockv4 = NULL;
2205 }
2206 else
2207 {
2208 plugin->port = ntohs (server_addrv4.sin_port);
2209 }
2210
2211 if (NULL != plugin->sockv4)
2212 {
2213 LOG (GNUNET_ERROR_TYPE_DEBUG,
2214 "IPv4 socket created on port %s\n",
2215 GNUNET_a2s (server_addr,
2216 addrlen));
2217 addrs[sockets_created] = server_addr;
2218 addrlens[sockets_created] = addrlen;
2219 sockets_created++;
2220 }
2221 else
2222 {
2223 LOG (GNUNET_ERROR_TYPE_ERROR,
2224 _("Failed to bind XU socket to %s: %s\n"),
2225 GNUNET_a2s (server_addr,
2226 addrlen),
2227 STRERROR (eno));
2228 }
2229 }
2230
2231 if (0 == sockets_created)
2232 {
2233 LOG (GNUNET_ERROR_TYPE_WARNING,
2234 _("Failed to open XU sockets\n"));
2235 return 0; /* No sockets created, return */
2236 }
2237 schedule_select_v4 (plugin);
2238 schedule_select_v6 (plugin);
2239 plugin->nat = GNUNET_NAT_register (plugin->env->cfg,
2240 "transport-xu",
2241 IPPROTO_UDP,
2242 sockets_created,
2243 addrs,
2244 addrlens,
2245 &xu_nat_port_map_callback,
2246 NULL,
2247 plugin);
2248 return sockets_created;
2249}
2250
2251
2252/**
2253 * The exported method. Makes the core api available via a global and
2254 * returns the xu transport API.
2255 *
2256 * @param cls our `struct GNUNET_TRANSPORT_PluginEnvironment`
2257 * @return our `struct GNUNET_TRANSPORT_PluginFunctions`
2258 */
2259void *
2260libgnunet_plugin_transport_xu_init (void *cls)
2261{
2262 struct GNUNET_TRANSPORT_PluginEnvironment *env = cls;
2263 struct GNUNET_TRANSPORT_PluginFunctions *api;
2264 struct Plugin *p;
2265 unsigned long long port;
2266 unsigned long long aport;
2267 int enable_v6;
2268 char *bind4_address;
2269 char *bind6_address;
2270 struct sockaddr_in server_addrv4;
2271 struct sockaddr_in6 server_addrv6;
2272 unsigned int res;
2273 int have_bind4;
2274 int have_bind6;
2275
2276 if (NULL == env->receive)
2277 {
2278 /* run in 'stub' mode (i.e. as part of gnunet-peerinfo), don't fully
2279 initialze the plugin or the API */
2280 api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
2281 api->cls = NULL;
2282 api->address_pretty_printer = &xu_plugin_address_pretty_printer;
2283 api->address_to_string = &xu_address_to_string;
2284 api->string_to_address = &xu_string_to_address;
2285 return api;
2286 }
2287
2288 /* Get port number: port == 0 : autodetect a port,
2289 * > 0 : use this port, not given : 2086 default */
2290 if (GNUNET_OK !=
2291 GNUNET_CONFIGURATION_get_value_number (env->cfg,
2292 "transport-xu",
2293 "PORT",
2294 &port))
2295 port = 2086;
2296 if (port > 65535)
2297 {
2298 GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
2299 "transport-xu",
2300 "PORT",
2301 _("must be in [0,65535]"));
2302 return NULL;
2303 }
2304 if (GNUNET_OK !=
2305 GNUNET_CONFIGURATION_get_value_number (env->cfg,
2306 "transport-xu",
2307 "ADVERTISED_PORT",
2308 &aport))
2309 aport = port;
2310 if (aport > 65535)
2311 {
2312 GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
2313 "transport-xu",
2314 "ADVERTISED_PORT",
2315 _("must be in [0,65535]"));
2316 return NULL;
2317 }
2318
2319 if (GNUNET_YES ==
2320 GNUNET_CONFIGURATION_get_value_yesno (env->cfg,
2321 "nat",
2322 "DISABLEV6"))
2323 enable_v6 = GNUNET_NO;
2324 else
2325 enable_v6 = GNUNET_YES;
2326
2327 have_bind4 = GNUNET_NO;
2328 memset (&server_addrv4,
2329 0,
2330 sizeof (server_addrv4));
2331 if (GNUNET_YES ==
2332 GNUNET_CONFIGURATION_get_value_string (env->cfg,
2333 "transport-xu",
2334 "BINDTO",
2335 &bind4_address))
2336 {
2337 LOG (GNUNET_ERROR_TYPE_DEBUG,
2338 "Binding XU plugin to specific address: `%s'\n",
2339 bind4_address);
2340 if (1 != inet_pton (AF_INET,
2341 bind4_address,
2342 &server_addrv4.sin_addr))
2343 {
2344 GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
2345 "transport-xu",
2346 "BINDTO",
2347 _("must be valid IPv4 address"));
2348 GNUNET_free (bind4_address);
2349 return NULL;
2350 }
2351 have_bind4 = GNUNET_YES;
2352 }
2353 GNUNET_free_non_null (bind4_address);
2354 have_bind6 = GNUNET_NO;
2355 memset (&server_addrv6,
2356 0,
2357 sizeof (server_addrv6));
2358 if (GNUNET_YES ==
2359 GNUNET_CONFIGURATION_get_value_string (env->cfg,
2360 "transport-xu",
2361 "BINDTO6",
2362 &bind6_address))
2363 {
2364 LOG (GNUNET_ERROR_TYPE_DEBUG,
2365 "Binding xu plugin to specific address: `%s'\n",
2366 bind6_address);
2367 if (1 != inet_pton (AF_INET6,
2368 bind6_address,
2369 &server_addrv6.sin6_addr))
2370 {
2371 GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
2372 "transport-xu",
2373 "BINDTO6",
2374 _("must be valid IPv6 address"));
2375 GNUNET_free (bind6_address);
2376 return NULL;
2377 }
2378 have_bind6 = GNUNET_YES;
2379 }
2380 GNUNET_free_non_null (bind6_address);
2381
2382 p = GNUNET_new (struct Plugin);
2383 p->port = port;
2384 p->aport = aport;
2385 p->enable_ipv6 = enable_v6;
2386 p->enable_ipv4 = GNUNET_YES; /* default */
2387 p->env = env;
2388 p->sessions = GNUNET_CONTAINER_multipeermap_create (16,
2389 GNUNET_NO);
2390 res = setup_sockets (p,
2391 (GNUNET_YES == have_bind6) ? &server_addrv6 : NULL,
2392 (GNUNET_YES == have_bind4) ? &server_addrv4 : NULL);
2393 if ( (0 == res) ||
2394 ( (NULL == p->sockv4) &&
2395 (NULL == p->sockv6) ) )
2396 {
2397 LOG (GNUNET_ERROR_TYPE_ERROR,
2398 _("Failed to create XU network sockets\n"));
2399 GNUNET_CONTAINER_multipeermap_destroy (p->sessions);
2400 if (NULL != p->nat)
2401 GNUNET_NAT_unregister (p->nat);
2402 GNUNET_free (p);
2403 return NULL;
2404 }
2405
2406 api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
2407 api->cls = p;
2408 api->disconnect_session = &xu_disconnect_session;
2409 api->query_keepalive_factor = &xu_query_keepalive_factor;
2410 api->disconnect_peer = &xu_disconnect;
2411 api->address_pretty_printer = &xu_plugin_address_pretty_printer;
2412 api->address_to_string = &xu_address_to_string;
2413 api->string_to_address = &xu_string_to_address;
2414 api->check_address = &xu_plugin_check_address;
2415 api->get_session = &xu_plugin_get_session;
2416 api->send = &xu_plugin_send;
2417 api->get_network = &xu_plugin_get_network;
2418 api->get_network_for_address = &xu_plugin_get_network_for_address;
2419 api->update_session_timeout = &xu_plugin_update_session_timeout;
2420 api->setup_monitor = &xu_plugin_setup_monitor;
2421 return api;
2422}
2423
2424
2425/**
2426 * The exported method. Makes the core api available via a global and
2427 * returns the xu transport API.
2428 *
2429 * @param cls our `struct GNUNET_TRANSPORT_PluginEnvironment`
2430 * @return NULL
2431 */
2432void *
2433libgnunet_plugin_transport_xu_done (void *cls)
2434{
2435 struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
2436 struct Plugin *plugin = api->cls;
2437 struct PrettyPrinterContext *cur;
2438
2439 if (NULL == plugin)
2440 {
2441 GNUNET_free (api);
2442 return NULL;
2443 }
2444 if (NULL != plugin->select_task_v4)
2445 {
2446 GNUNET_SCHEDULER_cancel (plugin->select_task_v4);
2447 plugin->select_task_v4 = NULL;
2448 }
2449 if (NULL != plugin->select_task_v6)
2450 {
2451 GNUNET_SCHEDULER_cancel (plugin->select_task_v6);
2452 plugin->select_task_v6 = NULL;
2453 }
2454 if (NULL != plugin->sockv4)
2455 {
2456 GNUNET_break (GNUNET_OK ==
2457 GNUNET_NETWORK_socket_close (plugin->sockv4));
2458 plugin->sockv4 = NULL;
2459 }
2460 if (NULL != plugin->sockv6)
2461 {
2462 GNUNET_break (GNUNET_OK ==
2463 GNUNET_NETWORK_socket_close (plugin->sockv6));
2464 plugin->sockv6 = NULL;
2465 }
2466 if (NULL != plugin->nat)
2467 {
2468 GNUNET_NAT_unregister (plugin->nat);
2469 plugin->nat = NULL;
2470 }
2471 GNUNET_CONTAINER_multipeermap_destroy (plugin->sessions);
2472
2473 while (NULL != (cur = plugin->ppc_dll_head))
2474 {
2475 GNUNET_break (0);
2476 GNUNET_CONTAINER_DLL_remove (plugin->ppc_dll_head,
2477 plugin->ppc_dll_tail,
2478 cur);
2479 GNUNET_RESOLVER_request_cancel (cur->resolver_handle);
2480 if (NULL != cur->timeout_task)
2481 {
2482 GNUNET_SCHEDULER_cancel (cur->timeout_task);
2483 cur->timeout_task = NULL;
2484 }
2485 GNUNET_free (cur);
2486 }
2487 GNUNET_free (plugin);
2488 GNUNET_free (api);
2489 return NULL;
2490}
2491
2492/* end of plugin_transport_xu.c */
diff --git a/src/transport/plugin_transport_xu.h b/src/transport/plugin_transport_xu.h
deleted file mode 100644
index dd3dcd738..000000000
--- a/src/transport/plugin_transport_xu.h
+++ /dev/null
@@ -1,273 +0,0 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2010-2014 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19*/
20
21/**
22 * @file transport/plugin_transport_xu.h
23 * @brief Implementation of the XU transport protocol
24 * @author Christian Grothoff
25 * @author Nathan Evans
26 * @author Matthias Wachs
27 */
28#ifndef PLUGIN_TRANSPORT_XU_H
29#define PLUGIN_TRANSPORT_XU_H
30
31#include "platform.h"
32#include "gnunet_hello_lib.h"
33#include "gnunet_util_lib.h"
34#include "gnunet_fragmentation_lib.h"
35#include "gnunet_protocols.h"
36#include "gnunet_resolver_service.h"
37#include "gnunet_signatures.h"
38#include "gnunet_constants.h"
39#include "gnunet_statistics_service.h"
40#include "gnunet_transport_service.h"
41#include "gnunet_transport_plugin.h"
42#include "transport.h"
43
44#define LOG(kind,...) GNUNET_log_from (kind, "transport-xu", __VA_ARGS__)
45
46#define PLUGIN_NAME "xu"
47
48#define DEBUG_XU GNUNET_NO
49
50#define DEBUG_XU_BROADCASTING GNUNET_NO
51
52/**
53 * MTU for fragmentation subsystem. Should be conservative since
54 * all communicating peers MUST work with this MTU.
55 */
56#define XU_MTU 1400
57
58
59GNUNET_NETWORK_STRUCT_BEGIN
60/**
61 * Network format for IPv4 addresses.
62 */
63struct IPv4XuAddress
64{
65 /**
66 * Optional options and flags for this address
67 */
68 uint32_t options GNUNET_PACKED;
69
70 /**
71 * IPv4 address, in network byte order.
72 */
73 uint32_t ipv4_addr GNUNET_PACKED;
74
75 /**
76 * Port number, in network byte order.
77 */
78 uint16_t u4_port GNUNET_PACKED;
79};
80
81
82/**
83 * Network format for IPv6 addresses.
84 */
85struct IPv6XuAddress
86{
87 /**
88 * Optional options and flags for this address
89 */
90 uint32_t options GNUNET_PACKED;
91
92 /**
93 * IPv6 address.
94 */
95 struct in6_addr ipv6_addr GNUNET_PACKED;
96
97 /**
98 * Port number, in network byte order.
99 */
100 uint16_t u6_port GNUNET_PACKED;
101};
102GNUNET_NETWORK_STRUCT_END
103
104/**
105 * Either an IPv4 or IPv6 XU address. Note that without a "length",
106 * one cannot tell which one of the two types this address represents.
107 */
108union XuAddress
109{
110 /**
111 * IPv4 case.
112 */
113 struct IPv4XuAddress v4;
114
115 /**
116 * IPv6 case.
117 */
118 struct IPv6XuAddress v6;
119};
120
121
122/**
123 * Information we track for each message in the queue.
124 */
125struct XU_MessageWrapper;
126
127
128/**
129 * Closure for #append_port().
130 */
131struct PrettyPrinterContext;
132
133
134/**
135 * Encapsulation of all of the state of the plugin.
136 */
137struct Plugin
138{
139
140 /**
141 * Our environment.
142 */
143 struct GNUNET_TRANSPORT_PluginEnvironment *env;
144
145 /**
146 * Session of peers with whom we are currently connected,
147 * map of peer identity to `struct GNUNET_ATS_Session *`.
148 */
149 struct GNUNET_CONTAINER_MultiPeerMap *sessions;
150
151 /**
152 * ID of select task for IPv4
153 */
154 struct GNUNET_SCHEDULER_Task *select_task_v4;
155
156 /**
157 * ID of select task for IPv6
158 */
159 struct GNUNET_SCHEDULER_Task *select_task_v6;
160
161 /**
162 * Address we were told to bind to exclusively (IPv4).
163 */
164 char *bind4_address;
165
166 /**
167 * Address we were told to bind to exclusively (IPv6).
168 */
169 char *bind6_address;
170
171 /**
172 * Handle to NAT traversal support.
173 */
174 struct GNUNET_NAT_Handle *nat;
175
176 /**
177 * Handle to NAT traversal support.
178 */
179 struct GNUNET_NAT_STUN_Handle *stun;
180
181 /**
182 * The read socket for IPv4
183 */
184 struct GNUNET_NETWORK_Handle *sockv4;
185
186 /**
187 * The read socket for IPv6
188 */
189 struct GNUNET_NETWORK_Handle *sockv6;
190
191 /**
192 * Running pretty printers: head
193 */
194 struct PrettyPrinterContext *ppc_dll_head;
195
196 /**
197 * Running pretty printers: tail
198 */
199 struct PrettyPrinterContext *ppc_dll_tail;
200
201 /**
202 * Function to call about session status changes.
203 */
204 GNUNET_TRANSPORT_SessionInfoCallback sic;
205
206 /**
207 * Closure for @e sic.
208 */
209 void *sic_cls;
210
211 /**
212 * IPv6 multicast address
213 */
214 struct sockaddr_in6 ipv6_multicast_address;
215
216 /**
217 * Broadcast interval
218 */
219 struct GNUNET_TIME_Relative broadcast_interval;
220
221 /**
222 * Bytes currently in buffer
223 */
224 int64_t bytes_in_buffer;
225
226 /**
227 * Address options
228 */
229 uint32_t myoptions;
230
231 /**
232 * Is IPv6 enabled: #GNUNET_YES or #GNUNET_NO
233 */
234 int enable_ipv6;
235
236 /**
237 * Is IPv4 enabled: #GNUNET_YES or #GNUNET_NO
238 */
239 int enable_ipv4;
240
241 /**
242 * Port we listen on.
243 */
244 uint16_t port;
245
246 /**
247 * Port we advertise on.
248 */
249 uint16_t aport;
250
251};
252
253
254/**
255 * Function called for a quick conversion of the binary address to
256 * a numeric address. Note that the caller must not free the
257 * address and that the next call to this function is allowed
258 * to override the address again.
259 *
260 * @param cls closure
261 * @param addr binary address (a `union XuAddress`)
262 * @param addrlen length of the @a addr
263 * @return string representing the same address
264 */
265const char *
266xu_address_to_string (void *cls,
267 const void *addr,
268 size_t addrlen);
269
270
271/*#ifndef PLUGIN_TRANSPORT_XU_H*/
272#endif
273/* end of plugin_transport_xu.h */
diff --git a/src/transport/transport.h b/src/transport/transport.h
index c0e02c3d9..b231ea8ae 100644
--- a/src/transport/transport.h
+++ b/src/transport/transport.h
@@ -1107,6 +1107,38 @@ struct GNUNET_TRANSPORT_AddressToVerify
1107}; 1107};
1108 1108
1109 1109
1110/**
1111 * Application client to TRANSPORT service: we would like to have
1112 * address suggestions for this peer.
1113 */
1114struct ExpressPreferenceMessage
1115{
1116 /**
1117 * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST or
1118 * #GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST_CANCEL to stop
1119 * suggestions.
1120 */
1121 struct GNUNET_MessageHeader header;
1122
1123 /**
1124 * What type of performance preference does the client have?
1125 * A `enum GNUNET_MQ_PreferenceKind` in NBO.
1126 */
1127 uint32_t pk GNUNET_PACKED;
1128
1129 /**
1130 * Peer to get address suggestions for.
1131 */
1132 struct GNUNET_PeerIdentity peer;
1133
1134 /**
1135 * How much bandwidth in bytes/second does the application expect?
1136 */
1137 struct GNUNET_BANDWIDTH_Value32NBO bw;
1138
1139};
1140
1141
1110#endif 1142#endif
1111 1143
1112GNUNET_NETWORK_STRUCT_END 1144GNUNET_NETWORK_STRUCT_END
diff --git a/src/transport/transport_api2_application.c b/src/transport/transport_api2_application.c
new file mode 100644
index 000000000..325438e11
--- /dev/null
+++ b/src/transport/transport_api2_application.c
@@ -0,0 +1,366 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2010--2019 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19*/
20/**
21 * @file transport/transport_api2_application.c
22 * @brief enable clients to ask TRANSPORT about establishing connections to peers
23 * @author Christian Grothoff
24 * @author Matthias Wachs
25 */
26#include "platform.h"
27#include "gnunet_transport_application_service.h"
28#include "gnunet_transport_core_service.h"
29#include "transport.h"
30
31
32#define LOG(kind,...) GNUNET_log_from(kind, "transport-application-api", __VA_ARGS__)
33
34
35/**
36 * Handle for TRANSPORT address suggestion requests.
37 */
38struct GNUNET_TRANSPORT_ApplicationSuggestHandle
39{
40 /**
41 * ID of the peer for which address suggestion was requested.
42 */
43 struct GNUNET_PeerIdentity id;
44
45 /**
46 * Connecitivity handle this suggestion handle belongs to.
47 */
48 struct GNUNET_TRANSPORT_ApplicationHandle *ch;
49
50 /**
51 * What preference is being expressed?
52 */
53 enum GNUNET_MQ_PreferenceKind pk;
54
55 /**
56 * How much bandwidth does the client expect?
57 */
58 struct GNUNET_BANDWIDTH_Value32NBO bw;
59};
60
61
62/**
63 * Handle to the TRANSPORT subsystem for application management.
64 */
65struct GNUNET_TRANSPORT_ApplicationHandle
66{
67
68 /**
69 * Our configuration.
70 */
71 const struct GNUNET_CONFIGURATION_Handle *cfg;
72
73 /**
74 * Map with the identities of all the peers for which we would
75 * like to have address suggestions. The key is the PID, the
76 * value is currently the `struct GNUNET_TRANSPORT_ApplicationSuggestHandle`
77 */
78 struct GNUNET_CONTAINER_MultiPeerMap *sug_requests;
79
80 /**
81 * Message queue for sending requests to the TRANSPORT service.
82 */
83 struct GNUNET_MQ_Handle *mq;
84
85 /**
86 * Task to trigger reconnect.
87 */
88 struct GNUNET_SCHEDULER_Task *task;
89
90 /**
91 * Reconnect backoff delay.
92 */
93 struct GNUNET_TIME_Relative backoff;
94};
95
96
97/**
98 * Re-establish the connection to the TRANSPORT service.
99 *
100 * @param ch handle to use to re-connect.
101 */
102static void
103reconnect (struct GNUNET_TRANSPORT_ApplicationHandle *ch);
104
105
106/**
107 * Re-establish the connection to the TRANSPORT service.
108 *
109 * @param cls handle to use to re-connect.
110 */
111static void
112reconnect_task (void *cls)
113{
114 struct GNUNET_TRANSPORT_ApplicationHandle *ch = cls;
115
116 ch->task = NULL;
117 reconnect (ch);
118}
119
120
121/**
122 * Disconnect from TRANSPORT and then reconnect.
123 *
124 * @param ch our handle
125 */
126static void
127force_reconnect (struct GNUNET_TRANSPORT_ApplicationHandle *ch)
128{
129 if (NULL != ch->mq)
130 {
131 GNUNET_MQ_destroy (ch->mq);
132 ch->mq = NULL;
133 }
134 ch->backoff = GNUNET_TIME_STD_BACKOFF (ch->backoff);
135 ch->task = GNUNET_SCHEDULER_add_delayed (ch->backoff,
136 &reconnect_task,
137 ch);
138}
139
140
141/**
142 * We encountered an error handling the MQ to the
143 * TRANSPORT service. Reconnect.
144 *
145 * @param cls the `struct GNUNET_TRANSPORT_ApplicationHandle`
146 * @param error details about the error
147 */
148static void
149error_handler (void *cls,
150 enum GNUNET_MQ_Error error)
151{
152 struct GNUNET_TRANSPORT_ApplicationHandle *ch = cls;
153
154 LOG (GNUNET_ERROR_TYPE_DEBUG,
155 "TRANSPORT connection died (code %d), reconnecting\n",
156 (int) error);
157 force_reconnect (ch);
158}
159
160
161/**
162 * Transmit request for an address suggestion.
163 *
164 * @param cls the `struct GNUNET_TRANSPORT_ApplicationHandle`
165 * @param peer peer to ask for an address suggestion for
166 * @param value the `struct GNUNET_TRANSPORT_SuggestHandle`
167 * @return #GNUNET_OK (continue to iterate), #GNUNET_SYSERR on
168 * failure (message queue no longer exists)
169 */
170static int
171transmit_suggestion (void *cls,
172 const struct GNUNET_PeerIdentity *peer,
173 void *value)
174{
175 struct GNUNET_TRANSPORT_ApplicationHandle *ch = cls;
176 struct GNUNET_TRANSPORT_ApplicationSuggestHandle *sh = value;
177 struct GNUNET_MQ_Envelope *ev;
178 struct ExpressPreferenceMessage *m;
179
180 if (NULL == ch->mq)
181 return GNUNET_SYSERR;
182 ev = GNUNET_MQ_msg (m,
183 GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST);
184 m->pk = htonl ((uint32_t) sh->pk);
185 m->bw = sh->bw;
186 m->peer = *peer;
187 GNUNET_MQ_send (ch->mq, ev);
188 return GNUNET_OK;
189}
190
191
192/**
193 * Re-establish the connection to the TRANSPORT service.
194 *
195 * @param ch handle to use to re-connect.
196 */
197static void
198reconnect (struct GNUNET_TRANSPORT_ApplicationHandle *ch)
199{
200 static const struct GNUNET_MQ_MessageHandler handlers[] = {
201 { NULL, 0, 0 }
202 };
203
204 GNUNET_assert (NULL == ch->mq);
205 ch->mq = GNUNET_CLIENT_connect (ch->cfg,
206 "transport",
207 handlers,
208 &error_handler,
209 ch);
210 if (NULL == ch->mq)
211 {
212 force_reconnect (ch);
213 return;
214 }
215 GNUNET_CONTAINER_multipeermap_iterate (ch->sug_requests,
216 &transmit_suggestion,
217 ch);
218}
219
220
221/**
222 * Initialize the TRANSPORT application suggestion client handle.
223 *
224 * @param cfg configuration to use
225 * @return transport application handle, NULL on error
226 */
227struct GNUNET_TRANSPORT_ApplicationHandle *
228GNUNET_TRANSPORT_application_init (const struct GNUNET_CONFIGURATION_Handle *cfg)
229{
230 struct GNUNET_TRANSPORT_ApplicationHandle *ch;
231
232 ch = GNUNET_new (struct GNUNET_TRANSPORT_ApplicationHandle);
233 ch->cfg = cfg;
234 ch->sug_requests = GNUNET_CONTAINER_multipeermap_create (32,
235 GNUNET_YES);
236 reconnect (ch);
237 return ch;
238}
239
240
241/**
242 * Function called to free all `struct GNUNET_TRANSPORT_ApplicationSuggestHandle`s
243 * in the map.
244 *
245 * @param cls NULL
246 * @param key the key
247 * @param value the value to free
248 * @return #GNUNET_OK (continue to iterate)
249 */
250static int
251free_sug_handle (void *cls,
252 const struct GNUNET_PeerIdentity *key,
253 void *value)
254{
255 struct GNUNET_TRANSPORT_ApplicationSuggestHandle *cur = value;
256
257 GNUNET_free (cur);
258 return GNUNET_OK;
259}
260
261
262/**
263 * Client is done with TRANSPORT application management, release resources.
264 *
265 * @param ch handle to release
266 */
267void
268GNUNET_TRANSPORT_application_done (struct GNUNET_TRANSPORT_ApplicationHandle *ch)
269{
270 if (NULL != ch->mq)
271 {
272 GNUNET_MQ_destroy (ch->mq);
273 ch->mq = NULL;
274 }
275 if (NULL != ch->task)
276 {
277 GNUNET_SCHEDULER_cancel (ch->task);
278 ch->task = NULL;
279 }
280 GNUNET_CONTAINER_multipeermap_iterate (ch->sug_requests,
281 &free_sug_handle,
282 NULL);
283 GNUNET_CONTAINER_multipeermap_destroy (ch->sug_requests);
284 GNUNET_free (ch);
285}
286
287
288/**
289 * We would like to receive address suggestions for a peer. TRANSPORT will
290 * respond with a call to the continuation immediately containing an address or
291 * no address if none is available. TRANSPORT can suggest more addresses until we call
292 * #GNUNET_TRANSPORT_application_suggest_cancel().
293 *
294 * @param ch handle
295 * @param peer identity of the peer we need an address for
296 * @param pk what kind of application will the application require (can be
297 * #GNUNET_MQ_PREFERENCE_NONE, we will still try to connect)
298 * @param bw desired bandwith, can be zero (we will still try to connect)
299 * @return suggest handle, NULL if a request is already pending
300 */
301struct GNUNET_TRANSPORT_ApplicationSuggestHandle *
302GNUNET_TRANSPORT_application_suggest (struct GNUNET_TRANSPORT_ApplicationHandle *ch,
303 const struct GNUNET_PeerIdentity *peer,
304 enum GNUNET_MQ_PreferenceKind pk,
305 struct GNUNET_BANDWIDTH_Value32NBO bw)
306{
307 struct GNUNET_TRANSPORT_ApplicationSuggestHandle *s;
308
309 s = GNUNET_new (struct GNUNET_TRANSPORT_ApplicationSuggestHandle);
310 s->ch = ch;
311 s->id = *peer;
312 s->pk = pk;
313 s->bw = bw;
314 (void) GNUNET_CONTAINER_multipeermap_put (ch->sug_requests,
315 &s->id,
316 s,
317 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
318 LOG (GNUNET_ERROR_TYPE_DEBUG,
319 "Requesting TRANSPORT to suggest address for `%s'\n",
320 GNUNET_i2s (peer));
321 if (NULL == ch->mq)
322 return s;
323 GNUNET_assert (GNUNET_OK ==
324 transmit_suggestion (ch,
325 &s->id,
326 s));
327 return s;
328}
329
330
331/**
332 * We no longer care about being connected to a peer.
333 *
334 * @param sh handle to stop
335 */
336void
337GNUNET_TRANSPORT_application_suggest_cancel (struct GNUNET_TRANSPORT_ApplicationSuggestHandle *sh)
338{
339 struct GNUNET_TRANSPORT_ApplicationHandle *ch = sh->ch;
340 struct GNUNET_MQ_Envelope *ev;
341 struct ExpressPreferenceMessage *m;
342
343 LOG (GNUNET_ERROR_TYPE_DEBUG,
344 "Telling TRANSPORT we no longer care for an address for `%s'\n",
345 GNUNET_i2s (&sh->id));
346 GNUNET_assert (GNUNET_OK ==
347 GNUNET_CONTAINER_multipeermap_remove (ch->sug_requests,
348 &sh->id,
349 sh));
350 if (NULL == ch->mq)
351 {
352 GNUNET_free (sh);
353 return;
354 }
355 ev = GNUNET_MQ_msg (m,
356 GNUNET_MESSAGE_TYPE_TRANSPORT_SUGGEST_CANCEL);
357 m->pk = htonl ((uint32_t) sh->pk);
358 m->bw = sh->bw;
359 m->peer = sh->id;
360 GNUNET_MQ_send (ch->mq,
361 ev);
362 GNUNET_free (sh);
363}
364
365
366/* end of transport_api2_application.c */
diff --git a/src/util/Makefile.am b/src/util/Makefile.am
index 89d0462c5..0e799b553 100644
--- a/src/util/Makefile.am
+++ b/src/util/Makefile.am
@@ -280,13 +280,12 @@ gnunet_uri_LDADD = \
280 280
281 281
282gnunet_qr_SOURCES = \ 282gnunet_qr_SOURCES = \
283 gnunet-qr.c \ 283 gnunet-qr.c
284 gnunet-qr-utils.h
285gnunet_qr_LDADD = \ 284gnunet_qr_LDADD = \
286 libgnunetutil.la \ 285 libgnunetutil.la \
287 $(GN_LIBINTL) 286 $(GN_LIBINTL)
288gnunet_qr_LDFLAGS= $(libzbar_LIBS) 287gnunet_qr_LDFLAGS= \
289gnunet_qr_CFLAGS = $(libzbar_CFLAGS) -DBINDIR=\"@bindir@/\" 288 -lzbar
290 289
291plugin_LTLIBRARIES = \ 290plugin_LTLIBRARIES = \
292 libgnunet_plugin_test.la 291 libgnunet_plugin_test.la