[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnunet] 34/40: Remove most of old transport, ATS and PEERINFO. Disable
From: |
gnunet |
Subject: |
[gnunet] 34/40: Remove most of old transport, ATS and PEERINFO. Disable TESTBED and related tests |
Date: |
Thu, 05 Oct 2023 08:57:37 +0200 |
This is an automated email from the git hooks/post-receive script.
martin-schanzenbach pushed a commit to branch master
in repository gnunet.
commit 5df04510362413a6c215365879058f5c445e1f3c
Author: Martin Schanzenbach <schanzen@gnunet.org>
AuthorDate: Wed Oct 4 22:52:00 2023 +0200
Remove most of old transport, ATS and PEERINFO. Disable TESTBED and related
tests
---
configure.ac | 8 -
pkgconfig/Makefile.am | 4 -
po/POTFILES.in | 61 -
src/Makefile.am | 7 +-
src/ats-tool/.gitignore | 1 -
src/ats-tool/Makefile.am | 19 -
src/ats-tool/gnunet-ats.c | 992 -----
src/ats-tool/meson.build | 15 -
src/ats/.gitignore | 6 -
src/ats/Makefile.am | 102 -
src/ats/ats.conf.in | 44 -
src/ats/ats.h | 492 ---
src/ats/ats_api_connectivity.c | 362 --
src/ats/ats_api_performance.c | 946 -----
src/ats/ats_api_scanner.c | 65 -
src/ats/ats_api_scheduling.c | 781 ----
src/ats/experiments/example.exp | 104 -
src/ats/experiments/gnunet_ats_sim_default.conf | 18 -
src/ats/experiments/set_preference.exp | 95 -
src/ats/gnunet-ats-solver-eval.c | 3588 ------------------
src/ats/gnunet-ats-solver-eval.h | 335 --
src/ats/gnunet-service-ats.c | 538 ---
src/ats/gnunet-service-ats.h | 42 -
src/ats/gnunet-service-ats_addresses.c | 686 ----
src/ats/gnunet-service-ats_addresses.h | 490 ---
src/ats/gnunet-service-ats_connectivity.c | 222 --
src/ats/gnunet-service-ats_connectivity.h | 92 -
src/ats/gnunet-service-ats_normalization.c | 299 --
src/ats/gnunet-service-ats_normalization.h | 60 -
src/ats/gnunet-service-ats_performance.c | 282 --
src/ats/gnunet-service-ats_performance.h | 96 -
src/ats/gnunet-service-ats_plugins.c | 582 ---
src/ats/gnunet-service-ats_plugins.h | 149 -
src/ats/gnunet-service-ats_preferences.c | 771 ----
src/ats/gnunet-service-ats_preferences.h | 93 -
src/ats/gnunet-service-ats_reservations.c | 211 --
src/ats/gnunet-service-ats_reservations.h | 72 -
src/ats/gnunet-service-ats_scheduling.c | 195 -
src/ats/gnunet-service-ats_scheduling.h | 100 -
src/ats/meson.build | 58 -
src/ats/perf_ats_simplistic_bandwidth.conf | 27 -
src/ats/perf_ats_simplistic_delay.conf | 8 -
src/ats/perf_ats_solver.c | 1510 --------
src/ats/perf_ats_solver.conf | 28 -
src/ats/perf_ats_solver_proportional.conf | 0
src/ats/plugin_ats_proportional.c | 1243 ------
src/ats/test_ats_api.c | 296 --
src/ats/test_ats_api.conf | 35 -
src/ats/test_ats_api_delayed.conf | 36 -
src/ats/test_ats_api_proportional.conf | 24 -
src/ats/test_ats_lib.c | 1107 ------
src/ats/test_ats_lib.h | 512 ---
src/ats/test_ats_reservation_api.c | 181 -
src/ats/test_ats_solver_default.conf | 2 -
src/ats/test_ats_solver_delayed_proportional.conf | 20 -
src/ats/test_ats_solver_proportional.conf | 19 -
src/ats/test_delay | 18 -
src/cadet/Makefile.am | 135 +-
src/consensus/Makefile.am | 21 +-
src/core/Makefile.am | 1 -
src/dht/Makefile.am | 109 +-
src/dhtu/Makefile.am | 1 -
src/dhtu/plugin_dhtu_gnunet.c | 8 +-
src/fs/Makefile.am | 166 +-
src/hostlist/Makefile.am | 39 +-
src/nse/Makefile.am | 25 +-
src/peerinfo-tool/.gitignore | 2 -
src/peerinfo-tool/Makefile.am | 64 -
src/peerinfo-tool/gnunet-peerinfo.c | 864 -----
src/peerinfo-tool/gnunet-peerinfo_plugins.c | 196 -
src/peerinfo-tool/gnunet-peerinfo_plugins.h | 58 -
src/peerinfo-tool/meson.build | 31 -
src/peerinfo-tool/plugin_rest_peerinfo.c | 842 -----
src/peerinfo-tool/test_gnunet_peerinfo.py.in | 143 -
src/peerinfo-tool/test_gnunet_peerinfo_data.conf | 13 -
src/peerinfo/.gitignore | 6 -
src/peerinfo/Makefile.am | 105 -
src/peerinfo/gnunet-service-peerinfo.c | 1370 -------
src/peerinfo/meson.build | 41 -
src/peerinfo/peerinfo.conf.in | 31 -
src/peerinfo/peerinfo.h | 122 -
src/peerinfo/peerinfo_api.c | 557 ---
src/peerinfo/peerinfo_api_notify.c | 291 --
src/peerinfo/perf_peerinfo_api.c | 193 -
src/peerinfo/test_peerinfo_api.c | 172 -
src/peerinfo/test_peerinfo_api_data.conf | 15 -
src/peerinfo/test_peerinfo_api_friend_only.c | 172 -
.../test_peerinfo_api_notify_friend_only.c | 261 --
src/peerinfo/test_peerinfo_shipped_hellos.c | 144 -
src/regex/Makefile.am | 16 +-
src/secretsharing/Makefile.am | 21 +-
src/topology/Makefile.am | 1 -
src/transport/Makefile.am | 1339 +------
src/transport/communicator-unix.conf | 2 -
src/transport/gnunet-helper-transport-bluetooth.c | 2286 -----------
src/transport/gnunet-helper-transport-wlan-dummy.c | 520 ---
src/transport/gnunet-helper-transport-wlan.c | 2165 -----------
src/transport/gnunet-service-transport.c | 2778 --------------
src/transport/gnunet-service-transport_ats.c | 906 -----
src/transport/gnunet-service-transport_ats.h | 203 -
src/transport/gnunet-service-transport_hello.c | 358 --
src/transport/gnunet-service-transport_hello.h | 102 -
.../gnunet-service-transport_manipulation.c | 586 ---
.../gnunet-service-transport_manipulation.h | 121 -
.../gnunet-service-transport_neighbours.c | 3947 -------------------
.../gnunet-service-transport_neighbours.h | 321 --
src/transport/gnunet-service-transport_plugins.c | 437 ---
src/transport/gnunet-service-transport_plugins.h | 107 -
.../gnunet-service-transport_validation.c | 1819 ---------
.../gnunet-service-transport_validation.h | 146 -
src/transport/gnunet-transport-wlan-receiver.c | 114 -
src/transport/gnunet-transport-wlan-sender.c | 251 --
src/transport/perf_http_peer1.conf | 37 -
src/transport/perf_http_peer2.conf | 40 -
src/transport/perf_https_peer1.conf | 37 -
src/transport/perf_https_peer2.conf | 40 -
src/transport/perf_tcp_peer1.conf | 31 -
src/transport/perf_tcp_peer2.conf | 34 -
src/transport/perf_udp_peer1.conf | 43 -
src/transport/perf_udp_peer2.conf | 48 -
src/transport/perf_unix_peer1.conf | 52 -
src/transport/perf_unix_peer2.conf | 56 -
src/transport/plugin_transport_http.h | 579 ---
src/transport/plugin_transport_http_client.c | 2523 -------------
src/transport/plugin_transport_http_common.c | 903 -----
src/transport/plugin_transport_http_common.h | 272 --
src/transport/plugin_transport_http_server.c | 3603 ------------------
src/transport/plugin_transport_smtp.c | 750 ----
src/transport/plugin_transport_tcp.c | 3967 --------------------
src/transport/plugin_transport_template.c | 565 ---
src/transport/plugin_transport_udp.c | 3897 -------------------
src/transport/plugin_transport_udp.h | 355 --
src/transport/plugin_transport_udp_broadcasting.c | 647 ----
src/transport/plugin_transport_unix.c | 1890 ----------
src/transport/plugin_transport_wlan.c | 2405 ------------
src/transport/plugin_transport_wlan.h | 276 --
src/transport/tcp_connection_legacy.c | 1597 --------
src/transport/tcp_server_legacy.c | 1728 ---------
src/transport/tcp_server_mst_legacy.c | 307 --
src/transport/tcp_service_legacy.c | 1646 --------
src/transport/test_http_common.c | 266 --
src/transport/test_plugin_transport.c | 797 ----
src/transport/test_plugin_transport_data.conf | 47 -
src/transport/test_plugin_transport_data_udp.conf | 1 -
src/transport/test_quota_compliance.c | 321 --
...uota_compliance_bluetooth_asymmetric_peer1.conf | 12 -
...uota_compliance_bluetooth_asymmetric_peer2.conf | 11 -
.../test_quota_compliance_bluetooth_peer1.conf | 30 -
.../test_quota_compliance_bluetooth_peer2.conf | 29 -
src/transport/test_quota_compliance_data.conf | 24 -
...est_quota_compliance_http_asymmetric_peer1.conf | 28 -
...est_quota_compliance_http_asymmetric_peer2.conf | 32 -
.../test_quota_compliance_http_peer1.conf | 28 -
.../test_quota_compliance_http_peer2.conf | 32 -
...st_quota_compliance_https_asymmetric_peer1.conf | 28 -
...st_quota_compliance_https_asymmetric_peer2.conf | 31 -
.../test_quota_compliance_https_peer1.conf | 28 -
.../test_quota_compliance_https_peer2.conf | 31 -
...test_quota_compliance_tcp_asymmetric_peer1.conf | 32 -
...test_quota_compliance_tcp_asymmetric_peer2.conf | 29 -
src/transport/test_quota_compliance_tcp_peer1.conf | 32 -
src/transport/test_quota_compliance_tcp_peer2.conf | 29 -
src/transport/test_quota_compliance_udp_peer1.conf | 29 -
src/transport/test_quota_compliance_udp_peer2.conf | 30 -
...est_quota_compliance_unix_asymmetric_peer1.conf | 28 -
...est_quota_compliance_unix_asymmetric_peer2.conf | 28 -
.../test_quota_compliance_unix_peer1.conf | 27 -
.../test_quota_compliance_unix_peer2.conf | 31 -
...est_quota_compliance_wlan_asymmetric_peer1.conf | 29 -
...est_quota_compliance_wlan_asymmetric_peer2.conf | 29 -
.../test_quota_compliance_wlan_peer1.conf | 29 -
.../test_quota_compliance_wlan_peer2.conf | 29 -
.../test_transport_address_switch_http_peer1.conf | 26 -
.../test_transport_address_switch_http_peer2.conf | 26 -
.../test_transport_address_switch_https_peer1.conf | 44 -
.../test_transport_address_switch_https_peer2.conf | 44 -
src/transport/test_transport_api_blacklisting.c | 206 -
.../test_transport_api_blacklisting_tcp_peer1.conf | 9 -
.../test_transport_api_blacklisting_tcp_peer2.conf | 9 -
.../test_transport_api_bluetooth_peer1.conf | 10 -
.../test_transport_api_bluetooth_peer2.conf | 10 -
src/transport/test_transport_api_disconnect.c | 134 -
.../test_transport_api_disconnect_tcp_peer1.conf | 7 -
.../test_transport_api_disconnect_tcp_peer2.conf | 8 -
src/transport/test_transport_api_http_peer1.conf | 6 -
src/transport/test_transport_api_http_peer2.conf | 6 -
.../test_transport_api_http_reverse_peer1.conf | 11 -
.../test_transport_api_http_reverse_peer2.conf | 12 -
src/transport/test_transport_api_https_peer1.conf | 26 -
src/transport/test_transport_api_https_peer2.conf | 32 -
src/transport/test_transport_api_limited_sockets.c | 132 -
...st_transport_api_limited_sockets_tcp_peer1.conf | 7 -
...st_transport_api_limited_sockets_tcp_peer2.conf | 8 -
.../test_transport_api_manipulation_cfg.c | 186 -
.../test_transport_api_manipulation_cfg_peer1.conf | 8 -
.../test_transport_api_manipulation_cfg_peer2.conf | 8 -
.../test_transport_api_manipulation_recv_tcp.c | 203 -
..._transport_api_manipulation_recv_tcp_peer1.conf | 29 -
..._transport_api_manipulation_recv_tcp_peer2.conf | 29 -
.../test_transport_api_manipulation_send_tcp.c | 199 -
..._transport_api_manipulation_send_tcp_peer1.conf | 29 -
..._transport_api_manipulation_send_tcp_peer2.conf | 29 -
src/transport/test_transport_api_reliability.c | 321 --
..._transport_api_reliability_bluetooth_peer1.conf | 33 -
..._transport_api_reliability_bluetooth_peer2.conf | 32 -
.../test_transport_api_reliability_http_peer1.conf | 33 -
.../test_transport_api_reliability_http_peer2.conf | 30 -
...t_transport_api_reliability_http_xhr_peer1.conf | 34 -
...t_transport_api_reliability_http_xhr_peer2.conf | 30 -
...test_transport_api_reliability_https_peer1.conf | 27 -
...test_transport_api_reliability_https_peer2.conf | 31 -
..._transport_api_reliability_https_xhr_peer1.conf | 28 -
..._transport_api_reliability_https_xhr_peer2.conf | 31 -
...st_transport_api_reliability_tcp_nat_peer1.conf | 35 -
...st_transport_api_reliability_tcp_nat_peer2.conf | 34 -
.../test_transport_api_reliability_tcp_peer1.conf | 29 -
.../test_transport_api_reliability_tcp_peer2.conf | 28 -
.../test_transport_api_reliability_udp_peer1.conf | 29 -
.../test_transport_api_reliability_udp_peer2.conf | 29 -
.../test_transport_api_reliability_unix_peer1.conf | 28 -
.../test_transport_api_reliability_unix_peer2.conf | 28 -
.../test_transport_api_reliability_wlan_peer1.conf | 31 -
.../test_transport_api_reliability_wlan_peer2.conf | 32 -
.../test_transport_api_restart_1peer_peer1.conf | 9 -
.../test_transport_api_restart_1peer_peer2.conf | 9 -
.../test_transport_api_restart_2peers_peer1.conf | 9 -
.../test_transport_api_restart_2peers_peer2.conf | 9 -
.../test_transport_api_restart_reconnect.c | 217 --
.../test_transport_api_slow_ats_peer1.conf | 7 -
.../test_transport_api_slow_ats_peer2.conf | 9 -
src/transport/test_transport_api_timeout.c | 164 -
...test_transport_api_timeout_bluetooth_peer1.conf | 35 -
...test_transport_api_timeout_bluetooth_peer2.conf | 34 -
.../test_transport_api_timeout_http_peer1.conf | 28 -
.../test_transport_api_timeout_http_peer2.conf | 31 -
.../test_transport_api_timeout_https_peer1.conf | 25 -
.../test_transport_api_timeout_https_peer2.conf | 31 -
.../test_transport_api_timeout_tcp_peer1.conf | 30 -
.../test_transport_api_timeout_tcp_peer2.conf | 32 -
.../test_transport_api_timeout_udp_peer1.conf | 33 -
.../test_transport_api_timeout_udp_peer2.conf | 31 -
.../test_transport_api_timeout_unix_peer1.conf | 28 -
.../test_transport_api_timeout_unix_peer2.conf | 28 -
.../test_transport_api_timeout_wlan_peer1.conf | 35 -
.../test_transport_api_timeout_wlan_peer2.conf | 34 -
.../test_transport_api_unix_abstract_peer1.conf | 31 -
.../test_transport_api_unix_abstract_peer2.conf | 31 -
...ransport_api_unreliability_bluetooth_peer1.conf | 30 -
...ransport_api_unreliability_bluetooth_peer2.conf | 29 -
...sport_api_unreliability_constant_udp_peer1.conf | 30 -
...sport_api_unreliability_constant_udp_peer2.conf | 30 -
...est_transport_api_unreliability_wlan_peer1.conf | 29 -
...est_transport_api_unreliability_wlan_peer2.conf | 29 -
src/transport/test_transport_api_wlan_peer1.conf | 35 -
src/transport/test_transport_api_wlan_peer2.conf | 34 -
src/transport/test_transport_blacklisting.c | 582 ---
..._transport_blacklisting_cfg_blp_peer1_full.conf | 16 -
...lacklisting_cfg_blp_peer1_multiple_plugins.conf | 13 -
...ransport_blacklisting_cfg_blp_peer1_plugin.conf | 13 -
..._transport_blacklisting_cfg_blp_peer2_full.conf | 12 -
...lacklisting_cfg_blp_peer2_multiple_plugins.conf | 12 -
...ransport_blacklisting_cfg_blp_peer2_plugin.conf | 12 -
.../test_transport_blacklisting_cfg_peer1.conf | 29 -
.../test_transport_blacklisting_cfg_peer2.conf | 28 -
src/transport/test_transport_testing_restart.c | 163 -
src/transport/transport-testing-filenames.c | 175 -
src/transport/transport-testing-loggers.c | 81 -
src/transport/transport-testing-main.c | 614 ---
src/transport/transport-testing-send.c | 241 --
src/transport/transport-testing.c | 932 -----
src/transport/transport-testing.h | 914 -----
src/transport/transport-testing2.c | 50 +-
src/transport/transport-testing2.h | 11 +-
src/transport/transport_api_address_to_string.c | 264 --
src/transport/transport_api_blacklist.c | 197 -
src/transport/transport_api_core.c | 968 -----
src/transport/transport_api_hello_get.c | 274 --
src/transport/transport_api_manipulation.c | 249 --
src/transport/transport_api_monitor_peers.c | 443 ---
src/transport/transport_api_monitor_plugins.c | 463 ---
src/transport/transport_api_offer_hello.c | 137 -
src/util/container_multihashmap32.c | 1 -
282 files changed, 239 insertions(+), 83665 deletions(-)
diff --git a/configure.ac b/configure.ac
index 27fd913eb..04a366f31 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1228,9 +1228,6 @@ po/Makefile.in
src/Makefile
src/arm/Makefile
src/arm/arm.conf
-src/ats/Makefile
-src/ats/ats.conf
-src/ats-tool/Makefile
src/auction/Makefile
src/block/Makefile
src/cadet/Makefile
@@ -1277,9 +1274,6 @@ src/nat-auto/nat-auto.conf
src/nse/Makefile
src/nse/nse.conf
src/nt/Makefile
-src/peerinfo/Makefile
-src/peerinfo/peerinfo.conf
-src/peerinfo-tool/Makefile
src/peerstore/Makefile
src/peerstore/peerstore.conf
src/pq/Makefile
@@ -1326,7 +1320,6 @@ src/messenger/Makefile
src/messenger/messenger.conf
pkgconfig/Makefile
pkgconfig/gnunetarm.pc
-pkgconfig/gnunetats.pc
pkgconfig/gnunetblock.pc
pkgconfig/gnunetcadet.pc
pkgconfig/gnunetconsensus.pc
@@ -1348,7 +1341,6 @@ pkgconfig/gnunetmicrophone.pc
pkgconfig/gnunetnamestore.pc
pkgconfig/gnunetnat.pc
pkgconfig/gnunetnse.pc
-pkgconfig/gnunetpeerinfo.pc
pkgconfig/gnunetpq.pc
pkgconfig/gnunetregex.pc
pkgconfig/gnunetrevocation.pc
diff --git a/pkgconfig/Makefile.am b/pkgconfig/Makefile.am
index eeb048fb8..1759ae5fc 100644
--- a/pkgconfig/Makefile.am
+++ b/pkgconfig/Makefile.am
@@ -1,7 +1,6 @@
# This Makefile.am is in the public domain
pcfiles = \
gnunetarm.pc \
- gnunetats.pc \
gnunetblock.pc \
gnunetconsensus.pc \
gnunetconversation.pc \
@@ -23,7 +22,6 @@ pcfiles = \
gnunetnamestore.pc \
gnunetnat.pc \
gnunetnse.pc \
- gnunetpeerinfo.pc \
gnunetregex.pc \
gnunetrevocation.pc \
gnunetrps.pc \
@@ -44,7 +42,6 @@ pkgconfig_DATA = $(pcfiles)
EXTRA_DIST = \
gnunetarm.pc.in \
- gnunetats.pc.in \
gnunetblock.pc.in \
gnunetconsensus.pc.in \
gnunetconversation.pc.in \
@@ -66,7 +63,6 @@ EXTRA_DIST = \
gnunetnamestore.pc.in \
gnunetnat.pc.in \
gnunetnse.pc.in \
- gnunetpeerinfo.pc.in \
gnunetpostgres.pc.in \
gnunetregex.pc.in \
gnunetrevocation.pc.in \
diff --git a/po/POTFILES.in b/po/POTFILES.in
index a9fbe6984..e275d112c 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -9,22 +9,6 @@ src/arm/arm_monitor_api.c
src/arm/gnunet-arm.c
src/arm/gnunet-service-arm.c
src/arm/mockup-service.c
-src/ats-tool/gnunet-ats.c
-src/ats/ats_api_connectivity.c
-src/ats/ats_api_performance.c
-src/ats/ats_api_scanner.c
-src/ats/ats_api_scheduling.c
-src/ats/gnunet-ats-solver-eval.c
-src/ats/gnunet-service-ats.c
-src/ats/gnunet-service-ats_addresses.c
-src/ats/gnunet-service-ats_connectivity.c
-src/ats/gnunet-service-ats_normalization.c
-src/ats/gnunet-service-ats_performance.c
-src/ats/gnunet-service-ats_plugins.c
-src/ats/gnunet-service-ats_preferences.c
-src/ats/gnunet-service-ats_reservations.c
-src/ats/gnunet-service-ats_scheduling.c
-src/ats/plugin_ats_proportional.c
src/auction/gnunet-auction-create.c
src/auction/gnunet-auction-info.c
src/auction/gnunet-auction-join.c
@@ -273,12 +257,6 @@ src/nse/gnunet-nse.c
src/nse/gnunet-service-nse.c
src/nse/nse_api.c
src/nt/nt.c
-src/peerinfo-tool/gnunet-peerinfo.c
-src/peerinfo-tool/gnunet-peerinfo_plugins.c
-src/peerinfo-tool/plugin_rest_peerinfo.c
-src/peerinfo/gnunet-service-peerinfo.c
-src/peerinfo/peerinfo_api.c
-src/peerinfo/peerinfo_api_notify.c
src/peerstore/gnunet-peerstore.c
src/peerstore/gnunet-service-peerstore.c
src/peerstore/peerstore_api.c
@@ -449,64 +427,25 @@ src/transport/gnunet-communicator-quic.c
src/transport/gnunet-communicator-tcp.c
src/transport/gnunet-communicator-udp.c
src/transport/gnunet-communicator-unix.c
-src/transport/gnunet-helper-transport-bluetooth.c
-src/transport/gnunet-helper-transport-wlan-dummy.c
-src/transport/gnunet-helper-transport-wlan.c
src/transport/gnunet-service-tng.c
-src/transport/gnunet-service-transport.c
-src/transport/gnunet-service-transport_ats.c
-src/transport/gnunet-service-transport_hello.c
-src/transport/gnunet-service-transport_manipulation.c
-src/transport/gnunet-service-transport_neighbours.c
-src/transport/gnunet-service-transport_plugins.c
-src/transport/gnunet-service-transport_validation.c
src/transport/gnunet-transport-profiler.c
-src/transport/gnunet-transport-wlan-receiver.c
-src/transport/gnunet-transport-wlan-sender.c
src/transport/gnunet-transport.c
-src/transport/plugin_transport_http_client.c
-src/transport/plugin_transport_http_common.c
-src/transport/plugin_transport_http_server.c
-src/transport/plugin_transport_smtp.c
-src/transport/plugin_transport_tcp.c
-src/transport/plugin_transport_template.c
-src/transport/plugin_transport_udp.c
-src/transport/plugin_transport_udp_broadcasting.c
-src/transport/plugin_transport_unix.c
-src/transport/plugin_transport_wlan.c
-src/transport/tcp_connection_legacy.c
-src/transport/tcp_server_legacy.c
-src/transport/tcp_server_mst_legacy.c
-src/transport/tcp_service_legacy.c
src/transport/transport-testing-communicator.c
-src/transport/transport-testing-filenames.c
src/transport/transport-testing-filenames2.c
-src/transport/transport-testing-loggers.c
src/transport/transport-testing-loggers2.c
-src/transport/transport-testing-main.c
src/transport/transport-testing-main2.c
-src/transport/transport-testing-send.c
src/transport/transport-testing-send2.c
-src/transport/transport-testing.c
src/transport/transport-testing2.c
src/transport/transport_api2_application.c
src/transport/transport_api2_communication.c
src/transport/transport_api2_core.c
src/transport/transport_api2_monitor.c
-src/transport/transport_api_address_to_string.c
-src/transport/transport_api_blacklist.c
src/transport/transport_api_cmd_backchannel_check.c
src/transport/transport_api_cmd_connecting_peers.c
src/transport/transport_api_cmd_send_simple.c
src/transport/transport_api_cmd_send_simple_performance.c
src/transport/transport_api_cmd_start_peer.c
src/transport/transport_api_cmd_stop_peer.c
-src/transport/transport_api_core.c
-src/transport/transport_api_hello_get.c
-src/transport/transport_api_manipulation.c
-src/transport/transport_api_monitor_peers.c
-src/transport/transport_api_monitor_plugins.c
-src/transport/transport_api_offer_hello.c
src/transport/transport_api_traits.c
src/util/bandwidth.c
src/util/benchmark.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 8fb984d4b..b0064688a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,7 +1,7 @@
# This Makefile.am is in the public domain
TESTING = testing
-TESTBED = testbed-logger testbed
+#TESTBED = testbed-logger testbed
if HAVE_EXPERIMENTAL
EXP_DIR = \
@@ -44,21 +44,17 @@ SUBDIRS = \
$(JSON_DIR) \
$(CURL_DIR) \
$(REST_DIR) \
- peerinfo \
$(SQLITE_DIR) \
$(POSTGRES_DIR) \
datacache \
datastore \
template \
peerstore \
- ats \
nat \
nat-auto \
fragmentation \
transport \
- ats-tool \
core \
- $(TESTBED) \
nse \
dhtu \
dht \
@@ -70,7 +66,6 @@ SUBDIRS = \
gnsrecord \
namecache \
namestore \
- peerinfo-tool \
cadet \
set \
seti \
diff --git a/src/ats-tool/.gitignore b/src/ats-tool/.gitignore
deleted file mode 100644
index 2de03f0e8..000000000
--- a/src/ats-tool/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-gnunet-ats
diff --git a/src/ats-tool/Makefile.am b/src/ats-tool/Makefile.am
deleted file mode 100644
index 3bb99aa08..000000000
--- a/src/ats-tool/Makefile.am
+++ /dev/null
@@ -1,19 +0,0 @@
-# This Makefile.am is in the public domain
-AM_CPPFLAGS = -I$(top_srcdir)/src/include
-
-if USE_COVERAGE
- AM_CFLAGS = -fprofile-arcs -ftest-coverage
-endif
-
-bin_PROGRAMS = \
- gnunet-ats
-
-gnunet_ats_SOURCES = \
- gnunet-ats.c
-gnunet_ats_LDADD = \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/transport/libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(GN_LIBINTL)
diff --git a/src/ats-tool/gnunet-ats.c b/src/ats-tool/gnunet-ats.c
deleted file mode 100644
index 169daa6f1..000000000
--- a/src/ats-tool/gnunet-ats.c
+++ /dev/null
@@ -1,992 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009--2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file ats-tool/gnunet-ats.c
- * @brief ATS command line tool
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_ats_service.h"
-#include "gnunet_transport_service.h"
-
-/**
- * String to respresent unlimited
- */
-#define UNLIMITED_STRING "unlimited"
-
-
-/**
- * CLI Opt:
- */
-static int opt_resolve_addresses_numeric;
-
-/**
- * CLI Opt: Print verbose ATS information
- */
-static int opt_verbose;
-
-/**
- * CLI Option: List only addresses currently used (active)
- */
-static int opt_list_used;
-
-/**
- * CLI Option: List all addresses
- */
-static int opt_list_all;
-
-/**
- * CLI Option: set preference
- */
-static int opt_set_pref;
-
-/**
- * CLI Option: print quotas configured
- */
-static int opt_print_quotas;
-
-/**
- * CLI Option: Monitor addresses used
- */
-static int opt_monitor;
-
-/**
- * CLI Option: use specific peer
- */
-static char *opt_pid_str;
-
-/**
- * CLI Option: preference type to set
- */
-static char *opt_type_str;
-
-/**
- * CLI Option: preference value to set
- */
-static unsigned int opt_pref_value;
-
-/**
- * Final status code.
- */
-static int ret;
-
-/**
- * Number of results returned from service
- */
-static int stat_results;
-
-/**
- * State: all pending receive operations done?
- */
-static int stat_receive_done;
-
-/**
- * State: number of pending operations
- */
-static int stat_pending;
-
-/**
- * Which peer should we connect to?
- */
-static char *cpid_str;
-
-/**
- * ATS performance handle used
- */
-static struct GNUNET_ATS_PerformanceHandle *ph;
-
-/**
- * Our connectivity handle.
- */
-static struct GNUNET_ATS_ConnectivityHandle *ats_ch;
-
-/**
- * Handle for address suggestion request.
- */
-static struct GNUNET_ATS_ConnectivitySuggestHandle *ats_sh;
-
-/**
- * ATS address list handle used
- */
-static struct GNUNET_ATS_AddressListHandle *alh;
-
-/**
- * Configuration handle
- */
-static struct GNUNET_CONFIGURATION_Handle *cfg;
-
-/**
- * Shutdown task
- */
-static struct GNUNET_SCHEDULER_Task *shutdown_task;
-
-/**
- * Hashmap to store addresses
- */
-static struct GNUNET_CONTAINER_MultiPeerMap *addresses;
-
-
-/**
- * Structure used to remember all pending address resolutions.
- * We keep address information in here while we talk to transport
- * to map the address to a string.
- */
-struct PendingResolutions
-{
- /**
- * Kept in a DLL.
- */
- struct PendingResolutions *next;
-
- /**
- * Kept in a DLL.
- */
- struct PendingResolutions *prev;
-
- /**
- * Copy of the address we are resolving.
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * Handle to the transport request to convert the address
- * to a string.
- */
- struct GNUNET_TRANSPORT_AddressToStringContext *tats_ctx;
-
- /**
- * Performance data.
- */
- struct GNUNET_ATS_Properties properties;
-
- /**
- * Amount of outbound bandwidth assigned by ATS.
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out;
-
- /**
- * Amount of inbound bandwidth assigned by ATS.
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in;
-
- /**
- * Is this an active address?
- */
- int active;
-};
-
-
-/**
- * Information we keep for an address. Used to avoid
- * printing the same data multiple times.
- */
-struct ATSAddress
-{
- /**
- * Address information.
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * Current outbound bandwidth.
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out;
-
- /**
- * Current inbound bandwidth.
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in;
-
- /**
- * Is this an active address?
- */
- int active;
-};
-
-
-/**
- * Head of list of pending resolution requests.
- */
-static struct PendingResolutions *head;
-
-/**
- * Tail of list of pending resolution requests.
- */
-static struct PendingResolutions *tail;
-
-
-/**
- * Free address corresponding to a given peer.
- *
- * @param cls NULL
- * @param key peer identity
- * @param value the `struct ATSAddress *` to be freed
- * @return #GNUNET_YES (always)
- */
-static int
-free_addr_it (void *cls, const struct GNUNET_PeerIdentity *key, void *value)
-{
- struct ATSAddress *a = value;
-
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_remove (addresses, key, value));
- GNUNET_HELLO_address_free (a->address);
- GNUNET_free (a);
- return GNUNET_OK;
-}
-
-
-/**
- * Task run on shutdown.
- *
- * @param cls NULL
- */
-static void
-end (void *cls)
-{
- struct PendingResolutions *pr;
- struct PendingResolutions *next;
- unsigned int pending;
-
- if (NULL != alh)
- {
- GNUNET_ATS_performance_list_addresses_cancel (alh);
- alh = NULL;
- }
-
- if (NULL != ph)
- {
- GNUNET_ATS_performance_done (ph);
- ph = NULL;
- }
-
- pending = 0;
- next = head;
- while (NULL != (pr = next))
- {
- next = pr->next;
- GNUNET_CONTAINER_DLL_remove (head, tail, pr);
- GNUNET_TRANSPORT_address_to_string_cancel (pr->tats_ctx);
- GNUNET_free (pr->address);
- GNUNET_free (pr);
- pending++;
- }
- GNUNET_CONTAINER_multipeermap_iterate (addresses, &free_addr_it, NULL);
- GNUNET_CONTAINER_multipeermap_destroy (addresses);
- addresses = NULL;
-
- if (0 < pending)
- fprintf (stdout, _ ("%u address resolutions had a timeout\n"), pending);
- if (opt_list_used || opt_list_all)
- fprintf (stdout,
- _ ("ATS returned stat_results for %u addresses\n"),
- stat_results);
-
- if (NULL != ats_sh)
- {
- GNUNET_ATS_connectivity_suggest_cancel (ats_sh);
- ats_sh = NULL;
- }
- if (NULL != ats_ch)
- {
- GNUNET_ATS_connectivity_done (ats_ch);
- ats_ch = NULL;
- }
- ret = 0;
-}
-
-
-/**
- * Function to call with a textual representation of an address. This
- * function will be called several times with different possible
- * textual representations, and a last time with @a address being NULL
- * to signal the end of the iteration. Note that @a address NULL
- * always is the last call, regardless of the value in @a res.
- *
- * @param cls closure, a `struct PendingResolutions *`
- * @param address NULL on end of iteration,
- * otherwise 0-terminated printable UTF-8 string,
- * in particular an empty string if @a res is #GNUNET_NO
- * @param res result of the address to string conversion:
- * if #GNUNET_OK: conversion successful
- * if #GNUNET_NO: address was invalid (or not supported)
- * if #GNUNET_SYSERR: communication error (IPC error)
- */
-static void
-transport_addr_to_str_cb (void *cls, const char *address, int res)
-{
- struct PendingResolutions *pr = cls;
-
- if (NULL == address)
- {
- /* We're done */
- GNUNET_CONTAINER_DLL_remove (head, tail, pr);
- GNUNET_free (pr->address);
- GNUNET_free (pr);
- stat_pending--;
-
- if ((GNUNET_YES == stat_receive_done) && (0 == stat_pending))
- {
- /* All messages received and no resolutions pending*/
- if (shutdown_task != NULL)
- GNUNET_SCHEDULER_cancel (shutdown_task);
- shutdown_task = GNUNET_SCHEDULER_add_now (&end, NULL);
- }
- return;
- }
- switch (res)
- {
- case GNUNET_SYSERR:
- fprintf (
- stderr,
- "Failed to convert address for peer `%s' plugin `%s' length %u to string
(communication error)\n",
- GNUNET_i2s (&pr->address->peer),
- pr->address->transport_name,
- (unsigned int) pr->address->address_length);
- return;
-
- case GNUNET_NO:
- fprintf (
- stderr,
- "Failed to convert address for peer `%s' plugin `%s' length %u to string
(address invalid or not supported)\n",
- GNUNET_i2s (&pr->address->peer),
- pr->address->transport_name,
- (unsigned int) pr->address->address_length);
- return;
-
- case GNUNET_OK:
- /* continues below */
- break;
-
- default:
- GNUNET_break (0);
- return;
- }
-
- fprintf (
- stdout,
- _ (
- "Peer `%s' plugin `%s', address `%s', `%s' bw out: %u Bytes/s, bw in %u
Bytes/s, %s\n"),
- GNUNET_i2s (&pr->address->peer),
- pr->address->transport_name,
- address,
- GNUNET_NT_to_string (pr->properties.scope),
- ntohl (pr->bandwidth_out.value__),
- ntohl (pr->bandwidth_in.value__),
- pr->active ? _ ("active ") : _ ("inactive "));
-}
-
-
-/**
- * Closure for #find_address_it().
- */
-struct AddressFindCtx
-{
- /**
- * Address we are looking for.
- */
- const struct GNUNET_HELLO_Address *src;
-
- /**
- * Where to write the `struct ATSAddress` if we found one that matches.
- */
- struct ATSAddress *res;
-};
-
-
-/**
- * Find address corresponding to a given peer.
- *
- * @param cls the `struct AddressFindCtx *`
- * @param key peer identity
- * @param value the `struct ATSAddress *` for an existing address
- * @return #GNUNET_NO if we found a match, #GNUNET_YES if not
- */
-static int
-find_address_it (void *cls, const struct GNUNET_PeerIdentity *key, void *value)
-{
- struct AddressFindCtx *actx = cls;
- struct ATSAddress *exist = value;
-
- if (0 == GNUNET_HELLO_address_cmp (actx->src, exist->address))
- {
- actx->res = exist;
- return GNUNET_NO;
- }
- return GNUNET_YES;
-}
-
-
-/**
- * Signature of a function that is called with QoS information about an
address.
- *
- * @param cls closure (NULL)
- * @param address the address, NULL if ATS service was disconnected
- * @param active #GNUNET_YES if this address is actively used
- * to maintain a connection to a peer;
- * #GNUNET_NO if the address is not actively used;
- * #GNUNET_SYSERR if this address is no longer available for ATS
- * @param bandwidth_out assigned outbound bandwidth for the connection
- * @param bandwidth_in assigned inbound bandwidth for the connection
- * @param prop performance data for the address (as far as known)
- */
-static void
-ats_perf_mon_cb (void *cls,
- const struct GNUNET_HELLO_Address *address,
- int active,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
- const struct GNUNET_ATS_Properties *prop)
-{
- struct PendingResolutions *pr;
- struct PendingResolutions *cur;
- struct PendingResolutions *next;
-
- if (NULL == address)
- {
- /* ATS service temporarily disconnected, remove current state */
- next = head;
- for (cur = next; NULL != cur; cur = next)
- {
- next = cur->next;
- GNUNET_CONTAINER_DLL_remove (head, tail, cur);
- GNUNET_TRANSPORT_address_to_string_cancel (cur->tats_ctx);
- GNUNET_HELLO_address_free (cur->address);
- GNUNET_free (cur);
- }
- GNUNET_CONTAINER_multipeermap_iterate (addresses, &free_addr_it, NULL);
- return;
- }
- if (GNUNET_SYSERR == active)
- {
- /* remove address */
- struct AddressFindCtx actx;
-
- actx.src = address;
- actx.res = NULL;
- GNUNET_CONTAINER_multipeermap_get_multiple (addresses,
- &address->peer,
- &find_address_it,
- &actx);
- if (NULL == actx.res)
- {
- GNUNET_break (0);
- return;
- }
- GNUNET_break (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_remove (addresses,
- &address->peer,
- actx.res));
- fprintf (stdout,
- _ ("Removed address of peer `%s' with plugin `%s'\n"),
- GNUNET_i2s (&address->peer),
- actx.res->address->transport_name);
- GNUNET_HELLO_address_free (actx.res);
- return;
- }
-
- if (GNUNET_NO == opt_verbose)
- {
- struct AddressFindCtx actx;
- struct ATSAddress *a;
-
- actx.src = address;
- actx.res = NULL;
- GNUNET_CONTAINER_multipeermap_get_multiple (addresses,
- &address->peer,
- &find_address_it,
- &actx);
- if ((NULL != actx.res))
- {
- if ((bandwidth_in.value__ == actx.res->bandwidth_in.value__) &&
- (bandwidth_out.value__ == actx.res->bandwidth_out.value__) &&
- (active == actx.res->active))
- {
- return; /* Nothing to do here */
- }
- else
- {
- actx.res->bandwidth_in = bandwidth_in;
- actx.res->bandwidth_out = bandwidth_out;
- }
- }
- else
- {
- a = GNUNET_new (struct ATSAddress);
-
- a->address = GNUNET_HELLO_address_copy (address);
- a->bandwidth_in = bandwidth_in;
- a->bandwidth_out = bandwidth_out;
- a->active = active;
- GNUNET_CONTAINER_multipeermap_put (
- addresses,
- &address->peer,
- a,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
- }
- }
-
- pr = GNUNET_new (struct PendingResolutions);
- pr->properties = *prop;
- pr->address = GNUNET_HELLO_address_copy (address);
- pr->bandwidth_in = bandwidth_in;
- pr->bandwidth_out = bandwidth_out;
- pr->active = active;
- pr->tats_ctx = GNUNET_TRANSPORT_address_to_string (
- cfg,
- address,
- opt_resolve_addresses_numeric,
- GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10),
- &transport_addr_to_str_cb,
- pr);
- GNUNET_CONTAINER_DLL_insert (head, tail, pr);
- stat_results++;
- stat_pending++;
-}
-
-
-/**
- * Signature of a function that is called with QoS information about an
address.
- *
- * @param cls closure (NULL)
- * @param address the address, NULL if ATS service was disconnected
- * @param active is this address actively used to maintain a connection
- to a peer
- * @param bandwidth_out assigned outbound bandwidth for the connection
- * @param bandwidth_in assigned inbound bandwidth for the connection
- * @param prop performance data for the address (as far as known)
- */
-static void
-ats_perf_cb (void *cls,
- const struct GNUNET_HELLO_Address *address,
- int active,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
- const struct GNUNET_ATS_Properties *prop)
-{
- struct PendingResolutions *pr;
-
- if (NULL == address)
- {
- /* All messages received */
- stat_receive_done = GNUNET_YES;
- alh = NULL;
- if (0 == stat_pending)
- {
- /* All messages received and no resolutions pending*/
- if (shutdown_task != NULL)
- GNUNET_SCHEDULER_cancel (shutdown_task);
- shutdown_task = GNUNET_SCHEDULER_add_now (&end, NULL);
- }
- return;
- }
-
- pr = GNUNET_new (struct PendingResolutions);
- pr->properties = *prop;
- pr->address = GNUNET_HELLO_address_copy (address);
- pr->bandwidth_in = bandwidth_in;
- pr->bandwidth_out = bandwidth_out;
- pr->active = active;
- pr->tats_ctx = GNUNET_TRANSPORT_address_to_string (
- cfg,
- address,
- opt_resolve_addresses_numeric,
- GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10),
- &transport_addr_to_str_cb,
- pr);
- GNUNET_CONTAINER_DLL_insert (head, tail, pr);
- stat_results++;
- stat_pending++;
-}
-
-
-/**
- * Print information about the quotas configured for the various
- * network scopes.
- *
- * @param cfg configuration to obtain quota information from
- * @return total number of ATS network types known
- */
-static unsigned int
-print_quotas (const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- char *entry_in = NULL;
- char *entry_out = NULL;
- char *quota_out_str;
- char *quota_in_str;
- unsigned long long int quota_out;
- unsigned long long int quota_in;
- int c;
-
- for (c = 0; (c < GNUNET_NT_COUNT); c++)
- {
- GNUNET_asprintf (&entry_out, "%s_QUOTA_OUT", GNUNET_NT_to_string (c));
- GNUNET_asprintf (&entry_in, "%s_QUOTA_IN", GNUNET_NT_to_string (c));
-
- /* quota out */
- if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (cfg,
- "ats",
- entry_out,
- "a_out_str))
- {
- if ((0 == strcmp (quota_out_str, UNLIMITED_STRING)) ||
- (GNUNET_SYSERR ==
- GNUNET_STRINGS_fancy_size_to_bytes (quota_out_str, "a_out)))
- quota_out = UINT32_MAX;
-
- GNUNET_free (quota_out_str);
- GNUNET_asprintf ("a_out_str, "%llu", quota_out);
- }
- else
- {
- fprintf (stderr,
- "Outbound quota for network `%11s' not configured!\n",
- GNUNET_NT_to_string (c));
- GNUNET_asprintf ("a_out_str, "-");
- }
- GNUNET_free (entry_out);
-
- /* quota in */
- if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (cfg,
- "ats",
- entry_in,
- "a_in_str))
- {
- if ((0 == strcmp (quota_in_str, UNLIMITED_STRING)) ||
- (GNUNET_SYSERR ==
- GNUNET_STRINGS_fancy_size_to_bytes (quota_in_str, "a_in)))
- quota_in = UINT32_MAX;
- GNUNET_free (quota_in_str);
- GNUNET_asprintf ("a_in_str, "%llu", quota_in);
- }
- else
- {
- fprintf (stderr,
- "Inbound quota for network `%11s' not configured!\n",
- GNUNET_NT_to_string (c));
- GNUNET_asprintf ("a_in_str, "-");
- }
- GNUNET_free (entry_in);
-
- fprintf (stdout,
- _ ("Quota for network `%11s' (in/out): %10s / %10s\n"),
- GNUNET_NT_to_string (c),
- quota_in_str,
- quota_out_str);
- GNUNET_free (quota_out_str);
- GNUNET_free (quota_in_str);
- }
- return GNUNET_NT_COUNT;
-}
-
-
-/**
- * Main function that will be run by the scheduler.
- *
- * @param cls closure
- * @param args remaining command-line arguments
- * @param cfgfile name of the configuration file used (for saving, can be
NULL!)
- * @param my_cfg configuration
- */
-static void
-run (void *cls,
- char *const *args,
- const char *cfgfile,
- const struct GNUNET_CONFIGURATION_Handle *my_cfg)
-{
- struct GNUNET_PeerIdentity pid;
- struct GNUNET_PeerIdentity cpid;
- unsigned int c;
- unsigned int type;
-
- cfg = (struct GNUNET_CONFIGURATION_Handle *) my_cfg;
- addresses = GNUNET_CONTAINER_multipeermap_create (10, GNUNET_NO);
- stat_results = 0;
-
- c = 0;
- if (NULL != opt_pid_str)
- {
- if (GNUNET_OK !=
- GNUNET_CRYPTO_eddsa_public_key_from_string (opt_pid_str,
- strlen (opt_pid_str),
- &pid.public_key))
- {
- fprintf (stderr, _ ("Failed to parse peer identity `%s'\n"),
opt_pid_str);
- return;
- }
- }
- if (NULL != cpid_str)
- {
- if (GNUNET_OK !=
- GNUNET_CRYPTO_eddsa_public_key_from_string (cpid_str,
- strlen (cpid_str),
- &cpid.public_key))
- {
- fprintf (stderr, _ ("Failed to parse peer identity `%s'\n"), cpid_str);
- return;
- }
- c++;
- }
-
- c += opt_list_all + opt_list_used + opt_monitor + opt_set_pref;
-
- if (1 < c)
- {
- fprintf (stderr,
- _ ("Please select one operation: %s or %s or %s or %s or %s\n"),
- "--used",
- "--all",
- "--monitor",
- "--preference",
- "--quotas");
- return;
- }
- if (0 == c)
- opt_list_used = GNUNET_YES; /* set default */
- if (opt_print_quotas)
- {
- ret = print_quotas (cfg);
- return;
- }
- if (opt_list_all)
- {
- ph = GNUNET_ATS_performance_init (cfg, NULL, NULL);
- if (NULL == ph)
- {
- fprintf (stderr, "%s", _ ("Cannot connect to ATS service,
exiting...\n"));
- return;
- }
- alh = GNUNET_ATS_performance_list_addresses (ph,
- (NULL == opt_pid_str) ? NULL
- : &pid,
- GNUNET_YES,
- &ats_perf_cb,
- NULL);
- if (NULL == alh)
- {
- fprintf (stderr,
- "%s",
- _ ("Cannot issue request to ATS service, exiting...\n"));
- shutdown_task = GNUNET_SCHEDULER_add_now (&end, NULL);
- return;
- }
- shutdown_task = GNUNET_SCHEDULER_add_shutdown (&end, NULL);
- return;
- }
- if (opt_list_used)
- {
- ph = GNUNET_ATS_performance_init (cfg, NULL, NULL);
- if (NULL == ph)
- fprintf (stderr, "%s", _ ("Cannot connect to ATS service,
exiting...\n"));
-
- alh = GNUNET_ATS_performance_list_addresses (ph,
- (NULL == opt_pid_str) ? NULL
- : &pid,
- GNUNET_NO,
- &ats_perf_cb,
- NULL);
- if (NULL == alh)
- {
- fprintf (stderr,
- "%s",
- _ ("Cannot issue request to ATS service, exiting...\n"));
- shutdown_task = GNUNET_SCHEDULER_add_now (&end, NULL);
- return;
- }
- shutdown_task = GNUNET_SCHEDULER_add_shutdown (&end, NULL);
- return;
- }
- if (opt_monitor)
- {
- ph = GNUNET_ATS_performance_init (cfg, &ats_perf_mon_cb, NULL);
- shutdown_task = GNUNET_SCHEDULER_add_shutdown (&end, NULL);
- if (NULL == ph)
- {
- fprintf (stderr, "%s", _ ("Cannot connect to ATS service,
exiting...\n"));
- GNUNET_SCHEDULER_shutdown ();
- }
- return;
- }
- if (opt_set_pref)
- {
- if (NULL == opt_type_str)
- {
- fprintf (stderr, "%s", _ ("No preference type given!\n"));
- return;
- }
- if (NULL == opt_pid_str)
- {
- fprintf (stderr, "%s", _ ("No peer given!\n"));
- return;
- }
-
- for (c = 0; c < strlen (opt_type_str); c++)
- {
- if (isupper ((unsigned char) opt_type_str[c]))
- opt_type_str[c] = tolower ((unsigned char) opt_type_str[c]);
- }
-
- if (0 == strcasecmp ("latency", opt_type_str))
- type = GNUNET_ATS_PREFERENCE_LATENCY;
- else if (0 == strcasecmp ("bandwidth", opt_type_str))
- type = GNUNET_ATS_PREFERENCE_BANDWIDTH;
- else
- {
- fprintf (stderr, "%s", _ ("Valid type required\n"));
- return;
- }
-
- /* set */
- ph = GNUNET_ATS_performance_init (cfg, NULL, NULL);
- if (NULL == ph)
- fprintf (stderr, "%s", _ ("Cannot connect to ATS service,
exiting...\n"));
-
- GNUNET_ATS_performance_change_preference (ph,
- &pid,
- type,
- (double) opt_pref_value,
- GNUNET_ATS_PREFERENCE_END);
-
- shutdown_task =
- GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &end, NULL);
- return;
- }
- if (NULL != cpid_str)
- {
- ats_ch = GNUNET_ATS_connectivity_init (cfg);
- ats_sh = GNUNET_ATS_connectivity_suggest (ats_ch, &cpid, 1000);
- shutdown_task =
- GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &end, NULL);
- return;
- }
- ret = 1;
-}
-
-
-/**
- * The main function.
- *
- * @param argc number of arguments from the command line
- * @param argv command line arguments
- * @return 0 ok, 1 on error
- */
-int
-main (int argc, char *const *argv)
-{
- int res;
-
- opt_resolve_addresses_numeric = GNUNET_NO;
- opt_monitor = GNUNET_NO;
- opt_list_all = GNUNET_NO;
- opt_list_used = GNUNET_NO;
- opt_set_pref = GNUNET_NO;
- stat_pending = 0;
- stat_receive_done = GNUNET_NO;
- opt_type_str = NULL;
-
- struct GNUNET_GETOPT_CommandLineOption options[] =
- { GNUNET_GETOPT_option_flag ('u',
- "used",
- gettext_noop (
- "get list of active addresses currently
used"),
- &opt_list_used),
- GNUNET_GETOPT_option_flag ('a',
- "all",
- gettext_noop (
- "get list of all active addresses"),
- &opt_list_all),
-
- GNUNET_GETOPT_option_string ('C',
- "connect",
- NULL,
- gettext_noop ("connect to PEER"),
- &cpid_str),
- GNUNET_GETOPT_option_flag ('n',
- "numeric",
- gettext_noop (
- "do not resolve IP addresses to hostnames"),
- &opt_resolve_addresses_numeric),
-
- GNUNET_GETOPT_option_flag ('m',
- "monitor",
- gettext_noop ("monitor mode"),
- &opt_monitor),
-
- GNUNET_GETOPT_option_flag ('p',
- "preference",
- gettext_noop (
- "set preference for the given peer"),
- &opt_set_pref),
-
- GNUNET_GETOPT_option_flag ('q',
- "quotas",
- gettext_noop ("print all configured quotas"),
- &opt_print_quotas),
- GNUNET_GETOPT_option_string ('i',
- "id",
- "TYPE",
- gettext_noop ("peer id"),
- &opt_pid_str),
-
- GNUNET_GETOPT_option_string ('t',
- "type",
- "TYPE",
- gettext_noop (
- "preference type to set: latency |
bandwidth"),
- &opt_type_str),
-
- GNUNET_GETOPT_option_uint ('k',
- "value",
- "VALUE",
- gettext_noop ("preference value"),
- &opt_pref_value),
-
- GNUNET_GETOPT_option_flag (
- 'V',
- "verbose",
- gettext_noop ("verbose output (include ATS address properties)"),
- &opt_verbose),
- GNUNET_GETOPT_OPTION_END };
-
- if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
- return 2;
-
- res = GNUNET_PROGRAM_run (argc,
- argv,
- "gnunet-ats",
- gettext_noop ("Print information about ATS state"),
- options,
- &run,
- NULL);
- GNUNET_free (opt_pid_str);
- GNUNET_free (opt_type_str);
- GNUNET_free_nz ((void *) argv);
-
- if (GNUNET_OK == res)
- return ret;
- else
- return 1;
-}
-
-
-/* end of gnunet-ats.c */
diff --git a/src/ats-tool/meson.build b/src/ats-tool/meson.build
deleted file mode 100644
index 6b6df7b3d..000000000
--- a/src/ats-tool/meson.build
+++ /dev/null
@@ -1,15 +0,0 @@
-if get_option('monolith')
- subdir_done()
-endif
-
-executable ('gnunet-ats',
- ['gnunet-ats.c'],
- dependencies: [libgnunetats_dep, libgnunetutil_dep,
- libgnunettransport_dep,
- libgnunetnt_dep,
- libgnunethello_dep
- ],
- include_directories: [incdir, configuration_inc],
- install: true,
- install_dir: get_option('bindir'))
-
diff --git a/src/ats/.gitignore b/src/ats/.gitignore
deleted file mode 100644
index fa72eb136..000000000
--- a/src/ats/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-gnunet-service-ats
-test_ats_api_proportional
-test_ats_reservation_api_proportional
-test_ats_api_mlp
-test_ats_api_ril
-gnunet-service-ats-new
diff --git a/src/ats/Makefile.am b/src/ats/Makefile.am
deleted file mode 100644
index 85a2bb555..000000000
--- a/src/ats/Makefile.am
+++ /dev/null
@@ -1,102 +0,0 @@
-# This Makefile.am is in the public domain
-AM_CPPFLAGS = -I$(top_srcdir)/src/include
-
-plugindir = $(libdir)/gnunet
-
-pkgcfgdir= $(pkgdatadir)/config.d/
-
-libexecdir= $(pkglibdir)/libexec/
-
-pkgcfg_DATA = \
- ats.conf
-
-if USE_COVERAGE
- AM_CFLAGS = -fprofile-arcs -ftest-coverage
-endif
-
-lib_LTLIBRARIES = \
- libgnunetats.la
-
-plugin_LTLIBRARIES = \
- libgnunet_plugin_ats_proportional.la
-
-libgnunetats_la_SOURCES = \
- ats_api_connectivity.c \
- ats_api_scheduling.c \
- ats_api_scanner.c \
- ats_api_performance.c
-libgnunetats_la_LIBADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(LTLIBINTL)
-libgnunetats_la_LDFLAGS = \
- $(GN_LIB_LDFLAGS) \
- -version-info 4:0:0
-
-libgnunet_plugin_ats_proportional_la_SOURCES = \
- plugin_ats_proportional.c
-libgnunet_plugin_ats_proportional_la_LIBADD = \
- libgnunetats.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(LTLIBINTL)
-libgnunet_plugin_ats_proportional_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-
-
-libexec_PROGRAMS = \
- gnunet-service-ats
-
-gnunet_service_ats_SOURCES = \
- gnunet-service-ats.c gnunet-service-ats.h \
- gnunet-service-ats_addresses.c gnunet-service-ats_addresses.h \
- gnunet-service-ats_connectivity.c gnunet-service-ats_connectivity.h \
- gnunet-service-ats_normalization.c gnunet-service-ats_normalization.h \
- gnunet-service-ats_performance.c gnunet-service-ats_performance.h \
- gnunet-service-ats_plugins.c gnunet-service-ats_plugins.h \
- gnunet-service-ats_preferences.c gnunet-service-ats_preferences.h \
- gnunet-service-ats_scheduling.c gnunet-service-ats_scheduling.h \
- gnunet-service-ats_reservations.c gnunet-service-ats_reservations.h
-gnunet_service_ats_LDADD = \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunetats.la \
- $(GN_LIBINTL)
-
-TESTING_TESTS = \
- test_ats_api_proportional \
- test_ats_reservation_api_proportional
-
-check_PROGRAMS = \
- $(TESTING_TESTS)
-
-if ENABLE_TEST_RUN
-AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export
PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;unset XDG_DATA_HOME;unset
XDG_CONFIG_HOME;
-TESTS = $(check_PROGRAMS)
-endif
-
-test_ats_api_proportional_SOURCES = \
- test_ats_api.c \
- test_ats_lib.c test_ats_lib.h
-test_ats_api_proportional_LDADD = \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/testing/libgnunettesting.la \
- libgnunetats.la
-
-test_ats_reservation_api_proportional_SOURCES = \
- test_ats_reservation_api.c \
- test_ats_lib.c test_ats_lib.h
-test_ats_reservation_api_proportional_LDADD = \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/testing/libgnunettesting.la \
- libgnunetats.la
-
-EXTRA_DIST = \
- ats.h \
- test_delay \
- test_ats_api.conf \
- test_ats_api_proportional.conf
diff --git a/src/ats/ats.conf.in b/src/ats/ats.conf.in
deleted file mode 100644
index 2c65869dd..000000000
--- a/src/ats/ats.conf.in
+++ /dev/null
@@ -1,44 +0,0 @@
-[ats]
-START_ON_DEMAND = @START_ON_DEMAND@
-@UNIXONLY@ PORT = 2098
-HOSTNAME = localhost
-BINARY = gnunet-service-ats
-ACCEPT_FROM = 127.0.0.1;
-ACCEPT_FROM6 = ::1;
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-service-ats.sock
-UNIX_MATCH_UID = NO
-UNIX_MATCH_GID = YES
-# PREFIX = valgrind
-# Designated assignment mode: PROPORTIONAL / MLP / RIL
-MODE = proportional
-
-# IMPORTANT: Do not lower those quotas below 10 MiB
-# Or your peer may not bootstrap correctly.
-# Network specific inbound/outbound quotas
-UNSPECIFIED_QUOTA_IN = unlimited
-UNSPECIFIED_QUOTA_OUT = unlimited
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = 10 MiB
-WAN_QUOTA_OUT = 10 MiB
-# WLAN
-WLAN_QUOTA_IN = unlimited
-WLAN_QUOTA_OUT = unlimited
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = 10 MiB
-BLUETOOTH_QUOTA_OUT = 10 MiB
-# ATS options
-
-# Proportional specific settings
-# How proportional to preferences is bandwidth distribution in a network
-# 1.0: Fair with respect to addresses without preferences
-# > 1.0: The bigger, the more respect is paid to preferences
-PROP_PROPORTIONALITY_FACTOR = 10.00
-# Should we stick to existing connections or prefer to switch?
-# [1.0...2.0], lower value prefers to switch, bigger value is more tolerant
-PROP_STABILITY_FACTOR = 1.25
diff --git a/src/ats/ats.h b/src/ats/ats.h
deleted file mode 100644
index 711c1c103..000000000
--- a/src/ats/ats.h
+++ /dev/null
@@ -1,492 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/ats.h
- * @brief automatic transport selection messages
- * @author Christian Grothoff
- * @author Matthias Wachs
- */
-#ifndef ATS_H
-#define ATS_H
-
-#include "gnunet_util_lib.h"
-#include "gnunet_ats_service.h"
-
-
-/**
- * Flag used to indicate which type of client is connecting
- * to the ATS service.
- */
-enum StartFlag
-{
- /**
- * This is a scheduling client (aka transport service)
- */
- START_FLAG_SCHEDULING = 0,
-
- /**
- * Performance monitoring client that wants to learn about
- * changes in performance characteristics.
- */
- START_FLAG_PERFORMANCE_WITH_PIC = 1,
-
- /**
- * Performance monitoring client that does NOT want to learn
- * about changes in performance characteristics.
- */
- START_FLAG_PERFORMANCE_NO_PIC = 2,
-
- /**
- * Connection suggestion handle.
- */
- START_FLAG_CONNECTION_SUGGESTION = 3
-};
-
-
-GNUNET_NETWORK_STRUCT_BEGIN
-
-/**
- * First message any client sends to ATS, used to self-identify
- * (what type of client this is).
- */
-struct ClientStartMessage
-{
- /**
- * Type is #GNUNET_MESSAGE_TYPE_ATS_START.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * NBO value of an `enum StartFlag`.
- */
- uint32_t start_flag GNUNET_PACKED;
-};
-
-
-/**
- * Connectivity client to ATS service: we would like to have
- * address suggestions for this peer.
- */
-struct RequestAddressMessage
-{
- /**
- * Type is #GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS or
- * #GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS_CANCEL to stop
- * suggestions.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * How "strong" is our need for an address for this peer?
- */
- uint32_t strength GNUNET_PACKED;
-
- /**
- * Peer to get address suggestions for.
- */
- struct GNUNET_PeerIdentity peer;
-};
-
-
-/**
- * Scheduling client to ATS service: here is another address you can use.
- */
-struct AddressAddMessage
-{
- /**
- * Type is #GNUNET_MESSAGE_TYPE_ATS_ADDRESS_ADD.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Number of bytes in the address that follows this struct.
- */
- uint16_t address_length GNUNET_PACKED;
-
- /**
- * Number of bytes in the plugin name that follows this struct.
- */
- uint16_t plugin_name_length GNUNET_PACKED;
-
- /**
- * Identity of the peer that this address is for.
- */
- struct GNUNET_PeerIdentity peer;
-
- /**
- * Internal number this client will henceforth use to
- * refer to this address.
- */
- uint32_t session_id GNUNET_PACKED;
-
- /**
- * Local-only information of the address, see
- * `enum GNUNET_HELLO_AddressInfo`.
- */
- uint32_t address_local_info GNUNET_PACKED;
-
- /**
- * Performance properties of the address.
- */
- struct GNUNET_ATS_PropertiesNBO properties;
-
- /* followed by:
- * - char address[address_length]
- * - char plugin_name[plugin_name_length] (including '\0'-termination).
- */
-};
-
-
-/**
- * Message used to notify ATS that the performance
- * characteristics for an address have changed.
- */
-struct AddressUpdateMessage
-{
- /**
- * Message of type #GNUNET_MESSAGE_TYPE_ATS_ADDRESS_UPDATE.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Internal number this client uses to refer to this address.
- */
- uint32_t session_id GNUNET_PACKED;
-
- /**
- * Which peer is this about? (Technically redundant, as the
- * @e session_id should be sufficient, but enables ATS service
- * to find the session faster).
- */
- struct GNUNET_PeerIdentity peer;
-
- /**
- * Performance properties of the address.
- */
- struct GNUNET_ATS_PropertiesNBO properties;
-};
-
-
-/**
- * Message sent by ATS client to ATS service when an address
- * was destroyed and must thus henceforth no longer be considered
- * for scheduling.
- */
-struct AddressDestroyedMessage
-{
- /**
- * Type is #GNUNET_MESSAGE_TYPE_ATS_ADDRESS_DESTROYED.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Internal number this client uses to refer to this address.
- */
- uint32_t session_id GNUNET_PACKED;
-
- /**
- * Which peer is this about? (Technically redundant, as the
- * @e session_id should be sufficient, but enables ATS service
- * to find the session faster).
- */
- struct GNUNET_PeerIdentity peer;
-};
-
-
-/**
- * Message sent by ATS service to client to confirm that it is done
- * using the given session ID.
- */
-struct GNUNET_ATS_SessionReleaseMessage
-{
- /**
- * Type is #GNUNET_MESSAGE_TYPE_ATS_SESSION_RELEASE.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Number the client used to identify the session.
- */
- uint32_t session_id GNUNET_PACKED;
-
- /**
- * Which peer is this about? (Technically redundant, as the
- * @e session_id should be sufficient, but may enable client
- * to find the session faster).
- */
- struct GNUNET_PeerIdentity peer;
-};
-
-
-/**
- * ATS Service suggests to the transport service to use the address
- * identified by the given @e session_id for the given @e peer with
- * the given @e bandwidth_in and @e bandwidth_out limits from now on.
- */
-struct AddressSuggestionMessage
-{
- /**
- * A message of type #GNUNET_MESSAGE_TYPE_ATS_ADDRESS_SUGGESTION.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Internal number this client uses to refer to the address this
- * suggestion is about.
- */
- uint32_t session_id GNUNET_PACKED;
-
- /**
- * Which peer is this about? (Technically redundant, as the
- * @e session_id should be sufficient, but may enable client
- * to find the session faster and/or check consistency).
- */
- struct GNUNET_PeerIdentity peer;
-
- /**
- * How much bandwidth we are allowed for sending.
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out;
-
- /**
- * How much bandwidth we are allowed for receiving.
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in;
-};
-
-
-/**
- *
- */
-struct PeerInformationMessage
-{
- /**
- * Type is #GNUNET_MESSAGE_TYPE_ATS_PEER_INFORMATION
- */
- struct GNUNET_MessageHeader header;
-
- /**
- *
- */
- uint16_t address_length GNUNET_PACKED;
-
- /**
- *
- */
- uint16_t plugin_name_length GNUNET_PACKED;
-
- /**
- *
- */
- struct GNUNET_PeerIdentity peer;
-
- /**
- *
- */
- uint32_t address_active GNUNET_PACKED;
-
- /**
- *
- */
- uint32_t id GNUNET_PACKED;
-
- /**
- *
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out;
-
- /**
- *
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in;
-
- /**
- * Performance properties of the address.
- */
- struct GNUNET_ATS_PropertiesNBO properties;
-
- /**
- * Local-only information of the address, see
- * `enum GNUNET_HELLO_AddressInfo`.
- */
- uint32_t address_local_info GNUNET_PACKED;
-
- /* followed by:
- * - char address[address_length]
- * - char plugin_name[plugin_name_length] (including '\0'-termination).
- */
-};
-
-
-/**
- * Client to service: please give us an overview of the addresses.
- */
-struct AddressListRequestMessage
-{
- /**
- * Type is #GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_REQUEST
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * ID used to match replies to this request.
- */
- uint32_t id GNUNET_PACKED;
-
- /**
- * Which peer do we care about? All zeros for all.
- */
- struct GNUNET_PeerIdentity peer;
-
- /**
- * #GNUNET_YES to get information about all addresses,
- * #GNUNET_NO to only return addresses that are in use.
- */
- int32_t all GNUNET_PACKED;
-};
-
-
-/**
- *
- */
-struct ReservationRequestMessage
-{
- /**
- * Type is #GNUNET_MESSAGE_TYPE_ATS_RESERVATION_REQUEST
- */
- struct GNUNET_MessageHeader header;
-
- /**
- *
- */
- int32_t amount GNUNET_PACKED;
-
- /**
- *
- */
- struct GNUNET_PeerIdentity peer;
-};
-
-
-/**
- *
- */
-struct ReservationResultMessage
-{
- /**
- * Type is #GNUNET_MESSAGE_TYPE_ATS_RESERVATION_RESULT
- */
- struct GNUNET_MessageHeader header;
-
- /**
- *
- */
- int32_t amount GNUNET_PACKED;
-
- /**
- *
- */
- struct GNUNET_PeerIdentity peer;
-
- /**
- *
- */
- struct GNUNET_TIME_RelativeNBO res_delay;
-};
-
-
-/**
- * Variable-size entry in a `struct ChangePreferenceMessage` or
- * `struct FeedbackPreferenceMessage`.
- */
-struct PreferenceInformation
-{
- /**
- * An `enum GNUNET_ATS_PreferenceKind` in NBO.
- */
- uint32_t preference_kind GNUNET_PACKED;
-
- /**
- * Degree of preference (or appreciation) for this @e
- * preference_kind being expressed.
- */
- float preference_value GNUNET_PACKED;
-};
-
-
-/**
- * Client to ATS: I have a performance preference for a peer.
- */
-struct ChangePreferenceMessage
-{
- /**
- * Type is #GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_CHANGE.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * How many `struct PreferenceInformation` entries follow
- * this struct?
- */
- uint32_t num_preferences GNUNET_PACKED;
-
- /**
- * Which peer is the preference being expressed for?
- */
- struct GNUNET_PeerIdentity peer;
-
- /* followed by 'num_preferences'
- * struct PreferenceInformation values */
-};
-
-
-/**
- * Message containing application feedback for a peer
- */
-struct FeedbackPreferenceMessage
-{
- /**
- * Type is #GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_FEEDBACK.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Number of feedback values included
- */
- uint32_t num_feedback GNUNET_PACKED;
-
- /**
- * Relative time describing for which time interval this feedback is
- */
- struct GNUNET_TIME_RelativeNBO scope;
-
- /**
- * Peer this feedback is for
- */
- struct GNUNET_PeerIdentity peer;
-
- /* followed by 'num_feedback'
- * struct PreferenceInformation values */
-};
-
-GNUNET_NETWORK_STRUCT_END
-
-
-#endif
diff --git a/src/ats/ats_api_connectivity.c b/src/ats/ats_api_connectivity.c
deleted file mode 100644
index f62d89772..000000000
--- a/src/ats/ats_api_connectivity.c
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/ats_api_connectivity.c
- * @brief enable clients to ask ATS about establishing connections to peers
- * @author Christian Grothoff
- * @author Matthias Wachs
- */
-#include "platform.h"
-#include "gnunet_ats_service.h"
-#include "ats.h"
-
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "ats-connectivity-api", \
- __VA_ARGS__)
-
-
-/**
- * Handle for ATS address suggestion requests.
- */
-struct GNUNET_ATS_ConnectivitySuggestHandle
-{
- /**
- * ID of the peer for which address suggestion was requested.
- */
- struct GNUNET_PeerIdentity id;
-
- /**
- * Connecitivity handle this suggestion handle belongs to.
- */
- struct GNUNET_ATS_ConnectivityHandle *ch;
-
- /**
- * How urgent is the request.
- */
- uint32_t strength;
-};
-
-
-/**
- * Handle to the ATS subsystem for connectivity management.
- */
-struct GNUNET_ATS_ConnectivityHandle
-{
- /**
- * Our configuration.
- */
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * Map with the identities of all the peers for which we would
- * like to have address suggestions. The key is the PID, the
- * value is currently the `struct GNUNET_ATS_ConnectivitySuggestHandle`
- */
- struct GNUNET_CONTAINER_MultiPeerMap *sug_requests;
-
- /**
- * Message queue for sending requests to the ATS service.
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * Task to trigger reconnect.
- */
- struct GNUNET_SCHEDULER_Task *task;
-
- /**
- * Reconnect backoff delay.
- */
- struct GNUNET_TIME_Relative backoff;
-};
-
-
-/**
- * Re-establish the connection to the ATS service.
- *
- * @param ch handle to use to re-connect.
- */
-static void
-reconnect (struct GNUNET_ATS_ConnectivityHandle *ch);
-
-
-/**
- * Re-establish the connection to the ATS service.
- *
- * @param cls handle to use to re-connect.
- */
-static void
-reconnect_task (void *cls)
-{
- struct GNUNET_ATS_ConnectivityHandle *ch = cls;
-
- ch->task = NULL;
- reconnect (ch);
-}
-
-
-/**
- * Disconnect from ATS and then reconnect.
- *
- * @param ch our handle
- */
-static void
-force_reconnect (struct GNUNET_ATS_ConnectivityHandle *ch)
-{
- if (NULL != ch->mq)
- {
- GNUNET_MQ_destroy (ch->mq);
- ch->mq = NULL;
- }
- ch->backoff = GNUNET_TIME_STD_BACKOFF (ch->backoff);
- ch->task = GNUNET_SCHEDULER_add_delayed (ch->backoff,
- &reconnect_task,
- ch);
-}
-
-
-/**
- * We encountered an error handling the MQ to the
- * ATS service. Reconnect.
- *
- * @param cls the `struct GNUNET_ATS_ConnectivityHandle`
- * @param error details about the error
- */
-static void
-error_handler (void *cls,
- enum GNUNET_MQ_Error error)
-{
- struct GNUNET_ATS_ConnectivityHandle *ch = cls;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "ATS connection died (code %d), reconnecting\n",
- (int) error);
- force_reconnect (ch);
-}
-
-
-/**
- * Transmit request for an address suggestion.
- *
- * @param cls the `struct GNUNET_ATS_ConnectivityHandle`
- * @param peer peer to ask for an address suggestion for
- * @param value the `struct GNUNET_ATS_SuggestHandle`
- * @return #GNUNET_OK (continue to iterate), #GNUNET_SYSERR on
- * failure (message queue no longer exists)
- */
-static int
-transmit_suggestion (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *value)
-{
- struct GNUNET_ATS_ConnectivityHandle *ch = cls;
- struct GNUNET_ATS_ConnectivitySuggestHandle *sh = value;
- struct GNUNET_MQ_Envelope *ev;
- struct RequestAddressMessage *m;
-
- if (NULL == ch->mq)
- return GNUNET_SYSERR;
- ev = GNUNET_MQ_msg (m, GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS);
- m->strength = htonl (sh->strength);
- m->peer = *peer;
- GNUNET_MQ_send (ch->mq, ev);
- return GNUNET_OK;
-}
-
-
-/**
- * Re-establish the connection to the ATS service.
- *
- * @param ch handle to use to re-connect.
- */
-static void
-reconnect (struct GNUNET_ATS_ConnectivityHandle *ch)
-{
- static const struct GNUNET_MQ_MessageHandler handlers[] =
- { { NULL, 0, 0 } };
- struct GNUNET_MQ_Envelope *ev;
- struct ClientStartMessage *init;
-
- GNUNET_assert (NULL == ch->mq);
- ch->mq = GNUNET_CLIENT_connect (ch->cfg,
- "ats",
- handlers,
- &error_handler,
- ch);
- if (NULL == ch->mq)
- {
- force_reconnect (ch);
- return;
- }
- ev = GNUNET_MQ_msg (init,
- GNUNET_MESSAGE_TYPE_ATS_START);
- init->start_flag = htonl (START_FLAG_CONNECTION_SUGGESTION);
- GNUNET_MQ_send (ch->mq, ev);
- if (NULL == ch->mq)
- return;
- GNUNET_CONTAINER_multipeermap_iterate (ch->sug_requests,
- &transmit_suggestion,
- ch);
-}
-
-
-/**
- * Initialize the ATS connectivity suggestion client handle.
- *
- * @param cfg configuration to use
- * @return ats connectivity handle, NULL on error
- */
-struct GNUNET_ATS_ConnectivityHandle *
-GNUNET_ATS_connectivity_init (const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- struct GNUNET_ATS_ConnectivityHandle *ch;
-
- ch = GNUNET_new (struct GNUNET_ATS_ConnectivityHandle);
- ch->cfg = cfg;
- ch->sug_requests = GNUNET_CONTAINER_multipeermap_create (32,
- GNUNET_YES);
- reconnect (ch);
- return ch;
-}
-
-
-/**
- * Function called to free all `struct GNUNET_ATS_ConnectivitySuggestHandle`s
- * in the map.
- *
- * @param cls NULL
- * @param key the key
- * @param value the value to free
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-free_sug_handle (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct GNUNET_ATS_ConnectivitySuggestHandle *cur = value;
-
- GNUNET_free (cur);
- return GNUNET_OK;
-}
-
-
-/**
- * Client is done with ATS connectivity management, release resources.
- *
- * @param ch handle to release
- */
-void
-GNUNET_ATS_connectivity_done (struct GNUNET_ATS_ConnectivityHandle *ch)
-{
- if (NULL != ch->mq)
- {
- GNUNET_MQ_destroy (ch->mq);
- ch->mq = NULL;
- }
- if (NULL != ch->task)
- {
- GNUNET_SCHEDULER_cancel (ch->task);
- ch->task = NULL;
- }
- GNUNET_CONTAINER_multipeermap_iterate (ch->sug_requests,
- &free_sug_handle,
- NULL);
- GNUNET_CONTAINER_multipeermap_destroy (ch->sug_requests);
- GNUNET_free (ch);
-}
-
-
-/**
- * We would like to receive address suggestions for a peer. ATS will
- * respond with a call to the continuation immediately containing an address or
- * no address if none is available. ATS can suggest more addresses until we
call
- * #GNUNET_ATS_connectivity_suggest_cancel().
- *
- * @param ch handle
- * @param peer identity of the peer we need an address for
- * @param strength how urgent is the need for such a suggestion
- * @return suggest handle, NULL if a request is already pending
- */
-struct GNUNET_ATS_ConnectivitySuggestHandle *
-GNUNET_ATS_connectivity_suggest (struct GNUNET_ATS_ConnectivityHandle *ch,
- const struct GNUNET_PeerIdentity *peer,
- uint32_t strength)
-{
- struct GNUNET_ATS_ConnectivitySuggestHandle *s;
-
- s = GNUNET_new (struct GNUNET_ATS_ConnectivitySuggestHandle);
- s->ch = ch;
- s->id = *peer;
- s->strength = strength;
- if (GNUNET_OK !=
- GNUNET_CONTAINER_multipeermap_put (ch->sug_requests,
- &s->id,
- s,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Not requesting ATS to suggest address for `%s', request already
pending\n",
- GNUNET_i2s (peer));
- GNUNET_free (s);
- return NULL;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Requesting ATS to suggest address for `%s'\n",
- GNUNET_i2s (peer));
- if (NULL == ch->mq)
- return s;
- (void) transmit_suggestion (ch,
- &s->id,
- s);
- return s;
-}
-
-
-void
-GNUNET_ATS_connectivity_suggest_cancel (struct
- GNUNET_ATS_ConnectivitySuggestHandle
*sh)
-{
- struct GNUNET_ATS_ConnectivityHandle *ch = sh->ch;
- struct GNUNET_MQ_Envelope *ev;
- struct RequestAddressMessage *m;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Telling ATS we no longer care for an address for `%s'\n",
- GNUNET_i2s (&sh->id));
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_remove (ch->sug_requests,
- &sh->id,
- sh));
- if (NULL == ch->mq)
- {
- GNUNET_free (sh);
- return;
- }
- ev = GNUNET_MQ_msg (m,
- GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS_CANCEL);
- m->strength = htonl (0);
- m->peer = sh->id;
- GNUNET_MQ_send (ch->mq, ev);
- GNUNET_free (sh);
-}
-
-
-/* end of ats_api_connectivity.c */
diff --git a/src/ats/ats_api_performance.c b/src/ats/ats_api_performance.c
deleted file mode 100644
index 242589851..000000000
--- a/src/ats/ats_api_performance.c
+++ /dev/null
@@ -1,946 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010, 2011, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/ats_api_performance.c
- * @brief automatic transport selection and outbound bandwidth determination
- * @author Christian Grothoff
- * @author Matthias Wachs
- */
-#include "platform.h"
-#include "gnunet_ats_service.h"
-#include "ats.h"
-
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "ats-performance-api", \
- __VA_ARGS__)
-
-
-/**
- * Linked list of pending reservations.
- */
-struct GNUNET_ATS_ReservationContext
-{
- /**
- * Kept in a DLL.
- */
- struct GNUNET_ATS_ReservationContext *next;
-
- /**
- * Kept in a DLL.
- */
- struct GNUNET_ATS_ReservationContext *prev;
-
- /**
- * Target peer.
- */
- struct GNUNET_PeerIdentity peer;
-
- /**
- * Desired reservation
- */
- int32_t size;
-
- /**
- * Function to call on result.
- */
- GNUNET_ATS_ReservationCallback rcb;
-
- /**
- * Closure for @e rcb
- */
- void *rcb_cls;
-
- /**
- * Do we need to undo this reservation if it succeeded? Set to
- * #GNUNET_YES if a reservation is cancelled. (at that point, 'info'
- * is also set to NULL; however, info will ALSO be NULL for the
- * reservation context that is created to undo the original request,
- * so 'info' being NULL cannot be used to check if undo is
- * required).
- */
- int undo;
-};
-
-
-/**
- * Linked list of pending reservations.
- */
-struct GNUNET_ATS_AddressListHandle
-{
- /**
- * Kept in a DLL.
- */
- struct GNUNET_ATS_AddressListHandle *next;
-
- /**
- * Kept in a DLL.
- */
- struct GNUNET_ATS_AddressListHandle *prev;
-
- /**
- * Performance handle
- */
- struct GNUNET_ATS_PerformanceHandle *ph;
-
- /**
- * Callback
- */
- GNUNET_ATS_AddressInformationCallback cb;
-
- /**
- * Callback closure for @e cb
- */
- void *cb_cls;
-
- /**
- * Target peer.
- */
- struct GNUNET_PeerIdentity peer;
-
- /**
- * Return all or specific peer only
- */
- int all_peers;
-
- /**
- * Return all or used address only
- */
- int all_addresses;
-
- /**
- * Request multiplexing
- */
- uint32_t id;
-};
-
-
-/**
- * ATS Handle to obtain and/or modify performance information.
- */
-struct GNUNET_ATS_PerformanceHandle
-{
- /**
- * Our configuration.
- */
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * Callback to invoke when an address has performance changes.
- */
- GNUNET_ATS_AddressInformationCallback addr_info_cb;
-
- /**
- * Closure for @e addr_info_cb.
- */
- void *addr_info_cb_cls;
-
- /**
- * Connection to ATS service.
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * Head of linked list of pending reservation requests.
- */
- struct GNUNET_ATS_ReservationContext *reservation_head;
-
- /**
- * Tail of linked list of pending reservation requests.
- */
- struct GNUNET_ATS_ReservationContext *reservation_tail;
-
- /**
- * Head of linked list of pending address list requests.
- */
- struct GNUNET_ATS_AddressListHandle *addresslist_head;
-
- /**
- * Tail of linked list of pending address list requests.
- */
- struct GNUNET_ATS_AddressListHandle *addresslist_tail;
-
- /**
- * Current request for transmission to ATS.
- */
- struct GNUNET_CLIENT_TransmitHandle *th;
-
- /**
- * Task to trigger reconnect.
- */
- struct GNUNET_SCHEDULER_Task *task;
-
- /**
- * Reconnect backoff delay.
- */
- struct GNUNET_TIME_Relative backoff;
-
- /**
- * Monitor request multiplexing
- */
- uint32_t monitor_id;
-
- /**
- * Request multiplexing
- */
- uint32_t id;
-
- /**
- * Is the receive loop active?
- */
- int in_receive;
-};
-
-/**
- * Re-establish the connection to the ATS service.
- *
- * @param ph handle to use to re-connect.
- */
-static void
-reconnect (struct GNUNET_ATS_PerformanceHandle *ph);
-
-
-/**
- * Re-establish the connection to the ATS service.
- *
- * @param cls handle to use to re-connect.
- */
-static void
-reconnect_task (void *cls)
-{
- struct GNUNET_ATS_PerformanceHandle *ph = cls;
-
- ph->task = NULL;
- reconnect (ph);
-}
-
-
-/**
- * Reconnect to the ATS service, something went wrong.
- *
- * @param ph handle to reconnect
- */
-static void
-do_reconnect (struct GNUNET_ATS_PerformanceHandle *ph)
-{
- struct GNUNET_ATS_ReservationContext *rc;
- struct GNUNET_ATS_AddressListHandle *alh;
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_zero;
-
- if (NULL != ph->mq)
- {
- GNUNET_MQ_destroy (ph->mq);
- ph->mq = NULL;
- }
- while (NULL != (rc = ph->reservation_head))
- {
- GNUNET_CONTAINER_DLL_remove (ph->reservation_head,
- ph->reservation_tail,
- rc);
- if (NULL != rc->rcb)
- rc->rcb (rc->rcb_cls,
- NULL,
- 0,
- GNUNET_TIME_UNIT_FOREVER_REL);
- GNUNET_free (rc);
- }
- bandwidth_zero.value__ = htonl (0);
- while (NULL != (alh = ph->addresslist_head))
- {
- GNUNET_CONTAINER_DLL_remove (ph->addresslist_head,
- ph->addresslist_tail,
- alh);
- if (NULL != alh->cb)
- alh->cb (alh->cb_cls,
- NULL,
- GNUNET_NO,
- bandwidth_zero,
- bandwidth_zero,
- NULL);
- GNUNET_free (alh);
- }
- if (NULL != ph->addr_info_cb)
- {
- /* Indicate reconnect */
- ph->addr_info_cb (ph->addr_info_cb_cls,
- NULL,
- GNUNET_NO,
- bandwidth_zero,
- bandwidth_zero,
- NULL);
- }
- ph->backoff = GNUNET_TIME_STD_BACKOFF (ph->backoff);
- ph->task = GNUNET_SCHEDULER_add_delayed (ph->backoff,
- &reconnect_task,
- ph);
-}
-
-
-/**
- * We received a peer information message. Validate and process it.
- *
- * @param cls our context with the callback
- * @param pi the message
- * @return #GNUNET_OK if the message was well-formed
- */
-static int
-check_peer_information (void *cls,
- const struct PeerInformationMessage *pi)
-{
- const char *plugin_address;
- const char *plugin_name;
- uint16_t plugin_address_length;
- uint16_t plugin_name_length;
-
- plugin_address_length = ntohs (pi->address_length);
- plugin_name_length = ntohs (pi->plugin_name_length);
- plugin_address = (const char *) &pi[1];
- plugin_name = &plugin_address[plugin_address_length];
- if ((plugin_address_length + plugin_name_length
- + sizeof(struct PeerInformationMessage) != ntohs (pi->header.size)) ||
- (plugin_name[plugin_name_length - 1] != '\0'))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * We received a peer information message. Validate and process it.
- *
- * @param cls our context with the callback
- * @param pi the message
- * @return #GNUNET_OK if the message was well-formed
- */
-static void
-handle_peer_information (void *cls,
- const struct PeerInformationMessage *pi)
-{
- struct GNUNET_ATS_PerformanceHandle *ph = cls;
- const char *plugin_address;
- const char *plugin_name;
- struct GNUNET_HELLO_Address address;
- uint16_t plugin_address_length;
- int addr_active;
- struct GNUNET_ATS_Properties prop;
-
- if (NULL == ph->addr_info_cb)
- return;
- plugin_address_length = ntohs (pi->address_length);
- addr_active = (int) ntohl (pi->address_active);
- plugin_address = (const char *) &pi[1];
- plugin_name = &plugin_address[plugin_address_length];
-
- GNUNET_ATS_properties_ntoh (&prop,
- &pi->properties);
- address.peer = pi->peer;
- address.local_info = (enum GNUNET_HELLO_AddressInfo) ntohl (
- pi->address_local_info);
- address.address = plugin_address;
- address.address_length = plugin_address_length;
- address.transport_name = plugin_name;
- ph->addr_info_cb (ph->addr_info_cb_cls,
- &address,
- addr_active,
- pi->bandwidth_out,
- pi->bandwidth_in,
- &prop);
-}
-
-
-/**
- * We received a reservation result message. Validate and process it.
- *
- * @param cls our context with the callback
- * @param rr the message
- */
-static void
-handle_reservation_result (void *cls,
- const struct ReservationResultMessage *rr)
-{
- struct GNUNET_ATS_PerformanceHandle *ph = cls;
- struct GNUNET_ATS_ReservationContext *rc;
- int32_t amount;
-
- amount = ntohl (rr->amount);
- rc = ph->reservation_head;
- if (0 != GNUNET_memcmp (&rr->peer,
- &rc->peer))
- {
- GNUNET_break (0);
- reconnect (ph);
- return;
- }
- GNUNET_CONTAINER_DLL_remove (ph->reservation_head,
- ph->reservation_tail,
- rc);
- if ((0 == amount) ||
- (NULL != rc->rcb))
- {
- /* tell client if not cancelled */
- if (NULL != rc->rcb)
- rc->rcb (rc->rcb_cls,
- &rr->peer,
- amount,
- GNUNET_TIME_relative_ntoh (rr->res_delay));
- GNUNET_free (rc);
- return;
- }
- /* amount non-zero, but client cancelled, consider undo! */
- if (GNUNET_YES != rc->undo)
- {
- GNUNET_free (rc);
- return; /* do not try to undo failed undos or negative amounts */
- }
- GNUNET_free (rc);
- (void) GNUNET_ATS_reserve_bandwidth (ph,
- &rr->peer,
- -amount,
- NULL, NULL);
-}
-
-
-/**
- * We received a PeerInformationMessage. Validate it.
- *
- * @param cls our context with the callback
- * @param pi the message
- * @return #GNUNET_OK if the message was well-formed
- */
-static int
-check_address_list (void *cls,
- const struct PeerInformationMessage *pi)
-{
- const char *plugin_address;
- const char *plugin_name;
- uint16_t plugin_address_length;
- uint16_t plugin_name_length;
-
- plugin_address_length = ntohs (pi->address_length);
- plugin_name_length = ntohs (pi->plugin_name_length);
- plugin_address = (const char *) &pi[1];
- plugin_name = &plugin_address[plugin_address_length];
- if ((plugin_address_length + plugin_name_length
- + sizeof(struct PeerInformationMessage) != ntohs (pi->header.size)) ||
- (plugin_name[plugin_name_length - 1] != '\0'))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * We received a #GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE.
- * Process it.
- *
- * @param cls our context with the callback
- * @param pi the message
- */
-static void
-handle_address_list (void *cls,
- const struct PeerInformationMessage *pi)
-{
- struct GNUNET_ATS_PerformanceHandle *ph = cls;
- struct GNUNET_ATS_AddressListHandle *alh;
- struct GNUNET_ATS_AddressListHandle *next;
- const char *plugin_address;
- const char *plugin_name;
- struct GNUNET_HELLO_Address address;
- struct GNUNET_PeerIdentity allzeros;
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_zero;
- struct GNUNET_ATS_Properties prop;
- uint16_t plugin_address_length;
- uint16_t plugin_name_length;
- uint32_t active;
- uint32_t id;
-
- id = ntohl (pi->id);
- active = ntohl (pi->address_active);
- plugin_address_length = ntohs (pi->address_length);
- plugin_name_length = ntohs (pi->plugin_name_length);
- plugin_address = (const char *) &pi[1];
- plugin_name = &plugin_address[plugin_address_length];
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received ATS_ADDRESSLIST_RESPONSE message for peer %s and plugin %s\n",
- GNUNET_i2s (&pi->peer),
- plugin_name);
-
- next = ph->addresslist_head;
- while (NULL != (alh = next))
- {
- next = alh->next;
- if (alh->id == id)
- break;
- }
- if (NULL == alh)
- return; /* was canceled */
-
- memset (&allzeros, '\0', sizeof(allzeros));
- if ((GNUNET_YES == GNUNET_is_zero (&pi->peer)) &&
- (0 == plugin_name_length) &&
- (0 == plugin_address_length))
- {
- /* Done */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received last message for ATS_ADDRESSLIST_RESPONSE\n");
- bandwidth_zero.value__ = htonl (0);
- GNUNET_CONTAINER_DLL_remove (ph->addresslist_head,
- ph->addresslist_tail,
- alh);
- if (NULL != alh->cb)
- alh->cb (alh->cb_cls,
- NULL,
- GNUNET_NO,
- bandwidth_zero,
- bandwidth_zero,
- NULL);
- GNUNET_free (alh);
- return;
- }
-
- address.peer = pi->peer;
- address.address = plugin_address;
- address.address_length = plugin_address_length;
- address.transport_name = plugin_name;
- if (((GNUNET_YES == alh->all_addresses) ||
- (GNUNET_YES == active)) &&
- (NULL != alh->cb))
- {
- GNUNET_ATS_properties_ntoh (&prop,
- &pi->properties);
- alh->cb (alh->cb_cls,
- &address,
- active,
- pi->bandwidth_out,
- pi->bandwidth_in,
- &prop);
- }
-}
-
-
-/**
- * Generic error handler, called with the appropriate error code and
- * the same closure specified at the creation of the message queue.
- * Not every message queue implementation supports an error handler.
- *
- * @param cls closure with the `struct GNUNET_ATS_PerformanceHandle *`
- * @param error error code
- */
-static void
-mq_error_handler (void *cls,
- enum GNUNET_MQ_Error error)
-{
- struct GNUNET_ATS_PerformanceHandle *ph = cls;
-
- do_reconnect (ph);
-}
-
-
-/**
- * Re-establish the connection to the ATS service.
- *
- * @param ph handle to use to re-connect.
- */
-static void
-reconnect (struct GNUNET_ATS_PerformanceHandle *ph)
-{
- struct GNUNET_MQ_MessageHandler handlers[] = {
- GNUNET_MQ_hd_var_size (peer_information,
- GNUNET_MESSAGE_TYPE_ATS_PEER_INFORMATION,
- struct PeerInformationMessage,
- ph),
- GNUNET_MQ_hd_fixed_size (reservation_result,
- GNUNET_MESSAGE_TYPE_ATS_RESERVATION_RESULT,
- struct ReservationResultMessage,
- ph),
- GNUNET_MQ_hd_var_size (address_list,
- GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE,
- struct PeerInformationMessage,
- ph),
- GNUNET_MQ_handler_end ()
- };
- struct GNUNET_MQ_Envelope *env;
- struct ClientStartMessage *init;
-
- GNUNET_assert (NULL == ph->mq);
- ph->mq = GNUNET_CLIENT_connect (ph->cfg,
- "ats",
- handlers,
- &mq_error_handler,
- ph);
- if (NULL == ph->mq)
- return;
- env = GNUNET_MQ_msg (init,
- GNUNET_MESSAGE_TYPE_ATS_START);
- init->start_flag = htonl ((NULL == ph->addr_info_cb)
- ? START_FLAG_PERFORMANCE_NO_PIC
- : START_FLAG_PERFORMANCE_WITH_PIC);
- GNUNET_MQ_send (ph->mq,
- env);
-}
-
-
-/**
- * Get handle to access performance API of the ATS subsystem.
- *
- * @param cfg configuration to use
- * @param addr_info_cb callback called when performance characteristics for
- * an address change
- * @param addr_info_cb_cls closure for @a addr_info_cb
- * @return ats performance context
- */
-struct GNUNET_ATS_PerformanceHandle *
-GNUNET_ATS_performance_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
- GNUNET_ATS_AddressInformationCallback
addr_info_cb,
- void *addr_info_cb_cls)
-{
- struct GNUNET_ATS_PerformanceHandle *ph;
-
- ph = GNUNET_new (struct GNUNET_ATS_PerformanceHandle);
- ph->cfg = cfg;
- ph->addr_info_cb = addr_info_cb;
- ph->addr_info_cb_cls = addr_info_cb_cls;
- reconnect (ph);
- if (NULL == ph->mq)
- {
- GNUNET_free (ph);
- return NULL;
- }
- return ph;
-}
-
-
-/**
- * Client is done using the ATS performance subsystem, release resources.
- *
- * @param ph handle
- */
-void
-GNUNET_ATS_performance_done (struct GNUNET_ATS_PerformanceHandle *ph)
-{
- struct GNUNET_ATS_ReservationContext *rc;
- struct GNUNET_ATS_AddressListHandle *alh;
-
- while (NULL != (alh = ph->addresslist_head))
- {
- GNUNET_CONTAINER_DLL_remove (ph->addresslist_head,
- ph->addresslist_tail,
- alh);
- GNUNET_free (alh);
- }
- while (NULL != (rc = ph->reservation_head))
- {
- GNUNET_CONTAINER_DLL_remove (ph->reservation_head,
- ph->reservation_tail,
- rc);
- GNUNET_break (NULL == rc->rcb);
- GNUNET_free (rc);
- }
- if (NULL != ph->task)
- {
- GNUNET_SCHEDULER_cancel (ph->task);
- ph->task = NULL;
- }
- if (NULL != ph->mq)
- {
- GNUNET_MQ_destroy (ph->mq);
- ph->mq = NULL;
- }
- GNUNET_free (ph);
-}
-
-
-struct GNUNET_ATS_ReservationContext *
-GNUNET_ATS_reserve_bandwidth (struct GNUNET_ATS_PerformanceHandle *ph,
- const struct GNUNET_PeerIdentity *peer,
- int32_t amount,
- GNUNET_ATS_ReservationCallback rcb,
- void *rcb_cls)
-{
- struct GNUNET_ATS_ReservationContext *rc;
- struct GNUNET_MQ_Envelope *env;
- struct ReservationRequestMessage *m;
-
- if (NULL == ph->mq)
- return NULL;
- rc = GNUNET_new (struct GNUNET_ATS_ReservationContext);
- rc->size = amount;
- rc->peer = *peer;
- rc->rcb = rcb;
- rc->rcb_cls = rcb_cls;
- if ((NULL != rcb) &&
- (amount > 0))
- rc->undo = GNUNET_YES;
- GNUNET_CONTAINER_DLL_insert_tail (ph->reservation_head,
- ph->reservation_tail,
- rc);
- env = GNUNET_MQ_msg (m,
- GNUNET_MESSAGE_TYPE_ATS_RESERVATION_REQUEST);
- m->amount = htonl (amount);
- m->peer = *peer;
- GNUNET_MQ_send (ph->mq,
- env);
- return rc;
-}
-
-
-void
-GNUNET_ATS_reserve_bandwidth_cancel (struct GNUNET_ATS_ReservationContext *rc)
-{
- rc->rcb = NULL;
-}
-
-
-struct GNUNET_ATS_AddressListHandle*
-GNUNET_ATS_performance_list_addresses (struct GNUNET_ATS_PerformanceHandle *ph,
- const struct GNUNET_PeerIdentity *peer,
- int all,
- GNUNET_ATS_AddressInformationCallback
- infocb,
- void *infocb_cls)
-{
- struct GNUNET_ATS_AddressListHandle *alh;
- struct GNUNET_MQ_Envelope *env;
- struct AddressListRequestMessage *m;
-
- if (NULL == ph->mq)
- return NULL;
- if (NULL == infocb)
- {
- GNUNET_break (0);
- return NULL;
- }
- alh = GNUNET_new (struct GNUNET_ATS_AddressListHandle);
- alh->id = ph->id++;
- alh->cb = infocb;
- alh->cb_cls = infocb_cls;
- alh->ph = ph;
- alh->all_addresses = all;
- if (NULL == peer)
- {
- alh->all_peers = GNUNET_YES;
- }
- else
- {
- alh->all_peers = GNUNET_NO;
- alh->peer = *peer;
- }
- GNUNET_CONTAINER_DLL_insert (ph->addresslist_head,
- ph->addresslist_tail,
- alh);
- env = GNUNET_MQ_msg (m,
- GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_REQUEST);
- m->all = htonl (all);
- m->id = htonl (alh->id);
- if (NULL != peer)
- m->peer = *peer;
- GNUNET_MQ_send (ph->mq,
- env);
- return alh;
-}
-
-
-void
-GNUNET_ATS_performance_list_addresses_cancel (struct
- GNUNET_ATS_AddressListHandle
*alh)
-{
- struct GNUNET_ATS_PerformanceHandle *ph = alh->ph;
-
- GNUNET_CONTAINER_DLL_remove (ph->addresslist_head,
- ph->addresslist_tail,
- alh);
- GNUNET_free (alh);
-}
-
-
-const char *
-GNUNET_ATS_print_preference_type (enum GNUNET_ATS_PreferenceKind type)
-{
- const char *prefs[] = GNUNET_ATS_PreferenceTypeString;
-
- if (type < GNUNET_ATS_PREFERENCE_END)
- return prefs[type];
- return NULL;
-}
-
-
-void
-GNUNET_ATS_performance_change_preference (struct
- GNUNET_ATS_PerformanceHandle *ph,
- const struct
- GNUNET_PeerIdentity *peer,
- ...)
-{
- struct GNUNET_MQ_Envelope *env;
- struct ChangePreferenceMessage *m;
- uint32_t count;
- struct PreferenceInformation *pi;
- va_list ap;
- enum GNUNET_ATS_PreferenceKind kind;
-
- if (NULL == ph->mq)
- return;
- count = 0;
- va_start (ap, peer);
- while (GNUNET_ATS_PREFERENCE_END !=
- (kind = GNUNET_VA_ARG_ENUM (ap, GNUNET_ATS_PreferenceKind)))
- {
- switch (kind)
- {
- case GNUNET_ATS_PREFERENCE_BANDWIDTH:
- count++;
- (void) va_arg (ap, double);
- break;
-
- case GNUNET_ATS_PREFERENCE_LATENCY:
- count++;
- (void) va_arg (ap, double);
- break;
-
- default:
- GNUNET_assert (0);
- }
- }
- va_end (ap);
- env = GNUNET_MQ_msg_extra (m,
- count * sizeof(struct PreferenceInformation),
- GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_CHANGE);
- m->num_preferences = htonl (count);
- m->peer = *peer;
- pi = (struct PreferenceInformation *) &m[1];
- count = 0;
- va_start (ap, peer);
- while (GNUNET_ATS_PREFERENCE_END != (kind =
- GNUNET_VA_ARG_ENUM (ap,
-
GNUNET_ATS_PreferenceKind)))
- {
- pi[count].preference_kind = htonl (kind);
- switch (kind)
- {
- case GNUNET_ATS_PREFERENCE_BANDWIDTH:
- pi[count].preference_value = (float) va_arg (ap, double);
-
- count++;
- break;
-
- case GNUNET_ATS_PREFERENCE_LATENCY:
- pi[count].preference_value = (float) va_arg (ap, double);
-
- count++;
- break;
-
- default:
- GNUNET_assert (0);
- }
- }
- va_end (ap);
- GNUNET_MQ_send (ph->mq,
- env);
-}
-
-
-/**
- * Send feedback to ATS on how good a the requirements for a peer and a
- * preference is satisfied by ATS
- *
- * @param ph performance handle
- * @param scope the time interval this valid for: [now - scope .. now]
- * @param peer identifies the peer
- * @param ... #GNUNET_ATS_PREFERENCE_END-terminated specification of the
desired changes
- */
-void
-GNUNET_ATS_performance_give_feedback (struct GNUNET_ATS_PerformanceHandle *ph,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_TIME_Relative scope,
- ...)
-{
- struct GNUNET_MQ_Envelope *env;
- struct FeedbackPreferenceMessage *m;
- uint32_t count;
- struct PreferenceInformation *pi;
- va_list ap;
- enum GNUNET_ATS_PreferenceKind kind;
-
- if (NULL == ph->mq)
- return;
- count = 0;
- va_start (ap, scope);
- while (GNUNET_ATS_PREFERENCE_END !=
- (kind = GNUNET_VA_ARG_ENUM (ap, GNUNET_ATS_PreferenceKind)))
- {
- switch (kind)
- {
- case GNUNET_ATS_PREFERENCE_BANDWIDTH:
- count++;
- (void) va_arg (ap, double);
- break;
-
- case GNUNET_ATS_PREFERENCE_LATENCY:
- count++;
- (void) va_arg (ap, double);
- break;
-
- default:
- GNUNET_assert (0);
- }
- }
- va_end (ap);
- env = GNUNET_MQ_msg_extra (m,
- count * sizeof(struct PreferenceInformation),
- GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_FEEDBACK);
- m->scope = GNUNET_TIME_relative_hton (scope);
- m->num_feedback = htonl (count);
- m->peer = *peer;
- pi = (struct PreferenceInformation *) &m[1];
- count = 0;
- va_start (ap, scope);
- while (GNUNET_ATS_PREFERENCE_END != (kind =
- GNUNET_VA_ARG_ENUM (ap,
-
GNUNET_ATS_PreferenceKind)))
- {
- pi[count].preference_kind = htonl (kind);
- switch (kind)
- {
- case GNUNET_ATS_PREFERENCE_BANDWIDTH:
- pi[count].preference_value = (float) va_arg (ap, double);
-
- count++;
- break;
-
- case GNUNET_ATS_PREFERENCE_LATENCY:
- pi[count].preference_value = (float) va_arg (ap, double);
-
- count++;
- break;
-
- default:
- GNUNET_assert (0);
- }
- }
- va_end (ap);
- GNUNET_MQ_send (ph->mq,
- env);
-}
-
-
-/* end of ats_api_performance.c */
diff --git a/src/ats/ats_api_scanner.c b/src/ats/ats_api_scanner.c
deleted file mode 100644
index 82114f888..000000000
--- a/src/ats/ats_api_scanner.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/ats_api_scanner.c
- * @brief LAN interface scanning to determine IPs in LAN
- * @author Christian Grothoff
- * @author Matthias Wachs
- */
-#include "platform.h"
-#include "gnunet_ats_service.h"
-
-/**
- * Convert ATS properties from host to network byte order.
- *
- * @param nbo[OUT] value written
- * @param hbo value read
- */
-void
-GNUNET_ATS_properties_hton (struct GNUNET_ATS_PropertiesNBO *nbo,
- const struct GNUNET_ATS_Properties *hbo)
-{
- nbo->utilization_out = htonl (hbo->utilization_out);
- nbo->utilization_in = htonl (hbo->utilization_in);
- nbo->scope = htonl ((uint32_t) hbo->scope);
- nbo->distance = htonl (hbo->distance);
- nbo->delay = GNUNET_TIME_relative_hton (hbo->delay);
-}
-
-
-/**
- * Convert ATS properties from network to host byte order.
- *
- * @param hbo[OUT] value written
- * @param nbo value read
- */
-void
-GNUNET_ATS_properties_ntoh (struct GNUNET_ATS_Properties *hbo,
- const struct GNUNET_ATS_PropertiesNBO *nbo)
-{
- hbo->utilization_out = ntohl (nbo->utilization_out);
- hbo->utilization_in = ntohl (nbo->utilization_in);
- hbo->scope = ntohl ((uint32_t) nbo->scope);
- hbo->distance = ntohl (nbo->distance);
- hbo->delay = GNUNET_TIME_relative_ntoh (nbo->delay);
-}
-
-
-/* end of ats_api_scanner.c */
diff --git a/src/ats/ats_api_scheduling.c b/src/ats/ats_api_scheduling.c
deleted file mode 100644
index 6fb61b2e8..000000000
--- a/src/ats/ats_api_scheduling.c
+++ /dev/null
@@ -1,781 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/ats_api_scheduling.c
- * @brief automatic transport selection and outbound bandwidth determination
- * @author Christian Grothoff
- * @author Matthias Wachs
- *
- * TODO:
- * - we could avoid a linear scan over the
- * active addresses in some cases, so if
- * there is need, we can still optimize here
- * - we might want to split off the logic to
- * determine LAN vs. WAN, as it has nothing
- * to do with accessing the ATS service.
- */
-#include "platform.h"
-#include "gnunet_ats_service.h"
-#include "ats.h"
-
-/**
- * How frequently do we scan the interfaces for changes to the addresses?
- */
-#define INTERFACE_PROCESSING_INTERVAL GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_MINUTES, 2)
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "ats-scheduling-api",
__VA_ARGS__)
-
-/**
- * Session ID we use if there is no session / slot.
- */
-#define NOT_FOUND 0
-
-
-/**
- * Information we track per address, incoming or outgoing. It also
- * doesn't matter if we have a session, any address that ATS is
- * allowed to suggest right now should be tracked.
- */
-struct GNUNET_ATS_AddressRecord
-{
- /**
- * Scheduling handle this address record belongs to.
- */
- struct GNUNET_ATS_SchedulingHandle *sh;
-
- /**
- * Address data.
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * Session handle. NULL if we have an address but no
- * active session for this address.
- */
- struct GNUNET_ATS_Session *session;
-
- /**
- * Performance data about the address.
- */
- struct GNUNET_ATS_PropertiesNBO properties;
-
- /**
- * Which slot (index) in the session array does
- * this record correspond to?
- * FIXME: a linear search on this is really crappy!
- * Maybe switch to a 64-bit global counter and be
- * done with it? Or does that then cause too much
- * trouble on the ATS-service side?
- */
- uint32_t slot;
-
- /**
- * We're about to destroy this address record, just ATS does
- * not know this yet. Once ATS confirms its destruction,
- * we can clean up.
- */
- int in_destroy;
-};
-
-
-/**
- * Handle to the ATS subsystem for bandwidth/transport scheduling information.
- */
-struct GNUNET_ATS_SchedulingHandle
-{
- /**
- * Our configuration.
- */
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * Callback to invoke on suggestions.
- */
- GNUNET_ATS_AddressSuggestionCallback suggest_cb;
-
- /**
- * Closure for @e suggest_cb.
- */
- void *suggest_cb_cls;
-
- /**
- * Message queue for sending requests to the ATS service.
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * Array of session objects (we need to translate them to numbers and back
- * for the protocol; the offset in the array is the session number on the
- * network). Index 0 is always NULL and reserved to represent the NULL
pointer.
- * Unused entries are also NULL.
- */
- struct GNUNET_ATS_AddressRecord **session_array;
-
- /**
- * Task to trigger reconnect.
- */
- struct GNUNET_SCHEDULER_Task *task;
-
- /**
- * Reconnect backoff delay.
- */
- struct GNUNET_TIME_Relative backoff;
-
- /**
- * Size of the @e session_array.
- */
- unsigned int session_array_size;
-};
-
-
-/**
- * Re-establish the connection to the ATS service.
- *
- * @param sh handle to use to re-connect.
- */
-static void
-reconnect (struct GNUNET_ATS_SchedulingHandle *sh);
-
-
-/**
- * Re-establish the connection to the ATS service.
- *
- * @param cls handle to use to re-connect.
- */
-static void
-reconnect_task (void *cls)
-{
- struct GNUNET_ATS_SchedulingHandle *sh = cls;
-
- sh->task = NULL;
- reconnect (sh);
-}
-
-
-/**
- * Disconnect from ATS and then reconnect.
- *
- * @param sh our handle
- */
-static void
-force_reconnect (struct GNUNET_ATS_SchedulingHandle *sh)
-{
- if (NULL != sh->mq)
- {
- GNUNET_MQ_destroy (sh->mq);
- sh->mq = NULL;
- }
- sh->suggest_cb (sh->suggest_cb_cls,
- NULL, NULL, NULL,
- GNUNET_BANDWIDTH_ZERO,
- GNUNET_BANDWIDTH_ZERO);
- sh->backoff = GNUNET_TIME_STD_BACKOFF (sh->backoff);
- sh->task = GNUNET_SCHEDULER_add_delayed (sh->backoff,
- &reconnect_task,
- sh);
-}
-
-
-/**
- * Find the session object corresponding to the given session ID.
- *
- * @param sh our handle
- * @param session_id current session ID
- * @param peer peer the session belongs to
- * @return the session object (or NULL)
- */
-static struct GNUNET_ATS_AddressRecord *
-find_session (struct GNUNET_ATS_SchedulingHandle *sh,
- uint32_t session_id,
- const struct GNUNET_PeerIdentity *peer)
-{
- struct GNUNET_ATS_AddressRecord *ar;
-
- if (session_id >= sh->session_array_size)
- {
- GNUNET_break (0);
- return NULL;
- }
- if (0 == session_id)
- return NULL;
- ar = sh->session_array[session_id];
- if (NULL == ar)
- {
- GNUNET_break (0);
- return NULL;
- }
- if (NULL == ar->address)
- {
- /* address was destroyed in the meantime, this can happen
- as we communicate asynchronously with the ATS service. */
- return NULL;
- }
- if (0 != GNUNET_memcmp (peer,
- &ar->address->peer))
- {
- GNUNET_break (0);
- return NULL;
- }
- return ar;
-}
-
-
-/**
- * Get an available session ID.
- *
- * @param sh our handle
- * @return an unused slot, but never NOT_FOUND (0)
- */
-static uint32_t
-find_empty_session_slot (struct GNUNET_ATS_SchedulingHandle *sh)
-{
- static uint32_t off;
- uint32_t i;
-
- GNUNET_assert (0 != sh->session_array_size);
- i = 0;
- while (((NOT_FOUND == off) ||
- (NULL != sh->session_array[off % sh->session_array_size])) &&
- (i < sh->session_array_size))
- {
- off++;
- i++;
- }
- if ((NOT_FOUND != off % sh->session_array_size) &&
- (NULL == sh->session_array[off % sh->session_array_size]))
- return off;
- i = sh->session_array_size;
- GNUNET_array_grow (sh->session_array,
- sh->session_array_size,
- sh->session_array_size * 2);
- return i;
-}
-
-
-/**
- * Get the ID for the given session object.
- *
- * @param sh our handle
- * @param session session object
- * @param address the address we are looking for
- * @return the session id or NOT_FOUND for error
- */
-static uint32_t
-find_session_id (struct GNUNET_ATS_SchedulingHandle *sh,
- struct GNUNET_ATS_Session *session,
- const struct GNUNET_HELLO_Address *address)
-{
- uint32_t i;
-
- if (NULL == address)
- {
- GNUNET_break (0);
- return NOT_FOUND;
- }
- for (i = 1; i < sh->session_array_size; i++)
- if ((NULL != sh->session_array[i]) &&
- (GNUNET_NO == sh->session_array[i]->in_destroy) &&
- ((session == sh->session_array[i]->session) ||
- (NULL == sh->session_array[i]->session)) &&
- (0 == GNUNET_memcmp (&address->peer,
- &sh->session_array[i]->address->peer)) &&
- (0 == GNUNET_HELLO_address_cmp (address,
- sh->session_array[i]->address)))
- return i;
- return NOT_FOUND;
-}
-
-
-/**
- * Release the session slot from the session table (ATS service is
- * also done using it).
- *
- * @param sh our handle
- * @param session_id identifies session that is no longer valid
- */
-static void
-release_session (struct GNUNET_ATS_SchedulingHandle *sh,
- uint32_t session_id)
-{
- struct GNUNET_ATS_AddressRecord *ar;
-
- if (NOT_FOUND == session_id)
- return;
- if (session_id >= sh->session_array_size)
- {
- GNUNET_break (0);
- force_reconnect (sh);
- return;
- }
- /* this slot should have been removed from remove_session before */
- ar = sh->session_array[session_id];
- if (NULL != ar->session)
- {
- GNUNET_break (0);
- force_reconnect (sh);
- return;
- }
- GNUNET_HELLO_address_free (ar->address);
- GNUNET_free (ar);
- sh->session_array[session_id] = NULL;
-}
-
-
-/**
- * Type of a function to call when we receive a session release
- * message from the service.
- *
- * @param cls the `struct GNUNET_ATS_SchedulingHandle`
- * @param srm message received
- */
-static void
-handle_ats_session_release (void *cls,
- const struct GNUNET_ATS_SessionReleaseMessage *srm)
-{
- struct GNUNET_ATS_SchedulingHandle *sh = cls;
-
- /* Note: peer field in srm not necessary right now,
- but might be good to have in the future */
- release_session (sh,
- ntohl (srm->session_id));
-}
-
-
-/**
- * Type of a function to call when we receive a address suggestion
- * message from the service.
- *
- * @param cls the `struct GNUNET_ATS_SchedulingHandle`
- * @param m message received
- */
-static void
-handle_ats_address_suggestion (void *cls,
- const struct AddressSuggestionMessage *m)
-{
- struct GNUNET_ATS_SchedulingHandle *sh = cls;
- struct GNUNET_ATS_AddressRecord *ar;
- uint32_t session_id;
-
- session_id = ntohl (m->session_id);
- if (0 == session_id)
- {
- GNUNET_break (0);
- force_reconnect (sh);
- return;
- }
- ar = find_session (sh,
- session_id,
- &m->peer);
- if (NULL == ar)
- {
- GNUNET_break (0);
- force_reconnect (sh);
- return;
- }
- if (NULL == sh->suggest_cb)
- return;
- if (GNUNET_YES == ar->in_destroy)
- {
- /* ignore suggestion, as this address is dying, unless BW is 0,
- in that case signal 'disconnect' via BW 0 */
- if ((0 == ntohl (m->bandwidth_out.value__)) &&
- (0 == ntohl (m->bandwidth_in.value__)))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "ATS suggests disconnect from peer `%s' with BW %u/%u\n",
- GNUNET_i2s (&ar->address->peer),
- (unsigned int) ntohl (m->bandwidth_out.value__),
- (unsigned int) ntohl (m->bandwidth_in.value__));
- sh->suggest_cb (sh->suggest_cb_cls,
- &m->peer,
- NULL,
- NULL,
- m->bandwidth_out,
- m->bandwidth_in);
- }
- return;
- }
- if ((NULL == ar->session) &&
- (GNUNET_HELLO_address_check_option (ar->address,
- GNUNET_HELLO_ADDRESS_INFO_INBOUND)))
- {
- GNUNET_break (0);
- return;
- }
- sh->backoff = GNUNET_TIME_UNIT_ZERO;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "ATS suggests address slot %u for peer `%s' using plugin %s\n",
- ar->slot,
- GNUNET_i2s (&ar->address->peer),
- ar->address->transport_name);
- sh->suggest_cb (sh->suggest_cb_cls,
- &m->peer,
- ar->address,
- ar->session,
- m->bandwidth_out,
- m->bandwidth_in);
-}
-
-
-/**
- * We encountered an error handling the MQ to the
- * ATS service. Reconnect.
- *
- * @param cls the `struct GNUNET_ATS_SchedulingHandle`
- * @param error details about the error
- */
-static void
-error_handler (void *cls,
- enum GNUNET_MQ_Error error)
-{
- struct GNUNET_ATS_SchedulingHandle *sh = cls;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "ATS connection died (code %d), reconnecting\n",
- (int) error);
- force_reconnect (sh);
-}
-
-
-/**
- * Generate and transmit the `struct AddressAddMessage` for the given
- * address record.
- *
- * @param sh the scheduling handle to use for transmission
- * @param ar the address to inform the ATS service about
- */
-static void
-send_add_address_message (struct GNUNET_ATS_SchedulingHandle *sh,
- const struct GNUNET_ATS_AddressRecord *ar)
-{
- struct GNUNET_MQ_Envelope *ev;
- struct AddressAddMessage *m;
- char *pm;
- size_t namelen;
- size_t msize;
-
- if (NULL == sh->mq)
- return; /* disconnected, skip for now */
- GNUNET_break (GNUNET_NT_UNSPECIFIED != ar->properties.scope);
- namelen = strlen (ar->address->transport_name) + 1;
- msize = ar->address->address_length + namelen;
- ev = GNUNET_MQ_msg_extra (m, msize, GNUNET_MESSAGE_TYPE_ATS_ADDRESS_ADD);
- m->peer = ar->address->peer;
- m->address_length = htons (ar->address->address_length);
- m->address_local_info = htonl ((uint32_t) ar->address->local_info);
- m->plugin_name_length = htons (namelen);
- m->session_id = htonl (ar->slot);
- m->properties = ar->properties;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Adding address for peer `%s', plugin `%s', session %p slot %u\n",
- GNUNET_i2s (&ar->address->peer),
- ar->address->transport_name,
- ar->session,
- ar->slot);
- pm = (char *) &m[1];
- GNUNET_memcpy (pm,
- ar->address->address,
- ar->address->address_length);
- if (NULL != ar->address->transport_name)
- GNUNET_memcpy (&pm[ar->address->address_length],
- ar->address->transport_name,
- namelen);
- GNUNET_MQ_send (sh->mq, ev);
-}
-
-
-/**
- * Re-establish the connection to the ATS service.
- *
- * @param sh handle to use to re-connect.
- */
-static void
-reconnect (struct GNUNET_ATS_SchedulingHandle *sh)
-{
- struct GNUNET_MQ_MessageHandler handlers[] = {
- GNUNET_MQ_hd_fixed_size (ats_session_release,
- GNUNET_MESSAGE_TYPE_ATS_SESSION_RELEASE,
- struct GNUNET_ATS_SessionReleaseMessage,
- sh),
- GNUNET_MQ_hd_fixed_size (ats_address_suggestion,
- GNUNET_MESSAGE_TYPE_ATS_ADDRESS_SUGGESTION,
- struct AddressSuggestionMessage,
- sh),
- GNUNET_MQ_handler_end ()
- };
- struct GNUNET_MQ_Envelope *ev;
- struct ClientStartMessage *init;
- unsigned int i;
- struct GNUNET_ATS_AddressRecord *ar;
-
- GNUNET_assert (NULL == sh->mq);
- sh->mq = GNUNET_CLIENT_connect (sh->cfg,
- "ats",
- handlers,
- &error_handler,
- sh);
- if (NULL == sh->mq)
- {
- GNUNET_break (0);
- force_reconnect (sh);
- return;
- }
- ev = GNUNET_MQ_msg (init,
- GNUNET_MESSAGE_TYPE_ATS_START);
- init->start_flag = htonl (START_FLAG_SCHEDULING);
- GNUNET_MQ_send (sh->mq, ev);
- if (NULL == sh->mq)
- return;
- for (i = 0; i < sh->session_array_size; i++)
- {
- ar = sh->session_array[i];
- if (NULL == ar)
- continue;
- send_add_address_message (sh, ar);
- if (NULL == sh->mq)
- return;
- }
-}
-
-
-struct GNUNET_ATS_SchedulingHandle *
-GNUNET_ATS_scheduling_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
- GNUNET_ATS_AddressSuggestionCallback suggest_cb,
- void *suggest_cb_cls)
-{
- struct GNUNET_ATS_SchedulingHandle *sh;
-
- sh = GNUNET_new (struct GNUNET_ATS_SchedulingHandle);
- sh->cfg = cfg;
- sh->suggest_cb = suggest_cb;
- sh->suggest_cb_cls = suggest_cb_cls;
- GNUNET_array_grow (sh->session_array,
- sh->session_array_size,
- 4);
- reconnect (sh);
- return sh;
-}
-
-
-/**
- * Client is done with ATS scheduling, release resources.
- *
- * @param sh handle to release
- */
-void
-GNUNET_ATS_scheduling_done (struct GNUNET_ATS_SchedulingHandle *sh)
-{
- struct GNUNET_ATS_AddressRecord *ar;
- unsigned int i;
-
- if (NULL != sh->mq)
- {
- GNUNET_MQ_destroy (sh->mq);
- sh->mq = NULL;
- }
- if (NULL != sh->task)
- {
- GNUNET_SCHEDULER_cancel (sh->task);
- sh->task = NULL;
- }
- for (i = 0; i < sh->session_array_size; i++)
- {
- if (NULL != (ar = sh->session_array[i]))
- {
- GNUNET_HELLO_address_free (ar->address);
- GNUNET_free (ar);
- sh->session_array[i] = NULL;
- }
- }
- GNUNET_array_grow (sh->session_array,
- sh->session_array_size,
- 0);
- GNUNET_free (sh);
-}
-
-
-/**
- * We have a new address ATS should know. Addresses have to be added
- * with this function before they can be: updated, set in use and
- * destroyed.
- *
- * @param sh handle
- * @param address the address
- * @param session session handle, can be NULL
- * @param prop performance data for the address
- * @return handle to the address representation inside ATS, NULL
- * on error (i.e. ATS knows this exact address already)
- */
-struct GNUNET_ATS_AddressRecord *
-GNUNET_ATS_address_add (struct GNUNET_ATS_SchedulingHandle *sh,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- const struct GNUNET_ATS_Properties *prop)
-{
- struct GNUNET_ATS_AddressRecord *ar;
- size_t namelen;
- size_t msize;
- uint32_t s;
-
- if (NULL == address)
- {
- /* we need a valid address */
- GNUNET_break (0);
- return NULL;
- }
- GNUNET_break (GNUNET_NT_UNSPECIFIED != prop->scope);
- namelen = strlen (address->transport_name) + 1;
- msize = address->address_length + namelen;
- if ((msize + sizeof(struct AddressUpdateMessage) >=
- GNUNET_MAX_MESSAGE_SIZE) ||
- (address->address_length >= GNUNET_MAX_MESSAGE_SIZE) ||
- (namelen >= GNUNET_MAX_MESSAGE_SIZE))
- {
- /* address too large for us, this should not happen */
- GNUNET_break (0);
- return NULL;
- }
-
- if (NOT_FOUND !=
- find_session_id (sh,
- session,
- address))
- {
- /* Already existing, nothing todo, but this should not happen */
- GNUNET_break (0);
- return NULL;
- }
- s = find_empty_session_slot (sh);
- ar = GNUNET_new (struct GNUNET_ATS_AddressRecord);
- ar->sh = sh;
- ar->slot = s;
- ar->session = session;
- ar->address = GNUNET_HELLO_address_copy (address);
- GNUNET_ATS_properties_hton (&ar->properties,
- prop);
- sh->session_array[s] = ar;
- send_add_address_message (sh, ar);
- return ar;
-}
-
-
-/**
- * An address was used to initiate a session.
- *
- * @param ar address record to update information for
- * @param session session handle
- */
-void
-GNUNET_ATS_address_add_session (struct GNUNET_ATS_AddressRecord *ar,
- struct GNUNET_ATS_Session *session)
-{
- GNUNET_break (NULL == ar->session);
- ar->session = session;
-}
-
-
-int
-GNUNET_ATS_address_del_session (struct GNUNET_ATS_AddressRecord *ar,
- struct GNUNET_ATS_Session *session)
-{
- GNUNET_assert (session == ar->session);
- ar->session = NULL;
- if (GNUNET_HELLO_address_check_option (ar->address,
- GNUNET_HELLO_ADDRESS_INFO_INBOUND))
- {
- GNUNET_ATS_address_destroy (ar);
- return GNUNET_YES;
- }
- return GNUNET_NO;
-}
-
-
-/**
- * We have updated performance statistics for a given address. Note
- * that this function can be called for addresses that are currently
- * in use as well as addresses that are valid but not actively in use.
- * Furthermore, the peer may not even be connected to us right now (in
- * which case the call may be ignored or the information may be stored
- * for later use). Update bandwidth assignments.
- *
- * @param ar address record to update information for
- * @param prop performance data for the address
- */
-void
-GNUNET_ATS_address_update (struct GNUNET_ATS_AddressRecord *ar,
- const struct GNUNET_ATS_Properties *prop)
-{
- struct GNUNET_ATS_SchedulingHandle *sh = ar->sh;
- struct GNUNET_MQ_Envelope *ev;
- struct AddressUpdateMessage *m;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Updating address for peer `%s', plugin `%s', session %p slot %u\n",
- GNUNET_i2s (&ar->address->peer),
- ar->address->transport_name,
- ar->session,
- ar->slot);
- GNUNET_break (GNUNET_NT_UNSPECIFIED != prop->scope);
- GNUNET_ATS_properties_hton (&ar->properties,
- prop);
- if (NULL == sh->mq)
- return; /* disconnected, skip for now */
- ev = GNUNET_MQ_msg (m, GNUNET_MESSAGE_TYPE_ATS_ADDRESS_UPDATE);
- m->session_id = htonl (ar->slot);
- m->peer = ar->address->peer;
- m->properties = ar->properties;
- GNUNET_MQ_send (sh->mq,
- ev);
-}
-
-
-/**
- * An address got destroyed, stop using it as a valid address.
- *
- * @param ar address to destroy
- */
-void
-GNUNET_ATS_address_destroy (struct GNUNET_ATS_AddressRecord *ar)
-{
- struct GNUNET_ATS_SchedulingHandle *sh = ar->sh;
- struct GNUNET_MQ_Envelope *ev;
- struct AddressDestroyedMessage *m;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Deleting address for peer `%s', plugin `%s', slot %u session %p\n",
- GNUNET_i2s (&ar->address->peer),
- ar->address->transport_name,
- ar->slot,
- ar->session);
- GNUNET_break (NULL == ar->session);
- ar->session = NULL;
- ar->in_destroy = GNUNET_YES;
- if (NULL == sh->mq)
- return;
- ev = GNUNET_MQ_msg (m, GNUNET_MESSAGE_TYPE_ATS_ADDRESS_DESTROYED);
- m->session_id = htonl (ar->slot);
- m->peer = ar->address->peer;
- GNUNET_MQ_send (sh->mq, ev);
-}
-
-
-/* end of ats_api_scheduling.c */
diff --git a/src/ats/experiments/example.exp b/src/ats/experiments/example.exp
deleted file mode 100644
index a490e5ec6..000000000
--- a/src/ats/experiments/example.exp
+++ /dev/null
@@ -1,104 +0,0 @@
-[experiment]
-name = test
-max_duration = 15 s
-log_freq = 1000 ms
-cfg_file = experiments/gnunet_ats_sim_default.conf
-log_output_dir = data/
-log_append_time_stamp = no
-
-[episode-0]
-# Setup addresses
-
-# operations = address_add, address_del, start_set_property,
stop_set_property,
-# start_set_preference, stop_preference, start_request, stop_request
-duration = 0
-op-0-operation = address_add
-op-0-address-id = 0
-op-0-peer-id = 0
-op-0-address-session = 0
-op-0-address-network = 0
-op-0-address = 0_0_test
-op-0-plugin = test
-
-op-1-operation = address_add
-op-1-address-id = 1
-op-1-peer-id = 1
-op-1-address-session = 0
-op-1-address-network = 0
-op-1-address = 1_1_test
-op-1-plugin = test
-
-op-2-operation = start_request
-op-2-peer-id = 0
-
-op-3-operation = start_request
-op-3-peer-id = 1
-
-[episode-1]
-# Set delay
-duration = 5 s
-
-op-0-operation = start_set_property
-op-0-address-id = 0
-op-0-peer-id = 0
-# constant, linear, sinus, random
-op-0-gen-type = random
-op-0-base-rate= 10000
-op-0-max-rate = 20000
-op-0-frequency = 1000 ms
-# bandwidth, latency
-# "TERMINATOR", "UTILIZATION_UP", "UTILIZATION_DOWN",
"UTILIZATION_PAYLOAD_UP", "UTILIZATION_PAYLOAD_DOWN", "NETWORK_TYPE", "DELAY",
"DISTANCE", "COST_WAN", "COST_LAN", "COST_WLAN"
-op-0-property = DELAY
-
-op-1-operation = start_set_property
-op-1-address-id = 1
-op-1-peer-id = 1
-# constant, linear, sinus, random
-op-1-gen-type = constant
-op-1-base-rate= 1
-op-1-max-rate = 1
-op-1-frequency = 1000 ms
-# bandwidth, latency
-# "TERMINATOR", "UTILIZATION_UP", "UTILIZATION_DOWN",
"UTILIZATION_PAYLOAD_UP", "UTILIZATION_PAYLOAD_DOWN", "NETWORK_TYPE", "DELAY",
"DISTANCE", "COST_WAN", "COST_LAN", "COST_WLAN"
-op-1-property = DELAY
-
-
-[episode-2]
-# Shutdown
-duration = 2 s
-op-0-operation = stop_set_property
-op-0-address-id = 0
-op-0-peer-id = 0
-op-0-property = DELAY
-
-op-1-operation = stop_set_property
-op-1-address-id = 1
-op-1-peer-id = 1
-op-1-property = DELAY
-
-[episode-3]
-# Shutdown
-duration = 2 s
-
-op-0-operation = stop_request
-op-0-peer-id = 0
-
-op-1-operation = stop_request
-op-1-peer-id = 1
-
-op-2-operation = address_del
-op-2-address-id = 0
-op-2-peer-id = 0
-op-2-address-session = 0
-op-2-address-network = 0
-op-2-address = 0_0_test
-op-2-plugin = test
-
-op-2-operation = address_del
-op-2-address-id = 1
-op-2-peer-id = 1
-op-2-address-session = 0
-op-2-address-network = 0
-op-2-address = 1_1_test
-op-2-plugin = test
-
diff --git a/src/ats/experiments/gnunet_ats_sim_default.conf
b/src/ats/experiments/gnunet_ats_sim_default.conf
deleted file mode 100644
index 14e0a2e0b..000000000
--- a/src/ats/experiments/gnunet_ats_sim_default.conf
+++ /dev/null
@@ -1,18 +0,0 @@
-[ats]
-UNSPECIFIED_QUOTA_IN = 64 KiB
-UNSPECIFIED_QUOTA_OUT = 64 KiB
-# LOOPBACK
-LOOPBACK_QUOTA_IN = 64 KiB
-LOOPBACK_QUOTA_OUT = 64 KiB
-# LAN
-LAN_QUOTA_IN = 64 KiB
-LAN_QUOTA_OUT = 64 KiB
-# WAN
-WAN_QUOTA_IN = 64 KiB
-WAN_QUOTA_OUT = 64 KiB
-# WLAN
-WLAN_QUOTA_IN = 64 KiB
-WLAN_QUOTA_OUT = 64 KiB
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = 64 KiB
-BLUETOOTH_QUOTA_OUT = 64 KiB
diff --git a/src/ats/experiments/set_preference.exp
b/src/ats/experiments/set_preference.exp
deleted file mode 100644
index 34f9af296..000000000
--- a/src/ats/experiments/set_preference.exp
+++ /dev/null
@@ -1,95 +0,0 @@
-# Example setting up two peers
-
-[experiment]
-name = test
-max_duration = 15 s
-log_freq = 1000 ms
-log_prefix = set_preference
-cfg_file = experiments/gnunet_ats_sim_default.conf
-
-[episode-0]
-# Setup addresses
-
-# operations = address_add, address_del, start_set_property,
stop_set_property,
-# start_set_preference, stop_preference, start_request, stop_request
-duration = 1 s
-
-op-0-operation = address_add
-op-0-address-id = 0
-op-0-peer-id = 0
-op-0-address-session = 0
-op-0-address-network = lan
-op-0-address = 0_0_test
-op-0-plugin = test
-
-op-1-operation = address_add
-op-1-address-id = 1
-op-1-peer-id = 1
-op-1-address-session = 0
-op-1-address-network = lan
-op-1-address = 1_1_test
-op-1-plugin = test
-
-op-2-operation = start_request
-op-2-peer-id = 0
-
-op-3-operation = start_request
-op-3-peer-id = 1
-
-[episode-1]
-# Set delay
-duration = 20 s
-
-op-0-operation = start_set_preference
-op-0-address-id = 0
-op-0-peer-id = 0
-op-0-client-id = 1
-# constant, linear, sinus, random
-op-0-gen-type = linear
-op-0-base-rate= 1000
-op-0-max-rate = 10000
-op-0-period = 10 s
-op-0-frequency = 500 ms
-op-0-feedback_delay = 500 ms
-# BANDWIDTH, LATENCY
-op-0-pref = BANDWIDTH
-
-
-op-1-operation = start_set_preference
-op-1-address-id = 1
-op-1-peer-id = 1
-op-1-client-id = 1
-# constant, linear, sinus, random
-op-1-gen-type = constant
-op-1-base-rate= 1000
-op-1-max-rate = 1000
-op-1-period = 10 s
-op-1-frequency = 500 ms
-# BANDWIDTH, LATENCY
-op-1-pref = BANDWIDTH
-
-[episode-2]
-# Shutdown
-duration = 2 s
-
-op-0-operation = stop_request
-op-0-peer-id = 0
-
-op-1-operation = stop_request
-op-1-peer-id = 1
-
-op-2-operation = address_del
-op-2-address-id = 0
-op-2-peer-id = 0
-op-2-address-session = 0
-op-2-address-network = 0
-op-2-address = 0_0_test
-op-2-plugin = test
-
-op-3-operation = address_del
-op-3-address-id = 1
-op-3-peer-id = 1
-op-3-address-session = 0
-op-3-address-network = 0
-op-3-address = 1_1_test
-op-3-plugin = test
diff --git a/src/ats/gnunet-ats-solver-eval.c b/src/ats/gnunet-ats-solver-eval.c
deleted file mode 100644
index ba7994686..000000000
--- a/src/ats/gnunet-ats-solver-eval.c
+++ /dev/null
@@ -1,3588 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2013 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats-tests/ats-testing-experiment.c
- * @brief ats benchmark: controlled experiment execution
- * @author Christian Grothoff
- * @author Matthias Wachs
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet-ats-solver-eval.h"
-#include "gnunet-service-ats_normalization.h"
-#include "gnunet-service-ats_preferences.c"
-
-#define BIG_M_STRING "unlimited"
-
-/**
- * Handle for statistics.
- */
-struct GNUNET_STATISTICS_Handle *GSA_stats;
-
-
-static struct Experiment *e;
-
-static struct LoggingHandle *l;
-
-static struct SolverHandle *sh;
-
-static struct TestPeer *peer_head;
-
-static struct TestPeer *peer_tail;
-
-static double default_properties[GNUNET_ATS_PropertyCount];
-static double default_preferences[GNUNET_ATS_PreferenceCount];
-
-/**
- * cmd option -e: experiment file
- */
-static char *opt_exp_file;
-
-static char *opt_solver;
-
-/**
- * cmd option -l: enable logging
- */
-static int opt_log;
-
-/**
- * cmd option -p: enable plots
- */
-static int opt_save;
-
-/**
- * cmd option -v: verbose logs
- */
-static int opt_verbose;
-
-/**
- * cmd option -p: print logs
- */
-static int opt_print;
-
-/**
- * cmd option -d: disable normalization
- */
-static int opt_disable_normalization;
-
-static int res;
-
-static void
-end_now ();
-
-
-static char *
-print_generator_type (enum GeneratorType g)
-{
- switch (g)
- {
- case GNUNET_ATS_TEST_TG_CONSTANT:
- return "CONSTANT";
-
- case GNUNET_ATS_TEST_TG_LINEAR:
- return "LINEAR";
-
- case GNUNET_ATS_TEST_TG_RANDOM:
- return "RANDOM";
-
- case GNUNET_ATS_TEST_TG_SINUS:
- return "SINUS";
-
- default:
- return "INVALID";
- break;
- }
-}
-
-
-static struct TestPeer *
-find_peer_by_id (int id)
-{
- struct TestPeer *cur;
-
- for (cur = peer_head; NULL != cur; cur = cur->next)
- if (cur->id == id)
- return cur;
- return NULL;
-}
-
-
-static struct TestPeer *
-find_peer_by_pid (const struct GNUNET_PeerIdentity *pid)
-{
- struct TestPeer *cur;
-
- for (cur = peer_head; NULL != cur; cur = cur->next)
- if (0 == GNUNET_memcmp (&cur->peer_id, pid))
- return cur;
- return NULL;
-}
-
-
-static struct TestAddress *
-find_address_by_id (struct TestPeer *peer, int aid)
-{
- struct TestAddress *cur;
-
- for (cur = peer->addr_head; NULL != cur; cur = cur->next)
- if (cur->aid == aid)
- return cur;
- return NULL;
-}
-
-
-/**
- * Logging
- */
-void
-GNUNET_ATS_solver_logging_now (struct LoggingHandle *l)
-{
- struct LoggingTimeStep *lts;
- struct TestPeer *cur;
- struct TestAddress *cur_addr;
- struct LoggingPeer *log_p;
- struct LoggingAddress *log_a;
- int c;
-
- lts = GNUNET_new (struct LoggingTimeStep);
- GNUNET_CONTAINER_DLL_insert_tail (l->head, l->tail, lts);
- lts->timestamp = GNUNET_TIME_absolute_get ();
- if (NULL == lts->prev)
- lts->delta = GNUNET_TIME_UNIT_ZERO;
- else
- lts->delta = GNUNET_TIME_absolute_get_duration (lts->prev->timestamp);
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Logging %llu, delta %llu\n",
- lts->timestamp.abs_value_us, lts->delta.rel_value_us);
-
-
- /* Store logging data here */
- for (cur = peer_head; NULL != cur; cur = cur->next)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Logging peer id %llu\n", cur->id);
-
- log_p = GNUNET_new (struct LoggingPeer);
- log_p->id = cur->id;
- log_p->peer_id = cur->peer_id;
- log_p->is_requested = cur->is_requested;
- for (c = 0; c < GNUNET_ATS_PreferenceCount; c++)
- {
- log_p->pref_abs[c] = cur->pref_abs[c];
- log_p->pref_norm[c] = cur->pref_norm[c];
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "\t %s = %.2f %.2f [abs/rel]\n",
- GNUNET_ATS_print_preference_type (c),
- log_p->pref_abs[c], log_p->pref_norm[c]);
- }
- GNUNET_CONTAINER_DLL_insert_tail (lts->head, lts->tail, log_p);
-
- for (cur_addr = cur->addr_head; NULL != cur_addr; cur_addr =
cur_addr->next)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Logging peer id %llu address %llu\n",
- cur->id, cur_addr->aid);
- log_a = GNUNET_new (struct LoggingAddress);
- log_a->aid = cur_addr->aid;
- log_a->active = cur_addr->ats_addr->active;
- log_a->network = cur_addr->network;
- log_a->assigned_bw_in = cur_addr->ats_addr->assigned_bw_in;
- log_a->assigned_bw_out = cur_addr->ats_addr->assigned_bw_out;
- for (c = 0; c < GNUNET_ATS_PropertyCount; c++)
- {
- log_a->prop_abs[c] = cur_addr->prop_abs[c];
- log_a->prop_norm[c] = cur_addr->prop_norm[c];
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "\t %s = %.2f %.2f [abs/rel]\n",
- GNUNET_ATS_print_property_type (c),
- log_a->prop_abs[c],
- log_a->prop_norm[c]);
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\t Active = %i\n", log_a->active);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\t BW in = %llu\n",
- log_a->assigned_bw_in);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "\t BW out = %llu\n",
- log_a->assigned_bw_out);
-
- GNUNET_CONTAINER_DLL_insert_tail (log_p->addr_head, log_p->addr_tail,
- log_a);
- }
- }
-}
-
-
-static void
-logging_task (void *cls)
-{
- struct LoggingHandle *l = cls;
-
- l->logging_task = NULL;
- GNUNET_ATS_solver_logging_now (l);
- l->logging_task = GNUNET_SCHEDULER_add_delayed (l->log_freq,
- &logging_task,
- l);
-}
-
-
-struct LoggingHandle *
-GNUNET_ATS_solver_logging_start (struct GNUNET_TIME_Relative freq)
-{
- struct LoggingHandle *l;
-
- l = GNUNET_new (struct LoggingHandle);
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Start logging every %s\n",
- GNUNET_STRINGS_relative_time_to_string (freq, GNUNET_NO));
- l->log_freq = freq;
- l->logging_task = GNUNET_SCHEDULER_add_now (&logging_task, l);
- return l;
-}
-
-
-void
-GNUNET_ATS_solver_logging_stop (struct LoggingHandle *l)
-{
- if (NULL != l->logging_task)
- GNUNET_SCHEDULER_cancel (l->logging_task);
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Stop logging\n");
-
- l->logging_task = NULL;
-}
-
-
-static struct LoggingFileHandle *
-find_logging_file_handle (struct LoggingFileHandle *lf_head,
- struct LoggingFileHandle *lf_tail,
- int peer_id, int address_id)
-{
- struct LoggingFileHandle *res;
-
- for (res = lf_head; NULL != res; res = res->next)
- if ((res->pid == peer_id) && (res->aid == address_id))
- return res;
- return NULL;
-}
-
-
-void
-GNUNET_ATS_solver_logging_write_to_disk (struct LoggingHandle *l, int
- add_time_stamp,
- char *output_dir)
-{
- struct LoggingTimeStep *lts;
- struct LoggingPeer *log_p;
- struct LoggingAddress *log_a;
- struct LoggingFileHandle *lf_head;
- struct LoggingFileHandle *lf_tail;
- struct LoggingFileHandle *cur;
- struct LoggingFileHandle *next;
- char *filename;
- char *datastring;
- char *propstring;
- char *propstring_tmp;
- char *prefstring;
- char *prefstring_tmp;
- int c;
- int use_dir;
-
- use_dir = GNUNET_NO;
- if (NULL != output_dir)
- {
- if (GNUNET_OK != GNUNET_DISK_directory_create_for_file (output_dir))
- {
- fprintf (stderr, "Failed to create directory `%s'\n", output_dir);
- return;
- }
- else
- {
- fprintf (stderr, "Created directory `%s'\n", output_dir);
- use_dir = GNUNET_YES;
- }
- }
-
- lf_head = NULL;
- lf_tail = NULL;
-
- for (lts = l->head; NULL != lts; lts = lts->next)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Writing log step %llu\n",
- (long long unsigned int) lts->timestamp.abs_value_us);
-
- for (log_p = lts->head; NULL != log_p; log_p = log_p->next)
- {
- for (log_a = log_p->addr_head; NULL != log_a; log_a = log_a->next)
- {
- cur = find_logging_file_handle (lf_head, lf_tail, log_p->id,
- log_a->aid);
- if (NULL == cur)
- {
- cur = GNUNET_new (struct LoggingFileHandle);
- cur->aid = log_a->aid;
- cur->pid = log_p->id;
-
- if (GNUNET_YES == add_time_stamp)
- GNUNET_asprintf (&filename, "%s%s%s_%s_p%u_a%u_%llu.log",
- (GNUNET_YES == use_dir) ? output_dir : "",
- (GNUNET_YES == use_dir) ? DIR_SEPARATOR_STR : "",
- e->log_prefix,
- opt_solver,
- cur->pid,
- cur->aid,
- l->head->timestamp.abs_value_us);
- else
- GNUNET_asprintf (&filename, "%s%s%s_%s_p%u_a%u.log",
- (GNUNET_YES == use_dir) ? output_dir : "",
- (GNUNET_YES == use_dir) ? DIR_SEPARATOR_STR : "",
- e->log_prefix,
- opt_solver,
- cur->pid,
- cur->aid);
-
- fprintf (stderr,
- "Add writing log data for peer %llu address %llu to file
`%s'\n",
- cur->pid, cur->aid, filename);
-
-
- cur->f_hd = GNUNET_DISK_file_open (filename,
- GNUNET_DISK_OPEN_READWRITE
- | GNUNET_DISK_OPEN_CREATE
- | GNUNET_DISK_OPEN_TRUNCATE,
- GNUNET_DISK_PERM_USER_READ
- | GNUNET_DISK_PERM_USER_WRITE
- | GNUNET_DISK_PERM_GROUP_READ
- | GNUNET_DISK_PERM_OTHER_READ);
- if (NULL == cur->f_hd)
- {
- fprintf (stderr, "Cannot open `%s' to write log data!\n",
filename);
- GNUNET_free (filename);
- GNUNET_free (cur);
- goto cleanup;
- }
- GNUNET_free (filename);
- GNUNET_CONTAINER_DLL_insert (lf_head, lf_tail, cur);
-
- GNUNET_asprintf (&datastring,
- "#time delta;log duration;peer_requested;addr net;
addr_active; bw in; bw out; " \
- "UTILIZATION_UP [abs/rel]; UTILIZATION_UP;
UTILIZATION_DOWN; UTILIZATION_DOWN; " \
- "UTILIZATION_PAYLOAD_UP; UTILIZATION_PAYLOAD_UP;
UTILIZATION_PAYLOAD_DOWN; UTILIZATION_PAYLOAD_DOWN;" \
- "DELAY; DELAY; " \
- "DISTANCE ;DISTANCE ; COST_WAN; COST_WAN; COST_LAN;
COST_LAN; " \
- "COST_WLAN; COST_WLAN;COST_BT; COST_BT; PREF BW
abs; PREF BW rel; PREF LATENCY abs; PREF LATENCY rel;\n");
- GNUNET_DISK_file_write (cur->f_hd, datastring, strlen (datastring));
- GNUNET_free (datastring);
- }
-
- prefstring = GNUNET_strdup ("");
- for (c = 1; c < GNUNET_ATS_PreferenceCount; c++)
- {
- /*
- fprintf(stderr,"\t %s = %.2f %.2f [abs/rel]\n",
- GNUNET_ATS_print_preference_type(c),
- log_p->pref_abs[c], log_p->pref_norm[c]);
- */GNUNET_asprintf (&prefstring_tmp, "%s;%.3f;%.3f",
- prefstring, log_p->pref_abs[c],
log_p->pref_norm[c]);
-
-
- GNUNET_free (prefstring);
- prefstring = GNUNET_strdup (prefstring_tmp);
- GNUNET_free (prefstring_tmp);
- }
-
-
- propstring = GNUNET_strdup ("");
- for (c = 1; c < GNUNET_ATS_PropertyCount; c++)
- {
- if (GNUNET_ATS_NETWORK_TYPE == c)
- continue;
- /*
- fprintf(stderr, "\t %s = %.2f %.2f [abs/rel]\n",
- GNUNET_ATS_print_property_type(c),
- log_a->prop_abs[c], log_a->prop_norm[c]);*/
- GNUNET_asprintf (&propstring_tmp, "%s%.3f;%.3f;",
- propstring,
- log_a->prop_abs[c],
- log_a->prop_norm[c]);
- GNUNET_free (propstring);
- propstring = GNUNET_strdup (propstring_tmp);
- GNUNET_free (propstring_tmp);
- }
- GNUNET_asprintf (&datastring, "%llu;%llu;%u;%u;%i;%u;%u;%s;%s\n",
- GNUNET_TIME_absolute_get_difference (
- l->head->timestamp,
- lts->timestamp).
- rel_value_us / 1000, lts->delta,
- log_p->is_requested, log_a->network, log_a->active,
- log_a->assigned_bw_in, log_a->assigned_bw_out,
- propstring,
- prefstring);
-
- GNUNET_DISK_file_write (cur->f_hd, datastring, strlen (datastring));
- GNUNET_free (datastring);
- GNUNET_free (prefstring);
- GNUNET_free (propstring);
- }
- }
- }
-
- cleanup:
- next = lf_head;
- for (cur = next; NULL != cur; cur = next)
- {
- next = cur->next;
- GNUNET_CONTAINER_DLL_remove (lf_head, lf_tail, cur);
- if (NULL != cur->f_hd)
- GNUNET_DISK_file_close (cur->f_hd);
- GNUNET_free (cur);
- }
-}
-
-
-void
-GNUNET_ATS_solver_logging_eval (struct LoggingHandle *l)
-{
- struct LoggingTimeStep *lts;
- struct LoggingPeer *log_p;
- struct LoggingAddress *log_a;
- int c;
-
- for (lts = l->head; NULL != lts; lts = lts->next)
- {
- fprintf (stderr, "Log step %llu %llu: \n",
- (long long unsigned int) lts->timestamp.abs_value_us,
- (long long unsigned int) lts->delta.rel_value_us);
-
- for (log_p = lts->head; NULL != log_p; log_p = log_p->next)
- {
- fprintf (stderr, "\tLogging peer pid %llu\n", log_p->id);
- for (c = 1; c < GNUNET_ATS_PreferenceCount; c++)
- {
- fprintf (stderr, "\t %s = %.2f %.2f [abs/rel]\n",
- GNUNET_ATS_print_preference_type (c),
- log_p->pref_abs[c], log_p->pref_norm[c]);
- }
-
- for (log_a = log_p->addr_head; NULL != log_a; log_a = log_a->next)
- {
- fprintf (stderr, "\tPeer pid %llu address %llu: %u %u %u\n",
- log_p->id, log_a->aid, log_a->active,
- log_a->assigned_bw_in,
- log_a->assigned_bw_out);
-
- for (c = 1; c < GNUNET_ATS_PropertyCount; c++)
- {
- if (GNUNET_ATS_NETWORK_TYPE == c)
- continue;
- fprintf (stderr, "\t %s = %.2f %.2f [abs/rel]\n",
- GNUNET_ATS_print_property_type (c),
- log_a->prop_abs[c], log_a->prop_norm[c]);
- }
- }
- }
- }
-}
-
-
-void
-GNUNET_ATS_solver_logging_free (struct LoggingHandle *l)
-{
- struct LoggingTimeStep *lts_cur;
- struct LoggingTimeStep *lts_next;
- struct LoggingPeer *log_p_cur;
- struct LoggingPeer *log_p_next;
- struct LoggingAddress *log_a_cur;
- struct LoggingAddress *log_a_next;
-
- if (NULL != l->logging_task)
- GNUNET_SCHEDULER_cancel (l->logging_task);
- l->logging_task = NULL;
-
- lts_next = l->head;
- while (NULL != (lts_cur = lts_next))
- {
- lts_next = lts_cur->next;
-
- log_p_next = lts_cur->head;
- while (NULL != (log_p_cur = log_p_next))
- {
- log_p_next = log_p_cur->next;
-
- log_a_next = log_p_cur->addr_head;
- while (NULL != (log_a_cur = log_a_next))
- {
- log_a_next = log_a_cur->next;
-
- GNUNET_CONTAINER_DLL_remove (log_p_cur->addr_head,
log_p_cur->addr_tail,
- log_a_cur);
- GNUNET_free (log_a_cur);
- }
-
- GNUNET_CONTAINER_DLL_remove (lts_cur->head, lts_cur->tail, log_p_cur);
- GNUNET_free (log_p_cur);
- }
-
- GNUNET_CONTAINER_DLL_remove (l->head, l->tail, lts_cur);
- GNUNET_free (lts_cur);
- }
-
- GNUNET_free (l);
-}
-
-
-/**
- * Property Generators
- */
-static struct PropertyGenerator *prop_gen_head;
-static struct PropertyGenerator *prop_gen_tail;
-
-
-static double
-get_property (struct PropertyGenerator *pg)
-{
- struct GNUNET_TIME_Relative time_delta;
- double delta_value;
- double pref_value;
-
- /* Calculate the current preference value */
- switch (pg->type)
- {
- case GNUNET_ATS_TEST_TG_CONSTANT:
- pref_value = pg->base_value;
- break;
-
- case GNUNET_ATS_TEST_TG_LINEAR:
- time_delta = GNUNET_TIME_absolute_get_duration (pg->time_start);
- /* Calculate point of time in the current period */
- time_delta.rel_value_us = time_delta.rel_value_us
- % pg->duration_period.rel_value_us;
- delta_value = ((double) time_delta.rel_value_us
- / pg->duration_period.rel_value_us) * (pg->max_value
- - pg->base_value);
- if ((pg->max_value < pg->base_value) &&
- ((pg->max_value - pg->base_value) > pg->base_value))
- {
- /* This will cause an underflow */
- GNUNET_break (0);
- }
- pref_value = pg->base_value + delta_value;
- break;
-
- case GNUNET_ATS_TEST_TG_RANDOM:
- delta_value = (double) GNUNET_CRYPTO_random_u32
(GNUNET_CRYPTO_QUALITY_WEAK,
- 10000 * (pg->max_value
- -
pg->base_value))
- / 10000;
- pref_value = pg->base_value + delta_value;
- break;
-
- case GNUNET_ATS_TEST_TG_SINUS:
- time_delta = GNUNET_TIME_absolute_get_duration (pg->time_start);
- /* Calculate point of time in the current period */
- time_delta.rel_value_us = time_delta.rel_value_us
- % pg->duration_period.rel_value_us;
- if ((pg->max_value - pg->base_value) > pg->base_value)
- {
- /* This will cause an underflow for second half of sinus period,
- * will be detected in general when experiments are loaded */
- GNUNET_break (0);
- }
- delta_value = (pg->max_value - pg->base_value)
- * sin ((2 * M_PI)
- / ((double) pg->duration_period.rel_value_us)
- * time_delta.rel_value_us);
- pref_value = pg->base_value + delta_value;
- break;
-
- default:
- pref_value = 0.0;
- break;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Current property value is %f\n",
- pref_value);
- return pref_value;
-}
-
-
-static void
-set_prop_task (void *cls)
-{
- struct PropertyGenerator *pg = cls;
- struct TestPeer *p;
- struct TestAddress *a;
- double prop_value;
- struct GNUNET_ATS_Information atsi;
-
- pg->set_task = NULL;
-
- if (GNUNET_NO == GNUNET_CONTAINER_multipeermap_contains_value (sh->addresses,
- &pg->test_peer
- ->peer_id,
- pg->
- test_address->
- ats_addr))
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Setting property generation for unknown address [%u:%u]\n",
- pg->peer, pg->address_id);
- return;
- }
- if (NULL == (p = find_peer_by_id (pg->peer)))
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Setting property generation for unknown peer %u\n",
- pg->peer);
- return;
- }
- if (NULL == (a = find_address_by_id (p, pg->address_id)))
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Setting property generation for unknown peer %u\n",
- pg->peer);
- return;
- }
-
- prop_value = get_property (pg);
- a->prop_abs[pg->ats_property] = prop_value;
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Setting property for peer [%u] address [%u] for %s to %f\n",
- pg->peer, pg->address_id,
- GNUNET_ATS_print_property_type (pg->ats_property), prop_value);
-
- atsi.type = htonl (pg->ats_property);
- atsi.value = htonl ((uint32_t) prop_value);
-
- /* set performance here! */
- sh->sf->s_bulk_start (sh->sf->cls);
- if (GNUNET_YES == opt_disable_normalization)
- {
- a->prop_abs[pg->ats_property] = prop_value;
- a->prop_norm[pg->ats_property] = prop_value;
- sh->sf->s_address_update_property (sh->sf->cls, a->ats_addr,
- pg->ats_property, prop_value,
- prop_value);
- }
- else
- GAS_normalization_update_property (pg->test_address->ats_addr, &atsi, 1);
- sh->sf->s_bulk_stop (sh->sf->cls);
-
- pg->set_task = GNUNET_SCHEDULER_add_delayed (pg->frequency,
- &set_prop_task, pg);
-}
-
-
-/**
- * Set ats_property to 0 to find all pgs
- */
-static struct PropertyGenerator *
-find_prop_gen (unsigned int peer, unsigned int address,
- uint32_t ats_property)
-{
- struct PropertyGenerator *cur;
-
- for (cur = prop_gen_head; NULL != cur; cur = cur->next)
- if ((cur->peer == peer) && (cur->address_id == address))
- {
- if ((cur->ats_property == ats_property) || (0 == ats_property))
- return cur;
- }
- return NULL;
-}
-
-
-void
-GNUNET_ATS_solver_generate_property_stop (struct PropertyGenerator *pg)
-{
- GNUNET_CONTAINER_DLL_remove (prop_gen_head, prop_gen_tail, pg);
-
- if (NULL != pg->set_task)
- {
- GNUNET_SCHEDULER_cancel (pg->set_task);
- pg->set_task = NULL;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Removing old up preference generator peer [%u] address [%u]
`%s'\n",
- pg->peer, pg->address_id,
- GNUNET_ATS_print_property_type (pg->ats_property));
-
- GNUNET_free (pg);
-}
-
-
-/**
- * Generate between the source master and the partner and set property with a
- * value depending on the generator.
- *
- * @param peer source
- * @param address_id partner
- * @param test_peer the peer
- * @param test_address the address
- * @param type type of generator
- * @param base_value base value
- * @param value_rate maximum value
- * @param period duration of a period of generation (~ 1/frequency)
- * @param frequency how long to generate property
- * @param ats_property ATS property to generate
- * @return the property generator
- */
-struct PropertyGenerator *
-GNUNET_ATS_solver_generate_property_start (unsigned int peer,
- unsigned int address_id,
- struct TestPeer *test_peer,
- struct TestAddress *test_address,
- enum GeneratorType type,
- long int base_value,
- long int value_rate,
- struct GNUNET_TIME_Relative period,
- struct GNUNET_TIME_Relative
- frequency,
- uint32_t ats_property)
-{
- struct PropertyGenerator *pg;
-
- pg = GNUNET_new (struct PropertyGenerator);
- GNUNET_CONTAINER_DLL_insert (prop_gen_head, prop_gen_tail, pg);
- pg->type = type;
- pg->peer = peer;
- pg->test_address = test_address;
- pg->test_peer = test_peer;
- pg->address_id = address_id;
- pg->ats_property = ats_property;
- pg->base_value = base_value;
- pg->max_value = value_rate;
- pg->duration_period = period;
- pg->frequency = frequency;
- pg->time_start = GNUNET_TIME_absolute_get ();
-
- switch (type)
- {
- case GNUNET_ATS_TEST_TG_CONSTANT:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Setting up %s property generator peer [%u] address [%u] `%s'"
\
- "max %u Bips\n",
- print_generator_type (type), pg->peer, pg->address_id,
- GNUNET_ATS_print_property_type (ats_property),
- base_value);
- break;
-
- case GNUNET_ATS_TEST_TG_LINEAR:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Setting up %s property generator peer [%u] address [%u] `%s'
" \
- "min %u Bips max %u Bips\n",
- print_generator_type (type), pg->peer, pg->address_id,
- GNUNET_ATS_print_property_type (ats_property),
- base_value, value_rate);
- break;
-
- case GNUNET_ATS_TEST_TG_SINUS:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Setting up %s property generator peer [%u] address [%u] `%s'
" \
- "baserate %u Bips, amplitude %u Bps\n",
- print_generator_type (type), pg->peer, pg->address_id,
- GNUNET_ATS_print_property_type (ats_property),
- base_value, value_rate);
- break;
-
- case GNUNET_ATS_TEST_TG_RANDOM:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Setting up %s property generator peer [%u] address [%u] `%s'
" \
- "min %u Bips max %u Bps\n",
- print_generator_type (type), pg->peer, pg->address_id,
- GNUNET_ATS_print_property_type (ats_property),
- base_value, value_rate);
- break;
-
- default:
- break;
- }
-
- pg->set_task = GNUNET_SCHEDULER_add_now (&set_prop_task, pg);
- return pg;
-}
-
-
-/**
- * Stop all preferences generators
- */
-void
-GNUNET_ATS_solver_generate_property_stop_all ()
-{
- struct PropertyGenerator *cur;
- struct PropertyGenerator *next;
-
- next = prop_gen_head;
- for (cur = next; NULL != cur; cur = next)
- {
- next = cur->next;
- GNUNET_ATS_solver_generate_property_stop (cur);
- }
-}
-
-
-/**
- * Preference Generators
- */
-static struct PreferenceGenerator *pref_gen_head;
-static struct PreferenceGenerator *pref_gen_tail;
-
-
-static double
-get_preference (struct PreferenceGenerator *pg)
-{
- struct GNUNET_TIME_Relative time_delta;
- double delta_value;
- double pref_value;
-
- /* Calculate the current preference value */
- switch (pg->type)
- {
- case GNUNET_ATS_TEST_TG_CONSTANT:
- pref_value = pg->base_value;
- break;
-
- case GNUNET_ATS_TEST_TG_LINEAR:
- time_delta = GNUNET_TIME_absolute_get_duration (pg->time_start);
- /* Calculate point of time in the current period */
- time_delta.rel_value_us = time_delta.rel_value_us
- % pg->duration_period.rel_value_us;
- delta_value = ((double) time_delta.rel_value_us
- / pg->duration_period.rel_value_us) * (pg->max_value
- - pg->base_value);
- if ((pg->max_value < pg->base_value) &&
- ((pg->max_value - pg->base_value) > pg->base_value))
- {
- /* This will cause an underflow */
- GNUNET_break (0);
- }
- pref_value = pg->base_value + delta_value;
- break;
-
- case GNUNET_ATS_TEST_TG_RANDOM:
- delta_value = (double) GNUNET_CRYPTO_random_u32
(GNUNET_CRYPTO_QUALITY_WEAK,
- 10000 * (pg->max_value
- -
pg->base_value))
- / 10000;
- pref_value = pg->base_value + delta_value;
- break;
-
- case GNUNET_ATS_TEST_TG_SINUS:
- time_delta = GNUNET_TIME_absolute_get_duration (pg->time_start);
- /* Calculate point of time in the current period */
- time_delta.rel_value_us = time_delta.rel_value_us
- % pg->duration_period.rel_value_us;
- if ((pg->max_value - pg->base_value) > pg->base_value)
- {
- /* This will cause an underflow for second half of sinus period,
- * will be detected in general when experiments are loaded */
- GNUNET_break (0);
- }
- delta_value = (pg->max_value - pg->base_value)
- * sin ((2 * M_PI)
- / ((double) pg->duration_period.rel_value_us)
- * time_delta.rel_value_us);
- pref_value = pg->base_value + delta_value;
- break;
-
- default:
- pref_value = 0.0;
- break;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Current preference value is %f\n",
- pref_value);
- return pref_value;
-}
-
-
-static void
-set_feedback_task (void *cls)
-{
- struct PreferenceGenerator *pg = cls;
- struct TestPeer *p;
- double feedback;
- uint32_t bw_acc_out;
- uint32_t bw_acc_in;
- uint32_t delay_acc_in;
- struct GNUNET_TIME_Relative dur;
- double p_new;
-
- pg->feedback_task = NULL;
-
- if (NULL == (p = find_peer_by_id (pg->peer)))
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Setting feedback for unknown peer %u\n", pg->peer);
- return;
- }
-
- switch (pg->kind)
- {
- case GNUNET_ATS_PREFERENCE_BANDWIDTH:
- dur = GNUNET_TIME_absolute_get_duration (pg->feedback_last_bw_update);
- bw_acc_in = dur.rel_value_us * pg->last_assigned_bw_in
- + pg->feedback_bw_in_acc;
- pg->feedback_bw_in_acc = 0;
-
- bw_acc_out = dur.rel_value_us * pg->last_assigned_bw_out
- + pg->feedback_bw_out_acc;
- p_new = get_preference (pg);
- feedback = (p_new / pg->pref_bw_old) * (bw_acc_in + bw_acc_out)
- / (2 * GNUNET_TIME_absolute_get_duration (
- pg->feedback_last).rel_value_us);
-
- break;
-
- case GNUNET_ATS_PREFERENCE_LATENCY:
- dur = GNUNET_TIME_absolute_get_duration (pg->feedback_last_delay_update);
- delay_acc_in = dur.rel_value_us * pg->last_delay_value
- + pg->feedback_delay_acc;
- pg->feedback_delay_acc = 0;
-
- p_new = get_preference (pg);
- feedback = (p_new / pg->pref_latency_old) * (delay_acc_in)
- / (GNUNET_TIME_absolute_get_duration (
- pg->feedback_last).rel_value_us);
-
- break;
-
- default:
- GNUNET_break (0);
- feedback = 0.0;
- break;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Giving feedback for peer [%u] for client %p pref %s of %.3f\n",
- pg->peer, NULL + (pg->client_id),
- GNUNET_ATS_print_preference_type (pg->kind),
- feedback);
-
- sh->sf->s_feedback (sh->sf->cls, NULL + (pg->client_id), &p->peer_id,
- pg->feedback_frequency, pg->kind, feedback);
- pg->feedback_last = GNUNET_TIME_absolute_get ();
-
-
- pg->feedback_bw_out_acc = 0;
- pg->feedback_bw_in_acc = 0;
- pg->feedback_last_bw_update = GNUNET_TIME_absolute_get ();
-
- pg->feedback_delay_acc = 0;
- pg->feedback_last_delay_update = GNUNET_TIME_absolute_get ();
-
-
- pg->feedback_task = GNUNET_SCHEDULER_add_delayed (pg->feedback_frequency,
- &set_feedback_task, pg);
-}
-
-
-static void
-set_pref_task (void *cls)
-{
- struct PreferenceGenerator *pg = cls;
- struct TestPeer *p;
- double pref_value;
-
- pg->set_task = NULL;
-
- if (NULL == (p = find_peer_by_id (pg->peer)))
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Setting preference for unknown peer %u\n", pg->peer);
- return;
- }
-
- pref_value = get_preference (pg);
- switch (pg->kind)
- {
- case GNUNET_ATS_PREFERENCE_BANDWIDTH:
- pg->pref_bw_old = pref_value;
- break;
-
- case GNUNET_ATS_PREFERENCE_LATENCY:
- pg->pref_latency_old = pref_value;
- break;
-
- default:
- break;
- }
-
- p->pref_abs[pg->kind] = pref_value;
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Setting preference for peer [%u] for client %p pref %s to %f\n",
- pg->peer, NULL + (pg->client_id),
- GNUNET_ATS_print_preference_type (pg->kind), pref_value);
-
- if (GNUNET_YES == opt_disable_normalization)
- {
- p->pref_abs[pg->kind] = pref_value;
- p->pref_norm[pg->kind] = pref_value;
- sh->sf->s_pref (sh->sf->cls, &p->peer_id, pg->kind, pref_value);
- }
- else
- update_preference (NULL + (pg->client_id),
- &p->peer_id,
- pg->kind,
- pref_value);
-
- pg->set_task = GNUNET_SCHEDULER_add_delayed (pg->frequency,
- &set_pref_task,
- pg);
-}
-
-
-static struct PreferenceGenerator *
-find_pref_gen (unsigned int peer, enum GNUNET_ATS_PreferenceKind kind)
-{
- struct PreferenceGenerator *cur;
-
- for (cur = pref_gen_head; NULL != cur; cur = cur->next)
- if (cur->peer == peer)
- {
- if ((cur->kind == kind) || (GNUNET_ATS_PREFERENCE_END == kind))
- return cur;
- }
- return NULL;
-}
-
-
-void
-GNUNET_ATS_solver_generate_preferences_stop (struct PreferenceGenerator *pg)
-{
- GNUNET_CONTAINER_DLL_remove (pref_gen_head, pref_gen_tail, pg);
-
- if (NULL != pg->feedback_task)
- {
- GNUNET_SCHEDULER_cancel (pg->feedback_task);
- pg->feedback_task = NULL;
- }
-
- if (NULL != pg->set_task)
- {
- GNUNET_SCHEDULER_cancel (pg->set_task);
- pg->set_task = NULL;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Removing old up preference generator peer [%u] `%s'\n",
- pg->peer, GNUNET_ATS_print_preference_type (pg->kind));
-
- GNUNET_free (pg);
-}
-
-
-static struct TestAddress*
-find_active_address (struct TestPeer *p)
-{
- struct TestAddress *cur;
-
- for (cur = p->addr_head; NULL != cur; cur = cur->next)
- if (GNUNET_YES == cur->ats_addr->active)
- return cur;
- return NULL;
-}
-
-
-/**
- * Generate between the source master and the partner and set property with a
- * value depending on the generator.
- *
- * @param peer source
- * @param address_id partner
- * @param client_id the client
- * @param type type of generator
- * @param base_value base value
- * @param value_rate maximum value
- * @param period duration of a period of generation (~ 1/frequency)
- * @param frequency how long to generate property
- * @param kind ATS preference to generate
- * @param feedback_frequency how often to give feedback
- * @return the preference generator
- */
-struct PreferenceGenerator *
-GNUNET_ATS_solver_generate_preferences_start (unsigned int peer,
- unsigned int address_id,
- unsigned int client_id,
- enum GeneratorType type,
- long int base_value,
- long int value_rate,
- struct GNUNET_TIME_Relative
- period,
- struct GNUNET_TIME_Relative
- frequency,
- enum GNUNET_ATS_PreferenceKind
- kind,
- struct GNUNET_TIME_Relative
- feedback_frequency)
-{
- struct PreferenceGenerator *pg;
- struct TestPeer *p;
-
- if (NULL == (p = find_peer_by_id (peer)))
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Starting preference for unknown peer %u\n", peer);
- return NULL;
- }
-
- pg = GNUNET_new (struct PreferenceGenerator);
- GNUNET_CONTAINER_DLL_insert (pref_gen_head, pref_gen_tail, pg);
- pg->type = type;
- pg->peer = peer;
- pg->client_id = client_id;
- pg->kind = kind;
- pg->base_value = base_value;
- pg->max_value = value_rate;
- pg->duration_period = period;
- pg->frequency = frequency;
- pg->time_start = GNUNET_TIME_absolute_get ();
- pg->feedback_frequency = feedback_frequency;
-
- switch (type)
- {
- case GNUNET_ATS_TEST_TG_CONSTANT:
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Setting up %s preference generator peer [%u] `%s' max %u
Bips\n",
- print_generator_type (type), pg->peer,
- GNUNET_ATS_print_preference_type (kind),
- base_value);
- break;
-
- case GNUNET_ATS_TEST_TG_LINEAR:
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Setting up %s preference generator peer [%u] `%s' min %u Bips
max %u Bips\n",
- print_generator_type (type), pg->peer,
- GNUNET_ATS_print_preference_type (kind),
- base_value, value_rate);
- break;
-
- case GNUNET_ATS_TEST_TG_SINUS:
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Setting up %s preference generator peer [%u] `%s' baserate %u
Bips, amplitude %u Bps\n",
- print_generator_type (type), pg->peer,
- GNUNET_ATS_print_preference_type (kind),
- base_value, value_rate);
- break;
-
- case GNUNET_ATS_TEST_TG_RANDOM:
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Setting up %s preference generator peer [%u] `%s' min %u Bips
max %u Bps\n",
- print_generator_type (type), pg->peer,
- GNUNET_ATS_print_preference_type (kind),
- base_value, value_rate);
- break;
-
- default:
- break;
- }
-
- pg->set_task = GNUNET_SCHEDULER_add_now (&set_pref_task, pg);
- if (GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us !=
- feedback_frequency.rel_value_us)
- {
- struct TestAddress *addr = find_active_address (p);
-
- pg->last_assigned_bw_in = p->assigned_bw_in;
- pg->last_assigned_bw_out = p->assigned_bw_out;
- pg->feedback_bw_in_acc = 0;
- pg->feedback_bw_out_acc = 0;
- pg->last_delay_value = addr->prop_norm[GNUNET_ATS_QUALITY_NET_DELAY];
- pg->feedback_delay_acc = 0;
-
- pg->feedback_last_bw_update = GNUNET_TIME_absolute_get ();
- pg->feedback_last_delay_update = GNUNET_TIME_absolute_get ();
- pg->feedback_last = GNUNET_TIME_absolute_get ();
- pg->feedback_task = GNUNET_SCHEDULER_add_delayed (feedback_frequency,
- &set_feedback_task, pg);
- }
-
- return pg;
-}
-
-
-/**
- * Stop all preferences generators
- */
-void
-GNUNET_ATS_solver_generate_preferences_stop_all ()
-{
- struct PreferenceGenerator *cur;
- struct PreferenceGenerator *next;
-
- next = pref_gen_head;
- for (cur = next; NULL != cur; cur = next)
- {
- next = cur->next;
- GNUNET_ATS_solver_generate_preferences_stop (cur);
- }
-}
-
-
-/**
- * Experiments
- */
-static const char *
-print_op (enum OperationType op)
-{
- switch (op)
- {
- case SOLVER_OP_ADD_ADDRESS:
- return "ADD_ADDRESS";
-
- case SOLVER_OP_DEL_ADDRESS:
- return "DEL_ADDRESS";
-
- case SOLVER_OP_START_SET_PREFERENCE:
- return "START_SET_PREFERENCE";
-
- case SOLVER_OP_STOP_SET_PREFERENCE:
- return "STOP_STOP_PREFERENCE";
-
- case SOLVER_OP_START_SET_PROPERTY:
- return "START_SET_PROPERTY";
-
- case SOLVER_OP_STOP_SET_PROPERTY:
- return "STOP_SET_PROPERTY";
-
- case SOLVER_OP_START_REQUEST:
- return "START_REQUEST";
-
- case SOLVER_OP_STOP_REQUEST:
- return "STOP_REQUEST";
-
- default:
- break;
- }
- return "";
-}
-
-
-static struct Experiment *
-create_experiment ()
-{
- struct Experiment *e;
-
- e = GNUNET_new (struct Experiment);
- e->name = NULL;
- e->start = NULL;
- e->total_duration = GNUNET_TIME_UNIT_ZERO;
- return e;
-}
-
-
-static void
-free_experiment (struct Experiment *e)
-{
- struct Episode *cur;
- struct Episode *next;
- struct GNUNET_ATS_TEST_Operation *cur_o;
- struct GNUNET_ATS_TEST_Operation *next_o;
-
- next = e->start;
- for (cur = next; NULL != cur; cur = next)
- {
- next = cur->next;
-
- next_o = cur->head;
- for (cur_o = next_o; NULL != cur_o; cur_o = next_o)
- {
- next_o = cur_o->next;
- GNUNET_free (cur_o->address);
- GNUNET_free (cur_o->plugin);
- GNUNET_free (cur_o);
- }
- GNUNET_free (cur);
- }
-
- GNUNET_free (e->name);
- GNUNET_free (e->log_prefix);
- GNUNET_free (e->log_output_dir);
- GNUNET_free (e->cfg_file);
- GNUNET_free (e);
-}
-
-
-static int
-load_op_add_address (struct GNUNET_ATS_TEST_Operation *o,
- struct Episode *e,
- int op_counter,
- char *sec_name,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- char *op_name;
- char *op_network;
-
- /* peer pid */
- GNUNET_asprintf (&op_name, "op-%u-peer-id", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->peer_id))
- {
- fprintf (stderr, "Missing peer-id in operation %u `%s' in episode `%s'\n",
- op_counter, "ADD_ADDRESS", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* address pid */
- GNUNET_asprintf (&op_name, "op-%u-address-id", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->address_id))
- {
- fprintf (stderr,
- "Missing address-id in operation %u `%s' in episode `%s'\n",
- op_counter, "ADD_ADDRESS", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* plugin */
- GNUNET_asprintf (&op_name, "op-%u-plugin", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (cfg,
- sec_name,
op_name,
- &o->plugin))
- {
- fprintf (stderr, "Missing plugin in operation %u `%s' in episode `%s'\n",
- op_counter, "ADD_ADDRESS", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* address */
- GNUNET_asprintf (&op_name, "op-%u-address", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (cfg,
- sec_name,
op_name,
- &o->address))
- {
- fprintf (stderr, "Missing address in operation %u `%s' in episode `%s'\n",
- op_counter, "ADD_ADDRESS", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* session */
- GNUNET_asprintf (&op_name, "op-%u-address-session", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->
- address_session))
- {
- fprintf (stderr,
- "Missing address-session in operation %u `%s' in episode `%s'\n",
- op_counter, "ADD_ADDRESS", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* network */
- GNUNET_asprintf (&op_name, "op-%u-address-network", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (cfg,
- sec_name,
op_name,
- &op_network))
- {
- fprintf (stderr,
- "Missing address-network in operation %u `%s' in episode `%s'\n",
- op_counter, "ADD_ADDRESS", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- else
- {
- GNUNET_break (GNUNET_OK == GNUNET_STRINGS_utf8_toupper (op_network,
- op_network));
- if (0 == strcmp (op_network, "UNSPECIFIED"))
- {
- o->address_network = GNUNET_NT_UNSPECIFIED;
- }
- else if (0 == strcmp (op_network, "LOOPBACK"))
- {
- o->address_network = GNUNET_NT_LOOPBACK;
- }
- else if (0 == strcmp (op_network, "LAN"))
- {
- o->address_network = GNUNET_NT_LAN;
- }
- else if (0 == strcmp (op_network, "WAN"))
- {
- o->address_network = GNUNET_NT_WAN;
- }
- else if (0 == strcmp (op_network, "WLAN"))
- {
- o->address_network = GNUNET_NT_WLAN;
- }
- else if (0 == strcmp (op_network, "BT"))
- {
- o->address_network = GNUNET_NT_BT;
- }
- else
- {
- fprintf (stderr,
- "Invalid address-network in operation %u `%s' in episode `%s':
`%s'\n",
- op_counter, "ADD_ADDRESS", op_name, op_network);
- GNUNET_free (op_network);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- }
- GNUNET_free (op_network);
- GNUNET_free (op_name);
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Found operation %s: [%llu:%llu] address `%s' plugin `%s' \n",
- "ADD_ADDRESS", o->peer_id, o->address_id, o->address, o->plugin);
-
- return GNUNET_OK;
-}
-
-
-static int
-load_op_del_address (struct GNUNET_ATS_TEST_Operation *o,
- struct Episode *e,
- int op_counter,
- char *sec_name,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- char *op_name;
-
- // char *op_network;
-
- /* peer pid */
- GNUNET_asprintf (&op_name, "op-%u-peer-id", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->peer_id))
- {
- fprintf (stderr, "Missing peer-id in operation %u `%s' in episode `%s'\n",
- op_counter, "DEL_ADDRESS", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* address pid */
- GNUNET_asprintf (&op_name, "op-%u-address-id", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->address_id))
- {
- fprintf (stderr,
- "Missing address-id in operation %u `%s' in episode `%s'\n",
- op_counter, "DEL_ADDRESS", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
-#if 0
- /* plugin */
- GNUNET_asprintf (&op_name, "op-%u-plugin", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (cfg,
- sec_name,
op_name,
- &o->plugin))
- {
- fprintf (stderr, "Missing plugin in operation %u `%s' in episode `%s'\n",
- op_counter, "DEL_ADDRESS", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* address */
- GNUNET_asprintf (&op_name, "op-%u-address", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (cfg,
- sec_name,
op_name,
- &o->address))
- {
- fprintf (stderr, "Missing address in operation %u `%s' in episode `%s'\n",
- op_counter, "DEL_ADDRESS", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* session */
- GNUNET_asprintf (&op_name, "op-%u-address-session", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->
- address_session))
- {
- fprintf (stderr,
- "Missing address-session in operation %u `%s' in episode `%s'\n",
- op_counter, "DEL_ADDRESS", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-#endif
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Found operation %s: [%llu:%llu] address `%s' plugin `%s' \n",
- "DEL_ADDRESS", o->peer_id, o->address_id, o->address, o->plugin);
-
- return GNUNET_OK;
-}
-
-
-static enum GNUNET_ATS_Property
-parse_preference_string (const char *str)
-{
- int c = 0;
- char *props[GNUNET_ATS_PreferenceCount] = GNUNET_ATS_PreferenceTypeString;
-
- for (c = 0; c < GNUNET_ATS_PreferenceCount; c++)
- if (0 == strcmp (str, props[c]))
- return c;
- return 0;
-}
-
-
-static int
-load_op_start_set_preference (struct GNUNET_ATS_TEST_Operation *o,
- struct Episode *e,
- int op_counter,
- char *sec_name,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- char *op_name;
- char *type;
- char *pref;
-
- /* peer pid */
- GNUNET_asprintf (&op_name, "op-%u-peer-id", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->peer_id))
- {
- fprintf (stderr, "Missing peer-id in operation %u `%s' in episode `%s'\n",
- op_counter, "START_SET_PREFERENCE", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* address pid */
- GNUNET_asprintf (&op_name, "op-%u-client-id", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->client_id))
- {
- fprintf (stderr, "Missing client-id in operation %u `%s' in episode
`%s'\n",
- op_counter, "START_SET_PREFERENCE", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* generator */
- GNUNET_asprintf (&op_name, "op-%u-gen-type", op_counter);
- if ((GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (cfg,
- sec_name,
- op_name,
&type)))
- {
- fprintf (stderr, "Missing type in operation %u `%s' in episode `%s'\n",
- op_counter, "START_SET_PREFERENCE", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
-
- /* Load arguments for set_rate, start_send, set_preference */
- if (0 == strcmp (type, "constant"))
- {
- o->gen_type = GNUNET_ATS_TEST_TG_CONSTANT;
- }
- else if (0 == strcmp (type, "linear"))
- {
- o->gen_type = GNUNET_ATS_TEST_TG_LINEAR;
- }
- else if (0 == strcmp (type, "sinus"))
- {
- o->gen_type = GNUNET_ATS_TEST_TG_SINUS;
- }
- else if (0 == strcmp (type, "random"))
- {
- o->gen_type = GNUNET_ATS_TEST_TG_RANDOM;
- }
- else
- {
- fprintf (stderr, "Invalid generator type %u `%s' in episode %u\n",
- op_counter, op_name, e->id);
- GNUNET_free (type);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (type);
- GNUNET_free (op_name);
-
-
- /* Get base rate */
- GNUNET_asprintf (&op_name, "op-%u-base-rate", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->base_rate))
- {
- fprintf (stderr, "Missing base rate in operation %u `%s' in episode %u\n",
- op_counter, op_name, e->id);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
-
- /* Get max rate */
- GNUNET_asprintf (&op_name, "op-%u-max-rate", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->max_rate))
- {
- if ((GNUNET_ATS_TEST_TG_LINEAR == o->gen_type) ||
- (GNUNET_ATS_TEST_TG_RANDOM == o->gen_type) ||
- (GNUNET_ATS_TEST_TG_SINUS == o->gen_type))
- {
- fprintf (stderr, "Missing max rate in operation %u `%s' in episode %u\n",
- op_counter, op_name, e->id);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- }
- GNUNET_free (op_name);
-
- /* Get period */
- GNUNET_asprintf (&op_name, "op-%u-period", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_time (cfg,
- sec_name, op_name,
- &o->period))
- {
- o->period = e->duration;
- }
- GNUNET_free (op_name);
-
- /* Get frequency */
- GNUNET_asprintf (&op_name, "op-%u-frequency", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_time (cfg,
- sec_name, op_name,
- &o->frequency))
- {
- fprintf (stderr, "Missing frequency in operation %u `%s' in episode %u\n",
- op_counter, op_name, e->id);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* Get preference */
- GNUNET_asprintf (&op_name, "op-%u-pref", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (cfg,
- sec_name,
op_name,
- &pref))
- {
- fprintf (stderr, "Missing preference in operation %u `%s' in episode %u\n",
- op_counter, op_name, e->id);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
-
- if (0 == (o->pref_type = parse_preference_string (pref)))
- {
- fprintf (stderr, "Invalid preference in operation %u `%s' in episode %u\n",
- op_counter, op_name, e->id);
- GNUNET_free (op_name);
- GNUNET_free (pref);
- return GNUNET_SYSERR;
- }
- GNUNET_free (pref);
- GNUNET_free (op_name);
-
- /* Get feedback delay */
- GNUNET_asprintf (&op_name, "op-%u-feedback_delay", op_counter);
- if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_time (cfg,
- sec_name, op_name,
- &o->feedback_delay))
- {
- fprintf (stderr,
- "Using feedback delay %llu in operation %u `%s' in episode %u\n",
- (long long unsigned int) o->feedback_delay.rel_value_us,
- op_counter, op_name, e->id);
- }
- else
- o->feedback_delay = GNUNET_TIME_UNIT_FOREVER_REL;
- GNUNET_free (op_name);
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Found operation %s: [%llu:%llu]: %s = %llu\n",
- "START_SET_PREFERENCE", o->peer_id, o->address_id,
- GNUNET_ATS_print_preference_type (o->pref_type), o->base_rate);
-
- return GNUNET_OK;
-}
-
-
-static int
-load_op_stop_set_preference (struct GNUNET_ATS_TEST_Operation *o,
- struct Episode *e,
- int op_counter,
- char *sec_name,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- char *op_name;
- char *pref;
-
- /* peer pid */
- GNUNET_asprintf (&op_name, "op-%u-peer-id", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->peer_id))
- {
- fprintf (stderr, "Missing peer-id in operation %u `%s' in episode `%s'\n",
- op_counter, "STOP_SET_PREFERENCE", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* address pid */
- GNUNET_asprintf (&op_name, "op-%u-address-id", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->address_id))
- {
- fprintf (stderr,
- "Missing address-id in operation %u `%s' in episode `%s'\n",
- op_counter, "STOP_SET_PREFERENCE", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* Get preference */
- GNUNET_asprintf (&op_name, "op-%u-pref", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (cfg,
- sec_name,
op_name,
- &pref))
- {
- fprintf (stderr,
- "Missing preference in operation %u `%s' in episode `%s'\n",
- op_counter, "STOP_SET_PREFERENCE", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
-
- if (0 == (o->pref_type = parse_preference_string (pref)))
- {
- fprintf (stderr, "Invalid preference in operation %u `%s' in episode %u\n",
- op_counter, op_name, e->id);
- GNUNET_free (op_name);
- GNUNET_free (pref);
- return GNUNET_SYSERR;
- }
- GNUNET_free (pref);
- GNUNET_free (op_name);
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Found operation %s: [%llu:%llu]: %s\n",
- "STOP_SET_PREFERENCE", o->peer_id, o->address_id,
- GNUNET_ATS_print_preference_type (o->pref_type));
- return GNUNET_OK;
-}
-
-
-static enum GNUNET_ATS_Property
-parse_property_string (const char *str)
-{
- enum GNUNET_ATS_Property c;
-
- for (c = 0; c < GNUNET_ATS_PropertyCount; c++)
- if (0 == strcmp (str,
- GNUNET_ATS_print_property_type (c)))
- return c;
- return 0;
-}
-
-
-static int
-load_op_start_set_property (struct GNUNET_ATS_TEST_Operation *o,
- struct Episode *e,
- int op_counter,
- char *sec_name,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- char *op_name;
- char *type;
- char *prop;
-
- /* peer pid */
- GNUNET_asprintf (&op_name, "op-%u-peer-id", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->peer_id))
- {
- fprintf (stderr, "Missing peer-id in operation %u `%s' in episode `%s'\n",
- op_counter, "START_SET_PROPERTY", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* address pid */
- GNUNET_asprintf (&op_name, "op-%u-address-id", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->address_id))
- {
- fprintf (stderr,
- "Missing address-id in operation %u `%s' in episode `%s'\n",
- op_counter, "START_SET_PROPERTY", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* generator */
- GNUNET_asprintf (&op_name, "op-%u-gen-type", op_counter);
- if ((GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (cfg,
- sec_name,
- op_name,
&type)))
- {
- fprintf (stderr, "Missing type in operation %u `%s' in episode `%s'\n",
- op_counter, "START_SET_PROPERTY", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
-
- /* Load arguments for set_rate, start_send, set_preference */
- if (0 == strcmp (type, "constant"))
- {
- o->gen_type = GNUNET_ATS_TEST_TG_CONSTANT;
- }
- else if (0 == strcmp (type, "linear"))
- {
- o->gen_type = GNUNET_ATS_TEST_TG_LINEAR;
- }
- else if (0 == strcmp (type, "sinus"))
- {
- o->gen_type = GNUNET_ATS_TEST_TG_SINUS;
- }
- else if (0 == strcmp (type, "random"))
- {
- o->gen_type = GNUNET_ATS_TEST_TG_RANDOM;
- }
- else
- {
- fprintf (stderr, "Invalid generator type %u `%s' in episode %u\n",
- op_counter, op_name, e->id);
- GNUNET_free (type);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (type);
- GNUNET_free (op_name);
-
-
- /* Get base rate */
- GNUNET_asprintf (&op_name, "op-%u-base-rate", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->base_rate))
- {
- fprintf (stderr, "Missing base rate in operation %u `%s' in episode %u\n",
- op_counter, op_name, e->id);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
-
- /* Get max rate */
- GNUNET_asprintf (&op_name, "op-%u-max-rate", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->max_rate))
- {
- if ((GNUNET_ATS_TEST_TG_LINEAR == o->gen_type) ||
- (GNUNET_ATS_TEST_TG_RANDOM == o->gen_type) ||
- (GNUNET_ATS_TEST_TG_SINUS == o->gen_type))
- {
- fprintf (stderr, "Missing max rate in operation %u `%s' in episode %u\n",
- op_counter, op_name, e->id);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- }
- GNUNET_free (op_name);
-
- /* Get period */
- GNUNET_asprintf (&op_name, "op-%u-period", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_time (cfg,
- sec_name, op_name,
- &o->period))
- {
- o->period = e->duration;
- }
- GNUNET_free (op_name);
-
- /* Get frequency */
- GNUNET_asprintf (&op_name, "op-%u-frequency", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_time (cfg,
- sec_name, op_name,
- &o->frequency))
- {
- fprintf (stderr, "Missing frequency in operation %u `%s' in episode %u\n",
- op_counter, op_name, e->id);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* Get preference */
- GNUNET_asprintf (&op_name, "op-%u-property", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (cfg,
- sec_name,
op_name,
- &prop))
- {
- fprintf (stderr, "Missing property in operation %u `%s' in episode %u\n",
- op_counter, op_name, e->id);
- GNUNET_free (op_name);
- GNUNET_free (prop);
- return GNUNET_SYSERR;
- }
-
- if (0 == (o->prop_type = parse_property_string (prop)))
- {
- fprintf (stderr, "Invalid property in operation %u `%s' in episode %u\n",
- op_counter, op_name, e->id);
- GNUNET_free (op_name);
- GNUNET_free (prop);
- return GNUNET_SYSERR;
- }
-
- GNUNET_free (prop);
- GNUNET_free (op_name);
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Found operation %s: [%llu:%llu] %s = %llu\n",
- "START_SET_PROPERTY", o->peer_id, o->address_id,
- GNUNET_ATS_print_property_type (o->prop_type), o->base_rate);
-
- return GNUNET_OK;
-}
-
-
-static int
-load_op_stop_set_property (struct GNUNET_ATS_TEST_Operation *o,
- struct Episode *e,
- int op_counter,
- char *sec_name,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- char *op_name;
- char *pref;
-
- /* peer pid */
- GNUNET_asprintf (&op_name, "op-%u-peer-id", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->peer_id))
- {
- fprintf (stderr, "Missing peer-id in operation %u `%s' in episode `%s'\n",
- op_counter, "STOP_SET_PROPERTY", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* address pid */
- GNUNET_asprintf (&op_name, "op-%u-address-id", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->address_id))
- {
- fprintf (stderr,
- "Missing address-id in operation %u `%s' in episode `%s'\n",
- op_counter, "STOP_SET_PROPERTY", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
-
- /* Get property */
- GNUNET_asprintf (&op_name, "op-%u-property", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (cfg,
- sec_name,
op_name,
- &pref))
- {
- fprintf (stderr, "Missing property in operation %u `%s' in episode `%s'\n",
- op_counter, "STOP_SET_PROPERTY", op_name);
- GNUNET_free (op_name);
- GNUNET_free (pref);
- return GNUNET_SYSERR;
- }
-
- if (0 == (o->prop_type = parse_property_string (pref)))
- {
- fprintf (stderr, "Invalid property in operation %u `%s' in episode %u\n",
- op_counter, op_name, e->id);
- GNUNET_free (op_name);
- GNUNET_free (pref);
- return GNUNET_SYSERR;
- }
-
- GNUNET_free (pref);
- GNUNET_free (op_name);
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Found operation %s: [%llu:%llu] %s\n",
- "STOP_SET_PROPERTY", o->peer_id, o->address_id,
- GNUNET_ATS_print_property_type (o->prop_type));
-
- return GNUNET_OK;
-}
-
-
-static int
-load_op_start_request (struct GNUNET_ATS_TEST_Operation *o,
- struct Episode *e,
- int op_counter,
- char *sec_name,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- char *op_name;
-
- /* peer pid */
- GNUNET_asprintf (&op_name, "op-%u-peer-id", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->peer_id))
- {
- fprintf (stderr, "Missing peer-id in operation %u `%s' in episode `%s'\n",
- op_counter, "START_REQUEST", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
- return GNUNET_OK;
-}
-
-
-static int
-load_op_stop_request (struct GNUNET_ATS_TEST_Operation *o,
- struct Episode *e,
- int op_counter,
- char *sec_name,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- char *op_name;
-
- /* peer pid */
- GNUNET_asprintf (&op_name, "op-%u-peer-id", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number (cfg,
- sec_name,
op_name,
- &o->peer_id))
- {
- fprintf (stderr, "Missing peer-id in operation %u `%s' in episode `%s'\n",
- op_counter, "STOP_REQUEST", op_name);
- GNUNET_free (op_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (op_name);
- return GNUNET_OK;
-}
-
-
-static int
-load_episode (struct Experiment *e, struct Episode *cur,
- struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- struct GNUNET_ATS_TEST_Operation *o;
- char *sec_name;
- char *op_name;
- char *op;
- int op_counter = 0;
- int res;
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "=== Parsing episode %u\n", cur->id);
- GNUNET_asprintf (&sec_name, "episode-%u", cur->id);
-
- while (1)
- {
- /* Load operation */
- GNUNET_asprintf (&op_name, "op-%u-operation", op_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (cfg,
- sec_name,
- op_name, &op))
- {
- GNUNET_free (op_name);
- break;
- }
- o = GNUNET_new (struct GNUNET_ATS_TEST_Operation);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "==== Parsing operation %u: `%s'\n",
- cur->id, op_name);
-
- /* operations = set_rate, start_send, stop_send, set_preference */
- if (0 == strcmp (op, "address_add"))
- {
- o->type = SOLVER_OP_ADD_ADDRESS;
- res = load_op_add_address (o, cur,
- op_counter, sec_name, cfg);
- }
- else if (0 == strcmp (op, "address_del"))
- {
- o->type = SOLVER_OP_DEL_ADDRESS;
- res = load_op_del_address (o, cur,
- op_counter, sec_name, cfg);
- }
- else if (0 == strcmp (op, "start_set_property"))
- {
- o->type = SOLVER_OP_START_SET_PROPERTY;
- res = load_op_start_set_property (o, cur,
- op_counter, sec_name, cfg);
- }
- else if (0 == strcmp (op, "stop_set_property"))
- {
- o->type = SOLVER_OP_STOP_SET_PROPERTY;
- res = load_op_stop_set_property (o, cur,
- op_counter, sec_name, cfg);
- }
- else if (0 == strcmp (op, "start_set_preference"))
- {
- o->type = SOLVER_OP_START_SET_PREFERENCE;
- res = load_op_start_set_preference (o, cur,
- op_counter, sec_name, cfg);
- }
- else if (0 == strcmp (op, "stop_set_preference"))
- {
- o->type = SOLVER_OP_STOP_SET_PREFERENCE;
- res = load_op_stop_set_preference (o, cur,
- op_counter, sec_name, cfg);
- }
- else if (0 == strcmp (op, "start_request"))
- {
- o->type = SOLVER_OP_START_REQUEST;
- res = load_op_start_request (o, cur,
- op_counter, sec_name, cfg);
- }
- else if (0 == strcmp (op, "stop_request"))
- {
- o->type = SOLVER_OP_STOP_REQUEST;
- res = load_op_stop_request (o, cur,
- op_counter, sec_name, cfg);
- }
- else
- {
- fprintf (stderr, "Invalid operation %u `%s' in episode %u\n",
- op_counter, op, cur->id);
- res = GNUNET_SYSERR;
- }
-
- GNUNET_free (op);
- GNUNET_free (op_name);
-
- if (GNUNET_SYSERR == res)
- {
- GNUNET_free (o);
- GNUNET_free (sec_name);
- return GNUNET_SYSERR;
- }
-
- GNUNET_CONTAINER_DLL_insert_tail (cur->head, cur->tail, o);
- op_counter++;
- }
- GNUNET_free (sec_name);
- return GNUNET_OK;
-}
-
-
-static int
-load_episodes (struct Experiment *e, struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- int e_counter = 0;
- char *sec_name;
- struct GNUNET_TIME_Relative e_duration;
- struct Episode *cur;
- struct Episode *last;
-
- e_counter = 0;
- last = NULL;
- while (1)
- {
- GNUNET_asprintf (&sec_name, "episode-%u", e_counter);
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_time (cfg,
- sec_name,
- "duration",
- &e_duration))
- {
- GNUNET_free (sec_name);
- break;
- }
-
- cur = GNUNET_new (struct Episode);
- cur->duration = e_duration;
- cur->id = e_counter;
-
- if (GNUNET_OK != load_episode (e, cur, cfg))
- {
- GNUNET_free (sec_name);
- GNUNET_free (cur);
- return GNUNET_SYSERR;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Found episode %u with duration %s \n",
- e_counter,
- GNUNET_STRINGS_relative_time_to_string (cur->duration,
- GNUNET_YES));
-
- /* Update experiment */
- e->num_episodes++;
- e->total_duration = GNUNET_TIME_relative_add (e->total_duration,
- cur->duration);
- /* Put in linked list */
- if (NULL == last)
- e->start = cur;
- else
- last->next = cur;
-
- GNUNET_free (sec_name);
- e_counter++;
- last = cur;
- }
- return e_counter;
-}
-
-
-static void
-timeout_experiment (void *cls)
-{
- struct Experiment *e = cls;
-
- e->experiment_timeout_task = NULL;
- fprintf (stderr, "Experiment timeout!\n");
-
- if (NULL != e->episode_timeout_task)
- {
- GNUNET_SCHEDULER_cancel (e->episode_timeout_task);
- e->episode_timeout_task = NULL;
- }
-
- e->e_done_cb (e, GNUNET_TIME_absolute_get_duration (e->start_time),
- GNUNET_SYSERR);
-}
-
-
-struct ATS_Address *
-create_ats_address (const struct GNUNET_PeerIdentity *peer,
- const char *plugin_name,
- const void *plugin_addr,
- size_t plugin_addr_len,
- uint32_t session_id,
- uint32_t network)
-{
- struct ATS_Address *aa = NULL;
-
- aa = GNUNET_malloc (sizeof(struct ATS_Address) + plugin_addr_len + strlen (
- plugin_name) + 1);
- aa->atsi = GNUNET_new (struct GNUNET_ATS_Information);
- aa->atsi[0].type = htonl (GNUNET_ATS_NETWORK_TYPE);
- aa->atsi[0].value = htonl (network);
- aa->atsi_count = 1;
-
- aa->peer = *peer;
- aa->addr_len = plugin_addr_len;
- aa->addr = &aa[1];
- aa->plugin = (char *) &aa[1] + plugin_addr_len;
- GNUNET_memcpy (&aa[1], plugin_addr, plugin_addr_len);
- GNUNET_memcpy (aa->plugin, plugin_name, strlen (plugin_name) + 1);
- aa->session_id = session_id;
-
- return aa;
-}
-
-
-static void
-enforce_add_address (struct GNUNET_ATS_TEST_Operation *op)
-{
- struct TestPeer *p;
- struct TestAddress *a;
- int c;
-
- if (NULL == (p = find_peer_by_id (op->peer_id)))
- {
- p = GNUNET_new (struct TestPeer);
- p->id = op->peer_id;
- p->assigned_bw_in = 0;
- p->assigned_bw_out = 0;
- memset (&p->peer_id, op->peer_id, sizeof(p->peer_id));
- for (c = 0; c < GNUNET_ATS_PreferenceCount; c++)
- {
- p->pref_abs[c] = DEFAULT_ABS_PREFERENCE;
- p->pref_norm[c] = DEFAULT_REL_PREFERENCE;
- }
-
- GNUNET_CONTAINER_DLL_insert (peer_head, peer_tail, p);
- }
-
- if (NULL != (find_address_by_id (p, op->address_id)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Duplicate address %u for peer %u\n",
- op->address_id, op->peer_id);
- return;
- }
-
- a = GNUNET_new (struct TestAddress);
- a->aid = op->address_id;
- a->network = op->address_network;
- a->ats_addr = create_ats_address (&p->peer_id, op->plugin, op->address,
- strlen (op->address) + 1,
- op->address_session, op->address_network);
- memset (&p->peer_id, op->peer_id, sizeof(p->peer_id));
- GNUNET_CONTAINER_DLL_insert_tail (p->addr_head, p->addr_tail, a);
-
- for (c = 0; c < GNUNET_ATS_PropertyCount; c++)
- a->prop_norm[c] = DEFAULT_REL_QUALITY;
-
- GNUNET_CONTAINER_multipeermap_put (sh->addresses, &p->peer_id, a->ats_addr,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Adding address %u for peer %u in network `%s'\n",
- op->address_id, op->peer_id, GNUNET_NT_to_string (a->network));
-
- sh->sf->s_add (sh->sf->cls, a->ats_addr, op->address_network);
-}
-
-
-static void
-enforce_del_address (struct GNUNET_ATS_TEST_Operation *op)
-{
- struct TestPeer *p;
- struct TestAddress *a;
- struct PropertyGenerator *pg;
-
- if (NULL == (p = find_peer_by_id (op->peer_id)))
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Deleting address for unknown peer %u\n", op->peer_id);
- return;
- }
-
- if (NULL == (a = find_address_by_id (p, op->address_id)))
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Deleting address for unknown peer %u\n", op->peer_id);
- return;
- }
-
- while (NULL != (pg = find_prop_gen (p->id, a->aid, 0)))
- {
- GNUNET_ATS_solver_generate_property_stop (pg);
- }
-
- GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove (sh->addresses,
- &p->peer_id,
- a->ats_addr));
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Removing address %u for peer %u\n",
- op->address_id,
- op->peer_id);
-
- sh->sf->s_del (sh->sf->cls, a->ats_addr);
-
- if (NULL != l)
- {
- GNUNET_ATS_solver_logging_now (l);
- }
- GNUNET_CONTAINER_DLL_remove (p->addr_head, p->addr_tail, a);
-
- GNUNET_free (a->ats_addr->atsi);
- GNUNET_free (a->ats_addr);
- GNUNET_free (a);
-}
-
-
-static void
-enforce_start_property (struct GNUNET_ATS_TEST_Operation *op)
-{
- struct PropertyGenerator *pg;
- struct TestPeer *p;
- struct TestAddress *a;
-
- if (NULL != (pg = find_prop_gen (op->peer_id, op->address_id,
op->prop_type)))
- {
- GNUNET_ATS_solver_generate_property_stop (pg);
- GNUNET_free (pg);
- }
-
- if (NULL == (p = find_peer_by_id (op->peer_id)))
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Starting property generation for unknown peer %u\n",
- op->peer_id);
- return;
- }
-
- if (NULL == (a = find_address_by_id (p, op->address_id)))
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Setting property for unknown address %u\n", op->peer_id);
- return;
- }
-
- GNUNET_ATS_solver_generate_property_start (op->peer_id,
- op->address_id,
- p, a,
- op->gen_type,
- op->base_rate,
- op->max_rate,
- op->period,
- op->frequency,
- op->prop_type);
-}
-
-
-static void
-enforce_stop_property (struct GNUNET_ATS_TEST_Operation *op)
-{
- struct PropertyGenerator *pg = find_prop_gen (op->peer_id, op->address_id,
- op->prop_type);
-
- if (NULL != pg)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Stopping preference generation for peer %u address %u\n",
- op->peer_id,
- op->address_id);
- GNUNET_ATS_solver_generate_property_stop (pg);
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Cannot find preference generator for peer %u address %u\n",
- op->peer_id, op->address_id);
- GNUNET_break (0);
- }
-}
-
-
-static void
-enforce_start_preference (struct GNUNET_ATS_TEST_Operation *op)
-{
- struct PreferenceGenerator *pg;
-
- if (NULL != (pg = find_pref_gen (op->peer_id, op->pref_type)))
- {
- GNUNET_ATS_solver_generate_preferences_stop (pg);
- GNUNET_free (pg);
- }
-
- if (NULL == (find_peer_by_id (op->peer_id)))
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Starting preference generation for unknown peer %u\n",
- op->peer_id);
- return;
- }
-
- GNUNET_ATS_solver_generate_preferences_start (op->peer_id,
- op->address_id,
- op->client_id,
- op->gen_type,
- op->base_rate,
- op->max_rate,
- op->period,
- op->frequency,
- op->pref_type,
- op->frequency);
-}
-
-
-static void
-enforce_stop_preference (struct GNUNET_ATS_TEST_Operation *op)
-{
- struct PreferenceGenerator *pg = find_pref_gen (op->peer_id,
- op->pref_type);
-
- if (NULL != pg)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Stopping property generation for peer %u address %u\n",
- op->peer_id,
- op->address_id);
- GNUNET_ATS_solver_generate_preferences_stop (pg);
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Cannot find preference generator for peer %u address %u\n",
- op->peer_id, op->address_id);
- GNUNET_break (0);
- }
-}
-
-
-static void
-enforce_start_request (struct GNUNET_ATS_TEST_Operation *op)
-{
- struct TestPeer *p;
-
- if (NULL == (p = find_peer_by_id (op->peer_id)))
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Requesting address for unknown peer %u\n", op->peer_id);
- return;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Requesting address for peer %u\n",
- op->peer_id);
- p->is_requested = GNUNET_YES;
-
- sh->sf->s_get (sh->sf->cls, &p->peer_id);
-}
-
-
-static void
-enforce_stop_request (struct GNUNET_ATS_TEST_Operation *op)
-{
- struct TestPeer *p;
-
- if (NULL == (p = find_peer_by_id (op->peer_id)))
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Requesting address for unknown peer %u\n", op->peer_id);
- return;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Stop requesting address for peer %u\n",
- op->peer_id);
- p->is_requested = GNUNET_NO;
- p->assigned_bw_in = 0;
- p->assigned_bw_out = 0;
- sh->sf->s_get_stop (sh->sf->cls, &p->peer_id);
-
- if (NULL != l)
- {
- GNUNET_ATS_solver_logging_now (l);
- }
-}
-
-
-static void
-enforce_episode (struct Episode *ep)
-{
- struct GNUNET_ATS_TEST_Operation *cur;
-
- for (cur = ep->head; NULL != cur; cur = cur->next)
- {
- switch (cur->type)
- {
- case SOLVER_OP_ADD_ADDRESS:
- fprintf (stderr, "Enforcing operation: %s [%llu:%llu]\n",
- print_op (cur->type), cur->peer_id, cur->address_id);
- enforce_add_address (cur);
- break;
-
- case SOLVER_OP_DEL_ADDRESS:
- fprintf (stderr, "Enforcing operation: %s [%llu:%llu]\n",
- print_op (cur->type), cur->peer_id, cur->address_id);
- enforce_del_address (cur);
- break;
-
- case SOLVER_OP_START_SET_PROPERTY:
- fprintf (stderr, "Enforcing operation: %s [%llu:%llu] == %llu\n",
- print_op (cur->type), cur->peer_id, cur->address_id,
- cur->base_rate);
- enforce_start_property (cur);
- break;
-
- case SOLVER_OP_STOP_SET_PROPERTY:
- fprintf (stderr, "Enforcing operation: %s [%llu:%llu] == %llu\n",
- print_op (cur->type), cur->peer_id, cur->address_id,
- cur->base_rate);
- enforce_stop_property (cur);
- break;
-
- case SOLVER_OP_START_SET_PREFERENCE:
- fprintf (stderr, "Enforcing operation: %s [%llu:%llu] == %llu\n",
- print_op (cur->type), cur->peer_id, cur->address_id,
- cur->base_rate);
- enforce_start_preference (cur);
- break;
-
- case SOLVER_OP_STOP_SET_PREFERENCE:
- fprintf (stderr, "Enforcing operation: %s [%llu:%llu] == %llu\n",
- print_op (cur->type), cur->peer_id, cur->address_id,
- cur->base_rate);
- enforce_stop_preference (cur);
- break;
-
- case SOLVER_OP_START_REQUEST:
- fprintf (stderr, "Enforcing operation: %s [%llu]\n",
- print_op (cur->type), cur->peer_id);
- enforce_start_request (cur);
- break;
-
- case SOLVER_OP_STOP_REQUEST:
- fprintf (stderr, "Enforcing operation: %s [%llu]\n",
- print_op (cur->type), cur->peer_id);
- enforce_stop_request (cur);
- break;
-
- default:
- break;
- }
- }
-}
-
-
-static void
-timeout_episode (void *cls)
-{
- struct Experiment *e = cls;
-
- e->episode_timeout_task = NULL;
- if (NULL != e->ep_done_cb)
- e->ep_done_cb (e->cur);
-
- /* Scheduling next */
- e->cur = e->cur->next;
- if (NULL == e->cur)
- {
- /* done */
- fprintf (stderr, "Last episode done!\n");
- if (NULL != e->experiment_timeout_task)
- {
- GNUNET_SCHEDULER_cancel (e->experiment_timeout_task);
- e->experiment_timeout_task = NULL;
- }
- e->e_done_cb (e, GNUNET_TIME_absolute_get_duration (e->start_time),
- GNUNET_OK);
- return;
- }
-
- fprintf (stderr, "Running episode %u with timeout %s\n",
- e->cur->id,
- GNUNET_STRINGS_relative_time_to_string (e->cur->duration,
- GNUNET_YES));
- e->episode_timeout_task = GNUNET_SCHEDULER_add_delayed (e->cur->duration,
- &timeout_episode, e);
- enforce_episode (e->cur);
-}
-
-
-void
-GNUNET_ATS_solvers_experimentation_run (struct Experiment *e,
- GNUNET_ATS_TESTING_EpisodeDoneCallback
- ep_done_cb,
-
GNUNET_ATS_TESTING_ExperimentDoneCallback
- e_done_cb)
-{
- fprintf (stderr, "Running experiment `%s' with timeout %s\n", e->name,
- GNUNET_STRINGS_relative_time_to_string (e->max_duration,
- GNUNET_YES));
- e->e_done_cb = e_done_cb;
- e->ep_done_cb = ep_done_cb;
- e->start_time = GNUNET_TIME_absolute_get ();
-
- /* Start total time out */
- e->experiment_timeout_task = GNUNET_SCHEDULER_add_delayed (e->max_duration,
-
&timeout_experiment,
- e);
-
- /* Start */
- if (NULL == e->start)
- {
- GNUNET_break (0);
- return;
- }
-
- e->cur = e->start;
- fprintf (stderr, "Running episode %u with timeout %s\n",
- e->cur->id,
- GNUNET_STRINGS_relative_time_to_string (e->cur->duration,
- GNUNET_YES));
- e->episode_timeout_task = GNUNET_SCHEDULER_add_delayed (e->cur->duration,
- &timeout_episode, e);
- enforce_episode (e->cur);
-}
-
-
-void
-GNUNET_ATS_solvers_experimentation_stop (struct Experiment *e)
-{
- if (NULL != e->experiment_timeout_task)
- {
- GNUNET_SCHEDULER_cancel (e->experiment_timeout_task);
- e->experiment_timeout_task = NULL;
- }
- if (NULL != e->episode_timeout_task)
- {
- GNUNET_SCHEDULER_cancel (e->episode_timeout_task);
- e->episode_timeout_task = NULL;
- }
- if (NULL != e->cfg)
- {
- GNUNET_CONFIGURATION_destroy (e->cfg);
- e->cfg = NULL;
- }
- free_experiment (e);
-}
-
-
-struct Experiment *
-GNUNET_ATS_solvers_experimentation_load (char *filename)
-{
- struct Experiment *e;
- struct GNUNET_CONFIGURATION_Handle *cfg;
-
- e = NULL;
-
- cfg = GNUNET_CONFIGURATION_create ();
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, filename))
- {
- fprintf (stderr, "Failed to load `%s'\n", filename);
- GNUNET_CONFIGURATION_destroy (cfg);
- return NULL;
- }
-
- e = create_experiment ();
-
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (cfg,
"experiment",
- "name",
&e->name))
- {
- fprintf (stderr, "Invalid %s \n", "name");
- free_experiment (e);
- return NULL;
- }
- else
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment name: `%s'\n", e->name);
-
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (cfg,
"experiment",
- "log_prefix",
- &e->log_prefix))
- {
- fprintf (stderr, "Invalid %s \n", "log_prefix");
- free_experiment (e);
- return NULL;
- }
- else
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment logging prefix: `%s'\n",
- e->log_prefix);
-
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_filename (cfg,
- "experiment",
-
"log_output_dir",
- &e->
-
log_output_dir))
- {
- e->log_output_dir = NULL;
- }
- else
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Experiment logging output directory: `%s'\n",
- e->log_output_dir);
-
-
- if (GNUNET_SYSERR == (e->log_append_time_stamp =
- GNUNET_CONFIGURATION_get_value_yesno (cfg,
- "experiment",
-
"log_append_time_stamp")))
- e->log_append_time_stamp = GNUNET_YES;
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Experiment logging append timestamp: `%s'\n",
- (GNUNET_YES == e->log_append_time_stamp) ? "yes" : "no");
-
-
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_filename (cfg,
- "experiment",
- "cfg_file",
- &e->cfg_file))
- {
- fprintf (stderr, "Invalid %s \n", "cfg_file");
- free_experiment (e);
- return NULL;
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment configuration: `%s'\n",
- e->cfg_file);
- e->cfg = GNUNET_CONFIGURATION_create ();
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (e->cfg, e->cfg_file))
- {
- fprintf (stderr, "Invalid configuration %s \n", "cfg_file");
- free_experiment (e);
- return NULL;
- }
- }
-
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_time (cfg, "experiment",
- "log_freq",
- &e->log_freq))
- {
- fprintf (stderr, "Invalid %s \n", "log_freq");
- free_experiment (e);
- return NULL;
- }
- else
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment logging frequency: `%s'\n",
- GNUNET_STRINGS_relative_time_to_string (e->log_freq,
- GNUNET_YES));
-
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_time (cfg, "experiment",
- "max_duration",
- &e->max_duration))
- {
- fprintf (stderr, "Invalid %s", "max_duration");
- free_experiment (e);
- return NULL;
- }
- else
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment duration: `%s'\n",
- GNUNET_STRINGS_relative_time_to_string (e->max_duration,
- GNUNET_YES));
-
- if (GNUNET_SYSERR == load_episodes (e, cfg))
- {
- GNUNET_ATS_solvers_experimentation_stop (e);
- GNUNET_CONFIGURATION_destroy (cfg);
- e = NULL;
- fprintf (stderr, "Failed to load experiment\n");
- return NULL;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Loaded %u episodes with total duration %s\n",
- e->num_episodes,
- GNUNET_STRINGS_relative_time_to_string (e->total_duration,
- GNUNET_YES));
-
- GNUNET_CONFIGURATION_destroy (cfg);
- return e;
-}
-
-
-/**
- * Solver
- */
-
-static int
-free_all_it (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct ATS_Address *address = value;
-
- GNUNET_break (GNUNET_OK == GNUNET_CONTAINER_multipeermap_remove (
- sh->env.addresses,
- key, value));
- GNUNET_free (address);
-
- return GNUNET_OK;
-}
-
-
-void
-GNUNET_ATS_solvers_solver_stop (struct SolverHandle *sh)
-{
- GNUNET_STATISTICS_destroy ((struct GNUNET_STATISTICS_Handle *) sh->env.stats,
- GNUNET_NO);
- GNUNET_PLUGIN_unload (sh->plugin, sh->sf);
- sh->sf = NULL;
- GAS_normalization_stop ();
-
- GNUNET_CONTAINER_multipeermap_iterate (sh->addresses,
- &free_all_it,
- NULL);
- GNUNET_CONTAINER_multipeermap_destroy (sh->addresses);
- GNUNET_free (sh->plugin);
- GNUNET_free (sh);
-}
-
-
-/**
- * Load quotas for networks from configuration
- *
- * @param cfg configuration handle
- * @param out_dest where to write outbound quotas
- * @param in_dest where to write inbound quotas
- * @param dest_length length of inbound and outbound arrays
- * @return number of networks loaded
- */
-unsigned int
-GNUNET_ATS_solvers_load_quotas (const struct GNUNET_CONFIGURATION_Handle *cfg,
- unsigned long long *out_dest,
- unsigned long long *in_dest,
- int dest_length)
-{
- char *entry_in = NULL;
- char *entry_out = NULL;
- char *quota_out_str;
- char *quota_in_str;
- int c;
- int res;
-
- for (c = 0; (c < GNUNET_NT_COUNT) && (c < dest_length); c++)
- {
- in_dest[c] = 0;
- out_dest[c] = 0;
- GNUNET_asprintf (&entry_out,
- "%s_QUOTA_OUT",
- GNUNET_NT_to_string (c));
- GNUNET_asprintf (&entry_in,
- "%s_QUOTA_IN",
- GNUNET_NT_to_string (c));
-
- /* quota out */
- if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (cfg, "ats",
- entry_out,
- "a_out_str))
- {
- res = GNUNET_NO;
- if (0 == strcmp (quota_out_str, BIG_M_STRING))
- {
- out_dest[c] = GNUNET_ATS_MaxBandwidth;
- res = GNUNET_YES;
- }
- if ((GNUNET_NO == res) && (GNUNET_OK ==
- GNUNET_STRINGS_fancy_size_to_bytes (
- quota_out_str, &out_dest[c])))
- res = GNUNET_YES;
- if ((GNUNET_NO == res) && (GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_number (cfg,
- "ats",
-
entry_out,
- &
-
out_dest
- [c])))
- res = GNUNET_YES;
-
- if (GNUNET_NO == res)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ (
- "Could not load quota for network `%s': `%s', assigning
default bandwidth %llu\n"),
- GNUNET_NT_to_string (c),
- quota_out_str,
- GNUNET_ATS_DefaultBandwidth);
- out_dest[c] = GNUNET_ATS_DefaultBandwidth;
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Outbound quota configure for network `%s' is %llu\n",
- GNUNET_NT_to_string (c),
- out_dest[c]);
- }
- GNUNET_free (quota_out_str);
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- _ (
- "No outbound quota configured for network `%s', assigning
default bandwidth %llu\n"),
- GNUNET_NT_to_string (c),
- GNUNET_ATS_DefaultBandwidth);
- out_dest[c] = GNUNET_ATS_DefaultBandwidth;
- }
-
- /* quota in */
- if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (cfg, "ats",
- entry_in,
- "a_in_str))
- {
- res = GNUNET_NO;
- if (0 == strcmp (quota_in_str, BIG_M_STRING))
- {
- in_dest[c] = GNUNET_ATS_MaxBandwidth;
- res = GNUNET_YES;
- }
- if ((GNUNET_NO == res) && (GNUNET_OK ==
- GNUNET_STRINGS_fancy_size_to_bytes (
- quota_in_str, &in_dest[c])))
- res = GNUNET_YES;
- if ((GNUNET_NO == res) && (GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_number (cfg,
- "ats",
-
entry_in,
-
&in_dest
- [c])))
- res = GNUNET_YES;
-
- if (GNUNET_NO == res)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ (
- "Could not load quota for network `%s': `%s', assigning
default bandwidth %llu\n"),
- GNUNET_NT_to_string (c),
- quota_in_str,
- GNUNET_ATS_DefaultBandwidth);
- in_dest[c] = GNUNET_ATS_DefaultBandwidth;
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Inbound quota configured for network `%s' is %llu\n",
- GNUNET_NT_to_string (c),
- in_dest[c]);
- }
- GNUNET_free (quota_in_str);
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- _ (
- "No outbound quota configure for network `%s', assigning
default bandwidth %llu\n"),
- GNUNET_NT_to_string (c),
- GNUNET_ATS_DefaultBandwidth);
- out_dest[c] = GNUNET_ATS_DefaultBandwidth;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Loaded quota for network `%s' (in/out): %llu %llu\n",
- GNUNET_NT_to_string (c),
- in_dest[c],
- out_dest[c]);
- GNUNET_free (entry_out);
- GNUNET_free (entry_in);
- }
- return GNUNET_NT_COUNT;
-}
-
-
-/**
- * Information callback for the solver
- *
- * @param cls the closure
- * @param op the solver operation
- * @param stat status of the solver operation
- * @param add additional solver information
- */
-static void
-solver_info_cb (void *cls,
- enum GAS_Solver_Operation op,
- enum GAS_Solver_Status stat,
- enum GAS_Solver_Additional_Information add)
-{
- char *add_info;
-
- switch (add)
- {
- case GAS_INFO_NONE:
- add_info = "GAS_INFO_NONE";
- break;
-
- case GAS_INFO_FULL:
- add_info = "GAS_INFO_MLP_FULL";
- break;
-
- case GAS_INFO_UPDATED:
- add_info = "GAS_INFO_MLP_UPDATED";
- break;
-
- case GAS_INFO_PROP_ALL:
- add_info = "GAS_INFO_PROP_ALL";
- break;
-
- case GAS_INFO_PROP_SINGLE:
- add_info = "GAS_INFO_PROP_SINGLE";
- break;
-
- default:
- add_info = "INVALID";
- break;
- }
-
- switch (op)
- {
- case GAS_OP_SOLVE_START:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s' `%s'\n",
- "GAS_OP_SOLVE_START",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL", add_info);
- return;
-
- case GAS_OP_SOLVE_STOP:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_STOP",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL", add_info);
- return;
-
- case GAS_OP_SOLVE_SETUP_START:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_SETUP_START",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_SETUP_STOP:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_SETUP_STOP",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_MLP_LP_START:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_LP_START",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_MLP_LP_STOP:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_LP_STOP",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_MLP_MLP_START:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_MLP_START",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_MLP_MLP_STOP:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_MLP_STOP",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_UPDATE_NOTIFICATION_START:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_UPDATE_NOTIFICATION_START",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- return;
-
- default:
- break;
- }
-}
-
-
-static void
-solver_bandwidth_changed_cb (void *cls, struct ATS_Address *address)
-{
- struct GNUNET_TIME_Relative duration;
- struct TestPeer *p;
- static struct PreferenceGenerator *pg;
- uint32_t delta;
-
- if ((0 == address->assigned_bw_out) && (0 == address->assigned_bw_in))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Solver notified to disconnect peer `%s'\n",
- GNUNET_i2s (&address->peer));
- }
- p = find_peer_by_pid (&address->peer);
- if (NULL == p)
- return;
- p->assigned_bw_out = address->assigned_bw_out;
- p->assigned_bw_in = address->assigned_bw_in;
-
- for (pg = pref_gen_head; NULL != pg; pg = pg->next)
- {
- if (pg->peer == p->id)
- {
- duration = GNUNET_TIME_absolute_get_duration (
- pg->feedback_last_bw_update);
- delta = duration.rel_value_us * pg->last_assigned_bw_out;
- pg->feedback_bw_out_acc += delta;
-
- delta = duration.rel_value_us * pg->last_assigned_bw_in;
- pg->feedback_bw_in_acc += delta;
-
- pg->last_assigned_bw_in = address->assigned_bw_in;
- pg->last_assigned_bw_out = address->assigned_bw_out;
- pg->feedback_last_bw_update = GNUNET_TIME_absolute_get ();
- }
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Bandwidth changed addresses %s %p to %u Bps out / %u Bps in\n",
- GNUNET_i2s (&address->peer),
- address,
- address->assigned_bw_out,
- address->assigned_bw_in);
-
- if (NULL != l)
- GNUNET_ATS_solver_logging_now (l);
-
- return;
-}
-
-
-const double *
-get_preferences_cb (void *cls, const struct GNUNET_PeerIdentity *id)
-{
- struct TestPeer *p;
-
- if (GNUNET_YES == opt_disable_normalization)
- {
- if (NULL == (p = find_peer_by_pid (id)))
- return NULL;
- return p->pref_abs;
- }
- else
- return GAS_preference_get_by_peer (NULL,
- id);
-}
-
-
-struct SolverHandle *
-GNUNET_ATS_solvers_solver_start (enum GNUNET_ATS_Solvers type)
-{
- struct SolverHandle *sh;
- char *solver_str;
-
- switch (type)
- {
- case GNUNET_ATS_SOLVER_PROPORTIONAL:
- solver_str = "proportional";
- break;
-
- case GNUNET_ATS_SOLVER_MLP:
- solver_str = "mlp";
- break;
-
- case GNUNET_ATS_SOLVER_RIL:
- solver_str = "ril";
- break;
-
- default:
- GNUNET_break (0);
- return NULL;
- break;
- }
-
- sh = GNUNET_new (struct SolverHandle);
- GNUNET_asprintf (&sh->plugin,
- "libgnunet_plugin_ats_%s",
- solver_str);
- sh->addresses = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_NO);
-
- /* setup environment */
- sh->env.cfg = e->cfg;
- sh->env.stats = GNUNET_STATISTICS_create ("ats", e->cfg);
- sh->env.addresses = sh->addresses;
- sh->env.bandwidth_changed_cb = &solver_bandwidth_changed_cb;
- sh->env.get_preferences = &get_preferences_cb;
- sh->env.network_count = GNUNET_NT_COUNT;
- sh->env.info_cb = &solver_info_cb;
- sh->env.network_count = GNUNET_NT_COUNT;
-
- /* start normalization */
- GAS_normalization_start ();
-
- /* load quotas */
- if (GNUNET_NT_COUNT != GNUNET_ATS_solvers_load_quotas (e->cfg,
- sh->env.out_quota,
- sh->env.in_quota,
- GNUNET_NT_COUNT))
- {
- GNUNET_break (0);
- GNUNET_free (sh->plugin);
- GNUNET_free (sh);
- end_now ();
- return NULL;
- }
-
- sh->sf = GNUNET_PLUGIN_load (sh->plugin, &sh->env);
- if (NULL == sh->sf)
- {
- fprintf (stderr, "Failed to load solver `%s'\n", sh->plugin);
- GNUNET_break (0);
- GNUNET_free (sh->plugin);
- GNUNET_free (sh);
- end_now ();
- return NULL;
- }
- return sh;
-}
-
-
-static void
-done ()
-{
- struct TestPeer *cur;
- struct TestPeer *next;
-
- struct TestAddress *cur_a;
- struct TestAddress *next_a;
-
- /* Stop logging */
- GNUNET_ATS_solver_logging_stop (l);
-
- /* Stop all preference generation */
- GNUNET_ATS_solver_generate_preferences_stop_all ();
-
- /* Stop all property generation */
- GNUNET_ATS_solver_generate_property_stop_all ();
-
- if (opt_print)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "== Printing log information \n");
- GNUNET_ATS_solver_logging_eval (l);
- }
- if (opt_save)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "== Saving log information \n");
- GNUNET_ATS_solver_logging_write_to_disk (l, e->log_append_time_stamp,
- e->log_output_dir);
- }
-
- if (NULL != l)
- {
- GNUNET_ATS_solver_logging_free (l);
- l = NULL;
- }
-
- /* Clean up experiment */
- if (NULL != e)
- {
- GNUNET_ATS_solvers_experimentation_stop (e);
- e = NULL;
- }
-
- next = peer_head;
- while (NULL != (cur = next))
- {
- next = cur->next;
- GNUNET_CONTAINER_DLL_remove (peer_head, peer_tail, cur);
- next_a = cur->addr_head;
- while (NULL != (cur_a = next_a))
- {
- next_a = cur_a->next;
- GNUNET_CONTAINER_DLL_remove (cur->addr_head, cur->addr_tail, cur_a);
- GNUNET_free (cur_a);
- }
- GNUNET_free (cur);
- }
- if (NULL != sh)
- {
- GNUNET_ATS_solvers_solver_stop (sh);
- sh = NULL;
- }
-
- /* Shutdown */
- end_now ();
-}
-
-
-static void
-experiment_done_cb (struct Experiment *e, struct GNUNET_TIME_Relative duration,
- int success)
-{
- if (GNUNET_OK == success)
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment done successful in %s\n",
- GNUNET_STRINGS_relative_time_to_string (duration, GNUNET_YES));
- else
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment failed \n");
-
- GNUNET_SCHEDULER_add_now (&done, NULL);
-}
-
-
-static void
-episode_done_cb (struct Episode *ep)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Episode %u done\n", ep->id);
-}
-
-
-/**
- * Do shutdown
- */
-static void
-end_now ()
-{
- if (NULL != e)
- {
- GNUNET_ATS_solvers_experimentation_stop (e);
- e = NULL;
- }
- if (NULL != sh)
- {
- GNUNET_ATS_solvers_solver_stop (sh);
- sh = NULL;
- }
-}
-
-
-static void
-run (void *cls, char *const *args, const char *cfgfile,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- enum GNUNET_ATS_Solvers solver;
- int c;
-
- if (NULL == opt_exp_file)
- {
- fprintf (stderr, "No experiment given ...\n");
- res = 1;
- end_now ();
- return;
- }
-
- if (NULL == opt_solver)
- {
- fprintf (stderr, "No solver given ...\n");
- res = 1;
- end_now ();
- return;
- }
-
- if (0 == strcmp (opt_solver, "mlp"))
- {
- solver = GNUNET_ATS_SOLVER_MLP;
- }
- else if (0 == strcmp (opt_solver, "proportional"))
- {
- solver = GNUNET_ATS_SOLVER_PROPORTIONAL;
- }
- else if (0 == strcmp (opt_solver, "ril"))
- {
- solver = GNUNET_ATS_SOLVER_RIL;
- }
- else
- {
- fprintf (stderr, "No solver given ...");
- res = 1;
- end_now ();
- return;
- }
-
- for (c = 0; c < GNUNET_ATS_PropertyCount; c++)
- default_properties[c] = DEFAULT_REL_QUALITY;
-
- for (c = 0; c < GNUNET_ATS_PreferenceCount; c++)
- default_preferences[c] = DEFAULT_REL_PREFERENCE;
-
- /* load experiment */
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "=== Loading experiment\n");
- e = GNUNET_ATS_solvers_experimentation_load (opt_exp_file);
- if (NULL == e)
- {
- fprintf (stderr, "Failed to load experiment ...\n");
- res = 1;
- end_now ();
- return;
- }
-
- /* load solver */
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "=== Loading solver\n");
- sh = GNUNET_ATS_solvers_solver_start (solver);
- if (NULL == sh)
- {
- fprintf (stderr, "Failed to start solver ...\n");
- end_now ();
- res = 1;
- return;
- }
-
- /* start logging */
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "=== Start logging \n");
- l = GNUNET_ATS_solver_logging_start (e->log_freq);
-
- /* run experiment */
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "=== Running experiment \n");
- GNUNET_ATS_solvers_experimentation_run (e, episode_done_cb,
- experiment_done_cb);
-
- /* WAIT */
-}
-
-
-/**
- * Main function of the benchmark
- *
- * @param argc argument count
- * @param argv argument values
- */
-int
-main (int argc, char *argv[])
-{
- opt_exp_file = NULL;
- opt_solver = NULL;
- opt_log = GNUNET_NO;
- opt_save = GNUNET_NO;
-
- res = 0;
-
- static struct GNUNET_GETOPT_CommandLineOption options[] = {
- GNUNET_GETOPT_option_string ('s',
- "solver",
- gettext_noop ("solver to use"),
- &opt_solver),
-
- GNUNET_GETOPT_option_string ('e',
- "experiment"
- gettext_noop ("experiment to use"),
- &opt_exp_file),
-
- GNUNET_GETOPT_option_verbose (&opt_verbose),
-
- GNUNET_GETOPT_option_flag ('p',
- "print",
- gettext_noop ("print logging"),
- &opt_print),
-
- GNUNET_GETOPT_option_flag ('f',
- "file",
- gettext_noop ("save logging to disk"),
- &opt_save),
-
- GNUNET_GETOPT_option_flag ('d',
- "dn",
- gettext_noop ("disable normalization"),
- &opt_disable_normalization),
-
- GNUNET_GETOPT_OPTION_END
- };
-
- GNUNET_PROGRAM_run (argc, argv, "gnunet-ats-solver-eval",
- NULL, options, &run, argv[0]);
-
- return res;
-}
-
-
-/* end of file ats-testing-experiment.c*/
diff --git a/src/ats/gnunet-ats-solver-eval.h b/src/ats/gnunet-ats-solver-eval.h
deleted file mode 100644
index 7d14bf761..000000000
--- a/src/ats/gnunet-ats-solver-eval.h
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2013 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats-tests/ats-testing-experiment.c
- * @brief ats benchmark: controlled experiment execution
- * @author Christian Grothoff
- * @author Matthias Wachs
- */
-#ifndef GNUNET_ATS_SOLVER_EVAL_H
-#define GNUNET_ATS_SOLVER_EVAL_H
-
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_ats_plugin.h"
-#include "gnunet_ats_service.h"
-#include "gnunet-service-ats_addresses.h"
-#include "gnunet-service-ats_normalization.h"
-#include "test_ats_api_common.h"
-
-enum GeneratorType
-{
- GNUNET_ATS_TEST_TG_LINEAR,
- GNUNET_ATS_TEST_TG_CONSTANT,
- GNUNET_ATS_TEST_TG_RANDOM,
- GNUNET_ATS_TEST_TG_SINUS
-};
-
-
-enum OperationType
-{
- SOLVER_OP_ADD_ADDRESS,
- SOLVER_OP_DEL_ADDRESS,
- SOLVER_OP_START_SET_PROPERTY,
- SOLVER_OP_STOP_SET_PROPERTY,
- SOLVER_OP_START_SET_PREFERENCE,
- SOLVER_OP_STOP_SET_PREFERENCE,
- SOLVER_OP_START_REQUEST,
- SOLVER_OP_STOP_REQUEST,
-};
-
-struct SolverHandle
-{
- /**
- * Solver plugin name
- */
- char *plugin;
-
- /**
- * Solver environment
- */
- struct GNUNET_ATS_PluginEnvironment env;
-
- /**
- * Solver handle
- */
- struct GNUNET_ATS_SolverFunctions *sf;
-
- /**
- * Address hashmap
- */
- struct GNUNET_CONTAINER_MultiPeerMap *addresses;
-};
-
-enum GNUNET_ATS_Solvers
-{
- GNUNET_ATS_SOLVER_PROPORTIONAL,
- GNUNET_ATS_SOLVER_MLP,
- GNUNET_ATS_SOLVER_RIL,
-};
-
-struct LoggingFileHandle
-{
- /* DLL list for logging time steps */
- struct LoggingFileHandle *next;
- struct LoggingFileHandle *prev;
-
- /* peer id */
- long long unsigned int pid;
-
- /* address id */
- long long unsigned int aid;
-
- struct GNUNET_DISK_FileHandle *f_hd;
-};
-
-struct LoggingTimeStep
-{
- struct LoggingTimeStep *prev;
- struct LoggingTimeStep *next;
-
- struct LoggingPeer *head;
- struct LoggingPeer *tail;
-
- struct GNUNET_TIME_Absolute timestamp;
- struct GNUNET_TIME_Relative delta;
-};
-
-struct LoggingPeer
-{
- struct LoggingPeer *prev;
- struct LoggingPeer *next;
-
- long long unsigned int id;
- struct GNUNET_PeerIdentity peer_id;
- double pref_abs[GNUNET_ATS_PREFERENCE_END];
- double pref_norm[GNUNET_ATS_PREFERENCE_END];
- int is_requested;
-
- struct LoggingAddress *addr_head;
- struct LoggingAddress *addr_tail;
-};
-
-struct LoggingAddress
-{
- struct LoggingAddress *next;
- struct LoggingAddress *prev;
-
- long long unsigned int aid;
- int active;
- uint32_t network;
- uint32_t assigned_bw_in;
- uint32_t assigned_bw_out;
-
- double prop_abs[GNUNET_ATS_PropertyCount];
- double prop_norm[GNUNET_ATS_PropertyCount];
-};
-
-
-struct TestPeer
-{
- struct TestPeer *prev;
- struct TestPeer *next;
-
-
- long long unsigned int id;
- int is_requested;
- struct GNUNET_PeerIdentity peer_id;
-
- double pref_abs[GNUNET_ATS_PreferenceCount];
- double pref_norm[GNUNET_ATS_PreferenceCount];
-
- uint32_t assigned_bw_in;
- uint32_t assigned_bw_out;
-
- struct TestAddress *addr_head;
- struct TestAddress *addr_tail;
-};
-
-
-struct TestAddress
-{
- struct TestAddress *next;
- struct TestAddress *prev;
-
- long long unsigned int aid;
- struct ATS_Address *ats_addr;
- uint32_t network;
-
- double prop_abs[GNUNET_ATS_PropertyCount];
- double prop_norm[GNUNET_ATS_PropertyCount];
-};
-
-struct Episode;
-
-struct Experiment;
-
-typedef void (*GNUNET_ATS_TESTING_EpisodeDoneCallback) (
- struct Episode *e);
-
-typedef void (*GNUNET_ATS_TESTING_ExperimentDoneCallback) (struct Experiment
*e,
- struct
- GNUNET_TIME_Relative
- duration, int
- success);
-
-/**
- * An operation in an experiment
- */
-struct GNUNET_ATS_TEST_Operation
-{
- struct GNUNET_ATS_TEST_Operation *next;
- struct GNUNET_ATS_TEST_Operation *prev;
-
- long long unsigned int address_id;
- long long unsigned int peer_id;
- long long unsigned int client_id;
-
- long long unsigned int address_session;
- unsigned int address_network;
- char*address;
- char*plugin;
-
-
- long long unsigned int base_rate;
- long long unsigned int max_rate;
- struct GNUNET_TIME_Relative period;
- struct GNUNET_TIME_Relative frequency;
- struct GNUNET_TIME_Relative feedback_delay;
-
- enum OperationType type;
- enum GeneratorType gen_type;
- enum GNUNET_ATS_PreferenceKind pref_type;
- // enum GNUNET_ATS_Property prop_type;
-};
-
-struct Episode
-{
- int id;
- struct Episode *next;
- struct GNUNET_TIME_Relative duration;
-
- struct GNUNET_ATS_TEST_Operation *head;
- struct GNUNET_ATS_TEST_Operation *tail;
-};
-
-struct LoggingHandle
-{
- struct GNUNET_SCHEDULER_Task *logging_task;
- struct GNUNET_TIME_Relative log_freq;
-
- /* DLL list for logging time steps */
- struct LoggingTimeStep *head;
- struct LoggingTimeStep *tail;
-};
-
-struct Experiment
-{
- char *name;
- char *log_prefix;
- char *cfg_file;
- char *log_output_dir;
- int log_append_time_stamp;
-
- struct GNUNET_TIME_Relative log_freq;
- struct GNUNET_TIME_Relative max_duration;
- struct GNUNET_TIME_Relative total_duration;
- struct GNUNET_TIME_Absolute start_time;
- unsigned int num_episodes;
- struct Episode *start;
-
- struct GNUNET_CONFIGURATION_Handle *cfg;
-
- struct GNUNET_SCHEDULER_Task *experiment_timeout_task;
- struct GNUNET_SCHEDULER_Task *episode_timeout_task;
- struct Episode *cur;
-
- GNUNET_ATS_TESTING_EpisodeDoneCallback ep_done_cb;
- GNUNET_ATS_TESTING_ExperimentDoneCallback e_done_cb;
-};
-
-struct PreferenceGenerator
-{
- struct PreferenceGenerator *prev;
- struct PreferenceGenerator *next;
-
- enum GeneratorType type;
-
- long long unsigned int peer;
- unsigned int client_id;
-
- enum GNUNET_ATS_PreferenceKind kind;
-
- long int base_value;
- long int max_value;
- struct GNUNET_TIME_Relative duration_period;
- struct GNUNET_TIME_Relative frequency;
- struct GNUNET_TIME_Relative feedback_frequency;
-
- struct GNUNET_SCHEDULER_Task *set_task;
- struct GNUNET_SCHEDULER_Task *feedback_task;
- struct GNUNET_TIME_Absolute next_ping_transmission;
- struct GNUNET_TIME_Absolute time_start;
-
-
- /* Feedback */
- uint32_t feedback_bw_out_acc;
- uint32_t feedback_bw_in_acc;
- uint32_t feedback_delay_acc;
-
- double pref_bw_old;
- double pref_latency_old;
-
- struct GNUNET_TIME_Absolute feedback_last;
-
- struct GNUNET_TIME_Absolute feedback_last_bw_update;
- struct GNUNET_TIME_Absolute feedback_last_delay_update;
- uint32_t last_assigned_bw_in;
- uint32_t last_assigned_bw_out;
- double last_delay_value;
-};
-
-
-struct PropertyGenerator
-{
- struct PropertyGenerator *prev;
- struct PropertyGenerator *next;
-
- enum GeneratorType type;
-
- long long unsigned int peer;
- long long unsigned int address_id;
-
- struct TestPeer *test_peer;
- struct TestAddress *test_address;
- uint32_t ats_property;
-
- long int base_value;
- long int max_value;
- struct GNUNET_TIME_Relative duration_period;
- struct GNUNET_TIME_Relative frequency;
-
- struct GNUNET_SCHEDULER_Task *set_task;
- struct GNUNET_TIME_Absolute next_ping_transmission;
- struct GNUNET_TIME_Absolute time_start;
-};
-
-#endif /* #ifndef GNUNET_ATS_SOLVER_EVAL_H */
-/* end of file ats-testing.h */
diff --git a/src/ats/gnunet-service-ats.c b/src/ats/gnunet-service-ats.c
deleted file mode 100644
index 5e27ecbd0..000000000
--- a/src/ats/gnunet-service-ats.c
+++ /dev/null
@@ -1,538 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/gnunet-service-ats.c
- * @brief ats service
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet-service-ats.h"
-#include "gnunet-service-ats_addresses.h"
-#include "gnunet-service-ats_connectivity.h"
-#include "gnunet-service-ats_normalization.h"
-#include "gnunet-service-ats_performance.h"
-#include "gnunet-service-ats_preferences.h"
-#include "gnunet-service-ats_scheduling.h"
-#include "gnunet-service-ats_reservations.h"
-#include "gnunet-service-ats_plugins.h"
-#include "ats.h"
-
-/**
- * Handle for statistics.
- */
-struct GNUNET_STATISTICS_Handle *GSA_stats;
-
-
-/**
- * We have received a `struct ClientStartMessage` from a client. Find
- * out which type of client it is and notify the respective subsystem.
- *
- * @param cls handle to the client
- * @param msg the start message
- */
-static void
-handle_ats_start (void *cls,
- const struct ClientStartMessage *msg)
-{
- struct GNUNET_SERVICE_Client *client = cls;
- enum StartFlag flag;
-
- flag = ntohl (msg->start_flag);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received ATS_START (%d) message\n",
- (int) flag);
- switch (flag)
- {
- case START_FLAG_SCHEDULING:
- if (GNUNET_OK !=
- GAS_scheduling_add_client (client))
- {
- GNUNET_SERVICE_client_drop (client);
- return;
- }
- break;
-
- case START_FLAG_PERFORMANCE_WITH_PIC:
- GAS_performance_add_client (client,
- flag);
- break;
-
- case START_FLAG_PERFORMANCE_NO_PIC:
- GAS_performance_add_client (client,
- flag);
- break;
-
- case START_FLAG_CONNECTION_SUGGESTION:
- /* This client won't receive messages from us, no need to 'add' */
- break;
-
- default:
- GNUNET_break (0);
- GNUNET_SERVICE_client_drop (client);
- return;
- }
- GNUNET_SERVICE_client_continue (client);
-}
-
-
-/**
- * Handle 'reservation request' messages from clients.
- *
- * @param cls client that sent the request
- * @param message the request message
- */
-static void
-handle_reservation_request (void *cls,
- const struct ReservationRequestMessage *message)
-{
- struct GNUNET_SERVICE_Client *client = cls;
-
- GAS_handle_reservation_request (client,
- message);
- GNUNET_SERVICE_client_continue (client);
-}
-
-
-/**
- * Check 'preference feedback' message is well-formed
- *
- * @param cls client that sent the request
- * @param message the request message
- * @return #GNUNET_OK if @a message is well-formed
- */
-static int
-check_feedback (void *cls,
- const struct FeedbackPreferenceMessage *message)
-{
- uint16_t msize;
- uint32_t nump;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received PREFERENCE_FEEDBACK message\n");
- msize = ntohs (message->header.size);
- nump = ntohl (message->num_feedback);
- if (msize !=
- sizeof(struct FeedbackPreferenceMessage)
- + nump * sizeof(struct PreferenceInformation))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Handle 'preference feedback' messages from clients.
- *
- * @param cls client that sent the request
- * @param msg the request message
- */
-static void
-handle_feedback (void *cls,
- const struct FeedbackPreferenceMessage *msg)
-{
- struct GNUNET_SERVICE_Client *client = cls;
- const struct PreferenceInformation *pi;
- uint32_t nump;
-
- nump = ntohl (msg->num_feedback);
- if (GNUNET_NO ==
- GNUNET_CONTAINER_multipeermap_contains (GSA_addresses,
- &msg->peer))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Received PREFERENCE FEEDBACK for unknown peer `%s'\n",
- GNUNET_i2s (&msg->peer));
- GNUNET_SERVICE_client_continue (client);
- return;
- }
-
- GNUNET_STATISTICS_update (GSA_stats,
- "# preference feedbacks requests processed",
- 1,
- GNUNET_NO);
- pi = (const struct PreferenceInformation *) &msg[1];
- for (uint32_t i = 0; i < nump; i++)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received PREFERENCE FEEDBACK for peer `%s'\n",
- GNUNET_i2s (&msg->peer));
- GAS_plugin_notify_feedback (client,
- &msg->peer,
- GNUNET_TIME_relative_ntoh (msg->scope),
- (enum GNUNET_ATS_PreferenceKind) ntohl (
- pi[i].preference_kind),
- pi[i].preference_value);
- }
- GNUNET_SERVICE_client_continue (client);
-}
-
-
-/**
- * Handle 'request address list' messages from clients.
- *
- * @param cls client that sent the request
- * @param message the request message
- */
-static void
-handle_request_address_list (void *cls,
- const struct AddressListRequestMessage *message)
-{
- struct GNUNET_SERVICE_Client *client = cls;
-
- GAS_handle_request_address_list (client,
- message);
- GNUNET_SERVICE_client_continue (client);
-}
-
-
-/**
- * Handle 'request address' messages from clients.
- *
- * @param cls client that sent the request
- * @param message the request message
- */
-static void
-handle_request_address (void *cls,
- const struct RequestAddressMessage *message)
-{
- struct GNUNET_SERVICE_Client *client = cls;
-
- GAS_handle_request_address (client,
- message);
- GNUNET_SERVICE_client_continue (client);
-}
-
-
-/**
- * Cancel 'request address' messages from clients.
- *
- * @param cls client that sent the request
- * @param message the request message
- */
-static void
-handle_request_address_cancel (void *cls,
- const struct RequestAddressMessage *message)
-{
- struct GNUNET_SERVICE_Client *client = cls;
-
- GAS_handle_request_address_cancel (client,
- message);
- GNUNET_SERVICE_client_continue (client);
-}
-
-
-/**
- * Handle 'address add' messages from clients.
- *
- * @param cls client that sent the request
- * @param m the request message
- */
-static int
-check_address_add (void *cls,
- const struct AddressAddMessage *m)
-{
- const char *address;
- const char *plugin_name;
- uint16_t address_length;
- uint16_t plugin_name_length;
- uint16_t size;
-
- size = ntohs (m->header.size);
- address_length = ntohs (m->address_length);
- plugin_name_length = ntohs (m->plugin_name_length);
- address = (const char *) &m[1];
- if (plugin_name_length != 0)
- plugin_name = &address[address_length];
- else
- plugin_name = "";
-
- if ((address_length + plugin_name_length
- + sizeof(struct AddressAddMessage) != size) ||
- ((plugin_name_length > 0) &&
- (plugin_name[plugin_name_length - 1] != '\0')))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Handle 'address add' messages from clients.
- *
- * @param cls client that sent the request
- * @param message the request message
- */
-static void
-handle_address_add (void *cls,
- const struct AddressAddMessage *message)
-{
- struct GNUNET_SERVICE_Client *client = cls;
-
- GAS_handle_address_add (message);
- GNUNET_SERVICE_client_continue (client);
-}
-
-
-/**
- * Handle 'address update' messages from clients.
- *
- * @param cls client that sent the request
- * @param message the request message
- */
-static void
-handle_address_update (void *cls,
- const struct AddressUpdateMessage *message)
-{
- struct GNUNET_SERVICE_Client *client = cls;
-
- GAS_handle_address_update (message);
- GNUNET_SERVICE_client_continue (client);
-}
-
-
-/**
- * Handle 'address destroyed' messages from clients.
- *
- * @param cls client that sent the request
- * @param message the request message
- */
-static void
-handle_address_destroyed (void *cls,
- const struct AddressDestroyedMessage *message)
-{
- struct GNUNET_SERVICE_Client *client = cls;
-
- GAS_handle_address_destroyed (message);
- GNUNET_SERVICE_client_continue (client);
-}
-
-
-/**
- * Check that 'change preference' message is well-formed.
- *
- * @param cls client that sent the request
- * @param message the request message
- * @return #GNUNET_OK if @a message is well-formed
- */
-static int
-check_preference_change (void *cls,
- const struct ChangePreferenceMessage *message)
-{
- uint16_t msize;
- uint32_t nump;
-
- msize = ntohs (message->header.size);
- nump = ntohl (message->num_preferences);
- if ((msize !=
- sizeof(struct ChangePreferenceMessage)
- + nump * sizeof(struct PreferenceInformation)) ||
- (UINT16_MAX / sizeof(struct PreferenceInformation) < nump))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Handle 'change preference' messages from clients.
- *
- * @param cls client that sent the request
- * @param message the request message
- */
-static void
-handle_preference_change (void *cls,
- const struct ChangePreferenceMessage *message)
-{
- struct GNUNET_SERVICE_Client *client = cls;
-
- GAS_handle_preference_change (client,
- message);
- GNUNET_SERVICE_client_continue (client);
-}
-
-
-/**
- * A client connected to us. Setup the local client
- * record.
- *
- * @param cls unused
- * @param client handle of the client
- * @param mq message queue to talk to @a client
- * @return @a client
- */
-static void *
-client_connect_cb (void *cls,
- struct GNUNET_SERVICE_Client *client,
- struct GNUNET_MQ_Handle *mq)
-{
- return client;
-}
-
-
-/**
- * A client disconnected from us. Tear down the local client
- * record.
- *
- * @param cls unused
- * @param client handle of the client
- * @param app_ctx
- */
-static void
-client_disconnect_cb (void *cls,
- struct GNUNET_SERVICE_Client *client,
- void *app_ctx)
-{
- if (NULL == client)
- return;
- GAS_scheduling_remove_client (client);
- GAS_connectivity_remove_client (client);
- GAS_preference_client_disconnect (client);
-}
-
-
-/**
- * Task run during shutdown.
- *
- * @param cls unused
- */
-static void
-cleanup_task (void *cls)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "ATS shutdown initiated\n");
- GAS_connectivity_done ();
- GAS_addresses_done ();
- GAS_plugin_done ();
- GAS_normalization_stop ();
- GAS_performance_done ();
- GAS_preference_done ();
- GAS_reservations_done ();
- if (NULL != GSA_stats)
- {
- GNUNET_STATISTICS_destroy (GSA_stats, GNUNET_NO);
- GSA_stats = NULL;
- }
-}
-
-
-/**
- * Process template requests.
- *
- * @param cls closure
- * @param cfg configuration to use
- * @param service the initialized service
- */
-static void
-run (void *cls,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- struct GNUNET_SERVICE_Handle *service)
-{
- GSA_stats = GNUNET_STATISTICS_create ("ats",
- cfg);
- GAS_reservations_init ();
- GAS_connectivity_init ();
- GAS_preference_init ();
- GAS_normalization_start ();
- GAS_addresses_init ();
- if (GNUNET_OK !=
- GAS_plugin_init (cfg))
- {
- GNUNET_break (0);
- GAS_addresses_done ();
- GAS_normalization_stop ();
- GAS_reservations_done ();
- GAS_connectivity_done ();
- GAS_preference_done ();
- if (NULL != GSA_stats)
- {
- GNUNET_STATISTICS_destroy (GSA_stats,
- GNUNET_NO);
- GSA_stats = NULL;
- }
- return;
- }
- GAS_performance_init ();
- GNUNET_SCHEDULER_add_shutdown (&cleanup_task,
- NULL);
-}
-
-
-/**
- * Define "main" method using service macro.
- */
-GNUNET_SERVICE_MAIN
- ("ats",
- GNUNET_SERVICE_OPTION_NONE,
- &run,
- &client_connect_cb,
- &client_disconnect_cb,
- NULL,
- GNUNET_MQ_hd_fixed_size (ats_start,
- GNUNET_MESSAGE_TYPE_ATS_START,
- struct ClientStartMessage,
- NULL),
- GNUNET_MQ_hd_fixed_size (request_address,
- GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS,
- struct RequestAddressMessage,
- NULL),
- GNUNET_MQ_hd_fixed_size (request_address_cancel,
- GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS_CANCEL,
- struct RequestAddressMessage,
- NULL),
- GNUNET_MQ_hd_fixed_size (request_address_list,
- GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_REQUEST,
- struct AddressListRequestMessage,
- NULL),
- GNUNET_MQ_hd_var_size (address_add,
- GNUNET_MESSAGE_TYPE_ATS_ADDRESS_ADD,
- struct AddressAddMessage,
- NULL),
- GNUNET_MQ_hd_fixed_size (address_update,
- GNUNET_MESSAGE_TYPE_ATS_ADDRESS_UPDATE,
- struct AddressUpdateMessage,
- NULL),
- GNUNET_MQ_hd_fixed_size (address_destroyed,
- GNUNET_MESSAGE_TYPE_ATS_ADDRESS_DESTROYED,
- struct AddressDestroyedMessage,
- NULL),
- GNUNET_MQ_hd_fixed_size (reservation_request,
- GNUNET_MESSAGE_TYPE_ATS_RESERVATION_REQUEST,
- struct ReservationRequestMessage,
- NULL),
- GNUNET_MQ_hd_var_size (preference_change,
- GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_CHANGE,
- struct ChangePreferenceMessage,
- NULL),
- GNUNET_MQ_hd_var_size (feedback,
- GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_FEEDBACK,
- struct FeedbackPreferenceMessage,
- NULL),
- GNUNET_MQ_handler_end ());
-
-
-/* end of gnunet-service-ats.c */
diff --git a/src/ats/gnunet-service-ats.h b/src/ats/gnunet-service-ats.h
deleted file mode 100644
index 85d522b9f..000000000
--- a/src/ats/gnunet-service-ats.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file ats/gnunet-service-ats.h
- * @brief ats service
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_ATS_H
-#define GNUNET_SERVICE_ATS_H
-
-#include "gnunet_statistics_service.h"
-
-#define GAS_normalization_queue_length 3
-
-#define BANDWIDTH_ZERO GNUNET_BANDWIDTH_value_init (0)
-
-/**
- * Handle for statistics.
- */
-extern struct GNUNET_STATISTICS_Handle *GSA_stats;
-
-
-#endif
diff --git a/src/ats/gnunet-service-ats_addresses.c
b/src/ats/gnunet-service-ats_addresses.c
deleted file mode 100644
index 9c9856094..000000000
--- a/src/ats/gnunet-service-ats_addresses.c
+++ /dev/null
@@ -1,686 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file ats/gnunet-service-ats_addresses.c
- * @brief ats service address management
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet-service-ats_addresses.h"
-#include "gnunet-service-ats_performance.h"
-#include "gnunet-service-ats_normalization.h"
-#include "gnunet-service-ats_plugins.h"
-
-
-/**
- * A multihashmap to store all addresses
- */
-struct GNUNET_CONTAINER_MultiPeerMap *GSA_addresses;
-
-
-/**
- * Update statistic on number of addresses.
- */
-static void
-update_addresses_stat ()
-{
- GNUNET_STATISTICS_set (GSA_stats,
- "# addresses",
- GNUNET_CONTAINER_multipeermap_size (GSA_addresses),
- GNUNET_NO);
-}
-
-
-/**
- * Free the given address
- *
- * @param addr address to destroy
- */
-static void
-free_address (struct ATS_Address *addr)
-{
- GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove (GSA_addresses,
- &addr->peer,
- addr));
- update_addresses_stat ();
- GAS_plugin_delete_address (addr);
- GAS_performance_notify_all_clients (&addr->peer,
- addr->plugin,
- addr->addr,
- addr->addr_len,
- GNUNET_NO,
- NULL,
- addr->local_address_info,
- GNUNET_BANDWIDTH_ZERO,
- GNUNET_BANDWIDTH_ZERO);
- GNUNET_free (addr->plugin);
- GNUNET_free (addr);
-}
-
-
-/**
- * Initialize @a norm. Sets all historic values to undefined.
- *
- * @param norm normalization data to initialize
- */
-static void
-init_norm (struct GAS_NormalizationInfo *norm)
-{
- unsigned int c;
-
- for (c = 0; c < GAS_normalization_queue_length; c++)
- norm->atsi_abs[c] = UINT64_MAX;
-}
-
-
-/**
- * Create a ATS_address with the given information
- *
- * @param peer peer
- * @param plugin_name plugin
- * @param plugin_addr address
- * @param plugin_addr_len address length
- * @param local_address_info additional local info for the address
- * @param session_id session identifier, can never be 0
- * @return the ATS_Address
- */
-static struct ATS_Address *
-create_address (const struct GNUNET_PeerIdentity *peer,
- const char *plugin_name,
- const void *plugin_addr,
- size_t plugin_addr_len,
- uint32_t local_address_info,
- uint32_t session_id)
-{
- struct ATS_Address *aa;
-
- aa = GNUNET_malloc (sizeof(struct ATS_Address) + plugin_addr_len);
- aa->peer = *peer;
- aa->addr_len = plugin_addr_len;
- aa->addr = &aa[1];
- GNUNET_memcpy (&aa[1],
- plugin_addr,
- plugin_addr_len);
- aa->plugin = GNUNET_strdup (plugin_name);
- aa->session_id = session_id;
- aa->local_address_info = local_address_info;
- init_norm (&aa->norm_delay);
- init_norm (&aa->norm_distance);
- init_norm (&aa->norm_utilization_in);
- init_norm (&aa->norm_utilization_out);
- return aa;
-}
-
-
-/**
- * Closure for #find_address_cb()
- */
-struct FindAddressContext
-{
- /**
- * Session Id to look for.
- */
- uint32_t session_id;
-
- /**
- * Where to store matching address result.
- */
- struct ATS_Address *exact_address;
-};
-
-
-/**
- * Find session matching given session ID.
- *
- * @param cls a `struct FindAddressContext`
- * @param key peer id
- * @param value the address to compare with
- * @return #GNUNET_YES to continue, #GNUNET_NO if address is found
- */
-static int
-find_address_cb (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct FindAddressContext *fac = cls;
- struct ATS_Address *aa = value;
-
- if (aa->session_id == fac->session_id)
- {
- fac->exact_address = aa;
- return GNUNET_NO;
- }
- return GNUNET_YES;
-}
-
-
-/**
- * Find the exact address
- *
- * @param peer peer
- * @param session_id session id, can never be 0
- * @return an ATS_address or NULL
- */
-static struct ATS_Address *
-find_exact_address (const struct GNUNET_PeerIdentity *peer,
- uint32_t session_id)
-{
- struct FindAddressContext fac;
-
- fac.exact_address = NULL;
- fac.session_id = session_id;
- GNUNET_CONTAINER_multipeermap_get_multiple (GSA_addresses,
- peer,
- &find_address_cb, &fac);
- return fac.exact_address;
-}
-
-
-void
-GAS_addresses_add (const struct GNUNET_PeerIdentity *peer,
- const char *plugin_name,
- const void *plugin_addr,
- size_t plugin_addr_len,
- uint32_t local_address_info,
- uint32_t session_id,
- const struct GNUNET_ATS_Properties *prop)
-{
- struct ATS_Address *new_address;
-
- if (NULL != find_exact_address (peer,
- session_id))
- {
- GNUNET_break (0);
- return;
- }
- GNUNET_break (GNUNET_NT_UNSPECIFIED != prop->scope);
- new_address = create_address (peer,
- plugin_name,
- plugin_addr,
- plugin_addr_len,
- local_address_info,
- session_id);
- /* Add a new address */
- new_address->properties = *prop;
- new_address->t_added = GNUNET_TIME_absolute_get ();
- new_address->t_last_activity = GNUNET_TIME_absolute_get ();
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_put (GSA_addresses,
- peer,
- new_address,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
- update_addresses_stat ();
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Adding new address for peer `%s' slot %u\n",
- GNUNET_i2s (peer),
- session_id);
- /* Tell solver about new address */
- GAS_plugin_solver_lock ();
- GAS_plugin_new_address (new_address);
- GAS_normalization_update_property (new_address); // FIXME: needed?
- GAS_plugin_solver_unlock ();
- /* Notify performance clients about new address */
- GAS_performance_notify_all_clients (&new_address->peer,
- new_address->plugin,
- new_address->addr,
- new_address->addr_len,
- new_address->active,
- &new_address->properties,
- new_address->local_address_info,
- GNUNET_BANDWIDTH_value_init (
- new_address->assigned_bw_out),
- GNUNET_BANDWIDTH_value_init (
- new_address->assigned_bw_in));
-}
-
-
-void
-GAS_addresses_update (const struct GNUNET_PeerIdentity *peer,
- uint32_t session_id,
- const struct GNUNET_ATS_Properties *prop)
-{
- struct ATS_Address *aa;
-
- /* Get existing address */
- aa = find_exact_address (peer,
- session_id);
- if (NULL == aa)
- {
- GNUNET_break (0);
- return;
- }
- if (NULL == aa->solver_information)
- {
- GNUNET_break (0);
- return;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received ADDRESS_UPDATE for peer `%s' slot %u\n",
- GNUNET_i2s (peer),
- (unsigned int) session_id);
- GNUNET_break (GNUNET_NT_UNSPECIFIED != prop->scope);
- /* Update address */
- aa->t_last_activity = GNUNET_TIME_absolute_get ();
- aa->properties = *prop;
- /* Notify performance clients about updated address */
- GAS_performance_notify_all_clients (&aa->peer,
- aa->plugin,
- aa->addr,
- aa->addr_len,
- aa->active,
- prop,
- aa->local_address_info,
- GNUNET_BANDWIDTH_value_init (
- aa->assigned_bw_out),
- GNUNET_BANDWIDTH_value_init (
- aa->assigned_bw_in));
-
- GAS_normalization_update_property (aa);
-}
-
-
-/**
- * Remove an address for a peer.
- *
- * @param peer peer
- * @param session_id session id, can never be 0
- */
-void
-GAS_addresses_destroy (const struct GNUNET_PeerIdentity *peer,
- uint32_t session_id)
-{
- struct ATS_Address *ea;
-
- /* Get existing address */
- ea = find_exact_address (peer,
- session_id);
- if (NULL == ea)
- {
- GNUNET_break (0);
- return;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received ADDRESS_DESTROYED for peer `%s' session %u\n",
- GNUNET_i2s (peer),
- session_id);
- free_address (ea);
-}
-
-
-/**
- * Initialize address subsystem. The addresses subsystem manages the addresses
- * known and current performance information. It has a solver component
- * responsible for the resource allocation. It tells the solver about changes
- * and receives updates when the solver changes the resource allocation.
- */
-void
-GAS_addresses_init ()
-{
- GSA_addresses
- = GNUNET_CONTAINER_multipeermap_create (128,
- GNUNET_NO);
- update_addresses_stat ();
-}
-
-
-/**
- * Destroy all addresses iterator
- *
- * @param cls NULL
- * @param key peer identity (unused)
- * @param value the 'struct ATS_Address' to free
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-destroy_all_address_it (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct ATS_Address *aa = value;
-
- free_address (aa);
- return GNUNET_OK;
-}
-
-
-/**
- * Remove all addresses
- */
-void
-GAS_addresses_destroy_all ()
-{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Destroying all addresses\n");
- if (NULL == GSA_addresses)
- return;
- if (0 ==
- GNUNET_CONTAINER_multipeermap_size (GSA_addresses))
- return;
- GAS_plugin_solver_lock ();
- GNUNET_CONTAINER_multipeermap_iterate (GSA_addresses,
- &destroy_all_address_it,
- NULL);
- GAS_plugin_solver_unlock ();
-}
-
-
-/**
- * Shutdown address subsystem.
- */
-void
-GAS_addresses_done ()
-{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Shutting down addresses\n");
- GAS_plugin_solver_lock ();
- GAS_addresses_destroy_all ();
- GAS_plugin_solver_unlock ();
- GNUNET_CONTAINER_multipeermap_destroy (GSA_addresses);
- GSA_addresses = NULL;
-}
-
-
-/**
- * Closure for #peerinfo_it().
- */
-struct PeerInfoIteratorContext
-{
- /**
- * Function to call for each address.
- */
- GNUNET_ATS_PeerInfo_Iterator it;
-
- /**
- * Closure for @e it.
- */
- void *it_cls;
-};
-
-
-/**
- * Iterator to iterate over a peer's addresses
- *
- * @param cls a `struct PeerInfoIteratorContext`
- * @param key the peer id
- * @param value the `struct ATS_address`
- * @return #GNUNET_OK to continue
- */
-static int
-peerinfo_it (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct PeerInfoIteratorContext *pi_ctx = cls;
- struct ATS_Address *addr = value;
-
- pi_ctx->it (pi_ctx->it_cls,
- &addr->peer,
- addr->plugin,
- addr->addr,
- addr->addr_len,
- addr->active,
- &addr->properties,
- addr->local_address_info,
- GNUNET_BANDWIDTH_value_init (addr->assigned_bw_out),
- GNUNET_BANDWIDTH_value_init (addr->assigned_bw_in));
- return GNUNET_OK;
-}
-
-
-void
-GAS_addresses_get_peer_info (const struct GNUNET_PeerIdentity *peer,
- GNUNET_ATS_PeerInfo_Iterator pi_it,
- void *pi_it_cls)
-{
- struct PeerInfoIteratorContext pi_ctx;
-
- if (NULL == pi_it)
- {
- /* does not make sense without callback */
- GNUNET_break (0);
- return;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Returning information for %s from a total of %u known
addresses\n",
- (NULL == peer)
- ? "all peers"
- : GNUNET_i2s (peer),
- (unsigned int) GNUNET_CONTAINER_multipeermap_size (
- GSA_addresses));
- pi_ctx.it = pi_it;
- pi_ctx.it_cls = pi_it_cls;
- if (NULL == peer)
- GNUNET_CONTAINER_multipeermap_iterate (GSA_addresses,
- &peerinfo_it,
- &pi_ctx);
- else
- GNUNET_CONTAINER_multipeermap_get_multiple (GSA_addresses,
- peer,
- &peerinfo_it, &pi_ctx);
- pi_it (pi_it_cls,
- NULL, NULL, NULL, 0,
- GNUNET_NO,
- NULL,
- GNUNET_HELLO_ADDRESS_INFO_NONE,
- GNUNET_BANDWIDTH_ZERO,
- GNUNET_BANDWIDTH_ZERO);
-}
-
-
-/**
- * Information we need for the callbacks to return a list of addresses
- * back to the client.
- */
-struct AddressIteration
-{
- /**
- * Actual handle to the client.
- */
- struct GNUNET_SERVICE_Client *client;
-
- /**
- * Are we sending all addresses, or only those that are active?
- */
- int all;
-
- /**
- * Which ID should be included in the response?
- */
- uint32_t id;
-};
-
-
-/**
- * Send a #GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE with the
- * given address details to the client identified in @a ai.
- *
- * @param ai our address information context (identifies the client)
- * @param id the peer id this address is for
- * @param plugin_name name of the plugin that supports this address
- * @param plugin_addr address
- * @param plugin_addr_len length of @a plugin_addr
- * @param active #GNUNET_YES if this address is actively used
- * @param prop performance information
- * @param local_address_info flags for the address
- * @param bandwidth_out current outbound bandwidth assigned to address
- * @param bandwidth_in current inbound bandwidth assigned to address
- */
-static void
-transmit_req_addr (struct AddressIteration *ai,
- const struct GNUNET_PeerIdentity *id,
- const char *plugin_name,
- const void *plugin_addr,
- size_t plugin_addr_len,
- int active,
- const struct GNUNET_ATS_Properties *prop,
- enum GNUNET_HELLO_AddressInfo local_address_info,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
-
-{
- struct GNUNET_MQ_Envelope *env;
- struct PeerInformationMessage *msg;
- char *addrp;
- size_t plugin_name_length;
- size_t msize;
-
- if (NULL != plugin_name)
- plugin_name_length = strlen (plugin_name) + 1;
- else
- plugin_name_length = 0;
- msize = plugin_addr_len + plugin_name_length;
-
- GNUNET_assert (sizeof(struct PeerInformationMessage) + msize
- < GNUNET_MAX_MESSAGE_SIZE);
- env = GNUNET_MQ_msg_extra (msg,
- msize,
- GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE);
- msg->id = htonl (ai->id);
- if (NULL != id)
- msg->peer = *id;
- msg->address_length = htons (plugin_addr_len);
- msg->address_active = ntohl (active);
- msg->plugin_name_length = htons (plugin_name_length);
- msg->bandwidth_out = bandwidth_out;
- msg->bandwidth_in = bandwidth_in;
- if (NULL != prop)
- GNUNET_ATS_properties_hton (&msg->properties,
- prop);
- msg->address_local_info = htonl ((uint32_t) local_address_info);
- addrp = (char *) &msg[1];
- GNUNET_memcpy (addrp,
- plugin_addr,
- plugin_addr_len);
- if (NULL != plugin_name)
- strcpy (&addrp[plugin_addr_len],
- plugin_name);
- GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (ai->client),
- env);
-}
-
-
-/**
- * Iterator for #GAS_addresses_get_peer_info(), called with peer-specific
- * information to be passed back to the client.
- *
- * @param cls closure with our `struct AddressIteration *`
- * @param id the peer id
- * @param plugin_name plugin name
- * @param plugin_addr address
- * @param plugin_addr_len length of @a plugin_addr
- * @param active is address actively used
- * @param prop performance information
- * @param local_address_info additional local info for the address
- * @param bandwidth_out current outbound bandwidth assigned to address
- * @param bandwidth_in current inbound bandwidth assigned to address
- */
-static void
-req_addr_peerinfo_it (void *cls,
- const struct GNUNET_PeerIdentity *id,
- const char *plugin_name,
- const void *plugin_addr,
- size_t plugin_addr_len,
- int active,
- const struct GNUNET_ATS_Properties *prop,
- enum GNUNET_HELLO_AddressInfo local_address_info,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
-{
- struct AddressIteration *ai = cls;
-
- if ((NULL == id) &&
- (NULL == plugin_name) &&
- (NULL == plugin_addr))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Address iteration done for one peer\n");
- return;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Callback for %s peer `%s' plugin `%s' BW out %u, BW in %u\n",
- (active == GNUNET_YES) ? "ACTIVE" : "INACTIVE",
- GNUNET_i2s (id),
- plugin_name,
- (unsigned int) ntohl (bandwidth_out.value__),
- (unsigned int) ntohl (bandwidth_in.value__));
- /* Transmit result (either if address is active, or if
- client wanted all addresses) */
- if ((GNUNET_YES != ai->all) &&
- (GNUNET_YES != active))
- return;
- transmit_req_addr (ai,
- id,
- plugin_name,
- plugin_addr, plugin_addr_len,
- active,
- prop,
- local_address_info,
- bandwidth_out,
- bandwidth_in);
-}
-
-
-void
-GAS_handle_request_address_list (struct GNUNET_SERVICE_Client *client,
- const struct AddressListRequestMessage *alrm)
-{
- struct AddressIteration ai;
- struct GNUNET_PeerIdentity allzeros;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received ADDRESSLIST_REQUEST message\n");
- ai.all = ntohl (alrm->all);
- ai.id = ntohl (alrm->id);
- ai.client = client;
-
- memset (&allzeros,
- '\0',
- sizeof(struct GNUNET_PeerIdentity));
- if (GNUNET_YES == GNUNET_is_zero (&alrm->peer))
- {
- /* Return addresses for all peers */
- GAS_addresses_get_peer_info (NULL,
- &req_addr_peerinfo_it,
- &ai);
- }
- else
- {
- /* Return addresses for a specific peer */
- GAS_addresses_get_peer_info (&alrm->peer,
- &req_addr_peerinfo_it,
- &ai);
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Finished handling `%s' message\n",
- "ADDRESSLIST_REQUEST");
- transmit_req_addr (&ai,
- NULL, NULL, NULL,
- 0, GNUNET_NO,
- NULL,
- GNUNET_HELLO_ADDRESS_INFO_NONE,
- GNUNET_BANDWIDTH_ZERO,
- GNUNET_BANDWIDTH_ZERO);
-}
-
-
-/* end of gnunet-service-ats_addresses.c */
diff --git a/src/ats/gnunet-service-ats_addresses.h
b/src/ats/gnunet-service-ats_addresses.h
deleted file mode 100644
index 8e6f40f38..000000000
--- a/src/ats/gnunet-service-ats_addresses.h
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011-2014 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file ats/gnunet-service-ats_addresses.h
- * @brief ats service address management
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_ATS_ADDRESSES_H
-#define GNUNET_SERVICE_ATS_ADDRESSES_H
-
-#include "gnunet_util_lib.h"
-#include "gnunet_ats_service.h"
-#include "gnunet-service-ats.h"
-#include "ats.h"
-
-/**
- * NOTE: Do not change this documentation. This documentation is based on
- * gnunet.org:/vcs/fsnsg/ats-paper.git/tech-doku/ats-tech-guide.tex
- * use build_txt.sh to generate plaintext output
- *
- * 1 ATS addresses : ATS address management
- *
- * This ATS addresses ("addresses") component manages the addresses known to
- * ATS service and suggests addresses to transport service when it is
- * interested in address suggestion for a peer. ATS addresses also
- * instantiates the bandwidth assignment mechanism (solver), notifies it
- * about changes to addresses and forwards changes to bandwidth assignments
- * to transport, depending if transport is interested in this change.
- *
- * 1.1 Input data
- *
- * 1.1.1 Addresses
- *
- * Addresses are added by specifying peer ID, plugin, address, address
length
- * and session, if available. ATS information can be specified if available.
- *
- * 1.1.2 Networks
- *
- * ATS specifies a fix set of networks an address can belong to. For each
- * network an inbound and outbound quota will be specified. The available
- * networks and additional helper variables are defined in
- * gnunet_ats_service.h. At the moment 5 networks are defined:
- * * GNUNET_NT_UNSPECIFIED
- * * GNUNET_NT_LOOPBACK
- * * GNUNET_NT_LAN
- * * GNUNET_NT_WAN
- * * GNUNET_NT_WLAN
- *
- * The total number of networks defined is stored in
- * GNUNET_NT_COUNT GNUNET_ATS_NetworkType can be used array
- * initializer for an int array, while GNUNET_ATS_NetworkType is an
- * initializer for a char array containing a string description of all
- * networks
- *
- * 1.1.3 Quotas
- *
- * An inbound and outbound quota for each of the networks mentioned in 1.1.2
- * is loaded from ats configuration during initialization. This quota
defines
- * to total amount of inbound and outbound traffic allowed for a specific
- * network. The configuration values used are in section ats:
- * * "NETWORK"_QUOTA_IN = <value>
- * * "NETWORK"_QUOTA_IN = <value>
- *
- * You can specify quotas by setting the <value> to a:
- * * unrestricted: unlimited
- * * number of bytes: e.g. 10240
- * * fancy value: e.g. 64 Kib
- *
- * unlimited is defined as GNUNET_ATS_MaxBandwidthString and equivalent to
- * the value GNUNET_ATS_MaxBandwidth Important predefined values for quotas
- * are:
- * * GNUNET_ATS_DefaultBandwidth: 65536
- * * GNUNET_ATS_MaxBandwidth: UINT32_MAX
- * * GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT: 1024
- *
- * Details of loading quotas and default values will be described on
- *
- * 1.1.4 Preference values
- *
- * 1.2 Data structures used
- *
- * Addresse uses struct ATS_Address for each address. The structs are stored
- * in a linked list and provides a pointer void *solver_information for the
- * solver to store address specific information. It provides the int values
- * active which is set to GNUNET_YES if the address is select for transport
- * use and used, representing that transport service is actively using this
- * address. Address information are stored in peer, addr, addr_len, plugin.
- *
- * 1.3 Initialization
- *
- * During initialization a hashmap to store addresses is created. The quotas
- * for all networks defined for ATS are loaded from configuration. For each
- * network first the logic will check if the string
- * GNUNET_ATS_MaxBandwidthString is configured, if not it will try to
convert
- * the configured value as a fancy size and if this fails it will try to use
- * it as a value_number. If no configuration value is found it will assign
- * GNUNET_ATS_DefaultBandwidth. The most important step is to load the
- * configured solver using configuration "[ats]:MODE". Current solvers are
- * MODE_PROPORTIONAL, MODE_MLP. Interaction is done using a solver API
- *
- * 1.4 Solver API
- *
- * Solver functions:
- * * s_init: init the solver with required information
- * * s_add: add a new address
- * * s_update: update ATS values or session for an address
- * * s_get: get preferred address for a peer
- * * s_del: delete an address
- * * s_pref: change preference value for a peer
- * * s_done: shutdown solver
- *
- * Callbacks: addresses provides a bandwidth_changed_cb callback to the
- * solver which is called when bandwidth assigned to peer has changed
- *
- * 1.5 Shutdown
- *
- * During shutdown all addresses are freed and the solver told to shutdown
- *
- * 1.6 Addresses and sessions
- *
- * Addresses consist of the address itself and a numerical session. When a
- * new address without a session is added it has no session, so it gets
- * session 0 assigned. When an address with a session is added and an
address
- * object with session 0 is found, this object is updated with the session
- * otherwise a new address object with this session assigned is created.
- *
- * 1.6.1 Terminology
- *
- * Addresses a1,a2 with session s1, s2 are "exact" if:
- * (a1 == a2)&&(s1 == s2)
- * Addresses a1,a2 with session s1, s2 are "equivalent" if:
- * (a1 == a2)&&((s1 == s2)||(s1 == 0)||(s2 == 0)
- *
- * 1.7 Address management
- *
- * Transport service notifies ATS about changes to the addresses known to
- * it.
- *
- * 1.7.1 Adding an address
- *
- * When transport learns a new address it tells ATS and ATS is telling
- * addresses about it using GAS_address_add. If not known to addresses it
- * creates a new address object and calls solver's s_add. ATS information
are
- * deserialized and solver is notified about the session and ATS information
- * using s_update.
- *
- * 1.7.2 Updating an address
- *
- * Addresses does an lookup up for the existing address with the given
- * session. If disassembles included ATS information and notifies the solver
- * using s_update about the update.
- *
- * 1.7.3 Deleting an address
- *
- * Addresses does an lookup for the exact address and session and if removes
- * this address. If session != 0 the session is set to 0 and the address is
- * kept. If session == 0, the addresses is removed.
- *
- * 1.7.4 Requesting an address suggestion
- *
- * The address client issues a request address message to be notified about
- * address suggestions for a specific peer. Addresses asks the solver with
- * s_get. If no address is available, it will not send a response, otherwise
- * it will respond with the chosen address.
- *
- * 1.7.5 Address suggestions
- *
- * Addresses will notify the client automatically on any
bandwidth_changed_cb
- * by the solver if a address suggestion request is pending. If no address
is
- * available it will not respond at all If the client is not interested
- * anymore, it has to cancel the address suggestion request.
- *
- * 1.7.6 Suggestions blocks and reset
- *
- * After suggesting an address it is blocked for ATS_BLOCKING_DELTA sec. to
- * prevent the client from being thrashed. If the client requires
immediately
- * it can reset this block using GAS_addresses_handle_backoff_reset.
- *
- * 1.7.7 Address lifecycle
- *
- * * (add address)
- * * (updated address)
- * * (delete address)
- *
- * 1.8 Bandwidth assignment
- *
- * The addresses are used to perform resource allocation operations. ATS
- * addresses takes care of instantiating the solver configured and notifies
- * the respective solver about address changes and receives changes to the
- * bandwidth assignment from the solver. The current bandwidth assignment is
- * sent to transport. The specific solvers will be described in the specific
- * section.
- *
- * 1.9 Changing peer preferences
- *
- * The bandwidth assigned to a peer can be influenced by setting a
preference
- * for a peer. The preference will be given to to the solver with s_pref
which
- * has to take care of the preference value
- */
-
-
-/*
- * How long will address suggestions blocked after a suggestion
- */
-#define ATS_BLOCKING_DELTA GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_MILLISECONDS, 100)
-
-/**
- * Information provided by ATS normalization
- */
-struct GAS_NormalizationInfo
-{
- /**
- * Next index to use in averaging queue
- */
- unsigned int avg_queue_index;
-
- /**
- * Averaging queue
- */
- uint64_t atsi_abs[GAS_normalization_queue_length];
-
- /**
- * Averaged ATSI values from queue
- */
- uint64_t avg;
-
- /**
- * Normalized values from queue to a range of values [1.0...2.0]
- */
- double norm;
-};
-
-
-/**
- * Address with additional information
- */
-struct ATS_Address
-{
- /**
- * Peer ID this address is for.
- */
- struct GNUNET_PeerIdentity peer;
-
- /**
- * Address (in plugin-specific binary format).
- */
- const void *addr;
-
- /**
- * Plugin name
- */
- char *plugin;
-
- /**
- * Solver-specific information for this address
- */
- void *solver_information;
-
- /**
- * ATS performance information for this address
- */
- struct GNUNET_ATS_Properties properties;
-
- /**
- * Time when address had last activity (update, in uses)
- */
- struct GNUNET_TIME_Absolute t_last_activity;
-
- /**
- * Time when address was added
- */
- struct GNUNET_TIME_Absolute t_added;
-
- /**
- * Address length, number of bytes in @e addr.
- */
- size_t addr_len;
-
- /**
- * Session ID, can never be 0.
- */
- uint32_t session_id;
-
- /**
- * Field to store local flags.
- */
- enum GNUNET_HELLO_AddressInfo local_address_info;
-
- /**
- * ATS performance information for this address, size of the @e atsi array.
- */
- uint32_t atsi_count;
-
- /**
- * Inbound bandwidth assigned by solver
- */
- uint32_t assigned_bw_in;
-
- /**
- * Outbound bandwidth assigned by solver
- */
- uint32_t assigned_bw_out;
-
- /**
- * Inbound bandwidth assigned by solver in NBO
- */
- uint32_t last_notified_bw_in;
-
- /**
- * Outbound bandwidth assigned by solver in NBO
- */
- uint32_t last_notified_bw_out;
-
- /**
- * Is this the active address for this peer?
- */
- int active;
-
- /**
- * Normalized delay information for this address.
- */
- struct GAS_NormalizationInfo norm_delay;
-
- /**
- * Normalized distance information for this address.
- */
- struct GAS_NormalizationInfo norm_distance;
-
- /**
- * Normalized utilization inbound for this address.
- */
- struct GAS_NormalizationInfo norm_utilization_in;
-
- /**
- * Normalized utilization outbound for this address.
- */
- struct GAS_NormalizationInfo norm_utilization_out;
-};
-
-
-/**
- * A multipeermap mapping peer identities to `struct ATS_Address`.
- */
-extern struct GNUNET_CONTAINER_MultiPeerMap *GSA_addresses;
-
-
-/**
- * Initialize address subsystem. The addresses subsystem manages the addresses
- * known and current performance information.
- */
-void
-GAS_addresses_init (void);
-
-
-/**
- * Shutdown address subsystem.
- */
-void
-GAS_addresses_done (void);
-
-
-/**
- * Add a new address for a peer.
- *
- * @param peer peer
- * @param plugin_name transport plugin name
- * @param plugin_addr plugin address
- * @param plugin_addr_len length of the @a plugin_addr
- * @param local_address_info the local address for the address
- * @param session_id session id, can never be 0.
- * @param prop performance information for this address
- */
-void
-GAS_addresses_add (const struct GNUNET_PeerIdentity *peer,
- const char *plugin_name,
- const void *plugin_addr,
- size_t plugin_addr_len,
- uint32_t local_address_info,
- uint32_t session_id,
- const struct GNUNET_ATS_Properties *prop);
-
-
-/**
- * Update an address with new performance information for a peer.
- *
- * @param peer peer
- * @param session_id session id, can never be 0
- * @param prop performance information for this address
- */
-void
-GAS_addresses_update (const struct GNUNET_PeerIdentity *peer,
- uint32_t session_id,
- const struct GNUNET_ATS_Properties *prop);
-
-
-/**
- * Remove an address for a peer.
- *
- * @param peer peer
- * @param session_id session id, can never be 0
- */
-void
-GAS_addresses_destroy (const struct GNUNET_PeerIdentity *peer,
- uint32_t session_id);
-
-
-/**
- * Remove all addresses.
- */
-void
-GAS_addresses_destroy_all (void);
-
-
-/**
- * Iterator for #GAS_addresses_get_peer_info()
- *
- * @param cls closure
- * @param id the peer id
- * @param plugin_name plugin name
- * @param plugin_addr address
- * @param plugin_addr_len length of @a plugin_addr
- * @param address_active is address actively used
- * @param atsi ats performance information
- * @param local_address_info flags for the address
- * @param bandwidth_out current outbound bandwidth assigned to address
- * @param bandwidth_in current inbound bandwidth assigned to address
- */
-typedef void
-(*GNUNET_ATS_PeerInfo_Iterator) (void *cls,
- const struct GNUNET_PeerIdentity *id,
- const char *plugin_name,
- const void *plugin_addr,
- size_t plugin_addr_len,
- const int address_active,
- const struct GNUNET_ATS_Properties *prop,
- enum GNUNET_HELLO_AddressInfo
- local_address_info,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_out,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_in);
-
-
-/**
- * Return information all peers currently known to ATS
- *
- * @param peer the respective peer, NULL for 'all' peers
- * @param pi_it the iterator to call for every peer
- * @param pi_it_cls the closure for @a pi_it
- */
-void
-GAS_addresses_get_peer_info (const struct GNUNET_PeerIdentity *peer,
- GNUNET_ATS_PeerInfo_Iterator pi_it,
- void *pi_it_cls);
-
-
-/**
- * Handle 'address list request' messages from clients.
- *
- * @param client client that sent the request
- * @param alrm the request message
- */
-void
-GAS_handle_request_address_list (struct GNUNET_SERVICE_Client *client,
- const struct AddressListRequestMessage *alrm);
-
-
-#endif
-
-/* end of gnunet-service-ats_addresses.h */
diff --git a/src/ats/gnunet-service-ats_connectivity.c
b/src/ats/gnunet-service-ats_connectivity.c
deleted file mode 100644
index 702c5ba87..000000000
--- a/src/ats/gnunet-service-ats_connectivity.c
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file ats/gnunet-service-ats_connectivity.c
- * @brief ats service, interaction with 'connecivity' API
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet-service-ats.h"
-#include "gnunet-service-ats_addresses.h"
-#include "gnunet-service-ats_connectivity.h"
-#include "gnunet-service-ats_plugins.h"
-#include "ats.h"
-
-
-/**
- * Active connection requests.
- */
-struct ConnectionRequest
-{
- /**
- * Client that made the request.
- */
- struct GNUNET_SERVICE_Client *client;
-
- /* TODO: allow client to express a 'strength' for this request */
-};
-
-
-/**
- * Address suggestion requests by peer.
- */
-static struct GNUNET_CONTAINER_MultiPeerMap *connection_requests;
-
-
-/**
- * Is the given peer in the list of peers for which we
- * have an address request?
- *
- * @param cls unused, NULL
- * @param peer peer to query for
- * @return #GNUNET_YES if so, #GNUNET_NO if not
- */
-unsigned int
-GAS_connectivity_has_peer (void *cls,
- const struct GNUNET_PeerIdentity *peer)
-{
- if (NULL == connection_requests)
- return 0;
- /* TODO: return sum of 'strength's of connectivity requests */
- return GNUNET_CONTAINER_multipeermap_contains (connection_requests,
- peer);
-}
-
-
-/**
- * Handle #GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS messages from clients.
- *
- * @param client client that sent the request
- * @param msg the request message
- */
-void
-GAS_handle_request_address (struct GNUNET_SERVICE_Client *client,
- const struct RequestAddressMessage *msg)
-{
- struct ConnectionRequest *cr;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received `%s' message\n",
- "GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS");
- /* FIXME: should not ignore "msg->strength" */
- cr = GNUNET_new (struct ConnectionRequest);
- cr->client = client;
- (void) GNUNET_CONTAINER_multipeermap_put (connection_requests,
- &msg->peer,
- cr,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
- GAS_plugin_request_connect_start (&msg->peer);
-}
-
-
-/**
- * Free the connection request from the map if the
- * closure matches the client.
- *
- * @param cls the client to match
- * @param pid peer for which the request was made
- * @param value the `struct ConnectionRequest`
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-free_matching_requests (void *cls,
- const struct GNUNET_PeerIdentity *pid,
- void *value)
-{
- struct GNUNET_SERVICE_Client *client = cls;
- struct ConnectionRequest *cr = value;
-
- if (cr->client == client)
- {
- GAS_plugin_request_connect_stop (pid);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Removed request pending for peer `%s\n",
- GNUNET_i2s (pid));
- GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove (connection_requests,
- pid,
- cr));
- GNUNET_free (cr);
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Handle #GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS_CANCEL messages
- * from clients.
- *
- * @param client the client that sent the request
- * @param msg the request message
- */
-void
-GAS_handle_request_address_cancel (struct GNUNET_SERVICE_Client *client,
- const struct RequestAddressMessage *msg)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS_CANCEL message
for peer %s\n",
- GNUNET_i2s (&msg->peer));
- GNUNET_break (0 == ntohl (msg->strength));
- GNUNET_CONTAINER_multipeermap_get_multiple (connection_requests,
- &msg->peer,
- &free_matching_requests,
- client);
-}
-
-
-/**
- * Unregister a client (which may have been a connectivity client,
- * but this is not assured).
- *
- * @param client handle of the (now dead) client
- */
-void
-GAS_connectivity_remove_client (struct GNUNET_SERVICE_Client *client)
-{
- if (NULL != connection_requests)
- GNUNET_CONTAINER_multipeermap_iterate (connection_requests,
- &free_matching_requests,
- client);
-}
-
-
-/**
- * Shutdown connectivity subsystem.
- */
-void
-GAS_connectivity_init ()
-{
- connection_requests
- = GNUNET_CONTAINER_multipeermap_create (32,
- GNUNET_NO);
-}
-
-
-/**
- * Free the connection request from the map.
- *
- * @param cls NULL
- * @param pid peer for which the request was made
- * @param value the `struct ConnectionRequest`
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-free_request (void *cls,
- const struct GNUNET_PeerIdentity *pid,
- void *value)
-{
- struct ConnectionRequest *cr = value;
-
- free_matching_requests (cr->client,
- pid,
- cr);
- return GNUNET_OK;
-}
-
-
-/**
- * Shutdown connectivity subsystem.
- */
-void
-GAS_connectivity_done ()
-{
- GAS_plugin_solver_lock ();
- GNUNET_CONTAINER_multipeermap_iterate (connection_requests,
- &free_request,
- NULL);
- GAS_plugin_solver_unlock ();
- GNUNET_CONTAINER_multipeermap_destroy (connection_requests);
- connection_requests = NULL;
-}
-
-
-/* end of gnunet-service-ats_connectivity.c */
diff --git a/src/ats/gnunet-service-ats_connectivity.h
b/src/ats/gnunet-service-ats_connectivity.h
deleted file mode 100644
index 39453dfc8..000000000
--- a/src/ats/gnunet-service-ats_connectivity.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/gnunet-service-ats_connectivity.h
- * @brief ats service, interaction with 'connecivity' API
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_ATS_CONNECTIVITY_H
-#define GNUNET_SERVICE_ATS_CONNECTIVITY_H
-
-#include "ats.h"
-
-
-/**
- * Is the given peer in the list of peers for which we
- * have an address request?
- *
- * @param cls unused, NULL
- * @param peer peer to query for
- * @return #GNUNET_YES if so, #GNUNET_NO if not
- */
-unsigned int
-GAS_connectivity_has_peer (void *cls,
- const struct GNUNET_PeerIdentity *peer);
-
-
-/**
- * Handle 'request address' messages from clients.
- *
- * @param client client that sent the request
- * @param msg the request message
- */
-void
-GAS_handle_request_address (struct GNUNET_SERVICE_Client *client,
- const struct RequestAddressMessage *msg);
-
-
-/**
- * Cancel 'request address' messages from clients.
- *
- * @param client client that sent the request
- * @param msg the request message
- */
-void
-GAS_handle_request_address_cancel (struct GNUNET_SERVICE_Client *client,
- const struct RequestAddressMessage *msg);
-
-
-/**
- * Unregister a client (which may have been a connectivity client,
- * but this is not assured).
- *
- * @param client handle of the (now dead) client
- */
-void
-GAS_connectivity_remove_client (struct GNUNET_SERVICE_Client *client);
-
-
-/**
- * Initialize connectivity subsystem.
- */
-void
-GAS_connectivity_init (void);
-
-
-/**
- * Shutdown connectivity subsystem.
- */
-void
-GAS_connectivity_done (void);
-
-
-#endif
-/* end of gnunet-service-ats_connectivity.h */
diff --git a/src/ats/gnunet-service-ats_normalization.c
b/src/ats/gnunet-service-ats_normalization.c
deleted file mode 100644
index 36584e944..000000000
--- a/src/ats/gnunet-service-ats_normalization.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file ats/gnunet-service-ats_normalization.c
- * @brief ats service address: management of ATS properties and preferences
normalization
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include <float.h>
-#include "gnunet_ats_service.h"
-#include "gnunet-service-ats_addresses.h"
-#include "gnunet-service-ats_normalization.h"
-#include "gnunet-service-ats_plugins.h"
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "ats-normalization", __VA_ARGS__)
-
-
-/**
- * Range information for normalization of quality properties.
- */
-struct PropertyRange
-{
- /**
- * Minimum value we see for this property across all addresses.
- */
- struct GNUNET_ATS_Properties min;
-
- /**
- * Maximum value we see for this property across all addresses.
- */
- struct GNUNET_ATS_Properties max;
-};
-
-
-/**
- * Range information for all quality properties we see.
- */
-static struct PropertyRange property_range;
-
-
-/**
- * Add the value from @a atsi to the running average of the
- * given @a ni quality property.
- *
- * @param current_val the updated value
- * @param ni normalization information to update
- */
-static void
-update_avg (uint64_t current_val,
- struct GAS_NormalizationInfo *ni)
-{
- double sum;
- uint32_t count;
- unsigned int c1;
-
- ni->atsi_abs[ni->avg_queue_index++] = current_val;
- if (GAS_normalization_queue_length == ni->avg_queue_index)
- ni->avg_queue_index = 0;
- count = 0;
- sum = 0.0;
- for (c1 = 0; c1 < GAS_normalization_queue_length; c1++)
- {
- if (UINT64_MAX != ni->atsi_abs[c1])
- {
- count++;
- sum += (double) ni->atsi_abs[c1];
- }
- }
- if (0 == count)
- ni->avg = current_val; /* must be UINT64_MAX */
- else
- ni->avg = sum / count;
-}
-
-
-/**
- * Function called for all addresses and peers to find the minimum and
- * maximum (averaged) values for a given quality property. Given
- * those, we can then calculate the normalized score.
- *
- * @param cls the `struct PropertyRange`
- * @param h which peer are we looking at (ignored)
- * @param k the address for that peer
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-find_min_max_it (void *cls,
- const struct GNUNET_PeerIdentity *h,
- void *k)
-{
- struct PropertyRange *pr = cls;
- const struct ATS_Address *a = k;
-
- pr->max.utilization_out = GNUNET_MAX (pr->max.utilization_out,
- a->properties.utilization_out);
- pr->max.utilization_in = GNUNET_MAX (pr->max.utilization_in,
- a->properties.utilization_in);
- pr->max.distance = GNUNET_MAX (pr->max.distance,
- a->properties.distance);
- pr->max.delay = GNUNET_TIME_relative_max (pr->max.delay,
- a->properties.delay);
- pr->min.utilization_out = GNUNET_MIN (pr->min.utilization_out,
- a->properties.utilization_out);
- pr->min.utilization_in = GNUNET_MIN (pr->min.utilization_in,
- a->properties.utilization_in);
- pr->min.distance = GNUNET_MIN (pr->min.distance,
- a->properties.distance);
- pr->min.delay = GNUNET_TIME_relative_min (pr->min.delay,
- a->properties.delay);
- return GNUNET_OK;
-}
-
-
-/**
- * Compute the normalized value from the given @a ni range
- * data and the average value.
- *
- * @param min minimum value
- * @param max maximum value
- * @param ni normalization information to update
- */
-static void
-update_norm (uint64_t min,
- uint64_t max,
- struct GAS_NormalizationInfo *ni)
-{
- /* max - 2 * min + avg_value / (max - min) */
- if (min < max)
- ni->norm = DEFAULT_REL_QUALITY + (ni->avg - min) / (double) (max - min);
- else
- ni->norm = DEFAULT_REL_QUALITY;
-}
-
-
-/**
- * Normalize the property value for a given address based
- * on the range we know that property values have globally.
- *
- * @param cls NULL
- * @param key which peer are we looking at (ignored)
- * @param value the address for that peer, from where we get
- * the original value and where we write the
- * normalized value
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-normalize_address (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct ATS_Address *address = value;
-
- update_norm (property_range.min.delay.rel_value_us,
- property_range.max.delay.rel_value_us,
- &address->norm_delay);
- update_norm (property_range.min.distance,
- property_range.max.distance,
- &address->norm_distance);
- update_norm (property_range.min.utilization_in,
- property_range.max.utilization_in,
- &address->norm_utilization_in);
- update_norm (property_range.min.utilization_out,
- property_range.max.utilization_out,
- &address->norm_utilization_out);
- return GNUNET_OK;
-}
-
-
-/**
- * Notify about change in normalized property.
- *
- * @param cls NULL
- * @param key which peer are we looking at (ignored)
- * @param value the address for that peer
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-notify_change (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct ATS_Address *address = value;
-
- GAS_plugin_notify_property_changed (address);
- return GNUNET_OK;
-}
-
-
-/**
- * Initialize property range to the values corresponding
- * to an empty set.
- *
- * @param pr range to initialize
- */
-static void
-init_range (struct PropertyRange *pr)
-{
- memset (pr, 0, sizeof(struct PropertyRange));
- pr->min.utilization_out = UINT32_MAX;
- pr->min.utilization_in = UINT32_MAX;
- pr->min.distance = UINT32_MAX;
- pr->min.delay = GNUNET_TIME_UNIT_FOREVER_REL;
-}
-
-
-/**
- * Update and normalize atsi performance information
- *
- * @param address the address to update
- */
-void
-GAS_normalization_update_property (struct ATS_Address *address)
-{
- const struct GNUNET_ATS_Properties *prop = &address->properties;
- struct PropertyRange range;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Updating properties for peer `%s'\n",
- GNUNET_i2s (&address->peer));
- GAS_plugin_solver_lock ();
- update_avg (prop->delay.rel_value_us,
- &address->norm_delay);
- update_avg (prop->distance,
- &address->norm_distance);
- update_avg (prop->utilization_in,
- &address->norm_utilization_in);
- update_avg (prop->utilization_in,
- &address->norm_utilization_out);
-
- init_range (&range);
- GNUNET_CONTAINER_multipeermap_iterate (GSA_addresses,
- &find_min_max_it,
- &range);
- if (0 != GNUNET_memcmp (&range,
- &property_range))
- {
- /* limits changed, (re)normalize all addresses */
- property_range = range;
- GNUNET_CONTAINER_multipeermap_iterate (GSA_addresses,
- &normalize_address,
- NULL);
- GNUNET_CONTAINER_multipeermap_iterate (GSA_addresses,
- ¬ify_change,
- NULL);
- }
- else
- {
- /* renormalize just this one address */
- normalize_address (NULL,
- &address->peer,
- address);
- notify_change (NULL,
- &address->peer,
- address);
- }
- GAS_plugin_solver_unlock ();
-}
-
-
-/**
- * Start the normalization component
- */
-void
-GAS_normalization_start ()
-{
- init_range (&property_range);
-}
-
-
-/**
- * Stop the normalization component and free all items
- */
-void
-GAS_normalization_stop ()
-{
- /* nothing to do */
-}
-
-
-/* end of gnunet-service-ats_normalization.c */
diff --git a/src/ats/gnunet-service-ats_normalization.h
b/src/ats/gnunet-service-ats_normalization.h
deleted file mode 100644
index 9c02586c2..000000000
--- a/src/ats/gnunet-service-ats_normalization.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file ats/gnunet-service-ats_normalization.h
- * @brief ats service address: management of ATS properties and preferences
normalization
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_ATS_NORMALIZATION_H
-#define GNUNET_SERVICE_ATS_NORMALIZATION_H
-#include "gnunet_ats_service.h"
-
-/**
- * Value we return for a normalized quality score if we have no data.
- */
-#define DEFAULT_REL_QUALITY 1.0
-
-
-/**
- * Update and normalize a @a prop performance information
- *
- * @param address the address to update
- */
-void
-GAS_normalization_update_property (struct ATS_Address *address);
-
-
-/**
- * Start the normalization component
- */
-void
-GAS_normalization_start (void);
-
-
-/**
- * Stop the normalization component and free all items
- */
-void
-GAS_normalization_stop (void);
-
-#endif
-/* end of gnunet-service-ats_normalization.h */
diff --git a/src/ats/gnunet-service-ats_performance.c
b/src/ats/gnunet-service-ats_performance.c
deleted file mode 100644
index a4d7b36b6..000000000
--- a/src/ats/gnunet-service-ats_performance.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/gnunet-service-ats_performance.c
- * @brief ats service, interaction with 'performance' API
- * @author Matthias Wachs
- * @author Christian Grothoff
- *
- * TODO:
- * - simplify functions by passing a `struct GNUNET_HELLO_Address`
- */
-#include "platform.h"
-#include "gnunet-service-ats.h"
-#include "gnunet-service-ats_addresses.h"
-#include "gnunet-service-ats_performance.h"
-#include "ats.h"
-
-
-/**
- * Context for sending messages to performance clients without PIC.
- */
-static struct GNUNET_NotificationContext *nc_no_pic;
-
-/**
- * Context for sending messages to performance clients with PIC.
- */
-static struct GNUNET_NotificationContext *nc_pic;
-
-
-/**
- * Transmit the given performance information to all performance
- * clients.
- *
- * @param client client to send to, NULL for all
- * @param peer peer for which this is an address suggestion
- * @param plugin_name 0-termintated string specifying the transport plugin
- * @param plugin_addr binary address for the plugin to use
- * @param plugin_addr_len number of bytes in plugin_addr
- * @param active #GNUNET_YES if this address is actively used
- * to maintain a connection to a peer;
- * #GNUNET_NO if the address is not actively used;
- * #GNUNET_SYSERR if this address is no longer available for ATS
- * @param prop performance data for the address
- * @param local_address_info information about the local flags for the address
- * @param bandwidth_out assigned outbound bandwidth
- * @param bandwidth_in assigned inbound bandwidth
- */
-static void
-notify_client (struct GNUNET_SERVICE_Client *client,
- const struct GNUNET_PeerIdentity *peer,
- const char *plugin_name,
- const void *plugin_addr,
- size_t plugin_addr_len,
- int active,
- const struct GNUNET_ATS_Properties *prop,
- enum GNUNET_HELLO_AddressInfo local_address_info,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
-{
- struct PeerInformationMessage *msg;
- size_t plugin_name_length = strlen (plugin_name) + 1;
- size_t msize =
- sizeof(struct PeerInformationMessage)
- + plugin_addr_len
- + plugin_name_length;
- char buf[msize] GNUNET_ALIGN;
- char *addrp;
-
- if (NULL != prop)
- GNUNET_break (GNUNET_NT_UNSPECIFIED != prop->scope);
- GNUNET_assert (msize < GNUNET_MAX_MESSAGE_SIZE);
- msg = (struct PeerInformationMessage *) buf;
- msg->header.size = htons (msize);
- msg->header.type = htons (GNUNET_MESSAGE_TYPE_ATS_PEER_INFORMATION);
- msg->id = htonl (0);
- msg->peer = *peer;
- msg->address_length = htons (plugin_addr_len);
- msg->address_active = ntohl ((uint32_t) active);
- msg->plugin_name_length = htons (plugin_name_length);
- msg->bandwidth_out = bandwidth_out;
- msg->bandwidth_in = bandwidth_in;
- if (NULL != prop)
- GNUNET_ATS_properties_hton (&msg->properties,
- prop);
- else
- memset (&msg->properties,
- 0,
- sizeof(struct GNUNET_ATS_Properties));
- msg->address_local_info = htonl (local_address_info);
- addrp = (char *) &msg[1];
- GNUNET_memcpy (addrp, plugin_addr, plugin_addr_len);
- strcpy (&addrp[plugin_addr_len], plugin_name);
- if (NULL == client)
- {
- GNUNET_notification_context_broadcast (nc_pic,
- &msg->header,
- GNUNET_YES);
- }
- else
- {
- struct GNUNET_MQ_Envelope *env;
-
- env = GNUNET_MQ_msg_copy (&msg->header);
- GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client),
- env);
- }
-}
-
-
-/**
- * Transmit the given performance information to all performance
- * clients.
- *
- * @param peer peer for which this is an address suggestion
- * @param plugin_name 0-termintated string specifying the transport plugin
- * @param plugin_addr binary address for the plugin to use
- * @param plugin_addr_len number of bytes in @a plugin_addr
- * @param active #GNUNET_YES if this address is actively used
- * to maintain a connection to a peer;
- * #GNUNET_NO if the address is not actively used;
- * #GNUNET_SYSERR if this address is no longer available for ATS
- * @param prop performance data for the address
- * @param local_address_info information about the local flags for the address
- * @param bandwidth_out assigned outbound bandwidth
- * @param bandwidth_in assigned inbound bandwidth
- */
-void
-GAS_performance_notify_all_clients (const struct GNUNET_PeerIdentity *peer,
- const char *plugin_name,
- const void *plugin_addr,
- size_t plugin_addr_len,
- int active,
- const struct GNUNET_ATS_Properties *prop,
- enum GNUNET_HELLO_AddressInfo
- local_address_info,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_out,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_in)
-{
- GNUNET_break ((NULL == prop) ||
- (GNUNET_NT_UNSPECIFIED != prop->scope));
- notify_client (NULL,
- peer,
- plugin_name,
- plugin_addr,
- plugin_addr_len,
- active,
- prop,
- local_address_info,
- bandwidth_out,
- bandwidth_in);
- GNUNET_STATISTICS_update (GSA_stats,
- "# performance updates given to clients",
- 1,
- GNUNET_NO);
-}
-
-
-/**
- * Iterator for called from #GAS_addresses_get_peer_info()
- *
- * @param cls closure with the `struct GNUNET_SERVICE_Client *` to inform.
- * @param id the peer id
- * @param plugin_name plugin name
- * @param plugin_addr address
- * @param plugin_addr_len length of @a plugin_addr
- * @param active is address actively used
- * @param prop performance information
- * @param local_address_info information about the local flags for the address
- * @param bandwidth_out current outbound bandwidth assigned to address
- * @param bandwidth_in current inbound bandwidth assigned to address
- */
-static void
-peerinfo_it (void *cls,
- const struct GNUNET_PeerIdentity *id,
- const char *plugin_name,
- const void *plugin_addr,
- size_t plugin_addr_len,
- int active,
- const struct GNUNET_ATS_Properties *prop,
- enum GNUNET_HELLO_AddressInfo local_address_info,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
-{
- struct GNUNET_SERVICE_Client *client = cls;
-
- if (NULL == id)
- return;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Callback for peer `%s' plugin `%s' BW out %u, BW in %u \n",
- GNUNET_i2s (id),
- plugin_name,
- (unsigned int) ntohl (bandwidth_out.value__),
- (unsigned int) ntohl (bandwidth_in.value__));
- GNUNET_break (GNUNET_NT_UNSPECIFIED != prop->scope);
- notify_client (client,
- id,
- plugin_name,
- plugin_addr,
- plugin_addr_len,
- active,
- prop,
- local_address_info,
- bandwidth_out,
- bandwidth_in);
-}
-
-
-/**
- * Register a new performance client.
- *
- * @param client handle of the new client
- * @param flag flag specifying the type of the client
- */
-void
-GAS_performance_add_client (struct GNUNET_SERVICE_Client *client,
- enum StartFlag flag)
-{
- struct GNUNET_MQ_Handle *mq;
-
- mq = GNUNET_SERVICE_client_get_mq (client);
- if (START_FLAG_PERFORMANCE_WITH_PIC == flag)
- {
- GNUNET_notification_context_add (nc_pic,
- mq);
- GAS_addresses_get_peer_info (NULL,
- &peerinfo_it,
- client);
- }
- else
- {
- GNUNET_notification_context_add (nc_no_pic,
- mq);
- }
-}
-
-
-/**
- * Initialize performance subsystem.
- *
- * @param server handle to our server
- */
-void
-GAS_performance_init ()
-{
- nc_no_pic = GNUNET_notification_context_create (32);
- nc_pic = GNUNET_notification_context_create (32);
-}
-
-
-/**
- * Shutdown performance subsystem.
- */
-void
-GAS_performance_done ()
-{
- GNUNET_notification_context_destroy (nc_no_pic);
- nc_no_pic = NULL;
- GNUNET_notification_context_destroy (nc_pic);
- nc_pic = NULL;
-}
-
-
-/* end of gnunet-service-ats_performance.c */
diff --git a/src/ats/gnunet-service-ats_performance.h
b/src/ats/gnunet-service-ats_performance.h
deleted file mode 100644
index 292c27c95..000000000
--- a/src/ats/gnunet-service-ats_performance.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file ats/gnunet-service-ats_performance.h
- * @brief ats service, interaction with 'performance' API
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_ATS_PERFORMANCE_H
-#define GNUNET_SERVICE_ATS_PERFORMANCE_H
-
-#include "gnunet_util_lib.h"
-#include "gnunet_ats_service.h"
-#include "ats.h"
-
-
-/**
- * Transmit the given performance information to all performance
- * clients.
- *
- * @param peer peer for which this is an address suggestion
- * @param plugin_name 0-termintated string specifying the transport plugin
- * @param plugin_addr binary address for the plugin to use
- * @param plugin_addr_len number of bytes in @a plugin_addr
- * @param active #GNUNET_YES if this address is actively used
- * to maintain a connection to a peer;
- * #GNUNET_NO if the address is not actively used;
- * #GNUNET_SYSERR if this address is no longer available for ATS
- * @param prop performance data for the address
- * @param local_address_info information about the local flags for the address
- * @param bandwidth_out assigned outbound bandwidth
- * @param bandwidth_in assigned inbound bandwidth
- */
-void
-GAS_performance_notify_all_clients (const struct GNUNET_PeerIdentity *peer,
- const char *plugin_name,
- const void *plugin_addr,
- size_t plugin_addr_len,
- int active,
- const struct GNUNET_ATS_Properties *prop,
- enum GNUNET_HELLO_AddressInfo
- local_address_info,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_out,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_in);
-
-
-/**
- * Register a new performance client.
- *
- * @param client handle of the new client
- * @param flag flag specifying the type of the client
- */
-void
-GAS_performance_add_client (struct GNUNET_SERVICE_Client *client,
- enum StartFlag flag);
-
-
-/**
- * Initialize performance subsystem.
- *
- * @param server handle to our server
- * @param addresses the address handle to use
- */
-void
-GAS_performance_init (void);
-
-
-/**
- * Shutdown performance subsystem.
- */
-void
-GAS_performance_done (void);
-
-
-#endif
-/* end of gnunet-service-ats_performance.h */
diff --git a/src/ats/gnunet-service-ats_plugins.c
b/src/ats/gnunet-service-ats_plugins.c
deleted file mode 100644
index d3db69caa..000000000
--- a/src/ats/gnunet-service-ats_plugins.c
+++ /dev/null
@@ -1,582 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011-2014 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file ats/gnunet-service-ats_plugins.c
- * @brief ats service plugin management
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_ats_plugin.h"
-#include "gnunet-service-ats_connectivity.h"
-#include "gnunet-service-ats_performance.h"
-#include "gnunet-service-ats_preferences.h"
-#include "gnunet-service-ats_plugins.h"
-#include "gnunet-service-ats_reservations.h"
-#include "gnunet-service-ats_scheduling.h"
-#include "gnunet-service-ats_normalization.h"
-
-
-/**
- * Solver handle.
- */
-static struct GNUNET_ATS_SolverFunctions *sf;
-
-/**
- * Solver environment.
- */
-static struct GNUNET_ATS_PluginEnvironment env;
-
-/**
- * Solver plugin name as string
- */
-static char *plugin;
-
-
-/**
- * The preference changed for a peer, update solver.
- *
- * @param peer the peer
- * @param kind the ATS kind
- * @param pref_rel the new relative preference value
- */
-void
-GAS_plugin_notify_preference_changed (const struct GNUNET_PeerIdentity *peer,
- enum GNUNET_ATS_PreferenceKind kind,
- double pref_rel)
-{
- sf->s_pref (sf->cls,
- peer,
- kind,
- pref_rel);
-}
-
-
-void
-GAS_plugin_notify_property_changed (struct ATS_Address *address)
-{
- sf->s_address_update_property (sf->cls,
- address);
-}
-
-
-/**
- * Solver information callback
- *
- * @param cls the closure
- * @param op the operation
- * @param status operation status
- * @param add additional information
- */
-static void
-solver_info_cb (void *cls,
- enum GAS_Solver_Operation op,
- enum GAS_Solver_Status status,
- enum GAS_Solver_Additional_Information add)
-{
- const char *add_info;
-
- switch (add)
- {
- case GAS_INFO_NONE:
- add_info = "GAS_INFO_NONE";
- break;
-
- case GAS_INFO_FULL:
- add_info = "GAS_INFO_MLP_FULL";
- break;
-
- case GAS_INFO_UPDATED:
- add_info = "GAS_INFO_MLP_UPDATED";
- break;
-
- case GAS_INFO_PROP_ALL:
- add_info = "GAS_INFO_PROP_ALL";
- break;
-
- case GAS_INFO_PROP_SINGLE:
- add_info = "GAS_INFO_PROP_SINGLE";
- break;
-
- default:
- add_info = "INVALID";
- break;
- }
- switch (op)
- {
- case GAS_OP_SOLVE_START:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s' `%s'\n",
- "GAS_OP_SOLVE_START",
- (GAS_STAT_SUCCESS == status) ? "SUCCESS" : "FAIL",
- add_info);
- return;
-
- case GAS_OP_SOLVE_STOP:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_STOP",
- (GAS_STAT_SUCCESS == status) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_SETUP_START:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_SETUP_START",
- (GAS_STAT_SUCCESS == status) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_SETUP_STOP:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_SETUP_STOP",
- (GAS_STAT_SUCCESS == status) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_MLP_LP_START:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_LP_START",
- (GAS_STAT_SUCCESS == status) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_MLP_LP_STOP:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_LP_STOP",
- (GAS_STAT_SUCCESS == status) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_MLP_MLP_START:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_MLP_START",
- (GAS_STAT_SUCCESS == status) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_MLP_MLP_STOP:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_MLP_STOP",
- (GAS_STAT_SUCCESS == status) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_UPDATE_NOTIFICATION_START:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_UPDATE_NOTIFICATION_START",
- (GAS_STAT_SUCCESS == status) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP",
- (GAS_STAT_SUCCESS == status) ? "SUCCESS" : "FAIL");
- return;
-
- default:
- GNUNET_break (0);
- break;
- }
-}
-
-
-/**
- * Callback for solver to notify about assignment changes
- *
- * @param cls NULL
- * @param address the address with changes
- */
-static void
-bandwidth_changed_cb (void *cls,
- struct ATS_Address *address)
-{
- long long diff_out;
- long long diff_in;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Bandwidth assignment changed for peer %s to %u/%u\n",
- GNUNET_i2s (&address->peer),
- (unsigned int) address->assigned_bw_in,
- (unsigned int) address->assigned_bw_out);
- GAS_reservations_set_bandwidth (&address->peer,
- GNUNET_BANDWIDTH_value_init (
- address->assigned_bw_in));
- /* Notify performance clients about changes to address */
- GAS_performance_notify_all_clients (&address->peer,
- address->plugin,
- address->addr,
- address->addr_len,
- address->active,
- &address->properties,
- address->local_address_info,
- GNUNET_BANDWIDTH_value_init (
- address->assigned_bw_out),
- GNUNET_BANDWIDTH_value_init (
- address->assigned_bw_in));
-
- if ((0 == address->assigned_bw_in) &&
- (0 == address->assigned_bw_out))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Telling transport to disconnect peer `%s'\n",
- GNUNET_i2s (&address->peer));
-
- /* Notify scheduling clients about suggestion */
- GAS_scheduling_transmit_address_suggestion (&address->peer,
- address->session_id,
- GNUNET_BANDWIDTH_ZERO,
- GNUNET_BANDWIDTH_ZERO);
- return;
- }
-
- /* Do bandwidth stability check */
- diff_out = llabs ((long long) address->assigned_bw_out
- - (long long) address->last_notified_bw_out);
- diff_in = llabs ((long long) address->assigned_bw_in
- - (long long) address->last_notified_bw_in);
- if ((diff_out < htonl (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__)) &&
- (diff_in < htonl (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Bandwidth change too small, not notifying client\n");
- return;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Sending bandwidth update for peer `%s': %u/%u\n",
- GNUNET_i2s (&address->peer),
- address->assigned_bw_out,
- address->assigned_bw_out);
-
- /* *Notify scheduling clients about suggestion */
- GAS_scheduling_transmit_address_suggestion (&address->peer,
- address->session_id,
- GNUNET_BANDWIDTH_value_init (
- address->assigned_bw_out),
- GNUNET_BANDWIDTH_value_init (
- address->assigned_bw_in));
-
- address->last_notified_bw_out = address->assigned_bw_out;
- address->last_notified_bw_in = address->assigned_bw_in;
-}
-
-
-/**
- * Convert quota from text to numeric value.
- *
- * @param quota_str the value found in the configuration
- * @param direction direction of the quota
- * @param network network the quota applies to
- * @return numeric quota value to use
- */
-static unsigned long long
-parse_quota (const char *quota_str,
- const char *direction,
- enum GNUNET_NetworkType network)
-{
- int res;
- unsigned long long ret;
-
- res = GNUNET_NO;
- if (0 == strcmp (quota_str, GNUNET_ATS_MaxBandwidthString))
- {
- ret = GNUNET_ATS_MaxBandwidth;
- res = GNUNET_YES;
- }
- if ((GNUNET_NO == res) &&
- (GNUNET_OK ==
- GNUNET_STRINGS_fancy_size_to_bytes (quota_str,
- &ret)))
- res = GNUNET_YES;
- if ((GNUNET_NO == res) &&
- (1 ==
- sscanf (quota_str,
- "%llu",
- &ret)))
- res = GNUNET_YES;
- if (GNUNET_NO == res)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ (
- "Could not load %s quota for network `%s': `%s', assigning
default bandwidth %llu\n"),
- direction,
- GNUNET_NT_to_string (network),
- quota_str,
- (unsigned long long) GNUNET_ATS_DefaultBandwidth);
- ret = GNUNET_ATS_DefaultBandwidth;
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ ("%s quota configured for network `%s' is %llu\n"),
- direction,
- GNUNET_NT_to_string (network),
- ret);
- }
- return ret;
-}
-
-
-/**
- * Load quota value from the configuration @a cfg for the
- * given network @a type and @a direction.
- *
- * @param cfg configuration to parse
- * @param type network type to parse for
- * @param direction traffic direction to parse for
- * @return quota to apply
- */
-static unsigned long long
-load_quota (const struct GNUNET_CONFIGURATION_Handle *cfg,
- enum GNUNET_NetworkType type,
- const char *direction)
-{
- char *entry;
- char *quota_str;
- unsigned long long ret;
-
- GNUNET_asprintf (&entry,
- "%s_QUOTA_%s",
- GNUNET_NT_to_string (type),
- direction);
- if (GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_string (cfg,
- "ats",
- entry,
- "a_str))
- {
- ret = parse_quota (quota_str,
- direction,
- type);
- GNUNET_free (quota_str);
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ (
- "No %s-quota configured for network `%s', assigning default
bandwidth %llu\n"),
- direction,
- GNUNET_NT_to_string (type),
- (unsigned long long) GNUNET_ATS_DefaultBandwidth);
- ret = GNUNET_ATS_DefaultBandwidth;
- }
- GNUNET_free (entry);
- return ret;
-}
-
-
-/**
- * Load quotas for networks from configuration
- *
- * @param cfg configuration handle
- * @param out_dest where to write outbound quotas
- * @param in_dest where to write inbound quotas
- * @param dest_length length of inbound and outbound arrays
- * @return number of networks loaded
- */
-static unsigned int
-load_quotas (const struct GNUNET_CONFIGURATION_Handle *cfg,
- unsigned long long *out_dest,
- unsigned long long *in_dest,
- int dest_length)
-{
- unsigned int c;
-
- for (c = 0; (c < GNUNET_NT_COUNT) && (c < dest_length); c++)
- {
- in_dest[c] = load_quota (cfg,
- c,
- "out");
- out_dest[c] = load_quota (cfg,
- c,
- "in");
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Loaded quota for network `%s' (in/out): %llu %llu\n",
- GNUNET_NT_to_string (c),
- in_dest[c],
- out_dest[c]);
- }
- return c;
-}
-
-
-int
-GAS_plugin_init (const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- char *mode_str;
-
- /* Figure out configured solution method */
- if (GNUNET_SYSERR ==
- GNUNET_CONFIGURATION_get_value_string (cfg,
- "ats",
- "MODE",
- &mode_str))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "No resource assignment method configured, using proportional
approach\n");
- mode_str = GNUNET_strdup ("proportional");
- }
- env.cls = NULL;
- env.info_cb = &solver_info_cb;
- env.bandwidth_changed_cb = &bandwidth_changed_cb;
- env.get_preferences = &GAS_preference_get_by_peer;
- env.get_connectivity = &GAS_connectivity_has_peer;
- env.cfg = cfg;
- env.stats = GSA_stats;
- env.addresses = GSA_addresses;
- env.network_count = GNUNET_NT_COUNT;
- load_quotas (cfg,
- env.out_quota,
- env.in_quota,
- GNUNET_NT_COUNT);
- GNUNET_asprintf (&plugin,
- "libgnunet_plugin_ats_%s",
- mode_str);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Initializing solver `%s'\n",
- mode_str);
- GNUNET_free (mode_str);
- if (NULL == (sf = GNUNET_PLUGIN_load (plugin, &env)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to initialize solver `%s'!\n"),
- plugin);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Shutdown address subsystem.
- */
-void
-GAS_plugin_done ()
-{
- GNUNET_PLUGIN_unload (plugin,
- sf);
- sf = NULL;
- GNUNET_free (plugin);
- plugin = NULL;
-}
-
-
-void
-GAS_plugin_new_address (struct ATS_Address *new_address)
-{
- sf->s_add (sf->cls,
- new_address,
- new_address->properties.scope); /* FIXME: remove 3rd arg here! */
-}
-
-
-/**
- * Tell the solver that the given address is no longer valid
- * can cannot be used any longer.
- *
- * @param address address that was deleted
- */
-void
-GAS_plugin_delete_address (struct ATS_Address *address)
-{
- sf->s_del (sf->cls,
- address);
-}
-
-
-/**
- * Tell the solver that the given client has expressed its
- * appreciation for the past performance of a given connection.
- *
- * @param application client providing the feedback
- * @param peer peer the feedback is about
- * @param scope timeframe the feedback applies to
- * @param kind performance property the feedback relates to
- * @param score_abs degree of the appreciation
- */
-void
-GAS_plugin_notify_feedback (struct GNUNET_SERVICE_Client *application,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_TIME_Relative scope,
- enum GNUNET_ATS_PreferenceKind kind,
- float score_abs)
-{
- sf->s_feedback (sf->cls,
- application,
- peer,
- scope,
- kind,
- score_abs);
-}
-
-
-/**
- * Stop instant solving, there are many state updates
- * happening in bulk right now.
- */
-void
-GAS_plugin_solver_lock ()
-{
- sf->s_bulk_start (sf->cls);
-}
-
-
-/**
- * Resume instant solving, we are done with the bulk state updates.
- */
-void
-GAS_plugin_solver_unlock ()
-{
- sf->s_bulk_stop (sf->cls);
-}
-
-
-/**
- * Notify the plugin that a request to connect to
- * a particular peer was given to us.
- *
- * @param pid identity of peer we now care about
- */
-void
-GAS_plugin_request_connect_start (const struct GNUNET_PeerIdentity *pid)
-{
- sf->s_get (sf->cls,
- pid);
-}
-
-
-/**
- * Notify the plugin that a request to connect to
- * a particular peer was dropped.
- *
- * @param pid identity of peer we care now less about
- */
-void
-GAS_plugin_request_connect_stop (const struct GNUNET_PeerIdentity *pid)
-{
- sf->s_get_stop (sf->cls,
- pid);
-}
-
-
-/* end of gnunet-service-ats_plugins.c */
diff --git a/src/ats/gnunet-service-ats_plugins.h
b/src/ats/gnunet-service-ats_plugins.h
deleted file mode 100644
index 1abdbbd80..000000000
--- a/src/ats/gnunet-service-ats_plugins.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011-2014 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file ats/gnunet-service-ats_plugins.h
- * @brief ats service plugin management
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_ATS_PLUGINS_H
-#define GNUNET_SERVICE_ATS_PLUGINS_H
-
-#include "gnunet-service-ats_addresses.h"
-
-
-/**
- * Initialize address subsystem. The addresses subsystem manages the addresses
- * known and current performance information. It has a solver component
- * responsible for the resource allocation. It tells the solver about changes
- * and receives updates when the solver changes the resource allocation.
- *
- * @param cfg configuration to use
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on error (failed to load
- * solver plugin)
- */
-int
-GAS_plugin_init (const struct GNUNET_CONFIGURATION_Handle *cfg);
-
-
-/**
- * Shutdown address subsystem.
- */
-void
-GAS_plugin_done (void);
-
-
-/**
- * The preference changed for a peer, update solver.
- *
- * @param peer the peer
- * @param kind the ATS kind
- * @param pref_rel the new relative preference value
- */
-void
-GAS_plugin_notify_preference_changed (const struct GNUNET_PeerIdentity *peer,
- enum GNUNET_ATS_PreferenceKind kind,
- double pref_rel);
-
-
-/**
- * The relative value for a property changed.
- *
- * @param address The peer for which a property changed.
- */
-void
-GAS_plugin_notify_property_changed (struct ATS_Address *address);
-
-
-/**
- * Tell the solver that the given address can now be used
- * for talking to the respective peer.
- *
- * @param new_address the new address
- */
-void
-GAS_plugin_new_address (struct ATS_Address *new_address);
-
-
-/**
- * Tell the solver that the given address is no longer valid
- * can cannot be used any longer.
- *
- * @param address address that was deleted
- */
-void
-GAS_plugin_delete_address (struct ATS_Address *address);
-
-
-/**
- * Tell the solver that the given client has expressed its
- * appreciation for the past performance of a given connection.
- *
- * @param application client providing the feedback
- * @param peer peer the feedback is about
- * @param scope timeframe the feedback applies to
- * @param kind performance property the feedback relates to
- * @param score_abs degree of the appreciation
- */
-void
-GAS_plugin_notify_feedback (struct GNUNET_SERVICE_Client *application,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_TIME_Relative scope,
- enum GNUNET_ATS_PreferenceKind kind,
- float score_abs);
-
-
-/**
- * Stop instant solving, there are many state updates
- * happening in bulk right now.
- */
-void
-GAS_plugin_solver_lock (void);
-
-
-/**
- * Resume instant solving, we are done with the bulk state updates.
- */
-void
-GAS_plugin_solver_unlock (void);
-
-
-/**
- * Notify the plugin that a request to connect to
- * a particular peer was given to us.
- *
- * @param pid identity of peer we now care about
- */
-void
-GAS_plugin_request_connect_start (const struct GNUNET_PeerIdentity *pid);
-
-
-/**
- * Notify the plugin that a request to connect to
- * a particular peer was dropped.
- *
- * @param pid identity of peer we care now less about
- */
-void
-GAS_plugin_request_connect_stop (const struct GNUNET_PeerIdentity *pid);
-
-
-#endif
diff --git a/src/ats/gnunet-service-ats_preferences.c
b/src/ats/gnunet-service-ats_preferences.c
deleted file mode 100644
index c2b2dc4c1..000000000
--- a/src/ats/gnunet-service-ats_preferences.c
+++ /dev/null
@@ -1,771 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/gnunet-service-ats_preferences.c
- * @brief manage preferences expressed by clients
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet-service-ats.h"
-#include "gnunet-service-ats_addresses.h"
-#include "gnunet-service-ats_performance.h"
-#include "gnunet-service-ats_plugins.h"
-#include "gnunet-service-ats_preferences.h"
-#include "gnunet-service-ats_reservations.h"
-#include "ats.h"
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "ats-preferences", __VA_ARGS__)
-
-/**
- * How frequently do we age preference values?
- */
-#define PREF_AGING_INTERVAL GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_SECONDS, 10)
-
-/**
- * By which factor do we age preferences expressed during
- * each #PREF_AGING_INTERVAL?
- */
-#define PREF_AGING_FACTOR 0.95
-
-/**
- * What is the lowest threshold up to which preference values
- * are aged, and below which we consider them zero and thus
- * no longer subject to aging?
- */
-#define PREF_EPSILON 0.01
-
-
-/**
- * Relative preferences for a peer.
- */
-struct PeerRelative
-{
- /**
- * Array of relative preference values, to be indexed by
- * an `enum GNUNET_ATS_PreferenceKind`.
- */
- double f_rel[GNUNET_ATS_PREFERENCE_END];
-
- /**
- * Number of clients that are expressing a preference for
- * this peer. When this counter reaches zero, this entry
- * is freed.
- */
- unsigned int num_clients;
-};
-
-
-/**
- * Default values, returned as our preferences if we do not
- * have any preferences expressed for a peer.
- */
-static struct PeerRelative defvalues;
-
-
-/**
- * Preference information per peer and client.
- */
-struct PreferencePeer
-{
- /**
- * Next in DLL of preference entries for the same client.
- */
- struct PreferencePeer *next;
-
- /**
- * Previous in DLL of preference entries for the same client.
- */
- struct PreferencePeer *prev;
-
- /**
- * Absolute preference values for all preference types
- * as expressed by this client for this peer.
- */
- double f_abs[GNUNET_ATS_PREFERENCE_END];
-
- /**
- * Relative preference values for all preference types,
- * normalized in [0..1] based on how the respective
- * client scored other peers.
- */
- double f_rel[GNUNET_ATS_PREFERENCE_END];
-};
-
-
-/**
- * Preference client, as in a client that expressed preferences
- * for peers. This is the information we keep track of for each
- * such client.
- */
-struct PreferenceClient
-{
- /**
- * Next in client list
- */
- struct PreferenceClient *next;
-
- /**
- * Previous in client peer list
- */
- struct PreferenceClient *prev;
-
- /**
- * Client handle
- */
- struct GNUNET_SERVICE_Client *client;
-
- /**
- * Mapping peer identities to `struct PreferencePeer` entry
- * for the respective peer.
- */
- struct GNUNET_CONTAINER_MultiPeerMap *peer2pref;
-
- /**
- * Array of sums of absolute preferences for all
- * peers as expressed by this client.
- */
- double f_abs_sum[GNUNET_ATS_PREFERENCE_END];
-};
-
-
-/**
- * Hashmap to store peer information for preference normalization.
- * Maps the identity of a peer to a `struct PeerRelative` containing
- * the current relative preference values for that peer.
- */
-static struct GNUNET_CONTAINER_MultiPeerMap *preference_peers;
-
-/**
- * Clients in DLL: head
- */
-static struct PreferenceClient *pc_head;
-
-/**
- * Clients in DLL: tail
- */
-static struct PreferenceClient *pc_tail;
-
-/**
- * Handle for task we run periodically to age preferences over time.
- */
-static struct GNUNET_SCHEDULER_Task *aging_task;
-
-
-/**
- * Closure for #sum_relative_preferences().
- */
-struct SumContext
-{
- /**
- * Where to accumulate the result.
- */
- double f_rel_total;
-
- /**
- * Which kind of preference value are we adding up?
- */
- enum GNUNET_ATS_PreferenceKind kind;
-};
-
-
-/**
- * Add the relative preference for the kind given to the
- * closure.
- *
- * @param cls the `struct SumContext` with the kind and place
- * to store the result
- * @param peer ignored
- * @param value the `struct PreferencePeer` for getting the rel pref.
- * @return #GNUNET_OK
- */
-static int
-sum_relative_preferences (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *value)
-{
- struct SumContext *sum_ctx = cls;
- struct PreferencePeer *p_cur = value;
-
- sum_ctx->f_rel_total += p_cur->f_rel[sum_ctx->kind];
- return GNUNET_OK;
-}
-
-
-/**
- * Update the total relative preference for a peer by summing
- * up the relative preferences all clients have for this peer.
- *
- * @param id peer id of the peer for which we should do the update
- * @param kind the kind of preference value to update
- * @return the new relative preference
- */
-static void
-update_relative_values_for_peer (const struct GNUNET_PeerIdentity *id,
- enum GNUNET_ATS_PreferenceKind kind)
-{
- struct PreferenceClient *c_cur;
- struct SumContext sum_ctx;
- struct PeerRelative *rp;
-
- sum_ctx.f_rel_total = 0.0;
- sum_ctx.kind = kind;
- for (c_cur = pc_head; NULL != c_cur; c_cur = c_cur->next)
- GNUNET_CONTAINER_multipeermap_get_multiple (c_cur->peer2pref,
- id,
- &sum_relative_preferences,
- &sum_ctx);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Total relative preference for peer `%s' for `%s' is %.3f\n",
- GNUNET_i2s (id),
- GNUNET_ATS_print_preference_type (kind),
- sum_ctx.f_rel_total);
- rp = GNUNET_CONTAINER_multipeermap_get (preference_peers,
- id);
- GNUNET_assert (NULL != rp);
- if (rp->f_rel[kind] != sum_ctx.f_rel_total)
- {
- rp->f_rel[kind] = sum_ctx.f_rel_total;
- GAS_plugin_notify_preference_changed (id,
- kind,
- rp->f_rel[kind]);
- }
-}
-
-
-/**
- * Free a peer's `struct PeerRelative`.
- *
- * @param cls unused
- * @param key the key
- * @param value the `struct PeerRelative` to free.
- * @return #GNUNET_OK to continue
- */
-static int
-free_peer (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct PeerRelative *rp = value;
-
- GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove (preference_peers,
- key,
- value));
- GNUNET_free (rp);
- return GNUNET_OK;
-}
-
-
-/**
- * Free `struct PreferencePeer` entry in map.
- *
- * @param cls the `struct PreferenceClient` with the map
- * @param key the peer the entry is for
- * @param value the `struct PreferencePeer` entry to free
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-free_preference (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct PreferenceClient *pc = cls;
- struct PreferencePeer *p = value;
- struct PeerRelative *pr;
-
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_remove (pc->peer2pref,
- key,
- p));
- GNUNET_free (p);
- pr = GNUNET_CONTAINER_multipeermap_get (preference_peers,
- key);
- GNUNET_assert (NULL != pr);
- GNUNET_assert (pr->num_clients > 0);
- pr->num_clients--;
- if (0 == pr->num_clients)
- {
- free_peer (NULL,
- key,
- pr);
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Closure for #age_values().
- */
-struct AgeContext
-{
- /**
- * Counter of values remaining to update, incremented for each value
- * changed (to a new non-zero value).
- */
- unsigned int values_to_update;
-
- /**
- * Client we are currently aging values for.
- */
- struct PreferenceClient *cur_client;
-};
-
-
-/**
- * Age preference values of the given peer.
- *
- * @param cls a `
- * @param peer peer being aged
- * @param value the `struct PreferencePeer` for the peer
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-age_values (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *value)
-{
- struct AgeContext *ac = cls;
- struct PreferencePeer *p = value;
- unsigned int i;
- int dead;
-
- dead = GNUNET_YES;
- for (i = 0; i < GNUNET_ATS_PREFERENCE_END; i++)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Aging preference for peer `%s'\n",
- GNUNET_i2s (peer));
- if (p->f_abs[i] > DEFAULT_ABS_PREFERENCE)
- p->f_abs[i] *= PREF_AGING_FACTOR;
- if (p->f_abs[i] <= DEFAULT_ABS_PREFERENCE + PREF_EPSILON)
- {
- p->f_abs[i] = DEFAULT_ABS_PREFERENCE;
- p->f_rel[i] = DEFAULT_REL_PREFERENCE;
- update_relative_values_for_peer (peer,
- i);
- }
- else
- {
- ac->values_to_update++;
- dead = GNUNET_NO;
- }
- }
- if (GNUNET_YES == dead)
- {
- /* all preferences are zero, remove this entry */
- free_preference (ac->cur_client,
- peer,
- p);
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Reduce absolute preferences since they got old.
- *
- * @param cls unused
- */
-static void
-preference_aging (void *cls)
-{
- struct AgeContext ac;
-
- aging_task = NULL;
- GAS_plugin_solver_lock ();
- ac.values_to_update = 0;
- for (ac.cur_client = pc_head; NULL != ac.cur_client; ac.cur_client =
- ac.cur_client->next)
- GNUNET_CONTAINER_multipeermap_iterate (ac.cur_client->peer2pref,
- &age_values,
- &ac);
- GAS_plugin_solver_unlock ();
- if (ac.values_to_update > 0)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Rescheduling aging task due to %u elements remaining to
age\n",
- ac.values_to_update);
- if (NULL == aging_task)
- aging_task = GNUNET_SCHEDULER_add_delayed (PREF_AGING_INTERVAL,
- &preference_aging,
- NULL);
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "No values to age left, not rescheduling aging task\n");
- }
-}
-
-
-/**
- * Closure for #update_rel_sum() and #update_abs_sum().
- */
-struct UpdateContext
-{
- /**
- * Preference client with the sum of all absolute scores.
- */
- struct PreferenceClient *pc;
-
- /**
- * Which kind are we updating?
- */
- enum GNUNET_ATS_PreferenceKind kind;
-};
-
-
-/**
- * Compute updated absolute score for the client based on the
- * current absolute scores for each peer.
- *
- * @param cls a `struct UpdateContext`
- * @param peer peer being updated
- * @param value the `struct PreferencePeer` for the peer
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-update_abs_sum (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *value)
-{
- struct UpdateContext *uc = cls;
- struct PreferencePeer *p_cur = value;
-
- uc->pc->f_abs_sum[uc->kind] += p_cur->f_abs[uc->kind];
- return GNUNET_OK;
-}
-
-
-/**
- * Compute updated relative score for each peer based on the
- * current absolute score given by this client.
- *
- * @param cls a `struct UpdateContext`
- * @param peer peer being updated
- * @param value the `struct PreferencePeer` for the peer (updated)
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-update_rel_sum (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *value)
-{
- struct UpdateContext *uc = cls;
- struct PreferencePeer *p_cur = value;
-
- p_cur->f_rel[uc->kind] = p_cur->f_abs[uc->kind] /
uc->pc->f_abs_sum[uc->kind];
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Client has relative preference for %s for peer `%s' of %.3f\n",
- GNUNET_ATS_print_preference_type (uc->kind),
- GNUNET_i2s (peer),
- p_cur->f_rel[uc->kind]);
- return GNUNET_OK;
-}
-
-
-/**
- * Recalculate preference for a specific ATS property
- *
- * @param c the preference client
- * @param kind the preference kind
- * @return the result
- */
-static void
-recalculate_relative_preferences (struct PreferenceClient *c,
- enum GNUNET_ATS_PreferenceKind kind)
-{
- struct UpdateContext uc;
-
- /* For this client: sum of absolute preference values for this preference */
- uc.kind = kind;
- uc.pc = c;
- c->f_abs_sum[kind] = 0.0;
-
- /* For all peers: calculate sum of absolute preferences */
- GNUNET_CONTAINER_multipeermap_iterate (c->peer2pref,
- &update_abs_sum,
- &uc);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Client has sum of total preferences for %s of %.3f\n",
- GNUNET_ATS_print_preference_type (kind),
- c->f_abs_sum[kind]);
-
- /* For all peers: calculate relative preference */
- GNUNET_CONTAINER_multipeermap_iterate (c->peer2pref,
- &update_rel_sum,
- &uc);
-}
-
-
-/**
- * The relative preferences of one of the clients have
- * changed, update the global preferences for the given
- * peer and notify the plugin.
- *
- * @param cls the kind of preference to calculate the
- * new global relative preference values for
- * @param key the peer to update relative preference values for
- * @param value a `struct PeerRelative`, unused
- */
-static int
-update_iterator (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- enum GNUNET_ATS_PreferenceKind *kind = cls;
-
- update_relative_values_for_peer (key,
- *kind);
- return GNUNET_OK;
-}
-
-
-/**
- * Update the absolute preference and calculate the
- * new relative preference value.
- *
- * @param client the client with this preference
- * @param peer the peer to change the preference for
- * @param kind the kind to change the preference
- * @param score_abs the normalized score
- */
-static void
-update_preference (struct GNUNET_SERVICE_Client *client,
- const struct GNUNET_PeerIdentity *peer,
- enum GNUNET_ATS_PreferenceKind kind,
- float score_abs)
-{
- struct PreferenceClient *c_cur;
- struct PreferencePeer *p_cur;
- struct PeerRelative *r_cur;
- unsigned int i;
-
- if (kind >= GNUNET_ATS_PREFERENCE_END)
- {
- GNUNET_break (0);
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Client changes preference for peer `%s' for `%s' to %.2f\n",
- GNUNET_i2s (peer),
- GNUNET_ATS_print_preference_type (kind),
- score_abs);
-
- /* Find preference client */
- for (c_cur = pc_head; NULL != c_cur; c_cur = c_cur->next)
- if (client == c_cur->client)
- break;
- /* Not found: create new preference client */
- if (NULL == c_cur)
- {
- c_cur = GNUNET_new (struct PreferenceClient);
- c_cur->client = client;
- c_cur->peer2pref = GNUNET_CONTAINER_multipeermap_create (16,
- GNUNET_NO);
- for (i = 0; i < GNUNET_ATS_PREFERENCE_END; i++)
- c_cur->f_abs_sum[i] = DEFAULT_ABS_PREFERENCE;
- GNUNET_CONTAINER_DLL_insert (pc_head,
- pc_tail,
- c_cur);
- }
-
- /* check global peer entry exists */
- if (NULL ==
- (r_cur = GNUNET_CONTAINER_multipeermap_get (preference_peers,
- peer)))
- {
- /* Create struct for peer */
- r_cur = GNUNET_new (struct PeerRelative);
- for (i = 0; i < GNUNET_ATS_PREFERENCE_END; i++)
- r_cur->f_rel[i] = DEFAULT_REL_PREFERENCE;
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_put (preference_peers,
- peer,
- r_cur,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
- }
-
- /* Find entry for peer */
- p_cur = GNUNET_CONTAINER_multipeermap_get (c_cur->peer2pref,
- peer);
- if (NULL == p_cur)
- {
- /* Not found: create new peer entry */
- p_cur = GNUNET_new (struct PreferencePeer);
- for (i = 0; i < GNUNET_ATS_PREFERENCE_END; i++)
- {
- /* Default value per peer absolute preference for a preference*/
- p_cur->f_abs[i] = DEFAULT_ABS_PREFERENCE;
- /* Default value per peer relative preference for a quality */
- p_cur->f_rel[i] = DEFAULT_REL_PREFERENCE;
- }
- GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_put (c_cur->peer2pref,
- peer,
- p_cur,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
- r_cur->num_clients++;
- }
-
- p_cur->f_abs[kind] += score_abs;
- recalculate_relative_preferences (c_cur, kind);
- GNUNET_CONTAINER_multipeermap_iterate (preference_peers,
- &update_iterator,
- &kind);
-
- if (NULL == aging_task)
- aging_task = GNUNET_SCHEDULER_add_delayed (PREF_AGING_INTERVAL,
- &preference_aging,
- NULL);
-}
-
-
-/**
- * Handle 'preference change' messages from clients.
- *
- * @param client the client that sent the request
- * @param msg the request message
- */
-void
-GAS_handle_preference_change (struct GNUNET_SERVICE_Client *client,
- const struct ChangePreferenceMessage *msg)
-{
- const struct PreferenceInformation *pi;
- uint32_t nump;
-
- nump = ntohl (msg->num_preferences);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received PREFERENCE_CHANGE message for peer `%s'\n",
- GNUNET_i2s (&msg->peer));
- GNUNET_STATISTICS_update (GSA_stats,
- "# preference change requests processed",
- 1,
- GNUNET_NO);
- pi = (const struct PreferenceInformation *) &msg[1];
- GAS_plugin_solver_lock ();
- for (uint32_t i = 0; i < nump; i++)
- update_preference (client,
- &msg->peer,
- (enum GNUNET_ATS_PreferenceKind) ntohl (
- pi[i].preference_kind),
- pi[i].preference_value);
- GAS_plugin_solver_unlock ();
-}
-
-
-/**
- * Initialize preferences subsystem.
- */
-void
-GAS_preference_init ()
-{
- unsigned int i;
-
- preference_peers = GNUNET_CONTAINER_multipeermap_create (16,
- GNUNET_NO);
- for (i = 0; i < GNUNET_ATS_PREFERENCE_END; i++)
- defvalues.f_rel[i] = DEFAULT_REL_PREFERENCE;
-}
-
-
-/**
- * Shutdown preferences subsystem.
- */
-void
-GAS_preference_done ()
-{
- struct PreferenceClient *pc;
- struct PreferenceClient *next_pc;
-
- if (NULL != aging_task)
- {
- GNUNET_SCHEDULER_cancel (aging_task);
- aging_task = NULL;
- }
- next_pc = pc_head;
- while (NULL != (pc = next_pc))
- {
- next_pc = pc->next;
- GNUNET_CONTAINER_DLL_remove (pc_head,
- pc_tail,
- pc);
- GNUNET_CONTAINER_multipeermap_iterate (pc->peer2pref,
- &free_preference,
- pc);
- GNUNET_CONTAINER_multipeermap_destroy (pc->peer2pref);
- GNUNET_free (pc);
- }
- GNUNET_CONTAINER_multipeermap_iterate (preference_peers,
- &free_peer,
- NULL);
- GNUNET_CONTAINER_multipeermap_destroy (preference_peers);
-}
-
-
-/**
- * Get the normalized preference values for a specific peer or
- * the default values if
- *
- * @param cls ignored
- * @param id the peer
- * @return pointer to the values, can be indexed with
GNUNET_ATS_PreferenceKind,
- * default preferences if peer does not exist
- */
-const double *
-GAS_preference_get_by_peer (void *cls,
- const struct GNUNET_PeerIdentity *id)
-{
- struct PeerRelative *rp;
-
- if (NULL ==
- (rp = GNUNET_CONTAINER_multipeermap_get (preference_peers,
- id)))
- {
- return defvalues.f_rel;
- }
- return rp->f_rel;
-}
-
-
-void
-GAS_preference_client_disconnect (struct GNUNET_SERVICE_Client *client)
-{
- struct PreferenceClient *c_cur;
-
- for (c_cur = pc_head; NULL != c_cur; c_cur = c_cur->next)
- if (client == c_cur->client)
- break;
- if (NULL == c_cur)
- return;
- GNUNET_CONTAINER_DLL_remove (pc_head,
- pc_tail,
- c_cur);
- GNUNET_CONTAINER_multipeermap_iterate (c_cur->peer2pref,
- &free_preference,
- c_cur);
- GNUNET_CONTAINER_multipeermap_destroy (c_cur->peer2pref);
- GNUNET_free (c_cur);
-}
-
-
-/* end of gnunet-service-ats_preferences.c */
diff --git a/src/ats/gnunet-service-ats_preferences.h
b/src/ats/gnunet-service-ats_preferences.h
deleted file mode 100644
index 49bf2ddbd..000000000
--- a/src/ats/gnunet-service-ats_preferences.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011-2014 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/gnunet-service-ats_preferences.h
- * @brief manage preferences expressed by clients
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_ATS_PREFERENCES_H
-#define GNUNET_SERVICE_ATS_PREFERENCES_H
-
-#include "gnunet_util_lib.h"
-#include "gnunet_ats_service.h"
-#include "gnunet-service-ats.h"
-#include "gnunet_statistics_service.h"
-#include "ats.h"
-
-/**
- * Default preference value we assume if we know nothing.
- */
-#define DEFAULT_ABS_PREFERENCE 0.0
-
-/**
- * Default relative preference value we assume if we know nothing.
- */
-#define DEFAULT_REL_PREFERENCE 0.0
-
-
-/**
- * Handle 'preference change' messages from clients.
- *
- * @param client the client that sent the request
- * @param msg the request message
- */
-void
-GAS_handle_preference_change (struct GNUNET_SERVICE_Client *client,
- const struct ChangePreferenceMessage *msg);
-
-
-/**
- * Initialize preferences subsystem.
- */
-void
-GAS_preference_init (void);
-
-
-/**
- * Shutdown preferences subsystem.
- */
-void
-GAS_preference_done (void);
-
-
-/**
- * Get the normalized preference values for a specific peer.
- *
- * @param cls ignored
- * @param id the peer
- * @return pointer to the values, can be indexed
- * with `enum GNUNET_ATS_PreferenceKind`, never NULL
- */
-const double *
-GAS_preference_get_by_peer (void *cls,
- const struct GNUNET_PeerIdentity *id);
-
-
-/**
- * A performance client disconnected
- *
- * @param client the disconnecting client
- */
-void
-GAS_preference_client_disconnect (struct GNUNET_SERVICE_Client *client);
-
-
-#endif
diff --git a/src/ats/gnunet-service-ats_reservations.c
b/src/ats/gnunet-service-ats_reservations.c
deleted file mode 100644
index 471a19859..000000000
--- a/src/ats/gnunet-service-ats_reservations.c
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/gnunet-service-ats_reservations.c
- * @brief ats service, inbound bandwidth reservation management
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet-service-ats_reservations.h"
-#include "gnunet-service-ats.h"
-#include "ats.h"
-
-/**
- * Number of seconds that available bandwidth carries over
- * (can accumulate). Note that the
- * test_ats_reservation_api test depends on this value!
- */
-#define MAX_BANDWIDTH_CARRY_S 5
-
-
-/**
- * Map of peer identities to `struct GNUNET_BANDWIDTH_Tracker *`s
- */
-static struct GNUNET_CONTAINER_MultiPeerMap *trackers;
-
-
-/**
- * Reserve the given amount of incoming bandwidth (in bytes) from the
- * given peer. If a reservation is not possible right now, return how
- * long the client should wait before trying again.
- *
- * @param peer peer to reserve bandwidth from
- * @param amount number of bytes to reserve
- * @return 0 if the reservation was successful, FOREVER if the
- * peer is not connected, otherwise the time to wait
- * until the reservation might succeed
- */
-static struct GNUNET_TIME_Relative
-reservations_reserve (const struct GNUNET_PeerIdentity *peer,
- int32_t amount)
-{
- struct GNUNET_BANDWIDTH_Tracker *tracker;
- struct GNUNET_TIME_Relative ret;
-
- tracker = GNUNET_CONTAINER_multipeermap_get (trackers,
- peer);
- if (NULL == tracker)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Not connected, allowing reservation of %d bytes\n",
- (int) amount);
- return GNUNET_TIME_UNIT_ZERO; /* not connected, satisfy now */
- }
- if (amount >= 0)
- {
- ret = GNUNET_BANDWIDTH_tracker_get_delay (tracker, amount);
- if (ret.rel_value_us > 0)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Delay to satisfy reservation for %d bytes is %s\n",
- (int) amount,
- GNUNET_STRINGS_relative_time_to_string (ret,
- GNUNET_YES));
- return ret;
- }
- }
- (void) GNUNET_BANDWIDTH_tracker_consume (tracker, amount);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Reserved %d bytes\n",
- (int) amount);
- return GNUNET_TIME_UNIT_ZERO;
-}
-
-
-/**
- * Set the amount of bandwidth the other peer could currently transmit
- * to us (as far as we know) to the given value.
- *
- * @param peer identity of the peer
- * @param bandwidth_in currently available bandwidth from that peer to
- * this peer (estimate)
- */
-void
-GAS_reservations_set_bandwidth (const struct GNUNET_PeerIdentity *peer,
- struct GNUNET_BANDWIDTH_Value32NBO
bandwidth_in)
-{
- struct GNUNET_BANDWIDTH_Tracker *tracker;
-
- tracker = GNUNET_CONTAINER_multipeermap_get (trackers, peer);
- if (0 == ntohl (bandwidth_in.value__))
- {
- if (NULL == tracker)
- return;
- GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove (trackers,
- peer,
- tracker));
- GNUNET_free (tracker);
- return;
- }
- if (NULL == tracker)
- {
- tracker = GNUNET_new (struct GNUNET_BANDWIDTH_Tracker);
- GNUNET_BANDWIDTH_tracker_init (tracker,
- NULL,
- NULL,
- bandwidth_in,
- MAX_BANDWIDTH_CARRY_S);
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_put (trackers,
- peer,
- tracker,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
- return;
- }
- GNUNET_BANDWIDTH_tracker_update_quota (tracker,
- bandwidth_in);
-}
-
-
-void
-GAS_handle_reservation_request (struct GNUNET_SERVICE_Client *client,
- const struct ReservationRequestMessage *msg)
-{
- struct GNUNET_MQ_Envelope *env;
- struct ReservationResultMessage *result;
- int32_t amount;
- struct GNUNET_TIME_Relative res_delay;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received RESERVATION_REQUEST message\n");
- amount = (int32_t) ntohl (msg->amount);
- res_delay = reservations_reserve (&msg->peer, amount);
- if (res_delay.rel_value_us > 0)
- amount = 0;
- env = GNUNET_MQ_msg (result,
- GNUNET_MESSAGE_TYPE_ATS_RESERVATION_RESULT);
- result->amount = htonl (amount);
- result->peer = msg->peer;
- result->res_delay = GNUNET_TIME_relative_hton (res_delay);
- GNUNET_STATISTICS_update (GSA_stats,
- "# reservation requests processed",
- 1,
- GNUNET_NO);
- GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client),
- env);
-}
-
-
-/**
- * Initialize reservations subsystem.
- */
-void
-GAS_reservations_init ()
-{
- trackers = GNUNET_CONTAINER_multipeermap_create (128,
- GNUNET_NO);
-}
-
-
-/**
- * Free memory of bandwidth tracker.
- *
- * @param cls NULL
- * @param key peer identity (unused)
- * @param value the `struct GNUNET_BANDWIDTH_Tracker` to free
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-free_tracker (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct GNUNET_BANDWIDTH_Tracker *tracker = value;
-
- GNUNET_free (tracker);
- return GNUNET_OK;
-}
-
-
-/**
- * Shutdown reservations subsystem.
- */
-void
-GAS_reservations_done ()
-{
- GNUNET_CONTAINER_multipeermap_iterate (trackers,
- &free_tracker,
- NULL);
- GNUNET_CONTAINER_multipeermap_destroy (trackers);
-}
-
-
-/* end of gnunet-service-ats_reservations.c */
diff --git a/src/ats/gnunet-service-ats_reservations.h
b/src/ats/gnunet-service-ats_reservations.h
deleted file mode 100644
index 07edd69e0..000000000
--- a/src/ats/gnunet-service-ats_reservations.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file ats/gnunet-service-ats_reservations.h
- * @brief ats service, inbound bandwidth reservation management
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_ATS_RESERVATIONS_H
-#define GNUNET_SERVICE_ATS_RESERVATIONS_H
-
-#include "gnunet_util_lib.h"
-#include "ats.h"
-
-
-/**
- * Set the amount of bandwidth the other peer could currently transmit
- * to us (as far as we know) to the given value.
- *
- * @param peer identity of the peer
- * @param bandwidth_in currently available bandwidth from that peer to
- * this peer (estimate)
- */
-void
-GAS_reservations_set_bandwidth (const struct GNUNET_PeerIdentity *peer,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_in);
-
-
-/**
- * Handle 'reservation request' messages from clients.
- *
- * @param client client that sent the request
- * @param message the request message
- */
-void
-GAS_handle_reservation_request (struct GNUNET_SERVICE_Client *client,
- const struct
- ReservationRequestMessage *message);
-
-
-/**
- * Initialize reservations subsystem.
- */
-void
-GAS_reservations_init (void);
-
-
-/**
- * Shutdown reservations subsystem.
- */
-void
-GAS_reservations_done (void);
-
-#endif
diff --git a/src/ats/gnunet-service-ats_scheduling.c
b/src/ats/gnunet-service-ats_scheduling.c
deleted file mode 100644
index 2dfb70343..000000000
--- a/src/ats/gnunet-service-ats_scheduling.c
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011-2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file ats/gnunet-service-ats_scheduling.c
- * @brief ats service, interaction with 'scheduling' API
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet-service-ats_addresses.h"
-#include "gnunet-service-ats_scheduling.h"
-#include "ats.h"
-
-/**
- * Actual handle to the client.
- */
-static struct GNUNET_SERVICE_Client *my_client;
-
-
-/**
- * Register a new scheduling client.
- *
- * @param client handle of the new client
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
- */
-int
-GAS_scheduling_add_client (struct GNUNET_SERVICE_Client *client)
-{
- if (NULL != my_client)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "This ATS already has a scheduling client, refusing new
scheduling client for now.\n");
- return GNUNET_SYSERR;
- }
- my_client = client;
- return GNUNET_OK;
-}
-
-
-/**
- * Unregister a client (which may have been a scheduling client,
- * but this is not assured).
- *
- * @param client handle of the (now dead) client
- */
-void
-GAS_scheduling_remove_client (struct GNUNET_SERVICE_Client *client)
-{
- if (my_client != client)
- return;
- GAS_addresses_destroy_all ();
- my_client = NULL;
-}
-
-
-void
-GAS_scheduling_transmit_address_suggestion (const struct
- GNUNET_PeerIdentity *peer,
- uint32_t session_id,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_out,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_in)
-{
- struct GNUNET_MQ_Envelope *env;
- struct AddressSuggestionMessage *msg;
-
- if (NULL == my_client)
- return;
- GNUNET_STATISTICS_update (GSA_stats,
- "# address suggestions made",
- 1,
- GNUNET_NO);
- env = GNUNET_MQ_msg (msg,
- GNUNET_MESSAGE_TYPE_ATS_ADDRESS_SUGGESTION);
- msg->peer = *peer;
- msg->session_id = htonl (session_id);
- msg->bandwidth_out = bandwidth_out;
- msg->bandwidth_in = bandwidth_in;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "ATS sends quota for peer `%s': (in/out) %u/%u\n",
- GNUNET_i2s (peer),
- (unsigned int) ntohl (bandwidth_in.value__),
- (unsigned int) ntohl (bandwidth_out.value__));
- GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (my_client),
- env);
-}
-
-
-void
-GAS_handle_address_add (const struct AddressAddMessage *m)
-{
- const char *address;
- const char *plugin_name;
- uint16_t address_length;
- uint16_t plugin_name_length;
- struct GNUNET_ATS_Properties prop;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received `%s' message\n",
- "ADDRESS_ADD");
- address_length = ntohs (m->address_length);
- plugin_name_length = ntohs (m->plugin_name_length);
- address = (const char *) &m[1];
- if (plugin_name_length != 0)
- plugin_name = &address[address_length];
- else
- plugin_name = "";
- GNUNET_STATISTICS_update (GSA_stats,
- "# addresses created",
- 1,
- GNUNET_NO);
- GNUNET_ATS_properties_ntoh (&prop,
- &m->properties);
- GNUNET_break (GNUNET_NT_UNSPECIFIED != prop.scope);
- GAS_addresses_add (&m->peer,
- plugin_name,
- address,
- address_length,
- ntohl (m->address_local_info),
- ntohl (m->session_id),
- &prop);
-}
-
-
-/**
- * Handle 'address update' messages from clients.
- *
- * @param m the request message
- */
-void
-GAS_handle_address_update (const struct AddressUpdateMessage *m)
-{
- struct GNUNET_ATS_Properties prop;
-
- GNUNET_STATISTICS_update (GSA_stats,
- "# address updates received",
- 1,
- GNUNET_NO);
- GNUNET_ATS_properties_ntoh (&prop,
- &m->properties);
- GAS_addresses_update (&m->peer,
- ntohl (m->session_id),
- &prop);
-}
-
-
-/**
- * Handle 'address destroyed' messages from clients.
- *
- * @param m the request message
- */
-void
-GAS_handle_address_destroyed (const struct AddressDestroyedMessage *m)
-{
- struct GNUNET_MQ_Envelope *env;
- struct GNUNET_ATS_SessionReleaseMessage *srm;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received `%s' message\n",
- "ADDRESS_DESTROYED");
- GNUNET_STATISTICS_update (GSA_stats,
- "# addresses destroyed",
- 1,
- GNUNET_NO);
- GAS_addresses_destroy (&m->peer,
- ntohl (m->session_id));
- env = GNUNET_MQ_msg (srm,
- GNUNET_MESSAGE_TYPE_ATS_SESSION_RELEASE);
- srm->session_id = m->session_id;
- srm->peer = m->peer;
- GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (my_client),
- env);
-}
-
-
-/* end of gnunet-service-ats_scheduling.c */
diff --git a/src/ats/gnunet-service-ats_scheduling.h
b/src/ats/gnunet-service-ats_scheduling.h
deleted file mode 100644
index ca6c1bd57..000000000
--- a/src/ats/gnunet-service-ats_scheduling.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file ats/gnunet-service-ats_scheduling.h
- * @brief ats service, interaction with 'scheduling' API
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_ATS_SCHEDULING_H
-#define GNUNET_SERVICE_ATS_SCHEDULING_H
-
-#include "gnunet_util_lib.h"
-
-
-/**
- * Register a new scheduling client.
- *
- * @param client handle of the new client
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
- */
-int
-GAS_scheduling_add_client (struct GNUNET_SERVICE_Client *client);
-
-
-/**
- * Unregister a client (which may have been a scheduling client,
- * but this is not assured).
- *
- * @param client handle of the (now dead) client
- */
-void
-GAS_scheduling_remove_client (struct GNUNET_SERVICE_Client *client);
-
-
-/**
- * Transmit the given address suggestion and bandwidth update to all scheduling
- * clients.
- *
- * @param peer peer for which this is an address suggestion
- * @param session_id session ID to use for the given client
- * @param bandwidth_out assigned outbound bandwidth
- * @param bandwidth_in assigned inbound bandwidth
- */
-void
-GAS_scheduling_transmit_address_suggestion (const struct
- GNUNET_PeerIdentity *peer,
- uint32_t session_id,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_out,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_in);
-
-
-/**
- * Handle 'address add' messages from clients.
- *
- * @param m the request message
- */
-void
-GAS_handle_address_add (const struct AddressAddMessage *m);
-
-
-/**
- * Handle 'address update' messages from clients.
- *
- * @param m the request message
- */
-void
-GAS_handle_address_update (const struct AddressUpdateMessage *m);
-
-
-/**
- * Handle 'address destroyed' messages from clients.
- *
- * @param m the request message
- */
-void
-GAS_handle_address_destroyed (const struct AddressDestroyedMessage *m);
-
-
-#endif
-/* end of gnunet-service-ats_scheduling.h */
diff --git a/src/ats/meson.build b/src/ats/meson.build
deleted file mode 100644
index 4aa4e6972..000000000
--- a/src/ats/meson.build
+++ /dev/null
@@ -1,58 +0,0 @@
-libgnunetats_src = ['ats_api_connectivity.c',
- 'ats_api_scheduling.c',
- 'ats_api_scanner.c',
- 'ats_api_performance.c']
-
-gnunetserviceats_src = ['gnunet-service-ats.c',
- 'gnunet-service-ats_addresses.c',
- 'gnunet-service-ats_connectivity.c',
- 'gnunet-service-ats_normalization.c',
- 'gnunet-service-ats_performance.c',
- 'gnunet-service-ats_plugins.c',
- 'gnunet-service-ats_preferences.c',
- 'gnunet-service-ats_scheduling.c',
- 'gnunet-service-ats_reservations.c']
-
-configure_file(input : 'ats.conf.in',
- output : 'ats.conf',
- configuration : cdata,
- install: true,
- install_dir: pkgcfgdir)
-
-if get_option('monolith')
- foreach p : libgnunetats_src + gnunetserviceats_src
- gnunet_src += 'ats/' + p
- endforeach
- subdir_done()
-endif
-
-libgnunetats = library('gnunetats',
- libgnunetats_src,
- version: '4.0.0',
- soversion: '4',
- dependencies: [libgnunetutil_dep, libgnunethello_dep],
- include_directories: [incdir, configuration_inc],
- install: true,
- install_dir: get_option('libdir'))
-pkg.generate(libgnunetats, url : 'https://www.gnunet.org',
- description : 'Provides API for allocating bandwidth, expressing
preferences for certain peers and accessing allocation information')
-libgnunetats_dep = declare_dependency(link_with : libgnunetats)
-
-shared_module('gnunet_plugin_ats_proportional',
- ['plugin_ats_proportional.c'],
- dependencies: [libgnunetutil_dep,
- libgnunetats_dep,
- libgnunetstatistics_dep,
- libgnunetnt_dep,
- libgnunetstatistics_dep],
- include_directories: [incdir, configuration_inc],
- install: true,
- install_dir: get_option('libdir')/'gnunet')
-
-executable ('gnunet-service-ats',
- gnunetserviceats_src,
- dependencies: [libgnunetats_dep, libgnunetutil_dep,
- libgnunetnt_dep, libgnunetstatistics_dep],
- include_directories: [incdir, configuration_inc],
- install: true,
- install_dir: get_option('libdir') / 'gnunet' / 'libexec')
diff --git a/src/ats/perf_ats_simplistic_bandwidth.conf
b/src/ats/perf_ats_simplistic_bandwidth.conf
deleted file mode 100644
index cec5b36f5..000000000
--- a/src/ats/perf_ats_simplistic_bandwidth.conf
+++ /dev/null
@@ -1,27 +0,0 @@
-[hostlist]
-SERVERS =
-
-[transport-udp]
-BROADCAST = NO
-
-[peerinfo]
-USE_INCLUDED_HELLOS = NO
-
-# Network specific inbound/outbound quotas
-UNSPECIFIED_QUOTA_IN = 128 KiB
-UNSPECIFIED_QUOTA_OUT = 128 KiB
-# LOOPBACK
-LOOPBACK_QUOTA_IN = 128 KiB
-LOOPBACK_QUOTA_OUT = 128 KiB
-# LAN
-LAN_QUOTA_IN = 128 KiB
-LAN_QUOTA_OUT = 128 KiB
-# WAN
-WAN_QUOTA_IN = 128 KiB
-WAN_QUOTA_OUT = 128 KiB
-# WLAN
-WLAN_QUOTA_IN = 128 KiB
-WLAN_QUOTA_OUT = 128 KiB
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = 128 KiB
-BLUETOOTH_QUOTA_OUT = 128 KiB
diff --git a/src/ats/perf_ats_simplistic_delay.conf
b/src/ats/perf_ats_simplistic_delay.conf
deleted file mode 100644
index a5127d25f..000000000
--- a/src/ats/perf_ats_simplistic_delay.conf
+++ /dev/null
@@ -1,8 +0,0 @@
-[hostlist]
-SERVERS =
-
-[transport-udp]
-BROADCAST = NO
-
-[peerinfo]
-USE_INCLUDED_HELLOS = NO
diff --git a/src/ats/perf_ats_solver.c b/src/ats/perf_ats_solver.c
deleted file mode 100644
index 363d0cfc9..000000000
--- a/src/ats/perf_ats_solver.c
+++ /dev/null
@@ -1,1510 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010,2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/perf_ats_solver.c
- * @brief generic performance test for ATS solvers
- * @author Christian Grothoff
- * @author Matthias Wachs
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_statistics_service.h"
-#include "gnunet-service-ats_addresses.h"
-#include "gnunet-service-ats_plugins.h"
-#include "gnunet-service-ats_normalization.h"
-#include "gnunet-service-ats_preferences.h"
-#include "gnunet_ats_service.h"
-#include "gnunet_ats_plugin.h"
-#include "test_ats_api_common.h"
-
-#define DEFAULT_UPDATE_PERCENTAGE 20
-#define DEFAULT_PEERS_START 10
-#define DEFAULT_PEERS_END 10
-#define DEFAULT_ADDRESSES 10
-#define DEFAULT_ATS_COUNT 2
-
-
-/**
- * Handle for statistics.
- */
-struct GNUNET_STATISTICS_Handle *GSA_stats;
-
-/**
- * Handle for ATS address component
- */
-struct PerfHandle
-{
- /**
- * Performance peers
- */
- struct PerfPeer *peers;
-
- /**
- * Solver handle
- */
- struct GNUNET_ATS_SolverFunctions *sf;
-
- /**
- * Statistics stat;
- */
- struct GNUNET_STATISTICS_Handle *stat;
-
- /**
- * A multihashmap to store all addresses
- */
- struct GNUNET_CONTAINER_MultiPeerMap *addresses;
-
- /**
- * Solver functions
- * */
- struct GNUNET_ATS_PluginEnvironment env;
-
- /**
- * Array for results for each iteration with length iterations
- */
- struct Iteration *iterations_results;
-
- /**
- * The current result
- */
- struct Result *current_result;
-
- /**
- * Current number of peers benchmarked
- */
- int current_p;
-
- /**
- * Current number of addresses benchmarked
- */
- int current_a;
-
- /**
- * Solver description as string
- */
- char *ats_string;
-
- /**
- * Configured ATS solver
- */
- int ats_mode;
-
- /**
- * #peers to start benchmarking with
- */
- int N_peers_start;
-
- /**
- * #peers to end benchmarking with
- */
- int N_peers_end;
-
- /**
- * #addresses to benchmarking with
- */
- int N_address;
-
- /**
- * Percentage of peers to update
- */
- int opt_update_percent;
-
- /**
- * Create gnuplot file
- */
- int create_datafile;
-
- /**
- * Measure updates
- */
- int measure_updates;
-
- /**
- * Number of iterations
- */
- int total_iterations;
-
- /**
- * Current iteration
- */
- int current_iteration;
-
- /**
- * Is a bulk operation running?
- */
- int bulk_running;
-
- /**
- * Is a bulk operation running?
- */
- int expecting_solution;
-
- /**
- * Was the problem just updates?
- */
- int performed_update;
-};
-
-/**
- * Data structure to store results for a single iteration
- */
-struct Iteration
-{
- struct Result **results_array;
-
- struct Result **update_results_array;
-};
-
-
-/**
- * Result for a solver calculation
- */
-struct Result
-{
- /**
- * Previous element in the linked list
- */
- struct Result *prev;
-
- /**
- * Next element in the linked list
- */
- struct Result *next;
-
- /**
- * Number of peers this solution included
- */
- int peers;
-
- /**
- * Number of addresses per peer this solution included
- */
- int addresses;
-
- /**
- * Is this an update or a full solution
- */
- int update;
-
- /**
- * Was the solution valid or did the solver fail
- */
- int valid;
-
- /**
- * Result of the solver
- */
- enum GAS_Solver_Additional_Information info;
-
- /**
- * Duration of setting up the problem in the solver
- */
- struct GNUNET_TIME_Relative d_setup_full;
-
- /**
- * Duration of solving the LP problem in the solver
- * MLP solver only
- */
- struct GNUNET_TIME_Relative d_lp_full;
-
- /**
- * Duration of solving the MLP problem in the solver
- * MLP solver only
- */
- struct GNUNET_TIME_Relative d_mlp_full;
-
- /**
- * Duration of solving whole problem in the solver
- */
- struct GNUNET_TIME_Relative d_total_full;
-
- /**
- * Start time of setting up the problem in the solver
- */
- struct GNUNET_TIME_Absolute s_setup;
-
- /**
- * Start time of solving the LP problem in the solver
- * MLP solver only
- */
- struct GNUNET_TIME_Absolute s_lp;
-
- /**
- * Start time of solving the MLP problem in the solver
- * MLP solver only
- */
- struct GNUNET_TIME_Absolute s_mlp;
-
- /**
- * Start time of solving whole problem in the solver
- */
- struct GNUNET_TIME_Absolute s_total;
-
- /**
- * End time of setting up the problem in the solver
- */
- struct GNUNET_TIME_Absolute e_setup;
-
- /**
- * End time of solving the LP problem in the solver
- * MLP solver only
- */
- struct GNUNET_TIME_Absolute e_lp;
-
- /**
- * End time of solving the MLP problem in the solver
- * MLP solver only
- */
- struct GNUNET_TIME_Absolute e_mlp;
-
- /**
- * End time of solving whole problem in the solver
- */
- struct GNUNET_TIME_Absolute e_total;
-};
-
-/**
- * Peer used for the benchmarking
- */
-struct PerfPeer
-{
- /**
- * Peer identitity
- */
- struct GNUNET_PeerIdentity id;
-
- /**
- * Head of linked list of addresses used with this peer
- */
- struct ATS_Address *head;
-
- /**
- * Head of linked list of addresses used with this peer
- */
- struct ATS_Address *tail;
-};
-
-
-/**
- * ATS performance handle
- */
-static struct PerfHandle ph;
-
-/**
- * Return value
- */
-static int ret;
-
-
-/**
- * Do shutdown
- */
-static void
-end_now (int res)
-{
- if (NULL != ph.stat)
- {
- GNUNET_STATISTICS_destroy (ph.stat, GNUNET_NO);
- ph.stat = NULL;
- }
-
- GNUNET_free (ph.peers);
- GNUNET_free (ph.iterations_results);
-
- GAS_normalization_stop ();
- GAS_preference_done ();
- ret = res;
-}
-
-
-/**
- * Create a peer used for benchmarking
- *
- * @param cp the number of the peer
- */
-static void
-perf_create_peer (int cp)
-{
- GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK,
- &ph.peers[cp].id, sizeof(struct
- GNUNET_PeerIdentity));
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Creating peer #%u: %s \n", cp,
- GNUNET_i2s (&ph.peers[cp].id));
-}
-
-
-/**
- * Perform an update for an address
- *
- * @param cur the address to update
- */
-static void
-perf_update_address (struct ATS_Address *cur)
-{
- int r_type;
- int abs_val;
- double rel_val;
-
- r_type = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 2);
- switch (r_type)
- {
- case 0:
- abs_val = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 100);
- rel_val = (100 + (double) abs_val) / 100;
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Updating peer `%s' address %p type %s abs val %u rel val
%.3f\n",
- GNUNET_i2s (&cur->peer), cur,
- "GNUNET_ATS_QUALITY_NET_DELAY",
- abs_val, rel_val);
- ph.sf->s_address_update_property (ph.sf->cls, cur,
- GNUNET_ATS_QUALITY_NET_DELAY,
- abs_val, rel_val);
- break;
-
- case 1:
- abs_val = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 10);
- rel_val = (100 + (double) abs_val) / 100;
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Updating peer `%s' address %p type %s abs val %u rel val
%.3f\n",
- GNUNET_i2s (&cur->peer), cur,
"GNUNET_ATS_QUALITY_NET_DISTANCE",
- abs_val, rel_val);
- ph.sf->s_address_update_property (ph.sf->cls, cur,
- GNUNET_ATS_QUALITY_NET_DISTANCE,
- abs_val, rel_val);
- break;
-
- default:
- break;
- }
-}
-
-
-static void
-bandwidth_changed_cb (void *cls,
- struct ATS_Address *address)
-{
- if ((0 == address->assigned_bw_out) && (0 == address->assigned_bw_in))
- return;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Bandwidth changed addresses %s %p to %u Bps out / %u Bps in\n",
- GNUNET_i2s (&address->peer),
- address,
- address->assigned_bw_out,
- address->assigned_bw_in);
- if (GNUNET_YES == ph.bulk_running)
- GNUNET_break (0);
- return;
-}
-
-
-static const double *
-get_preferences_cb (void *cls, const struct GNUNET_PeerIdentity *id)
-{
- return GAS_preference_get_by_peer (NULL, id);
-}
-
-
-static void
-perf_address_initial_update (void *dead,
- struct GNUNET_CONTAINER_MultiPeerMap *addresses,
- struct ATS_Address *address)
-{
- double delay;
- double distance;
- uint32_t random = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 100);
-
- delay = (100 + (double) random) / 100;
- ph.sf->s_address_update_property (ph.sf->cls,
- address, GNUNET_ATS_QUALITY_NET_DELAY,
- 100, delay);
-
- random = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 100);
- distance = (100 + (double) random) / 100;
-
- ph.sf->s_address_update_property (ph.sf->cls, address,
- GNUNET_ATS_QUALITY_NET_DISTANCE,
- 10, distance);
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Initial update address %p : %.2f %.2f\n",
- address, delay, distance);
-}
-
-
-struct DUA_Ctx
-{
- int r;
- int c_cur_a;
-};
-
-
-static int
-do_update_address (void *cls,
- const struct GNUNET_PeerIdentity *pid,
- void *value)
-{
- struct DUA_Ctx *ctx = cls;
- struct ATS_Address *addr = value;
-
- if (ctx->c_cur_a == ctx->r)
- perf_update_address (addr);
- ctx->c_cur_a++;
- return GNUNET_OK;
-}
-
-
-/**
- * Update a certain percentage of peers
- *
- * @param cp the current number of peers
- * @param ca the current number of addresses
- * @param percentage_peers the percentage of peers to update
- */
-static void
-perf_update_all_addresses (unsigned int cp, unsigned int ca, unsigned int
- percentage_peers)
-{
- int c_peer;
- int c_select;
- int c_cur_p;
- int r;
- int count;
- unsigned int m[cp];
- struct DUA_Ctx dua_ctx;
-
- count = cp * ((double) percentage_peers / 100);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Updating %u of %u peers \n", count, cp);
-
- for (c_peer = 0; c_peer < cp; c_peer++)
- m[c_peer] = 0;
-
- c_select = 0;
-
- while (c_select < count)
- {
- r = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, cp);
- if (0 == m[r])
- {
- m[r] = 1;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Updating peer [%u] \n", r);
- c_select++;
- }
- }
- for (c_cur_p = 0; c_cur_p < cp; c_cur_p++)
- {
- if (1 == m[c_cur_p])
- {
- r = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, ca);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Updating peer [%u] address [%u]\n", c_cur_p, r);
-
- dua_ctx.c_cur_a = 0;
- dua_ctx.r = r;
- GNUNET_CONTAINER_multipeermap_get_multiple (ph.addresses,
- &ph.peers[c_cur_p].id,
- &do_update_address,
- &dua_ctx);
- }
- }
-}
-
-
-/**
- * Create an address for a peer
- *
- * @param cp index of the peer
- * @param ca index of the address
- * @return the address
- */
-static struct ATS_Address *
-perf_create_address (int cp, int ca)
-{
- struct ATS_Address *a;
-
- a = create_address (&ph.peers[cp].id,
- "Test 1", "test 1", strlen ("test 1") + 1, 0);
- GNUNET_CONTAINER_multipeermap_put (ph.addresses, &ph.peers[cp].id, a,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
- return a;
-}
-
-
-/**
- * Information callback for the solver
- *
- * @param op the solver operation
- * @param stat status of the solver operation
- * @param add additional solver information
- */
-static void
-solver_info_cb (void *cls,
- enum GAS_Solver_Operation op,
- enum GAS_Solver_Status stat,
- enum GAS_Solver_Additional_Information add)
-{
- char *add_info;
-
- switch (add)
- {
- case GAS_INFO_NONE:
- add_info = "GAS_INFO_NONE";
- break;
-
- case GAS_INFO_FULL:
- add_info = "GAS_INFO_MLP_FULL";
- break;
-
- case GAS_INFO_UPDATED:
- add_info = "GAS_INFO_MLP_UPDATED";
- break;
-
- case GAS_INFO_PROP_ALL:
- add_info = "GAS_INFO_PROP_ALL";
- break;
-
- case GAS_INFO_PROP_SINGLE:
- add_info = "GAS_INFO_PROP_SINGLE";
- break;
-
- default:
- add_info = "INVALID";
- break;
- }
-
- struct Result *tmp;
- switch (op)
- {
- case GAS_OP_SOLVE_START:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Solver notifies `%s' with result `%s' `%s'\n",
- "GAS_OP_SOLVE_START",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL", add_info);
- if (GNUNET_NO == ph.expecting_solution)
- {
- /* We do not expect a solution at the moment */
- GNUNET_break (0);
- return;
- }
-
- if ((GAS_STAT_SUCCESS == stat) && (NULL == ph.current_result))
- {
- tmp = GNUNET_new (struct Result);
- /* Create new result */
- if ((add == GAS_INFO_UPDATED) || (GNUNET_YES == ph.performed_update))
- {
- ph.current_result = tmp;
- // fprintf (stderr,"UPDATE %u %u\n",ph.current_iteration-1,
ph.current_p);
- ph.iterations_results[ph.current_iteration
- - 1].update_results_array[ph.current_p] = tmp;
- }
- else
- {
- ph.current_result = tmp;
- // fprintf (stderr,"FULL %u %u\n",ph.current_iteration-1,
ph.current_p);
- ph.iterations_results[ph.current_iteration
- - 1].results_array[ph.current_p] = tmp;
- }
-
- ph.current_result->addresses = ph.current_a;
- ph.current_result->peers = ph.current_p;
- ph.current_result->s_total = GNUNET_TIME_absolute_get ();
- ph.current_result->d_total_full = GNUNET_TIME_UNIT_FOREVER_REL;
- ph.current_result->d_setup_full = GNUNET_TIME_UNIT_FOREVER_REL;
- ph.current_result->d_lp_full = GNUNET_TIME_UNIT_FOREVER_REL;
- ph.current_result->d_mlp_full = GNUNET_TIME_UNIT_FOREVER_REL;
- ph.current_result->info = add;
- if ((add == GAS_INFO_UPDATED) || (GNUNET_YES == ph.performed_update))
- {
- ph.current_result->update = GNUNET_YES;
- }
- else
- {
- ph.current_result->update = GNUNET_NO;
- }
- }
- return;
-
- case GAS_OP_SOLVE_STOP:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Solver notifies `%s' with result `%s', `%s'\n",
- "GAS_OP_SOLVE_STOP",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL", add_info);
- if ((GNUNET_NO == ph.expecting_solution) || (NULL == ph.current_result))
- {
- /* We do not expect a solution at the moment */
- GNUNET_break (0);
- return;
- }
-
- if (GAS_STAT_SUCCESS == stat)
- ph.current_result->valid = GNUNET_YES;
- else
- ph.current_result->valid = GNUNET_NO;
-
- if (NULL != ph.current_result)
- {
- /* Finalize result */
- ph.current_result->e_total = GNUNET_TIME_absolute_get ();
- ph.current_result->d_total_full = GNUNET_TIME_absolute_get_difference (
- ph.current_result->s_total, ph.current_result->e_total);
- }
- ph.current_result = NULL;
- return;
-
- case GAS_OP_SOLVE_SETUP_START:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_SETUP_START",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- if ((GNUNET_NO == ph.expecting_solution) || (NULL == ph.current_result))
- {
- GNUNET_break (0);
- return;
- }
-
- if (GAS_STAT_SUCCESS == stat)
- ph.current_result->valid = GNUNET_YES;
- else
- ph.current_result->valid = GNUNET_NO;
-
- ph.current_result->s_setup = GNUNET_TIME_absolute_get ();
- return;
-
- case GAS_OP_SOLVE_SETUP_STOP:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_SETUP_STOP",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- if ((GNUNET_NO == ph.expecting_solution) || (NULL == ph.current_result))
- {
- GNUNET_break (0);
- return;
- }
-
- if (GAS_STAT_SUCCESS == stat)
- ph.current_result->valid = GNUNET_YES;
- else
- ph.current_result->valid = GNUNET_NO;
-
- ph.current_result->e_setup = GNUNET_TIME_absolute_get ();
- ph.current_result->d_setup_full = GNUNET_TIME_absolute_get_difference (
- ph.current_result->s_setup, ph.current_result->e_setup);
- return;
-
- case GAS_OP_SOLVE_MLP_LP_START:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_LP_START",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- if ((GNUNET_NO == ph.expecting_solution) || (NULL == ph.current_result))
- {
- GNUNET_break (0);
- return;
- }
-
- if (GAS_STAT_SUCCESS == stat)
- ph.current_result->valid = GNUNET_YES;
- else
- ph.current_result->valid = GNUNET_NO;
-
- ph.current_result->s_lp = GNUNET_TIME_absolute_get ();
- return;
-
- case GAS_OP_SOLVE_MLP_LP_STOP:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_LP_STOP",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- if ((GNUNET_NO == ph.expecting_solution) || (NULL == ph.current_result))
- {
- GNUNET_break (0);
- return;
- }
-
- if (GAS_STAT_SUCCESS == stat)
- ph.current_result->valid = GNUNET_YES;
- else
- ph.current_result->valid = GNUNET_NO;
-
- ph.current_result->e_lp = GNUNET_TIME_absolute_get ();
- ph.current_result->d_lp_full = GNUNET_TIME_absolute_get_difference (
- ph.current_result->s_lp, ph.current_result->e_lp);
- return;
-
- case GAS_OP_SOLVE_MLP_MLP_START:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_MLP_START",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- if ((GNUNET_NO == ph.expecting_solution) || (NULL == ph.current_result))
- {
- GNUNET_break (0);
- return;
- }
-
- if (GAS_STAT_SUCCESS == stat)
- ph.current_result->valid = GNUNET_YES;
- else
- ph.current_result->valid = GNUNET_NO;
-
- ph.current_result->s_mlp = GNUNET_TIME_absolute_get ();
- return;
-
- case GAS_OP_SOLVE_MLP_MLP_STOP:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_MLP_STOP",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- if ((GNUNET_NO == ph.expecting_solution) || (NULL == ph.current_result))
- {
- GNUNET_break (0);
- return;
- }
-
- if (GAS_STAT_SUCCESS == stat)
- ph.current_result->valid = GNUNET_YES;
- else
- ph.current_result->valid = GNUNET_NO;
-
- ph.current_result->e_mlp = GNUNET_TIME_absolute_get ();
- ph.current_result->d_mlp_full = GNUNET_TIME_absolute_get_difference (
- ph.current_result->s_mlp, ph.current_result->e_mlp);
- return;
-
- case GAS_OP_SOLVE_UPDATE_NOTIFICATION_START:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_UPDATE_NOTIFICATION_START",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- return;
-
- case GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Solver notifies `%s' with result `%s'\n",
- "GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP",
- (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
- if (GAS_STAT_SUCCESS != stat)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Solver `%s' failed to update problem with %u peers and %u
address!\n",
- ph.ats_string, ph.current_p, ph.current_a);
- }
-
- return;
-
- default:
- break;
- }
-}
-
-
-/**
- * Evaluate results for a specific iteration
- *
- * @param iteration the iteration to evaluate
- */
-static void
-evaluate (int iteration)
-{
- struct Result *cur;
- int cp;
-
- for (cp = ph.N_peers_start; cp <= ph.N_peers_end; cp++)
- {
- cur = ph.iterations_results[ph.current_iteration - 1].results_array[cp];
- if (0 == cp)
- continue;
- if (NULL == cur)
- {
- GNUNET_break (0);
- fprintf (stderr,
- "Missing result for %u peers\n", cp);
- continue;
- }
-
-
- if (GNUNET_NO == cur->valid)
- {
- fprintf (stderr,
- "Total time to solve %s for %u peers %u addresses: %s\n",
- (GNUNET_YES == cur->update) ? "updated" : "full",
- cur->peers, cur->addresses, "Failed to solve!");
- continue;
- }
-
-
- if (GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us !=
- cur->d_total_full.rel_value_us)
- {
- fprintf (stderr,
- "Total time to solve %s for %u peers %u addresses: %llu us\n",
- (GNUNET_YES == cur->update) ? "updated" : "full",
- cur->peers, cur->addresses,
- (unsigned long long) cur->d_total_full.rel_value_us);
- }
-
-
- if (GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us !=
- cur->d_setup_full.rel_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Total time to setup %s %u peers %u addresses: %llu us\n",
- (GNUNET_YES == cur->update) ? "updated" : "full",
- cur->peers, cur->addresses,
- (unsigned long long) cur->d_setup_full.rel_value_us);
- }
-
- if (GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us !=
- cur->d_lp_full.rel_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Total time to solve %s LP for %u peers %u addresses: %llu
us\n",
- (GNUNET_YES == cur->update) ? "updated" : "full",
- cur->peers,
- cur->addresses,
- (unsigned long long ) cur->d_lp_full.rel_value_us);
- }
-
- if (GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us !=
- cur->d_mlp_full.rel_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Total time to solve %s MLP for %u peers %u addresses: %llu
us\n",
- (GNUNET_YES == cur->update) ? "updated" : "full",
- cur->peers, cur->addresses,
- (unsigned long long ) cur->d_mlp_full.rel_value_us);
- }
- }
-}
-
-
-static unsigned int
-get_connectivity_cb (void *cls,
- const struct GNUNET_PeerIdentity *peer)
-{
- return GNUNET_CONTAINER_multipeermap_contains (ph.addresses,
- peer);
-}
-
-
-/**
- * Evaluate average results for all iterations
- */
-static void
-write_all_iterations (void)
-{
- int c_iteration;
- int c_peer;
-
- struct GNUNET_DISK_FileHandle *f_full;
- struct GNUNET_DISK_FileHandle *f_update;
- char *data_fn_full;
- char *data_fn_update;
- char *data;
-
- f_full = NULL;
- f_update = NULL;
-
- data_fn_full = NULL;
-
- if (GNUNET_NO == ph.create_datafile)
- return;
-
- GNUNET_asprintf (&data_fn_full,
- "perf_%s_full_%u-%u_%u_%u.data",
- ph.ats_string,
- ph.total_iterations,
- ph.N_peers_start,
- ph.N_peers_end,
- ph.N_address);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Using data file `%s'\n",
- data_fn_full);
-
- f_full = GNUNET_DISK_file_open (data_fn_full,
- GNUNET_DISK_OPEN_WRITE
- | GNUNET_DISK_OPEN_CREATE,
- GNUNET_DISK_PERM_USER_EXEC
- | GNUNET_DISK_PERM_USER_READ
- | GNUNET_DISK_PERM_USER_WRITE);
- if (NULL == f_full)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Cannot open data file `%s'\n",
- data_fn_full);
- GNUNET_free (data_fn_full);
- return;
- }
-
- data =
- "#peers;addresses;time total in us;#time setup in us;#time lp in us;#time
mlp in us;\n";
- if (GNUNET_SYSERR == GNUNET_DISK_file_write (f_full, data, strlen (data)))
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Cannot write data to log file `%s'\n",
- data_fn_full);
-
- data_fn_update = NULL;
- if (GNUNET_YES == ph.measure_updates)
- {
- GNUNET_asprintf (&data_fn_update, "perf_%s_update_%u-%u_%u_%u.data",
- ph.ats_string,
- ph.total_iterations,
- ph.N_peers_start,
- ph.N_peers_end,
- ph.N_address);
- f_update = GNUNET_DISK_file_open (data_fn_update,
- GNUNET_DISK_OPEN_WRITE
- | GNUNET_DISK_OPEN_CREATE,
- GNUNET_DISK_PERM_USER_EXEC
- | GNUNET_DISK_PERM_USER_READ
- | GNUNET_DISK_PERM_USER_WRITE);
- if (NULL == f_update)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Cannot open gnuplot file `%s'\n", data_fn_update);
- GNUNET_free (data_fn_update);
- if (NULL != f_full)
- GNUNET_DISK_file_close (f_full);
- GNUNET_free (data_fn_full);
- return;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Using update data file `%s'\n",
- data_fn_update);
-
- data =
- "#peers;addresses;time total in us;#time setup in us;#time lp in
us;#time mlp in us;\n";
- if (GNUNET_SYSERR == GNUNET_DISK_file_write (f_update, data, strlen
(data)))
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Cannot write data to log file `%s'\n",
- data_fn_update);
- }
-
- for (c_peer = ph.N_peers_start; c_peer <= ph.N_peers_end; c_peer++)
- {
- char *data_str;
- char *data_tmp;
- char *data_upd_str;
- char *data_upd_tmp;
- GNUNET_asprintf (&data_str, "%u;%u", c_peer, ph.N_address);
- if (ph.measure_updates)
- GNUNET_asprintf (&data_upd_str, "%u;%u", c_peer, ph.N_address);
- for (c_iteration = 0; c_iteration < ph.total_iterations; c_iteration++)
- {
- struct Result *cur_full_res;
- struct Result *cur_upd_res;
-
-
- // fprintf (stderr, "P: %u I: %u == %p \n", c_peer, c_iteration,
cur_res);
- cur_full_res = ph.iterations_results[c_iteration].results_array[c_peer];
- if (c_peer == 0)
- continue;
- if (NULL == cur_full_res)
- continue;
-
- if (ph.measure_updates)
- {
- cur_upd_res =
- ph.iterations_results[c_iteration].update_results_array[c_peer];
- data_upd_tmp = GNUNET_strdup (data_upd_str);
- GNUNET_free (data_upd_str);
- if (GNUNET_YES == cur_full_res->valid)
- {
- GNUNET_asprintf (&data_upd_str, "%s;%llu", data_upd_tmp,
- (NULL == cur_upd_res) ? 0 :
- cur_upd_res->d_total_full.rel_value_us);
- }
- else
- {
- GNUNET_asprintf (&data_upd_str, "%s;", data_upd_tmp);
- }
- GNUNET_free (data_upd_tmp);
- }
-
- // fprintf (stderr, "P: %u I: %u: P %i A %i\n", c_peer, c_iteration,
cur_res->peers, cur_res->addresses);
- // fprintf (stderr, "D total: %llu\n", (long long unsigned int)
cur_res->d_total.rel_value_us);
-
- data_tmp = GNUNET_strdup (data_str);
- GNUNET_free (data_str);
- if (GNUNET_YES == cur_full_res->valid)
- {
- GNUNET_asprintf (&data_str, "%s;%llu", data_tmp,
- cur_full_res->d_total_full.rel_value_us);
- }
- else
- {
- GNUNET_asprintf (&data_str, "%s;", data_tmp);
- }
-
- GNUNET_free (data_tmp);
- }
- data_tmp = GNUNET_strdup (data_str);
- GNUNET_free (data_str);
- GNUNET_asprintf (&data_str, "%s\n", data_tmp);
- GNUNET_free (data_tmp);
-
- fprintf (stderr, "Result full solution: %s\n", data_str);
- if (GNUNET_SYSERR == GNUNET_DISK_file_write (f_full, data_str, strlen (
- data_str)))
- GNUNET_break (0);
- GNUNET_free (data_str);
-
- if (ph.measure_updates)
- {
- data_upd_tmp = GNUNET_strdup (data_upd_str);
- GNUNET_free (data_upd_str);
- GNUNET_asprintf (&data_upd_str, "%s\n", data_upd_tmp);
- GNUNET_free (data_upd_tmp);
-
- fprintf (stderr, "Result updated solution: `%s'\n", data_upd_str);
- if (GNUNET_SYSERR == GNUNET_DISK_file_write (f_update, data_upd_str,
- strlen (data_upd_str)))
- GNUNET_break (0);
- GNUNET_free (data_upd_str);
- }
- }
-
- if ((NULL != f_full) && (GNUNET_SYSERR == GNUNET_DISK_file_close (f_full)))
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cannot close log file `%s'\n",
- data_fn_full);
- GNUNET_free (data_fn_full);
-
- if ((NULL != f_update) && (GNUNET_SYSERR == GNUNET_DISK_file_close (
- f_update)))
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cannot close log file `%s'\n",
- data_fn_update);
- GNUNET_free (data_fn_update);
-}
-
-
-static int
-do_delete_address (void *cls,
- const struct GNUNET_PeerIdentity *pid,
- void *value)
-{
- struct ATS_Address *cur = value;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Deleting addresses for peer %u\n",
- pid);
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_remove (ph.addresses,
- pid,
- cur));
- ph.sf->s_del (ph.sf->cls, cur);
- GNUNET_free (cur->atsi);
- GNUNET_free (cur);
- return GNUNET_OK;
-}
-
-
-/**
- * Run a performance iteration
- */
-static void
-perf_run_iteration (void)
-{
- int cp;
- int ca;
- int count_p = ph.N_peers_end;
- int count_a = ph.N_address;
- struct ATS_Address *cur_addr;
- uint32_t net;
-
- ph.iterations_results[ph.current_iteration - 1].results_array =
- GNUNET_malloc ((count_p + 1) * sizeof(struct Result *));
- if (ph.measure_updates)
- ph.iterations_results[ph.current_iteration - 1].update_results_array =
- GNUNET_malloc ((count_p + 1) * sizeof(struct Result *));
- ph.peers = GNUNET_malloc ((count_p) * sizeof(struct PerfPeer));
- for (cp = 0; cp < count_p; cp++)
- perf_create_peer (cp);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Iteration %u of %u, added %u peers\n", ph.current_iteration,
- ph.total_iterations, cp);
-
- for (cp = 0; cp < count_p; cp++)
- {
- fprintf (stderr, "%u..", cp);
- if (GNUNET_NO == ph.bulk_running)
- {
- ph.bulk_running = GNUNET_YES;
- ph.sf->s_bulk_start (ph.sf->cls);
- }
- ph.current_p = cp + 1;
- for (ca = 0; ca < count_a; ca++)
- {
- cur_addr = perf_create_address (cp, ca);
- /* Add address */
-
- /* Random network selection */
- // net = 1 + GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK,
GNUNET_NT_COUNT - 1);
- /* Random equally distributed network selection */
- net = 1 + (ca % (GNUNET_NT_COUNT - 1));
- /* fprintf (stderr, "Network: %u `%s'\n",
- * mod_net , GNUNET_NT_to_string(mod_net)); */
-
- cur_addr->atsi = GNUNET_new (struct GNUNET_ATS_Information);
- cur_addr->atsi_count = 1;
- cur_addr->atsi[0].type = htonl (GNUNET_ATS_NETWORK_TYPE);
- cur_addr->atsi[0].value = htonl (net);
- ph.sf->s_add (ph.sf->cls, cur_addr, net);
-
- ph.current_a = ca + 1;
- perf_address_initial_update (NULL, ph.addresses, cur_addr);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Adding address for peer %u address %u in network %s\n", cp,
- ca,
- GNUNET_NT_to_string (net));
- }
- /* Notify solver about request */
- ph.sf->s_get (ph.sf->cls, &ph.peers[cp].id);
-
- if (cp + 1 >= ph.N_peers_start)
- {
- /* Disable bulk to solve the problem */
- if (GNUNET_YES == ph.bulk_running)
- {
- ph.expecting_solution = GNUNET_YES;
- ph.bulk_running = GNUNET_NO;
- ph.sf->s_bulk_stop (ph.sf->cls);
- }
- else
- GNUNET_break (0);
-
- /* Problem is solved by the solver here due to unlocking */
- ph.expecting_solution = GNUNET_NO;
-
- /* Update the problem */
- if ((0 < ph.opt_update_percent) && (GNUNET_YES == ph.measure_updates))
- {
- /* Update */
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Updating problem with %u peers and %u addresses\n", cp +
1,
- ca);
-
- ph.expecting_solution = GNUNET_YES;
- ph.performed_update = GNUNET_YES;
- if (GNUNET_NO == ph.bulk_running)
- {
- ph.bulk_running = GNUNET_YES;
- ph.sf->s_bulk_start (ph.sf->cls);
- }
- perf_update_all_addresses (cp + 1, ca, ph.opt_update_percent);
- ph.bulk_running = GNUNET_NO;
- ph.sf->s_bulk_stop (ph.sf->cls);
- /* Problem is solved by the solver here due to unlocking */
- ph.performed_update = GNUNET_NO;
- ph.expecting_solution = GNUNET_NO;
- }
- GNUNET_assert (GNUNET_NO == ph.bulk_running);
- }
- }
- fprintf (stderr, "\n");
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Done, cleaning up addresses\n");
- if (GNUNET_NO == ph.bulk_running)
- {
- ph.sf->s_bulk_start (ph.sf->cls);
- ph.bulk_running = GNUNET_YES;
- }
-
- for (cp = 0; cp < count_p; cp++)
- {
- GNUNET_CONTAINER_multipeermap_get_multiple (ph.addresses,
- &ph.peers[cp].id,
- &do_delete_address,
- NULL);
- }
- if (GNUNET_NO == ph.bulk_running)
- {
- ph.sf->s_bulk_stop (ph.sf->cls);
- ph.bulk_running = GNUNET_NO;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Iteration done\n");
- GNUNET_free (ph.peers);
-}
-
-
-static void
-run (void *cls, char *const *args, const char *cfgfile,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- GNUNET_log_setup ("perf-ats-solver", "WARNING", NULL);
- char *sep;
- char *src_filename = GNUNET_strdup (__FILE__);
- char *test_filename = cls;
- char *solver;
- char *plugin;
- struct GNUNET_CONFIGURATION_Handle *solver_cfg;
- unsigned long long quotas_in[GNUNET_NT_COUNT];
- unsigned long long quotas_out[GNUNET_NT_COUNT];
- int c;
- int c2;
-
- /* Extract test name */
- if (NULL == (sep = (strstr (src_filename, ".c"))))
- {
- GNUNET_free (src_filename);
- GNUNET_break (0);
- ret = 1;
- return;
- }
- sep[0] = '\0';
-
- if (NULL != (sep = strstr (test_filename, ".exe")))
- sep[0] = '\0';
-
- if (NULL == (solver = strstr (test_filename, src_filename)))
- {
- GNUNET_free (src_filename);
- GNUNET_break (0);
- ret = 1;
- return;
- }
- solver += strlen (src_filename) + 1;
-
- if (0 == strcmp (solver, "proportional"))
- {
- ph.ats_string = "proportional";
- }
- else if (0 == strcmp (solver, "mlp"))
- {
- ph.ats_string = "mlp";
- }
- else if ((0 == strcmp (solver, "ril")))
- {
- ph.ats_string = "ril";
- }
- else
- {
- GNUNET_free (src_filename);
- GNUNET_break (0);
- ret = 1;
- return;
- }
- GNUNET_free (src_filename);
-
- /* Calculate peers */
- if ((0 == ph.N_peers_start) && (0 == ph.N_peers_end))
- {
- ph.N_peers_start = DEFAULT_PEERS_START;
- ph.N_peers_end = DEFAULT_PEERS_END;
- }
- if (0 == ph.N_address)
- ph.N_address = DEFAULT_ADDRESSES;
-
-
- if (ph.N_peers_start != ph.N_peers_end)
- fprintf (stderr,
- "Benchmarking solver `%s' with %u to %u peers and %u addresses in
%u iterations\n",
- ph.ats_string, ph.N_peers_start, ph.N_peers_end, ph.N_address,
- ph.total_iterations);
- else
- fprintf (stderr,
- "Benchmarking solver `%s' with %u peers and %u addresses in %u
iterations\n",
- ph.ats_string, ph.N_peers_end, ph.N_address, ph.total_iterations);
-
- if (0 == ph.opt_update_percent)
- ph.opt_update_percent = DEFAULT_UPDATE_PERCENTAGE;
-
- /* Load quotas */
- solver_cfg = GNUNET_CONFIGURATION_create ();
- if ((NULL == solver_cfg) || (GNUNET_SYSERR == (GNUNET_CONFIGURATION_load (
- solver_cfg,
- "perf_ats_solver.conf"))))
- {
- GNUNET_break (0);
- end_now (1);
- return;
- }
- if (GNUNET_NT_COUNT != load_quotas (solver_cfg,
- quotas_out, quotas_in, GNUNET_NT_COUNT))
- {
- GNUNET_break (0);
- end_now (1);
- return;
- }
-
- /* Create array of DLL to store results for iterations */
- ph.iterations_results = GNUNET_malloc (sizeof(struct Iteration)
- * ph.total_iterations);
-
- /* Load solver */
- ph.env.cfg = solver_cfg;
- ph.stat = GNUNET_STATISTICS_create ("ats", cfg);
- ph.env.stats = ph.stat;
- ph.addresses = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_NO);
- ph.env.addresses = ph.addresses;
- ph.env.bandwidth_changed_cb = bandwidth_changed_cb;
- ph.env.get_connectivity = &get_connectivity_cb;
- ph.env.get_preferences = &get_preferences_cb;
- ph.env.network_count = GNUNET_NT_COUNT;
- ph.env.info_cb = &solver_info_cb;
-
- for (c = 0; c < GNUNET_NT_COUNT; c++)
- {
- ph.env.out_quota[c] = quotas_out[c];
- ph.env.in_quota[c] = quotas_in[c];
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Loading network quotas: `%s' %llu %llu \n",
- GNUNET_NT_to_string (c),
- ph.env.out_quota[c],
- ph.env.in_quota[c]);
- }
- GAS_normalization_start ();
- GAS_preference_init ();
-
- GNUNET_asprintf (&plugin,
- "libgnunet_plugin_ats_%s",
- ph.ats_string);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ ("Initializing solver `%s'\n"),
- ph.ats_string);
- if (NULL == (ph.sf = GNUNET_PLUGIN_load (plugin, &ph.env)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to initialize solver `%s'!\n"),
- plugin);
- ret = 1;
- return;
- }
-
- /* Do the benchmark */
- for (ph.current_iteration = 1; ph.current_iteration <= ph.total_iterations;
- ph.current_iteration++)
- {
- fprintf (stderr,
- "Iteration %u of %u starting\n",
- ph.current_iteration,
- ph.total_iterations);
- perf_run_iteration ();
- evaluate (ph.current_iteration);
- fprintf (stderr,
- "Iteration %u of %u done\n",
- ph.current_iteration,
- ph.total_iterations);
- }
- if (ph.create_datafile)
- write_all_iterations ();
-
- /* Unload solver*/
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ ("Unloading solver `%s'\n"),
- ph.ats_string);
- GNUNET_PLUGIN_unload (plugin, ph.sf);
- ph.sf = NULL;
- GNUNET_free (plugin);
- for (c = 0; c < ph.total_iterations; c++)
- {
- for (c2 = ph.N_peers_start; c2 < ph.N_peers_end; c2++)
- {
- if (0 == c2)
- continue;
- if (ph.measure_updates)
- GNUNET_free (
- ph.iterations_results[c].update_results_array[c2]);
- GNUNET_free (ph.iterations_results[c].results_array[c2]);
- }
- if (ph.measure_updates)
- GNUNET_free (ph.iterations_results[c].update_results_array);
- GNUNET_free (ph.iterations_results[c].results_array);
- }
- GNUNET_free (ph.iterations_results);
-
- GNUNET_CONFIGURATION_destroy (solver_cfg);
- GNUNET_STATISTICS_destroy (ph.stat, GNUNET_NO);
-}
-
-
-/**
- * Main function of the benchmark
- *
- * @param argc argument count
- * @param argv argument values
- */
-int
-main (int argc, char *argv[])
-{
- /* extract command line arguments */
- ph.opt_update_percent = 0;
- ph.N_peers_start = 0;
- ph.N_peers_end = 0;
- ph.N_address = 0;
- ph.ats_string = NULL;
- ph.create_datafile = GNUNET_NO;
- ph.measure_updates = GNUNET_NO;
- ph.total_iterations = 1;
-
- static struct GNUNET_GETOPT_CommandLineOption options[] = {
- GNUNET_GETOPT_option_uint ('a',
- "addresses",
- gettext_noop ("addresses to use"),
- &ph.N_address),
-
- GNUNET_GETOPT_option_uint ('s',
- "start",
- gettext_noop ("start with peer"),
- &ph.N_peers_start),
-
- GNUNET_GETOPT_option_uint ('e',
- "end",
- gettext_noop ("end with peer"),
- &ph.N_peers_end),
-
- GNUNET_GETOPT_option_uint ('i',
- "iterations",
- gettext_noop (
- "number of iterations used for averaging
(default: 1)"),
- &ph.total_iterations),
-
- GNUNET_GETOPT_option_uint ('p',
- "percentage",
- gettext_noop (
- "update a fix percentage of addresses"),
- &ph.opt_update_percent),
-
- GNUNET_GETOPT_option_flag ('d',
- "data",
- gettext_noop ("create data file"),
- &ph.create_datafile),
-
- GNUNET_GETOPT_option_flag ('u',
- "update",
- gettext_noop ("measure updates"),
- &ph.measure_updates),
-
- GNUNET_GETOPT_OPTION_END
- };
-
- GNUNET_PROGRAM_run (argc, argv, argv[0], NULL, options, &run, argv[0]);
- return ret;
-}
-
-
-/* end of file perf_ats_solver.c */
diff --git a/src/ats/perf_ats_solver.conf b/src/ats/perf_ats_solver.conf
deleted file mode 100644
index a535891df..000000000
--- a/src/ats/perf_ats_solver.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-[ats]
-# Network specific inbound/outbound quotas
-UNSPECIFIED_QUOTA_IN = 1000000
-UNSPECIFIED_QUOTA_OUT = 1000000
-# LOOPBACK
-LOOPBACK_QUOTA_IN = 10000000
-LOOPBACK_QUOTA_OUT = 10000000
-# LAN
-LAN_QUOTA_IN = 10000000
-LAN_QUOTA_OUT = 10000000
-# WAN
-WAN_QUOTA_IN = 10000000
-WAN_QUOTA_OUT = 10000000
-# WLAN
-WLAN_QUOTA_IN = 10000000
-WLAN_QUOTA_OUT = 10000000
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = 10000000
-BLUETOOTH_QUOTA_OUT = 10000000
-
-# Proportional specific settings
-# How proportional to preferences is bandwidth distribution in a network
-# 1: Fair with respect to addresses without preferences
-# > 10: The bigger, the more respect is paid to preferences
-PROP_PROPORTIONALITY_FACTOR = 2.00
-# Should we stick to existing connections are prefer to switch?
-# [10...200], lower value prefers to switch, bigger value is more tolerant
-PROP_STABILITY_FACTOR = 1.25
diff --git a/src/ats/perf_ats_solver_proportional.conf
b/src/ats/perf_ats_solver_proportional.conf
deleted file mode 100644
index e69de29bb..000000000
diff --git a/src/ats/plugin_ats_proportional.c
b/src/ats/plugin_ats_proportional.c
deleted file mode 100644
index d3062a5c0..000000000
--- a/src/ats/plugin_ats_proportional.c
+++ /dev/null
@@ -1,1243 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2011-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/plugin_ats_proportional.c
- * @brief ATS proportional solver
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_statistics_service.h"
-#include "gnunet_ats_service.h"
-#include "gnunet_ats_plugin.h"
-#include "gnunet-service-ats_addresses.h"
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "ats-proportional", __VA_ARGS__)
-
-/**
- * How much do we value stability over adaptation by default. A low
- * value (close to 1.0) means we adapt as soon as possible, a larger
- * value means that we have to have the respective factor of an
- * advantage (or delay) before we adapt and sacrifice stability.
- */
-#define PROP_STABILITY_FACTOR 1.25
-
-
-/**
- * Default value to assume for the proportionality factor, if none is
- * given in the configuration. This factor determines how strong the
- * bandwidth allocation will orient itself on the application
- * preferences. A lower factor means a more balanced bandwidth
- * distribution while a larger number means a distribution more in
- * line with application (bandwidth) preferences.
- */
-#define PROPORTIONALITY_FACTOR 2.0
-
-
-/**
- * Address information stored for the proportional solver in the
- * `solver_information` member of `struct GNUNET_ATS_Address`.
- *
- * They are also stored in the respective `struct Network`'s linked
- * list.
- */
-struct AddressWrapper
-{
- /**
- * Next in DLL
- */
- struct AddressWrapper *next;
-
- /**
- * Previous in DLL
- */
- struct AddressWrapper *prev;
-
- /**
- * The address
- */
- struct ATS_Address *addr;
-
- /**
- * Network scope this address is in
- */
- struct Network *network;
-
- /**
- * Inbound quota
- */
- uint32_t calculated_quota_in;
-
- /**
- * Outbound quota
- */
- uint32_t calculated_quota_out;
-
- /**
- * When was this address activated
- */
- struct GNUNET_TIME_Absolute activated;
-};
-
-
-/**
- * Representation of a network
- */
-struct Network
-{
- /**
- * Network description
- */
- const char *desc;
-
- /**
- * String for statistics total addresses
- */
- char *stat_total;
-
- /**
- * String for statistics active addresses
- */
- char *stat_active;
-
- /**
- * Linked list of addresses in this network: head
- */
- struct AddressWrapper *head;
-
- /**
- * Linked list of addresses in this network: tail
- */
- struct AddressWrapper *tail;
-
- /**
- * Total inbound quota
- */
- unsigned long long total_quota_in;
-
- /**
- * Total outbound quota
- */
- unsigned long long total_quota_out;
-
- /**
- * ATS network type
- */
- enum GNUNET_NetworkType type;
-
- /**
- * Number of active addresses for this network
- */
- unsigned int active_addresses;
-
- /**
- * Number of total addresses for this network
- */
- unsigned int total_addresses;
-};
-
-
-/**
- * A handle for the proportional solver
- */
-struct GAS_PROPORTIONAL_Handle
-{
- /**
- * Our execution environment.
- */
- struct GNUNET_ATS_PluginEnvironment *env;
-
- /**
- * Networks array
- */
- struct Network *network_entries;
-
- /**
- * Proportionality factor
- */
- double prop_factor;
-
- /**
- * Stability factor
- */
- double stability_factor;
-
- /**
- * Bulk lock counter. If zero, we are not locked.
- */
- unsigned int bulk_lock;
-
- /**
- * Number of changes made while solver was locked. We really only
- * use 0/non-zero to check on unlock if we have to run the update.
- */
- unsigned int bulk_requests;
-
- /**
- * Number of active addresses for solver
- */
- unsigned int active_addresses;
-};
-
-
-/**
- * Test if bandwidth is available in this network to add an additional address.
- *
- * @param net the network type to check
- * @param extra for how many extra addresses do we check?
- * @return #GNUNET_YES or #GNUNET_NO
- */
-static int
-is_bandwidth_available_in_network (struct Network *net,
- int extra)
-{
- unsigned int na;
- uint32_t min_bw = ntohl (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__);
-
- GNUNET_assert (((int) net->active_addresses) + extra >= 0);
- na = net->active_addresses + extra;
- if (0 == na)
- return GNUNET_YES;
- if (((net->total_quota_in / na) > min_bw) &&
- ((net->total_quota_out / na) > min_bw))
- return GNUNET_YES;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "No bandwidth available in network\n");
- return GNUNET_NO;
-}
-
-
-/**
- * Test if all peers in this network require connectivity at level at
- * least @a con.
- *
- * @param s the solver handle
- * @param net the network type to check
- * @param con connection return value threshold to check
- * @return #GNUNET_YES or #GNUNET_NO
- */
-static int
-all_require_connectivity (struct GAS_PROPORTIONAL_Handle *s,
- struct Network *net,
- unsigned int con)
-{
- struct AddressWrapper *aw;
-
- for (aw = net->head; NULL != aw; aw = aw->next)
- if (con >
- s->env->get_connectivity (s->env->cls,
- &aw->addr->peer))
- return GNUNET_NO;
- return GNUNET_YES;
-}
-
-
-/**
- * Update bandwidth assigned to peers in this network. The basic idea
- * is to assign every peer in the network the minimum bandwidth, and
- * then distribute the remaining bandwidth proportional to application
- * preferences.
- *
- * @param s the solver handle
- * @param net the network type to update
- */
-static void
-distribute_bandwidth (struct GAS_PROPORTIONAL_Handle *s,
- struct Network *net)
-{
- const uint32_t min_bw = ntohl (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT.value__);
- struct AddressWrapper *aw;
- unsigned long long remaining_quota_in;
- unsigned long long quota_out_used;
- unsigned long long remaining_quota_out;
- unsigned long long quota_in_used;
- unsigned int count_addresses;
- double sum_relative_peer_prefences;
- double peer_weight;
- double total_weight;
- const double *peer_relative_prefs;
-
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Recalculate quota for network type `%s' for %u addresses (in/out):
%llu/%llu \n",
- net->desc,
- net->active_addresses,
- net->total_quota_in,
- net->total_quota_in);
-
- if (0 == net->active_addresses)
- return; /* no addresses to update */
-
- /* sanity checks */
- if ((net->active_addresses * min_bw) > net->total_quota_in)
- {
- GNUNET_break (0);
- return;
- }
- if ((net->active_addresses * min_bw) > net->total_quota_out)
- {
- GNUNET_break (0);
- return;
- }
-
- /* Calculate sum of relative preference for active addresses in this
- network */
- sum_relative_peer_prefences = 0.0;
- count_addresses = 0;
- for (aw = net->head; NULL != aw; aw = aw->next)
- {
- if (GNUNET_YES != aw->addr->active)
- continue;
- peer_relative_prefs = s->env->get_preferences (s->env->cls,
- &aw->addr->peer);
- sum_relative_peer_prefences
- += peer_relative_prefs[GNUNET_ATS_PREFERENCE_BANDWIDTH];
- count_addresses++;
- }
- if (count_addresses != net->active_addresses)
- {
- GNUNET_break (0);
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "%s: Counted %u active addresses, expected %u active addresses\n",
- net->desc,
- count_addresses,
- net->active_addresses);
- /* try to fix... */
- net->active_addresses = count_addresses;
- }
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Total relative preference %.3f for %u addresses in network %s\n",
- sum_relative_peer_prefences,
- net->active_addresses,
- net->desc);
-
- /* check how much we have to distribute */
- remaining_quota_in = net->total_quota_in - (net->active_addresses * min_bw);
- remaining_quota_out = net->total_quota_out - (net->active_addresses *
min_bw);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Proportionally distributable bandwidth (in/out): %llu/%llu\n",
- remaining_quota_in,
- remaining_quota_out);
-
- /* distribute remaining quota; we do not do it exactly proportional,
- but balance "even" distribution ("net->active_addresses") with
- the preference sum using the "prop_factor". */
- total_weight = net->active_addresses
- + s->prop_factor * sum_relative_peer_prefences;
- quota_out_used = 0;
- quota_in_used = 0;
- for (aw = net->head; NULL != aw; aw = aw->next)
- {
- if (GNUNET_YES != aw->addr->active)
- {
- /* set to 0, just to be sure */
- aw->calculated_quota_in = 0;
- aw->calculated_quota_out = 0;
- continue;
- }
- peer_relative_prefs = s->env->get_preferences (s->env->cls,
- &aw->addr->peer);
- peer_weight = 1.0
- + s->prop_factor
- * peer_relative_prefs[GNUNET_ATS_PREFERENCE_BANDWIDTH];
-
- aw->calculated_quota_in = min_bw
- + (peer_weight / total_weight)
- * remaining_quota_in;
- aw->calculated_quota_out = min_bw
- + (peer_weight / total_weight)
- * remaining_quota_out;
-
- LOG (GNUNET_ERROR_TYPE_INFO,
- "New quotas for peer `%s' with weight (cur/total) %.3f/%.3f (in/out)
are: %u/%u\n",
- GNUNET_i2s (&aw->addr->peer),
- peer_weight,
- total_weight,
- (unsigned int) aw->calculated_quota_in,
- (unsigned int) aw->calculated_quota_out);
- quota_in_used += aw->calculated_quota_in;
- quota_out_used += aw->calculated_quota_out;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Total bandwidth assigned is (in/out): %llu /%llu\n",
- quota_in_used,
- quota_out_used);
- /* +1 due to possible rounding errors */
- GNUNET_break (quota_out_used <= net->total_quota_out + 1);
- GNUNET_break (quota_in_used <= net->total_quota_in + 1);
-}
-
-
-/**
- * Notify ATS service of bandwidth changes to addresses.
- *
- * @param s solver handle
- * @param net the network to propagate changes in
- */
-static void
-propagate_bandwidth (struct GAS_PROPORTIONAL_Handle *s,
- struct Network *net)
-{
- struct AddressWrapper *cur;
-
- for (cur = net->head; NULL != cur; cur = cur->next)
- {
- if ((cur->addr->assigned_bw_in == cur->calculated_quota_in) &&
- (cur->addr->assigned_bw_out == cur->calculated_quota_out))
- continue;
- cur->addr->assigned_bw_in = cur->calculated_quota_in;
- cur->addr->assigned_bw_out = cur->calculated_quota_out;
- if (GNUNET_YES == cur->addr->active)
- s->env->bandwidth_changed_cb (s->env->cls,
- cur->addr);
- }
-}
-
-
-/**
- * Distribute bandwidth. The addresses have already been selected,
- * this is merely distributed the bandwidth among the addresses.
- *
- * @param s the solver handle
- * @param n the network, can be NULL for all networks
- */
-static void
-distribute_bandwidth_in_network (struct GAS_PROPORTIONAL_Handle *s,
- struct Network *n)
-{
- unsigned int i;
-
- if (0 != s->bulk_lock)
- {
- s->bulk_requests++;
- return;
- }
- if (NULL != n)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Redistributing bandwidth in network %s with %u active and %u total
addresses\n",
- GNUNET_NT_to_string (n->type),
- n->active_addresses,
- n->total_addresses);
- s->env->info_cb (s->env->cls,
- GAS_OP_SOLVE_START,
- GAS_STAT_SUCCESS,
- GAS_INFO_PROP_SINGLE);
- distribute_bandwidth (s,
- n);
- s->env->info_cb (s->env->cls,
- GAS_OP_SOLVE_STOP,
- GAS_STAT_SUCCESS,
- GAS_INFO_PROP_SINGLE);
- s->env->info_cb (s->env->cls,
- GAS_OP_SOLVE_UPDATE_NOTIFICATION_START,
- GAS_STAT_SUCCESS,
- GAS_INFO_PROP_SINGLE);
- propagate_bandwidth (s,
- n);
-
- s->env->info_cb (s->env->cls,
- GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP,
- GAS_STAT_SUCCESS,
- GAS_INFO_PROP_SINGLE);
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Redistributing bandwidth in all %u networks\n",
- s->env->network_count);
- s->env->info_cb (s->env->cls,
- GAS_OP_SOLVE_START,
- GAS_STAT_SUCCESS,
- GAS_INFO_PROP_ALL);
- for (i = 0; i < s->env->network_count; i++)
- distribute_bandwidth (s,
- &s->network_entries[i]);
- s->env->info_cb (s->env->cls,
- GAS_OP_SOLVE_STOP,
- GAS_STAT_SUCCESS,
- GAS_INFO_PROP_ALL);
- s->env->info_cb (s->env->cls,
- GAS_OP_SOLVE_UPDATE_NOTIFICATION_START,
- GAS_STAT_SUCCESS,
- GAS_INFO_PROP_ALL);
- for (i = 0; i < s->env->network_count; i++)
- propagate_bandwidth (s,
- &s->network_entries[i]);
- s->env->info_cb (s->env->cls,
- GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP,
- GAS_STAT_SUCCESS,
- GAS_INFO_PROP_ALL);
- }
-}
-
-
-/**
- * Context for finding the best address* Linked list of addresses in this
network: head
- */
-struct FindBestAddressCtx
-{
- /**
- * The solver handle
- */
- struct GAS_PROPORTIONAL_Handle *s;
-
- /**
- * The currently best address
- */
- struct ATS_Address *best;
-};
-
-
-/**
- * Find a "good" address to use for a peer by iterating over the
- * addresses for this peer. If we already have an existing address,
- * we stick to it. Otherwise, we pick by lowest distance and then by
- * lowest latency.
- *
- * @param cls the `struct FindBestAddressCtx *' where we store the result
- * @param key the peer we are trying to find the best address for
- * @param value another `struct ATS_Address*` to consider using
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-find_best_address_it (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct FindBestAddressCtx *ctx = cls;
- struct ATS_Address *current = value;
- struct AddressWrapper *asi = current->solver_information;
- struct GNUNET_TIME_Relative active_time;
- double best_delay;
- double best_distance;
- double cur_delay;
- double cur_distance;
- unsigned int con;
- int bw_available;
- int need;
-
- /* we need +1 slot if 'current' is not yet active */
- need = (GNUNET_YES == current->active) ? 0 : 1;
- /* we save -1 slot if 'best' is active and belongs
- to the same network (as we would replace it) */
- if ((NULL != ctx->best) &&
- (GNUNET_YES == ctx->best->active) &&
- (((struct AddressWrapper *) ctx->best->solver_information)->network ==
- asi->network))
- need--;
- /* we can gain -1 slot if this peers connectivity
- requirement is higher than that of another peer
- in that network scope */
- con = ctx->s->env->get_connectivity (ctx->s->env->cls,
- key);
- if (GNUNET_YES !=
- all_require_connectivity (ctx->s,
- asi->network,
- con))
- need--;
- /* test if minimum bandwidth for 'current' would be available */
- bw_available
- = is_bandwidth_available_in_network (asi->network,
- need);
- if (! bw_available)
- {
- /* Bandwidth for this address is unavailable, so we cannot use
- it. */
- return GNUNET_OK;
- }
- if (GNUNET_YES == current->active)
- {
- active_time = GNUNET_TIME_absolute_get_duration (asi->activated);
- if (active_time.rel_value_us <=
- ((double) GNUNET_TIME_UNIT_SECONDS.rel_value_us)
- * ctx->s->stability_factor)
- {
- /* Keep active address for stability reasons */
- ctx->best = current;
- return GNUNET_NO;
- }
- }
- if (NULL == ctx->best)
- {
- /* We so far have nothing else, so go with it! */
- ctx->best = current;
- return GNUNET_OK;
- }
-
- /* Now compare ATS information */
- cur_distance = current->norm_distance.norm;
- best_distance = ctx->best->norm_distance.norm;
- cur_delay = current->norm_delay.norm;
- best_delay = ctx->best->norm_delay.norm;
-
- /* user shorter distance */
- if (cur_distance < best_distance)
- {
- if (GNUNET_NO == ctx->best->active)
- {
- /* Activity doesn't influence the equation, use current */
- ctx->best = current;
- }
- else if ((best_distance / cur_distance) > ctx->s->stability_factor)
- {
- /* Distance change is significant, switch active address! */
- ctx->best = current;
- }
- }
-
- /* User connection with less delay */
- if (cur_delay < best_delay)
- {
- if (GNUNET_NO == ctx->best->active)
- {
- /* Activity doesn't influence the equation, use current */
- ctx->best = current;
- }
- else if ((best_delay / cur_delay) > ctx->s->stability_factor)
- {
- /* Latency change is significant, switch active address! */
- ctx->best = current;
- }
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Find the currently best address for a peer from the set of
- * addresses available or return NULL of no address is available.
- *
- * @param s the proportional handle
- * @param addresses the address hashmap
- * @param id the peer id
- * @return the address or NULL
- */
-struct ATS_Address *
-get_best_address (struct GAS_PROPORTIONAL_Handle *s,
- struct GNUNET_CONTAINER_MultiPeerMap *addresses,
- const struct GNUNET_PeerIdentity *id)
-{
- struct FindBestAddressCtx fba_ctx;
-
- fba_ctx.best = NULL;
- fba_ctx.s = s;
- GNUNET_CONTAINER_multipeermap_get_multiple (addresses,
- id,
- &find_best_address_it,
- &fba_ctx);
- return fba_ctx.best;
-}
-
-
-/**
- * Decrease number of active addresses in network.
- *
- * @param s the solver handle
- * @param net the network type
- */
-static void
-address_decrement_active (struct GAS_PROPORTIONAL_Handle *s,
- struct Network *net)
-{
- GNUNET_assert (net->active_addresses > 0);
- net->active_addresses--;
- GNUNET_STATISTICS_update (s->env->stats,
- net->stat_active,
- -1,
- GNUNET_NO);
- GNUNET_assert (s->active_addresses > 0);
- s->active_addresses--;
- GNUNET_STATISTICS_update (s->env->stats,
- "# ATS addresses total",
- -1,
- GNUNET_NO);
-}
-
-
-/**
- * Address map iterator to find current active address for peer.
- * Asserts that only one address is active per peer.
- *
- * @param cls last active address
- * @param key peer's key
- * @param value address to check
- * @return #GNUNET_NO on double active address else #GNUNET_YES;
- */
-static int
-get_active_address_it (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct ATS_Address **dest = cls;
- struct ATS_Address *aa = value;
-
- if (GNUNET_YES != aa->active)
- return GNUNET_OK;
- GNUNET_assert (NULL == (*dest));
- (*dest) = aa;
- return GNUNET_OK;
-}
-
-
-/**
- * Find current active address for peer
- *
- * @param s the solver handle
- * @param peer the peer
- * @return active address or NULL
- */
-static struct ATS_Address *
-get_active_address (struct GAS_PROPORTIONAL_Handle *s,
- const struct GNUNET_PeerIdentity *peer)
-{
- struct ATS_Address *dest;
-
- dest = NULL;
- GNUNET_CONTAINER_multipeermap_get_multiple (s->env->addresses,
- peer,
- &get_active_address_it,
- &dest);
- return dest;
-}
-
-
-/**
- * Update active address for a peer. Check if active address exists
- * and what the best address is, if addresses are different switch.
- * Then reallocate bandwidth within the affected network scopes.
- *
- * @param s solver handle
- * @param current_address the address currently active for the peer,
- * NULL for none
- * @param peer the peer to check
- */
-static void
-update_active_address (struct GAS_PROPORTIONAL_Handle *s,
- struct ATS_Address *current_address,
- const struct GNUNET_PeerIdentity *peer)
-{
- struct ATS_Address *best_address;
- struct AddressWrapper *asi_cur;
- struct AddressWrapper *asi_best;
- struct AddressWrapper *aw;
- struct AddressWrapper *aw_min;
- unsigned int a_con;
- unsigned int con_min;
-
- best_address = get_best_address (s,
- s->env->addresses,
- peer);
- if (NULL != best_address)
- asi_best = best_address->solver_information;
- else
- asi_best = NULL;
- if (current_address == best_address)
- return; /* no changes */
- if (NULL != current_address)
- {
- /* We switch to a new address (or to none);
- mark old address as inactive. */
- asi_cur = current_address->solver_information;
- GNUNET_assert (GNUNET_YES == current_address->active);
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Disabling previous active address for peer `%s'\n",
- GNUNET_i2s (peer));
- asi_cur->activated = GNUNET_TIME_UNIT_ZERO_ABS;
- current_address->active = GNUNET_NO;
- current_address->assigned_bw_in = 0;
- current_address->assigned_bw_out = 0;
- address_decrement_active (s,
- asi_cur->network);
- if ((NULL == best_address) ||
- (asi_best->network != asi_cur->network))
- distribute_bandwidth_in_network (s,
- asi_cur->network);
- if (NULL == best_address)
- {
- /* We previously had an active address, but now we cannot
- * suggest one. Therefore we have to disconnect the peer.
- * The above call to "distribute_bandwidth_in_network()
- * does not see 'current_address' so we need to trigger
- * the update here. */LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Disconnecting peer `%s'.\n",
- GNUNET_i2s (peer));
- s->env->bandwidth_changed_cb (s->env->cls,
- current_address);
- return;
- }
- }
- if (NULL == best_address)
- {
- /* We do not have a new address, so we are done. */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Cannot suggest address for peer `%s'\n",
- GNUNET_i2s (peer));
- return;
- }
- /* We do have a new address, activate it */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Selecting new address %p for peer `%s'\n",
- best_address,
- GNUNET_i2s (peer));
- /* Mark address as active */
- best_address->active = GNUNET_YES;
- asi_best->activated = GNUNET_TIME_absolute_get ();
- asi_best->network->active_addresses++;
- s->active_addresses++;
- GNUNET_STATISTICS_update (s->env->stats,
- "# ATS active addresses total",
- 1,
- GNUNET_NO);
- GNUNET_STATISTICS_update (s->env->stats,
- asi_best->network->stat_active,
- 1,
- GNUNET_NO);
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Address %p for peer `%s' is now active\n",
- best_address,
- GNUNET_i2s (peer));
-
- if (GNUNET_NO ==
- is_bandwidth_available_in_network (asi_best->network,
- 0))
- {
- /* we went over the maximum number of addresses for
- this scope; remove the address with the smallest
- connectivity requirement */
- con_min = UINT32_MAX;
- aw_min = NULL;
- for (aw = asi_best->network->head; NULL != aw; aw = aw->next)
- {
- if ((con_min >
- (a_con = s->env->get_connectivity (s->env->cls,
- &aw->addr->peer))) &&
- (GNUNET_YES == aw->addr->active))
- {
- aw_min = aw;
- con_min = a_con;
- if (0 == con_min)
- break;
- }
- }
- update_active_address (s,
- aw_min->addr,
- &aw_min->addr->peer);
- }
- distribute_bandwidth_in_network (s,
- asi_best->network);
-}
-
-
-/**
- * The preferences for a peer in the problem changed.
- *
- * @param solver the solver handle
- * @param peer the peer to change the preference for
- * @param kind the kind to change the preference
- * @param pref_rel the normalized preference value for this kind over all
clients
- */
-static void
-GAS_proportional_change_preference (void *solver,
- const struct GNUNET_PeerIdentity *peer,
- enum GNUNET_ATS_PreferenceKind kind,
- double pref_rel)
-{
- struct GAS_PROPORTIONAL_Handle *s = solver;
-
- if (GNUNET_ATS_PREFERENCE_BANDWIDTH != kind)
- return; /* we do not care */
- distribute_bandwidth_in_network (s,
- NULL);
-}
-
-
-/**
- * Get application feedback for a peer
- *
- * @param solver the solver handle
- * @param application the application
- * @param peer the peer to change the preference for
- * @param scope the time interval for this feedback: [now - scope .. now]
- * @param kind the kind to change the preference
- * @param score the score
- */
-static void
-GAS_proportional_feedback (void *solver,
- struct GNUNET_SERVICE_Client *application,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_TIME_Relative scope,
- enum GNUNET_ATS_PreferenceKind kind,
- double score)
-{
- /* Proportional does not care about feedback */
-}
-
-
-/**
- * Get the preferred address for a specific peer
- *
- * @param solver the solver handle
- * @param peer the identity of the peer
- */
-static void
-GAS_proportional_start_get_address (void *solver,
- const struct GNUNET_PeerIdentity *peer)
-{
- struct GAS_PROPORTIONAL_Handle *s = solver;
-
- update_active_address (s,
- get_active_address (s,
- peer),
- peer);
-}
-
-
-/**
- * Stop notifying about address and bandwidth changes for this peer
- *
- * @param solver the solver handle
- * @param peer the peer
- */
-static void
-GAS_proportional_stop_get_address (void *solver,
- const struct GNUNET_PeerIdentity *peer)
-{
- struct GAS_PROPORTIONAL_Handle *s = solver;
- struct ATS_Address *cur;
- struct AddressWrapper *asi;
-
- cur = get_active_address (s,
- peer);
- if (NULL == cur)
- return;
- asi = cur->solver_information;
- distribute_bandwidth_in_network (s,
- asi->network);
-}
-
-
-/**
- * Start a bulk operation
- *
- * @param solver the solver
- */
-static void
-GAS_proportional_bulk_start (void *solver)
-{
- struct GAS_PROPORTIONAL_Handle *s = solver;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Locking solver for bulk operation ...\n");
- GNUNET_assert (NULL != solver);
- s->bulk_lock++;
-}
-
-
-/**
- * Bulk operation done.
- *
- * @param solver our `struct GAS_PROPORTIONAL_Handle *`
- */
-static void
-GAS_proportional_bulk_stop (void *solver)
-{
- struct GAS_PROPORTIONAL_Handle *s = solver;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Unlocking solver from bulk operation ...\n");
- if (s->bulk_lock < 1)
- {
- GNUNET_break (0);
- return;
- }
- s->bulk_lock--;
- if ((0 == s->bulk_lock) &&
- (0 < s->bulk_requests))
- {
- LOG (GNUNET_ERROR_TYPE_INFO,
- "No lock pending, recalculating\n");
- distribute_bandwidth_in_network (s,
- NULL);
- s->bulk_requests = 0;
- }
-}
-
-
-/**
- * Transport properties for this address have changed
- *
- * @param solver solver handle
- * @param address the address
- */
-static void
-GAS_proportional_address_property_changed (void *solver,
- struct ATS_Address *address)
-{
- struct GAS_PROPORTIONAL_Handle *s = solver;
- struct AddressWrapper *asi = address->solver_information;
-
- distribute_bandwidth_in_network (s,
- asi->network);
-}
-
-
-/**
- * Add a new single address to a network
- *
- * @param solver the solver Handle
- * @param address the address to add
- * @param network network type of this address
- */
-static void
-GAS_proportional_address_add (void *solver,
- struct ATS_Address *address,
- uint32_t network)
-{
- struct GAS_PROPORTIONAL_Handle *s = solver;
- struct Network *net;
- struct AddressWrapper *aw;
-
- GNUNET_assert (network < s->env->network_count);
- net = &s->network_entries[network];
- net->total_addresses++;
-
- aw = GNUNET_new (struct AddressWrapper);
- aw->addr = address;
- aw->network = net;
- address->solver_information = aw;
- GNUNET_CONTAINER_DLL_insert (net->head,
- net->tail,
- aw);
- GNUNET_STATISTICS_update (s->env->stats,
- "# ATS addresses total",
- 1,
- GNUNET_NO);
- GNUNET_STATISTICS_update (s->env->stats,
- net->stat_total,
- 1,
- GNUNET_NO);
- update_active_address (s,
- get_active_address (s,
- &address->peer),
- &address->peer);
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Added new address for `%s', now total %u and active %u addresses in
network `%s'\n",
- GNUNET_i2s (&address->peer),
- net->total_addresses,
- net->active_addresses,
- net->desc);
-}
-
-
-/**
- * Remove an address from the solver. To do so, we:
- * - Removed it from specific network
- * - Decrease the number of total addresses
- * - If active:
- * - decrease number of active addresses
- * - update quotas
- *
- * @param solver the solver handle
- * @param address the address to remove
- */
-static void
-GAS_proportional_address_delete (void *solver,
- struct ATS_Address *address)
-{
- struct GAS_PROPORTIONAL_Handle *s = solver;
- struct AddressWrapper *aw = address->solver_information;
- struct Network *net = aw->network;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Deleting %s address for peer `%s' from network `%s' (total: %u/active:
%u)\n",
- (GNUNET_NO == address->active) ? "inactive" : "active",
- GNUNET_i2s (&address->peer),
- net->desc,
- net->total_addresses,
- net->active_addresses);
-
- GNUNET_CONTAINER_DLL_remove (net->head,
- net->tail,
- aw);
- GNUNET_assert (net->total_addresses > 0);
- net->total_addresses--;
- GNUNET_STATISTICS_update (s->env->stats,
- net->stat_total,
- -1,
- GNUNET_NO);
- if (GNUNET_YES == address->active)
- {
- /* Address was active, remove from network and update quotas */
- update_active_address (s,
- address,
- &address->peer);
- distribute_bandwidth_in_network (s, net);
- }
- GNUNET_free (aw);
- address->solver_information = NULL;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "After deleting address now total %u and active %u addresses in network
`%s'\n",
- net->total_addresses,
- net->active_addresses,
- net->desc);
-}
-
-
-/**
- * Function invoked when the plugin is loaded.
- *
- * @param[in,out] cls the `struct GNUNET_ATS_PluginEnvironment *` to use;
- * modified to return the API functions (ugh).
- * @return the `struct GAS_PROPORTIONAL_Handle` to pass as a closure
- */
-void *
-libgnunet_plugin_ats_proportional_init (void *cls)
-{
- static struct GNUNET_ATS_SolverFunctions sf;
- struct GNUNET_ATS_PluginEnvironment *env = cls;
- struct GAS_PROPORTIONAL_Handle *s;
- struct Network *cur;
- float f_tmp;
- unsigned int c;
-
- s = GNUNET_new (struct GAS_PROPORTIONAL_Handle);
- s->env = env;
- sf.cls = s;
- sf.s_add = &GAS_proportional_address_add;
- sf.s_address_update_property = &GAS_proportional_address_property_changed;
- sf.s_get = &GAS_proportional_start_get_address;
- sf.s_get_stop = &GAS_proportional_stop_get_address;
- sf.s_pref = &GAS_proportional_change_preference;
- sf.s_feedback = &GAS_proportional_feedback;
- sf.s_del = &GAS_proportional_address_delete;
- sf.s_bulk_start = &GAS_proportional_bulk_start;
- sf.s_bulk_stop = &GAS_proportional_bulk_stop;
- s->stability_factor = PROP_STABILITY_FACTOR;
- if (GNUNET_SYSERR !=
- GNUNET_CONFIGURATION_get_value_float (env->cfg,
- "ats",
- "PROP_STABILITY_FACTOR",
- &f_tmp))
- {
- if ((f_tmp < 1.0) || (f_tmp > 2.0))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Invalid %s configuration %f \n"),
- "PROP_STABILITY_FACTOR",
- f_tmp);
- }
- else
- {
- s->stability_factor = f_tmp;
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Using %s of %.3f\n",
- "PROP_STABILITY_FACTOR",
- f_tmp);
- }
- }
- s->prop_factor = PROPORTIONALITY_FACTOR;
- if (GNUNET_SYSERR !=
- GNUNET_CONFIGURATION_get_value_float (env->cfg,
- "ats",
- "PROP_PROPORTIONALITY_FACTOR",
- &f_tmp))
- {
- if (f_tmp < 1.0)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Invalid %s configuration %f\n"),
- "PROP_PROPORTIONALITY_FACTOR",
- f_tmp);
- }
- else
- {
- s->prop_factor = f_tmp;
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Using %s of %.3f\n",
- "PROP_PROPORTIONALITY_FACTOR",
- f_tmp);
- }
- }
-
- s->network_entries = GNUNET_malloc (env->network_count
- * sizeof(struct Network));
- for (c = 0; c < env->network_count; c++)
- {
- cur = &s->network_entries[c];
- cur->type = c;
- cur->total_quota_in = env->in_quota[c];
- cur->total_quota_out = env->out_quota[c];
- cur->desc = GNUNET_NT_to_string (c);
- GNUNET_asprintf (&cur->stat_total,
- "# ATS addresses %s total",
- cur->desc);
- GNUNET_asprintf (&cur->stat_active,
- "# ATS active addresses %s total",
- cur->desc);
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Added network %u `%s' (%llu/%llu)\n",
- c,
- cur->desc,
- cur->total_quota_in,
- cur->total_quota_out);
- }
- return &sf;
-}
-
-
-/**
- * Function used to unload the plugin.
- *
- * @param cls return value from #libgnunet_plugin_ats_proportional_init()
- */
-void *
-libgnunet_plugin_ats_proportional_done (void *cls)
-{
- struct GNUNET_ATS_SolverFunctions *sf = cls;
- struct GAS_PROPORTIONAL_Handle *s = sf->cls;
- struct AddressWrapper *cur;
- struct AddressWrapper *next;
- unsigned int c;
-
- for (c = 0; c < s->env->network_count; c++)
- {
- GNUNET_break (0 == s->network_entries[c].total_addresses);
- GNUNET_break (0 == s->network_entries[c].active_addresses);
- next = s->network_entries[c].head;
- while (NULL != (cur = next))
- {
- next = cur->next;
- GNUNET_CONTAINER_DLL_remove (s->network_entries[c].head,
- s->network_entries[c].tail,
- cur);
- GNUNET_free (cur->addr->solver_information);
- GNUNET_free (cur);
- }
- GNUNET_free (s->network_entries[c].stat_total);
- GNUNET_free (s->network_entries[c].stat_active);
- }
- GNUNET_break (0 == s->active_addresses);
- GNUNET_free (s->network_entries);
- GNUNET_free (s);
- return NULL;
-}
-
-
-/* end of plugin_ats_proportional.c */
diff --git a/src/ats/test_ats_api.c b/src/ats/test_ats_api.c
deleted file mode 100644
index 390cafe0f..000000000
--- a/src/ats/test_ats_api.c
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/test_ats_api.c
- * @brief test ATS
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "test_ats_lib.h"
-
-/**
- * Global timeout for the testcase.
- */
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 3)
-
-/**
- * Definition of the test as a sequence of commands.
- */
-static struct Command test_commands[] = {
- {
- .code = CMD_ADD_ADDRESS,
- .label = "add-address-0-0",
- .details.add_address = {
- .pid = 0,
- .addr_num = 0,
- .addr_flags = GNUNET_HELLO_ADDRESS_INFO_NONE,
- .session = 0,
- .properties = {
- .scope = GNUNET_NT_LAN
- }
-
-
- }
-
-
- },
- /* 1: adding same address again should fail */
- {
- .code = CMD_ADD_ADDRESS,
- .label = "add-address-0-0:FAIL",
- .details.add_address = {
- .pid = 0,
- .addr_num = 0,
- .addr_flags = GNUNET_HELLO_ADDRESS_INFO_NONE,
- .session = 0,
- .properties = {
- .scope = GNUNET_NT_LAN
- },
- .expect_fail = 1
- }
-
-
- },
- /* 2: some solver still require explicit start */
- {
- .code = CMD_REQUEST_CONNECTION_START,
- .label = "request-0",
- .details.request_connection_start = {
- .pid = 0
- }
-
-
- },
- /* 3: check we got an address */
- {
- .code = CMD_AWAIT_ADDRESS_SUGGESTION,
- .details.await_address_suggestion = {
- .add_label = "add-address-0-0"
- }
-
-
- },
- /* 4: check monitor also got the address */
- {
- .code = CMD_AWAIT_ADDRESS_INFORMATION,
- .details.await_address_information = {
- .add_label = "add-address-0-0"
- }
-
-
- },
- /* 5: test session API */
- {
- .code = CMD_ADD_SESSION,
- .label = "add-session-0-0-1",
- .details.add_session = {
- .add_label = "add-address-0-0",
- .session = 1
- }
-
-
- },
- {
- .code = CMD_DEL_SESSION,
- .details.del_session = {
- .add_session_label = "add-session-0-0-1",
- }
-
-
- },
- /* 7: test preference API */
- {
- .code = CMD_CHANGE_PREFERENCE,
- .details.change_preference = {
- .pid = 0
- /* FIXME: preference details */
- }
-
-
- },
- {
- .code = CMD_PROVIDE_FEEDBACK,
- .details.provide_feedback = {
- .pid = 0,
- .scope = { 50LL }
- /* FIXME: preference details */
- }
-
-
- },
- /* 9: test sanity check address listing */
- {
- .code = CMD_LIST_ADDRESSES,
- .details.list_addresses = {
- .pid = 0,
- .all = 1,
- .min_calls = 2, // ?
- .max_calls = 2,
- .min_active_calls = 1,
- .max_active_calls = 1
- }
-
-
- },
- /* 10: remove address testing */
- {
- .code = CMD_DEL_ADDRESS,
- .details.del_address = {
- .add_label = "add-address-0-0"
- }
-
-
- },
- /* 11: check we got disconnected */
- {
- .code = CMD_AWAIT_DISCONNECT_SUGGESTION,
- .details.await_disconnect_suggestion = {
- .pid = 0
- }
-
-
- },
- /* 12: just for symmetry, also stop asking for the connection */
- {
- .code = CMD_REQUEST_CONNECTION_STOP,
- .details.request_connection_stop = {
- .connect_label = "request-0",
- }
-
-
- },
- /* 13: add address again */
- {
- .code = CMD_ADD_ADDRESS,
- .label = "add-address-0-0:1",
- .details.add_address = {
- .pid = 0,
- .addr_num = 0,
- .session = 0,
- .properties = {
- .scope = GNUNET_NT_LAN
- }
-
-
- }
-
-
- },
- /* 14: some solver still require explicit start */
- {
- .code = CMD_REQUEST_CONNECTION_START,
- .label = "request-0",
- .details.request_connection_start = {
- .pid = 0
- }
-
-
- },
- /* 15: check we got an address */
- {
- .code = CMD_AWAIT_ADDRESS_SUGGESTION,
- .details.await_address_suggestion = {
- .add_label = "add-address-0-0:1"
- }
-
-
- },
- /* 16: add alternative address */
- {
- .code = CMD_ADD_ADDRESS,
- .label = "add-address-0-1",
- .details.add_address = {
- .pid = 0,
- .addr_num = 1,
- .addr_flags = GNUNET_HELLO_ADDRESS_INFO_NONE,
- .session = 0,
- .properties = {
- .scope = GNUNET_NT_LAN
- }
-
-
- }
-
-
- },
- /* 17: remove original address */
- {
- .code = CMD_DEL_ADDRESS,
- .details.del_address = {
- .add_label = "add-address-0-0:1"
- }
-
-
- },
- /* 18: check we switched to alternative address */
- {
- .code = CMD_AWAIT_ADDRESS_SUGGESTION,
- .details.await_address_suggestion = {
- .add_label = "add-address-0-1"
- }
-
-
- },
- /* 19: remove alternative address */
- {
- .code = CMD_DEL_ADDRESS,
- .details.del_address = {
- .add_label = "add-address-0-1"
- }
-
-
- },
- /* 20: check we got disconnected */
- {
- .code = CMD_AWAIT_DISCONNECT_SUGGESTION,
- .details.await_disconnect_suggestion = {
- .pid = 0
- }
-
-
- },
- /* 21: just for symmetry, also stop asking for the connection */
- {
- .code = CMD_REQUEST_CONNECTION_STOP,
- .details.request_connection_stop = {
- .connect_label = "request-0",
- }
-
-
- },
- /* Test ends successfully */
- {
- .code = CMD_END_PASS
- }
-};
-
-
-int
-main (int argc,
- char *argv[])
-{
- return TEST_ATS_run (argc,
- argv,
- test_commands,
- TIMEOUT);
-}
-
-
-/* end of file test_ats_api.c */
diff --git a/src/ats/test_ats_api.conf b/src/ats/test_ats_api.conf
deleted file mode 100644
index d45e84d18..000000000
--- a/src/ats/test_ats_api.conf
+++ /dev/null
@@ -1,35 +0,0 @@
-@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
-
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-ats-api-scheduling/
-
-[ats]
-# Enable MLP mode (default: NO)
-#MODE = ril
-MODE = mlp
-# Network specific inbound/outbound quotas
-# UNSPECIFIED
-UNSPECIFIED_QUOTA_IN = 64 KiB
-UNSPECIFIED_QUOTA_OUT = 64 KiB
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = 64 KiB
-WAN_QUOTA_OUT = 64 KiB
-# WLAN
-WLAN_QUOTA_IN = 512
-WLAN_QUOTA_OUT = 512
-
-# ATS extended options
-DUMP_MLP = NO
-DUMP_SOLUTION = NO
-DUMP_OVERWRITE = NO
-DUMP_MIN_PEERS = 0
-DUMP_MIN_ADDRS = 0
-DUMP_OVERWRITE = NO
-ATS_MIN_INTERVAL = 15000
-ATS_EXEC_INTERVAL = 30000
diff --git a/src/ats/test_ats_api_delayed.conf
b/src/ats/test_ats_api_delayed.conf
deleted file mode 100644
index 3aac88cf9..000000000
--- a/src/ats/test_ats_api_delayed.conf
+++ /dev/null
@@ -1,36 +0,0 @@
-@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
-
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-ats-api-scheduling/
-
-[ats]
-PREFIX = ./test_delay -t 10 --
-# Enable MLP mode (default: NO)
-#MODE = ril
-MODE = mlp
-# Network specific inbound/outbound quotas
-# UNSPECIFIED
-UNSPECIFIED_QUOTA_IN = 64 KiB
-UNSPECIFIED_QUOTA_OUT = 64 KiB
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = 64 KiB
-WAN_QUOTA_OUT = 64 KiB
-# WLAN
-WLAN_QUOTA_IN = 512
-WLAN_QUOTA_OUT = 512
-
-# ATS extended options
-DUMP_MLP = NO
-DUMP_SOLUTION = NO
-DUMP_OVERWRITE = NO
-DUMP_MIN_PEERS = 0
-DUMP_MIN_ADDRS = 0
-DUMP_OVERWRITE = NO
-ATS_MIN_INTERVAL = 15000
-ATS_EXEC_INTERVAL = 30000
diff --git a/src/ats/test_ats_api_proportional.conf
b/src/ats/test_ats_api_proportional.conf
deleted file mode 100644
index ee8f8f8e7..000000000
--- a/src/ats/test_ats_api_proportional.conf
+++ /dev/null
@@ -1,24 +0,0 @@
-@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
-
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-ats-proportional/
-
-[ats]
-# Enable PROPORTIONAL mode (default: NO)
-MODE = proportional
-# Network specific inbound/outbound quotas
-# UNSPECIFIED
-UNSPECIFIED_QUOTA_IN = unlimited
-UNSPECIFIED_QUOTA_OUT = unlimited
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = 5 MiB
-WAN_QUOTA_OUT = 5 MiB
-# WLAN
-WLAN_QUOTA_IN = 4096
-WLAN_QUOTA_OUT = 4096
diff --git a/src/ats/test_ats_lib.c b/src/ats/test_ats_lib.c
deleted file mode 100644
index d19da0106..000000000
--- a/src/ats/test_ats_lib.c
+++ /dev/null
@@ -1,1107 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/test_ats_lib.c
- * @brief test ATS library with a generic interpreter for running ATS tests
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_ats_service.h"
-#include "gnunet_testing_lib.h"
-#include "test_ats_lib.h"
-
-/**
- * Information about the last address suggestion we got for a peer.
- */
-struct AddressSuggestData
-{
- /**
- * Which session were we given?
- */
- struct GNUNET_ATS_Session *session;
-
- /**
- * What address was assigned?
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * Outbound bandwidth assigned.
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out;
-
- /**
- * Inbound bandwidth assigned.
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in;
-
- /**
- * Was the bandwidth assigned non-zero?
- */
- int active;
-};
-
-
-/**
- * Information about the last address information we got for an address.
- */
-struct AddressInformationData
-{
- /**
- * What address is this data about?
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * Which properties were given?
- */
- struct GNUNET_ATS_Properties properties;
-
- /**
- * Outbound bandwidth reported.
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out;
-
- /**
- * Inbound bandwidth reported.
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in;
-
- /**
- * Was the address said to be 'active'?
- */
- int active;
-};
-
-
-/**
- * Scheduling handle
- */
-static struct GNUNET_ATS_SchedulingHandle *sched_ats;
-
-/**
- * Connectivity handle
- */
-static struct GNUNET_ATS_ConnectivityHandle *con_ats;
-
-/**
- * Performance handle
- */
-static struct GNUNET_ATS_PerformanceHandle *perf_ats;
-
-/**
- * Handle for the interpreter task.
- */
-static struct GNUNET_SCHEDULER_Task *interpreter_task;
-
-/**
- * Map from peer identities to the last address suggestion
- * `struct AddressSuggestData` we got for the respective peer.
- */
-static struct GNUNET_CONTAINER_MultiPeerMap *p2asd;
-
-/**
- * Map from peer identities to the last address information
- * sets for all addresses of this peer. Each peer is mapped
- * to one or more `struct AddressInformationData` entries.
- */
-static struct GNUNET_CONTAINER_MultiPeerMap *p2aid;
-
-/**
- * Global timeout for the test.
- */
-static struct GNUNET_TIME_Relative TIMEOUT;
-
-/**
- * Return value from #main().
- */
-static int ret;
-
-/**
- * Current global command offset into the #commands array.
- */
-static unsigned int off;
-
-/**
- * Commands for the current test.
- */
-static struct Command *test_commands;
-
-
-/**
- * Free `struct AddressSuggestData` entry.
- *
- * @param cls NULL
- * @param key ignored
- * @param value the `struct AddressSuggestData` to release
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-free_asd (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct AddressSuggestData *asd = value;
-
- GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove (p2asd,
- key,
- asd));
- GNUNET_free (asd->address);
- GNUNET_free (asd);
- return GNUNET_OK;
-}
-
-
-/**
- * Free `struct AddressInformationData` entry.
- *
- * @param cls NULL
- * @param key ignored
- * @param value the `struct AddressSuggestData` to release
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-free_aid (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct AddressInformationData *aid = value;
-
- GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove (p2aid,
- key,
- aid));
- GNUNET_free (aid->address);
- GNUNET_free (aid);
- return GNUNET_OK;
-}
-
-
-/**
- * Find latest address suggestion made for the given peer.
- *
- * @param pid peer to look up
- * @return NULL if peer was never involved
- */
-static struct AddressSuggestData *
-find_address_suggestion (const struct GNUNET_PeerIdentity *pid)
-{
- return GNUNET_CONTAINER_multipeermap_get (p2asd,
- pid);
-}
-
-
-/**
- * Closure for #match_address()
- */
-struct MatchAddressContext
-{
- /**
- * Address to find.
- */
- const struct GNUNET_HELLO_Address *addr;
-
- /**
- * Where to return address information if found.
- */
- struct AddressInformationData *ret;
-};
-
-
-/**
- * Find matching address information.
- *
- * @param cls a `struct MatchAddressContext`
- * @param key unused
- * @param value a `struct AddressInformationData`
- * @return #GNUNET_OK if not found
- */
-static int
-match_address (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct MatchAddressContext *mac = cls;
- struct AddressInformationData *aid = value;
-
- if (0 == GNUNET_HELLO_address_cmp (mac->addr,
- aid->address))
- {
- mac->ret = aid;
- return GNUNET_NO;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Find latest address information made for the given address.
- *
- * @param addr address to look up
- * @return NULL if peer was never involved
- */
-static struct AddressInformationData *
-find_address_information (const struct GNUNET_HELLO_Address *addr)
-{
- struct MatchAddressContext mac;
-
- mac.ret = NULL;
- mac.addr = addr;
- GNUNET_CONTAINER_multipeermap_get_multiple (p2aid,
- &addr->peer,
- &match_address,
- &mac);
- return mac.ret;
-}
-
-
-/**
- * Task run to terminate the testcase.
- *
- * @param cls NULL
- */
-static void
-end (void *cls)
-{
- if (0 != ret)
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Test failed at stage %u %s\n",
- off,
- (NULL != test_commands[off].label)
- ? test_commands[off].label
- : "");
- if (NULL != interpreter_task)
- {
- GNUNET_SCHEDULER_cancel (interpreter_task);
- interpreter_task = NULL;
- }
- if (NULL != sched_ats)
- {
- GNUNET_ATS_scheduling_done (sched_ats);
- sched_ats = NULL;
- }
- if (NULL != con_ats)
- {
- GNUNET_ATS_connectivity_done (con_ats);
- con_ats = NULL;
- }
- if (NULL != perf_ats)
- {
- GNUNET_ATS_performance_done (perf_ats);
- perf_ats = NULL;
- }
- if (NULL != p2asd)
- {
- GNUNET_CONTAINER_multipeermap_iterate (p2asd,
- &free_asd,
- NULL);
- GNUNET_CONTAINER_multipeermap_destroy (p2asd);
- p2asd = NULL;
- }
- if (NULL != p2aid)
- {
- GNUNET_CONTAINER_multipeermap_iterate (p2aid,
- &free_aid,
- NULL);
- GNUNET_CONTAINER_multipeermap_destroy (p2aid);
- p2aid = NULL;
- }
-}
-
-
-/**
- * Main interpreter loop. Runs the steps of the test.
- *
- * @param cls NULL
- */
-static void
-interpreter (void *cls);
-
-
-/**
- * Run the interpreter next.
- */
-static void
-run_interpreter ()
-{
- if (NULL != interpreter_task)
- GNUNET_SCHEDULER_cancel (interpreter_task);
- interpreter_task = GNUNET_SCHEDULER_add_now (&interpreter,
- NULL);
-}
-
-
-/**
- * Initialize public key of a peer based on a single number.
- *
- * @param pid number to use as the basis
- * @param pk resulting fake public key
- */
-static void
-make_peer (uint32_t pid,
- struct GNUNET_PeerIdentity *pk)
-{
- memset (pk,
- (int) pid,
- sizeof(struct GNUNET_PeerIdentity));
- GNUNET_memcpy (pk,
- &pid,
- sizeof(uint32_t));
-}
-
-
-/**
- * Generate a fake address based on the given parameters.
- *
- * @param pid number of the peer
- * @param num number of the address at peer @a pid
- * @param addr_flags flags to use for the address
- * @return the address
- */
-static struct GNUNET_HELLO_Address *
-make_address (uint32_t pid,
- uint32_t num,
- enum GNUNET_HELLO_AddressInfo addr_flags)
-{
- struct GNUNET_PeerIdentity pk;
- uint32_t nbo;
-
- nbo = htonl (num);
- make_peer (pid,
- &pk);
- return GNUNET_HELLO_address_allocate (&pk,
- "test",
- &nbo,
- sizeof(nbo),
- addr_flags);
-}
-
-
-/**
- * Our dummy sessions.
- */
-struct GNUNET_ATS_Session
-{
- /**
- * Field to avoid `0 == sizeof(struct GNUNET_ATS_Session)`.
- */
- unsigned int non_empty;
-};
-
-
-/**
- * Create a session instance for ATS.
- *
- * @param i which session number to return
- * @return NULL if @a i is 0, otherwise a pointer unique to @a i
- */
-static struct GNUNET_ATS_Session *
-make_session (unsigned int i)
-{
- struct GNUNET_ATS_Session *baseptr = NULL;
-
- if (0 == i)
- return NULL;
- /* Yes, these are *intentionally* out-of-bounds,
- and offset from NULL, as nobody should ever
- use those other than to compare pointers! */
- return baseptr + i;
-}
-
-
-/**
- * Find a @a code command before the global #off with the
- * specified @a label.
- *
- * @param code opcode to look for
- * @param label label to look for, NULL for none
- * @return previous command with the matching label
- */
-static struct Command *
-find_command (enum CommandCode code,
- const char *label)
-{
- int i;
-
- if (NULL == label)
- return NULL;
- for (i = off - 1; i >= 0; i--)
- if ((code == test_commands[i].code) &&
- (0 == strcmp (test_commands[i].label,
- label)))
- return &test_commands[i];
- GNUNET_break (0);
- return NULL;
-}
-
-
-/**
- * Function called from #GNUNET_ATS_performance_list_addresses when
- * we process a #CMD_LIST_ADDRESSES command.
- *
- * @param cls the `struct Command` that caused the call
- * @param address the address, NULL if ATS service was disconnected
- * @param address_active #GNUNET_YES if this address is actively used
- * to maintain a connection to a peer;
- * #GNUNET_NO if the address is not actively used;
- * #GNUNET_SYSERR if this address is no longer available for ATS
- * @param bandwidth_out assigned outbound bandwidth for the connection
- * @param bandwidth_in assigned inbound bandwidth for the connection
- * @param prop performance data for the address
- */
-static void
-info_cb (void *cls,
- const struct GNUNET_HELLO_Address *address,
- int address_active,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
- const struct GNUNET_ATS_Properties *prop)
-{
- struct Command *c = cls;
- struct CommandListAddresses *cmd = &c->details.list_addresses;
-
- if (NULL == address)
- {
- cmd->alh = NULL;
- /* we are done with the iteration, continue to execute */
- if ((cmd->calls < cmd->min_calls) &&
- (cmd->active_calls < cmd->min_active_calls))
- {
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
- off++;
- run_interpreter ();
- return;
- }
- switch (address_active)
- {
- case GNUNET_YES:
- cmd->active_calls++;
- cmd->calls++;
- break;
-
- case GNUNET_NO:
- cmd->calls++;
- break;
-
- case GNUNET_SYSERR:
- return;
- }
- if ((cmd->calls > cmd->max_calls) &&
- (cmd->active_calls < cmd->max_active_calls))
- {
- GNUNET_break (0);
- GNUNET_ATS_performance_list_addresses_cancel (cmd->alh);
- cmd->alh = NULL;
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
-}
-
-
-/**
- * Function called with reservation result.
- *
- * @param cls closure with the reservation command (`struct Command`)
- * @param peer identifies the peer
- * @param amount set to the amount that was actually reserved or unreserved;
- * either the full requested amount or zero (no partial
reservations)
- * @param res_delay if the reservation could not be satisfied (amount was 0),
how
- * long should the client wait until re-trying?
- */
-static void
-reservation_cb (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- int32_t amount,
- struct GNUNET_TIME_Relative res_delay)
-{
- struct Command *cmd = cls;
- struct GNUNET_PeerIdentity pid;
-
- cmd->details.reserve_bandwidth.rc = NULL;
- make_peer (cmd->details.reserve_bandwidth.pid,
- &pid);
- GNUNET_assert (0 == GNUNET_memcmp (peer,
- &pid));
- switch (cmd->details.reserve_bandwidth.expected_result)
- {
- case GNUNET_OK:
- if (amount != cmd->details.reserve_bandwidth.amount)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unexpectedly failed to reserve %d/%d bytes with delay
%s!\n",
- (int) amount,
- (int) cmd->details.reserve_bandwidth.amount,
- GNUNET_STRINGS_relative_time_to_string (res_delay,
- GNUNET_YES));
- GNUNET_break (0);
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
- break;
-
- case GNUNET_NO:
- GNUNET_break ((0 != amount) ||
- (0 != res_delay.rel_value_us));
- break;
-
- case GNUNET_SYSERR:
- if ((amount != 0) ||
- (0 == res_delay.rel_value_us))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unexpectedly reserved %d bytes with delay %s!\n",
- (int) amount,
- GNUNET_STRINGS_relative_time_to_string (res_delay,
- GNUNET_YES));
- GNUNET_break (0);
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
- break;
- }
- off++;
- run_interpreter ();
-}
-
-
-/**
- * Main interpreter loop. Runs the steps of the test.
- *
- * @param cls NULL
- */
-static void
-interpreter (void *cls)
-
-{
- struct Command *cmd;
-
- interpreter_task = NULL;
- while (1)
- {
- cmd = &test_commands[off];
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "#%u: %d %s\n",
- off,
- (int) cmd->code,
- (NULL != cmd->label) ? cmd->label : "");
- switch (cmd->code)
- {
- case CMD_END_PASS:
- ret = 0;
- GNUNET_SCHEDULER_shutdown ();
- return;
-
- case CMD_ADD_ADDRESS:
- {
- struct GNUNET_HELLO_Address *addr;
- struct GNUNET_ATS_Session *session;
-
- addr = make_address (cmd->details.add_address.pid,
- cmd->details.add_address.addr_num,
- cmd->details.add_address.addr_flags);
- session = make_session (cmd->details.add_address.session);
- if (cmd->details.add_address.expect_fail)
- GNUNET_log_skip (1, GNUNET_NO);
- cmd->details.add_address.ar
- = GNUNET_ATS_address_add (sched_ats,
- addr,
- session,
- &cmd->details.add_address.properties);
- GNUNET_free (addr);
- if (cmd->details.add_address.expect_fail)
- {
- GNUNET_log_skip (0, GNUNET_YES);
- }
- else if (NULL == cmd->details.add_address.ar)
- {
- GNUNET_break (0);
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
- off++;
- break;
- }
-
- case CMD_DEL_ADDRESS:
- {
- struct Command *add;
-
- add = find_command (CMD_ADD_ADDRESS,
- cmd->details.del_address.add_label);
- GNUNET_assert (NULL != add->details.add_address.ar);
- GNUNET_ATS_address_destroy (add->details.add_address.ar);
- add->details.add_address.ar = NULL;
- off++;
- break;
- }
-
- case CMD_AWAIT_ADDRESS_SUGGESTION:
- {
- struct GNUNET_PeerIdentity pid;
- struct GNUNET_HELLO_Address *addr;
- struct Command *add;
- struct AddressSuggestData *asd;
- int done;
-
- make_peer (cmd->details.await_address_suggestion.pid,
- &pid);
- asd = find_address_suggestion (&pid);
- if (NULL == asd)
- return;
- if (GNUNET_NO == asd->active)
- return; /* last suggestion was to disconnect, wait longer */
- done = GNUNET_YES;
- if (NULL != cmd->details.await_address_suggestion.add_label)
- {
- done = GNUNET_NO;
- add = find_command (CMD_ADD_ADDRESS,
- cmd->details.await_address_suggestion.add_label);
- addr = make_address (add->details.add_address.pid,
- add->details.add_address.addr_num,
- add->details.add_address.addr_flags);
- if ((asd->session ==
- make_session (add->details.add_address.session)) &&
- (0 ==
- GNUNET_HELLO_address_cmp (addr,
- asd->address)))
- done = GNUNET_YES;
- GNUNET_free (addr);
- }
- if (GNUNET_NO == done)
- return;
- off++;
- break;
- }
-
- case CMD_AWAIT_DISCONNECT_SUGGESTION:
- {
- struct GNUNET_PeerIdentity pid;
- struct AddressSuggestData *asd;
-
- make_peer (cmd->details.await_disconnect_suggestion.pid,
- &pid);
- asd = find_address_suggestion (&pid);
- if (NULL == asd)
- return; /* odd, no suggestion at all yet!? */
- if (GNUNET_YES == asd->active)
- return; /* last suggestion was to activate, wait longer */
- /* last suggestion was to deactivate, condition satisfied! */
- off++;
- break;
- }
-
- case CMD_REQUEST_CONNECTION_START:
- {
- struct GNUNET_PeerIdentity pid;
-
- make_peer (cmd->details.request_connection_start.pid,
- &pid);
- cmd->details.request_connection_start.csh
- = GNUNET_ATS_connectivity_suggest (con_ats,
- &pid,
- 1);
- off++;
- break;
- }
-
- case CMD_REQUEST_CONNECTION_STOP:
- {
- struct Command *start;
-
- start = find_command (CMD_REQUEST_CONNECTION_START,
-
cmd->details.request_connection_stop.connect_label);
- GNUNET_ATS_connectivity_suggest_cancel (
- start->details.request_connection_start.csh);
- start->details.request_connection_start.csh = NULL;
- off++;
- break;
- }
-
- case CMD_AWAIT_ADDRESS_INFORMATION:
- {
- struct AddressInformationData *aid;
- struct Command *add;
- struct Command *update;
- struct GNUNET_HELLO_Address *addr;
- const struct GNUNET_ATS_Properties *cmp;
-
- add = find_command (CMD_ADD_ADDRESS,
- cmd->details.await_address_information.add_label);
- update = find_command (CMD_UPDATE_ADDRESS,
- cmd->details.await_address_information.
- update_label);
- addr = make_address (add->details.add_address.pid,
- add->details.add_address.addr_num,
- add->details.add_address.addr_flags);
- aid = find_address_information (addr);
- GNUNET_free (addr);
- if (NULL == update)
- cmp = &add->details.add_address.properties;
- else
- cmp = &update->details.update_address.properties;
- if ((NULL != aid) &&
- (cmp->delay.rel_value_us == aid->properties.delay.rel_value_us) &&
- (cmp->utilization_out == aid->properties.utilization_out) &&
- (cmp->utilization_in == aid->properties.utilization_in) &&
- (cmp->distance == aid->properties.distance) &&
- (cmp->scope == aid->properties.scope))
- {
- off++;
- break;
- }
- return;
- }
-
- case CMD_UPDATE_ADDRESS:
- {
- struct Command *add;
-
- add = find_command (CMD_ADD_ADDRESS,
- cmd->details.update_address.add_label);
- GNUNET_assert (NULL != add->details.add_address.ar);
- GNUNET_ATS_address_update (add->details.add_address.ar,
- &cmd->details.update_address.properties);
- off++;
- break;
- }
-
- case CMD_ADD_SESSION:
- {
- struct Command *add;
- struct GNUNET_ATS_Session *session;
-
- add = find_command (CMD_ADD_ADDRESS,
- cmd->details.add_session.add_label);
- session = make_session (cmd->details.add_session.session);
- GNUNET_assert (NULL != add->details.add_address.ar);
- GNUNET_ATS_address_add_session (add->details.add_address.ar,
- session);
- off++;
- break;
- }
-
- case CMD_DEL_SESSION:
- {
- struct Command *add_address;
- struct Command *add_session;
- struct GNUNET_ATS_Session *session;
-
- add_session = find_command (CMD_ADD_SESSION,
-
cmd->details.del_session.add_session_label);
- add_address = find_command (CMD_ADD_ADDRESS,
-
add_session->details.add_session.add_label);
- GNUNET_assert (NULL != add_address->details.add_address.ar);
- session = make_session (add_session->details.add_session.session);
- GNUNET_ATS_address_del_session (add_address->details.add_address.ar,
- session);
- off++;
- break;
- }
-
- case CMD_CHANGE_PREFERENCE:
- {
- struct GNUNET_PeerIdentity pid;
-
- make_peer (cmd->details.change_preference.pid,
- &pid);
- GNUNET_ATS_performance_change_preference (perf_ats,
- &pid,
- GNUNET_ATS_PREFERENCE_END);
- off++;
- break;
- }
-
- case CMD_PROVIDE_FEEDBACK:
- {
- struct GNUNET_PeerIdentity pid;
-
- make_peer (cmd->details.provide_feedback.pid,
- &pid);
- GNUNET_ATS_performance_give_feedback (perf_ats,
- &pid,
- cmd->details.provide_feedback.
- scope,
- GNUNET_ATS_PREFERENCE_END);
- off++;
- break;
- }
-
- case CMD_LIST_ADDRESSES:
- {
- struct GNUNET_PeerIdentity pid;
-
- make_peer (cmd->details.list_addresses.pid,
- &pid);
- cmd->details.list_addresses.alh
- = GNUNET_ATS_performance_list_addresses (perf_ats,
- &pid,
- cmd->details.list_addresses.
- all,
- &info_cb,
- cmd);
- return;
- }
-
- case CMD_RESERVE_BANDWIDTH:
- {
- struct GNUNET_PeerIdentity pid;
-
- make_peer (cmd->details.reserve_bandwidth.pid,
- &pid);
- cmd->details.reserve_bandwidth.rc
- = GNUNET_ATS_reserve_bandwidth (perf_ats,
- &pid,
-
cmd->details.reserve_bandwidth.amount,
- &reservation_cb,
- cmd);
- return;
- }
-
- case CMD_SLEEP:
- off++;
- interpreter_task = GNUNET_SCHEDULER_add_delayed
(cmd->details.sleep.delay,
- &interpreter,
- NULL);
- return;
- } /* end switch */
- } /* end while(1) */
-}
-
-
-/**
- * Signature of a function called by ATS with the current bandwidth
- * and address preferences as determined by ATS.
- *
- * @param cls closure, should point to "asc-closure"
- * @param peer for which we suggest an address, NULL if ATS connection died
- * @param address suggested address (including peer identity of the peer),
- * may be NULL to signal disconnect from peer
- * @param session session to use, NULL to establish a new outgoing session
- * @param bandwidth_out assigned outbound bandwidth for the connection,
- * 0 to signal disconnect
- * @param bandwidth_in assigned inbound bandwidth for the connection,
- * 0 to signal disconnect
- */
-static void
-address_suggest_cb (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
-{
- const char *asc_cls = cls;
- struct AddressSuggestData *asd;
-
- GNUNET_break (0 == strcmp (asc_cls, "asc-closure"));
- if (NULL == peer)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Connection to ATS died, likely a crash!\n");
- GNUNET_SCHEDULER_shutdown ();
-#if 0
- /* This is what we should do if we wanted to continue past
- the ATS crash. */
- GNUNET_CONTAINER_multipeermap_iterate (p2asd,
- &free_asd,
- NULL);
- GNUNET_CONTAINER_multipeermap_iterate (p2aid,
- &free_aid,
- NULL);
-#endif
- return;
- }
-
- asd = find_address_suggestion (peer);
- if (NULL == asd)
- {
- asd = GNUNET_new (struct AddressSuggestData);
- GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_put (p2asd,
- peer,
- asd,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
- }
- if ((0 == ntohl (bandwidth_out.value__)) &&
- (0 == ntohl (bandwidth_in.value__)))
- asd->active = GNUNET_NO;
- else
- asd->active = GNUNET_YES;
- asd->bandwidth_out = bandwidth_out;
- asd->bandwidth_in = bandwidth_in;
- asd->session = session;
- GNUNET_free (asd->address);
- asd->address = NULL;
- if (NULL != address)
- asd->address = GNUNET_HELLO_address_copy (address);
- if (NULL == interpreter_task)
- run_interpreter ();
-}
-
-
-/**
- * Signature of a function that is called with QoS information about an
address.
- *
- * @param cls closure, should point to "aic-closure"
- * @param address the address, NULL if ATS service was disconnected
- * @param address_active #GNUNET_YES if this address is actively used
- * to maintain a connection to a peer;
- * #GNUNET_NO if the address is not actively used;
- * #GNUNET_SYSERR if this address is no longer available for ATS
- * @param bandwidth_out assigned outbound bandwidth for the connection
- * @param bandwidth_in assigned inbound bandwidth for the connection
- * @param prop performance data for the address
- */
-static void
-address_information_cb (void *cls,
- const struct GNUNET_HELLO_Address *address,
- int address_active,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
- const struct GNUNET_ATS_Properties *prop)
-{
- const char *aic_cls = cls;
- struct AddressInformationData *aid;
-
- GNUNET_break (0 == strcmp (aic_cls, "aic-closure"));
- if (NULL == address)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Connection to ATS died, likely a crash!\n");
- GNUNET_CONTAINER_multipeermap_iterate (p2aid,
- &free_aid,
- NULL);
- return;
- }
-
- aid = find_address_information (address);
- if (NULL == aid)
- {
- aid = GNUNET_new (struct AddressInformationData);
- aid->address = GNUNET_HELLO_address_copy (address);
- GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_put (p2aid,
- &address->peer,
- aid,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
- }
- aid->active = address_active;
- aid->bandwidth_out = bandwidth_out;
- aid->bandwidth_in = bandwidth_in;
- aid->properties = *prop;
- if (NULL == interpreter_task)
- run_interpreter ();
-}
-
-
-/**
- * Function run once the ATS service has been started.
- *
- * @param cls NULL
- * @param cfg configuration for the testcase
- * @param peer handle to the peer
- */
-static void
-run (void *cls,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- struct GNUNET_TESTING_Peer *peer)
-{
- p2asd = GNUNET_CONTAINER_multipeermap_create (128,
- GNUNET_NO);
- p2aid = GNUNET_CONTAINER_multipeermap_create (128,
- GNUNET_NO);
- GNUNET_SCHEDULER_add_delayed (TIMEOUT,
- &end,
- NULL);
-
- sched_ats = GNUNET_ATS_scheduling_init (cfg,
- &address_suggest_cb,
- "asc-closure");
- if (NULL == sched_ats)
- {
- GNUNET_break (0);
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
- con_ats = GNUNET_ATS_connectivity_init (cfg);
- if (NULL == con_ats)
- {
- GNUNET_break (0);
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
- perf_ats = GNUNET_ATS_performance_init (cfg,
- &address_information_cb,
- "aic-closure");
- if (NULL == perf_ats)
- {
- GNUNET_break (0);
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
- run_interpreter ();
-}
-
-
-/**
- * Run ATS test.
- *
- * @param argc length of @a argv
- * @param argv command line
- * @param cmds commands to run with the interpreter
- * @param timeout how long is the test allowed to take?
- * @return 0 on success
- */
-int
-TEST_ATS_run (int argc,
- char *argv[],
- struct Command *cmds,
- struct GNUNET_TIME_Relative timeout)
-{
- char *test_filename = GNUNET_strdup (argv[0]);
- char *sep;
- char *config_file;
- char *underscore;
-
- test_commands = cmds;
- TIMEOUT = timeout;
- if (NULL != (sep = strstr (test_filename, ".exe")))
- sep[0] = '\0';
- underscore = strrchr (test_filename, (int) '_');
- GNUNET_assert (NULL != underscore);
- GNUNET_asprintf (&config_file,
- "test_ats_api_%s.conf",
- underscore + 1);
- ret = 2;
- if (0 != GNUNET_TESTING_peer_run ("test-ats-api",
- config_file,
- &run, NULL))
- ret = 1;
- GNUNET_free (test_filename);
- GNUNET_free (config_file);
- return ret;
-}
-
-
-/* end of test_ats_lib.c */
diff --git a/src/ats/test_ats_lib.h b/src/ats/test_ats_lib.h
deleted file mode 100644
index 60b459f79..000000000
--- a/src/ats/test_ats_lib.h
+++ /dev/null
@@ -1,512 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/test_ats_lib.h
- * @brief test ATS library with a generic interpreter for running ATS tests
- * @author Christian Grothoff
- */
-#ifndef TEST_ATS_LIB_H
-#define TEST_ATS_LIB_H
-
-#include "gnunet_util_lib.h"
-#include "gnunet_ats_service.h"
-#include "gnunet_testing_lib.h"
-
-
-/**
- * Commands for the interpreter.
- */
-enum CommandCode
-{
- /**
- * End the test (passing).
- */
- CMD_END_PASS = 0,
-
- /**
- * Call #GNUNET_ATS_address_add().
- */
- CMD_ADD_ADDRESS,
-
- /**
- * Call #GNUNET_ATS_address_del().
- */
- CMD_DEL_ADDRESS,
-
- /**
- * Wait for ATS to suggest address.
- */
- CMD_AWAIT_ADDRESS_SUGGESTION,
-
- /**
- * Wait for ATS to suggest disconnect.
- */
- CMD_AWAIT_DISCONNECT_SUGGESTION,
-
- /**
- * Ask ATS to connect to a peer, using
- * #GNUNET_ATS_connectivity_suggest().
- */
- CMD_REQUEST_CONNECTION_START,
-
- /**
- * Tell ATS we no longer need a connection to a peer, using
- * #GNUNET_ATS_connectivity_suggest_cancel().
- */
- CMD_REQUEST_CONNECTION_STOP,
-
- /**
- * Wait for certain address information to be provided.
- */
- CMD_AWAIT_ADDRESS_INFORMATION,
-
- /**
- * Update properties of an address, using
- * #GNUNET_ATS_address_update().
- */
- CMD_UPDATE_ADDRESS,
-
- /**
- * Add session to an address, using
- * #GNUNET_ATS_address_add_session().
- */
- CMD_ADD_SESSION,
-
- /**
- * Remove session from an address, using
- * #GNUNET_ATS_address_del_session().
- */
- CMD_DEL_SESSION,
-
- /**
- * Change performance preferences for a peer, testing
- * #GNUNET_ATS_performance_change_preference().
- */
- CMD_CHANGE_PREFERENCE,
-
- /**
- * Provide allocation quality feedback, testing
- * #GNUNET_ATS_performance_give_feedback().
- */
- CMD_PROVIDE_FEEDBACK,
-
- /**
- * Obtain list of all addresses, testing
- * #GNUNET_ATS_performance_list_addresses().
- */
- CMD_LIST_ADDRESSES,
-
- /**
- * Reserve bandwidth, testing
- * #GNUNET_ATS_reserve_bandwidth().
- */
- CMD_RESERVE_BANDWIDTH,
-
- /**
- * Wait for a bit.
- */
- CMD_SLEEP
-};
-
-
-/**
- * Details for the #CMD_ADD_ADDRESS command.
- */
-struct CommandAddAddress
-{
- /**
- * Number of the peer (used to generate PID).
- */
- unsigned int pid;
-
- /**
- * Number of the address (used to generate binary address).
- */
- unsigned int addr_num;
-
- /**
- * Session to supply, 0 for NULL.
- */
- unsigned int session;
-
- /**
- * Flags to set for the address.
- */
- enum GNUNET_HELLO_AddressInfo addr_flags;
-
- /**
- * Performance properties to supply.
- */
- struct GNUNET_ATS_Properties properties;
-
- /**
- * Expect the operation to fail (duplicate).
- */
- int expect_fail;
-
- /**
- * Here the result of the add address operation will be stored.
- */
- struct GNUNET_ATS_AddressRecord *ar;
-};
-
-
-/**
- * Details for the #CMD_DEL_ADDRESS command.
- */
-struct CommandDelAddress
-{
- /**
- * Label of the corresponding #CMD_ADD_ADDRESS that
- * we are now to remove.
- */
- const char *add_label;
-};
-
-
-/**
- * Details for the #CMD_AWAIT_ADDRESS_SUGGESTION command.
- */
-struct CommandAwaitAddressSuggestion
-{
- /**
- * For which peer do we expect a suggestion?
- */
- unsigned int pid;
-
- /**
- * If we expect the address suggested to match a particular
- * addition, specify the label of the add operation here. Otherwise
- * use NULL for "any" available address.
- */
- const char *add_label;
-};
-
-
-/**
- * Details for the #CMD_AWAIT_DISCONNECT_SUGGESTION command.
- */
-struct CommandAwaitDisconnectSuggestion
-{
- /**
- * For which peer do we expect the disconnect?
- */
- unsigned int pid;
-};
-
-
-/**
- * Details for the #CMD_REQUEST_CONNECTION_START command.
- */
-struct CommandRequestConnectionStart
-{
- /**
- * Identity of the peer we would like to connect to.
- */
- unsigned int pid;
-
- /**
- * Location where we store the handle returned from
- * #GNUNET_ATS_connectivity_suggest().
- */
- struct GNUNET_ATS_ConnectivitySuggestHandle *csh;
-};
-
-
-/**
- * Details for the #CMD_REQUEST_CONNECTION_STOP command.
- */
-struct CommandRequestConnectionStop
-{
- /**
- * Label of the corresponding #CMD_REQUEST_CONNECTION_START that
- * we are now stopping.
- */
- const char *connect_label;
-};
-
-
-/**
- * Details for the #CMD_AWAIT_ADDRESS_INFORMATION command.
- */
-struct CommandAwaitAddressInformation
-{
- /**
- * For which address do we expect information?
- * The address is identified by the respective
- * label of the corresponding add operation.
- */
- const char *add_label;
-
- /**
- * Label of a possible update operation that may
- * have modified the properties. NULL to use
- * the properties from the @e add_label.
- */
- const char *update_label;
-};
-
-
-/**
- * Details for the #CMD_UPDATE_ADDRESS command.
- */
-struct CommandUpdateAddress
-{
- /**
- * Label of the addresses's add operation.
- */
- const char *add_label;
-
- /**
- * Performance properties to supply.
- */
- struct GNUNET_ATS_Properties properties;
-};
-
-
-/**
- * Details for the #CMD_ADD_SESSION command.
- */
-struct CommandAddSession
-{
- /**
- * Label of the addresses's add operation.
- */
- const char *add_label;
-
- /**
- * Session to supply.
- */
- unsigned int session;
-};
-
-
-/**
- * Details for the #CMD_DEL_SESSION command.
- */
-struct CommandDelSession
-{
- /**
- * Label of the addresses's add operation.
- */
- const char *add_session_label;
-};
-
-
-/**
- * Details for the #CMD_CHANGE_PREFERENCE command.
- */
-struct CommandChangePreference
-{
- /**
- * Identity of the peer we have a preference change towards.
- */
- unsigned int pid;
-
- /* FIXME: preference details! */
-};
-
-
-/**
- * Details for the #CMD_PROVIDE_FEEDBACK command.
- */
-struct CommandProvideFeedback
-{
- /**
- * Identity of the peer we have a feedback for.
- */
- unsigned int pid;
-
- /**
- * Over which timeframe does the feedback apply?
- */
- struct GNUNET_TIME_Relative scope;
-
- /* FIXME: feedback details! */
-};
-
-
-/**
- * Details for the #CMD_LIST_ADDRESSES command.
- */
-struct CommandListAddresses
-{
- /**
- * Identity of the peer we want a list for.
- */
- unsigned int pid;
-
- /**
- * All addresses or just active?
- */
- int all;
-
- /**
- * Minimum number of addresses the callback may report.
- */
- unsigned int min_calls;
-
- /**
- * Maximum number of addresses the callback may report.
- */
- unsigned int max_calls;
-
- /**
- * Minimum number of active addresses the callback may report.
- */
- unsigned int min_active_calls;
-
- /**
- * Maximum number of active addresses the callback may report.
- */
- unsigned int max_active_calls;
-
- /**
- * Number of calls the command invoked the callback with
- * an address marked as active. (Set by command).
- */
- unsigned int active_calls;
-
- /**
- * Number of calls the command invoked the callback with
- * any address marked as available to ATS. (Set by command).
- */
- unsigned int calls;
-
- /**
- * Location where we store the return value from
- * #GNUNET_ATS_performance_list_addresses().
- */
- struct GNUNET_ATS_AddressListHandle *alh;
-};
-
-
-/**
- * Details for the #CMD_RESERVE_BANDWIDTH command.
- */
-struct CommandReserveBandwidth
-{
- /**
- * For which peer do we reserve bandwidth?
- */
- unsigned int pid;
-
- /**
- * How much should we try to reserve?
- */
- int32_t amount;
-
- /**
- * Should we expect this to work or fail?
- * #GNUNET_YES: must work
- * #GNUNET_NO: may work or fail
- * #GNUNET_SYSERR: must fail
- */
- int expected_result;
-
- /**
- * Location where we store the return value from
- * #GNUNET_ATS_reserve_bandwidth().
- */
- struct GNUNET_ATS_ReservationContext *rc;
-};
-
-
-/**
- * Details for the #CMD_SLEEP command.
- */
-struct CommandSleep
-{
- /**
- * How long should we wait before running the next command?
- */
- struct GNUNET_TIME_Relative delay;
-};
-
-
-/**
- * A command for the test case interpreter.
- */
-struct Command
-{
- /**
- * Command code to run.
- */
- enum CommandCode code;
-
- /**
- * Commands can be given a label so we can reference them later.
- */
- const char *label;
-
- /**
- * Additional arguments to commands, if any.
- */
- union
- {
- struct CommandAddAddress add_address;
-
- struct CommandDelAddress del_address;
-
- struct CommandAwaitAddressSuggestion await_address_suggestion;
-
- struct CommandAwaitDisconnectSuggestion await_disconnect_suggestion;
-
- struct CommandRequestConnectionStart request_connection_start;
-
- struct CommandRequestConnectionStop request_connection_stop;
-
- struct CommandAwaitAddressInformation await_address_information;
-
- struct CommandUpdateAddress update_address;
-
- struct CommandAddSession add_session;
-
- struct CommandDelSession del_session;
-
- struct CommandChangePreference change_preference;
-
- struct CommandProvideFeedback provide_feedback;
-
- struct CommandListAddresses list_addresses;
-
- struct CommandReserveBandwidth reserve_bandwidth;
-
- struct CommandSleep sleep;
- } details;
-};
-
-
-/**
- * Run ATS test.
- *
- * @param argc length of @a argv
- * @param argv command line
- * @param cmds commands to run with the interpreter
- * @param timeout how long is the test allowed to take?
- * @return 0 on success
- */
-int
-TEST_ATS_run (int argc,
- char *argv[],
- struct Command *cmds,
- struct GNUNET_TIME_Relative timeout);
-
-#endif
diff --git a/src/ats/test_ats_reservation_api.c
b/src/ats/test_ats_reservation_api.c
deleted file mode 100644
index f6a964df4..000000000
--- a/src/ats/test_ats_reservation_api.c
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file ats/test_ats_reservation_api.c
- * @brief test ATS bandwidth reservation API
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "test_ats_lib.h"
-
-/**
- * Global timeout for the testcase.
- */
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 15)
-
-/**
- * Definition of the test as a sequence of commands.
- */
-static struct Command test_commands[] = {
- /* 0: add initial address */
- {
- .code = CMD_ADD_ADDRESS,
- .label = "add-address-0-0",
- .details.add_address = {
- .pid = 0,
- .addr_num = 0,
- .session = 0,
- .properties = {
- /* use network with 65k quota! */
- .scope = GNUNET_NT_WAN
- }
-
-
- }
-
-
- },
- /* 1: some solver still require explicit start */
- {
- .code = CMD_REQUEST_CONNECTION_START,
- .label = "request-0",
- .details.request_connection_start = {
- .pid = 0
- }
-
-
- },
- /* 2: check we got an address */
- {
- .code = CMD_AWAIT_ADDRESS_SUGGESTION,
- .details.await_address_suggestion = {
- .add_label = "add-address-0-0"
- }
-
-
- },
- /* 3: sleep 7s, should give us 5s * 64k/s = 320k buffer;
- Note that this depends on MAX_BANDWIDTH_CARRY_S. We
- sleep more than 5s to show that only MAX_BANDWIDTH carries. */
- {
- .code = CMD_SLEEP,
- .label = "sleep",
- .details.sleep.delay = { 7 * 1000LL * 1000LL }
- },
- /* 4: reserve 128k -- should work (5s carry, so we had 320k) */
- {
- .code = CMD_RESERVE_BANDWIDTH,
- .details.reserve_bandwidth = {
- .pid = 0,
- .amount = 128 * 1024,
- .expected_result = GNUNET_YES
- }
-
-
- },
- /* 5: reserve another 192k -- should just work (now exactly pushing the
limit) */
- {
- .code = CMD_RESERVE_BANDWIDTH,
- .label = "big reservation",
- .details.reserve_bandwidth = {
- .pid = 0,
- .amount = 192 * 1024,
- .expected_result = GNUNET_YES
- }
-
-
- },
- /* 6: reserve another 32M -- should now fail (if MAX_BANDWIDTH_CARRY_S
- is precisely observed) */
- {
- .code = CMD_RESERVE_BANDWIDTH,
- .label = "failing reservation",
- .details.reserve_bandwidth = {
- .pid = 0,
- .amount = 32 * 1024 * 1024,
- .expected_result = GNUNET_SYSERR
- }
-
-
- },
- /* 7: sleep 3s, should give us 3s * 64k/s - 32k = 160k buffer */
- {
- .code = CMD_SLEEP,
- .label = "sleep",
- .details.sleep.delay = { 6 * 1000LL * 1000LL }
- },
- /* 8: reserve another 160k -- should now work */
- {
- .code = CMD_RESERVE_BANDWIDTH,
- .label = "successful final reservation",
- .details.reserve_bandwidth = {
- .pid = 0,
- .amount = 160 * 1024,
- .expected_result = GNUNET_YES
- }
-
-
- },
- /* 9: remove address */
- {
- .code = CMD_DEL_ADDRESS,
- .details.del_address = {
- .add_label = "add-address-0-0"
- }
-
-
- },
- /* 10: check we got disconnected */
- {
- .code = CMD_AWAIT_DISCONNECT_SUGGESTION,
- .details.await_disconnect_suggestion = {
- .pid = 0
- }
-
-
- },
- /* 11: just for symmetry, also stop asking for the connection */
- {
- .code = CMD_REQUEST_CONNECTION_STOP,
- .details.request_connection_stop = {
- .connect_label = "request-0",
- }
-
-
- },
- /* Test ends successfully */
- {
- .code = CMD_END_PASS
- }
-};
-
-
-int
-main (int argc,
- char *argv[])
-{
- return TEST_ATS_run (argc,
- argv,
- test_commands,
- TIMEOUT);
-}
-
-
-/* end of file test_ats_reservation_api.c */
diff --git a/src/ats/test_ats_solver_default.conf
b/src/ats/test_ats_solver_default.conf
deleted file mode 100644
index 2d8927abd..000000000
--- a/src/ats/test_ats_solver_default.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
-
diff --git a/src/ats/test_ats_solver_delayed_proportional.conf
b/src/ats/test_ats_solver_delayed_proportional.conf
deleted file mode 100644
index fdfeb90b8..000000000
--- a/src/ats/test_ats_solver_delayed_proportional.conf
+++ /dev/null
@@ -1,20 +0,0 @@
-@INLINE@ test_ats_solver_default.conf
-
-[ats]
-PREFIX = ./test_delay -t 10 --
-MODE = proportional
-# UNSPECIFIED
-UNSPECIFIED_QUOTA_IN = 64 KiB
-UNSPECIFIED_QUOTA_OUT = 64 KiB
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = 64 KiB
-WAN_QUOTA_OUT = 64 KiB
-# WLAN
-WLAN_QUOTA_IN = 512
-WLAN_QUOTA_OUT = 512
diff --git a/src/ats/test_ats_solver_proportional.conf
b/src/ats/test_ats_solver_proportional.conf
deleted file mode 100644
index 49815134b..000000000
--- a/src/ats/test_ats_solver_proportional.conf
+++ /dev/null
@@ -1,19 +0,0 @@
-@INLINE@ test_ats_solver_default.conf
-
-[ats]
-MODE = proportional
-# UNSPECIFIED
-UNSPECIFIED_QUOTA_IN = 64 KiB
-UNSPECIFIED_QUOTA_OUT = 64 KiB
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = 64 KiB
-WAN_QUOTA_OUT = 64 KiB
-# WLAN
-WLAN_QUOTA_IN = 512
-WLAN_QUOTA_OUT = 512
diff --git a/src/ats/test_delay b/src/ats/test_delay
deleted file mode 100755
index 31c7777c4..000000000
--- a/src/ats/test_delay
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/sh
-
-TEMP=$(getopt -o t: -- "$@")
-
-if [ $? != 0 ] ; then
- exit 1
-fi
-
-eval set -- "$TEMP"
-
-while true ; do
- case "$1" in
- (-t) sleep "$2" ; shift 2 ;;
- (--) shift ; break ;;
- (*) echo "Error parsing getopt output" ; exit 1 ;;
- esac
-done
-exec "$@"
diff --git a/src/cadet/Makefile.am b/src/cadet/Makefile.am
index dec43b516..9f59aba3c 100644
--- a/src/cadet/Makefile.am
+++ b/src/cadet/Makefile.am
@@ -18,15 +18,13 @@ plugindir = $(libdir)/gnunet
AM_CLFAGS = -g
libexec_PROGRAMS = \
- gnunet-service-cadet \
- $(EXP_LIBEXEC)
+ gnunet-service-cadet
bin_PROGRAMS = \
gnunet-cadet
lib_LTLIBRARIES = \
- libgnunetcadet.la \
- $(EXP_LIB)
+ libgnunetcadet.la
libgnunetcadet_la_SOURCES = \
cadet_api.c \
@@ -64,7 +62,6 @@ gnunet_service_cadet_SOURCES = \
gnunet-service-cadet_peer.c gnunet-service-cadet_peer.h
gnunet_service_cadet_LDADD = \
$(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/ats/libgnunetats.la \
$(top_builddir)/src/core/libgnunetcore.la \
$(top_builddir)/src/dht/libgnunetdht.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
@@ -73,38 +70,11 @@ gnunet_service_cadet_LDADD = \
$(top_builddir)/src/hello/libgnunethello.la \
$(top_builddir)/src/block/libgnunetblock.la
if LINUX
- gnunet_service_cadet_LDFLAGS = -lrt \
+gnunet_service_cadet_LDFLAGS = -lrt \
$(GN_LIBINTL)
endif
- noinst_LTLIBRARIES = libgnunetcadettest.la $(noinst_LIB_EXP)
-# noinst_PROGRAMS = gnunet-cadet-profiler
-
-check_PROGRAMS = \
- # test_cadet_local_mq \
- # test_cadet_2_forward \
- # test_cadet_2_forward \
- # test_cadet_2_signal \
- # test_cadet_2_keepalive \
- # test_cadet_2_speed \
- # test_cadet_2_speed_ack \
- # test_cadet_2_speed_backwards \
- # test_cadet_2_speed_reliable \
- # test_cadet_2_speed_reliable_backwards \
- # test_cadet_2_reopen \
- # test_cadet_2_destroy \
- # test_cadet_5_forward \
- # test_cadet_5_signal \
- # test_cadet_5_keepalive \
- # test_cadet_5_speed \
- # test_cadet_5_speed_ack \
- # test_cadet_5_speed_reliable \
- # test_cadet_5_speed_reliable_backwards \
- # test_cadet_5_speed_backwards \
- # test_cadet_5_reopen
-
-
#gnunet_cadet_profiler_SOURCES = \
# gnunet-cadet-profiler.c
#gnunet_cadet_profiler_LDADD = $(ld_cadet_test_lib)
@@ -117,106 +87,9 @@ test_cadet_local_mq_LDADD = \
$(top_builddir)/src/testing/libgnunettesting.la \
$(top_builddir)/src/util/libgnunetutil.la
-
-libgnunetcadettest_la_SOURCES = \
- cadet_test_lib.c cadet_test_lib.h
-libgnunetcadettest_la_LIBADD = \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- libgnunetcadet.la
-
-ld_cadet_test_lib = \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/testing/libgnunettesting.la \
- libgnunetcadet.la \
- libgnunetcadettest.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la
-dep_cadet_test_lib = \
- libgnunetcadet.la \
- libgnunetcadettest.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la
-
-test_cadet_2_forward_SOURCES = \
- test_cadet.c
-test_cadet_2_forward_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_2_signal_SOURCES = \
- test_cadet.c
-test_cadet_2_signal_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_2_keepalive_SOURCES = \
- test_cadet.c
-test_cadet_2_keepalive_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_2_speed_SOURCES = \
- test_cadet.c
-test_cadet_2_speed_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_2_speed_ack_SOURCES = \
- test_cadet.c
-test_cadet_2_speed_ack_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_2_speed_backwards_SOURCES = \
- test_cadet.c
-test_cadet_2_speed_backwards_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_2_speed_reliable_SOURCES = \
- test_cadet.c
-test_cadet_2_speed_reliable_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_2_speed_reliable_backwards_SOURCES = \
- test_cadet.c
-test_cadet_2_speed_reliable_backwards_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_5_forward_SOURCES = \
- test_cadet.c
-test_cadet_5_forward_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_5_signal_SOURCES = \
- test_cadet.c
-test_cadet_5_signal_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_5_keepalive_SOURCES = \
- test_cadet.c
-test_cadet_5_keepalive_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_5_speed_SOURCES = \
- test_cadet.c
-test_cadet_5_speed_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_5_speed_ack_SOURCES = \
- test_cadet.c
-test_cadet_5_speed_ack_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_5_speed_backwards_SOURCES = \
- test_cadet.c
-test_cadet_5_speed_backwards_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_5_speed_reliable_SOURCES = \
- test_cadet.c
-test_cadet_5_speed_reliable_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_5_speed_reliable_backwards_SOURCES = \
- test_cadet.c
-test_cadet_5_speed_reliable_backwards_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_2_reopen_SOURCES = \
- test_cadet.c
-test_cadet_2_reopen_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_5_reopen_SOURCES = \
- test_cadet.c
-test_cadet_5_reopen_LDADD = $(ld_cadet_test_lib)
-
-test_cadet_2_destroy_SOURCES = \
- test_cadet.c
-test_cadet_2_destroy_LDADD = $(ld_cadet_test_lib)
-
if ENABLE_TEST_RUN
AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export
PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;unset XDG_DATA_HOME;unset
XDG_CONFIG_HOME;
-TESTS = \
- $(check_PROGRAMS)
+TESTS = $(check_PROGRAMS)
endif
EXTRA_DIST = \
diff --git a/src/consensus/Makefile.am b/src/consensus/Makefile.am
index 27743c45e..f77f49f94 100644
--- a/src/consensus/Makefile.am
+++ b/src/consensus/Makefile.am
@@ -18,8 +18,8 @@ endif
libexec_PROGRAMS = \
gnunet-service-consensus
-noinst_PROGRAMS = \
- gnunet-consensus-profiler
+#noinst_PROGRAMS = \
+# gnunet-consensus-profiler
if ENABLE_MALICIOUS
libexec_PROGRAMS += \
@@ -38,14 +38,15 @@ check-python-style:
lib_LTLIBRARIES = \
libgnunetconsensus.la
-gnunet_consensus_profiler_SOURCES = \
- gnunet-consensus-profiler.c
-gnunet_consensus_profiler_LDADD = \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunetconsensus.la \
- $(top_builddir)/src/testing/libgnunettesting.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- $(GN_LIBINTL)
+# TNG
+#gnunet_consensus_profiler_SOURCES = \
+# gnunet-consensus-profiler.c
+#gnunet_consensus_profiler_LDADD = \
+# $(top_builddir)/src/util/libgnunetutil.la \
+# libgnunetconsensus.la \
+# $(top_builddir)/src/testing/libgnunettesting.la \
+# $(top_builddir)/src/testbed/libgnunettestbed.la \
+# $(GN_LIBINTL)
gnunet_service_consensus_SOURCES = \
gnunet-service-consensus.c
diff --git a/src/core/Makefile.am b/src/core/Makefile.am
index 1343fe395..062aa0266 100644
--- a/src/core/Makefile.am
+++ b/src/core/Makefile.am
@@ -45,7 +45,6 @@ libgnunet_test_core_plugin_cmd_just_run_la_LIBADD = \
$(top_builddir)/src/core/libgnunetcoretesting.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
$(top_builddir)/src/arm/libgnunetarm.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(LTLIBINTL)
diff --git a/src/dht/Makefile.am b/src/dht/Makefile.am
index 124f95a77..c0ff34449 100644
--- a/src/dht/Makefile.am
+++ b/src/dht/Makefile.am
@@ -53,8 +53,8 @@ bin_PROGRAMS = \
gnunet-dht-put \
gnunet-dht-hello
-noinst_PROGRAMS = \
- gnunet-dht-profiler
+#noinst_PROGRAMS = \
+# gnunet-dht-profiler
gnunet_service_dht_SOURCES = \
gnunet-service-dht.c gnunet-service-dht.h \
@@ -66,9 +66,7 @@ gnunet_service_dht_LDADD = \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/core/libgnunetcore.la \
$(top_builddir)/src/nse/libgnunetnse.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/transport/libgnunettransport.la \
- $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
+ $(top_builddir)/src/peerstore/libgnunetpeerstore.la \
$(top_builddir)/src/hello/libgnunethello.la \
$(top_builddir)/src/block/libgnunetblock.la \
$(top_builddir)/src/block/libgnunetblockgroup.la \
@@ -110,25 +108,26 @@ gnunet_dht_monitor_LDADD = \
gnunet_dht_monitor_LDFLAGS = \
$(GN_LIBINTL)
-gnunet_dht_profiler_SOURCES = \
- gnunet_dht_profiler.c
-gnunet_dht_profiler_LDADD = \
- libgnunetdht.la \
- $(top_builddir)/src/core/libgnunetcore.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/testing/libgnunettesting.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la
-gnunet_dht_profiler_LDFLAGS = \
- $(GN_LIBINTL)
-
-noinst_LIBRARIES = libgnunetdhttest.a
-
-libgnunetdhttest_a_SOURCES = \
- dht_test_lib.c dht_test_lib.h
-libgnunetdhttest_a_LIBADD = \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- libgnunetdht.la
+# TNG
+#gnunet_dht_profiler_SOURCES = \
+# gnunet_dht_profiler.c
+#gnunet_dht_profiler_LDADD = \
+# libgnunetdht.la \
+# $(top_builddir)/src/core/libgnunetcore.la \
+# $(top_builddir)/src/util/libgnunetutil.la \
+# $(top_builddir)/src/testing/libgnunettesting.la \
+# $(top_builddir)/src/testbed/libgnunettestbed.la
+#gnunet_dht_profiler_LDFLAGS = \
+# $(GN_LIBINTL)
+
+#noinst_LIBRARIES = libgnunetdhttest.a
+#
+#libgnunetdhttest_a_SOURCES = \
+# dht_test_lib.c dht_test_lib.h
+#libgnunetdhttest_a_LIBADD = \
+# $(top_builddir)/src/util/libgnunetutil.la \
+# $(top_builddir)/src/testbed/libgnunettestbed.la \
+# libgnunetdht.la
check_PROGRAMS = \
test_dht_api \
@@ -161,69 +160,7 @@ test_dht_api_LDADD = \
$(top_builddir)/src/hello/libgnunethello.la \
libgnunetdht.la
-test_dht_twopeer_SOURCES = \
- test_dht_topo.c
-test_dht_twopeer_LDADD = \
- libgnunetdhttest.a \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunetdhttest.a \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- libgnunetdht.la
-
-test_dht_2dtorus_SOURCES = \
- test_dht_topo.c
-test_dht_2dtorus_LDADD = \
- libgnunetdhttest.a \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- libgnunetdht.la
-
-test_dht_line_SOURCES = \
- test_dht_topo.c
-test_dht_line_LDADD = \
- libgnunetdhttest.a \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- libgnunetdht.la
-
-test_dht_multipeer_SOURCES = \
- test_dht_topo.c
-test_dht_multipeer_LDADD = \
- libgnunetdhttest.a \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- libgnunetdht.la
-
-test_dht_monitor_SOURCES = \
- test_dht_monitor.c
-test_dht_monitor_LDADD = \
- libgnunetdhttest.a \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- libgnunetdht.la
-
EXTRA_DIST = \
- gnunet-service-dht_clients.c \
- test_dht_api_data.conf \
- test_dht_api_peer1.conf \
- test_dht_monitor.conf \
- test_dht_multipeer.conf \
- test_dht_2dtorus.conf \
- test_dht_line.conf \
- test_dht_tools.conf \
- test_dht_tools.py.in \
- test_dht_multipeer_topology.dat \
dhtu_testbed_connect.sh \
dhtu_testbed_deploy.conf \
dhtu_testbed_deploy.sh
-
-if HAVE_PYTHON
-check_SCRIPTS = \
- test_dht_tools.py
-endif
-
-SUFFIXES = .py.in .py
-.py.in.py:
- $(AWK) -v bdir="$(bindir)" -v py="$(PYTHON)" -v awkay="$(AWK_BINARY)"
-v pfx="$(prefix)" -v prl="$(PERL)" -v sysconfdirectory="$(sysconfdir)" -v
pkgdatadirectory="$(pkgdatadir)" -f $(top_srcdir)/bin/dosubst.awk <
$(srcdir)/$< > $@
- chmod +x $@
diff --git a/src/dhtu/Makefile.am b/src/dhtu/Makefile.am
index 2b0712dcf..732b37ff7 100644
--- a/src/dhtu/Makefile.am
+++ b/src/dhtu/Makefile.am
@@ -33,7 +33,6 @@ endif
libgnunet_plugin_dhtu_gnunet_la_SOURCES = \
plugin_dhtu_gnunet.c
libgnunet_plugin_dhtu_gnunet_la_LIBADD = \
- $(top_builddir)/src/ats/libgnunetats.la \
$(top_builddir)/src/core/libgnunetcore.la \
$(top_builddir)/src/peerstore/libgnunetpeerstore.la \
$(top_builddir)/src/transport/libgnunettransportapplication.la \
diff --git a/src/dhtu/plugin_dhtu_gnunet.c b/src/dhtu/plugin_dhtu_gnunet.c
index aca641d4e..2c1be6e36 100644
--- a/src/dhtu/plugin_dhtu_gnunet.c
+++ b/src/dhtu/plugin_dhtu_gnunet.c
@@ -176,7 +176,7 @@ struct Plugin
};
-#include "../peerinfo-tool/gnunet-peerinfo_plugins.c"
+//#include "../peerinfo-tool/gnunet-peerinfo_plugins.c"
/**
@@ -196,7 +196,7 @@ gnunet_try_connect (void *cls,
char *addr;
const char *eou;
int pfx_len;
-
+
eou = strstr (address,
"://");
if (NULL == eou)
@@ -545,7 +545,7 @@ libgnunet_plugin_dhtu_gnunet_done (void *cls)
GNUNET_PEERSTORE_hello_changed_notify_cancel (plugin->peerstore_notify);
if (NULL != plugin->peerstore)
GNUNET_PEERSTORE_disconnect (plugin->peerstore, GNUNET_YES);
- GPI_plugins_unload ();
+ //GPI_plugins_unload ();
GNUNET_free (plugin->my_priv);
GNUNET_free (plugin);
GNUNET_free (api);
@@ -602,6 +602,6 @@ libgnunet_plugin_dhtu_gnunet_init (void *cls)
libgnunet_plugin_dhtu_gnunet_done (plugin);
return NULL;
}
- GPI_plugins_load (env->cfg);
+ //GPI_plugins_load (env->cfg);
return api;
}
diff --git a/src/fs/Makefile.am b/src/fs/Makefile.am
index 0dd00fec0..046105589 100644
--- a/src/fs/Makefile.am
+++ b/src/fs/Makefile.am
@@ -21,7 +21,7 @@ lib_LTLIBRARIES = libgnunetfs.la
plugin_LTLIBRARIES = \
libgnunet_plugin_block_fs.la
-noinst_LIBRARIES = libgnunetfstest.a
+# noinst_LIBRARIES = libgnunetfstest.a
libgnunetfs_la_SOURCES = \
fs_api.c fs_api.h fs.h \
@@ -59,19 +59,18 @@ libgnunetfs_la_LDFLAGS = \
-version-info 3:1:1
-libgnunetfstest_a_SOURCES = \
- fs_test_lib.c fs_test_lib.h
-
-libgnunetfstest_a_LIBADD = \
- $(top_builddir)/src/testing/libgnunettesting.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la
+#libgnunetfstest_a_SOURCES = \
+# fs_test_lib.c fs_test_lib.h
+#
+#libgnunetfstest_a_LIBADD = \
+# $(top_builddir)/src/testing/libgnunettesting.la \
+# $(top_builddir)/src/testbed/libgnunettestbed.la
libexec_PROGRAMS = \
gnunet-helper-fs-publish \
gnunet-service-fs
noinst_PROGRAMS = \
- gnunet-fs-profiler \
gnunet-daemon-fsprofiler
bin_PROGRAMS = \
@@ -95,13 +94,14 @@ gnunet_directory_LDADD += \
-lextractor
endif
-gnunet_fs_profiler_SOURCES = \
- gnunet-fs-profiler.c
-gnunet_fs_profiler_LDADD = \
- $(top_builddir)/src/testing/libgnunettesting.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(GN_LIBINTL)
+# TNG
+#gnunet_fs_profiler_SOURCES = \
+# gnunet-fs-profiler.c
+#gnunet_fs_profiler_LDADD = \
+# $(top_builddir)/src/testing/libgnunettesting.la \
+# $(top_builddir)/src/testbed/libgnunettestbed.la \
+# $(top_builddir)/src/util/libgnunetutil.la \
+# $(GN_LIBINTL)
gnunet_fs_SOURCES = \
gnunet-fs.c
@@ -196,7 +196,6 @@ gnunet_service_fs_LDADD = \
$(top_builddir)/src/datastore/libgnunetdatastore.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/cadet/libgnunetcadet.la \
- $(top_builddir)/src/ats/libgnunetats.la \
$(top_builddir)/src/core/libgnunetcore.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(top_builddir)/src/peerstore/libgnunetpeerstore.la \
@@ -462,73 +461,74 @@ test_fs_uri_LDADD = \
libgnunetfs.la \
$(top_builddir)/src/util/libgnunetutil.la
-test_fs_test_lib_SOURCES = \
- test_fs_test_lib.c
-test_fs_test_lib_LDADD = \
- libgnunetfstest.a \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- libgnunetfs.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
-test_gnunet_service_fs_p2p_SOURCES = \
- test_gnunet_service_fs_p2p.c
-test_gnunet_service_fs_p2p_LDADD = \
- libgnunetfstest.a \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- libgnunetfs.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
-test_gnunet_service_fs_p2p_cadet_SOURCES = \
- test_gnunet_service_fs_p2p.c
-test_gnunet_service_fs_p2p_cadet_LDADD = \
- libgnunetfstest.a \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- libgnunetfs.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
-test_gnunet_service_fs_migration_SOURCES = \
- test_gnunet_service_fs_migration.c
-test_gnunet_service_fs_migration_LDADD = \
- libgnunetfstest.a \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- libgnunetfs.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
-perf_gnunet_service_fs_p2p_SOURCES = \
- perf_gnunet_service_fs_p2p.c
-perf_gnunet_service_fs_p2p_LDADD = \
- libgnunetfstest.a \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- libgnunetfs.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
-perf_gnunet_service_fs_p2p_index_SOURCES = \
- perf_gnunet_service_fs_p2p.c
-perf_gnunet_service_fs_p2p_index_LDADD = \
- libgnunetfstest.a \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- libgnunetfs.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
-perf_gnunet_service_fs_p2p_dht_SOURCES = \
- perf_gnunet_service_fs_p2p.c
-perf_gnunet_service_fs_p2p_dht_LDADD = \
- libgnunetfstest.a \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- libgnunetfs.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
-perf_gnunet_service_fs_p2p_respect_SOURCES = \
- perf_gnunet_service_fs_p2p_respect.c
-perf_gnunet_service_fs_p2p_respect_LDADD = \
- libgnunetfstest.a \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- libgnunetfs.la \
- $(top_builddir)/src/util/libgnunetutil.la
+# TNG
+#test_fs_test_lib_SOURCES = \
+# test_fs_test_lib.c
+#test_fs_test_lib_LDADD = \
+# libgnunetfstest.a \
+# $(top_builddir)/src/testbed/libgnunettestbed.la \
+# libgnunetfs.la \
+# $(top_builddir)/src/util/libgnunetutil.la
+
+#test_gnunet_service_fs_p2p_SOURCES = \
+# test_gnunet_service_fs_p2p.c
+#test_gnunet_service_fs_p2p_LDADD = \
+# libgnunetfstest.a \
+# $(top_builddir)/src/testbed/libgnunettestbed.la \
+# libgnunetfs.la \
+# $(top_builddir)/src/util/libgnunetutil.la
+#
+#test_gnunet_service_fs_p2p_cadet_SOURCES = \
+# test_gnunet_service_fs_p2p.c
+#test_gnunet_service_fs_p2p_cadet_LDADD = \
+# libgnunetfstest.a \
+# $(top_builddir)/src/testbed/libgnunettestbed.la \
+# libgnunetfs.la \
+# $(top_builddir)/src/util/libgnunetutil.la
+#
+#test_gnunet_service_fs_migration_SOURCES = \
+# test_gnunet_service_fs_migration.c
+#test_gnunet_service_fs_migration_LDADD = \
+# libgnunetfstest.a \
+# $(top_builddir)/src/testbed/libgnunettestbed.la \
+# libgnunetfs.la \
+# $(top_builddir)/src/util/libgnunetutil.la
+#
+#perf_gnunet_service_fs_p2p_SOURCES = \
+# perf_gnunet_service_fs_p2p.c
+#perf_gnunet_service_fs_p2p_LDADD = \
+# libgnunetfstest.a \
+# $(top_builddir)/src/statistics/libgnunetstatistics.la \
+# $(top_builddir)/src/testbed/libgnunettestbed.la \
+# libgnunetfs.la \
+# $(top_builddir)/src/util/libgnunetutil.la
+#
+#perf_gnunet_service_fs_p2p_index_SOURCES = \
+# perf_gnunet_service_fs_p2p.c
+#perf_gnunet_service_fs_p2p_index_LDADD = \
+# libgnunetfstest.a \
+# $(top_builddir)/src/statistics/libgnunetstatistics.la \
+# $(top_builddir)/src/testbed/libgnunettestbed.la \
+# libgnunetfs.la \
+# $(top_builddir)/src/util/libgnunetutil.la
+#
+#perf_gnunet_service_fs_p2p_dht_SOURCES = \
+# perf_gnunet_service_fs_p2p.c
+#perf_gnunet_service_fs_p2p_dht_LDADD = \
+# libgnunetfstest.a \
+# $(top_builddir)/src/statistics/libgnunetstatistics.la \
+# $(top_builddir)/src/testbed/libgnunettestbed.la \
+# libgnunetfs.la \
+# $(top_builddir)/src/util/libgnunetutil.la
+#
+#perf_gnunet_service_fs_p2p_respect_SOURCES = \
+# perf_gnunet_service_fs_p2p_respect.c
+#perf_gnunet_service_fs_p2p_respect_LDADD = \
+# libgnunetfstest.a \
+# $(top_builddir)/src/statistics/libgnunetstatistics.la \
+# $(top_builddir)/src/testbed/libgnunettestbed.la \
+# libgnunetfs.la \
+# $(top_builddir)/src/util/libgnunetutil.la
test_gnunet_fs_psd.py: test_gnunet_fs_psd.py.in Makefile
$(AWK) -v bdir="$(bindir)" -v py="$(PYTHON)" -v awkay="$(AWK_BINARY)"
-v pfx="$(prefix)" -v prl="$(PERL)" -v sysconfdirectory="$(sysconfdir)" -v
pkgdatadirectory="$(pkgdatadir)" -f $(top_srcdir)/bin/dosubst.awk <
$(srcdir)/test_gnunet_fs_psd.py.in > test_gnunet_fs_psd.py
diff --git a/src/hostlist/Makefile.am b/src/hostlist/Makefile.am
index c58147dce..31f2c258d 100644
--- a/src/hostlist/Makefile.am
+++ b/src/hostlist/Makefile.am
@@ -30,7 +30,6 @@ gnunet_daemon_hostlist_LDADD = \
$(top_builddir)/src/hello/libgnunethello.la \
$(top_builddir)/src/peerstore/libgnunetpeerstore.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/transport/libgnunettransport.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(GN_LIBMHD) \
@LIBCURL@ \
@@ -52,25 +51,25 @@ TESTS = \
$(check_PROGRAMS)
endif
-test_gnunet_daemon_hostlist_SOURCES = \
- test_gnunet_daemon_hostlist.c
-test_gnunet_daemon_hostlist_LDADD = \
- $(top_builddir)/src/transport/libgnunettransport.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
-test_gnunet_daemon_hostlist_reconnect_SOURCES = \
- test_gnunet_daemon_hostlist_reconnect.c
-test_gnunet_daemon_hostlist_reconnect_LDADD = \
- $(top_builddir)/src/transport/libgnunettransport.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
-test_gnunet_daemon_hostlist_learning_SOURCES = \
- test_gnunet_daemon_hostlist_learning.c
-test_gnunet_daemon_hostlist_learning_LDADD = \
- $(top_builddir)/src/transport/libgnunettransport.la \
- $(top_builddir)/src/core/libgnunetcore.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la
+#test_gnunet_daemon_hostlist_SOURCES = \
+# test_gnunet_daemon_hostlist.c
+#test_gnunet_daemon_hostlist_LDADD = \
+# $(top_builddir)/src/transport/libgnunettransport.la \
+# $(top_builddir)/src/util/libgnunetutil.la
+#
+#test_gnunet_daemon_hostlist_reconnect_SOURCES = \
+# test_gnunet_daemon_hostlist_reconnect.c
+#test_gnunet_daemon_hostlist_reconnect_LDADD = \
+# $(top_builddir)/src/transport/libgnunettransport.la \
+# $(top_builddir)/src/util/libgnunetutil.la
+#
+#test_gnunet_daemon_hostlist_learning_SOURCES = \
+# test_gnunet_daemon_hostlist_learning.c
+#test_gnunet_daemon_hostlist_learning_LDADD = \
+# $(top_builddir)/src/transport/libgnunettransport.la \
+# $(top_builddir)/src/core/libgnunetcore.la \
+# $(top_builddir)/src/statistics/libgnunetstatistics.la \
+# $(top_builddir)/src/util/libgnunetutil.la
EXTRA_DIST = \
test_hostlist_defaults.conf \
diff --git a/src/nse/Makefile.am b/src/nse/Makefile.am
index 0c6182e61..460e68e02 100644
--- a/src/nse/Makefile.am
+++ b/src/nse/Makefile.am
@@ -36,18 +36,19 @@ libgnunetnse_la_LDFLAGS = \
libexec_PROGRAMS = \
gnunet-service-nse
-noinst_PROGRAMS = \
- gnunet-nse-profiler
-
-gnunet_nse_profiler_SOURCES = \
- gnunet-nse-profiler.c
-gnunet_nse_profiler_LDADD = -lm \
- libgnunetnse.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/testing/libgnunettesting.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- $(GN_LIBINTL)
+#noinst_PROGRAMS = \
+# gnunet-nse-profiler
+
+# FIXME no testbed in TNG
+#gnunet_nse_profiler_SOURCES = \
+# gnunet-nse-profiler.c
+#gnunet_nse_profiler_LDADD = -lm \
+# libgnunetnse.la \
+# $(top_builddir)/src/util/libgnunetutil.la \
+# $(top_builddir)/src/statistics/libgnunetstatistics.la \
+# $(top_builddir)/src/testing/libgnunettesting.la \
+# $(top_builddir)/src/testbed/libgnunettestbed.la \
+# $(GN_LIBINTL)
gnunet_service_nse_SOURCES = \
gnunet-service-nse.c
diff --git a/src/peerinfo-tool/.gitignore b/src/peerinfo-tool/.gitignore
deleted file mode 100644
index d4ed4f801..000000000
--- a/src/peerinfo-tool/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-gnunet-peerinfo
-test_gnunet_peerinfo.py
diff --git a/src/peerinfo-tool/Makefile.am b/src/peerinfo-tool/Makefile.am
deleted file mode 100644
index 825ad5452..000000000
--- a/src/peerinfo-tool/Makefile.am
+++ /dev/null
@@ -1,64 +0,0 @@
-# This Makefile.am is in the public domain
-AM_CPPFLAGS = -I$(top_srcdir)/src/include
-
-if USE_COVERAGE
- AM_CFLAGS = --coverage -O0
- XLIB = -lgcov
-endif
-
-REST_PLUGIN = libgnunet_plugin_rest_peerinfo.la
-
-plugindir = $(libdir)/gnunet
-
-plugin_LTLIBRARIES = $(REST_PLUGIN)
-
-bin_PROGRAMS = \
- gnunet-peerinfo
-
-libgnunet_plugin_rest_peerinfo_la_SOURCES = \
- plugin_rest_peerinfo.c
-libgnunet_plugin_rest_peerinfo_la_LIBADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
- $(top_builddir)/src/transport/libgnunettransport.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/rest/libgnunetrest.la \
- $(top_builddir)/src/json/libgnunetjson.la \
- $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) \
- $(LTLIBINTL) -ljansson $(MHD_LIBS)
-libgnunet_plugin_rest_peerinfo_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-libgnunet_plugin_rest_peerinfo_la_CFLAGS = $(MHD_CFLAGS) $(AM_CFLAGS)
-
-
-gnunet_peerinfo_SOURCES = \
- gnunet-peerinfo.c \
- gnunet-peerinfo_plugins.c gnunet-peerinfo_plugins.h
-gnunet_peerinfo_LDADD = \
- $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
- $(top_builddir)/src/transport/libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la
-gnunet_peerinfo_LDFLAGS = \
- $(GN_LIBINTL)
-
-if HAVE_PYTHON
-check_SCRIPTS = \
- test_gnunet_peerinfo.py
-endif
-
-if ENABLE_TEST_RUN
-AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export
PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;unset XDG_DATA_HOME;unset
XDG_CONFIG_HOME;
-TESTS = $(check_SCRIPTS)
-endif
-
-test_gnunet_peerinfo.py: test_gnunet_peerinfo.py.in Makefile
- $(AWK) -v bdir="$(bindir)" -v py="$(PYTHON)" -v awkay="$(AWK_BINARY)"
-v pfx="$(prefix)" -v prl="$(PERL)" -v sysconfdirectory="$(sysconfdir)" -v
pkgdatadirectory="$(pkgdatadir)" -f $(top_srcdir)/bin/dosubst.awk <
$(srcdir)/test_gnunet_peerinfo.py.in > test_gnunet_peerinfo.py
- chmod +x test_gnunet_peerinfo.py
-
-EXTRA_DIST = \
- test_gnunet_peerinfo.py.in \
- test_gnunet_peerinfo_data.conf
-
-CLEANFILES = $(check_SCRIPTS)
diff --git a/src/peerinfo-tool/gnunet-peerinfo.c
b/src/peerinfo-tool/gnunet-peerinfo.c
deleted file mode 100644
index 8b149c98e..000000000
--- a/src/peerinfo-tool/gnunet-peerinfo.c
+++ /dev/null
@@ -1,864 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2001-2014, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file peerinfo-tool/gnunet-peerinfo.c
- * @brief Print information about other known peers.
- * @author Christian Grothoff
- * @author Matthias Wachs
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_transport_hello_service.h"
-#include "gnunet_peerinfo_service.h"
-#include "gnunet-peerinfo_plugins.h"
-
-/**
- * How long until we time out during address lookup?
- */
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
-
-/**
- * Structure we use to collect printable address information.
- */
-struct PrintContext;
-
-/**
- * Record we keep for each printable address.
- */
-struct AddressRecord
-{
- /**
- * Current address-to-string context (if active, otherwise NULL).
- */
- struct GNUNET_TRANSPORT_AddressToStringContext *atsc;
-
- /**
- * Address expiration time
- */
- struct GNUNET_TIME_Absolute expiration;
-
- /**
- * Printable address.
- */
- char *result;
-
- /**
- * Print context this address record belongs to.
- */
- struct PrintContext *pc;
-};
-
-
-/**
- * Structure we use to collect printable address information.
- */
-struct PrintContext
-{
- /**
- * Kept in DLL.
- */
- struct PrintContext *next;
-
- /**
- * Kept in DLL.
- */
- struct PrintContext *prev;
-
- /**
- * Identity of the peer.
- */
- struct GNUNET_PeerIdentity peer;
-
- /**
- * List of printable addresses.
- */
- struct AddressRecord *address_list;
-
- /**
- * Number of completed addresses in @e address_list.
- */
- unsigned int num_addresses;
-
- /**
- * Number of addresses allocated in @e address_list.
- */
- unsigned int address_list_size;
-
- /**
- * Current offset in @e address_list (counted down).
- */
- unsigned int off;
-
- /**
- * Hello was friend only, #GNUNET_YES or #GNUNET_NO
- */
- int friend_only;
-};
-
-
-/**
- * Option '-n'
- */
-static int no_resolve;
-
-/**
- * Option '-q'
- */
-static int be_quiet;
-
-/**
- * Option '-f'
- */
-static int include_friend_only;
-
-/**
- * Option '-s'
- */
-static int get_self;
-
-/**
- * Option
- */
-static int get_uri;
-
-/**
- * Option
- */
-static int default_operation;
-
-/**
- * Option '-i'
- */
-static int get_info;
-
-/**
- * Option
- */
-static char *put_uri;
-
-/**
- * Option -d
- */
-static char *dump_hello;
-
-/**
- * Handle to peerinfo service.
- */
-static struct GNUNET_PEERINFO_Handle *peerinfo;
-
-/**
- * Configuration handle.
- */
-static const struct GNUNET_CONFIGURATION_Handle *cfg;
-
-/**
- * Main state machine task (if active).
- */
-static struct GNUNET_SCHEDULER_Task *tt;
-
-/**
- * Pending #GNUNET_TRANSPORT_hello_get() operation.
- */
-static struct GNUNET_TRANSPORT_HelloGetHandle *gh;
-
-/**
- * Current iterator context (if active, otherwise NULL).
- */
-static struct GNUNET_PEERINFO_IteratorContext *pic;
-
-/**
- * My peer identity.
- */
-static struct GNUNET_PeerIdentity my_peer_identity;
-
-/**
- * Head of list of print contexts.
- */
-static struct PrintContext *pc_head;
-
-/**
- * Tail of list of print contexts.
- */
-static struct PrintContext *pc_tail;
-
-/**
- * Handle to current #GNUNET_PEERINFO_add_peer() operation.
- */
-static struct GNUNET_MQ_Envelope *ac;
-
-/**
- * Hello of this peer (if initialized).
- */
-static struct GNUNET_HELLO_Message *my_hello;
-
-
-/**
- * Main state machine that goes over all options and
- * runs the next requested function.
- *
- * @param cls unused
- */
-static void
-state_machine (void *cls);
-
-
-/* ********************* 'get_info' ******************* */
-
-/**
- * Print the collected address information to the console and free @a pc.
- *
- * @param pc printing context
- */
-static void
-dump_pc (struct PrintContext *pc)
-{
- unsigned int i;
-
- printf (_ ("%sPeer `%s'\n"),
- (GNUNET_YES == pc->friend_only) ? "F2F: " : "",
- GNUNET_i2s_full (&pc->peer));
- for (i = 0; i < pc->num_addresses; i++)
- {
- if (NULL != pc->address_list[i].result)
- {
- printf (_ ("\tExpires: %s \t %s\n"),
- GNUNET_STRINGS_absolute_time_to_string (
- pc->address_list[i].expiration),
- pc->address_list[i].result);
- GNUNET_free (pc->address_list[i].result);
- }
- }
- printf ("\n");
- GNUNET_free (pc->address_list);
- GNUNET_CONTAINER_DLL_remove (pc_head, pc_tail, pc);
- GNUNET_free (pc);
- if ((NULL == pc_head) && (NULL == pic))
- tt = GNUNET_SCHEDULER_add_now (&state_machine, NULL);
-}
-
-
-/* ************************* list all known addresses **************** */
-
-
-/**
- * Function to call with a human-readable format of an address
- *
- * @param cls closure
- * @param address NULL on error, otherwise 0-terminated printable UTF-8 string
- * @param res result of the address to string conversion:
- * if #GNUNET_OK: address was valid (conversion to
- * string might still have failed)
- * if #GNUNET_SYSERR: address is invalid
- */
-static void
-process_resolved_address (void *cls, const char *address, int res)
-{
- struct AddressRecord *ar = cls;
- struct PrintContext *pc = ar->pc;
-
- if (NULL != address)
- {
- if (0 != strlen (address))
- {
- if (NULL != ar->result)
- GNUNET_free (ar->result);
- ar->result = GNUNET_strdup (address);
- }
- return;
- }
- ar->atsc = NULL;
- if (GNUNET_SYSERR == res)
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ ("Failure: Cannot convert address to string for peer
`%s'\n"),
- GNUNET_i2s (&ar->pc->peer));
- pc->num_addresses++;
- if (pc->num_addresses == pc->address_list_size)
- dump_pc (pc);
-}
-
-
-/**
- * Iterator callback to go over all addresses and count them.
- *
- * @param cls `struct PrintContext *` with `off` to increment
- * @param address the address
- * @param expiration expiration time
- * @return #GNUNET_OK to keep the address and continue
- */
-static int
-count_address (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_TIME_Absolute expiration)
-{
- struct PrintContext *pc = cls;
-
- pc->off++;
- return GNUNET_OK;
-}
-
-
-/**
- * Iterator callback to go over all addresses.
- *
- * @param cls closure
- * @param address the address
- * @param expiration expiration time
- * @return #GNUNET_OK to keep the address and continue
- */
-static int
-print_address (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_TIME_Absolute expiration)
-{
- struct PrintContext *pc = cls;
- struct AddressRecord *ar;
-
- GNUNET_assert (0 < pc->off);
- ar = &pc->address_list[--pc->off];
- ar->pc = pc;
- ar->expiration = expiration;
- GNUNET_asprintf (&ar->result,
- "%s:%lu:%u",
- address->transport_name,
- (unsigned long) address->address_length,
- address->local_info);
- ar->atsc = GNUNET_TRANSPORT_address_to_string (cfg,
- address,
- no_resolve,
- TIMEOUT,
- &process_resolved_address,
- ar);
- return GNUNET_OK;
-}
-
-
-/**
- * Print information about the peer. Currently prints the `struct
- * GNUNET_PeerIdentity` and the transport address.
- *
- * @param cls the `struct PrintContext *`
- * @param peer identity of the peer
- * @param hello addresses of the peer
- * @param err_msg error message
- */
-static void
-print_peer_info (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Message *hello,
- const char *err_msg)
-{
- struct PrintContext *pc;
- int friend_only;
-
- if (NULL == peer)
- {
- pic = NULL; /* end of iteration */
- if (NULL != err_msg)
- {
- fprintf (stderr,
- _ ("Error in communication with PEERINFO service: %s\n"),
- err_msg);
- }
- if (NULL == pc_head)
- tt = GNUNET_SCHEDULER_add_now (&state_machine, NULL);
- return;
- }
- friend_only = GNUNET_NO;
- if (NULL != hello)
- friend_only = GNUNET_HELLO_is_friend_only (hello);
- if ((GNUNET_YES == be_quiet) || (NULL == hello))
- {
- printf ("%s%s\n",
- (GNUNET_YES == friend_only) ? "F2F: " : "",
- GNUNET_i2s_full (peer));
- return;
- }
- pc = GNUNET_new (struct PrintContext);
- GNUNET_CONTAINER_DLL_insert (pc_head, pc_tail, pc);
- pc->peer = *peer;
- pc->friend_only = friend_only;
- GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO, &count_address, pc);
- if (0 == pc->off)
- {
- dump_pc (pc);
- return;
- }
- pc->address_list_size = pc->off;
- pc->address_list = GNUNET_malloc (sizeof(struct AddressRecord) * pc->off);
- GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO, &print_address, pc);
-}
-
-
-/* ************************* DUMP Hello ************************** */
-
-/**
- * Count the number of addresses in the HELLO.
- *
- * @param cls pointer to an `int *` used for the counter
- * @param address an address to count
- * @param expiration (unused)
- * @return #GNUNET_OK
- */
-static int
-count_addr (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_TIME_Absolute expiration)
-{
- int *c = cls;
-
- (*c)++;
- return GNUNET_OK;
-}
-
-
-/**
- * Write HELLO of my peer to a file.
- *
- * @param cls the `struct GetUriContext *`
- * @param peer identity of the peer (unused)
- * @param hello addresses of the peer
- * @param err_msg error message
- */
-static void
-dump_my_hello ()
-{
- unsigned int size;
- unsigned int c_addr;
-
- size = GNUNET_HELLO_size (my_hello);
- if (0 == size)
- {
- fprintf (stderr, _ ("Failure: Received invalid %s\n"), "HELLO");
- return;
- }
- if (GNUNET_SYSERR ==
- GNUNET_DISK_fn_write (dump_hello,
- my_hello,
- size,
- GNUNET_DISK_PERM_USER_READ
- | GNUNET_DISK_PERM_USER_WRITE
- | GNUNET_DISK_PERM_GROUP_READ
- | GNUNET_DISK_PERM_OTHER_READ))
- {
- fprintf (stderr,
- _ ("Failed to write HELLO with %u bytes to file `%s'\n"),
- size,
- dump_hello);
- if (0 != unlink (dump_hello))
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING
- | GNUNET_ERROR_TYPE_BULK,
- "unlink",
- dump_hello);
- }
- c_addr = 0;
- GNUNET_HELLO_iterate_addresses (my_hello, GNUNET_NO, count_addr, &c_addr);
-
- if (! be_quiet)
- {
- fprintf (
- stderr,
- _ ("Wrote %s HELLO containing %u addresses with %u bytes to file
`%s'\n"),
- (GNUNET_YES == GNUNET_HELLO_is_friend_only (my_hello)) ? "friend-only"
- : "public",
- c_addr,
- size,
- dump_hello);
- }
- GNUNET_free (dump_hello);
- dump_hello = NULL;
-}
-
-
-/* ************************* GET URI ************************** */
-
-
-/**
- * Print URI of the peer.
- *
- * @param cls the `struct GetUriContext *`
- * @param peer identity of the peer (unused)
- * @param hello addresses of the peer
- * @param err_msg error message
- */
-static void
-print_my_uri (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Message *hello,
- const char *err_msg)
-{
- char *uri;
-
- if (NULL == peer)
- {
- pic = NULL;
- if (NULL != err_msg)
- fprintf (stderr,
- _ ("Error in communication with PEERINFO service: %s\n"),
- err_msg);
- tt = GNUNET_SCHEDULER_add_now (&state_machine, NULL);
- return;
- }
-
- if (NULL == hello)
- return;
- uri = GNUNET_HELLO_compose_uri (hello, &GPI_plugins_find);
- if (NULL != uri)
- {
- printf ("%s\n", (const char *) uri);
- GNUNET_free (uri);
- }
-}
-
-
-/* ************************* import HELLO by URI ********************* */
-
-
-/**
- * Continuation called from #GNUNET_PEERINFO_add_peer()
- *
- * @param cls closure, NULL
- */
-static void
-add_continuation (void *cls)
-{
- ac = NULL;
- tt = GNUNET_SCHEDULER_add_now (&state_machine, NULL);
-}
-
-
-/**
- * Parse the PUT URI given at the command line and add it to our peerinfo
- * database.
- *
- * @param put_uri URI string to parse
- * @return #GNUNET_OK on success,
- * #GNUNET_SYSERR if the URI was invalid,
- * #GNUNET_NO on other errors
- */
-static int
-parse_hello_uri (const char *put_uri)
-{
- struct GNUNET_HELLO_Message *hello = NULL;
-
- int ret = GNUNET_HELLO_parse_uri (put_uri,
- &my_peer_identity.public_key,
- &hello,
- &GPI_plugins_find);
-
- if (NULL != hello)
- {
- /* WARNING: this adds the address from URI WITHOUT verification! */
- if (GNUNET_OK == ret)
- ac = GNUNET_PEERINFO_add_peer (peerinfo, hello, &add_continuation, NULL);
- else
- tt = GNUNET_SCHEDULER_add_now (&state_machine, NULL);
- GNUNET_free (hello);
- }
- return ret;
-}
-
-
-/* ************************ Main state machine ********************* */
-
-
-/**
- * Main state machine that goes over all options and
- * runs the next requested function.
- *
- * @param cls unused
- */
-static void
-shutdown_task (void *cls)
-{
- struct PrintContext *pc;
- struct AddressRecord *ar;
- unsigned int i;
-
- if (NULL != ac)
- {
- GNUNET_MQ_send_cancel (ac);
- ac = NULL;
- }
- if (NULL != tt)
- {
- GNUNET_SCHEDULER_cancel (tt);
- tt = NULL;
- }
- if (NULL != pic)
- {
- GNUNET_PEERINFO_iterate_cancel (pic);
- pic = NULL;
- }
- if (NULL != gh)
- {
- GNUNET_TRANSPORT_hello_get_cancel (gh);
- gh = NULL;
- }
- while (NULL != (pc = pc_head))
- {
- GNUNET_CONTAINER_DLL_remove (pc_head, pc_tail, pc);
- for (i = 0; i < pc->address_list_size; i++)
- {
- ar = &pc->address_list[i];
- GNUNET_free (ar->result);
- if (NULL != ar->atsc)
- {
- GNUNET_TRANSPORT_address_to_string_cancel (ar->atsc);
- ar->atsc = NULL;
- }
- }
- GNUNET_free (pc->address_list);
- GNUNET_free (pc);
- }
- GPI_plugins_unload ();
- if (NULL != peerinfo)
- {
- GNUNET_PEERINFO_disconnect (peerinfo);
- peerinfo = NULL;
- }
- if (NULL != my_hello)
- {
- GNUNET_free (my_hello);
- my_hello = NULL;
- }
-}
-
-
-/**
- * Function called with our peer's HELLO message.
- * Used to obtain our peer's public key.
- *
- * @param cls NULL
- * @param hello the HELLO message
- */
-static void
-hello_callback (void *cls, const struct GNUNET_MessageHeader *hello)
-{
- if (NULL == hello)
- {
- fprintf (stderr, "Failed to get my own HELLO from this peer!\n");
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
- my_hello = (struct GNUNET_HELLO_Message *) GNUNET_copy_message (hello);
- GNUNET_assert (GNUNET_OK ==
- GNUNET_HELLO_get_id (my_hello, &my_peer_identity));
- GNUNET_TRANSPORT_hello_get_cancel (gh);
- gh = NULL;
- if (NULL != dump_hello)
- dump_my_hello ();
- tt = GNUNET_SCHEDULER_add_now (&state_machine, NULL);
-}
-
-
-/**
- * Main function that will be run by the scheduler.
- *
- * @param cls closure
- * @param args remaining command-line arguments
- * @param cfgfile name of the configuration file used (for saving, can be
NULL!)
- * @param c configuration
- */
-static void
-run (void *cls,
- char *const *args,
- const char *cfgfile,
- const struct GNUNET_CONFIGURATION_Handle *c)
-{
- cfg = c;
- if ((NULL != args[0]) && (NULL == put_uri) &&
- (args[0] == strcasestr (args[0], "gnunet://hello/")))
- {
- put_uri = GNUNET_strdup (args[0]);
- args++;
- }
- if (NULL != args[0])
- {
- fprintf (stderr, _ ("Invalid command line argument `%s'\n"), args[0]);
- return;
- }
- if (NULL == (peerinfo = GNUNET_PEERINFO_connect (cfg)))
- {
- fprintf (stderr, "%s", "Could not access PEERINFO service. Exiting.\n");
- return;
- }
- if ((GNUNET_YES == get_self) || (GNUNET_YES == get_uri) ||
- (NULL != dump_hello))
- {
- gh = GNUNET_TRANSPORT_hello_get (cfg,
- GNUNET_TRANSPORT_AC_ANY,
- &hello_callback,
- NULL);
- }
- else
- {
- tt = GNUNET_SCHEDULER_add_now (&state_machine, NULL);
- }
- GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL);
-}
-
-
-/**
- * Main state machine that goes over all options and
- * runs the next requested function.
- *
- * @param cls unused
- */
-static void
-state_machine (void *cls)
-{
- tt = NULL;
-
- if (NULL != put_uri)
- {
- GPI_plugins_load (cfg);
- if (GNUNET_SYSERR == parse_hello_uri (put_uri))
- {
- fprintf (stderr, _ ("Invalid URI `%s'\n"), put_uri);
- GNUNET_SCHEDULER_shutdown ();
- }
- GNUNET_free (put_uri);
- put_uri = NULL;
- }
- else if (GNUNET_YES == get_info)
- {
- get_info = GNUNET_NO;
- GPI_plugins_load (cfg);
- pic = GNUNET_PEERINFO_iterate (peerinfo,
- include_friend_only,
- NULL,
- &print_peer_info,
- NULL);
- }
- else if (GNUNET_YES == get_self)
- {
- get_self = GNUNET_NO;
- if (be_quiet)
- printf ("%s\n", GNUNET_i2s_full (&my_peer_identity));
- else
- printf (_ ("I am peer `%s'.\n"), GNUNET_i2s_full (&my_peer_identity));
- tt = GNUNET_SCHEDULER_add_now (&state_machine, NULL);
- }
- else if (GNUNET_YES == get_uri)
- {
- GPI_plugins_load (cfg);
- pic = GNUNET_PEERINFO_iterate (peerinfo,
- include_friend_only,
- &my_peer_identity,
- &print_my_uri,
- NULL);
- get_uri = GNUNET_NO;
- }
- else if (GNUNET_YES == default_operation)
- {
- /* default operation list all */
- default_operation = GNUNET_NO;
- get_info = GNUNET_YES;
- tt = GNUNET_SCHEDULER_add_now (&state_machine, NULL);
- }
- else
- {
- GNUNET_SCHEDULER_shutdown ();
- }
- default_operation = GNUNET_NO;
-}
-
-
-/**
- * The main function to obtain peer information.
- *
- * @param argc number of arguments from the command line
- * @param argv command line arguments
- * @return 0 ok, 1 on error
- */
-int
-main (int argc, char *const *argv)
-{
- struct GNUNET_GETOPT_CommandLineOption options[] =
- { GNUNET_GETOPT_option_flag ('n',
- "numeric",
- gettext_noop ("don't resolve host names"),
- &no_resolve),
-
- GNUNET_GETOPT_option_flag ('q',
- "quiet",
- gettext_noop (
- "output only the identity strings"),
- &be_quiet),
- GNUNET_GETOPT_option_flag ('f',
- "friends",
- gettext_noop (
- "include friend-only information"),
- &include_friend_only),
-
- GNUNET_GETOPT_option_flag ('s',
- "self",
- gettext_noop ("output our own identity only"),
- &get_self),
-
- GNUNET_GETOPT_option_flag ('i',
- "info",
- gettext_noop ("list all known peers"),
- &get_info),
-
- GNUNET_GETOPT_option_string ('d',
- "dump-hello",
- NULL,
- gettext_noop ("dump hello to file"),
- &dump_hello),
-
- GNUNET_GETOPT_option_flag ('g',
- "get-hello",
- gettext_noop ("also output HELLO uri(s)"),
- &get_uri),
-
- GNUNET_GETOPT_option_string ('p',
- "put-hello",
- "HELLO",
- gettext_noop (
- "add given HELLO uri to the database"),
- &put_uri),
-
- GNUNET_GETOPT_OPTION_END };
- int ret;
-
- default_operation = GNUNET_YES;
- if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
- return 2;
-
- ret = (GNUNET_OK ==
- GNUNET_PROGRAM_run (argc,
- argv,
- "gnunet-peerinfo",
- gettext_noop ("Print information about peers."),
- options,
- &run,
- NULL))
- ? 0
- : 1;
- GNUNET_free_nz ((void *) argv);
- return ret;
-}
-
-
-/* end of gnunet-peerinfo.c */
diff --git a/src/peerinfo-tool/gnunet-peerinfo_plugins.c
b/src/peerinfo-tool/gnunet-peerinfo_plugins.c
deleted file mode 100644
index e196ec58a..000000000
--- a/src/peerinfo-tool/gnunet-peerinfo_plugins.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010,2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file peerinfo-tool/gnunet-peerinfo_plugins.c
- * @brief plugin management
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet-peerinfo_plugins.h"
-#include "gnunet_transport_plugin.h"
-#include "gnunet_hello_lib.h"
-
-/**
- * Entry in doubly-linked list of all of our plugins.
- */
-struct TransportPlugin
-{
- /**
- * This is a doubly-linked list.
- */
- struct TransportPlugin *next;
-
- /**
- * This is a doubly-linked list.
- */
- struct TransportPlugin *prev;
-
- /**
- * API of the transport as returned by the plugin's
- * initialization function.
- */
- struct GNUNET_TRANSPORT_PluginFunctions *api;
-
- /**
- * Short name for the plugin (e.g. "tcp").
- */
- char *short_name;
-
- /**
- * Name of the library (e.g. "gnunet_plugin_transport_tcp").
- */
- char *lib_name;
-
- /**
- * Environment this transport service is using
- * for this plugin.
- */
- struct GNUNET_TRANSPORT_PluginEnvironment env;
-};
-
-/**
- * Head of DLL of all loaded plugins.
- */
-static struct TransportPlugin *plugins_head;
-
-/**
- * Head of DLL of all loaded plugins.
- */
-static struct TransportPlugin *plugins_tail;
-
-
-/**
- * Load and initialize all plugins. The respective functions will be
- * invoked by the plugins when the respective events happen. The
- * closure will be set to a 'const char*' containing the name of the
- * plugin that caused the call.
- *
- * @param cfg configuration to use
- */
-void
-GPI_plugins_load (const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- struct TransportPlugin *plug;
- struct TransportPlugin *next;
- char *libname;
- char *plugs;
- char *pos;
-
- if (NULL != plugins_head)
- return; /* already loaded */
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_string (cfg, "TRANSPORT", "PLUGINS",
- &plugs))
- return;
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, _ ("Starting transport plugins `%s'\n"),
- plugs);
- for (pos = strtok (plugs, " "); pos != NULL; pos = strtok (NULL, " "))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, _ ("Loading `%s' transport plugin\n"),
- pos);
- GNUNET_asprintf (&libname, "libgnunet_plugin_transport_%s", pos);
- plug = GNUNET_new (struct TransportPlugin);
- plug->short_name = GNUNET_strdup (pos);
- plug->lib_name = libname;
- plug->env.cfg = cfg;
- plug->env.cls = plug->short_name;
- GNUNET_CONTAINER_DLL_insert (plugins_head, plugins_tail, plug);
- }
- GNUNET_free (plugs);
- next = plugins_head;
- while (next != NULL)
- {
- plug = next;
- next = plug->next;
- plug->api = GNUNET_PLUGIN_load (plug->lib_name, &plug->env);
- if (plug->api == NULL)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to load transport plugin for `%s'\n"),
- plug->lib_name);
- GNUNET_CONTAINER_DLL_remove (plugins_head, plugins_tail, plug);
- GNUNET_free (plug->short_name);
- GNUNET_free (plug->lib_name);
- GNUNET_free (plug);
- }
- }
-}
-
-
-/**
- * Unload all plugins
- */
-void
-GPI_plugins_unload ()
-{
- struct TransportPlugin *plug;
-
- while (NULL != (plug = plugins_head))
- {
- GNUNET_break (NULL == GNUNET_PLUGIN_unload (plug->lib_name, plug->api));
- GNUNET_free (plug->lib_name);
- GNUNET_free (plug->short_name);
- GNUNET_CONTAINER_DLL_remove (plugins_head, plugins_tail, plug);
- GNUNET_free (plug);
- }
-}
-
-
-/**
- * Obtain the plugin API based on a plugin name.
- *
- * @param name name of the plugin
- * @return the plugin's API, NULL if the plugin is not loaded
- */
-struct GNUNET_TRANSPORT_PluginFunctions *
-GPI_plugins_find (const char *name)
-{
- struct TransportPlugin *head = plugins_head;
-
- char *stripped = GNUNET_strdup (name);
- char *head_stripped;
- char *sep = strchr (stripped, '_');
-
- if (NULL != sep)
- sep[0] = '\0';
-
- while (head != NULL)
- {
- head_stripped = GNUNET_strdup (head->short_name);
- char *head_sep = strchr (head_stripped, '_');
- if (NULL != head_sep)
- head_sep[0] = '\0';
- if (0 == strcmp (head_stripped, stripped))
- {
- GNUNET_free (head_stripped);
- break;
- }
- GNUNET_free (head_stripped);
- head = head->next;
- }
- GNUNET_free (stripped);
- if (NULL == head)
- return NULL;
- return head->api;
-}
-
-
-/* end of file gnunet-peerinfo_plugins.c */
diff --git a/src/peerinfo-tool/gnunet-peerinfo_plugins.h
b/src/peerinfo-tool/gnunet-peerinfo_plugins.h
deleted file mode 100644
index ed8da87d5..000000000
--- a/src/peerinfo-tool/gnunet-peerinfo_plugins.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010,2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file peerinfo-tool/gnunet-peerinfo_plugins.h
- * @brief plugin management API
- * @author Christian Grothoff
- */
-#ifndef GNUNET_PEERINFO_PLUGINS_H
-#define GNUNET_PEERINFO_PLUGINS_H
-
-#include "gnunet_util_lib.h"
-
-/**
- * Load transport plugins.
- *
- * @param cfg configuration to use
- */
-void
-GPI_plugins_load (const struct GNUNET_CONFIGURATION_Handle *cfg);
-
-
-/**
- * Unload all plugins
- */
-void
-GPI_plugins_unload (void);
-
-
-/**
- * Obtain the plugin API based on a plugin name.
- *
- * @param name name of the plugin
- * @return the plugin's API, NULL if the plugin is not loaded
- */
-struct GNUNET_TRANSPORT_PluginFunctions *
-GPI_plugins_find (const char *name);
-
-
-#endif
-/* end of file gnunet-peerinfo_plugins.h */
diff --git a/src/peerinfo-tool/meson.build b/src/peerinfo-tool/meson.build
deleted file mode 100644
index 2d5386eba..000000000
--- a/src/peerinfo-tool/meson.build
+++ /dev/null
@@ -1,31 +0,0 @@
-gnunetpeerinfotool_src = ['gnunet-peerinfo.c', 'gnunet-peerinfo_plugins.c']
-
-
-if get_option('monolith')
- subdir_done()
-endif
-
-shared_module('gnunet_plugin_rest_peerinfo',
- ['plugin_rest_peerinfo.c'],
- dependencies: [libgnunetrest_dep,
- libgnunetpeerinfo_dep,
- libgnunettransport_dep,
- libgnunethello_dep,
- libgnunetutil_dep,
- json_dep,
- mhd_dep],
- include_directories: [incdir, configuration_inc],
- install: true,
- install_dir: get_option('libdir') / 'gnunet')
-
-
-executable ('gnunet-peerinfo',
- gnunetpeerinfotool_src,
- dependencies: [libgnunetutil_dep,
- libgnunetpeerinfo_dep,
- libgnunettransport_dep,
- libgnunethello_dep,
- libgnunetstatistics_dep],
- include_directories: [incdir, configuration_inc],
- install: true,
- install_dir: get_option('bindir'))
diff --git a/src/peerinfo-tool/plugin_rest_peerinfo.c
b/src/peerinfo-tool/plugin_rest_peerinfo.c
deleted file mode 100644
index 13e2e863b..000000000
--- a/src/peerinfo-tool/plugin_rest_peerinfo.c
+++ /dev/null
@@ -1,842 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2012-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @author Martin Schanzenbach
- * @author Philippe Buschmann
- * @file peerinfo/plugin_rest_peerinfo.c
- * @brief GNUnet Peerinfo REST plugin
- */
-
-#include "platform.h"
-#include "gnunet_rest_plugin.h"
-#include "gnunet_peerinfo_service.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_rest_lib.h"
-#include "gnunet_json_lib.h"
-#include "microhttpd.h"
-#include <jansson.h>
-
-/**
- * Peerinfo Namespace
- */
-#define GNUNET_REST_API_NS_PEERINFO "/peerinfo"
-
-/**
- * Peerinfo parameter peer
- */
-#define GNUNET_REST_PEERINFO_PEER "peer"
-
-/**
- * Peerinfo parameter friend
- */
-#define GNUNET_REST_PEERINFO_FRIEND "friend"
-
-/**
- * Peerinfo parameter array
- */
-#define GNUNET_REST_PEERINFO_ARRAY "array"
-
-/**
- * Error message Unknown Error
- */
-#define GNUNET_REST_PEERINFO_ERROR_UNKNOWN "Unknown Error"
-
-/**
- * How long until we time out during address lookup?
- */
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
-/**
- * The configuration handle
- */
-const struct GNUNET_CONFIGURATION_Handle *cfg;
-
-/**
- * HTTP methods allows for this plugin
- */
-static char *allow_methods;
-
-/**
- * Handle to PEERINFO
- */
-static struct GNUNET_PEERINFO_Handle *peerinfo_handle;
-
-/**
- * @brief struct returned by the initialization function of the plugin
- */
-struct Plugin
-{
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-};
-
-
-/**
- * Record we keep for each printable address.
- */
-struct AddressRecord
-{
- /**
- * Current address-to-string context (if active, otherwise NULL).
- */
- struct GNUNET_TRANSPORT_AddressToStringContext *atsc;
-
- /**
- * Address expiration time
- */
- struct GNUNET_TIME_Absolute expiration;
-
- /**
- * Printable address.
- */
- char *result;
-
- /**
- * Print context this address record belongs to.
- */
- struct PrintContext *pc;
-};
-
-
-/**
- * Structure we use to collect printable address information.
- */
-struct PrintContext
-{
- /**
- * Kept in DLL.
- */
- struct PrintContext *next;
-
- /**
- * Kept in DLL.
- */
- struct PrintContext *prev;
-
- /**
- * Identity of the peer.
- */
- struct GNUNET_PeerIdentity peer;
-
- /**
- * List of printable addresses.
- */
- struct AddressRecord *address_list;
-
- /**
- * Number of completed addresses in @e address_list.
- */
- unsigned int num_addresses;
-
- /**
- * Number of addresses allocated in @e address_list.
- */
- unsigned int address_list_size;
-
- /**
- * Current offset in @e address_list (counted down).
- */
- unsigned int off;
-
- /**
- * Hello was friend only, #GNUNET_YES or #GNUNET_NO
- */
- int friend_only;
-
- /**
- * RequestHandle
- */
- struct RequestHandle *handle;
-};
-
-/**
- * Head of list of print contexts.
- */
-static struct PrintContext *pc_head;
-
-/**
- * Tail of list of print contexts.
- */
-static struct PrintContext *pc_tail;
-
-/**
- * The request handle
- */
-struct RequestHandle
-{
- /**
- * DLL
- */
- struct RequestHandle *next;
-
- /**
- * DLL
- */
- struct RequestHandle *prev;
-
- /**
- * JSON temporary array
- */
- json_t *temp_array;
-
- /**
- * Expiration time string
- */
- char *expiration_str;
-
- /**
- * Address string
- */
- const char *address;
-
- /**
- * Iteration peer public key
- */
- char *pubkey;
-
- /**
- * JSON response
- */
- json_t *response;
-
- /**
- * Handle to PEERINFO it
- */
- struct GNUNET_PEERINFO_IteratorContext *list_it;
-
-
- /**
- * Rest connection
- */
- struct GNUNET_REST_RequestHandle *rest_handle;
-
- /**
- * Desired timeout for the lookup (default is no timeout).
- */
- struct GNUNET_TIME_Relative timeout;
-
- /**
- * ID of a task associated with the resolution process.
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * The plugin result processor
- */
- GNUNET_REST_ResultProcessor proc;
-
- /**
- * The closure of the result processor
- */
- void *proc_cls;
-
- /**
- * The url
- */
- char *url;
-
- /**
- * Error response message
- */
- char *emsg;
-
- /**
- * Response code
- */
- int response_code;
-};
-
-/**
- * DLL
- */
-static struct RequestHandle *requests_head;
-
-/**
- * DLL
- */
-static struct RequestHandle *requests_tail;
-
-/**
- * Cleanup lookup handle
- * @param handle Handle to clean up
- */
-static void
-cleanup_handle (void *cls)
-{
- struct RequestHandle *handle = cls;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Cleaning up\n");
- if (NULL != handle->timeout_task)
- {
- GNUNET_SCHEDULER_cancel (handle->timeout_task);
- handle->timeout_task = NULL;
- }
- if (NULL != handle->url)
- GNUNET_free (handle->url);
- if (NULL != handle->emsg)
- GNUNET_free (handle->emsg);
- if (NULL != handle->address)
- GNUNET_free_nz ((char *) handle->address);
- if (NULL != handle->expiration_str)
- GNUNET_free (handle->expiration_str);
- if (NULL != handle->pubkey)
- GNUNET_free (handle->pubkey);
-
- if (NULL != handle->temp_array)
- {
- json_decref (handle->temp_array);
- handle->temp_array = NULL;
- }
- if (NULL != handle->response)
- {
- json_decref (handle->response);
- handle->response = NULL;
- }
-
- if (NULL != handle->list_it)
- {
- GNUNET_PEERINFO_iterate_cancel (handle->list_it);
- handle->list_it = NULL;
- }
- if (NULL != peerinfo_handle)
- {
- GNUNET_PEERINFO_disconnect (peerinfo_handle);
- peerinfo_handle = NULL;
- }
- GNUNET_CONTAINER_DLL_remove (requests_head,
- requests_tail,
- handle);
- GNUNET_free (handle);
-}
-
-
-/**
- * Task run on errors. Reports an error and cleans up everything.
- *
- * @param cls the `struct RequestHandle`
- */
-static void
-do_error (void *cls)
-{
- struct RequestHandle *handle = cls;
- struct MHD_Response *resp;
- json_t *json_error = json_object ();
- char *response;
-
- if (NULL == handle->emsg)
- handle->emsg = GNUNET_strdup (GNUNET_REST_PEERINFO_ERROR_UNKNOWN);
-
- json_object_set_new (json_error, "error", json_string (handle->emsg));
-
- if (0 == handle->response_code)
- handle->response_code = MHD_HTTP_OK;
- response = json_dumps (json_error, 0);
- resp = GNUNET_REST_create_response (response);
- MHD_add_response_header (resp, "Content-Type", "application/json");
- handle->proc (handle->proc_cls, resp, handle->response_code);
- json_decref (json_error);
- GNUNET_free (response);
- GNUNET_SCHEDULER_add_now (&cleanup_handle, handle);
-}
-
-
-/**
- * Function that assembles the response.
- *
- * @param cls the `struct RequestHandle`
- */
-static void
-peerinfo_list_finished (void *cls)
-{
- struct RequestHandle *handle = cls;
- char *result_str;
- struct MHD_Response *resp;
-
- if (NULL == handle->response)
- {
- handle->response_code = MHD_HTTP_NOT_FOUND;
- handle->emsg = GNUNET_strdup ("No peers found");
- GNUNET_SCHEDULER_add_now (&do_error, handle);
- return;
- }
-
- result_str = json_dumps (handle->response, 0);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Result %s\n", result_str);
- resp = GNUNET_REST_create_response (result_str);
- GNUNET_assert (MHD_NO != MHD_add_response_header (resp,
- "Content-Type",
- "application/json"));
- handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
- GNUNET_free (result_str);
- GNUNET_SCHEDULER_add_now (&cleanup_handle, handle);
-}
-
-
-/**
- * Iterator callback to go over all addresses and count them.
- *
- * @param cls `struct PrintContext *` with `off` to increment
- * @param address the address
- * @param expiration expiration time
- * @return #GNUNET_OK to keep the address and continue
- */
-static int
-count_address (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_TIME_Absolute expiration)
-{
- struct PrintContext *pc = cls;
-
- if (0 == GNUNET_TIME_absolute_get_remaining (expiration).rel_value_us)
- {
- return GNUNET_OK; /* ignore expired address */
- }
-
- pc->off++;
- return GNUNET_OK;
-}
-
-
-/**
- * Print the collected address information to the console and free @a pc.
- *
- * @param pc printing context
- */
-static void
-dump_pc (struct PrintContext *pc)
-{
- struct RequestHandle *handle;
- unsigned int i;
- json_t *response_entry;
- json_t *temp_array;
- json_t *object;
- json_t *address;
- json_t *expires;
- json_t *friend_and_peer_json;
- char *friend_and_peer;
-
- temp_array = json_array ();
- response_entry = json_object ();
-
- for (i = 0; i < pc->num_addresses; i++)
- {
- if (NULL != pc->address_list[i].result)
- {
- object = json_object ();
- address = json_string (pc->address_list[i].result);
- expires = json_string (
- GNUNET_STRINGS_absolute_time_to_string (
- pc->address_list[i].expiration));
- json_object_set (object, "address", address);
- json_object_set (object, "expires", expires);
-
- json_decref (address);
- json_decref (expires);
-
- json_array_append (temp_array, object);
- json_decref (object);
- GNUNET_free (pc->address_list[i].result);
- }
- }
-
- if (0 < json_array_size (temp_array))
- {
- GNUNET_asprintf (&friend_and_peer,
- "%s%s",
- (GNUNET_YES == pc->friend_only) ? "F2F:" : "",
- GNUNET_i2s_full (&pc->peer));
- friend_and_peer_json = json_string (friend_and_peer);
- json_object_set (response_entry,
- GNUNET_REST_PEERINFO_PEER,
- friend_and_peer_json);
- json_object_set (response_entry,
- GNUNET_REST_PEERINFO_ARRAY,
- temp_array);
- json_array_append (pc->handle->response, response_entry);
- json_decref (friend_and_peer_json);
- GNUNET_free (friend_and_peer);
- }
-
- json_decref (temp_array);
- json_decref (response_entry);
-
- GNUNET_free (pc->address_list);
- GNUNET_CONTAINER_DLL_remove (pc_head,
- pc_tail,
- pc);
- handle = pc->handle;
- GNUNET_free (pc);
-
- if ((NULL == pc_head) &&
- (NULL == handle->list_it))
- {
- GNUNET_SCHEDULER_add_now (&peerinfo_list_finished, handle);
- }
-}
-
-
-/**
- * Function to call with a human-readable format of an address
- *
- * @param cls closure
- * @param address NULL on error, otherwise 0-terminated printable UTF-8 string
- * @param res result of the address to string conversion:
- * if #GNUNET_OK: address was valid (conversion to
- * string might still have failed)
- * if #GNUNET_SYSERR: address is invalid
- */
-static void
-process_resolved_address (void *cls,
- const char *address,
- int res)
-{
- struct AddressRecord *ar = cls;
- struct PrintContext *pc = ar->pc;
-
- if (NULL != address)
- {
- if (0 != strlen (address))
- {
- if (NULL != ar->result)
- GNUNET_free (ar->result);
- ar->result = GNUNET_strdup (address);
- }
- return;
- }
- ar->atsc = NULL;
- if (GNUNET_SYSERR == res)
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ ("Failure: Cannot convert address to string for peer
`%s'\n"),
- GNUNET_i2s (&ar->pc->peer));
- pc->num_addresses++;
- if (pc->num_addresses == pc->address_list_size)
- dump_pc (ar->pc);
-}
-
-
-/**
- * Iterator callback to go over all addresses.
- *
- * @param cls closure
- * @param address the address
- * @param expiration expiration time
- * @return #GNUNET_OK to keep the address and continue
- */
-static int
-print_address (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_TIME_Absolute expiration)
-{
- struct PrintContext *pc = cls;
- struct AddressRecord *ar;
-
- if (0 == GNUNET_TIME_absolute_get_remaining (expiration).rel_value_us)
- {
- return GNUNET_OK; /* ignore expired address */
- }
-
- GNUNET_assert (0 < pc->off);
- ar = &pc->address_list[--pc->off];
- ar->pc = pc;
- ar->expiration = expiration;
- GNUNET_asprintf (&ar->result,
- "%s:%lu:%u",
- address->transport_name,
- (unsigned long) address->address_length,
- address->local_info);
- ar->atsc = GNUNET_TRANSPORT_address_to_string (cfg,
- address,
- GNUNET_NO,
- TIMEOUT,
- &process_resolved_address,
- ar);
- return GNUNET_OK;
-}
-
-
-/**
- * Callback that processes each of the known HELLOs for the
- * iteration response construction.
- *
- * @param cls closure, NULL
- * @param peer id of the peer, NULL for last call
- * @param hello hello message for the peer (can be NULL)
- * @param err_msg message
- */
-void
-peerinfo_list_iteration (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Message *hello,
- const char *err_msg)
-{
- struct RequestHandle *handle = cls;
- struct PrintContext *pc;
- int friend_only;
-
- if (NULL == handle->response)
- {
- handle->response = json_array ();
- }
-
- if (NULL == peer)
- {
- handle->list_it = NULL;
- handle->emsg = GNUNET_strdup ("Error in communication with peerinfo");
- if (NULL != err_msg)
- {
- GNUNET_free (handle->emsg);
- handle->emsg = GNUNET_strdup (err_msg);
- handle->response_code = MHD_HTTP_INTERNAL_SERVER_ERROR;
- }
- if (NULL == pc_head)
- GNUNET_SCHEDULER_add_now (&do_error, handle);
- return;
- }
- if (NULL == hello)
- return;
-
- friend_only = GNUNET_NO;
- if (NULL != hello)
- friend_only = GNUNET_HELLO_is_friend_only (hello);
-
- pc = GNUNET_new (struct PrintContext);
- GNUNET_CONTAINER_DLL_insert (pc_head,
- pc_tail,
- pc);
- pc->peer = *peer;
- pc->friend_only = friend_only;
- pc->handle = handle;
- GNUNET_HELLO_iterate_addresses (hello,
- GNUNET_NO,
- &count_address,
- pc);
- if (0 == pc->off)
- {
- dump_pc (pc);
- return;
- }
- pc->address_list_size = pc->off;
- pc->address_list = GNUNET_malloc (
- sizeof(struct AddressRecord) * pc->off);
- GNUNET_HELLO_iterate_addresses (hello,
- GNUNET_NO,
- &print_address,
- pc);
-}
-
-
-/**
- * Handle peerinfo GET request
- *
- * @param con_handle the connection handle
- * @param url the url
- * @param cls the RequestHandle
- */
-void
-peerinfo_get (struct GNUNET_REST_RequestHandle *con_handle,
- const char*url,
- void *cls)
-{
- struct RequestHandle *handle = cls;
- struct GNUNET_HashCode key;
- const struct GNUNET_PeerIdentity *specific_peer;
- // GNUNET_PEER_Id peer_id;
- int include_friend_only;
- char*include_friend_only_str;
-
- include_friend_only = GNUNET_NO;
- GNUNET_CRYPTO_hash (GNUNET_REST_PEERINFO_FRIEND,
- strlen (GNUNET_REST_PEERINFO_FRIEND),
- &key);
- if (GNUNET_YES
- == GNUNET_CONTAINER_multihashmap_contains (con_handle->url_param_map,
- &key))
- {
- include_friend_only_str = GNUNET_CONTAINER_multihashmap_get (
- con_handle->url_param_map, &key);
- if (0 == strcmp (include_friend_only_str, "yes"))
- {
- include_friend_only = GNUNET_YES;
- }
- }
-
- specific_peer = NULL;
- GNUNET_CRYPTO_hash (GNUNET_REST_PEERINFO_PEER,
- strlen (GNUNET_REST_PEERINFO_PEER),
- &key);
- if (GNUNET_YES
- == GNUNET_CONTAINER_multihashmap_contains (con_handle->url_param_map,
- &key))
- {
- // peer_id = *(unsigned int*)GNUNET_CONTAINER_multihashmap_get
(con_handle->url_param_map, &key);
- // specific_peer = GNUNET_PEER_resolve2(peer_id);
- }
-
- handle->list_it = GNUNET_PEERINFO_iterate (peerinfo_handle,
- include_friend_only,
- specific_peer,
- &peerinfo_list_iteration,
- handle);
-}
-
-
-/**
- * Respond to OPTIONS request
- *
- * @param con_handle the connection handle
- * @param url the url
- * @param cls the RequestHandle
- */
-static void
-options_cont (struct GNUNET_REST_RequestHandle *con_handle,
- const char*url,
- void *cls)
-{
- struct MHD_Response *resp;
- struct RequestHandle *handle = cls;
-
- // independent of path return all options
- resp = GNUNET_REST_create_response (NULL);
- MHD_add_response_header (resp,
- "Access-Control-Allow-Methods",
- allow_methods);
- handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
- GNUNET_SCHEDULER_add_now (&cleanup_handle, handle);
- return;
-}
-
-
-/**
- * Function processing the REST call
- *
- * @param method HTTP method
- * @param url URL of the HTTP request
- * @param data body of the HTTP request (optional)
- * @param data_size length of the body
- * @param proc callback function for the result
- * @param proc_cls closure for callback function
- * @return GNUNET_OK if request accepted
- */
-static enum GNUNET_GenericReturnValue
-rest_process_request (struct GNUNET_REST_RequestHandle *rest_handle,
- GNUNET_REST_ResultProcessor proc,
- void *proc_cls)
-{
- struct RequestHandle *handle = GNUNET_new (struct RequestHandle);
- struct GNUNET_REST_RequestHandlerError err;
- static const struct GNUNET_REST_RequestHandler handlers[] = {
- { MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_PEERINFO, &peerinfo_get },
- { MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_PEERINFO, &options_cont },
- GNUNET_REST_HANDLER_END
- };
-
- handle->response_code = 0;
- handle->timeout = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
- 60);
- handle->proc_cls = proc_cls;
- handle->proc = proc;
- handle->rest_handle = rest_handle;
-
- handle->url = GNUNET_strdup (rest_handle->url);
- if (handle->url[strlen (handle->url) - 1] == '/')
- handle->url[strlen (handle->url) - 1] = '\0';
- handle->timeout_task =
- GNUNET_SCHEDULER_add_delayed (handle->timeout,
- &do_error,
- handle);
- GNUNET_CONTAINER_DLL_insert (requests_head,
- requests_tail,
- handle);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connecting...\n");
- if (GNUNET_NO == GNUNET_REST_handle_request (handle->rest_handle,
- handlers,
- &err,
- handle))
- {
- cleanup_handle (handle);
- return GNUNET_NO;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connected\n");
- return GNUNET_YES;
-}
-
-
-/**
- * Entry point for the plugin.
- *
- * @param cls Config info
- * @return NULL on error, otherwise the plugin context
- */
-void *
-libgnunet_plugin_rest_peerinfo_init (void *cls)
-{
- static struct Plugin plugin;
- struct GNUNET_REST_Plugin *api;
-
- cfg = cls;
- if (NULL != plugin.cfg)
- return NULL; /* can only initialize once! */
- memset (&plugin, 0, sizeof(struct Plugin));
- plugin.cfg = cfg;
- api = GNUNET_new (struct GNUNET_REST_Plugin);
- api->cls = &plugin;
- api->name = GNUNET_REST_API_NS_PEERINFO;
- api->process_request = &rest_process_request;
- GNUNET_asprintf (&allow_methods,
- "%s, %s, %s, %s, %s",
- MHD_HTTP_METHOD_GET,
- MHD_HTTP_METHOD_POST,
- MHD_HTTP_METHOD_PUT,
- MHD_HTTP_METHOD_DELETE,
- MHD_HTTP_METHOD_OPTIONS);
- peerinfo_handle = GNUNET_PEERINFO_connect (cfg);
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- _ ("Peerinfo REST API initialized\n"));
- return api;
-}
-
-
-/**
- * Exit point from the plugin.
- *
- * @param cls the plugin context (as returned by "init")
- * @return always NULL
- */
-void *
-libgnunet_plugin_rest_peerinfo_done (void *cls)
-{
- struct GNUNET_REST_Plugin *api = cls;
- struct Plugin *plugin = api->cls;
-
- plugin->cfg = NULL;
- while (NULL != requests_head)
- cleanup_handle (requests_head);
- if (NULL != peerinfo_handle)
- GNUNET_PEERINFO_disconnect (peerinfo_handle);
-
- GNUNET_free (allow_methods);
- GNUNET_free (api);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Peerinfo REST plugin is finished\n");
- return NULL;
-}
-
-
-/* end of plugin_rest_peerinfo.c */
diff --git a/src/peerinfo-tool/test_gnunet_peerinfo.py.in
b/src/peerinfo-tool/test_gnunet_peerinfo.py.in
deleted file mode 100755
index 709556f70..000000000
--- a/src/peerinfo-tool/test_gnunet_peerinfo.py.in
+++ /dev/null
@@ -1,143 +0,0 @@
-#!@PYTHONEXE@
-# This file is part of GNUnet.
-# (C) 2010, 2018 Christian Grothoff (and other contributing authors)
-#
-# GNUnet is free software: you can redistribute it and/or modify it
-# under the terms of the GNU Affero General Public License as published
-# by the Free Software Foundation, either version 3 of the License,
-# or (at your option) any later version.
-#
-# GNUnet is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# SPDX-License-Identifier: AGPL3.0-or-later
-#
-# Testcase for gnunet-peerinfo
-import sys
-import os
-import subprocess
-import re
-import shutil
-import time
-
-srcdir = "../.."
-gnunet_pyexpect_dir = os.path.join(srcdir, "contrib/scripts")
-if gnunet_pyexpect_dir not in sys.path:
- sys.path.append(gnunet_pyexpect_dir)
-
-from gnunet_pyexpect import pexpect
-
-#save LANG and set it to C
-mylang = os.environ.get('LANG')
-os.environ['LANG'] = 'C'
-
-if os.name == 'posix':
- peerinfo = './gnunet-peerinfo'
- gnunetarm = 'gnunet-arm'
- gnunettesting = 'gnunet-testing'
-elif os.name == 'nt':
- peerinfo = './gnunet-peerinfo.exe'
- gnunetarm = 'gnunet-arm.exe'
- gnunettesting = 'gnunet-testing.exe'
-
-pinfo = pexpect()
-
-if os.name == "nt":
- shutil.rmtree(os.path.join(os.getenv("TEMP"), "gnunet-test-peerinfo"),
True)
-else:
- shutil.rmtree("/tmp/gnunet-test-peerinfo", True)
-
-# create hostkey via testing lib # FIXME: The /tmp/ location needs to be
adjusted to the TMP variable!
-hkk = subprocess.Popen([
- gnunettesting, '-n', '1', '-c', 'test_gnunet_peerinfo_data.conf', '-k',
- '/tmp/gnunet-test-peerinfo/.hostkey'
-])
-hkk.communicate()
-
-arm = subprocess.Popen([
- gnunetarm, '-sq', '-c', 'test_gnunet_peerinfo_data.conf'
-])
-arm.communicate()
-
-try:
- pinfo.spawn(
- None, [peerinfo, '-c', 'test_gnunet_peerinfo_data.conf', '-s'],
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT
- )
- pinfo.expect("stdout", re.compile(r'I am peer `.*\'.\r?\n'))
-
- pinfo.spawn(
- None, [peerinfo, '-c', 'test_gnunet_peerinfo_data.conf', '-qs'],
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT
- )
- pinfo.expect(
- "stdout",
- re.
- compile(r'....................................................\r?\n')
- )
-
- pinfo.spawn(
- None, [peerinfo, '-c', 'test_gnunet_peerinfo_data.conf', 'invalid'],
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT
- )
- pinfo.expect(
- "stdout", re.compile(r'Invalid command line argument `invalid\'\r?\n')
- )
-
- arm = subprocess.Popen([
- gnunetarm, '-q', '-i', 'transport', '-c',
- 'test_gnunet_peerinfo_data.conf'
- ])
- arm.communicate()
- time.sleep(1)
-
- pinfo.spawn(
- None, [peerinfo, '-i', '-c', 'test_gnunet_peerinfo_data.conf'],
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT
- )
- pinfo.expect("stdout", re.compile("Peer `.*'\r?\n"))
- m = pinfo.expect("stdout", re.compile("\s.*:24357\r?\n"))
- while len(m.group(0)) > 0:
- m = pinfo.expect("stdout", re.compile("(\s.*:24357\r?\n|\r?\n|)"))
-
- pinfo.spawn(
- None, [peerinfo, '-i', '-c', 'test_gnunet_peerinfo_data.conf', '-n'],
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT
- )
- pinfo.expect("stdout", re.compile("Peer `.*'\r?\n"))
- m = pinfo.expect("stdout", re.compile("\s.*:24357\r?\n"))
- while len(m.group(0)) > 0:
- m = pinfo.expect("stdout", re.compile("(\s.*:24357\r?\n|\r?\n|)"))
-
- pinfo.spawn(
- None, [peerinfo, '-c', 'test_gnunet_peerinfo_data.conf', '-qs'],
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT
- )
- pid = pinfo.read("stdout")
- pid.strip()
-
-finally:
- arm = subprocess.Popen([
- gnunetarm, '-eq', '-c', 'test_gnunet_peerinfo_data.conf'
- ])
- arm.communicate()
- if os.name == "nt":
- shutil.rmtree(
- os.path.join(os.getenv("TEMP"), "gnunet-test-peerinfo"), True
- )
- else:
- shutil.rmtree("/tmp/gnunet-test-peerinfo", True)
- #Reset LANG
- if type(mylang) == str:
- os.environ['LANG'] = mylang
diff --git a/src/peerinfo-tool/test_gnunet_peerinfo_data.conf
b/src/peerinfo-tool/test_gnunet_peerinfo_data.conf
deleted file mode 100644
index d18d3cf96..000000000
--- a/src/peerinfo-tool/test_gnunet_peerinfo_data.conf
+++ /dev/null
@@ -1,13 +0,0 @@
-@INLINE@ ../../contrib/conf/gnunet/no_forcestart.conf
-
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/gnunet-test-peerinfo/
-
-[transport]
-plugins = tcp
-
-[nat]
-RETURN_LOCAL_ADDRESSES = YES
-
-[transport-tcp]
-PORT = 24357
diff --git a/src/peerinfo/.gitignore b/src/peerinfo/.gitignore
deleted file mode 100644
index 152ca2916..000000000
--- a/src/peerinfo/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-gnunet-service-peerinfo
-test_peerinfo_api
-test_peerinfo_api_friend_only
-test_peerinfo_api_notify_friend_only
-test_peerinfo_shipped_hellos
-perf_peerinfo_api
diff --git a/src/peerinfo/Makefile.am b/src/peerinfo/Makefile.am
deleted file mode 100644
index cdab22a9d..000000000
--- a/src/peerinfo/Makefile.am
+++ /dev/null
@@ -1,105 +0,0 @@
-# This Makefile.am is in the public domain
-AM_CPPFLAGS = -I$(top_srcdir)/src/include
-
-pkgcfgdir= $(pkgdatadir)/config.d/
-
-libexecdir= $(pkglibdir)/libexec/
-
-plugindir = $(libdir)/gnunet
-
-pkgcfg_DATA = \
- peerinfo.conf
-
-if USE_COVERAGE
- AM_CFLAGS = --coverage -O0
- XLIB = -lgcov
-endif
-
-lib_LTLIBRARIES = libgnunetpeerinfo.la
-
-
-libgnunetpeerinfo_la_SOURCES = \
- peerinfo_api.c peerinfo.h \
- peerinfo_api_notify.c
-libgnunetpeerinfo_la_LIBADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(XLIB) \
- $(LTLIBINTL)
-libgnunetpeerinfo_la_LDFLAGS = \
- $(GN_LIB_LDFLAGS) \
- -version-info 0:0:0
-
-
-libexec_PROGRAMS = \
- gnunet-service-peerinfo
-
-gnunet_service_peerinfo_SOURCES = \
- gnunet-service-peerinfo.c
-gnunet_service_peerinfo_LDADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la
-gnunet_service_peerinfo_LDFLAGS = \
- $(GN_LIBINTL)
-
-if HAVE_BENCHMARKS
- PEERINFO_BENCHMARKS = \
- perf_peerinfo_api
-endif
-
-check_PROGRAMS = \
- test_peerinfo_shipped_hellos \
- test_peerinfo_api \
- test_peerinfo_api_friend_only \
- test_peerinfo_api_notify_friend_only \
- $(PEERINFO_BENCHMARKS)
-
-
-if ENABLE_TEST_RUN
-AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export
PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;unset XDG_DATA_HOME;unset
XDG_CONFIG_HOME;
-TESTS = $(check_PROGRAMS)
-endif
-
-test_peerinfo_shipped_hellos_SOURCES = \
- test_peerinfo_shipped_hellos.c
-test_peerinfo_shipped_hellos_LDADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- libgnunetpeerinfo.la \
- $(top_builddir)/src/testing/libgnunettesting.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
-test_peerinfo_api_SOURCES = \
- test_peerinfo_api.c
-test_peerinfo_api_LDADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- libgnunetpeerinfo.la \
- $(top_builddir)/src/testing/libgnunettesting.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
-test_peerinfo_api_friend_only_SOURCES = \
- test_peerinfo_api_friend_only.c
-test_peerinfo_api_friend_only_LDADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- libgnunetpeerinfo.la \
- $(top_builddir)/src/testing/libgnunettesting.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
-test_peerinfo_api_notify_friend_only_SOURCES = \
- test_peerinfo_api_notify_friend_only.c
-test_peerinfo_api_notify_friend_only_LDADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- libgnunetpeerinfo.la \
- $(top_builddir)/src/testing/libgnunettesting.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
-perf_peerinfo_api_SOURCES = \
- perf_peerinfo_api.c
-perf_peerinfo_api_LDADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- libgnunetpeerinfo.la \
- $(top_builddir)/src/testing/libgnunettesting.la \
- $(top_builddir)/src/util/libgnunetutil.la
-
-EXTRA_DIST = \
- test_peerinfo_api_data.conf
diff --git a/src/peerinfo/gnunet-service-peerinfo.c
b/src/peerinfo/gnunet-service-peerinfo.c
deleted file mode 100644
index 1b1232ecb..000000000
--- a/src/peerinfo/gnunet-service-peerinfo.c
+++ /dev/null
@@ -1,1370 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2001-2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file peerinfo/gnunet-service-peerinfo.c
- * @brief maintains list of known peers
- *
- * Code to maintain the list of currently known hosts (in memory
- * structure of data/hosts/).
- *
- * @author Christian Grothoff
- */
-
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_statistics_service.h"
-#include "peerinfo.h"
-
-/**
- * How often do we scan the HOST_DIR for new entries?
- */
-#define DATA_HOST_FREQ \
- GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 15)
-
-/**
- * How often do we discard old entries in data/hosts/?
- */
-#define DATA_HOST_CLEAN_FREQ \
- GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 60)
-
-
-/**
- * In-memory cache of known hosts.
- */
-struct HostEntry
-{
- /**
- * Identity of the peer.
- */
- struct GNUNET_PeerIdentity identity;
-
- /**
- * Hello for the peer (can be NULL)
- */
- struct GNUNET_HELLO_Message *hello;
-
- /**
- * Friend only hello for the peer (can be NULL)
- */
- struct GNUNET_HELLO_Message *friend_only_hello;
-};
-
-
-/**
- * Result of reading a file
- */
-struct ReadHostFileContext
-{
- /**
- * Hello for the peer (can be NULL)
- */
- struct GNUNET_HELLO_Message *hello;
-
- /**
- * Friend only hello for the peer (can be NULL)
- */
- struct GNUNET_HELLO_Message *friend_only_hello;
-};
-
-
-/**
- * The in-memory list of known hosts, mapping of
- * host IDs to 'struct HostEntry*' values.
- */
-static struct GNUNET_CONTAINER_MultiPeerMap *hostmap;
-
-/**
- * Clients to immediately notify about all changes.
- */
-static struct GNUNET_NotificationContext *notify_list;
-
-/**
- * Clients to immediately notify about all changes,
- * even for friend-only HELLOs.
- */
-static struct GNUNET_NotificationContext *notify_friend_only_list;
-
-/**
- * Directory where the hellos are stored in (peerinfo/)
- */
-static char *networkIdDirectory;
-
-/**
- * Handle for reporting statistics.
- */
-static struct GNUNET_STATISTICS_Handle *stats;
-
-/**
- * Handle for task to run #cron_clean_data_hosts()
- */
-static struct GNUNET_SCHEDULER_Task *cron_clean;
-
-/**
- * Handle for task to run #cron_scan_directory_data_hosts()
- */
-static struct GNUNET_SCHEDULER_Task *cron_scan;
-
-
-/**
- * Notify all clients in the notify list about the
- * given host entry changing.
- *
- * @param he entry of the host for which we generate a notification
- * @param include_friend_only create public of friend-only message
- * @return generated notification message
- */
-static struct InfoMessage *
-make_info_message (const struct HostEntry *he, int include_friend_only)
-{
- struct InfoMessage *im;
- struct GNUNET_HELLO_Message *src;
- size_t hs;
-
- if (GNUNET_YES == include_friend_only)
- src = he->friend_only_hello;
- else
- src = he->hello;
- hs = (NULL == src) ? 0 : GNUNET_HELLO_size (src);
- im = GNUNET_malloc (sizeof(struct InfoMessage) + hs);
- im->header.size = htons (hs + sizeof(struct InfoMessage));
- im->header.type = htons (GNUNET_MESSAGE_TYPE_PEERINFO_INFO);
- im->peer = he->identity;
- GNUNET_memcpy (&im[1], src, hs);
- return im;
-}
-
-
-/**
- * Address iterator that causes expired entries to be discarded.
- *
- * @param cls pointer to the current time
- * @param address the address
- * @param expiration expiration time for the address
- * @return #GNUNET_NO if expiration smaller than the current time
- */
-static int
-discard_expired (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_TIME_Absolute expiration)
-{
- const struct GNUNET_TIME_Absolute *now = cls;
-
- if (now->abs_value_us > expiration.abs_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ ("Removing expired address of transport `%s'\n"),
- address->transport_name);
- return GNUNET_NO;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Address iterator that counts the remaining addresses.
- *
- * @param cls pointer to the counter
- * @param address the address
- * @param expiration expiration time for the address
- * @return #GNUNET_OK (always)
- */
-static int
-count_addresses (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_TIME_Absolute expiration)
-{
- unsigned int *cnt = cls;
-
- (void) address;
- (void) expiration;
- (*cnt)++;
- return GNUNET_OK;
-}
-
-
-/**
- * Get the filename under which we would store the GNUNET_HELLO_Message
- * for the given host and protocol.
- *
- * @param id peer for which we need the filename for the HELLO
- * @return filename of the form DIRECTORY/HOSTID
- */
-static char *
-get_host_filename (const struct GNUNET_PeerIdentity *id)
-{
- char *fn;
-
- if (NULL == networkIdDirectory)
- return NULL;
- GNUNET_asprintf (&fn,
- "%s%s%s",
- networkIdDirectory,
- DIR_SEPARATOR_STR,
- GNUNET_i2s_full (id));
- return fn;
-}
-
-
-/**
- * Broadcast information about the given entry to all
- * clients that care.
- *
- * @param entry entry to broadcast about
- */
-static void
-notify_all (struct HostEntry *entry)
-{
- struct InfoMessage *msg_pub;
- struct InfoMessage *msg_friend;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Notifying all clients about peer `%s'\n",
- GNUNET_i2s (&entry->identity));
- msg_pub = make_info_message (entry, GNUNET_NO);
- GNUNET_notification_context_broadcast (notify_list,
- &msg_pub->header,
- GNUNET_NO);
- GNUNET_free (msg_pub);
- msg_friend = make_info_message (entry, GNUNET_YES);
- GNUNET_notification_context_broadcast (notify_friend_only_list,
- &msg_friend->header,
- GNUNET_NO);
- GNUNET_free (msg_friend);
-}
-
-
-/**
- * Bind a host address (hello) to a hostId.
- *
- * @param peer the peer for which this is a hello
- * @param hello the verified (!) hello message
- */
-static void
-update_hello (const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Message *hello);
-
-
-/**
- * Try to read the HELLOs in the given filename and discard expired
- * addresses. Removes the file if one the HELLO is malformed. If all
- * addresses are expired, the HELLO is also removed (but the HELLO
- * with the public key is still returned if it was found and valid).
- * The file can contain multiple HELLO messages.
- *
- * @param fn name of the file
- * @param unlink_garbage if #GNUNET_YES, try to remove useless files
- * @param r ReadHostFileContext to store the resutl
- */
-static void
-read_host_file (const char *fn,
- int unlink_garbage,
- struct ReadHostFileContext *r)
-{
- char buffer[GNUNET_MAX_MESSAGE_SIZE - 1] GNUNET_ALIGN;
- ssize_t size_total;
- struct GNUNET_TIME_Absolute now;
- unsigned int left;
- const struct GNUNET_HELLO_Message *hello;
- struct GNUNET_HELLO_Message *hello_clean;
- size_t read_pos;
- uint16_t size_hello;
-
- r->friend_only_hello = NULL;
- r->hello = NULL;
-
- if (GNUNET_YES != GNUNET_DISK_file_test (fn))
- return;
- size_total = GNUNET_DISK_fn_read (fn, buffer, sizeof(buffer));
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Read %d bytes from `%s'\n",
- (int) size_total,
- fn);
- if ((size_total < 0) ||
- (((size_t) size_total) < sizeof(struct GNUNET_MessageHeader)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to parse HELLO in file `%s': %s\n"),
- fn,
- "File has invalid size");
- if ((GNUNET_YES == unlink_garbage) && (0 != unlink (fn)) &&
- (ENOENT != errno))
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", fn);
- return;
- }
-
- read_pos = 0;
- while (read_pos < (size_t) size_total)
- {
- hello = (const struct GNUNET_HELLO_Message *) &buffer[read_pos];
- size_hello = GNUNET_HELLO_size (hello);
- if ((0 == size_hello) || (((size_t) size_total) - read_pos < size_hello))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to parse HELLO in file `%s'\n"),
- fn);
- if (0 == read_pos)
- {
- if ((GNUNET_YES == unlink_garbage) && (0 != unlink (fn)) &&
- (ENOENT != errno))
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", fn);
- }
- else
- {
- if ((GNUNET_YES == unlink_garbage) && (0 != truncate (fn, read_pos)) &&
- (ENOENT != errno))
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "truncate", fn);
- }
- return;
- }
-
- now = GNUNET_TIME_absolute_get ();
- hello_clean = GNUNET_HELLO_iterate_addresses (hello,
- GNUNET_YES,
- &discard_expired,
- &now);
- if (NULL == hello_clean)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to parse HELLO in file `%s'\n"),
- fn);
- if ((GNUNET_YES == unlink_garbage) && (0 != unlink (fn)) &&
- (ENOENT != errno))
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", fn);
- return;
- }
- left = 0;
- (void) GNUNET_HELLO_iterate_addresses (hello_clean,
- GNUNET_NO,
- &count_addresses,
- &left);
-
- if (0 == left)
- {
- GNUNET_free (hello_clean);
- break;
- }
-
- if (GNUNET_NO == GNUNET_HELLO_is_friend_only (hello_clean))
- {
- if (NULL == r->hello)
- r->hello = hello_clean;
- else
- {
- GNUNET_break (0);
- GNUNET_free (r->hello);
- r->hello = hello_clean;
- }
- }
- else
- {
- if (NULL == r->friend_only_hello)
- r->friend_only_hello = hello_clean;
- else
- {
- GNUNET_break (0);
- GNUNET_free (r->friend_only_hello);
- r->friend_only_hello = hello_clean;
- }
- }
- read_pos += size_hello;
- }
-
- if (0 == left)
- {
- /* no addresses left, remove from disk */
- if ((GNUNET_YES == unlink_garbage) && (0 != unlink (fn)))
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", fn);
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Found `%s' and `%s' HELLO message in file\n",
- (NULL != r->hello) ? "public" : "NON-public",
- (NULL != r->friend_only_hello) ? "friend only"
- : "NO friend only");
-}
-
-
-/**
- * Add a host to the list and notify clients about this event
- *
- * @param identity the identity of the host
- * @return the HostEntry
- */
-static struct HostEntry *
-add_host_to_known_hosts (const struct GNUNET_PeerIdentity *identity)
-{
- struct HostEntry *entry;
- struct ReadHostFileContext r;
- char *fn;
-
- entry = GNUNET_CONTAINER_multipeermap_get (hostmap, identity);
- if (NULL == entry)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Adding new peer `%s'\n",
- GNUNET_i2s (identity));
- GNUNET_STATISTICS_update (stats,
- gettext_noop ("# peers known"),
- 1,
- GNUNET_NO);
- entry = GNUNET_new (struct HostEntry);
- entry->identity = *identity;
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_put (
- hostmap,
- &entry->identity,
- entry,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
- notify_all (entry);
- fn = get_host_filename (identity);
- if (NULL != fn)
- {
- read_host_file (fn, GNUNET_YES, &r);
- if (NULL != r.hello)
- update_hello (identity, r.hello);
- if (NULL != r.friend_only_hello)
- update_hello (identity, r.friend_only_hello);
- GNUNET_free (r.hello);
- GNUNET_free (r.friend_only_hello);
- GNUNET_free (fn);
- }
- }
- return entry;
-}
-
-
-/**
- * Remove a file that should not be there. LOG
- * success or failure.
- *
- * @param fullname name of the file to remove
- */
-static void
-remove_garbage (const char *fullname)
-{
- if (0 == unlink (fullname))
- GNUNET_log (
- GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
- _ (
- "File `%s' in directory `%s' does not match naming convention.
Removed.\n"),
- fullname,
- networkIdDirectory);
- else
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
- "unlink",
- fullname);
-}
-
-
-/**
- * Closure for #hosts_directory_scan_callback().
- */
-struct DirScanContext
-{
- /**
- * #GNUNET_YES if we should remove files that are broken,
- * #GNUNET_NO if the directory we are iterating over should
- * be treated as read-only by us.
- */
- int remove_files;
-
- /**
- * Counter for the number of (valid) entries found, incremented
- * by one for each match.
- */
- unsigned int matched;
-};
-
-
-/**
- * Function that is called on each HELLO file in a particular directory.
- * Try to parse the file and add the HELLO to our list.
- *
- * @param cls pointer to 'unsigned int' to increment for each file, or NULL
- * if the file is from a read-only, read-once resource directory
- * @param fullname name of the file to parse
- * @return #GNUNET_OK (continue iteration)
- */
-static int
-hosts_directory_scan_callback (void *cls, const char *fullname)
-{
- struct DirScanContext *dsc = cls;
- struct GNUNET_PeerIdentity identity;
- struct ReadHostFileContext r;
- const char *filename;
- struct GNUNET_PeerIdentity id_public;
- struct GNUNET_PeerIdentity id_friend;
- struct GNUNET_PeerIdentity id;
-
- if (GNUNET_YES != GNUNET_DISK_file_test (fullname))
- return GNUNET_OK; /* ignore non-files */
-
- filename = strrchr (fullname, DIR_SEPARATOR);
- if ((NULL == filename) || (1 > strlen (filename)))
- filename = fullname;
- else
- filename++;
-
- read_host_file (fullname, dsc->remove_files, &r);
- if ((NULL == r.hello) && (NULL == r.friend_only_hello))
- return GNUNET_OK;
- if (NULL != r.friend_only_hello)
- {
- if (GNUNET_OK != GNUNET_HELLO_get_id (r.friend_only_hello, &id_friend))
- {
- if (GNUNET_YES == dsc->remove_files)
- remove_garbage (fullname);
- return GNUNET_OK;
- }
- id = id_friend;
- }
- if (NULL != r.hello)
- {
- if (GNUNET_OK != GNUNET_HELLO_get_id (r.hello, &id_public))
- {
- if (GNUNET_YES == dsc->remove_files)
- remove_garbage (fullname);
- return GNUNET_OK;
- }
- id = id_public;
- }
-
- if ((NULL != r.hello) && (NULL != r.friend_only_hello) &&
- (0 != GNUNET_memcmp (&id_friend, &id_public)))
- {
- /* HELLOs are not for the same peer */
- GNUNET_break (0);
- if (GNUNET_YES == dsc->remove_files)
- remove_garbage (fullname);
- return GNUNET_OK;
- }
- if (GNUNET_OK ==
- GNUNET_CRYPTO_eddsa_public_key_from_string (filename,
- strlen (filename),
- &identity.public_key))
- {
- if (0 != GNUNET_memcmp (&id, &identity))
- {
- /* HELLOs are not for the same peer */
- GNUNET_break (0);
- if (GNUNET_YES == dsc->remove_files)
- remove_garbage (fullname);
- return GNUNET_OK;
- }
- }
-
- /* ok, found something valid, remember HELLO */
- add_host_to_known_hosts (&id);
- if (NULL != r.hello)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Updating peer `%s' public HELLO \n",
- GNUNET_i2s (&id));
- update_hello (&id, r.hello);
- GNUNET_free (r.hello);
- }
- if (NULL != r.friend_only_hello)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Updating peer `%s' friend only HELLO \n",
- GNUNET_i2s (&id));
- update_hello (&id, r.friend_only_hello);
- GNUNET_free (r.friend_only_hello);
- }
- dsc->matched++;
- return GNUNET_OK;
-}
-
-
-/**
- * Call this method periodically to scan data/hosts for new hosts.
- *
- * @param cls unused
- */
-static void
-cron_scan_directory_data_hosts (void *cls)
-{
- static unsigned int retries;
- struct DirScanContext dsc;
-
- (void) cls;
- cron_scan = NULL;
- if (GNUNET_SYSERR == GNUNET_DISK_directory_create (networkIdDirectory))
- {
- cron_scan =
- GNUNET_SCHEDULER_add_delayed_with_priority (DATA_HOST_FREQ,
-
GNUNET_SCHEDULER_PRIORITY_IDLE,
- &
-
cron_scan_directory_data_hosts,
- NULL);
- return;
- }
- dsc.matched = 0;
- dsc.remove_files = GNUNET_YES;
- GNUNET_log (GNUNET_ERROR_TYPE_INFO | GNUNET_ERROR_TYPE_BULK,
- _ ("Scanning directory `%s'\n"),
- networkIdDirectory);
- GNUNET_DISK_directory_scan (networkIdDirectory,
- &hosts_directory_scan_callback,
- &dsc);
- if ((0 == dsc.matched) && (0 == (++retries & 31)))
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
- _ ("Still no peers found in `%s'!\n"),
- networkIdDirectory);
- cron_scan =
- GNUNET_SCHEDULER_add_delayed_with_priority (DATA_HOST_FREQ,
- GNUNET_SCHEDULER_PRIORITY_IDLE,
-
&cron_scan_directory_data_hosts,
- NULL);
-}
-
-
-/**
- * Update the HELLO of a friend by merging the addresses.
- *
- * @param hello original hello
- * @param friend_hello hello with additional addresses
- * @return merged HELLO
- */
-static struct GNUNET_HELLO_Message *
-update_friend_hello (const struct GNUNET_HELLO_Message *hello,
- const struct GNUNET_HELLO_Message *friend_hello)
-{
- struct GNUNET_HELLO_Message *res;
- struct GNUNET_HELLO_Message *tmp;
- struct GNUNET_PeerIdentity pid;
-
- if (NULL != friend_hello)
- {
- res = GNUNET_HELLO_merge (hello, friend_hello);
- GNUNET_assert (GNUNET_YES == GNUNET_HELLO_is_friend_only (res));
- return res;
- }
-
- if (GNUNET_OK != GNUNET_HELLO_get_id (hello, &pid))
- {
- GNUNET_break (0);
- return NULL;
- }
- tmp = GNUNET_HELLO_create (&pid.public_key, NULL, NULL, GNUNET_YES);
- res = GNUNET_HELLO_merge (hello, tmp);
- GNUNET_free (tmp);
- GNUNET_assert (GNUNET_YES == GNUNET_HELLO_is_friend_only (res));
- return res;
-}
-
-
-/**
- * Bind a host address (hello) to a hostId.
- *
- * @param peer the peer for which this is a hello
- * @param hello the verified (!) hello message
- */
-static void
-update_hello (const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Message *hello)
-{
- char *fn;
- struct HostEntry *host;
- struct GNUNET_HELLO_Message *mrg;
- struct GNUNET_HELLO_Message **dest;
- struct GNUNET_TIME_Absolute delta;
- unsigned int cnt;
- unsigned int size;
- int friend_hello_type;
- int store_hello;
- int store_friend_hello;
- unsigned int pos;
- char *buffer;
-
- host = GNUNET_CONTAINER_multipeermap_get (hostmap, peer);
- GNUNET_assert (NULL != host);
-
- friend_hello_type = GNUNET_HELLO_is_friend_only (hello);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Updating %s HELLO for `%s'\n",
- (GNUNET_YES == friend_hello_type) ? "friend-only" : "public",
- GNUNET_i2s (peer));
-
- dest = NULL;
- if (GNUNET_YES == friend_hello_type)
- {
- dest = &host->friend_only_hello;
- }
- else
- {
- dest = &host->hello;
- }
-
- if (NULL == (*dest))
- {
- (*dest) = GNUNET_malloc (GNUNET_HELLO_size (hello));
- GNUNET_memcpy ((*dest), hello, GNUNET_HELLO_size (hello));
- }
- else
- {
- mrg = GNUNET_HELLO_merge ((*dest), hello);
- delta = GNUNET_HELLO_equals (mrg, (*dest), GNUNET_TIME_absolute_get ());
- if (delta.abs_value_us == GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us)
- {
- /* no differences, just ignore the update */
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "No change in %s HELLO for `%s'\n",
- (GNUNET_YES == friend_hello_type) ? "friend-only" : "public",
- GNUNET_i2s (peer));
- GNUNET_free (mrg);
- return;
- }
- GNUNET_free ((*dest));
- (*dest) = mrg;
- }
-
- if ((NULL != (host->hello)) && (GNUNET_NO == friend_hello_type))
- {
- /* Update friend only hello */
- mrg = update_friend_hello (host->hello, host->friend_only_hello);
- if (NULL != host->friend_only_hello)
- GNUNET_free (host->friend_only_hello);
- host->friend_only_hello = mrg;
- }
-
- if (NULL != host->hello)
- GNUNET_assert ((GNUNET_NO == GNUNET_HELLO_is_friend_only (host->hello)));
- if (NULL != host->friend_only_hello)
- GNUNET_assert (
- (GNUNET_YES == GNUNET_HELLO_is_friend_only (host->friend_only_hello)));
-
- fn = get_host_filename (peer);
- if ((NULL != fn) && (GNUNET_OK == GNUNET_DISK_directory_create_for_file
(fn)))
- {
- store_hello = GNUNET_NO;
- size = 0;
- cnt = 0;
- if (NULL != host->hello)
- (void) GNUNET_HELLO_iterate_addresses (host->hello,
- GNUNET_NO,
- &count_addresses,
- &cnt);
- if (cnt > 0)
- {
- store_hello = GNUNET_YES;
- size += GNUNET_HELLO_size (host->hello);
- }
- cnt = 0;
- if (NULL != host->friend_only_hello)
- (void) GNUNET_HELLO_iterate_addresses (host->friend_only_hello,
- GNUNET_NO,
- &count_addresses,
- &cnt);
- store_friend_hello = GNUNET_NO;
- if (0 < cnt)
- {
- store_friend_hello = GNUNET_YES;
- size += GNUNET_HELLO_size (host->friend_only_hello);
- }
-
- if ((GNUNET_NO == store_hello) && (GNUNET_NO == store_friend_hello))
- {
- /* no valid addresses, don't put HELLO on disk; in fact,
- if one exists on disk, remove it */
- (void) unlink (fn);
- }
- else
- {
- buffer = GNUNET_malloc (size);
- pos = 0;
-
- if (GNUNET_YES == store_hello)
- {
- GNUNET_memcpy (buffer, host->hello, GNUNET_HELLO_size (host->hello));
- pos += GNUNET_HELLO_size (host->hello);
- }
- if (GNUNET_YES == store_friend_hello)
- {
- GNUNET_memcpy (&buffer[pos],
- host->friend_only_hello,
- GNUNET_HELLO_size (host->friend_only_hello));
- pos += GNUNET_HELLO_size (host->friend_only_hello);
- }
- GNUNET_assert (pos == size);
-
- if (GNUNET_SYSERR ==
- GNUNET_DISK_fn_write (fn,
- buffer,
- size,
- GNUNET_DISK_PERM_USER_READ
- | GNUNET_DISK_PERM_USER_WRITE
- | GNUNET_DISK_PERM_GROUP_READ
- | GNUNET_DISK_PERM_OTHER_READ))
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "write", fn);
- else
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Stored %s %s HELLO in %s with total size %u\n",
- (GNUNET_YES == store_friend_hello) ? "friend-only" : "",
- (GNUNET_YES == store_hello) ? "public" : "",
- fn,
- size);
- GNUNET_free (buffer);
- }
- }
- GNUNET_free (fn);
- notify_all (host);
-}
-
-
-/**
- * Closure for #add_to_tc()
- */
-struct TransmitContext
-{
- /**
- * Client to transmit to
- */
- struct GNUNET_SERVICE_Client *client;
-
- /**
- * Include friend only HELLOs #GNUNET_YES or #GNUNET_NO
- */
- int friend_only;
-};
-
-
-/**
- * Do transmit info about peer to given host.
- *
- * @param cls NULL to hit all hosts, otherwise specifies a particular target
- * @param key hostID
- * @param value information to transmit
- * @return #GNUNET_YES (continue to iterate)
- */
-static int
-add_to_tc (void *cls, const struct GNUNET_PeerIdentity *key, void *value)
-{
- struct TransmitContext *tc = cls;
- struct HostEntry *pos = value;
- struct InfoMessage *im;
- uint16_t hs;
- struct GNUNET_MQ_Envelope *env;
-
- hs = 0;
-
- if ((NULL != pos->hello) && (GNUNET_NO == tc->friend_only))
- {
- /* Copy public HELLO */
- hs = GNUNET_HELLO_size (pos->hello);
- GNUNET_assert (hs < GNUNET_MAX_MESSAGE_SIZE - sizeof(struct InfoMessage));
- env = GNUNET_MQ_msg_extra (im, hs, GNUNET_MESSAGE_TYPE_PEERINFO_INFO);
- GNUNET_memcpy (&im[1], pos->hello, hs);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Sending public HELLO with size %u for peer `%s'\n",
- hs,
- GNUNET_i2s (key));
- }
- else if ((NULL != pos->friend_only_hello) && (GNUNET_YES == tc->friend_only))
- {
- /* Copy friend only HELLO */
- hs = GNUNET_HELLO_size (pos->friend_only_hello);
- GNUNET_assert (hs < GNUNET_MAX_MESSAGE_SIZE - sizeof(struct InfoMessage));
- env = GNUNET_MQ_msg_extra (im, hs, GNUNET_MESSAGE_TYPE_PEERINFO_INFO);
- GNUNET_memcpy (&im[1], pos->friend_only_hello, hs);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Sending friend-only HELLO with size %u for peer `%s'\n",
- hs,
- GNUNET_i2s (key));
- }
- else
- {
- env = GNUNET_MQ_msg (im, GNUNET_MESSAGE_TYPE_PEERINFO_INFO);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Adding no HELLO for peer `%s'\n",
- GNUNET_i2s (key));
- }
- im->peer = pos->identity;
- GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (tc->client), env);
- return GNUNET_YES;
-}
-
-
-/**
- * @brief delete expired HELLO entries in directory
- *
- * @param cls pointer to current time (`struct GNUNET_TIME_Absolute *`)
- * @param fn filename to test to see if the HELLO expired
- * @return #GNUNET_OK (continue iteration)
- */
-static int
-discard_hosts_helper (void *cls, const char *fn)
-{
- struct GNUNET_TIME_Absolute *now = cls;
- char buffer[GNUNET_MAX_MESSAGE_SIZE - 1] GNUNET_ALIGN;
- const struct GNUNET_HELLO_Message *hello;
- struct GNUNET_HELLO_Message *new_hello;
- int read_size;
- unsigned int cur_hello_size;
- unsigned int new_hello_size;
- int read_pos;
- int write_pos;
- unsigned int cnt;
- char *writebuffer;
- uint64_t fsize;
-
- if (GNUNET_OK != GNUNET_DISK_file_size (fn, &fsize, GNUNET_YES, GNUNET_YES))
- {
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING
- | GNUNET_ERROR_TYPE_BULK,
- "fstat",
- fn);
- return GNUNET_OK;
- }
- read_size = GNUNET_DISK_fn_read (fn, buffer, sizeof(buffer));
-
- if ((read_size < (int) sizeof(struct GNUNET_MessageHeader)) ||
- (fsize > GNUNET_MAX_MESSAGE_SIZE))
- {
- if (0 != unlink (fn))
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING
- | GNUNET_ERROR_TYPE_BULK,
- "unlink",
- fn);
- return GNUNET_OK;
- }
-
- writebuffer = GNUNET_malloc (read_size);
- read_pos = 0;
- write_pos = 0;
- while (read_pos < read_size)
- {
- /* Check each HELLO */
- hello = (const struct GNUNET_HELLO_Message *) &buffer[read_pos];
- cur_hello_size = GNUNET_HELLO_size (hello);
- if (0 == cur_hello_size)
- {
- /* Invalid data, discard */
- if (0 != unlink (fn))
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING
- | GNUNET_ERROR_TYPE_BULK,
- "unlink",
- fn);
- GNUNET_free (writebuffer);
- return GNUNET_OK;
- }
- new_hello =
- GNUNET_HELLO_iterate_addresses (hello, GNUNET_YES, &discard_expired,
now);
- cnt = 0;
- if (NULL != new_hello)
- (void) GNUNET_HELLO_iterate_addresses (hello,
- GNUNET_NO,
- &count_addresses,
- &cnt);
- if ((NULL != new_hello) && (0 < cnt))
- {
- /* Store new HELLO to write it when done */
- new_hello_size = GNUNET_HELLO_size (new_hello);
- GNUNET_memcpy (&writebuffer[write_pos], new_hello, new_hello_size);
- write_pos += new_hello_size;
- }
- read_pos += cur_hello_size;
- GNUNET_free (new_hello);
- }
-
- if (0 < write_pos)
- {
- (void) GNUNET_DISK_directory_remove (fn);
- GNUNET_assert (GNUNET_OK ==
- GNUNET_DISK_fn_write (fn,
- writebuffer,
- write_pos,
- GNUNET_DISK_PERM_USER_READ
- | GNUNET_DISK_PERM_USER_WRITE
- | GNUNET_DISK_PERM_GROUP_READ
- | GNUNET_DISK_PERM_OTHER_READ));
- }
- else if (0 != unlink (fn))
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING
- | GNUNET_ERROR_TYPE_BULK,
- "unlink",
- fn);
-
- GNUNET_free (writebuffer);
- return GNUNET_OK;
-}
-
-
-/**
- * Call this method periodically to scan peerinfo/ for ancient
- * HELLOs to expire.
- *
- * @param cls unused
- */
-static void
-cron_clean_data_hosts (void *cls)
-{
- struct GNUNET_TIME_Absolute now;
-
- (void) cls;
- cron_clean = NULL;
- now = GNUNET_TIME_absolute_get ();
- GNUNET_log (GNUNET_ERROR_TYPE_INFO | GNUNET_ERROR_TYPE_BULK,
- _ ("Cleaning up directory `%s'\n"),
- networkIdDirectory);
- GNUNET_DISK_directory_scan (networkIdDirectory, &discard_hosts_helper, &now);
- cron_clean = GNUNET_SCHEDULER_add_delayed (DATA_HOST_CLEAN_FREQ,
- &cron_clean_data_hosts,
- NULL);
-}
-
-
-/**
- * Check HELLO-message.
- *
- * @param cls identification of the client
- * @param hello the actual message
- * @return #GNUNET_OK if @a hello is well-formed
- */
-static int
-check_hello (void *cls, const struct GNUNET_HELLO_Message *hello)
-{
- struct GNUNET_PeerIdentity pid;
-
- (void) cls;
- if (GNUNET_OK != GNUNET_HELLO_get_id (hello, &pid))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Handle HELLO-message.
- *
- * @param cls identification of the client
- * @param hello the actual message
- */
-static void
-handle_hello (void *cls, const struct GNUNET_HELLO_Message *hello)
-{
- struct GNUNET_SERVICE_Client *client = cls;
- struct GNUNET_PeerIdentity pid;
-
- GNUNET_assert (GNUNET_OK == GNUNET_HELLO_get_id (hello, &pid));
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "HELLO message received for peer `%s'\n",
- GNUNET_i2s (&pid));
- add_host_to_known_hosts (&pid);
- update_hello (&pid, hello);
- GNUNET_SERVICE_client_continue (client);
-}
-
-
-/**
- * Handle GET-message.
- *
- * @param cls identification of the client
- * @param lpm the actual message
- */
-static void
-handle_get (void *cls, const struct ListPeerMessage *lpm)
-{
- struct GNUNET_SERVICE_Client *client = cls;
- struct TransmitContext tcx;
- struct GNUNET_MessageHeader *msg;
- struct GNUNET_MQ_Envelope *env;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "GET message received for peer `%s'\n",
- GNUNET_i2s (&lpm->peer));
- tcx.friend_only = ntohl (lpm->include_friend_only);
- tcx.client = client;
- GNUNET_CONTAINER_multipeermap_get_multiple (hostmap,
- &lpm->peer,
- &add_to_tc,
- &tcx);
- env = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_PEERINFO_INFO_END);
- GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), env);
- GNUNET_SERVICE_client_continue (client);
-}
-
-
-/**
- * Handle GET-ALL-message.
- *
- * @param cls identification of the client
- * @param lapm the actual message
- */
-static void
-handle_get_all (void *cls, const struct ListAllPeersMessage *lapm)
-{
- struct GNUNET_SERVICE_Client *client = cls;
- struct TransmitContext tcx;
- struct GNUNET_MQ_Envelope *env;
- struct GNUNET_MessageHeader *msg;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "GET_ALL message received\n");
- tcx.friend_only = ntohl (lapm->include_friend_only);
- tcx.client = client;
- GNUNET_CONTAINER_multipeermap_iterate (hostmap, &add_to_tc, &tcx);
- env = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_PEERINFO_INFO_END);
- GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), env);
- GNUNET_SERVICE_client_continue (client);
-}
-
-
-/**
- * Handle NOTIFY-message.
- *
- * @param cls identification of the client
- * @param nm the actual message
- */
-static void
-handle_notify (void *cls, const struct NotifyMessage *nm)
-{
- struct GNUNET_SERVICE_Client *client = cls;
- struct GNUNET_MQ_Handle *mq;
- struct TransmitContext tcx;
- struct GNUNET_MQ_Envelope *env;
- struct GNUNET_MessageHeader *msg;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "NOTIFY message received\n");
- mq = GNUNET_SERVICE_client_get_mq (client);
- GNUNET_SERVICE_client_mark_monitor (client);
- if (ntohl (nm->include_friend_only))
- GNUNET_notification_context_add (notify_friend_only_list, mq);
- else
- GNUNET_notification_context_add (notify_list, mq);
- tcx.friend_only = ntohl (nm->include_friend_only);
- tcx.client = client;
- GNUNET_CONTAINER_multipeermap_iterate (hostmap, &add_to_tc, &tcx);
- env = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_PEERINFO_INFO_END);
- GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), env);
- GNUNET_SERVICE_client_continue (client);
-}
-
-
-/**
- * Client connect callback
- *
- * @param cls unused
- * @param client server client
- * @param mq for @a client
- * @return @a client
- */
-static void *
-client_connect_cb (void *cls,
- struct GNUNET_SERVICE_Client *client,
- struct GNUNET_MQ_Handle *mq)
-{
- (void) cls;
- (void) mq;
- return client;
-}
-
-
-/**
- * Client disconnect callback
- *
- * @param cls unused
- * @param client server client
- * @param app_ctx should be @a client
- */
-static void
-client_disconnect_cb (void *cls,
- struct GNUNET_SERVICE_Client *client,
- void *app_ctx)
-{
- (void) cls;
- GNUNET_assert (app_ctx == client);
-}
-
-
-/**
- * Release memory taken by a host entry.
- *
- * @param cls NULL
- * @param key key of the host entry
- * @param value the `struct HostEntry` to free
- * @return #GNUNET_YES (continue to iterate)
- */
-static int
-free_host_entry (void *cls, const struct GNUNET_PeerIdentity *key, void *value)
-{
- struct HostEntry *he = value;
-
- (void) cls;
- (void) key;
- GNUNET_free (he->hello);
- GNUNET_free (he->friend_only_hello);
- GNUNET_free (he);
- return GNUNET_YES;
-}
-
-
-/**
- * Clean up our state. Called during shutdown.
- *
- * @param cls unused
- */
-static void
-shutdown_task (void *cls)
-{
- (void) cls;
- GNUNET_notification_context_destroy (notify_list);
- notify_list = NULL;
- GNUNET_notification_context_destroy (notify_friend_only_list);
- notify_friend_only_list = NULL;
-
- GNUNET_CONTAINER_multipeermap_iterate (hostmap, &free_host_entry, NULL);
- GNUNET_CONTAINER_multipeermap_destroy (hostmap);
- if (NULL != stats)
- {
- GNUNET_STATISTICS_destroy (stats, GNUNET_NO);
- stats = NULL;
- }
- if (NULL != cron_clean)
- {
- GNUNET_SCHEDULER_cancel (cron_clean);
- cron_clean = NULL;
- }
- if (NULL != cron_scan)
- {
- GNUNET_SCHEDULER_cancel (cron_scan);
- cron_scan = NULL;
- }
- if (NULL != networkIdDirectory)
- {
- GNUNET_free (networkIdDirectory);
- networkIdDirectory = NULL;
- }
-}
-
-
-/**
- * Start up peerinfo service.
- *
- * @param cls closure
- * @param cfg configuration to use
- * @param service the initialized service
- */
-static void
-run (void *cls,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- struct GNUNET_SERVICE_Handle *service)
-{
- char *peerdir;
- char *ip;
- struct DirScanContext dsc;
- int noio;
- int use_included;
-
- (void) cls;
- (void) service;
- hostmap = GNUNET_CONTAINER_multipeermap_create (1024, GNUNET_YES);
- stats = GNUNET_STATISTICS_create ("peerinfo", cfg);
- notify_list = GNUNET_notification_context_create (0);
- notify_friend_only_list = GNUNET_notification_context_create (0);
- noio = GNUNET_CONFIGURATION_get_value_yesno (cfg, "peerinfo", "NO_IO");
- use_included = GNUNET_CONFIGURATION_get_value_yesno (cfg,
- "peerinfo",
- "USE_INCLUDED_HELLOS");
- if (GNUNET_SYSERR == use_included)
- use_included = GNUNET_NO;
- GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL);
- if (GNUNET_YES != noio)
- {
- GNUNET_assert (
- GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_filename (cfg,
- "peerinfo",
- "HOSTS",
- &networkIdDirectory));
- if (GNUNET_OK != GNUNET_DISK_directory_create (networkIdDirectory))
- {
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
-
- cron_scan =
- GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_IDLE,
- &cron_scan_directory_data_hosts,
- NULL);
-
- cron_clean =
- GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_IDLE,
- &cron_clean_data_hosts,
- NULL);
- if (GNUNET_YES == use_included)
- {
- ip = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_DATADIR);
- GNUNET_asprintf (&peerdir, "%shellos", ip);
- GNUNET_free (ip);
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ ("Importing HELLOs from `%s'\n"),
- peerdir);
- dsc.matched = 0;
- dsc.remove_files = GNUNET_NO;
-
- GNUNET_DISK_directory_scan (peerdir,
- &hosts_directory_scan_callback,
- &dsc);
- GNUNET_free (peerdir);
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ ("Skipping import of included HELLOs\n"));
- }
- }
-}
-
-
-/**
- * Define "main" method using service macro.
- */
-GNUNET_SERVICE_MAIN (
- "peerinfo",
- GNUNET_SERVICE_OPTION_NONE,
- &run,
- &client_connect_cb,
- &client_disconnect_cb,
- NULL,
- GNUNET_MQ_hd_var_size (hello,
- GNUNET_MESSAGE_TYPE_HELLO,
- struct GNUNET_HELLO_Message,
- NULL),
- GNUNET_MQ_hd_fixed_size (get,
- GNUNET_MESSAGE_TYPE_PEERINFO_GET,
- struct ListPeerMessage,
- NULL),
- GNUNET_MQ_hd_fixed_size (get_all,
- GNUNET_MESSAGE_TYPE_PEERINFO_GET_ALL,
- struct ListAllPeersMessage,
- NULL),
- GNUNET_MQ_hd_fixed_size (notify,
- GNUNET_MESSAGE_TYPE_PEERINFO_NOTIFY,
- struct NotifyMessage,
- NULL),
- GNUNET_MQ_handler_end ());
-
-
-/* end of gnunet-service-peerinfo.c */
diff --git a/src/peerinfo/meson.build b/src/peerinfo/meson.build
deleted file mode 100644
index ea9aaa331..000000000
--- a/src/peerinfo/meson.build
+++ /dev/null
@@ -1,41 +0,0 @@
-libgnunetpeerinfo_src = ['peerinfo_api.c',
- 'peerinfo_api_notify.c']
-
-gnunetservicepeerinfo_src = ['gnunet-service-peerinfo.c']
-
-configure_file(input : 'peerinfo.conf.in',
- output : 'peerinfo.conf',
- configuration : cdata,
- install: true,
- install_dir: pkgcfgdir)
-
-
-if get_option('monolith')
- foreach p : libgnunetpeerinfo_src + gnunetservicepeerinfo_src
- gnunet_src += 'peerinfo/' + p
- endforeach
- subdir_done()
-endif
-
-libgnunetpeerinfo = library('gnunetpeerinfo',
- libgnunetpeerinfo_src,
- soversion: '0',
- version: '0.0.0',
- dependencies: [libgnunetutil_dep, libgnunethello_dep],
- include_directories: [incdir, configuration_inc],
- install: true,
- install_dir: get_option('libdir'))
-libgnunetpeerinfo_dep = declare_dependency(link_with : libgnunetpeerinfo)
-pkg.generate(libgnunetpeerinfo, url: 'https://www.gnunet.org',
- description : 'Provides API for accessing the peerinfo service')
-
-executable ('gnunet-service-peerinfo',
- gnunetservicepeerinfo_src,
- dependencies: [libgnunetpeerinfo_dep,
- libgnunetutil_dep,
- libgnunetstatistics_dep,
- libgnunethello_dep],
- include_directories: [incdir, configuration_inc],
- install: true,
- install_dir: get_option('libdir') / 'gnunet' / 'libexec')
-
diff --git a/src/peerinfo/peerinfo.conf.in b/src/peerinfo/peerinfo.conf.in
deleted file mode 100644
index 14a41655b..000000000
--- a/src/peerinfo/peerinfo.conf.in
+++ /dev/null
@@ -1,31 +0,0 @@
-[peerinfo]
-START_ON_DEMAND = @START_ON_DEMAND@
-@JAVAPORT@PORT = 2090
-HOSTNAME = localhost
-BINARY = gnunet-service-peerinfo
-ACCEPT_FROM = 127.0.0.1;
-ACCEPT_FROM6 = ::1;
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-service-peerinfo.sock
-UNIX_MATCH_UID = NO
-UNIX_MATCH_GID = YES
-# DISABLE_SOCKET_FORWARDING = NO
-# USERNAME =
-# MAXBUF =
-# TIMEOUT =
-# DISABLEV6 =
-# BINDTO =
-# REJECT_FROM =
-# REJECT_FROM6 =
-# PREFIX =
-HOSTS = $GNUNET_DATA_HOME/peerinfo/hosts/
-
-# Option to disable all disk IO; only useful for testbed runs
-# (large-scale experiments); disables persistence of HELLOs!
-NO_IO = NO
-
-# Load HELLOs shipped with GNUnet
-USE_INCLUDED_HELLOS = YES
-
-[uri]
-hello = gnunet-peerinfo
-friend-hello = gnunet-peerinfo
diff --git a/src/peerinfo/peerinfo.h b/src/peerinfo/peerinfo.h
deleted file mode 100644
index 9968733f0..000000000
--- a/src/peerinfo/peerinfo.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009, 2010 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file peerinfo/peerinfo.h
- * @brief common internal definitions for peerinfo service
- * @author Christian Grothoff
- */
-
-#ifndef PEERINFO_H
-#define PEERINFO_H
-
-#include "gnunet_util_lib.h"
-#include "gnunet_peerinfo_service.h"
-#include "gnunet_time_lib.h"
-
-GNUNET_NETWORK_STRUCT_BEGIN
-
-/**
- * Message requesting a listing of peers,
- * restricted to the specified peer identity.
- */
-struct ListPeerMessage
-{
- /**
- * Type will be GNUNET_MESSAGE_TYPE_PEERINFO_GET
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Include friend only HELLOs and peers in callbacks
- */
- uint32_t include_friend_only GNUNET_PACKED;
-
- /**
- * Restrict to peers with this identity (optional
- * field, check header.size!).
- */
- struct GNUNET_PeerIdentity peer;
-};
-
-/**
- * Message requesting a listing of all peers,
- * restricted to the specified peer identity.
- */
-struct ListAllPeersMessage
-{
- /**
- * Type will be GNUNET_MESSAGE_TYPE_PEERINFO_GET_ALL
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Include friend only HELLOs and peers in callbacks
- */
- uint32_t include_friend_only GNUNET_PACKED;
-};
-
-
-/**
- * Header for all communications.
- */
-struct NotifyMessage
-{
- /**
- * Type will be GNUNET_MESSAGE_TYPE_PEERINFO_NOTIFY
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Include friend only HELLOs and peers in callbacks
- */
- uint32_t include_friend_only GNUNET_PACKED;
-};
-
-
-/**
- * Message used to inform the client about
- * a particular peer; this message is optionally followed
- * by a HELLO message for the respective peer (if available).
- * Check the header.size field to see if a HELLO is
- * present.
- */
-struct InfoMessage
-{
- /**
- * Type will be GNUNET_MESSAGE_TYPE_PEERINFO_INFO
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Always zero.
- */
- uint32_t reserved GNUNET_PACKED;
-
- /**
- * About which peer are we talking here?
- */
- struct GNUNET_PeerIdentity peer;
-};
-GNUNET_NETWORK_STRUCT_END
-
-/*#ifndef PEERINFO_H*/
-#endif
-/* end of peerinfo.h */
diff --git a/src/peerinfo/peerinfo_api.c b/src/peerinfo/peerinfo_api.c
deleted file mode 100644
index 65e429bef..000000000
--- a/src/peerinfo/peerinfo_api.c
+++ /dev/null
@@ -1,557 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2001-2014 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file peerinfo/peerinfo_api.c
- * @brief API to access peerinfo service
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_protocols.h"
-#include "peerinfo.h"
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "peerinfo-api", __VA_ARGS__)
-
-
-/**
- * Context for an iteration request.
- */
-struct GNUNET_PEERINFO_IteratorContext
-{
- /**
- * Kept in a DLL.
- */
- struct GNUNET_PEERINFO_IteratorContext *next;
-
- /**
- * Kept in a DLL.
- */
- struct GNUNET_PEERINFO_IteratorContext *prev;
-
- /**
- * Handle to the PEERINFO service.
- */
- struct GNUNET_PEERINFO_Handle *h;
-
- /**
- * Function to call with the results.
- */
- GNUNET_PEERINFO_Processor callback;
-
- /**
- * Closure for @e callback.
- */
- void *callback_cls;
-
- /**
- * Peer we are interested in (only valid if iteration was restricted to one
peer).
- */
- struct GNUNET_PeerIdentity peer;
-
- /**
- * Is @e peer set?
- */
- int have_peer;
-
- /**
- * Only include friends in reply?
- */
- int include_friend_only;
-};
-
-
-/**
- * Handle to the peerinfo service.
- */
-struct GNUNET_PEERINFO_Handle
-{
- /**
- * Our configuration.
- */
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * Connection to the service.
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * Head of iterator DLL.
- */
- struct GNUNET_PEERINFO_IteratorContext *ic_head;
-
- /**
- * Tail of iterator DLL.
- */
- struct GNUNET_PEERINFO_IteratorContext *ic_tail;
-
- /**
- * ID for a reconnect task.
- */
- struct GNUNET_SCHEDULER_Task *r_task;
-};
-
-
-/**
- * Close the existing connection to PEERINFO and reconnect.
- *
- * @param h handle to the service
- */
-static void
-reconnect (struct GNUNET_PEERINFO_Handle *h);
-
-
-struct GNUNET_PEERINFO_Handle *
-GNUNET_PEERINFO_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- struct GNUNET_PEERINFO_Handle *h;
-
- h = GNUNET_new (struct GNUNET_PEERINFO_Handle);
- h->cfg = cfg;
- reconnect (h);
- if (NULL == h->mq)
- {
- GNUNET_free (h);
- return NULL;
- }
- return h;
-}
-
-
-/**
- * Disconnect from the peerinfo service. Note that all iterators must
- * have completed or have been cancelled by the time this function is
- * called (otherwise, calling this function is a serious error).
- * Furthermore, if #GNUNET_PEERINFO_add_peer() operations are still
- * pending, they will be cancelled silently on disconnect.
- *
- * @param h handle to disconnect
- */
-void
-GNUNET_PEERINFO_disconnect (struct GNUNET_PEERINFO_Handle *h)
-{
- struct GNUNET_PEERINFO_IteratorContext *ic;
-
- while (NULL != (ic = h->ic_head))
- {
- GNUNET_CONTAINER_DLL_remove (h->ic_head,
- h->ic_tail,
- ic);
- GNUNET_free (ic);
- }
- if (NULL != h->mq)
- {
- GNUNET_MQ_destroy (h->mq);
- h->mq = NULL;
- }
- if (NULL != h->r_task)
- {
- GNUNET_SCHEDULER_cancel (h->r_task);
- h->r_task = NULL;
- }
- GNUNET_free (h);
-}
-
-
-/**
- * Task scheduled to re-try connecting to the peerinfo service.
- *
- * @param cls the `struct GNUNET_PEERINFO_Handle *`
- */
-static void
-reconnect_task (void *cls)
-{
- struct GNUNET_PEERINFO_Handle *h = cls;
-
- h->r_task = NULL;
- reconnect (h);
-}
-
-
-/**
- * We encountered an error, reconnect to the PEERINFO service.
- *
- * @param h handle to reconnect
- */
-static void
-do_reconnect (struct GNUNET_PEERINFO_Handle *h)
-{
- struct GNUNET_PEERINFO_IteratorContext *ic = h->ic_head;
-
- GNUNET_MQ_destroy (h->mq);
- h->mq = NULL;
- if (NULL != ic)
- {
- GNUNET_CONTAINER_DLL_remove (h->ic_head,
- h->ic_tail,
- ic);
- if (NULL != ic->callback)
- ic->callback (ic->callback_cls,
- NULL,
- NULL,
- _ ("Failed to receive response from `PEERINFO' service."));
- GNUNET_free (ic);
- }
- h->r_task = GNUNET_SCHEDULER_add_now (&reconnect_task,
- h);
-}
-
-
-/**
- * We got a disconnect after asking regex to do the announcement.
- * Retry.
- *
- * @param cls the `struct GNUNET_PEERINFO_Handle` to retry
- * @param error error code
- */
-static void
-mq_error_handler (void *cls,
- enum GNUNET_MQ_Error error)
-{
- struct GNUNET_PEERINFO_Handle *h = cls;
-
- do_reconnect (h);
-}
-
-
-/**
- * Function called when we receive an info message. Check it is
- * well-formed.
- *
- * @param cls closure
- * @param im message received
- * @return #GNUNET_OK if the message is OK
- */
-static int
-check_info (void *cls,
- const struct InfoMessage *im)
-{
- struct GNUNET_PEERINFO_Handle *h = cls;
- struct GNUNET_PEERINFO_IteratorContext *ic = h->ic_head;
- uint16_t ms = ntohs (im->header.size) - sizeof(*im);
-
- if (0 != ntohl (im->reserved))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if (NULL == ic)
- {
- /* didn't expect a response, bad */
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if ((GNUNET_YES == ic->have_peer) &&
- (0 != GNUNET_memcmp (&ic->peer,
- &im->peer)))
- {
- /* bogus message (from a different iteration call?); out of sequence! */
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Received HELLO for peer `%s', expected peer `%s'\n",
- GNUNET_i2s (&im->peer),
- GNUNET_i2s (&ic->peer));
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if (ms > sizeof(struct GNUNET_MessageHeader))
- {
- const struct GNUNET_HELLO_Message *hello;
- struct GNUNET_PeerIdentity id;
-
- hello = (const struct GNUNET_HELLO_Message *) &im[1];
- if (ms != GNUNET_HELLO_size (hello))
- {
- /* malformed message */
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if (GNUNET_OK !=
- GNUNET_HELLO_get_id (hello,
- &id))
- {
- /* malformed message */
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if (0 != GNUNET_memcmp (&im->peer,
- &id))
- {
- /* malformed message */
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- }
- else if (0 != ms)
- {
- /* malformed message */
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Handle info message.
- *
- * @param cls closure
- * @param im message received
- */
-static void
-handle_info (void *cls,
- const struct InfoMessage *im)
-{
- struct GNUNET_PEERINFO_Handle *h = cls;
- struct GNUNET_PEERINFO_IteratorContext *ic = h->ic_head;
- const struct GNUNET_HELLO_Message *hello = NULL;
- uint16_t ms;
-
- ms = ntohs (im->header.size);
- if (ms > sizeof(struct InfoMessage))
- hello = (const struct GNUNET_HELLO_Message *) &im[1];
- if (NULL != ic->callback)
- ic->callback (ic->callback_cls,
- &im->peer,
- hello,
- NULL);
-}
-
-
-/**
- * Send the next IC request at the head of the queue.
- *
- * @param h handle
- */
-static void
-send_ic_request (struct GNUNET_PEERINFO_Handle *h)
-{
- struct GNUNET_PEERINFO_IteratorContext *ic = h->ic_head;
- struct GNUNET_MQ_Envelope *env;
- struct ListAllPeersMessage *lapm;
- struct ListPeerMessage *lpm;
-
- if (NULL == ic)
- {
- GNUNET_break (0);
- return;
- }
- if (NULL == h->mq)
- {
- GNUNET_break (0);
- return;
- }
- if (GNUNET_NO == ic->have_peer)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Requesting list of peers from PEERINFO service\n");
- env = GNUNET_MQ_msg (lapm,
- GNUNET_MESSAGE_TYPE_PEERINFO_GET_ALL);
- lapm->include_friend_only = htonl (ic->include_friend_only);
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Requesting information on peer `%s' from PEERINFO service\n",
- GNUNET_i2s (&ic->peer));
- env = GNUNET_MQ_msg (lpm,
- GNUNET_MESSAGE_TYPE_PEERINFO_GET);
- lpm->include_friend_only = htonl (ic->include_friend_only);
- lpm->peer = ic->peer;
- }
- GNUNET_MQ_send (h->mq,
- env);
-}
-
-
-/**
- * Type of a function to call when we receive a message from the
- * service. Call the iterator with the result and (if applicable)
- * continue to receive more messages or trigger processing the next
- * event (if applicable).
- *
- * @param cls closure
- * @param msg message received, NULL on timeout or fatal error
- */
-static void
-handle_end_iteration (void *cls,
- const struct GNUNET_MessageHeader *msg)
-{
- struct GNUNET_PEERINFO_Handle *h = cls;
- struct GNUNET_PEERINFO_IteratorContext *ic = h->ic_head;
-
- if (NULL == ic)
- {
- /* didn't expect a response, reconnect */
- GNUNET_break (0);
- reconnect (h);
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received end of list of peers from PEERINFO service\n");
- GNUNET_CONTAINER_DLL_remove (h->ic_head,
- h->ic_tail,
- ic);
- if (NULL != h->ic_head)
- send_ic_request (h);
- if (NULL != ic->callback)
- ic->callback (ic->callback_cls,
- NULL,
- NULL,
- NULL);
- GNUNET_free (ic);
-}
-
-
-/**
- * Close the existing connection to PEERINFO and reconnect.
- *
- * @param h handle to the service
- */
-static void
-reconnect (struct GNUNET_PEERINFO_Handle *h)
-{
- struct GNUNET_MQ_MessageHandler handlers[] = {
- GNUNET_MQ_hd_var_size (info,
- GNUNET_MESSAGE_TYPE_PEERINFO_INFO,
- struct InfoMessage,
- h),
- GNUNET_MQ_hd_fixed_size (end_iteration,
- GNUNET_MESSAGE_TYPE_PEERINFO_INFO_END,
- struct GNUNET_MessageHeader,
- h),
- GNUNET_MQ_handler_end ()
- };
-
- if (NULL != h->r_task)
- {
- GNUNET_SCHEDULER_cancel (h->r_task);
- h->r_task = NULL;
- }
- if (NULL != h->mq)
- {
- GNUNET_MQ_destroy (h->mq);
- h->mq = NULL;
- }
- h->mq = GNUNET_CLIENT_connect (h->cfg,
- "peerinfo",
- handlers,
- &mq_error_handler,
- h);
- if (NULL != h->ic_head)
- send_ic_request (h);
-}
-
-
-struct GNUNET_PEERINFO_IteratorContext *
-GNUNET_PEERINFO_iterate (struct GNUNET_PEERINFO_Handle *h,
- int include_friend_only,
- const struct GNUNET_PeerIdentity *peer,
- GNUNET_PEERINFO_Processor callback,
- void *callback_cls)
-{
- struct GNUNET_PEERINFO_IteratorContext *ic;
-
- ic = GNUNET_new (struct GNUNET_PEERINFO_IteratorContext);
- ic->h = h;
- ic->include_friend_only = include_friend_only;
- ic->callback = callback;
- ic->callback_cls = callback_cls;
- if (NULL != peer)
- {
- ic->have_peer = GNUNET_YES;
- ic->peer = *peer;
- }
- GNUNET_CONTAINER_DLL_insert_tail (h->ic_head,
- h->ic_tail,
- ic);
- if (h->ic_head == ic)
- send_ic_request (h);
- return ic;
-}
-
-
-/**
- * Cancel an iteration over peer information.
- *
- * @param ic context of the iterator to cancel
- */
-void
-GNUNET_PEERINFO_iterate_cancel (struct GNUNET_PEERINFO_IteratorContext *ic)
-{
- struct GNUNET_PEERINFO_Handle *h = ic->h;
-
- ic->callback = NULL;
- if (ic == h->ic_head)
- return;
- GNUNET_CONTAINER_DLL_remove (h->ic_head,
- h->ic_tail,
- ic);
- GNUNET_free (ic);
-}
-
-
-/**
- * Add a host to the persistent list. This method operates in
- * semi-reliable mode: if the transmission is not completed by
- * the time #GNUNET_PEERINFO_disconnect() is called, it will be
- * aborted. Furthermore, if a second HELLO is added for the
- * same peer before the first one was transmitted, PEERINFO may
- * merge the two HELLOs prior to transmission to the service.
- *
- * @param h handle to the peerinfo service
- * @param hello the verified (!) HELLO message
- * @param cont continuation to call when done, NULL is allowed
- * @param cont_cls closure for @a cont
- * @return handle to cancel add operation; all pending
- * 'add' operations will be cancelled automatically
- * on disconnect, so it is not necessary to keep this
- * handle (unless @a cont is NULL and at some point
- * calling @a cont must be prevented)
- */
-struct GNUNET_MQ_Envelope *
-GNUNET_PEERINFO_add_peer (struct GNUNET_PEERINFO_Handle *h,
- const struct GNUNET_HELLO_Message *hello,
- GNUNET_SCHEDULER_TaskCallback cont,
- void *cont_cls)
-{
- struct GNUNET_MQ_Envelope *env;
- struct GNUNET_PeerIdentity peer;
-
- if (NULL == h->mq)
- return NULL;
- GNUNET_assert (GNUNET_OK ==
- GNUNET_HELLO_get_id (hello,
- &peer));
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Adding peer `%s' to PEERINFO database\n",
- GNUNET_i2s (&peer));
- env = GNUNET_MQ_msg_copy ((const struct GNUNET_MessageHeader *) hello);
- if (NULL != cont)
- GNUNET_MQ_notify_sent (env,
- cont,
- cont_cls);
- GNUNET_MQ_send (h->mq,
- env);
- return env;
-}
-
-
-/* end of peerinfo_api.c */
diff --git a/src/peerinfo/peerinfo_api_notify.c
b/src/peerinfo/peerinfo_api_notify.c
deleted file mode 100644
index 5f4c123ff..000000000
--- a/src/peerinfo/peerinfo_api_notify.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2001, 2002, 2004, 2005, 2007, 2009, 2010 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file peerinfo/peerinfo_api_notify.c
- * @brief notify API to access peerinfo service
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_peerinfo_service.h"
-#include "gnunet_protocols.h"
-#include "peerinfo.h"
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "peerinfo-api", __VA_ARGS__)
-
-/**
- * Context for the info handler.
- */
-struct GNUNET_PEERINFO_NotifyContext
-{
- /**
- * Our connection to the PEERINFO service.
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * Function to call with information.
- */
- GNUNET_PEERINFO_Processor callback;
-
- /**
- * Closure for @e callback.
- */
- void *callback_cls;
-
- /**
- * Configuration.
- */
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * Tasked used for delayed re-connection attempt.
- */
- struct GNUNET_SCHEDULER_Task *task;
-
- /**
- * Include friend only HELLOs in callbacks
- */
- int include_friend_only;
-};
-
-
-/**
- * Task to re-try connecting to peerinfo.
- *
- * @param cls the `struct GNUNET_PEERINFO_NotifyContext *`
- */
-static void
-reconnect (void *cls);
-
-
-/**
- * We encountered an error, reconnect to the service.
- *
- * @param nc context to reconnect
- */
-static void
-do_reconnect (struct GNUNET_PEERINFO_NotifyContext *nc)
-{
- GNUNET_MQ_destroy (nc->mq);
- nc->mq = NULL;
- nc->task = GNUNET_SCHEDULER_add_now (&reconnect,
- nc);
-}
-
-
-/**
- * We got a disconnect after asking regex to do the announcement.
- * Retry.
- *
- * @param cls the `struct GNUNET_PEERINFO_NotifyContext` to retry
- * @param error error code
- */
-static void
-mq_error_handler (void *cls,
- enum GNUNET_MQ_Error error)
-{
- struct GNUNET_PEERINFO_NotifyContext *nc = cls;
-
- do_reconnect (nc);
-}
-
-
-/**
- * Check that a peerinfo information message is well-formed.
- *
- * @param cls closure
- * @param im message received
- * @return #GNUNET_OK if the message is well-formed
- */
-static int
-check_notification (void *cls,
- const struct InfoMessage *im)
-{
- uint16_t ms = ntohs (im->header.size) - sizeof(*im);
-
- if (ms >= sizeof(struct GNUNET_MessageHeader))
- {
- const struct GNUNET_HELLO_Message *hello;
-
- hello = (const struct GNUNET_HELLO_Message *) &im[1];
- if (ms != GNUNET_HELLO_size (hello))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
- }
- if (0 != ms)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK; /* odd... */
-}
-
-
-/**
- * Receive a peerinfo information message, process it.
- *
- * @param cls closure
- * @param im message received
- */
-static void
-handle_notification (void *cls,
- const struct InfoMessage *im)
-{
- struct GNUNET_PEERINFO_NotifyContext *nc = cls;
- const struct GNUNET_HELLO_Message *hello;
- uint16_t ms = ntohs (im->header.size) - sizeof(struct InfoMessage);
-
- if (0 == ms)
- return;
- hello = (const struct GNUNET_HELLO_Message *) &im[1];
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received information about peer `%s' from peerinfo database\n",
- GNUNET_i2s (&im->peer));
- nc->callback (nc->callback_cls,
- &im->peer,
- hello,
- NULL);
-}
-
-
-/**
- * Type of a function to call when we receive a message from the
- * service. Call the iterator with the result and (if applicable)
- * continue to receive more messages or trigger processing the next
- * event (if applicable).
- *
- * @param cls closure
- * @param msg message received, NULL on timeout or fatal error
- */
-static void
-handle_end_iteration (void *cls,
- const struct GNUNET_MessageHeader *msg)
-{
- /* these are ignored by the notify API */
-}
-
-
-/**
- * Task to re-try connecting to peerinfo.
- *
- * @param cls the `struct GNUNET_PEERINFO_NotifyContext *`
- */
-static void
-reconnect (void *cls)
-{
- struct GNUNET_PEERINFO_NotifyContext *nc = cls;
- struct GNUNET_MQ_MessageHandler handlers[] = {
- GNUNET_MQ_hd_var_size (notification,
- GNUNET_MESSAGE_TYPE_PEERINFO_INFO,
- struct InfoMessage,
- nc),
- GNUNET_MQ_hd_fixed_size (end_iteration,
- GNUNET_MESSAGE_TYPE_PEERINFO_INFO_END,
- struct GNUNET_MessageHeader,
- nc),
- GNUNET_MQ_handler_end ()
- };
- struct GNUNET_MQ_Envelope *env;
- struct NotifyMessage *nm;
-
- nc->task = NULL;
- nc->mq = GNUNET_CLIENT_connect (nc->cfg,
- "peerinfo",
- handlers,
- &mq_error_handler,
- nc);
- if (NULL == nc->mq)
- return;
- env = GNUNET_MQ_msg (nm,
- GNUNET_MESSAGE_TYPE_PEERINFO_NOTIFY);
- nm->include_friend_only = htonl (nc->include_friend_only);
- GNUNET_MQ_send (nc->mq,
- env);
-}
-
-
-/**
- * Call a method whenever our known information about peers
- * changes. Initially calls the given function for all known
- * peers and then only signals changes.
- *
- * If @a include_friend_only is set to #GNUNET_YES peerinfo will include HELLO
- * messages which are intended for friend to friend mode and which do not
- * have to be gossiped. Otherwise these messages are skipped.
- *
- * @param cfg configuration to use
- * @param include_friend_only include HELLO messages for friends only
- * @param callback the method to call for each peer
- * @param callback_cls closure for @a callback
- * @return NULL on error
- */
-struct GNUNET_PEERINFO_NotifyContext *
-GNUNET_PEERINFO_notify (const struct GNUNET_CONFIGURATION_Handle *cfg,
- int include_friend_only,
- GNUNET_PEERINFO_Processor callback,
- void *callback_cls)
-{
- struct GNUNET_PEERINFO_NotifyContext *nc;
-
- nc = GNUNET_new (struct GNUNET_PEERINFO_NotifyContext);
- nc->cfg = cfg;
- nc->callback = callback;
- nc->callback_cls = callback_cls;
- nc->include_friend_only = include_friend_only;
- reconnect (nc);
- if (NULL == nc->mq)
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "Could not connect to PEERINFO service.\n");
- GNUNET_free (nc);
- return NULL;
- }
- return nc;
-}
-
-
-/**
- * Stop notifying about changes.
- *
- * @param nc context to stop notifying
- */
-void
-GNUNET_PEERINFO_notify_cancel (struct GNUNET_PEERINFO_NotifyContext *nc)
-{
- if (NULL != nc->mq)
- {
- GNUNET_MQ_destroy (nc->mq);
- nc->mq = NULL;
- }
- if (NULL != nc->task)
- {
- GNUNET_SCHEDULER_cancel (nc->task);
- nc->task = NULL;
- }
- GNUNET_free (nc);
-}
-
-
-/* end of peerinfo_api_notify.c */
diff --git a/src/peerinfo/perf_peerinfo_api.c b/src/peerinfo/perf_peerinfo_api.c
deleted file mode 100644
index 055388d43..000000000
--- a/src/peerinfo/perf_peerinfo_api.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2004, 2009, 2010, 2017 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file peerinfo/perf_peerinfo_api.c
- * @brief testcase for peerinfo_api.c, hopefully hammer the peerinfo service,
- * this performance test adds up to 5000 peers with one address each and checks
- * over how many peers it can iterate before receiving a timeout after 5
seconds
- * @author Nathan Evans
- */
-
-#include "platform.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_testing_lib.h"
-#include "gnunet_peerinfo_service.h"
-#include "peerinfo.h"
-#include <gauger.h>
-
-#define NUM_REQUESTS 5000
-
-static struct GNUNET_PEERINFO_IteratorContext *ic[NUM_REQUESTS];
-
-static struct GNUNET_PEERINFO_Handle *h;
-
-static unsigned int numpeers;
-
-static struct GNUNET_PeerIdentity pid;
-
-static struct GNUNET_SCHEDULER_Task *tt;
-
-
-static void
-do_shutdown (void *cls)
-{
- if (NULL != tt)
- {
- GNUNET_SCHEDULER_cancel (tt);
- tt = NULL;
- }
- for (unsigned int i = 0; i < NUM_REQUESTS; i++)
- if (NULL != ic[i])
- GNUNET_PEERINFO_iterate_cancel (ic[i]);
- GNUNET_PEERINFO_disconnect (h);
- h = NULL;
-}
-
-
-static void
-do_timeout (void *cls)
-{
- tt = NULL;
- GNUNET_SCHEDULER_shutdown ();
-}
-
-
-static int
-check_it (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_TIME_Absolute expiration)
-{
- return GNUNET_OK;
-}
-
-
-static ssize_t
-address_generator (void *cls, size_t max, void *buf)
-{
- size_t *agc = cls;
- ssize_t ret;
- char *caddress;
- struct GNUNET_HELLO_Address address;
-
- if (*agc == 0)
- return GNUNET_SYSERR; /* Done */
-
- GNUNET_asprintf (&caddress, "Address%d", *agc);
- address.peer = pid;
- address.address_length = strlen (caddress) + 1;
- address.address = caddress;
- address.transport_name = "peerinfotest";
- ret =
- GNUNET_HELLO_add_address (&address,
- GNUNET_TIME_relative_to_absolute
- (GNUNET_TIME_UNIT_HOURS), buf, max);
- GNUNET_free (caddress);
- *agc = 0;
- return ret;
-}
-
-
-static void
-add_peer (size_t i)
-{
- struct GNUNET_HELLO_Message *h2;
-
- memset (&pid, i, sizeof(pid));
- h2 = GNUNET_HELLO_create (&pid.public_key,
- &address_generator,
- &i,
- GNUNET_NO);
- GNUNET_PEERINFO_add_peer (h, h2, NULL, NULL);
- GNUNET_free (h2);
-}
-
-
-static void
-process (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Message *hello,
- const char *err_msg)
-{
- struct GNUNET_PEERINFO_IteratorContext **icp = cls;
-
- if (NULL == peer)
- {
- *icp = NULL;
- return;
- }
- numpeers++;
- if (0 && (NULL != hello))
- GNUNET_HELLO_iterate_addresses (hello,
- GNUNET_NO,
- &check_it,
- NULL);
-}
-
-
-static void
-run (void *cls,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- struct GNUNET_TESTING_Peer *peer)
-{
- h = GNUNET_PEERINFO_connect (cfg);
- GNUNET_assert (h != NULL);
- for (unsigned int i = 0; i < NUM_REQUESTS; i++)
- {
- add_peer (i);
- ic[i] = GNUNET_PEERINFO_iterate (h,
- GNUNET_YES,
- NULL,
- &process,
- &ic[i]);
- }
- tt = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (
- GNUNET_TIME_UNIT_SECONDS,
- 5),
- &do_timeout,
- NULL);
- GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
- NULL);
-}
-
-
-int
-main (int argc,
- char *argv[])
-{
- if (0 != GNUNET_TESTING_service_run ("perf-gnunet-peerinfo",
- "peerinfo",
- "test_peerinfo_api_data.conf",
- &run, NULL))
- return 1;
- fprintf (stderr,
- "Received %u/%u calls before timeout\n",
- numpeers,
- NUM_REQUESTS * NUM_REQUESTS / 2);
- GAUGER ("PEERINFO",
- "Peerinfo lookups",
- numpeers / 5,
- "peers/s");
- return 0;
-}
-
-
-/* end of perf_peerinfo_api.c */
diff --git a/src/peerinfo/test_peerinfo_api.c b/src/peerinfo/test_peerinfo_api.c
deleted file mode 100644
index 27df6e37b..000000000
--- a/src/peerinfo/test_peerinfo_api.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2004, 2009 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file peerinfo/test_peerinfo_api.c
- * @brief testcase for peerinfo_api.c
- * @author Christian Grothoff
- *
- * TODO:
- * - test merging of HELLOs (add same peer twice...)
- */
-#include "platform.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_peerinfo_service.h"
-#include "gnunet_testing_lib.h"
-#include "peerinfo.h"
-
-static struct GNUNET_PEERINFO_IteratorContext *ic;
-
-static struct GNUNET_PEERINFO_Handle *h;
-
-static unsigned int retries;
-
-static int global_ret;
-
-
-static int
-check_it (void *cls, const struct GNUNET_HELLO_Address *address,
- struct GNUNET_TIME_Absolute expiration)
-{
- unsigned int *agc = cls;
-
- if (address != NULL)
- {
- GNUNET_assert (0 == strcmp ("peerinfotest", address->transport_name));
- GNUNET_assert (0 ==
- strncmp ("Address", address->address,
- address->address_length));
- (*agc) -= (1 << (address->address_length - 1));
- }
- return GNUNET_OK;
-}
-
-
-static ssize_t
-address_generator (void *cls, size_t max, void *buf)
-{
- size_t *agc = cls;
- ssize_t ret;
- struct GNUNET_HELLO_Address address;
-
- if (0 == *agc)
- return GNUNET_SYSERR; /* Done */
- memset (&address.peer, 0, sizeof(struct GNUNET_PeerIdentity));
- address.address = "Address";
- address.transport_name = "peerinfotest";
- address.address_length = *agc;
- ret =
- GNUNET_HELLO_add_address (&address,
- GNUNET_TIME_relative_to_absolute
- (GNUNET_TIME_UNIT_HOURS), buf, max);
- (*agc)--;
- return ret;
-}
-
-
-struct GNUNET_PeerIdentity pid;
-
-static void
-add_peer ()
-{
- struct GNUNET_HELLO_Message *h2;
- size_t agc;
-
- agc = 2;
- memset (&pid, 32, sizeof(pid));
- h2 = GNUNET_HELLO_create (&pid.public_key, &address_generator, &agc,
- GNUNET_NO);
- GNUNET_PEERINFO_add_peer (h, h2, NULL, NULL);
- GNUNET_free (h2);
-}
-
-
-static void
-process (void *cls, const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Message *hello, const char *err_msg)
-{
- unsigned int agc;
-
- if (err_msg != NULL)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Error in communication with PEERINFO service\n"));
- }
-
- if (peer == NULL)
- {
- ic = NULL;
- if ((3 == global_ret) && (retries < 50))
- {
- /* try again */
- retries++;
- add_peer ();
- ic = GNUNET_PEERINFO_iterate (h, GNUNET_NO, NULL,
- &process,
- cls);
- return;
- }
- GNUNET_assert (peer == NULL);
- GNUNET_assert (2 == global_ret);
- GNUNET_PEERINFO_disconnect (h);
- h = NULL;
- global_ret = 0;
- return;
- }
- if (hello != NULL)
- {
- GNUNET_assert (3 == global_ret);
- agc = 3;
- GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO,
- &check_it, &agc);
- GNUNET_assert (agc == 0);
- global_ret = 2;
- }
-}
-
-
-static void
-run (void *cls,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- struct GNUNET_TESTING_Peer *peer)
-{
- h = GNUNET_PEERINFO_connect (cfg);
- GNUNET_assert (NULL != h);
- add_peer ();
- ic = GNUNET_PEERINFO_iterate (h, GNUNET_NO, &pid,
- &process, cls);
-}
-
-
-int
-main (int argc, char *argv[])
-{
- global_ret = 3;
- if (0 != GNUNET_TESTING_service_run ("test-gnunet-peerinfo",
- "peerinfo",
- "test_peerinfo_api_data.conf",
- &run, NULL))
- return 1;
- return global_ret;
-}
-
-
-/* end of test_peerinfo_api.c */
diff --git a/src/peerinfo/test_peerinfo_api_data.conf
b/src/peerinfo/test_peerinfo_api_data.conf
deleted file mode 100644
index e632c341f..000000000
--- a/src/peerinfo/test_peerinfo_api_data.conf
+++ /dev/null
@@ -1,15 +0,0 @@
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-peerinfo/
-
-[peerinfo]
-PORT = 22354
-
-[dns]
-START_ON_DEMAND = NO
-
-
-
-[nse]
-START_ON_DEMAND = NO
-
-
diff --git a/src/peerinfo/test_peerinfo_api_friend_only.c
b/src/peerinfo/test_peerinfo_api_friend_only.c
deleted file mode 100644
index a5414e701..000000000
--- a/src/peerinfo/test_peerinfo_api_friend_only.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2004, 2009 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file peerinfo/test_peerinfo_api_friend_only.c
- * @brief testcase friend only HELLO restrictions in for peerinfo
- * @author Christian Grothoff
- * @author Matthias Wachs
- *
- * TODO:
- * - test merging of HELLOs (add same peer twice...)
- */
-#include "platform.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_peerinfo_service.h"
-#include "gnunet_testing_lib.h"
-
-
-static struct GNUNET_PEERINFO_IteratorContext *ic;
-
-static struct GNUNET_PEERINFO_Handle *h;
-
-static struct GNUNET_PeerIdentity pid;
-
-static unsigned int retries;
-
-static int global_ret;
-
-
-static ssize_t
-address_generator (void *cls,
- size_t max,
- void *buf)
-{
- size_t *agc = cls;
- ssize_t ret;
- struct GNUNET_HELLO_Address address;
-
- if (0 == *agc)
- return GNUNET_SYSERR; /* Done */
- memset (&address.peer,
- 0,
- sizeof(struct GNUNET_PeerIdentity));
- address.address = "Address";
- address.transport_name = "peerinfotest";
- address.address_length = *agc;
- ret = GNUNET_HELLO_add_address (&address,
- GNUNET_TIME_relative_to_absolute (
- GNUNET_TIME_UNIT_HOURS),
- buf,
- max);
- (*agc)--;
- return ret;
-}
-
-
-static void
-add_peer ()
-{
- struct GNUNET_HELLO_Message *h2;
- size_t agc;
-
- agc = 2;
- memset (&pid, 32, sizeof(pid));
- h2 = GNUNET_HELLO_create (&pid.public_key,
- &address_generator,
- &agc,
- GNUNET_YES);
- GNUNET_PEERINFO_add_peer (h,
- h2,
- NULL,
- NULL);
- GNUNET_free (h2);
-}
-
-
-static void
-process (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Message *hello,
- const char *err_msg)
-{
- if (NULL != err_msg)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Error in communication with PEERINFO service: %s\n",
- err_msg);
- }
- if (NULL == peer)
- {
- ic = NULL;
- if ((3 == global_ret) && (retries < 50))
- {
- /* try again */
- retries++;
- add_peer ();
- ic = GNUNET_PEERINFO_iterate (h,
- GNUNET_NO,
- NULL,
- &process,
- cls);
- return;
- }
- GNUNET_assert (peer == NULL);
- GNUNET_PEERINFO_disconnect (h);
- h = NULL;
- global_ret = 0;
- return;
- }
-
- if ((NULL != hello) &&
- (GNUNET_YES == GNUNET_HELLO_is_friend_only (hello)))
- {
- fprintf (stderr,
- "Received friend-only HELLO\n");
- global_ret = 1;
- GNUNET_PEERINFO_disconnect (h);
- h = NULL;
- return;
- }
-}
-
-
-static void
-run (void *cls,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- struct GNUNET_TESTING_Peer *peer)
-{
- h = GNUNET_PEERINFO_connect (cfg);
- GNUNET_assert (NULL != h);
- add_peer ();
- ic = GNUNET_PEERINFO_iterate (h,
- GNUNET_NO,
- &pid,
- &process,
- NULL);
-}
-
-
-int
-main (int argc,
- char *argv[])
-{
- global_ret = 3;
- if (0 != GNUNET_TESTING_service_run ("test-peerinfo-api-friend-only",
- "peerinfo",
- "test_peerinfo_api_data.conf",
- &run, NULL))
- return 1;
- return global_ret;
-}
-
-
-/* end of test_peerinfo_api_friend_only */
diff --git a/src/peerinfo/test_peerinfo_api_notify_friend_only.c
b/src/peerinfo/test_peerinfo_api_notify_friend_only.c
deleted file mode 100644
index 6d5793dcf..000000000
--- a/src/peerinfo/test_peerinfo_api_notify_friend_only.c
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2004, 2009 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file peerinfo/test_peerinfo_api_notify_friend_only.c
- * @brief testcase friend only HELLO restrictions in for peerinfo
- * @author Christian Grothoff
- * @author Matthias Wachs
- *
- * TODO:
- * - test merging of HELLOs (add same peer twice...)
- */
-#include "platform.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_peerinfo_service.h"
-#include "gnunet_testing_lib.h"
-#include "peerinfo.h"
-
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
-
-static struct GNUNET_PEERINFO_Handle *h;
-static struct GNUNET_PEERINFO_NotifyContext *pnc_w_fo;
-static struct GNUNET_PEERINFO_NotifyContext *pnc_wo_fo;
-
-static const struct GNUNET_CONFIGURATION_Handle *mycfg;
-
-static int global_ret;
-
-/**
- * Did we get a HELLO callback for notification handle with friend HELLOS
- * (expected)
- */
-static int res_cb_w_fo;
-
-/**
- * Did we get a HELLO callback for notification handle without friend HELLOS
- * (not expected)
- */
-static int res_cb_wo_fo;
-
-struct GNUNET_PeerIdentity pid;
-
-struct GNUNET_SCHEDULER_Task *timeout_task;
-
-static void
-end_badly (void *cls)
-{
- timeout_task = NULL;
- GNUNET_break (0);
- if (NULL != pnc_wo_fo)
- {
- GNUNET_PEERINFO_notify_cancel (pnc_wo_fo);
- pnc_wo_fo = NULL;
- }
- if (NULL != pnc_w_fo)
- {
- GNUNET_PEERINFO_notify_cancel (pnc_w_fo);
- pnc_w_fo = NULL;
- }
- if (NULL != h)
- {
- GNUNET_PEERINFO_disconnect (h);
- h = NULL;
- }
- global_ret = 255;
-}
-
-
-static void
-done (void *cls)
-{
- if (NULL != pnc_w_fo)
- GNUNET_PEERINFO_notify_cancel (pnc_w_fo);
- pnc_w_fo = NULL;
- if (NULL != pnc_wo_fo)
- GNUNET_PEERINFO_notify_cancel (pnc_wo_fo);
- pnc_wo_fo = NULL;
- GNUNET_PEERINFO_disconnect (h);
- h = NULL;
-
- if (NULL != timeout_task)
- {
- GNUNET_SCHEDULER_cancel (timeout_task);
- timeout_task = NULL;
- }
-
- if ((GNUNET_YES == res_cb_w_fo) && (GNUNET_NO == res_cb_wo_fo))
- global_ret = 0;
- else
- GNUNET_break (0);
-}
-
-
-static ssize_t
-address_generator (void *cls, size_t max, void *buf)
-{
- size_t *agc = cls;
- ssize_t ret;
- struct GNUNET_HELLO_Address address;
-
- if (0 == *agc)
- return GNUNET_SYSERR; /* Done */
- memset (&address.peer, 0, sizeof(struct GNUNET_PeerIdentity));
- address.address = "Address";
- address.transport_name = "peerinfotest";
- address.address_length = *agc;
- ret = GNUNET_HELLO_add_address (&address,
- GNUNET_TIME_relative_to_absolute (
- GNUNET_TIME_UNIT_HOURS), buf, max);
- (*agc)--;
- return ret;
-}
-
-
-static void
-process_w_fo (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Message *hello,
- const char *err_msg)
-{
- if (err_msg != NULL)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Error in communication with PEERINFO service\n"));
- GNUNET_SCHEDULER_add_now (&done, NULL);
- return;
- }
-
- if (NULL != peer)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Received callback for peer `%s' %s HELLO\n", GNUNET_i2s
(peer),
- (NULL != hello) ? "with" : "without");
-
- if (NULL == hello)
- return;
-
- if (GNUNET_NO == GNUNET_HELLO_is_friend_only (hello))
- {
- GNUNET_break (0);
- return;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Received %s HELLO for peer `%s'\n",
- (GNUNET_YES == GNUNET_HELLO_is_friend_only (hello)) ?
- "friend only" : "public",
- GNUNET_i2s (peer));
- if (0 == GNUNET_memcmp (&pid, peer))
- {
- res_cb_w_fo = GNUNET_YES;
- GNUNET_SCHEDULER_add_now (&done, NULL);
- }
- return;
- }
-}
-
-
-static void
-process_wo_fo (void *cls, const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Message *hello, const char *err_msg)
-{
- if (err_msg != NULL)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Error in communication with PEERINFO service\n"));
- GNUNET_SCHEDULER_add_now (&done, NULL);
- return;
- }
-
- if (NULL != peer)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Received callback for peer `%s' %s HELLO\n", GNUNET_i2s
(peer),
- (NULL != hello) ? "with" : "without");
-
- if (NULL == hello)
- return;
-
- if (GNUNET_YES == GNUNET_HELLO_is_friend_only (hello))
- {
- GNUNET_break (0);
- return;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Received %s HELLO for peer `%s'\n",
- (GNUNET_YES == GNUNET_HELLO_is_friend_only (hello)) ?
- "friend only" : "public",
- GNUNET_i2s (peer));
- if (0 == GNUNET_memcmp (&pid, peer))
- {
- GNUNET_break (0);
- res_cb_wo_fo = GNUNET_YES;
- }
- }
-}
-
-
-static void
-add_peer ()
-{
- struct GNUNET_HELLO_Message *h2;
- size_t agc;
-
- agc = 2;
- memset (&pid, 32, sizeof(pid));
- h2 = GNUNET_HELLO_create (&pid.public_key, &address_generator, &agc,
- GNUNET_YES);
- GNUNET_PEERINFO_add_peer (h, h2, NULL, NULL);
- GNUNET_free (h2);
-}
-
-
-static void
-run (void *cls,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- struct GNUNET_TESTING_Peer *peer)
-{
- timeout_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_badly, NULL);
- mycfg = cfg;
- pnc_w_fo = GNUNET_PEERINFO_notify (mycfg, GNUNET_YES, &process_w_fo, NULL);
- pnc_wo_fo = GNUNET_PEERINFO_notify (mycfg, GNUNET_NO, &process_wo_fo, NULL);
- h = GNUNET_PEERINFO_connect (cfg);
- GNUNET_assert (NULL != h);
- add_peer ();
-}
-
-
-int
-main (int argc, char *argv[])
-{
- res_cb_w_fo = GNUNET_NO;
- res_cb_wo_fo = GNUNET_NO;
- global_ret = 3;
- if (0 != GNUNET_TESTING_service_run ("test-peerinfo-api-friend-only",
- "peerinfo",
- "test_peerinfo_api_data.conf",
- &run, NULL))
- return 1;
- return global_ret;
-}
-
-
-/* end of test_peerinfo_api_notify_friend_only.c */
diff --git a/src/peerinfo/test_peerinfo_shipped_hellos.c
b/src/peerinfo/test_peerinfo_shipped_hellos.c
deleted file mode 100644
index 45ea73be6..000000000
--- a/src/peerinfo/test_peerinfo_shipped_hellos.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2004, 2009 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file peerinfo/test_peerinfo_shipped_hellos.c
- * @brief testcase for shipped HELLOs getting parsed
- * @author Christian Grothoff
- * @author Matthias Wachs
- *
- */
-#include "platform.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_peerinfo_service.h"
-#include "gnunet_testing_lib.h"
-#include "peerinfo.h"
-
-static struct GNUNET_PEERINFO_IteratorContext *ic;
-
-static struct GNUNET_PEERINFO_Handle *h;
-
-static int global_ret;
-
-
-static int
-addr_cb (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_TIME_Absolute expiration)
-{
- unsigned int *addr = cls;
-
- (*addr)++;
- return GNUNET_OK;
-}
-
-
-static void
-process (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Message *hello,
- const char *err_msg)
-{
- static unsigned int calls = 0;
- unsigned int addr;
-
- if (NULL != err_msg)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Error in communication with PEERINFO service: %s\n",
- err_msg);
- }
- if (NULL != peer)
- {
- addr = 0;
- if (NULL != hello)
- {
- GNUNET_HELLO_iterate_addresses (hello,
- GNUNET_NO,
- &addr_cb,
- &addr);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Got information about peer %s with %u addresses\n",
- GNUNET_i2s (peer),
- addr);
- calls++;
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Got no HELLP for peer %s\n",
- GNUNET_i2s (peer));
- }
- }
- else
- {
- if (0 == calls)
- {
- fprintf (stderr,
- "Failed: got no callbacks!\n");
- global_ret = 1;
- GNUNET_PEERINFO_disconnect (h);
- h = NULL;
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Got %u HELLOs in total\n",
- calls);
- global_ret = 0;
- GNUNET_PEERINFO_disconnect (h);
- h = NULL;
- }
- }
-}
-
-
-static void
-run (void *cls,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- struct GNUNET_TESTING_Peer *peer)
-{
- h = GNUNET_PEERINFO_connect (cfg);
- GNUNET_assert (NULL != h);
- ic = GNUNET_PEERINFO_iterate (h,
- GNUNET_YES,
- NULL,
- &process,
- cls);
- GNUNET_assert (NULL != ic);
-}
-
-
-int
-main (int argc,
- char *argv[])
-{
- global_ret = 3;
- if (0 != GNUNET_TESTING_service_run ("test_peerinfo_shipped_hellos",
- "peerinfo",
- "test_peerinfo_api_data.conf",
- &run, NULL))
- return 1;
- return global_ret;
-}
-
-
-/* end of test_peerinfo_shipped_hellos.c */
diff --git a/src/regex/Makefile.am b/src/regex/Makefile.am
index b7d14bc41..b526a0c8c 100644
--- a/src/regex/Makefile.am
+++ b/src/regex/Makefile.am
@@ -94,8 +94,7 @@ libgnunet_plugin_block_regex_la_LDFLAGS = \
#endif
noinst_PROGRAMS = $(noinst_mysql_progs) \
- perf-regex \
- gnunet-regex-profiler
+ perf-regex
perf_regex_SOURCES = \
$(REGEX_INTERNAL_TEST) perf-regex.c
@@ -107,19 +106,6 @@ perf_regex_LDADD = -lm \
perf_regex_LDFLAGS = \
$(GN_LIBINTL)
-gnunet_regex_profiler_SOURCES = \
- $(REGEX_INTERNAL_TEST) gnunet-regex-profiler.c
-gnunet_regex_profiler_LDADD = -lm \
- $(top_builddir)/src/arm/libgnunetarm.la \
- $(top_builddir)/src/testing/libgnunettesting.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- $(top_builddir)/src/dht/libgnunetdht.la \
- libgnunetregexblock.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la
-gnunet_regex_profiler_LDFLAGS = \
- $(GN_LIBINTL)
-
gnunet_daemon_regexprofiler_SOURCES = \
$(REGEX_INTERNAL_TEST) gnunet-daemon-regexprofiler.c
gnunet_daemon_regexprofiler_LDADD = -lm \
diff --git a/src/secretsharing/Makefile.am b/src/secretsharing/Makefile.am
index b13d5a838..3a86236cd 100644
--- a/src/secretsharing/Makefile.am
+++ b/src/secretsharing/Makefile.am
@@ -16,21 +16,22 @@ endif
libexec_PROGRAMS = \
gnunet-service-secretsharing
-noinst_PROGRAMS = \
- gnunet-secretsharing-profiler
+#noinst_PROGRAMS = \
+# gnunet-secretsharing-profiler
lib_LTLIBRARIES = \
libgnunetsecretsharing.la
-gnunet_secretsharing_profiler_SOURCES = \
- gnunet-secretsharing-profiler.c
-gnunet_secretsharing_profiler_LDADD = \
- libgnunetsecretsharing.la \
- $(top_builddir)/src/testing/libgnunettesting.la \
- $(top_builddir)/src/testbed/libgnunettestbed.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(GN_LIBINTL)
+# TNG
+#gnunet_secretsharing_profiler_SOURCES = \
+# gnunet-secretsharing-profiler.c
+#gnunet_secretsharing_profiler_LDADD = \
+# libgnunetsecretsharing.la \
+# $(top_builddir)/src/testing/libgnunettesting.la \
+# $(top_builddir)/src/testbed/libgnunettestbed.la \
+# $(top_builddir)/src/util/libgnunetutil.la \
+# $(GN_LIBINTL)
gnunet_service_secretsharing_SOURCES = \
gnunet-service-secretsharing.c \
diff --git a/src/topology/Makefile.am b/src/topology/Makefile.am
index cae2c73b8..aeb05eec7 100644
--- a/src/topology/Makefile.am
+++ b/src/topology/Makefile.am
@@ -36,7 +36,6 @@ gnunet_daemon_topology_LDADD = \
$(top_builddir)/src/peerstore/libgnunetpeerstore.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/transport/libgnunettransportapplication.la \
- $(top_builddir)/src/ats/libgnunetats.la \
$(top_builddir)/src/hello/libgnunethello.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(GN_LIBINTL)
diff --git a/src/transport/Makefile.am b/src/transport/Makefile.am
index d7d25b7b0..fab32146d 100644
--- a/src/transport/Makefile.am
+++ b/src/transport/Makefile.am
@@ -8,121 +8,26 @@ pkgcfgdir= $(pkgdatadir)/config.d/
libexecdir= $(pkglibdir)/libexec/
pkgcfg_DATA = \
- transport.conf \
- communicator-unix.conf
-
-HTTP_SERVER_PLUGIN_LA = libgnunet_plugin_transport_http_server.la
-HTTPS_SERVER_PLUGIN_LA = libgnunet_plugin_transport_https_server.la
-HTTP_SERVER_PLUGIN_TEST = test_plugin_http_server
-HTTPS_SERVER_PLUGIN_TEST = test_plugin_https_server
-
-HTTP_CLIENT_PLUGIN_TEST = test_plugin_http_client
-HTTPS_CLIENT_PLUGIN_TEST = test_plugin_https_client
-HTTP_CLIENT_PLUGIN_LA = libgnunet_plugin_transport_http_client.la
-HTTPS_CLIENT_PLUGIN_LA = libgnunet_plugin_transport_https_client.la
-
-HTTP_API_TEST = test_transport_api_http
-HTTP_REVERSE_API_TEST = test_transport_api_http_reverse
-HTTP_API_TIMEOUT_TEST = test_transport_api_timeout_http
-HTTP_REL_TEST = test_transport_api_reliability_http \
- test_transport_api_reliability_http_xhr
-HTTP_QUOTA_TEST = test_quota_compliance_http \
- test_quota_compliance_http_asymmetric
-HTTP_SWITCH = test_transport_address_switch_http
-HTTPS_API_TEST = test_transport_api_https
-HTTPS_API_TIMEOUT_TEST = test_transport_api_timeout_https
-if HAVE_EXPERIMENTAL
- HTTPS_REL_TEST = test_transport_api_reliability_https \
- test_transport_api_reliability_https_xhr
-endif
-HTTPS_QUOTA_TEST = test_quota_compliance_https \
- test_quota_compliance_https_asymmetric
-HTTPS_SWITCH = test_transport_address_switch_https
+ transport.conf
if USE_COVERAGE
AM_CFLAGS = --coverage -O0
endif
-if HAVE_EXPERIMENTAL
-if LINUX
- WLAN_BIN = gnunet-helper-transport-wlan
- WLAN_BIN_DUMMY = gnunet-helper-transport-wlan-dummy
- WLAN_BIN_SENDER = gnunet-transport-wlan-sender
- WLAN_BIN_RECEIVER = gnunet-transport-wlan-receiver
- WLAN_PLUGIN_LA = libgnunet_plugin_transport_wlan.la
- WLAN_PLUGIN_TEST = test_plugin_wlan
- WLAN_API_TEST = test_transport_api_wlan
- WLAN_TIMEOUT_TEST = test_transport_api_timeout_wlan
- WLAN_REL_TEST = test_transport_api_reliability_wlan
- WLAN_QUOTA_TEST = test_quota_compliance_wlan \
- test_quota_compliance_wlan_asymmetric
-endif
-
-if LINUX
-if HAVE_LIBBLUETOOTH
- BT_BIN = gnunet-helper-transport-bluetooth
- BT_PLUGIN_LA = libgnunet_plugin_transport_bluetooth.la
- BT_PLUGIN_TEST = test_plugin_bluetooth
- BT_API_TEST = test_transport_api_bluetooth
- BT_TIMEOUT_TEST = test_transport_api_timeout_bluetooth
- BT_REL_TEST = test_transport_api_reliability_bluetooth
- BT_QUOTA_TEST = test_quota_compliance_bluetooth \
- test_quota_compliance_bluetooth_asymmetric
-endif
-endif
-
-# end of HAVE_EXPERIMENTAL
-endif
-
-
-UNIX_PLUGIN_LA = libgnunet_plugin_transport_unix.la
-UNIX_PLUGIN_TEST = test_transport_api_unix
-UNIX_TEST = test_plugin_unix
-UNIX_PLUGIN_TIMEOUT_TEST = test_transport_api_timeout_unix
-UNIX_REL_TEST = test_transport_api_reliability_unix
-UNIX_QUOTA_TEST = test_quota_compliance_unix \
- test_quota_compliance_unix_asymmetric
-if LINUX
- UNIX_API_ABSTRACT_TEST = test_transport_api_unix_abstract
-endif
-
-
noinst_PROGRAMS = \
test_transport_start_with_config \
- gnunet-transport-profiler \
- gnunet-communicator-udp \
- $(WLAN_BIN_SENDER) \
- $(WLAN_BIN_RECEIVER)
+ gnunet-communicator-udp
TESTING_LIBS = \
- libgnunettransporttesting.la \
libgnunettransporttesting2.la
lib_LTLIBRARIES = \
- libgnunettransport.la \
libgnunettransportapplication.la \
libgnunettransportcore.la \
libgnunettransportcommunicator.la \
libgnunettransportmonitor.la \
$(TESTING_LIBS)
-libgnunettransporttesting_la_SOURCES = \
- transport-testing.c transport-testing.h \
- transport-testing-filenames.c \
- transport-testing-loggers.c \
- transport-testing-main.c \
- transport-testing-send.c
-libgnunettransporttesting_la_LIBADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(top_builddir)/src/testing/libgnunettesting.la \
- $(top_builddir)/src/arm/libgnunetarm.la \
- $(GN_LIBINTL)
-libgnunettransporttesting_la_LDFLAGS = \
- $(GN_LIB_LDFLAGS)
-
libgnunettransporttesting2_la_SOURCES = \
transport_api_traits.c \
transport_api_cmd_connecting_peers.c \
@@ -143,7 +48,6 @@ libgnunettransporttesting2_la_LIBADD = \
libgnunettransportcore.la \
$(top_builddir)/src/arm/libgnunetarm.la \
$(top_builddir)/src/testing/libgnunettesting.la \
- $(top_builddir)/src/ats/libgnunetats.la \
$(top_builddir)/src/hello/libgnunethello.la \
$(top_builddir)/src/peerstore/libgnunetpeerstore.la \
$(top_builddir)/src/util/libgnunetutil.la
@@ -152,26 +56,6 @@ libgnunettransporttesting2_la_LDFLAGS = \
$(GN_LIB_LDFLAGS) \
-version-info 0:0:0
-libgnunettransport_la_SOURCES = \
- transport.h \
- transport_api_address_to_string.c \
- transport_api_blacklist.c \
- transport_api_core.c \
- transport_api_hello_get.c \
- transport_api_manipulation.c \
- transport_api_monitor_peers.c \
- transport_api_monitor_plugins.c \
- transport_api_offer_hello.c
-
-libgnunettransport_la_LIBADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(GN_LIBINTL)
-libgnunettransport_la_LDFLAGS = \
- $(GN_LIB_LDFLAGS) \
- -version-info 4:0:2
-
libgnunettransportapplication_la_SOURCES = \
transport_api2_application.c
libgnunettransportapplication_la_LIBADD = \
@@ -212,10 +96,6 @@ libgnunettransportmonitor_la_LDFLAGS = \
libexec_PROGRAMS = \
- $(WLAN_BIN) \
- $(WLAN_BIN_DUMMY) \
- $(BT_BIN) \
- gnunet-service-transport \
gnunet-service-tng \
gnunet-communicator-unix \
gnunet-communicator-udp \
@@ -228,8 +108,8 @@ endif
endif
-bin_PROGRAMS = \
- gnunet-transport
+#bin_PROGRAMS = \
+# gnunet-transport
bin_SCRIPTS = \
gnunet-transport-certificate-creation
@@ -291,74 +171,22 @@ gnunet_communicator_quic_LDADD = \
endif
endif
-gnunet_helper_transport_wlan_SOURCES = \
- gnunet-helper-transport-wlan.c
-
-gnunet_helper_transport_wlan_dummy_SOURCES = \
- gnunet-helper-transport-wlan-dummy.c
-gnunet_helper_transport_wlan_dummy_LDADD = \
- $(top_builddir)/src/util/libgnunetutil.la
-
-gnunet_transport_wlan_sender_SOURCES = \
- gnunet-transport-wlan-sender.c
-gnunet_transport_wlan_sender_LDADD = \
- $(top_builddir)/src/util/libgnunetutil.la
-
-gnunet_transport_wlan_receiver_SOURCES = \
- gnunet-transport-wlan-receiver.c
-gnunet_transport_wlan_receiver_LDADD = \
- $(top_builddir)/src/util/libgnunetutil.la
-
-gnunet_helper_transport_bluetooth_SOURCES = \
- gnunet-helper-transport-bluetooth.c
-
-gnunet_helper_transport_bluetooth_LDFLAGS = -lbluetooth
-
-
-gnunet_transport_profiler_SOURCES = \
- gnunet-transport-profiler.c
-gnunet_transport_profiler_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(GN_LIBINTL)
-
-gnunet_transport_SOURCES = \
- gnunet-transport.c
-gnunet_transport_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(GN_LIBINTL)
-
-gnunet_service_transport_SOURCES = \
- gnunet-service-transport.c gnunet-service-transport.h \
- gnunet-service-transport_ats.h gnunet-service-transport_ats.c \
- gnunet-service-transport_hello.h gnunet-service-transport_hello.c \
- gnunet-service-transport_neighbours.h gnunet-service-transport_neighbours.c \
- gnunet-service-transport_plugins.h gnunet-service-transport_plugins.c \
- gnunet-service-transport_validation.h gnunet-service-transport_validation.c \
- gnunet-service-transport_manipulation.h
gnunet-service-transport_manipulation.c
-# Note that while gnunet-service-transport does not use libgnunetnat
-# directly, we must link against it as GNUNET_NAT_mini_map_stop will
-# leave a 'dangling' task to process_unmap_output which will cause
-# a crash on unloading of a plugin unless the service links against
-# that library as well.
-gnunet_service_transport_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(GN_GLPK) \
- $(GN_LIBINTL)
-gnunet_service_transport_CFLAGS = \
- $(AM_CFLAGS)
-# -DANALYZE
-
+#gnunet_transport_profiler_SOURCES = \
+# gnunet-transport-profiler.c
+#gnunet_transport_profiler_LDADD = \
+# libgnunettransport.la \
+# $(top_builddir)/src/hello/libgnunethello.la \
+# $(top_builddir)/src/ats/libgnunetats.la \
+# $(top_builddir)/src/util/libgnunetutil.la \
+# $(GN_LIBINTL)
+
+#gnunet_transport_SOURCES = \
+# gnunet-transport.c
+#gnunet_transport_LDADD = \
+# libgnunettransport.la \
+# $(top_builddir)/src/hello/libgnunethello.la \
+# $(top_builddir)/src/util/libgnunetutil.la \
+# $(GN_LIBINTL)
gnunet_service_tng_SOURCES = \
gnunet-service-tng.c
@@ -371,20 +199,12 @@ gnunet_service_tng_LDADD = \
$(GN_LIBINTL)
plugin_LTLIBRARIES = \
- libgnunet_plugin_transport_tcp.la \
- $(UNIX_PLUGIN_LA) \
- $(HTTP_CLIENT_PLUGIN_LA) \
- $(HTTPS_CLIENT_PLUGIN_LA) \
- $(HTTP_SERVER_PLUGIN_LA) \
- $(HTTPS_SERVER_PLUGIN_LA) \
- $(WLAN_PLUGIN_LA) \
- $(BT_PLUGIN_LA) \
libgnunet_test_transport_plugin_cmd_simple_send_performance.la \
libgnunet_test_transport_plugin_cmd_nat_upnp.la \
libgnunet_test_transport_plugin_cmd_simple_send.la \
libgnunet_test_transport_plugin_cmd_simple_send_broadcast.la \
libgnunet_test_transport_plugin_cmd_simple_send_dv.la \
- libgnunet_test_transport_plugin_cmd_udp_backchannel.la
+ libgnunet_test_transport_plugin_cmd_udp_backchannel.la
libgnunet_test_transport_plugin_cmd_nat_upnp_la_SOURCES = \
test_transport_plugin_cmd_nat_upnp.c
@@ -396,7 +216,6 @@ libgnunet_test_transport_plugin_cmd_nat_upnp_la_LIBADD = \
$(top_builddir)/src/peerstore/libgnunetpeerstore.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
$(top_builddir)/src/arm/libgnunetarm.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(LTLIBINTL)
@@ -413,7 +232,6 @@
libgnunet_test_transport_plugin_cmd_udp_backchannel_la_LIBADD = \
$(top_builddir)/src/peerstore/libgnunetpeerstore.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
$(top_builddir)/src/arm/libgnunetarm.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(LTLIBINTL)
@@ -430,7 +248,6 @@ libgnunet_test_transport_plugin_cmd_simple_send_la_LIBADD =
\
$(top_builddir)/src/peerstore/libgnunetpeerstore.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
$(top_builddir)/src/arm/libgnunetarm.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(LTLIBINTL)
@@ -447,7 +264,6 @@
libgnunet_test_transport_plugin_cmd_simple_send_performance_la_LIBADD = \
$(top_builddir)/src/peerstore/libgnunetpeerstore.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
$(top_builddir)/src/arm/libgnunetarm.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(LTLIBINTL)
@@ -464,7 +280,6 @@
libgnunet_test_transport_plugin_cmd_simple_send_broadcast_la_LIBADD = \
$(top_builddir)/src/peerstore/libgnunetpeerstore.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
$(top_builddir)/src/arm/libgnunetarm.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(LTLIBINTL)
@@ -481,313 +296,41 @@
libgnunet_test_transport_plugin_cmd_simple_send_dv_la_LIBADD = \
$(top_builddir)/src/peerstore/libgnunetpeerstore.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la \
$(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
$(top_builddir)/src/arm/libgnunetarm.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(LTLIBINTL)
libgnunet_test_transport_plugin_cmd_simple_send_dv_la_LDFLAGS = \
$(GN_PLUGIN_LDFLAGS)
-if HAVE_EXPERIMENTAL
-plugin_LTLIBRARIES += \
- libgnunet_plugin_transport_udp.la
-endif
-
-# Note: real plugins of course need to be added
-# to the plugin_LTLIBRARIES above
-noinst_LTLIBRARIES = \
- libgnunet_plugin_transport_template.la
-
-libgnunet_plugin_transport_tcp_la_SOURCES = \
- plugin_transport_tcp.c
-libgnunet_plugin_transport_tcp_la_LIBADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
- $(top_builddir)/src/nat/libgnunetnatnew.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(LTLIBINTL)
-libgnunet_plugin_transport_tcp_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-
-libgnunet_plugin_transport_template_la_SOURCES = \
- plugin_transport_template.c
-libgnunet_plugin_transport_template_la_LIBADD = \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(LTLIBINTL)
-libgnunet_plugin_transport_template_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-
-libgnunet_plugin_transport_wlan_la_SOURCES = \
- plugin_transport_wlan.c plugin_transport_wlan.h
-libgnunet_plugin_transport_wlan_la_LIBADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
- $(top_builddir)/src/fragmentation/libgnunetfragmentation.la \
- $(top_builddir)/src/util/libgnunetutil.la
-libgnunet_plugin_transport_wlan_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-libgnunet_plugin_transport_wlan_la_CFLAGS = \
- $(AM_CFLAGS) -DBUILD_WLAN
-
-libgnunet_plugin_transport_bluetooth_la_SOURCES = \
- plugin_transport_wlan.c plugin_transport_wlan.h
-libgnunet_plugin_transport_bluetooth_la_LIBADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
- $(top_builddir)/src/fragmentation/libgnunetfragmentation.la \
- $(top_builddir)/src/util/libgnunetutil.la
-libgnunet_plugin_transport_bluetooth_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-libgnunet_plugin_transport_bluetooth_la_CFLAGS = \
- $(AM_CFLAGS) -DBUILD_BLUETOOTH
-
-if HAVE_EXPERIMENTAL
-libgnunet_plugin_transport_udp_la_SOURCES = \
- plugin_transport_udp.c plugin_transport_udp.h \
- plugin_transport_udp_broadcasting.c
-libgnunet_plugin_transport_udp_la_LIBADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/fragmentation/libgnunetfragmentation.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
- $(top_builddir)/src/nat/libgnunetnatnew.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(LTLIBINTL)
-libgnunet_plugin_transport_udp_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-endif
-
-libgnunet_plugin_transport_unix_la_SOURCES = \
- plugin_transport_unix.c
-libgnunet_plugin_transport_unix_la_LIBADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- $(LTLIBINTL)
-libgnunet_plugin_transport_unix_la_LDFLAGS = \
- $(GN_PLUGIN_LDFLAGS)
-
-
-libgnunet_plugin_transport_http_client_la_SOURCES = \
- plugin_transport_http_client.c plugin_transport_http_common.c
plugin_transport_http_common.h
-libgnunet_plugin_transport_http_client_la_LIBADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
- @LIBCURL@ \
- $(top_builddir)/src/util/libgnunetutil.la
-libgnunet_plugin_transport_http_client_la_LDFLAGS = \
- $(GN_LIBINTL) \
- $(GN_PLUGIN_LDFLAGS)
-libgnunet_plugin_transport_http_client_la_CFLAGS = \
- @LIBCURL_CPPFLAGS@ $(AM_CFLAGS)
-
-
-libgnunet_plugin_transport_http_server_la_SOURCES = \
- plugin_transport_http_server.c plugin_transport_http_common.c
-libgnunet_plugin_transport_http_server_la_LIBADD = \
- $(MHD_LIBS) \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
- $(top_builddir)/src/nat/libgnunetnatnew.la \
- $(top_builddir)/src/util/libgnunetutil.la
-libgnunet_plugin_transport_http_server_la_LDFLAGS = \
- $(GN_LIBINTL) \
- $(GN_PLUGIN_LDFLAGS)
-libgnunet_plugin_transport_http_server_la_CFLAGS = \
- $(MHD_CFLAGS) $(AM_CFLAGS)
-
-libgnunet_plugin_transport_https_client_la_SOURCES = \
- plugin_transport_http_client.c plugin_transport_http_common.c
-libgnunet_plugin_transport_https_client_la_LIBADD = \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
- @LIBCURL@ \
- $(top_builddir)/src/util/libgnunetutil.la
-libgnunet_plugin_transport_https_client_la_LDFLAGS = \
- $(GN_LIBINTL) \
- $(GN_PLUGIN_LDFLAGS)
-libgnunet_plugin_transport_https_client_la_CFLAGS = \
- @LIBCURL_CPPFLAGS@ $(AM_CFLAGS) -DBUILD_HTTPS
-
-
-libgnunet_plugin_transport_https_server_la_SOURCES = \
- plugin_transport_http_server.c plugin_transport_http_common.c
-libgnunet_plugin_transport_https_server_la_LIBADD = \
- $(MHD_LIBS) \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \
- $(top_builddir)/src/nat/libgnunetnatnew.la \
- $(top_builddir)/src/util/libgnunetutil.la
-libgnunet_plugin_transport_https_server_la_LDFLAGS = \
- $(GN_LIBINTL) \
- $(GN_PLUGIN_LDFLAGS)
-libgnunet_plugin_transport_https_server_la_CFLAGS = \
- $(MHD_CFLAGS) $(AM_CFLAGS) -DBUILD_HTTPS
-
check_PROGRAMS = \
- test_transport_address_switch_tcp \
- test_transport_testing_startstop \
- test_transport_testing_restart \
- test_plugin_tcp \
- $(UNIX_TEST) \
- $(WLAN_PLUGIN_TEST) \
- $(BT_PLUGIN_TEST) \
- test_http_common \
- $(HTTP_CLIENT_PLUGIN_TEST) \
- $(HTTPS_CLIENT_PLUGIN_TEST) \
- $(HTTP_SERVER_PLUGIN_TEST) \
- $(HTTPS_SERVER_PLUGIN_TEST) \
- test_transport_api_blacklisting_tcp \
- test_transport_api_disconnect_tcp \
- test_transport_api_tcp \
- test_transport_api2_tcp \
- test_transport_api_restart_1peer \
- test_transport_api_restart_2peers \
- test_transport_api_timeout_tcp \
- test_transport_api_limited_sockets_tcp \
- test_transport_api_tcp_nat \
- $(UNIX_PLUGIN_TEST) \
- $(UNIX_PLUGIN_TIMEOUT_TEST) \
- $(UNIX_API_ABSTRACT_TEST) \
- $(HTTP_API_TEST) \
- $(HTTP_REVERSE_API_TEST) \
- $(HTTP_API_TIMEOUT_TEST) \
- $(HTTP_SWITCH) \
- $(HTTPS_API_TEST) \
- $(HTTPS_API_TIMEOUT_TEST) \
- $(HTTPS_SWITCH) \
- $(WLAN_API_TEST) \
- $(WLAN_TIMEOUT_TEST) \
- $(BT_API_TEST) \
- $(BT_TIMEOUT_TEST) \
- test_transport_api_multi \
- test_transport_api_monitor_peers \
- test_transport_blacklisting_no_bl \
- test_transport_blacklisting_outbound_bl_full \
- test_transport_blacklisting_outbound_bl_plugin \
- test_transport_blacklisting_inbound_bl_plugin \
- test_transport_blacklisting_inbound_bl_full \
- test_transport_blacklisting_multiple_plugins \
- test_transport_api_manipulation_send_tcp \
- test_transport_api_manipulation_recv_tcp \
- test_transport_api_manipulation_cfg \
- test_transport_api_reliability_tcp \
- test_transport_api_reliability_tcp_nat \
- $(UNIX_REL_TEST) \
- $(HTTP_REL_TEST) \
- $(HTTPS_REL_TEST) \
- $(WLAN_REL_TEST) \
- $(WLAN_UREL_TEST) \
- $(BT_REL_TEST) \
- $(BT_UREL_TEST) \
- test_quota_compliance_tcp \
- test_quota_compliance_tcp_asymmetric \
- $(UNIX_QUOTA_TEST) \
- $(HTTP_QUOTA_TEST) \
- $(HTTPS_QUOTA_TEST) \
- $(WLAN_QUOTA_TEST) \
- $(BT_QUOTA_TEST)
-if HAVE_GETOPT_BINARY
-check_PROGRAMS += \
-test_transport_api_slow_ats
-endif
+ test_communicator_basic-unix \
+ test_communicator_basic-tcp \
+ test_communicator_basic-udp \
+ test_communicator_basic-quic \
+ test_communicator_rekey-tcp \
+ test_communicator_rekey-udp \
+ test_communicator_backchannel-udp \
+ test_communicator_bidirect-tcp
+
+# Only test TNG if we run experimental
if HAVE_EXPERIMENTAL
-check_PROGRAMS += \
- test_transport_address_switch_udp \
- test_plugin_udp \
- test_transport_api_udp \
- test_transport_api_timeout_udp \
- test_transport_api_udp_nat \
- test_transport_api_reliability_udp \
- test_quota_compliance_udp \
- test_communicator_basic-unix \
- test_communicator_basic-tcp \
- test_communicator_basic-udp \
- test_communicator_basic-quic \
- test_communicator_rekey-tcp \
- test_communicator_rekey-udp \
- test_communicator_backchannel-udp \
- test_communicator_bidirect-tcp
+check_SCRIPTS= \
+ test_transport_start_testcase.sh \
+ test_transport_simple_send_performance.sh \
+ test_transport_nat_icmp_tcp.sh \
+ test_transport_nat_upnp.sh \
+ test_transport_simple_send_string.sh \
+ test_transport_simple_send.sh \
+ test_transport_simple_send_broadcast.sh \
+ test_transport_udp_backchannel.sh \
+ test_transport_simple_send_dv_circle.sh \
+ test_transport_simple_send_dv_inverse.sh
endif
if ENABLE_TEST_RUN
AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export
PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;unset XDG_DATA_HOME;unset
XDG_CONFIG_HOME;
TESTS = \
- test_transport_address_switch_tcp \
- $(HTTP_SWITCH) \
- $(HTTPS_SWITCH) \
- test_transport_testing_startstop \
- test_transport_testing_restart \
- test_plugin_tcp \
- $(UNIX_TEST) \
- $(WLAN_PLUGIN_TEST) \
- $(BT_PLUGIN_TEST) \
- test_transport_api_blacklisting_tcp \
- test_transport_api_disconnect_tcp \
- test_transport_api_tcp \
- test_transport_api_restart_1peer \
- test_transport_api_restart_2peers \
- test_transport_api_limited_sockets_tcp \
- test_transport_api_tcp_nat \
- $(UNIX_PLUGIN_TEST) \
- $(UNIX_API_ABSTRACT_TEST) \
- $(HTTP_API_TEST) \
- $(HTTPS_API_TEST) \
- $(WLAN_API_TEST) \
- $(BT_API_TEST) \
- test_transport_api_multi \
- test_transport_api_monitor_peers \
- test_transport_blacklisting_no_bl \
- test_transport_blacklisting_outbound_bl_full \
- test_transport_blacklisting_outbound_bl_plugin \
- test_transport_blacklisting_inbound_bl_plugin \
- test_transport_blacklisting_inbound_bl_full \
- test_transport_blacklisting_multiple_plugins \
- test_transport_api_manipulation_send_tcp \
- test_transport_api_manipulation_recv_tcp \
- test_transport_api_manipulation_cfg \
- test_transport_api_reliability_tcp \
- test_transport_api_reliability_tcp_nat \
- $(UNIX_REL_TEST) \
- $(HTTP_REL_TEST) \
- $(HTTPS_REL_TEST) \
- $(WLAN_REL_TEST) \
- $(WLAN_UREL_TEST) \
- $(BT_REL_TEST) \
- $(BT_UREL_TEST) \
- test_quota_compliance_tcp \
- test_quota_compliance_tcp_asymmetric \
- $(UNIX_QUOTA_TEST) \
- $(HTTP_QUOTA_TEST) \
- $(HTTPS_QUOTA_TEST) \
- test_transport_api_timeout_tcp \
- $(UNIX_PLUGIN_TIMEOUT_TEST) \
- $(HTTP_API_TIMEOUT_TEST) \
- $(HTTPS_API_TIMEOUT_TEST) \
- $(WLAN_TIMEOUT_TEST) \
- $(BT_TIMEOUT_TEST) \
- $(check_SCRIPTS)
-if HAVE_GETOPT_BINARY
-TESTS += \
-test_transport_api_slow_ats
-endif
-if HAVE_EXPERIMENTAL
-TESTS += \
- test_transport_address_switch_udp \
- test_plugin_udp \
- test_transport_api_udp \
- test_transport_api_timeout_udp \
- test_transport_api_udp_nat \
- test_transport_api_reliability_udp \
- test_quota_compliance_udp \
+ $(check_SCRIPTS) \
test_communicator_basic-unix \
test_communicator_basic-tcp \
test_communicator_basic-quic \
@@ -797,22 +340,7 @@ TESTS += \
test_communicator_backchannel-udp \
test_communicator_bidirect-tcp
endif
-endif
-# Only test TNG if we run experimental
-if HAVE_EXPERIMENTAL
-check_SCRIPTS= \
- test_transport_start_testcase.sh \
- test_transport_simple_send_performance.sh \
- test_transport_nat_icmp_tcp.sh \
- test_transport_nat_upnp.sh \
- test_transport_simple_send_string.sh \
- test_transport_simple_send.sh \
- test_transport_simple_send_broadcast.sh \
- test_transport_udp_backchannel.sh \
- test_transport_simple_send_dv_circle.sh \
- test_transport_simple_send_dv_inverse.sh
-endif
test_transport_start_with_config_SOURCES = \
test_transport_start_with_config.c
@@ -823,116 +351,6 @@ test_transport_start_with_config_LDADD = \
libgnunettransportcore.la \
libgnunettransporttesting2.la
-test_transport_testing_startstop_SOURCES = \
- test_transport_testing_startstop.c
-test_transport_testing_startstop_LDADD = \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- libgnunettransporttesting.la
-
-test_transport_testing_restart_SOURCES = \
- test_transport_testing_restart.c
-test_transport_testing_restart_LDADD = \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- libgnunettransporttesting.la
-
-test_transport_api_blacklisting_tcp_SOURCES = \
- test_transport_api_blacklisting.c
-test_transport_api_blacklisting_tcp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_blacklisting_no_bl_SOURCES = \
- test_transport_blacklisting.c
-test_transport_blacklisting_no_bl_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_blacklisting_outbound_bl_full_SOURCES = \
- test_transport_blacklisting.c
-test_transport_blacklisting_outbound_bl_full_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_blacklisting_outbound_bl_plugin_SOURCES = \
- test_transport_blacklisting.c
-test_transport_blacklisting_outbound_bl_plugin_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_blacklisting_inbound_bl_full_SOURCES = \
- test_transport_blacklisting.c
-test_transport_blacklisting_inbound_bl_full_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_blacklisting_inbound_bl_plugin_SOURCES = \
- test_transport_blacklisting.c
-test_transport_blacklisting_inbound_bl_plugin_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_blacklisting_multiple_plugins_SOURCES = \
- test_transport_blacklisting.c
-test_transport_blacklisting_multiple_plugins_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-
-test_transport_api_disconnect_tcp_SOURCES = \
- test_transport_api_disconnect.c
-test_transport_api_disconnect_tcp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_plugin_tcp_SOURCES = \
- test_plugin_transport.c
-test_plugin_tcp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-if HAVE_EXPERIMENTAL
-test_plugin_udp_SOURCES = \
- test_plugin_transport.c
-test_plugin_udp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-endif
-
-if HAVE_EXPERIMENTAL
test_communicator_basic_unix_SOURCES = \
test_communicator_basic.c
test_communicator_basic_unix_LDADD = \
@@ -996,87 +414,6 @@ test_communicator_bidirect_tcp_LDADD = \
$(top_builddir)/src/testing/libgnunettesting.la \
$(top_builddir)/src/util/libgnunetutil.la \
$(top_builddir)/src/statistics/libgnunetstatistics.la
-endif
-
-test_plugin_unix_SOURCES = \
- test_plugin_transport.c
-test_plugin_unix_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_plugin_wlan_SOURCES = \
- test_plugin_transport.c
-test_plugin_wlan_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_plugin_bluetooth_SOURCES = \
- test_plugin_transport.c
-test_plugin_bluetooth_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_http_common_SOURCES = \
- test_http_common.c plugin_transport_http_common.c
-test_http_common_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_plugin_http_server_SOURCES = \
- test_plugin_transport.c
-test_plugin_http_server_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_plugin_https_server_SOURCES = \
- test_plugin_transport.c
-test_plugin_https_server_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_plugin_http_client_SOURCES = \
- test_plugin_transport.c
-test_plugin_http_client_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_plugin_https_client_SOURCES = \
- test_plugin_transport.c
-test_plugin_https_client_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_tcp_SOURCES = \
- test_transport_api.c
-test_transport_api_tcp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
test_transport_api2_tcp_SOURCES = \
test_transport_api2.c
@@ -1085,482 +422,6 @@ test_transport_api2_tcp_LDADD = \
$(top_builddir)/src/util/libgnunetutil.la \
libgnunettransporttesting2.la
-test_transport_api_restart_1peer_SOURCES = \
- test_transport_api_restart_reconnect.c
-test_transport_api_restart_1peer_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_restart_2peers_SOURCES = \
- test_transport_api_restart_reconnect.c
-test_transport_api_restart_2peers_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
-$(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_limited_sockets_tcp_SOURCES = \
- test_transport_api_limited_sockets.c
-test_transport_api_limited_sockets_tcp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_tcp_nat_SOURCES = \
- test_transport_api.c
-test_transport_api_tcp_nat_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_manipulation_send_tcp_SOURCES = \
- test_transport_api_manipulation_send_tcp.c
-test_transport_api_manipulation_send_tcp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_manipulation_recv_tcp_SOURCES = \
- test_transport_api_manipulation_recv_tcp.c
-test_transport_api_manipulation_recv_tcp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_manipulation_cfg_SOURCES = \
- test_transport_api_manipulation_cfg.c
-test_transport_api_manipulation_cfg_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_reliability_tcp_SOURCES = \
- test_transport_api_reliability.c
-test_transport_api_reliability_tcp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_timeout_tcp_SOURCES = \
- test_transport_api_timeout.c
-test_transport_api_timeout_tcp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_timeout_unix_SOURCES = \
- test_transport_api_timeout.c
-test_transport_api_timeout_unix_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_timeout_wlan_SOURCES = \
- test_transport_api_timeout.c
-test_transport_api_timeout_wlan_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_timeout_bluetooth_SOURCES = \
- test_transport_api_timeout.c
-test_transport_api_timeout_bluetooth_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_reliability_tcp_nat_SOURCES = \
- test_transport_api_reliability.c
-test_transport_api_reliability_tcp_nat_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_reliability_bluetooth_SOURCES = \
- test_transport_api_reliability.c
-test_transport_api_reliability_bluetooth_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_reliability_wlan_SOURCES = \
- test_transport_api_reliability.c
-test_transport_api_reliability_wlan_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-if HAVE_EXPERIMENTAL
-test_transport_api_udp_SOURCES = \
- test_transport_api.c
-test_transport_api_udp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_timeout_udp_SOURCES = \
- test_transport_api_timeout.c
-test_transport_api_timeout_udp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_udp_nat_SOURCES = \
- test_transport_api.c
-test_transport_api_udp_nat_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-endif
-
-test_transport_api_unix_SOURCES = \
- test_transport_api.c
-test_transport_api_unix_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_unix_abstract_SOURCES = \
- test_transport_api.c
-test_transport_api_unix_abstract_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-# HTTP tests
-test_transport_api_http_SOURCES = \
- test_transport_api.c
-test_transport_api_http_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_http_reverse_SOURCES = \
- test_transport_api.c
-test_transport_api_http_reverse_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_timeout_http_SOURCES = \
- test_transport_api_timeout.c
-test_transport_api_timeout_http_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_reliability_http_SOURCES = \
- test_transport_api_reliability.c
-test_transport_api_reliability_http_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_reliability_http_xhr_SOURCES = \
- test_transport_api_reliability.c
-test_transport_api_reliability_http_xhr_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_quota_compliance_http_SOURCES = \
- test_quota_compliance.c
-test_quota_compliance_http_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_quota_compliance_http_asymmetric_SOURCES = \
- test_quota_compliance.c
-test_quota_compliance_http_asymmetric_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_quota_compliance_https_SOURCES = \
- test_quota_compliance.c
-test_quota_compliance_https_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_quota_compliance_https_asymmetric_SOURCES = \
- test_quota_compliance.c
-test_quota_compliance_https_asymmetric_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-# HTTPS tests
-test_transport_api_https_SOURCES = \
- test_transport_api.c
-test_transport_api_https_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_timeout_https_SOURCES = \
- test_transport_api_timeout.c
-test_transport_api_timeout_https_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-
-test_transport_api_reliability_https_SOURCES = \
- test_transport_api_reliability.c
-test_transport_api_reliability_https_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_reliability_https_xhr_SOURCES = \
- test_transport_api_reliability.c
-test_transport_api_reliability_https_xhr_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_reliability_unix_SOURCES = \
- test_transport_api_reliability.c
-test_transport_api_reliability_unix_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-if HAVE_EXPERIMENTAL
-test_transport_api_reliability_udp_SOURCES = \
- test_transport_api_reliability.c
-test_transport_api_reliability_udp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-endif
-
-if LINUX
-test_transport_api_wlan_SOURCES = \
- test_transport_api.c
-test_transport_api_wlan_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-endif
-
-if LINUX
-if HAVE_LIBBLUETOOTH
-test_transport_api_bluetooth_SOURCES = \
- test_transport_api.c
-test_transport_api_bluetooth_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-endif
-endif
-
-test_transport_address_switch_tcp_SOURCES = \
- test_transport_address_switch.c
-test_transport_address_switch_tcp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-if HAVE_EXPERIMENTAL
-test_transport_address_switch_udp_SOURCES = \
- test_transport_address_switch.c
-test_transport_address_switch_udp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-endif
-
- test_transport_address_switch_http_SOURCES = \
- test_transport_address_switch.c
-test_transport_address_switch_http_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
- test_transport_address_switch_https_SOURCES = \
- test_transport_address_switch.c
-test_transport_address_switch_https_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/statistics/libgnunetstatistics.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_quota_compliance_tcp_SOURCES = \
- test_quota_compliance.c
-test_quota_compliance_tcp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_quota_compliance_tcp_asymmetric_SOURCES = \
- test_quota_compliance.c
-test_quota_compliance_tcp_asymmetric_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-if HAVE_EXPERIMENTAL
-test_quota_compliance_udp_SOURCES = \
- test_quota_compliance.c
-test_quota_compliance_udp_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-endif
-
-test_quota_compliance_unix_SOURCES = \
- test_quota_compliance.c
-test_quota_compliance_unix_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_quota_compliance_unix_asymmetric_SOURCES = \
- test_quota_compliance.c
-test_quota_compliance_unix_asymmetric_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_quota_compliance_wlan_SOURCES = \
- test_quota_compliance.c
-test_quota_compliance_wlan_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_quota_compliance_wlan_asymmetric_SOURCES = \
- test_quota_compliance.c
-test_quota_compliance_wlan_asymmetric_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_quota_compliance_bluetooth_SOURCES = \
- test_quota_compliance.c
-test_quota_compliance_bluetooth_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_quota_compliance_bluetooth_asymmetric_SOURCES = \
- test_quota_compliance.c
-test_quota_compliance_bluetooth_asymmetric_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/ats/libgnunetats.la \
- $(top_builddir)/src/nt/libgnunetnt.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_multi_SOURCES = \
- test_transport_api.c
-test_transport_api_multi_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_monitor_peers_SOURCES = \
- test_transport_api_monitor_peers.c
-test_transport_api_monitor_peers_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-test_transport_api_slow_ats_SOURCES = \
- test_transport_api.c
-test_transport_api_slow_ats_LDADD = \
- libgnunettransport.la \
- $(top_builddir)/src/hello/libgnunethello.la \
- $(top_builddir)/src/util/libgnunetutil.la \
- libgnunettransporttesting.la
-
-
EXTRA_DIST = \
test_transport_start_testcase.sh \
test_transport_simple_send_performance.sh \
@@ -1573,78 +434,16 @@ test_transport_udp_backchannel.sh \
test_transport_simple_send_dv_circle.sh \
test_transport_simple_send_dv_inverse.sh \
gnunet-transport-certificate-creation.in \
-communicator-unix.conf \
test_plugin_hostkey \
test_plugin_hostkey.ecc \
test_delay \
template_cfg_peer1.conf\
template_cfg_peer2.conf\
-test_plugin_transport_data.conf\
-test_plugin_transport_data_udp.conf\
-test_quota_compliance_data.conf\
-test_quota_compliance_http_peer1.conf\
-test_quota_compliance_http_peer2.conf\
-test_quota_compliance_https_peer1.conf\
-test_quota_compliance_https_peer2.conf\
-test_quota_compliance_tcp_peer1.conf\
-test_quota_compliance_tcp_peer2.conf\
-test_quota_compliance_udp_peer1.conf\
-test_quota_compliance_udp_peer2.conf\
-test_quota_compliance_unix_peer1.conf\
-test_quota_compliance_unix_peer2.conf\
-test_quota_compliance_wlan_peer1.conf\
-test_quota_compliance_wlan_peer2.conf\
-test_quota_compliance_bluetooth_peer1.conf\
-test_quota_compliance_bluetooth_peer2.conf\
-test_quota_compliance_http_asymmetric_peer1.conf\
-test_quota_compliance_http_asymmetric_peer2.conf\
-test_quota_compliance_https_asymmetric_peer1.conf\
-test_quota_compliance_https_asymmetric_peer2.conf\
-test_quota_compliance_tcp_asymmetric_peer1.conf\
-test_quota_compliance_tcp_asymmetric_peer2.conf\
-test_quota_compliance_unix_asymmetric_peer1.conf\
-test_quota_compliance_unix_asymmetric_peer2.conf\
-test_quota_compliance_wlan_asymmetric_peer1.conf\
-test_quota_compliance_wlan_asymmetric_peer2.conf\
-test_quota_compliance_bluetooth_asymmetric_peer1.conf\
-test_quota_compliance_bluetooth_asymmetric_peer2.conf\
test_transport_api_data.conf\
-test_transport_api_blacklisting_tcp_peer1.conf \
-test_transport_api_blacklisting_tcp_peer2.conf \
-test_transport_api_http_peer1.conf\
-test_transport_api_http_peer2.conf\
-test_transport_api_https_peer1.conf\
-test_transport_api_https_peer2.conf\
-test_transport_api_limited_sockets_tcp_peer1.conf\
-test_transport_api_limited_sockets_tcp_peer2.conf\
test_transport_api_timeout_tcp_peer1.conf\
test_transport_api_timeout_tcp_peer2.conf\
test_transport_api_multi_peer1.conf\
test_transport_api_multi_peer2.conf\
-test_transport_api_restart_1peer_peer1.conf\
-test_transport_api_restart_1peer_peer2.conf\
-test_transport_api_reliability_http_peer1.conf\
-test_transport_api_reliability_http_peer2.conf\
-test_transport_api_reliability_https_peer1.conf\
-test_transport_api_reliability_https_peer2.conf\
-test_transport_api_reliability_tcp_nat_peer1.conf\
-test_transport_api_reliability_tcp_nat_peer2.conf\
-test_transport_api_reliability_tcp_peer1.conf\
-test_transport_api_reliability_tcp_peer2.conf\
-test_transport_api_reliability_wlan_peer1.conf\
-test_transport_api_reliability_wlan_peer2.conf\
-test_transport_api_reliability_bluetooth_peer1.conf\
-test_transport_api_reliability_bluetooth_peer2.conf\
-test_transport_api_manipulation_send_tcp_peer1.conf\
-test_transport_api_manipulation_send_tcp_peer2.conf\
-test_transport_api_manipulation_recv_tcp_peer1.conf\
-test_transport_api_manipulation_recv_tcp_peer2.conf\
-test_transport_api_manipulation_cfg_peer1.conf\
-test_transport_api_manipulation_cfg_peer2.conf\
-test_transport_api_restart_1peer_peer1.conf\
-test_transport_api_restart_1peer_peer2.conf\
-test_transport_api_restart_2peers_peer1.conf\
-test_transport_api_restart_2peers_peer2.conf\
test_transport_api_tcp_nat_peer1.conf\
test_transport_api_tcp_nat_peer2.conf\
test_transport_api_tcp_peer1.conf\
@@ -1655,65 +454,13 @@ test_transport_api_udp_nat_peer1.conf\
test_transport_api_udp_nat_peer2.conf\
test_transport_api_udp_peer1.conf\
test_transport_api_udp_peer2.conf\
-test_transport_api_timeout_udp_peer1.conf\
-test_transport_api_timeout_udp_peer2.conf\
test_transport_api_unix_peer1.conf\
test_transport_api_unix_peer2.conf\
-test_transport_api_unix_abstract_peer1.conf \
-test_transport_api_unix_abstract_peer2.conf \
-test_transport_api_timeout_unix_peer1.conf\
-test_transport_api_timeout_unix_peer2.conf\
-test_transport_api_timeout_wlan_peer1.conf \
-test_transport_api_timeout_wlan_peer2.conf \
-test_transport_api_timeout_bluetooth_peer1.conf\
-test_transport_api_timeout_bluetooth_peer2.conf\
-test_transport_api_reliability_udp_peer1.conf\
-test_transport_api_reliability_udp_peer2.conf\
-test_transport_api_reliability_http_xhr_peer1.conf\
-test_transport_api_reliability_http_xhr_peer2.conf\
-test_transport_api_reliability_https_xhr_peer1.conf\
-test_transport_api_reliability_https_xhr_peer2.conf\
-test_transport_api_reliability_unix_peer1.conf\
-test_transport_api_reliability_unix_peer2.conf\
-test_transport_api_reliability_wlan_peer1.conf\
-test_transport_api_reliability_wlan_peer2.conf\
-test_transport_api_unreliability_wlan_peer1.conf\
-test_transport_api_unreliability_wlan_peer2.conf\
-test_transport_api_reliability_bluetooth_peer1.conf\
-test_transport_api_reliability_bluetooth_peer2.conf\
-test_transport_api_wlan_peer1.conf\
-test_transport_api_wlan_peer2.conf\
-test_transport_api_bluetooth_peer1.conf\
-test_transport_api_bluetooth_peer2.conf\
test_transport_api_monitor_peers_peer1.conf\
test_transport_api_monitor_peers_peer2.conf\
test_transport_api_monitor_validation_peer1.conf\
test_transport_api_monitor_validation_peer2.conf\
test_transport_defaults.conf\
-test_transport_api_disconnect_tcp_peer1.conf\
-test_transport_api_disconnect_tcp_peer2.conf\
-test_transport_api_timeout_http_peer1.conf\
-test_transport_api_timeout_http_peer2.conf\
-test_transport_api_timeout_https_peer1.conf\
-test_transport_api_timeout_https_peer2.conf\
-test_transport_blacklisting_cfg_peer1.conf \
-test_transport_blacklisting_cfg_peer2.conf \
-test_transport_blacklisting_cfg_blp_peer1_full.conf\
-test_transport_blacklisting_cfg_blp_peer1_plugin.conf \
-test_transport_blacklisting_cfg_blp_peer2_full.conf\
-test_transport_blacklisting_cfg_blp_peer2_plugin.conf \
-test_transport_blacklisting_cfg_blp_peer1_multiple_plugins.conf \
-test_transport_blacklisting_cfg_blp_peer2_multiple_plugins.conf \
-test_transport_api_http_reverse_peer1.conf \
-test_transport_api_http_reverse_peer2.conf \
-perf_tcp_peer1.conf \
-perf_tcp_peer2.conf \
-test_transport_api_slow_ats_peer1.conf \
-test_transport_api_slow_ats_peer2.conf \
- tcp_connection_legacy.c \
- tcp_server_mst_legacy.c \
- tcp_server_legacy.c \
- tcp_service_legacy.c \
test_communicator_unix_basic_peer1.conf \
test_communicator_unix_basic_peer2.conf \
test_communicator_tcp_basic_peer1.conf \
diff --git a/src/transport/communicator-unix.conf
b/src/transport/communicator-unix.conf
deleted file mode 100644
index ad92616c6..000000000
--- a/src/transport/communicator-unix.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-[communicator-unix]
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-communicator-unix.sock
diff --git a/src/transport/gnunet-helper-transport-bluetooth.c
b/src/transport/gnunet-helper-transport-bluetooth.c
deleted file mode 100644
index 64f3b6160..000000000
--- a/src/transport/gnunet-helper-transport-bluetooth.c
+++ /dev/null
@@ -1,2286 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010, 2011, 2012 GNUnet e.V.
- Copyright (C) 2007, 2008, Andy Green <andy@warmcat.com>
- Copyright (C) 2009 Thomas d'Otreppe
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-#include "platform.h"
-#include "gnunet_private_config.h"
-
-#include <bluetooth/bluetooth.h>
-#include <bluetooth/hci.h>
-#include <bluetooth/hci_lib.h>
-#include <bluetooth/rfcomm.h>
-#include <bluetooth/sdp.h>
-#include <bluetooth/sdp_lib.h>
-#include <errno.h>
-#include <linux/if.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/ioctl.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "plugin_transport_wlan.h"
-#include "gnunet_protocols.h"
-
-
-/**
- * Maximum number of ports assignable for RFCOMMM protocol.
- */
-#define MAX_PORTS 30
-
-/**
- * Maximum size of a message allowed in either direction
- * (used for our receive and sent buffers).
- */
-#define MAXLINE 4096
-
-
-/**
- * Maximum number of loops without inquiring for new devices.
- */
-#define MAX_LOOPS 5
-
-/**
- * In bluez library, the maximum name length of a device is 8
- */
-#define BLUEZ_DEVNAME_SIZE 8
-
-/**
- * struct for storing the information of the hardware. There is only
- * one of these.
- */
-struct HardwareInfos
-{
- /**
- * Name of the interface, not necessarily 0-terminated (!).
- */
- char iface[IFNAMSIZ];
-
- /**
- * file descriptor for the rfcomm socket
- */
- int fd_rfcomm;
-
- /**
- * MAC address of our own bluetooth interface.
- */
- struct GNUNET_TRANSPORT_WLAN_MacAddress pl_mac;
-
- /**
- * SDP session
- */
- sdp_session_t *session;
-};
-
-/**
- * IO buffer used for buffering data in transit (to wireless or to stdout).
- */
-struct SendBuffer
-{
- /**
- * How many bytes of data are stored in 'buf' for transmission right now?
- * Data always starts at offset 0 and extends to 'size'.
- */
- size_t size;
-
- /**
- * How many bytes that were stored in 'buf' did we already write to the
- * destination? Always smaller than 'size'.
- */
- size_t pos;
-
- /**
- * Buffered data; twice the maximum allowed message size as we add some
- * headers.
- */
- char buf[MAXLINE * 2];
-};
-
-#ifdef __linux__
-/**
- * Devices buffer used to keep a list with all the discoverable devices in
- * order to send them HELLO messages one by one when it receive a broadcast
message.
- */
-struct BroadcastMessages
-{
- /* List with the discoverable devices' addresses */
- bdaddr_t devices[MAX_PORTS];
-
- /* List with the open sockets */
- int fds[MAX_PORTS];
-
-
- /* The number of the devices */
- int size;
-
- /* The current position */
- int pos;
-
- /* The device id */
- int dev_id;
-};
-
-/**
- * Address used to identify the broadcast messages.
- */
-static struct GNUNET_TRANSPORT_WLAN_MacAddress broadcast_address = { { 255,
255,
- 255,
255,
- 255,
- 255 } };
-
-/**
- * Buffer with the discoverable devices.
- */
-static struct BroadcastMessages neighbours;
-
-static int searching_devices_count = 0;
-#endif
-
-/**
- * Buffer for data read from stdin to be transmitted to the bluetooth device
- */
-static struct SendBuffer write_pout;
-
-/**
- * Buffer for data read from the bluetooth device to be transmitted to stdout.
- */
-static struct SendBuffer write_std;
-
-
-/* ****** this are the same functions as the ones used in
gnunet-helper-transport-wlan.c ****** */
-
-/**
- * To what multiple do we align messages? 8 byte should suffice for everyone
- * for now.
- */
-#define ALIGN_FACTOR 8
-
-/**
- * Smallest supported message.
- */
-#define MIN_BUFFER_SIZE sizeof(struct GNUNET_MessageHeader)
-
-
-/**
- * Functions with this signature are called whenever a
- * complete message is received by the tokenizer.
- *
- * @param cls closure
- * @param message the actual message
- */
-typedef void (*MessageTokenizerCallback) (void *cls,
- const struct
- GNUNET_MessageHeader *
- message);
-
-/**
- * Handle to a message stream tokenizer.
- */
-struct MessageStreamTokenizer
-{
- /**
- * Function to call on completed messages.
- */
- MessageTokenizerCallback cb;
-
- /**
- * Closure for cb.
- */
- void *cb_cls;
-
- /**
- * Size of the buffer (starting at 'hdr').
- */
- size_t curr_buf;
-
- /**
- * How many bytes in buffer have we already processed?
- */
- size_t off;
-
- /**
- * How many bytes in buffer are valid right now?
- */
- size_t pos;
-
- /**
- * Beginning of the buffer. Typed like this to force alignment.
- */
- struct GNUNET_MessageHeader *hdr;
-};
-
-
-/**
- * Create a message stream tokenizer.
- *
- * @param cb function to call on completed messages
- * @param cb_cls closure for cb
- * @return handle to tokenizer
- */
-static struct MessageStreamTokenizer *
-mst_create (MessageTokenizerCallback cb,
- void *cb_cls)
-{
- struct MessageStreamTokenizer *ret;
-
- ret = malloc (sizeof(struct MessageStreamTokenizer));
- if (NULL == ret)
- {
- fprintf (stderr, "Failed to allocate buffer for tokenizer\n");
- exit (1);
- }
- ret->hdr = malloc (MIN_BUFFER_SIZE);
- if (NULL == ret->hdr)
- {
- fprintf (stderr, "Failed to allocate buffer for alignment\n");
- exit (1);
- }
- ret->curr_buf = MIN_BUFFER_SIZE;
- ret->cb = cb;
- ret->cb_cls = cb_cls;
- ret->pos = 0;
-
- return ret;
-}
-
-
-/**
- * Add incoming data to the receive buffer and call the
- * callback for all complete messages.
- *
- * @param mst tokenizer to use
- * @param buf input data to add
- * @param size number of bytes in buf
- * @return GNUNET_OK if we are done processing (need more data)
- * GNUNET_SYSERR if the data stream is corrupt
- */
-static int
-mst_receive (struct MessageStreamTokenizer *mst,
- const char *buf, size_t size)
-{
- const struct GNUNET_MessageHeader *hdr;
- size_t delta;
- uint16_t want;
- char *ibuf;
- int need_align;
- unsigned long offset;
- int ret;
-
- ret = GNUNET_OK;
- ibuf = (char *) mst->hdr;
- while (mst->pos > 0)
- {
-do_align:
- if (mst->pos < mst->off)
- {
- // fprintf (stderr, "We processed too many bytes!\n");
- return GNUNET_SYSERR;
- }
- if ((mst->curr_buf - mst->off < sizeof(struct GNUNET_MessageHeader)) ||
- (0 != (mst->off % ALIGN_FACTOR)))
- {
- /* need to align or need more space */
- mst->pos -= mst->off;
- memmove (ibuf, &ibuf[mst->off], mst->pos);
- mst->off = 0;
- }
- if (mst->pos - mst->off < sizeof(struct GNUNET_MessageHeader))
- {
- delta =
- GNUNET_MIN (sizeof(struct GNUNET_MessageHeader)
- - (mst->pos - mst->off), size);
- GNUNET_memcpy (&ibuf[mst->pos], buf, delta);
- mst->pos += delta;
- buf += delta;
- size -= delta;
- }
- if (mst->pos - mst->off < sizeof(struct GNUNET_MessageHeader))
- {
- // FIXME should I reset ??
- // mst->off = 0;
- // mst->pos = 0;
- return GNUNET_OK;
- }
- hdr = (const struct GNUNET_MessageHeader *) &ibuf[mst->off];
- want = ntohs (hdr->size);
- if (want < sizeof(struct GNUNET_MessageHeader))
- {
- fprintf (stderr,
- "Received invalid message from stdin\n");
- return GNUNET_SYSERR;
- }
- if ((mst->curr_buf - mst->off < want) &&
- (mst->off > 0))
- {
- /* need more space */
- mst->pos -= mst->off;
- memmove (ibuf, &ibuf[mst->off], mst->pos);
- mst->off = 0;
- }
- if (want > mst->curr_buf)
- {
- if (mst->off != 0)
- {
- fprintf (stderr, "Error! We should proceeded 0 bytes\n");
- return GNUNET_SYSERR;
- }
- mst->hdr = realloc (mst->hdr, want);
- if (NULL == mst->hdr)
- {
- fprintf (stderr, "Failed to allocate buffer for alignment\n");
- exit (1);
- }
- ibuf = (char *) mst->hdr;
- mst->curr_buf = want;
- }
- hdr = (const struct GNUNET_MessageHeader *) &ibuf[mst->off];
- if (mst->pos - mst->off < want)
- {
- delta = GNUNET_MIN (want - (mst->pos - mst->off), size);
- if (mst->pos + delta > mst->curr_buf)
- {
- fprintf (stderr, "The size of the buffer will be exceeded!\n");
- return GNUNET_SYSERR;
- }
- GNUNET_memcpy (&ibuf[mst->pos], buf, delta);
- mst->pos += delta;
- buf += delta;
- size -= delta;
- }
- if (mst->pos - mst->off < want)
- {
- // FIXME should I use this?
- // mst->off = 0;
- // mst->pos = 0;
- return GNUNET_OK;
- }
- mst->cb (mst->cb_cls, hdr);
- mst->off += want;
- if (mst->off == mst->pos)
- {
- /* reset to beginning of buffer, it's free right now! */
- mst->off = 0;
- mst->pos = 0;
- }
- }
- if (0 != mst->pos)
- {
- fprintf (stderr,
- "There should some valid bytes in the buffer on this stage\n");
- return GNUNET_SYSERR;
- }
- while (size > 0)
- {
- if (size < sizeof(struct GNUNET_MessageHeader))
- break;
- offset = (unsigned long) buf;
- need_align = (0 != offset % ALIGN_FACTOR) ? GNUNET_YES : GNUNET_NO;
- if (GNUNET_NO == need_align)
- {
- /* can try to do zero-copy and process directly from original buffer */
- hdr = (const struct GNUNET_MessageHeader *) buf;
- want = ntohs (hdr->size);
- if (want < sizeof(struct GNUNET_MessageHeader))
- {
- fprintf (stderr,
- "Received invalid message from stdin\n");
- // exit (1);
- mst->off = 0;
- return GNUNET_SYSERR;
- }
- if (size < want)
- break; /* or not, buffer incomplete, so copy to
private buffer... */
- mst->cb (mst->cb_cls, hdr);
- buf += want;
- size -= want;
- }
- else
- {
- /* need to copy to private buffer to align;
- * yes, we go a bit more spaghetti than usual here */
- goto do_align;
- }
- }
- if (size > 0)
- {
- if (size + mst->pos > mst->curr_buf)
- {
- mst->hdr = realloc (mst->hdr, size + mst->pos);
- if (NULL == mst->hdr)
- {
- fprintf (stderr, "Failed to allocate buffer for alignment\n");
- exit (1);
- }
- ibuf = (char *) mst->hdr;
- mst->curr_buf = size + mst->pos;
- }
- if (mst->pos + size > mst->curr_buf)
- {
- fprintf (stderr,
- "Assertion failed\n");
- exit (1);
- }
- GNUNET_memcpy (&ibuf[mst->pos], buf, size);
- mst->pos += size;
- }
- return ret;
-}
-
-
-/**
- * Destroys a tokenizer.
- *
- * @param mst tokenizer to destroy
- */
-static void
-mst_destroy (struct MessageStreamTokenizer *mst)
-{
- free (mst->hdr);
- free (mst);
-}
-
-
-/**
- * Calculate crc32, the start of the calculation
- *
- * @param buf buffer to calc the crc
- * @param len len of the buffer
- * @return crc sum
- */
-static unsigned long
-calc_crc_osdep (const unsigned char *buf, size_t len)
-{
- static const unsigned long int crc_tbl_osdep[256] = {
- 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
- 0xE963A535, 0x9E6495A3,
- 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD,
- 0xE7B82D07, 0x90BF1D91,
- 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB,
- 0xF4D4B551, 0x83D385C7,
- 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
- 0xFA0F3D63, 0x8D080DF5,
- 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447,
- 0xD20D85FD, 0xA50AB56B,
- 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75,
- 0xDCD60DCF, 0xABD13D59,
- 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
- 0xCFBA9599, 0xB8BDA50F,
- 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11,
- 0xC1611DAB, 0xB6662D3D,
- 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F,
- 0x9FBFE4A5, 0xE8B8D433,
- 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
- 0x91646C97, 0xE6635C01,
- 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B,
- 0x8208F4C1, 0xF50FC457,
- 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49,
- 0x8CD37CF3, 0xFBD44C65,
- 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
- 0xA4D1C46D, 0xD3D6F4FB,
- 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5,
- 0xAA0A4C5F, 0xDD0D7CC9,
- 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3,
- 0xB966D409, 0xCE61E49F,
- 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
- 0xB7BD5C3B, 0xC0BA6CAD,
- 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF,
- 0x04DB2615, 0x73DC1683,
- 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D,
- 0x0A00AE27, 0x7D079EB1,
- 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
- 0x196C3671, 0x6E6B06E7,
- 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9,
- 0x17B7BE43, 0x60B08ED5,
- 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767,
- 0x3FB506DD, 0x48B2364B,
- 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
- 0x316E8EEF, 0x4669BE79,
- 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703,
- 0x220216B9, 0x5505262F,
- 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31,
- 0x2CD99E8B, 0x5BDEAE1D,
- 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
- 0x72076785, 0x05005713,
- 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D,
- 0x7CDCEFB7, 0x0BDBDF21,
- 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B,
- 0x6FB077E1, 0x18B74777,
- 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
- 0x616BFFD3, 0x166CCF45,
- 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7,
- 0x4969474D, 0x3E6E77DB,
- 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5,
- 0x47B2CF7F, 0x30B5FFE9,
- 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
- 0x54DE5729, 0x23D967BF,
- 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1,
- 0x5A05DF1B, 0x2D02EF8D
- };
-
- unsigned long crc = 0xFFFFFFFF;
-
- for (; len > 0; len--, buf++)
- crc = crc_tbl_osdep[(crc ^ *buf) & 0xFF] ^ (crc >> 8);
- return(~crc);
-}
-
-
-/**
- * Calculate and check crc of the bluetooth packet
- *
- * @param buf buffer of the packet, with len + 4 bytes of data,
- * the last 4 bytes being the checksum
- * @param len length of the payload in data
- * @return 0 on success (checksum matches), 1 on error
- */
-static int
-check_crc_buf_osdep (const unsigned char *buf, size_t len)
-{
- unsigned long crc;
-
- crc = calc_crc_osdep (buf, len);
- buf += len;
- if ((((crc) & 0xFF) == buf[0]) && (((crc >> 8) & 0xFF) == buf[1]) &&
- ( ((crc >> 16) & 0xFF) == buf[2]) && ( ((crc >> 24) & 0xFF) == buf[3]) )
- return 0;
- return 1;
-}
-
-
-/* ************** end of clone ***************** */
-#ifdef __linux__
-/**
- * Function for assigning a port number
- *
- * @param socket the socket used to bind
- * @param addr pointer to the rfcomm address
- * @return 0 on success
- */
-static int
-bind_socket (int socket, struct sockaddr_rc *addr)
-{
- int port, status;
-
- /* Bind every possible port (from 0 to 30) and stop when binding doesn't
fail */
- // FIXME : it should start from port 1, but on my computer it doesn't work :)
- for (port = 3; port <= 30; port++)
- {
- addr->rc_channel = port;
- status = bind (socket, (struct sockaddr *) addr, sizeof(struct
- sockaddr_rc));
- if (status == 0)
- return 0;
- }
-
- return -1;
-}
-
-
-#endif
-
-/**
- * Function used for creating the service record and registering it.
- *
- * @param dev pointer to the device struct
- * @param rc_channel the rfcomm channel
- * @return 0 on success
- */
-static int
-register_service (struct HardwareInfos *dev, int rc_channel)
-{
- /**
- * 1. initializations
- * 2. set the service ID, class, profile information
- * 3. make the service record publicly browsable
- * 4. register the RFCOMM channel
- * 5. set the name, provider and description
- * 6. register the service record to the local SDP server
- * 7. cleanup
- */uint8_t svc_uuid_int[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- dev->pl_mac.mac[5], dev->pl_mac.mac[4],
- dev->pl_mac.mac[3],
- dev->pl_mac.mac[2], dev->pl_mac.mac[1],
- dev->pl_mac.mac[0] };
- const char *service_dsc = "Bluetooth plugin services";
- const char *service_prov = "GNUnet provider";
- uuid_t root_uuid, rfcomm_uuid, svc_uuid;
- sdp_list_t *root_list = 0, *rfcomm_list = 0, *proto_list = 0,
- *access_proto_list = 0, *svc_list = 0;
- sdp_record_t *record = 0;
- sdp_data_t *channel = 0;
-
- record = sdp_record_alloc ();
-
- /* Set the general service ID */
- sdp_uuid128_create (&svc_uuid, &svc_uuid_int);
- svc_list = sdp_list_append (0, &svc_uuid);
- sdp_set_service_classes (record, svc_list);
- sdp_set_service_id (record, svc_uuid);
-
- /* Make the service record publicly browsable */
- sdp_uuid16_create (&root_uuid, PUBLIC_BROWSE_GROUP);
- root_list = sdp_list_append (0, &root_uuid);
- sdp_set_browse_groups (record, root_list);
-
- /* Register the RFCOMM channel */
- sdp_uuid16_create (&rfcomm_uuid, RFCOMM_UUID);
- channel = sdp_data_alloc (SDP_UINT8, &rc_channel);
- rfcomm_list = sdp_list_append (0, &rfcomm_uuid);
- sdp_list_append (rfcomm_list, channel);
- proto_list = sdp_list_append (0, rfcomm_list);
-
- /* Set protocol information */
- access_proto_list = sdp_list_append (0, proto_list);
- sdp_set_access_protos (record, access_proto_list);
-
- /* Set the name, provider, and description */
- sdp_set_info_attr (record, dev->iface, service_prov, service_dsc);
-
- /* Connect to the local SDP server */
- dev->session = sdp_connect (BDADDR_ANY, BDADDR_LOCAL, SDP_RETRY_IF_BUSY);
-
- if (! dev->session)
- {
- fprintf (stderr,
- "Failed to connect to the SDP server on interface `%.*s': %s\n",
- IFNAMSIZ, dev->iface, strerror (errno));
- // FIXME exit?
- return 1;
- }
-
- /* Register the service record */
- if (sdp_record_register (dev->session, record, 0) < 0)
- {
- fprintf (stderr,
- "Failed to register a service record on interface `%.*s': %s\n",
- IFNAMSIZ, dev->iface, strerror (errno));
- // FIXME exit?
- return 1;
- }
-
- /* Cleanup */
- sdp_data_free (channel);
- sdp_list_free (root_list, 0);
- sdp_list_free (rfcomm_list, 0);
- sdp_list_free (proto_list, 0);
- sdp_list_free (access_proto_list, 0);
- sdp_list_free (svc_list, 0);
- sdp_record_free (record);
-
- return 0;
-}
-
-
-/**
- * Function used for searching and browsing for a service. This will return the
- * port number on which the service is running.
- *
- * @param dev pointer to the device struct
- * @param dest target address
- * @return channel
- */
-static int
-get_channel (struct HardwareInfos *dev, bdaddr_t dest)
-{
- /**
- * 1. detect all nearby devices
- * 2. for each device:
- * 2.1. connect to the SDP server running
- * 2.2. get a list of service records with the specific UUID
- * 2.3. for each service record get a list of the protocol sequences and get
- * the port number
- */uint8_t svc_uuid_int[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- dest.b[5], dest.b[4], dest.b[3],
- dest.b[2], dest.b[1], dest.b[0] };
- sdp_session_t *session = 0;
- sdp_list_t *search_list = 0, *attrid_list = 0, *response_list = 0, *it = 0;
- uuid_t svc_uuid;
- uint32_t range = 0x0000ffff;
- int channel = -1;
-
- /* Connect to the local SDP server */
- session = sdp_connect (BDADDR_ANY, &dest, 0);
- if (! session)
- {
- fprintf (stderr,
- "Failed to connect to the SDP server on interface `%.*s': %s\n",
- IFNAMSIZ, dev->iface, strerror (errno));
- return -1;
- }
-
- sdp_uuid128_create (&svc_uuid, &svc_uuid_int);
- search_list = sdp_list_append (0, &svc_uuid);
- attrid_list = sdp_list_append (0, &range);
-
- if (sdp_service_search_attr_req (session, search_list,
- SDP_ATTR_REQ_RANGE, attrid_list,
- &response_list) == 0)
- {
- for (it = response_list; it; it = it->next)
- {
- sdp_record_t *record = (sdp_record_t *) it->data;
- sdp_list_t *proto_list = 0;
- if (sdp_get_access_protos (record, &proto_list) == 0)
- {
- channel = sdp_get_proto_port (proto_list, RFCOMM_UUID);
- sdp_list_free (proto_list, 0);
- }
- sdp_record_free (record);
- }
- }
-
- sdp_list_free (search_list, 0);
- sdp_list_free (attrid_list, 0);
- sdp_list_free (response_list, 0);
-
- sdp_close (session);
-
- if (-1 == channel)
- fprintf (stderr,
- "Failed to find the listening channel for interface `%.*s': %s\n",
- IFNAMSIZ,
- dev->iface,
- strerror (errno));
-
- return channel;
-}
-
-
-/**
- * Read from the socket and put the result into the buffer for transmission to
'stdout'.
- *
- * @param sock file descriptor for reading
- * @param buf buffer to read to; first bytes will be the 'struct
GNUNET_TRANSPORT_WLAN_Ieee80211Frame',
- * followed by the actual payload
- * @param buf_size size of the buffer
- * @param ri where to write radiotap_rx info
- * @return number of bytes written to 'buf'
- */
-static ssize_t
-read_from_the_socket (void *sock,
- unsigned char *buf, size_t buf_size,
- struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *ri)
-{
- unsigned char tmpbuf[buf_size];
- ssize_t count;
- count = read (*((int *) sock), tmpbuf, buf_size);
-
- if (0 > count)
- {
- if (EAGAIN == errno)
- return 0;
-
- fprintf (stderr, "Failed to read from the HCI socket: %s\n", strerror (
- errno));
-
- return -1;
- }
-
- #ifdef __linux__
- /* Get the channel used */
- int len;
- struct sockaddr_rc rc_addr = { 0 };
-
- memset (&rc_addr, 0, sizeof(rc_addr));
- len = sizeof(rc_addr);
- if (0 > getsockname (*((int *) sock), (struct sockaddr *) &rc_addr,
- (socklen_t *) &len))
- {
- fprintf (stderr, "getsockname() call failed : %s\n", strerror (errno));
- return -1;
- }
-
- memset (ri, 0, sizeof(*ri));
- ri->ri_channel = rc_addr.rc_channel;
- #endif
-
- /* Detect CRC32 at the end */
- if (0 == check_crc_buf_osdep (tmpbuf, count - sizeof(uint32_t)))
- {
- count -= sizeof(uint32_t);
- }
-
- GNUNET_memcpy (buf, tmpbuf, count);
-
- return count;
-}
-
-
-/**
- * Open the bluetooth interface for reading/writing
- *
- * @param dev pointer to the device struct
- * @return 0 on success, non-zero on error
- */
-static int
-open_device (struct HardwareInfos *dev)
-{
- int i, dev_id = -1, fd_hci;
- struct
- {
- struct hci_dev_list_req list;
- struct hci_dev_req dev[HCI_MAX_DEV];
- } request; // used for detecting the local
devices
- struct sockaddr_rc rc_addr = { 0 }; // used for binding
-
- /* Initialize the neighbour structure */
- neighbours.dev_id = -1;
- for (i = 0; i < MAX_PORTS; i++)
- neighbours.fds[i] = -1;
-
- /* Open a HCI socket */
- fd_hci = socket (AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
-
- if (fd_hci < 0)
- {
- fprintf (stderr,
- "Failed to create HCI socket: %s\n",
- strerror (errno));
- return -1;
- }
-
- memset (&request, 0, sizeof(request));
- request.list.dev_num = HCI_MAX_DEV;
-
- if (ioctl (fd_hci, HCIGETDEVLIST, (void *) &request) < 0)
- {
- fprintf (stderr,
- "ioctl(HCIGETDEVLIST) on interface `%.*s' failed: %s\n",
- IFNAMSIZ,
- dev->iface,
- strerror (errno));
- (void) close (fd_hci);
- return 1;
- }
-
- /* Search for a device with dev->iface name */
- for (i = 0; i < request.list.dev_num; i++)
- {
- struct hci_dev_info dev_info;
-
- memset (&dev_info, 0, sizeof(struct hci_dev_info));
- dev_info.dev_id = request.dev[i].dev_id;
- strncpy (dev_info.name, dev->iface, BLUEZ_DEVNAME_SIZE);
-
- if (ioctl (fd_hci, HCIGETDEVINFO, (void *) &dev_info))
- {
- fprintf (stderr,
- "ioctl(HCIGETDEVINFO) on interface `%.*s' failed: %s\n",
- IFNAMSIZ,
- dev->iface,
- strerror (errno));
- (void) close (fd_hci);
- return 1;
- }
-
- if (strncmp (dev_info.name, dev->iface, BLUEZ_DEVNAME_SIZE) == 0)
- {
- dev_id = dev_info.dev_id; // the device was found
- /**
- * Copy the MAC address to the device structure
- */
- GNUNET_memcpy (&dev->pl_mac, &dev_info.bdaddr, sizeof(bdaddr_t));
-
- /* Check if the interface is up */
- if (hci_test_bit (HCI_UP, (void *) &dev_info.flags) == 0)
- {
- /* Bring the interface up */
- if (ioctl (fd_hci, HCIDEVUP, dev_info.dev_id))
- {
- fprintf (stderr,
- "ioctl(HCIDEVUP) on interface `%.*s' failed: %s\n",
- IFNAMSIZ,
- dev->iface,
- strerror (errno));
- (void) close (fd_hci);
- return 1;
- }
- }
-
- /* Check if the device is discoverable */
- if ((hci_test_bit (HCI_PSCAN, (void *) &dev_info.flags) == 0) ||
- (hci_test_bit (HCI_ISCAN, (void *) &dev_info.flags) == 0) )
- {
- /* Set interface Page Scan and Inqury Scan ON */
- struct hci_dev_req dev_req;
-
- memset (&dev_req, 0, sizeof(dev_req));
- dev_req.dev_id = dev_info.dev_id;
- dev_req.dev_opt = SCAN_PAGE | SCAN_INQUIRY;
-
- if (ioctl (fd_hci, HCISETSCAN, (unsigned long) &dev_req))
- {
- fprintf (stderr,
- "ioctl(HCISETSCAN) on interface `%.*s' failed: %s\n",
- IFNAMSIZ,
- dev->iface,
- strerror (errno));
- (void) close (fd_hci);
- return 1;
- }
- }
- break;
- }
- }
-
- /* Check if the interface was not found */
- if (-1 == dev_id)
- {
- fprintf (stderr,
- "The interface %s was not found\n",
- dev->iface);
- (void) close (fd_hci);
- return 1;
- }
-
- /* Close the hci socket */
- (void) close (fd_hci);
-
-
- /* Bind the rfcomm socket to the interface */
- memset (&rc_addr, 0, sizeof(rc_addr));
- rc_addr.rc_family = AF_BLUETOOTH;
- rc_addr.rc_bdaddr = *BDADDR_ANY;
-
- if (bind_socket (dev->fd_rfcomm, &rc_addr) != 0)
- {
- fprintf (stderr,
- "Failed to bind interface `%.*s': %s\n",
- IFNAMSIZ,
- dev->iface,
- strerror (errno));
- return 1;
- }
-
- /* Register a SDP service */
- if (register_service (dev, rc_addr.rc_channel) != 0)
- {
- fprintf (stderr,
- "Failed to register a service on interface `%.*s': %s\n",
- IFNAMSIZ,
- dev->iface, strerror (errno));
- return 1;
- }
-
- /* Switch socket in listening mode */
- if (listen (dev->fd_rfcomm, 5) == -1) // FIXME: probably we need a bigger
number
- {
- fprintf (stderr, "Failed to listen on socket for interface `%.*s': %s\n",
- IFNAMSIZ,
- dev->iface, strerror (errno));
- return 1;
- }
-
- return 0;
-}
-
-
-/**
- * Set the header to sane values to make attacks more difficult
- *
- * @param taIeeeHeader pointer to the header of the packet
- * @param dev pointer to the Hardware_Infos struct
- *
- **** copy from gnunet-helper-transport-wlan.c ****
- */
-static void
-mac_set (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *taIeeeHeader,
- const struct HardwareInfos *dev)
-{
- taIeeeHeader->frame_control = htons (IEEE80211_FC0_TYPE_DATA);
- taIeeeHeader->addr3 = mac_bssid_gnunet;
- taIeeeHeader->addr2 = dev->pl_mac;
-}
-
-
-#ifdef __linux__
-/**
- * Test if the given interface name really corresponds to a bluetooth
- * device.
- *
- * @param iface name of the interface
- * @return 0 on success, 1 on error
- **** similar with the one from gnunet-helper-transport-wlan.c ****
- */
-static int
-test_bluetooth_interface (const char *iface)
-{
- char strbuf[512];
- struct stat sbuf;
- int ret;
-
- ret = snprintf (strbuf, sizeof(strbuf),
- "/sys/class/bluetooth/%s/subsystem",
- iface);
- if ((ret < 0) || (ret >= sizeof(strbuf)) || (0 != stat (strbuf, &sbuf)))
- {
- fprintf (stderr,
- "Did not find 802.15.1 interface `%s'. Exiting.\n",
- iface);
- exit (1);
- }
- return 0;
-}
-
-
-#endif
-
-/**
- * Test incoming packets mac for being our own.
- *
- * @param taIeeeHeader buffer of the packet
- * @param dev the Hardware_Infos struct
- * @return 0 if mac belongs to us, 1 if mac is for another target
- *
- **** same as the one from gnunet-helper-transport-wlan.c ****
- */
-static int
-mac_test (const struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *taIeeeHeader,
- const struct HardwareInfos *dev)
-{
- static struct GNUNET_TRANSPORT_WLAN_MacAddress all_zeros;
-
- if ((0 == memcmp (&taIeeeHeader->addr3, &all_zeros, MAC_ADDR_SIZE)) ||
- (0 == memcmp (&taIeeeHeader->addr1, &all_zeros, MAC_ADDR_SIZE)))
- return 0; /* some drivers set no Macs, then assume it is all for us! */
-
- if (0 != memcmp (&taIeeeHeader->addr3, &mac_bssid_gnunet, MAC_ADDR_SIZE))
- return 1; /* not a GNUnet ad-hoc package */
- if ((0 == memcmp (&taIeeeHeader->addr1, &dev->pl_mac, MAC_ADDR_SIZE)) ||
- (0 == memcmp (&taIeeeHeader->addr1, &bc_all_mac, MAC_ADDR_SIZE)))
- return 0; /* for us, or broadcast */
- return 1; /* not for us */
-}
-
-
-/**
- * Process data from the stdin. Takes the message, forces the sender MAC to be
correct
- * and puts it into our buffer for transmission to the receiver.
- *
- * @param cls pointer to the device struct ('struct HardwareInfos*')
- * @param hdr pointer to the start of the packet
- *
- **** same as the one from gnunet-helper-transport-wlan.c ****
- */
-static void
-stdin_send_hw (void *cls, const struct GNUNET_MessageHeader *hdr)
-{
- struct HardwareInfos *dev = cls;
- const struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *header;
- struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *blueheader;
- size_t sendsize;
-
- sendsize = ntohs (hdr->size);
- if ((sendsize <
- sizeof(struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage)) ||
- (GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER != ntohs (hdr->type)))
- {
- fprintf (stderr, "Received malformed message\n");
- exit (1);
- }
- sendsize -= (sizeof(struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage)
- - sizeof(struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame));
- if (MAXLINE < sendsize)
- {
- fprintf (stderr, "Packet too big for buffer\n");
- exit (1);
- }
- header = (const struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *) hdr;
- GNUNET_memcpy (&write_pout.buf, &header->frame, sendsize);
- blueheader = (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *) &write_pout.buf;
-
- /* payload contains MAC address, but we don't trust it, so we'll
- * overwrite it with OUR MAC address to prevent mischief */
- mac_set (blueheader, dev);
- GNUNET_memcpy (&blueheader->addr1, &header->frame.addr1,
- sizeof(struct GNUNET_TRANSPORT_WLAN_MacAddress));
- write_pout.size = sendsize;
-}
-
-
-#ifdef __linux__
-/**
- * Broadcast a HELLO message for peer discovery
- *
- * @param dev pointer to the device struct
- * @param dev pointer to the socket which was added to the set
- * @return 0 on success
- */
-static int
-send_broadcast (struct HardwareInfos *dev, int *sendsocket)
-{
- int new_device = 0;
- int loops = 0;
-
-search_for_devices:
- if (((neighbours.size == neighbours.pos) && (new_device == 1)) ||
- (neighbours.size == 0) )
- {
-inquiry_devices: // skip the conditions and force a inquiry for new
devices
- {
- /**
- * It means that I sent HELLO messages to all the devices from the list
and I should search
- * for new ones or that this is the first time when I do a search.
- */
- inquiry_info *devices = NULL;
- int i, responses, max_responses = MAX_PORTS;
-
- /* sanity checks */
- if (neighbours.size >= MAX_PORTS)
- {
- fprintf (stderr,
- "%.*s reached the top limit for the discovarable devices\n",
- IFNAMSIZ,
- dev->iface);
- return 2;
- }
-
- /* Get the device id */
- if (neighbours.dev_id == -1)
- {
- char addr[19] = { 0 }; // the device MAC address
-
- ba2str ((bdaddr_t *) &dev->pl_mac, addr);
- neighbours.dev_id = hci_devid (addr);
- if (neighbours.dev_id < 0)
- {
- fprintf (stderr,
- "Failed to get the device id for interface %.*s : %s\n",
- IFNAMSIZ,
- dev->iface, strerror (errno));
- return 1;
- }
- }
-
- devices = malloc (max_responses * sizeof(inquiry_info));
- if (devices == NULL)
- {
- fprintf (stderr,
- "Failed to allocate memory for inquiry info list on interface
%.*s\n",
- IFNAMSIZ,
- dev->iface);
- return 1;
- }
-
- responses = hci_inquiry (neighbours.dev_id, 8, max_responses, NULL,
- &devices, IREQ_CACHE_FLUSH);
- if (responses < 0)
- {
- fprintf (stderr, "Failed to inquiry on interface %.*s\n", IFNAMSIZ,
- dev->iface);
- return 1;
- }
-
- fprintf (stderr, "LOG : Found %d devices\n", responses); // FIXME
delete it after debugging stage
-
- if (responses == 0)
- {
- fprintf (stderr, "LOG : No devices discoverable\n");
- return 1;
- }
-
- for (i = 0; i < responses; i++)
- {
- int j;
- int found = 0;
-
- /* sanity check */
- if (i >= MAX_PORTS)
- {
- fprintf (stderr,
- "%.*s reached the top limit for the discoverable devices
(after inquiry)\n",
- IFNAMSIZ,
- dev->iface);
- return 2;
- }
-
- /* Search if the address already exists on the list */
- for (j = 0; j < neighbours.size; j++)
- {
- if (memcmp (&(devices + i)->bdaddr, &(neighbours.devices[j]),
- sizeof(bdaddr_t)) == 0)
- {
- found = 1;
- fprintf (stderr, "LOG : the device already exists on the list\n");
// FIXME debugging message
- break;
- }
- }
-
- if (found == 0)
- {
- char addr[19] = { 0 };
-
- ba2str (&(devices + i)->bdaddr, addr);
- fprintf (stderr, "LOG : %s was added to the list\n", addr); //
FIXME debugging message
- GNUNET_memcpy (&(neighbours.devices[neighbours.size++]), &(devices
- + i)->
- bdaddr, sizeof(bdaddr_t));
- }
- }
-
- free (devices);
- }
- }
-
- int connection_successful = 0;
- struct sockaddr_rc addr_rc = { 0 };
- int errno_copy = 0;
- addr_rc.rc_family = AF_BLUETOOTH;
-
- /* Try to connect to a new device from the list */
- while (neighbours.pos < neighbours.size)
- {
- /* Check if we are already connected to this device */
- if (neighbours.fds[neighbours.pos] == -1)
- {
- memset (&addr_rc.rc_bdaddr, 0, sizeof(addr_rc.rc_bdaddr));
- GNUNET_memcpy (&addr_rc.rc_bdaddr, &(neighbours.devices[neighbours.pos]),
- sizeof(addr_rc.rc_bdaddr));
-
- addr_rc.rc_channel = get_channel (dev, addr_rc.rc_bdaddr);
-
- *sendsocket = socket (AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
- if ((-1 < *sendsocket) &&
- (0 == connect (*sendsocket,
- (struct sockaddr *) &addr_rc,
- sizeof(addr_rc))))
- {
- neighbours.fds[neighbours.pos++] = *sendsocket;
- connection_successful = 1;
- char addr[19] = { 0 };
- ba2str (&(neighbours.devices[neighbours.pos - 1]), addr);
- fprintf (stderr, "LOG : Connected to %s\n", addr);
- break;
- }
- else
- {
- char addr[19] = { 0 };
- errno_copy = errno; // Save a copy for later
-
- if (-1 != *sendsocket)
- {
- (void) close (*sendsocket);
- *sendsocket = -1;
- }
- ba2str (&(neighbours.devices[neighbours.pos]), addr);
- fprintf (stderr,
- "LOG : Couldn't connect on device %s, error : %s\n",
- addr,
- strerror (errno));
- if (errno != ECONNREFUSED) // FIXME be sure that this works
- {
- fprintf (stderr, "LOG : Removes %d device from the list\n",
- neighbours.pos);
- /* Remove the device from the list */
- GNUNET_memcpy (&neighbours.devices[neighbours.pos],
- &neighbours.devices[neighbours.size - 1],
- sizeof(bdaddr_t));
- memset (&neighbours.devices[neighbours.size - 1], 0,
- sizeof(bdaddr_t));
- neighbours.fds[neighbours.pos] = neighbours.fds[neighbours.size - 1];
- neighbours.fds[neighbours.size - 1] = -1;
- neighbours.size -= 1;
- }
-
- neighbours.pos += 1;
-
- if (neighbours.pos >= neighbours.size)
- neighbours.pos = 0;
-
- loops += 1;
-
- if (loops == MAX_LOOPS) // don't get stuck trying to connect to
one device
- return 1;
- }
- }
- else
- {
- fprintf (stderr, "LOG : Search for a new device\n"); // FIXME
debugging message
- neighbours.pos += 1;
- }
- }
-
- /* Cycle on the list */
- if (neighbours.pos == neighbours.size)
- {
- neighbours.pos = 0;
- searching_devices_count += 1;
-
- if (searching_devices_count == MAX_LOOPS)
- {
- fprintf (stderr, "LOG : Force to inquiry for new devices\n");
- searching_devices_count = 0;
- goto inquiry_devices;
- }
- }
- /* If a new device wasn't found, search an old one */
- if (connection_successful == 0)
- {
- int loop_check = neighbours.pos;
- while (neighbours.fds[neighbours.pos] == -1)
- {
- if (neighbours.pos == neighbours.size)
- neighbours.pos = 0;
-
- if (neighbours.pos == loop_check)
- {
- if (errno_copy == ECONNREFUSED)
- {
- fprintf (stderr, "LOG : No device found. Go back and search
again\n"); // FIXME debugging message
- new_device = 1;
- loops += 1;
- goto search_for_devices;
- }
- else
- {
- return 1; // Skip the broadcast message
- }
- }
-
- neighbours.pos += 1;
- }
-
- *sendsocket = neighbours.fds[neighbours.pos++];
- }
-
- return 0;
-}
-
-
-#endif
-
-/**
- * Main function of the helper. This code accesses a bluetooth interface
- * forwards traffic in both directions between the bluetooth interface and
- * stdin/stdout of this process. Error messages are written to stderr.
- *
- * @param argc number of arguments, must be 2
- * @param argv arguments only argument is the name of the interface (e.g.
'hci0')
- * @return 0 on success (never happens, as we don't return unless aborted), 1
on error
- *
- **** similar to gnunet-helper-transport-wlan.c ****
- */
-int
-main (int argc, char *argv[])
-{
-#ifdef __linux__
- struct HardwareInfos dev;
- char readbuf[MAXLINE];
- int maxfd;
- fd_set rfds;
- fd_set wfds;
- int stdin_open;
- struct MessageStreamTokenizer *stdin_mst;
- int raw_eno, i;
- int crt_rfds = 0, rfds_list[MAX_PORTS];
- int broadcast, sendsocket;
-
- /* Assert privs so we can modify the firewall rules! */
- {
-#ifdef HAVE_SETRESUID
- uid_t uid = getuid ();
-
- if (0 != setresuid (uid, 0, 0))
- {
- fprintf (stderr,
- "Failed to setresuid to root: %s\n",
- strerror (errno));
- return 254;
- }
-#else
- if (0 != seteuid (0))
- {
- fprintf (stderr,
- "Failed to seteuid back to root: %s\n", strerror (errno));
- return 254;
- }
-#endif
- }
-
- /* Make use of SGID capabilities on POSIX */
- memset (&dev, 0, sizeof(dev));
- dev.fd_rfcomm = socket (AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
- raw_eno = errno; /* remember for later */
-
- /* Now that we've dropped root rights, we can do error checking */
- if (2 != argc)
- {
- fprintf (stderr,
- "You must specify the name of the interface as the first \
- and only argument to this program.\n");
- if (-1 != dev.fd_rfcomm)
- (void) close (dev.fd_rfcomm);
- return 1;
- }
-
- if (-1 == dev.fd_rfcomm)
- {
- fprintf (stderr, "Failed to create a RFCOMM socket: %s\n", strerror (
- raw_eno));
- return 1;
- }
- if (dev.fd_rfcomm >= FD_SETSIZE)
- {
- fprintf (stderr, "File descriptor too large for select (%d > %d)\n",
- dev.fd_rfcomm, FD_SETSIZE);
- (void) close (dev.fd_rfcomm);
- return 1;
- }
- if (0 != test_bluetooth_interface (argv[1]))
- {
- (void) close (dev.fd_rfcomm);
- return 1;
- }
- strncpy (dev.iface, argv[1], IFNAMSIZ);
- if (0 != open_device (&dev))
- {
- (void) close (dev.fd_rfcomm);
- return 1;
- }
-
- /* Drop privs */
- {
- uid_t uid = getuid ();
- #ifdef HAVE_SETRESUID
- if (0 != setresuid (uid, uid, uid))
- {
- fprintf (stderr, "Failed to setresuid: %s\n", strerror (errno));
- if (-1 != dev.fd_rfcomm)
- (void) close (dev.fd_rfcomm);
- return 1;
- }
- #else
- if (0 != (setuid (uid) | seteuid (uid)))
- {
- fprintf (stderr, "Failed to setuid: %s\n", strerror (errno));
- if (-1 != dev.fd_rfcomm)
- (void) close (dev.fd_rfcomm);
- return 1;
- }
- #endif
- }
-
- /* Send MAC address of the bluetooth interface to STDOUT first */
- {
- struct GNUNET_TRANSPORT_WLAN_HelperControlMessage macmsg;
-
- macmsg.hdr.size = htons (sizeof(macmsg));
- macmsg.hdr.type = htons (GNUNET_MESSAGE_TYPE_WLAN_HELPER_CONTROL);
- GNUNET_memcpy (&macmsg.mac, &dev.pl_mac, sizeof(struct
-
GNUNET_TRANSPORT_WLAN_MacAddress));
- GNUNET_memcpy (write_std.buf, &macmsg, sizeof(macmsg));
- write_std.size = sizeof(macmsg);
- }
-
-
- stdin_mst = mst_create (&stdin_send_hw, &dev);
- stdin_open = 1;
-
- /**
- * TODO : I should make the time out of a mac endpoint smaller and check if
the rate
- * from get_wlan_header (plugin_transport_bluetooth.c) is correct.
- */
- while (1)
- {
- maxfd = -1;
- broadcast = 0;
- sendsocket = -1;
-
- FD_ZERO (&rfds);
- if ((0 == write_pout.size) && (1 == stdin_open))
- {
- FD_SET (STDIN_FILENO, &rfds);
- maxfd = MAX (maxfd, STDIN_FILENO);
- }
- if (0 == write_std.size)
- {
- FD_SET (dev.fd_rfcomm, &rfds);
- maxfd = MAX (maxfd, dev.fd_rfcomm);
- }
-
- for (i = 0; i < crt_rfds; i++) // it can receive messages from multiple
devices
- {
- FD_SET (rfds_list[i], &rfds);
- maxfd = MAX (maxfd, rfds_list[i]);
- }
- FD_ZERO (&wfds);
- if (0 < write_std.size)
- {
- FD_SET (STDOUT_FILENO, &wfds);
- maxfd = MAX (maxfd, STDOUT_FILENO);
- }
- if (0 < write_pout.size) // it can send messages only to one device per
loop
- {
- struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *frame;
- /* Get the destination address */
- frame = (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *) write_pout.buf;
-
- if (memcmp (&frame->addr1, &dev.pl_mac,
- sizeof(struct GNUNET_TRANSPORT_WLAN_MacAddress)) == 0)
- {
- broadcast = 1;
- memset (&write_pout, 0, sizeof(write_pout)); // clear the buffer
- }
- else if (memcmp (&frame->addr1, &broadcast_address,
- sizeof(struct GNUNET_TRANSPORT_WLAN_MacAddress)) == 0)
- {
- fprintf (stderr, "LOG : %s has a broadcast message (pos %d, size
%d)\n",
- dev.iface, neighbours.pos, neighbours.size);
// FIXME: debugging message
-
- if (send_broadcast (&dev, &sendsocket) != 0) // if the searching
wasn't successful don't get stuck on the select stage
- {
- broadcast = 1;
- memset (&write_pout, 0, sizeof(write_pout)); // remove the
message
- fprintf (stderr,
- "LOG : Skipping the broadcast message (pos %d, size %d)\n",
- neighbours.pos, neighbours.size);
- }
- else
- {
- FD_SET (sendsocket, &wfds);
- maxfd = MAX (maxfd, sendsocket);
- }
- }
- else
- {
- int found = 0;
- int pos = 0;
- /* Search if the address already exists on the list */
- for (i = 0; i < neighbours.size; i++)
- {
- if (memcmp (&frame->addr1, &(neighbours.devices[i]),
- sizeof(bdaddr_t)) == 0)
- {
- pos = i;
- if (neighbours.fds[i] != -1)
- {
- found = 1; // save the position where it was found
- FD_SET (neighbours.fds[i], &wfds);
- maxfd = MAX (maxfd, neighbours.fds[i]);
- sendsocket = neighbours.fds[i];
- fprintf (stderr, "LOG: the address was found in the list\n");
- break;
- }
- }
- }
- if (found == 0)
- {
- int status;
- struct sockaddr_rc addr = { 0 };
-
- fprintf (stderr,
- "LOG : %s has a new message for
%.2X:%.2X:%.2X:%.2X:%.2X:%.2X which isn't on the broadcast list\n",
- dev.iface,
- frame->addr1.mac[5], frame->addr1.mac[4],
- frame->addr1.mac[3],
- frame->addr1.mac[2], frame->addr1.mac[1],
- frame->addr1.mac[0]);
// FIXME: debugging message
-
- sendsocket = socket (AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
-
- if (sendsocket < 0)
- {
- fprintf (stderr,
- "Failed to create a RFCOMM socket (sending stage): %s\n",
- strerror (errno));
- return -1;
- }
-
- GNUNET_memcpy (&addr.rc_bdaddr, &frame->addr1, sizeof(bdaddr_t));
- addr.rc_family = AF_BLUETOOTH;
- addr.rc_channel = get_channel (&dev, addr.rc_bdaddr);
-
- int tries = 0;
-connect_retry:
- status = connect (sendsocket, (struct sockaddr *) &addr,
- sizeof(addr));
- if ((0 != status) && (errno != EAGAIN) )
- {
- if ((errno == ECONNREFUSED) && (tries < 2) )
- {
- fprintf (stderr, "LOG : %.*s failed to connect. Trying again!\n",
- IFNAMSIZ, dev.iface);
- tries++;
- goto connect_retry;
- }
- else if (errno == EBADF)
- {
- fprintf (stderr, "LOG : %s failed to connect : %s. Skip it!\n",
- dev.iface, strerror (errno));
- memset (&write_pout, 0, sizeof(write_pout));
- broadcast = 1;
- }
- else
- {
- fprintf (stderr,
- "LOG : %s failed to connect : %s. Try again later!\n",
- dev.iface,
- strerror (errno));
- memset (&write_pout, 0, sizeof(write_pout));
- broadcast = 1;
- }
- }
- else
- {
- FD_SET (sendsocket, &wfds);
- maxfd = MAX (maxfd, sendsocket);
- fprintf (stderr, "LOG : Connection successful\n");
- if (pos != 0) // save the socket
- {
- neighbours.fds[pos] = sendsocket;
- }
- else
- {
- /* Add the new device to the discovered devices list */
- if (neighbours.size < MAX_PORTS)
- {
- neighbours.fds[neighbours.size] = sendsocket;
- GNUNET_memcpy (&(neighbours.devices[neighbours.size++]),
- &addr.rc_bdaddr, sizeof(bdaddr_t));
- }
- else
- {
- fprintf (stderr,
- "The top limit for the discovarable devices' list was
reached\n");
- }
- }
- }
- }
- }
- }
-
- if (broadcast == 0)
- {
- /* Select a fd which is ready for action :) */
- {
- int retval = select (maxfd + 1, &rfds, &wfds, NULL, NULL);
- if ((-1 == retval) && (EINTR == errno))
- continue;
- if ((0 > retval) && (errno != EBADF) ) // we handle BADF errors later
- {
- fprintf (stderr, "select failed: %s\n", strerror (errno));
- break;
- }
- }
- if (FD_ISSET (STDOUT_FILENO, &wfds))
- {
- ssize_t ret =
- write (STDOUT_FILENO, write_std.buf + write_std.pos,
- write_std.size - write_std.pos);
- if (0 > ret)
- {
- fprintf (stderr, "Failed to write to STDOUT: %s\n", strerror
(errno));
- break;
- }
- write_std.pos += ret;
- if (write_std.pos == write_std.size)
- {
- write_std.pos = 0;
- write_std.size = 0;
- }
- fprintf (stderr, "LOG : %s sends a message to STDOUT\n", dev.iface);
// FIXME: debugging message
- }
- if (-1 != sendsocket)
- {
- if (FD_ISSET (sendsocket, &wfds))
- {
- ssize_t ret = write (sendsocket,
- write_pout.buf + write_std.pos,
- write_pout.size - write_pout.pos);
- if (0 > ret) // FIXME should I first check the error type?
- {
- fprintf (stderr,
- "Failed to write to bluetooth device: %s. Closing the
socket!\n",
- strerror (errno));
- for (i = 0; i < neighbours.size; i++)
- {
- if (neighbours.fds[i] == sendsocket)
- {
- (void) close (sendsocket);
- neighbours.fds[i] = -1;
- break;
- }
- }
- /* Remove the message */
- memset (&write_pout.buf + write_std.pos, 0, (write_pout.size
- - write_pout.pos));
- write_pout.pos = 0;
- write_pout.size = 0;
- }
- else
- {
- write_pout.pos += ret;
- if ((write_pout.pos != write_pout.size) && (0 != ret))
- {
- /* We should not get partial sends with packet-oriented
devices... */
- fprintf (stderr, "Write error, partial send: %u/%u\n",
- (unsigned int) write_pout.pos,
- (unsigned int) write_pout.size);
- break;
- }
-
- if (write_pout.pos == write_pout.size)
- {
- write_pout.pos = 0;
- write_pout.size = 0;
- }
- fprintf (stderr, "LOG : %s sends a message to a DEVICE\n",
- dev.iface);
// FIXME: debugging message
- }
- }
- }
- for (i = 0; i <= maxfd; i++)
- {
- if (FD_ISSET (i, &rfds))
- {
- if (i == STDIN_FILENO)
- {
- ssize_t ret =
- read (i, readbuf, sizeof(readbuf));
- if (0 > ret)
- {
- fprintf (stderr,
- "Read error from STDIN: %s\n",
- strerror (errno));
- break;
- }
- if (0 == ret)
- {
- /* stop reading... */
- stdin_open = 0;
- }
- else
- {
- mst_receive (stdin_mst, readbuf, ret);
- fprintf (stderr, "LOG : %s receives a message from STDIN\n",
- dev.iface);
// FIXME: debugging message
- }
- }
- else if (i == dev.fd_rfcomm)
- {
- int readsocket;
- struct sockaddr_rc addr = { 0 };
- unsigned int opt = sizeof(addr);
-
- readsocket = accept (dev.fd_rfcomm, (struct sockaddr *) &addr,
- &opt);
- fprintf (stderr, "LOG : %s accepts a message\n", dev.iface);
// FIXME: debugging message
- if (readsocket == -1)
- {
- fprintf (stderr,
- "Failed to accept a connection on interface: %.*s\n",
- IFNAMSIZ,
- strerror (errno));
- break;
- }
- else
- {
- FD_SET (readsocket, &rfds);
- maxfd = MAX (maxfd, readsocket);
-
- if (crt_rfds < MAX_PORTS)
- rfds_list[crt_rfds++] = readsocket;
- else
- {
- fprintf (stderr,
- "The limit for the read file descriptors list was \
- reached\n");
- break;
- }
- }
- }
- else
- {
- struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *rrm;
- ssize_t ret;
- fprintf (stderr, "LOG : %s reads something from the socket\n",
- dev.iface);
// FIXME : debugging message
- rrm = (struct
- GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *)
write_std.buf;
- ret =
- read_from_the_socket ((void *) &i, (unsigned char *) &rrm->frame,
- sizeof(write_std.buf)
- - sizeof(struct
-
GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage)
- + sizeof(struct
-
GNUNET_TRANSPORT_WLAN_Ieee80211Frame),
- rrm);
- if (0 >= ret)
- {
- int j;
- FD_CLR (i, &rfds);
- close (i);
- /* Remove the socket from the list */
- for (j = 0; j < crt_rfds; j++)
- {
- if (rfds_list[j] == i)
- {
- rfds_list[j] ^= rfds_list[crt_rfds - 1];
- rfds_list[crt_rfds - 1] ^= rfds_list[j];
- rfds_list[j] ^= rfds_list[crt_rfds - 1];
- crt_rfds -= 1;
- break;
- }
- }
-
- fprintf (stderr, "Read error from raw socket: %s\n", strerror (
- errno));
- break;
- }
- if ((0 < ret) && (0 == mac_test (&rrm->frame, &dev)))
- {
- write_std.size = ret
- + sizeof(struct
-
GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage)
- - sizeof(struct
- GNUNET_TRANSPORT_WLAN_Ieee80211Frame);
- rrm->header.size = htons (write_std.size);
- rrm->header.type = htons (
- GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER);
- }
- }
- }
- }
- }
- }
- /* Error handling, try to clean up a bit at least */
- mst_destroy (stdin_mst);
- stdin_mst = NULL;
- sdp_close (dev.session);
- (void) close (dev.fd_rfcomm);
- if (-1 != sendsocket)
- (void) close (sendsocket);
-
- for (i = 0; i < crt_rfds; i++)
- (void) close (rfds_list[i]);
-
- for (i = 0; i < neighbours.size; i++)
- (void) close (neighbours.fds[i]);
- #else
- struct HardwareInfos dev;
- struct GNUNET_NETWORK_Handle *sendsocket;
- struct GNUNET_NETWORK_FDSet *rfds;
- struct GNUNET_NETWORK_FDSet *wfds;
- struct GNUNET_NETWORK_Handle *rfds_list[MAX_PORTS];
- char readbuf[MAXLINE] = { 0 };
- SOCKADDR_BTH acc_addr = { 0 };
- int addr_len = sizeof(SOCKADDR_BTH);
- int broadcast, i, stdin_open, crt_rfds = 0;
- HANDLE stdin_handle = GetStdHandle (STD_INPUT_HANDLE);
- HANDLE stdout_handle = GetStdHandle (STD_OUTPUT_HANDLE);
- struct MessageStreamTokenizer *stdin_mst;
-
- /* check the handles */
- if (stdin_handle == INVALID_HANDLE_VALUE)
- {
- fprintf (stderr, "Failed to get the stdin handle\n");
- ExitProcess (2);
- }
-
- if (stdout_handle == INVALID_HANDLE_VALUE)
- {
- fprintf (stderr, "Failed to get the stdout handle\n");
- ExitProcess (2);
- }
-
- /* initialize windows sockets */
- initialize_windows_sockets ();
-
- // /* test bluetooth socket family support */ --> it return false because
the GNUNET_NETWORK_test_pf should also receive the type of socket
(BTHPROTO_RFCOMM)
- // if (GNUNET_NETWORK_test_pf (AF_BTH) != GNUNET_OK)
- // {
- // fprintf (stderr, "AF_BTH family is not supported\n");
- // ExitProcess (2);
- // }
-
- /* create the socket */
- dev.handle = GNUNET_NETWORK_socket_create (AF_BTH, SOCK_STREAM,
- BTHPROTO_RFCOMM);
- if (dev.handle == NULL)
- {
- fprintf (stderr, "Failed to create RFCOMM socket: ");
- print_last_error ();
- ExitProcess (2);
- }
-
-
- if (open_device (&dev) == -1)
- {
- fprintf (stderr, "Failed to open the device\n");
- print_last_error ();
- if (GNUNET_NETWORK_socket_close (dev.handle) != GNUNET_OK)
- {
- fprintf (stderr, "Failed to close the socket!\n");
- print_last_error ();
- }
- ExitProcess (2);
- }
-
- if (GNUNET_OK != GNUNET_NETWORK_socket_set_blocking (dev.handle, 1))
- {
- fprintf (stderr, "Failed to change the socket mode\n");
- ExitProcess (2);
- }
-
- memset (&write_std, 0, sizeof(write_std));
- memset (&write_pout, 0, sizeof(write_pout));
- stdin_open = 1;
-
- rfds = GNUNET_NETWORK_fdset_create ();
- wfds = GNUNET_NETWORK_fdset_create ();
-
- /* Send MAC address of the bluetooth interface to STDOUT first */
- {
- struct GNUNET_TRANSPORT_WLAN_HelperControlMessage macmsg;
-
- macmsg.hdr.size = htons (sizeof(macmsg));
- macmsg.hdr.type = htons (GNUNET_MESSAGE_TYPE_WLAN_HELPER_CONTROL);
- GNUNET_memcpy (&macmsg.mac, &dev.pl_mac, sizeof(struct
-
GNUNET_TRANSPORT_WLAN_MacAddress_Copy));
- GNUNET_memcpy (write_std.buf, &macmsg, sizeof(macmsg));
- write_std.size = sizeof(macmsg);
- }
-
-
- stdin_mst = mst_create (&stdin_send_hw, &dev);
- stdin_open = 1;
-
- int pos = 0;
- int stdin_pos = -1;
- int stdout_pos = -1;
- while (1)
- {
- broadcast = 0;
- pos = 0;
- stdin_pos = -1;
- stdout_pos = -1;
- sendsocket = NULL; // FIXME ???memleaks
-
- GNUNET_NETWORK_fdset_zero (rfds);
- if ((0 == write_pout.size) && (1 == stdin_open))
- {
- stdin_pos = pos;
- pos += 1;
- GNUNET_NETWORK_fdset_handle_set (rfds, (struct
- GNUNET_DISK_FileHandle*) &
- stdin_handle);
- }
-
- if (0 == write_std.size)
- {
- pos += 1;
- GNUNET_NETWORK_fdset_set (rfds, dev.handle);
- }
-
- for (i = 0; i < crt_rfds; i++)
- {
- pos += 1;
- GNUNET_NETWORK_fdset_set (rfds, rfds_list[i]);
- }
-
- GNUNET_NETWORK_fdset_zero (wfds);
- if (0 < write_std.size)
- {
- stdout_pos = pos;
- GNUNET_NETWORK_fdset_handle_set (wfds, (struct
- GNUNET_DISK_FileHandle*) &
- stdout_handle);
- // printf ("%s\n", write_std.buf);
- // memset (write_std.buf, 0, write_std.size);
- // write_std.size = 0;
- }
-
- if (0 < write_pout.size)
- {
- if (strcmp (argv[1], "ff:ff:ff:ff:ff:ff") == 0)
- {
- fprintf (stderr, "LOG: BROADCAST! Skipping the message\n");
- // skip the message
- broadcast = 1;
- memset (write_pout.buf, 0, write_pout.size);
- write_pout.size = 0;
- }
- else
- {
- SOCKADDR_BTH addr;
- fprintf (stderr, "LOG : has a new message for %s\n", argv[1]);
- sendsocket = GNUNET_NETWORK_socket_create (AF_BTH, SOCK_STREAM,
- BTHPROTO_RFCOMM);
-
- if (sendsocket == NULL)
- {
- fprintf (stderr, "Failed to create RFCOMM socket: \n");
- print_last_error ();
- ExitProcess (2);
- }
-
- memset (&addr, 0, sizeof(addr));
- // addr.addressFamily = AF_BTH;
- if (SOCKET_ERROR ==
- WSAStringToAddress (argv[1], AF_BTH, NULL, (LPSOCKADDR) &addr,
- &addr_len))
- {
- fprintf (stderr, "Failed to translate the address: ");
- print_last_error ();
- ExitProcess (2);
- }
- addr.port = get_channel (argv[1]);
- if (addr.port == -1)
- {
- fprintf (stderr,
- "Couldn't find the sdp service for the address: %s\n",
- argv[1]);
- memset (write_pout.buf, 0, write_pout.size);
- write_pout.size = 0;
- broadcast = 1; // skipping the select part
- }
- else
- {
- if (GNUNET_OK != GNUNET_NETWORK_socket_connect (sendsocket,
- (LPSOCKADDR) &addr,
- addr_len))
- {
- fprintf (stderr, "Failed to connect: ");
- print_last_error ();
- ExitProcess (2);
- }
-
- if (GNUNET_OK != GNUNET_NETWORK_socket_set_blocking (sendsocket, 1))
- {
- fprintf (stderr, "Failed to change the socket mode\n");
- ExitProcess (2);
- }
-
- GNUNET_NETWORK_fdset_set (wfds, sendsocket);
- }
- }
- }
-
- if (broadcast == 0)
- {
- int retval = GNUNET_NETWORK_socket_select (rfds, wfds, NULL,
-
GNUNET_TIME_relative_get_forever_ ());
- if (retval < 0)
- {
- fprintf (stderr, "Select error\n");
- ExitProcess (2);
- }
- // if (GNUNET_NETWORK_fdset_isset (wfds, (struct
GNUNET_NETWORK_Handle*)&stdout_handle))
- if (retval == stdout_pos)
- {
- fprintf (stderr, "LOG : sends a message to STDOUT\n"); // FIXME:
debugging message
- // ssize_t ret;
- // ret = GNUNET_NETWORK_socket_send ((struct GNUNET_NETWORK_Handle
*)&stdout_handle, write_std.buf + write_std.pos, write_std.size -
write_std.pos);
- // ret = write (STDOUT_FILENO, write_std.buf + write_std.pos,
write_std.size - write_std.pos);
- DWORD ret;
- if (FALSE == WriteFile (stdout_handle, write_std.buf + write_std.pos,
- write_std.size - write_std.pos, &ret, NULL))
- {
- fprintf (stderr, "Failed to write to STDOUT: ");
- print_last_error ();
- break;
- }
-
- if (ret <= 0)
- {
- fprintf (stderr, "Failed to write to STDOUT\n");
- ExitProcess (2);
- }
-
- write_std.pos += ret;
- if (write_std.pos == write_std.size)
- {
- write_std.pos = 0;
- write_std.size = 0;
- }
- }
- if (sendsocket != NULL)
- {
- if (GNUNET_NETWORK_fdset_isset (wfds, sendsocket))
- {
- ssize_t ret;
- ret = GNUNET_NETWORK_socket_send (sendsocket, write_pout.buf
- + write_pout.pos,
- write_pout.size - write_pout.pos);
-
- if (GNUNET_SYSERR == ret)
- {
- fprintf (stderr,
- "Failed to send to the socket. Closing the socket. Error:
\n");
- print_last_error ();
- if (GNUNET_NETWORK_socket_close (sendsocket) != GNUNET_OK)
- {
- fprintf (stderr, "Failed to close the sendsocket!\n");
- print_last_error ();
- }
- ExitProcess (2);
- }
- else
- {
- write_pout.pos += ret;
- if ((write_pout.pos != write_pout.size) && (0 != ret))
- {
- /* we should not get partial sends with packet-oriented
devices... */
- fprintf (stderr, "Write error, partial send: %u/%u\n",
- (unsigned int) write_pout.pos,
- (unsigned int) write_pout.size);
- break;
- }
-
- if (write_pout.pos == write_pout.size)
- {
- write_pout.pos = 0;
- write_pout.size = 0;
- }
- fprintf (stderr, "LOG : sends a message to a DEVICE\n");
// FIXME: debugging message
- }
- }
- }
-
- // if (GNUNET_NETWORK_fdset_isset (rfds, (struct
GNUNET_NETWORK_Handle*)&stdin_handle))
- if (retval == stdin_pos)
- {
- // ssize_t ret;
- // ret = GNUNET_NETWORK_socket_recv ((struct GNUNET_NETWORK_Handle
*)&stdin_handle, readbuf, sizeof (write_pout.buf));
- // ret = read (STDIN_FILENO, readbuf, sizeof (readbuf));
- DWORD ret;
- if (FALSE == ReadFile (stdin_handle, readbuf, sizeof(readbuf), &ret,
- NULL))
/* do nothing asynchronous */
- {
- fprintf (stderr, "Read error from STDIN: ");
- print_last_error ();
- break;
- }
- if (0 == ret)
- {
- /* stop reading... */
- stdin_open = 0;
- }
- else
- {
- mst_receive (stdin_mst, readbuf, ret);
- fprintf (stderr, "LOG : receives a message from STDIN\n"); //
FIXME: debugging message
- }
- }
- else if (GNUNET_NETWORK_fdset_isset (rfds, dev.handle))
- {
- fprintf (stderr, "LOG: accepting connection\n");
- struct GNUNET_NETWORK_Handle *readsocket;
- readsocket = GNUNET_NETWORK_socket_accept (dev.handle,
- (LPSOCKADDR) &acc_addr,
- &addr_len);
- if (readsocket == NULL)
- {
- fprintf (stderr, "Accept error %d: ", GetLastError ());
- print_last_error ();
- ExitProcess (2);
- }
- else
- {
- if (GNUNET_OK != GNUNET_NETWORK_socket_set_blocking (readsocket, 1))
- {
- fprintf (stderr, "Failed to change the socket mode\n");
- ExitProcess (2);
- }
- GNUNET_NETWORK_fdset_set (rfds, readsocket);
-
- if (crt_rfds < MAX_PORTS)
- rfds_list[crt_rfds++] = readsocket;
- else
- {
- fprintf (stderr,
- "The limit for the read file descriptors list was
reached\n");
- break;
- }
- }
- }
- else
- for (i = 0; i < crt_rfds; i++)
- {
- if (GNUNET_NETWORK_fdset_isset (rfds, rfds_list[i]))
- {
- struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *rrm;
- ssize_t ret;
- fprintf (stderr, "LOG: reading something from the socket\n");
// FIXME : debugging message
- rrm = (struct
- GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *)
write_std.buf;
- ret = read_from_the_socket (rfds_list[i], (unsigned
- char *) &rrm->frame,
- sizeof(write_std.buf)
- - sizeof(struct
-
GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage)
- + sizeof(struct
-
GNUNET_TRANSPORT_WLAN_Ieee80211Frame),
- rrm);
- if (0 >= ret)
- {
- // TODO remove the socket from the list
- if (GNUNET_NETWORK_socket_close (rfds_list[i]) != GNUNET_OK)
- {
- fprintf (stderr, "Failed to close the sendsocket!\n");
- print_last_error ();
- }
-
- fprintf (stderr, "Read error from raw socket: ");
- print_last_error ();
- break;
- }
- if ((0 < ret) && (0 == mac_test (&rrm->frame, &dev)))
- {
- write_std.size = ret
- + sizeof(struct
-
GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage)
- - sizeof(struct
- GNUNET_TRANSPORT_WLAN_Ieee80211Frame);
- rrm->header.size = htons (write_std.size);
- rrm->header.type = htons (
- GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER);
- }
- break;
- }
- }
- }
- }
-
- mst_destroy (stdin_mst);
- stdin_mst = NULL;
-
- if (GNUNET_NETWORK_socket_close (dev.handle) != GNUNET_OK)
- {
- fprintf (stderr, "Failed to close the socket!\n");
- print_last_error ();
- }
-
- for (i = 0; i < crt_rfds; i++)
- {
- if (GNUNET_NETWORK_socket_close (rfds_list[i]) != GNUNET_OK)
- {
- fprintf (stderr, "Failed to close the socket!\n");
- print_last_error ();
- }
- }
-
- WSACleanup ();
- #endif
- return 1; /* we never exit 'normally' */
-}
diff --git a/src/transport/gnunet-helper-transport-wlan-dummy.c
b/src/transport/gnunet-helper-transport-wlan-dummy.c
deleted file mode 100644
index ab77f5c68..000000000
--- a/src/transport/gnunet-helper-transport-wlan-dummy.c
+++ /dev/null
@@ -1,520 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010, 2012 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/gnunet-helper-transport-wlan-dummy.c
- * @brief helper for the testcases for plugin_transport_wlan.c
- * @author David Brodski
- */
-#include "platform.h"
-#include "gnunet_protocols.h"
-#include "gnunet_util_lib.h"
-#include "plugin_transport_wlan.h"
-
-/**
- * Name of the fifo to use for IPC with the other dummy process.
- */
-#define FIFO_FILE1 "/tmp/test-transport/api-wlan-p1/WLAN_FIFO_in"
-
-/**
- * Name of the fifo to use for IPC with the other dummy process.
- */
-#define FIFO_FILE2 "/tmp/test-transport/api-wlan-p1/WLAN_FIFO_out"
-
-/**
- * Maximum size of a message allowed in either direction
- * (used for our receive and sent buffers).
- */
-#define MAXLINE 4096
-
-
-/**
- * IO buffer used for buffering data in transit.
- */
-struct SendBuffer
-{
- /**
- * How many bytes that were stored in 'buf' did we already write to the
- * destination? Always smaller than 'size'.
- */
- size_t pos;
-
- /**
- * How many bytes of data are stored in 'buf' for transmission right now?
- * Data always starts at offset 0 and extends to 'size'.
- */
- size_t size;
-
- /**
- * Buffered data; twice the maximum allowed message size as we add some
- * headers.
- */
- char buf[MAXLINE * 2];
-};
-
-
-/**
- * Flag set to 1 if we are to terminate, otherwise 0.
- */
-static int closeprog;
-
-
-/**
- * We're being killed, clean up.
- *
- * @param sig killing signal
- */
-static void
-sigfunc (int sig)
-{
- closeprog = 1;
- (void) unlink (FIFO_FILE1);
- (void) unlink (FIFO_FILE2);
-}
-
-
-/**
- * Create control message for plugin
- *
- * @param buffer pointer to buffer for the message
- * @param mac pointer to the mac address
- * @return number of bytes written
- */
-static int
-send_mac_to_plugin (char *buffer, struct GNUNET_TRANSPORT_WLAN_MacAddress *mac)
-{
- struct GNUNET_TRANSPORT_WLAN_HelperControlMessage macmsg;
-
- GNUNET_memcpy (&macmsg.mac,
- (char *) mac,
- sizeof(struct GNUNET_TRANSPORT_WLAN_MacAddress));
- macmsg.hdr.size =
- htons (sizeof(struct GNUNET_TRANSPORT_WLAN_HelperControlMessage));
- macmsg.hdr.type = htons (GNUNET_MESSAGE_TYPE_WLAN_HELPER_CONTROL);
- GNUNET_memcpy (buffer,
- &macmsg,
- sizeof(struct GNUNET_TRANSPORT_WLAN_HelperControlMessage));
- return sizeof(struct GNUNET_TRANSPORT_WLAN_HelperControlMessage);
-}
-
-
-/**
- * We got a message from the FIFO, check it, convert the message
- * type to the output forward and copy it to the buffer for stdout.
- *
- * @param cls the 'struct SendBuffer' to copy the converted message to
- * @param hdr inbound message from the FIFO
- * @return #GNUNET_OK on success,
- * #GNUNET_NO to stop further processing (no error)
- * #GNUNET_SYSERR to stop further processing with error
- */
-static int
-stdin_send (void *cls, const struct GNUNET_MessageHeader *hdr)
-{
- struct SendBuffer *write_pout = cls;
- const struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *in;
- size_t payload_size;
- struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage newheader;
- uint16_t sendsize;
-
- sendsize = ntohs (hdr->size);
- in = (const struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *) hdr;
- if ((GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER != ntohs (hdr->type)) ||
- (sizeof(struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage) > sendsize))
- {
- fprintf (stderr, "%s", "Received malformed message\n");
- exit (1);
- }
- payload_size =
- sendsize - sizeof(struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage);
- if ((payload_size
- + sizeof(struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage)
- + write_pout->size) > MAXLINE * 2)
- {
- fprintf (stderr, "%s", "Packet too big for buffer\n");
- exit (1);
- }
- memset (&newheader, 0, sizeof(newheader));
- newheader.header.size = htons (payload_size + sizeof(newheader));
- newheader.header.type = htons (GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER);
- newheader.frame = in->frame;
- GNUNET_memcpy (write_pout->buf + write_pout->size,
- &newheader,
- sizeof(newheader));
- write_pout->size += sizeof(newheader);
- GNUNET_memcpy (write_pout->buf + write_pout->size, &in[1], payload_size);
- write_pout->size += payload_size;
- return GNUNET_OK;
-}
-
-
-/**
- * We read a full message from stdin. Copy it to our send buffer.
- *
- * @param cls the 'struct SendBuffer' to copy to
- * @param hdr the message we received to copy to the buffer
- * @return #GNUNET_OK on success,
- * #GNUNET_NO to stop further processing (no error)
- * #GNUNET_SYSERR to stop further processing with error
- */
-static int
-file_in_send (void *cls, const struct GNUNET_MessageHeader *hdr)
-{
- struct SendBuffer *write_std = cls;
- uint16_t sendsize;
-
- sendsize = ntohs (hdr->size);
- if ((sendsize + write_std->size) > MAXLINE * 2)
- {
- fprintf (stderr, "%s", "Packet too big for buffer\n");
- exit (1);
- }
- GNUNET_memcpy (write_std->buf + write_std->size, hdr, sendsize);
- write_std->size += sendsize;
- return GNUNET_OK;
-}
-
-
-/**
- * Main function of a program that pretends to be a WLAN card.
- *
- * @param argc should be 2
- * @param argv either '1' or '2', depending on which of the two cards this
dummy is to emulate
- * @return 1 on error, 0 if terminated normally via signal
- */
-int
-main (int argc, char *argv[])
-{
- struct stat st;
- int erg;
- FILE *fpin = NULL;
- FILE *fpout = NULL;
- int fdpin;
- int fdpout;
- char readbuf[MAXLINE];
- int readsize;
- struct SendBuffer write_std;
- struct SendBuffer write_pout;
- int ret;
- int maxfd;
- fd_set rfds;
- fd_set wfds;
- struct timeval tv;
- int retval;
- struct GNUNET_MessageStreamTokenizer *stdin_mst = NULL;
- struct GNUNET_MessageStreamTokenizer *file_in_mst = NULL;
- struct GNUNET_TRANSPORT_WLAN_MacAddress macaddr;
- int first;
-
- if ((2 != argc) ||
- ((0 != strcmp (argv[1], "1")) && (0 != strcmp (argv[1], "2"))))
- {
- fprintf (
- stderr,
- "%s",
- "This program must be started with the operating mode (1 or 2) as the
only argument.\n");
- return 1;
- }
-
- /* make the fifos if needed */
- umask (0);
- if ((GNUNET_OK != GNUNET_DISK_directory_create_for_file (FIFO_FILE1)) ||
- (GNUNET_OK != GNUNET_DISK_directory_create_for_file (FIFO_FILE2)))
- {
- fprintf (stderr, "Failed to create directory for file `%s'\n", FIFO_FILE1);
- return 1;
- }
- if (0 == strcmp (argv[1], "1"))
- {
- if (0 != stat (FIFO_FILE1, &st))
- {
- erg = mkfifo (FIFO_FILE1, 0666);
- if ((0 != erg) && (EEXIST != errno))
- fprintf (stderr,
- "Error in mkfifo(%s): %s\n",
- FIFO_FILE1,
- strerror (errno));
- }
- }
- else
- {
- if (0 != stat (FIFO_FILE2, &st))
- {
- GNUNET_break (0 == (erg = mkfifo (FIFO_FILE2, 0666)));
- if ((0 != erg) && (EEXIST != errno))
- fprintf (stderr,
- "Error in mkfifo(%s): %s\n",
- FIFO_FILE2,
- strerror (errno));
- }
- }
-
- if (0 == strcmp (argv[1], "1"))
- {
- first = 1;
- fpin = fopen (FIFO_FILE1, "r");
- if (NULL == fpin)
- {
- fprintf (stderr,
- "fopen of read FIFO_FILE1 failed: %s\n",
- strerror (errno));
- goto end;
- }
- if (NULL == (fpout = fopen (FIFO_FILE2, "w")))
- {
- GNUNET_break (0 == mkfifo (FIFO_FILE2, 0666));
- fpout = fopen (FIFO_FILE2, "w");
- }
- if (NULL == fpout)
- {
- fprintf (stderr,
- "fopen of write FIFO_FILE2 failed: %s\n",
- strerror (errno));
- goto end;
- }
- }
- else
- {
- first = 0;
- if (NULL == (fpout = fopen (FIFO_FILE1, "w")))
- {
- GNUNET_break (0 == mkfifo (FIFO_FILE1, 0666));
- fpout = fopen (FIFO_FILE1, "w");
- }
- if (NULL == fpout)
- {
- fprintf (stderr,
- "fopen of write FIFO_FILE1 failed: %s\n",
- strerror (errno));
- goto end;
- }
- fpin = fopen (FIFO_FILE2, "r");
- if (NULL == fpin)
- {
- fprintf (stderr,
- "fopen of read FIFO_FILE2 failed: %s\n",
- strerror (errno));
- goto end;
- }
- }
-
- fdpin = fileno (fpin);
- GNUNET_assert (fpin >= 0);
- if (fdpin >= FD_SETSIZE)
- {
- fprintf (stderr,
- "File fdpin number too large (%d > %u)\n",
- fdpin,
- (unsigned int) FD_SETSIZE);
- goto end;
- }
-
- fdpout = fileno (fpout);
- GNUNET_assert (fdpout >= 0);
-
- if (fdpout >= FD_SETSIZE)
- {
- fprintf (stderr,
- "File fdpout number too large (%d > %u)\n",
- fdpout,
- (unsigned int) FD_SETSIZE);
- goto end;
- }
-
- signal (SIGINT, &sigfunc);
- signal (SIGTERM, &sigfunc);
- signal (GNUNET_TERM_SIG, &sigfunc);
-
- write_std.size = 0;
- write_std.pos = 0;
- write_pout.size = 0;
- write_pout.pos = 0;
- stdin_mst = GNUNET_MST_create (&stdin_send, &write_pout);
- file_in_mst = GNUNET_MST_create (&file_in_send, &write_std);
-
- /* Send 'random' mac address */
- macaddr.mac[0] = 0x13;
- macaddr.mac[1] = 0x22;
- macaddr.mac[2] = 0x33;
- macaddr.mac[3] = 0x44;
- macaddr.mac[4] = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG,
256);
- macaddr.mac[5] = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, 256);
- write_std.size = send_mac_to_plugin (write_std.buf, &macaddr);
-
- while (0 == closeprog)
- {
- maxfd = -1;
- tv.tv_sec = 5;
- tv.tv_usec = 0;
-
- FD_ZERO (&rfds);
- FD_ZERO (&wfds);
- /* if output queue is empty, read */
- if (0 == write_pout.size)
- {
- FD_SET (STDIN_FILENO, &rfds);
- maxfd = MAX (STDIN_FILENO, maxfd);
- }
- if (0 == write_std.size)
- {
- FD_SET (fdpin, &rfds);
- maxfd = MAX (fdpin, maxfd);
- }
-
- /* if there is something to write, try to write */
- if (0 < write_std.size)
- {
- FD_SET (STDOUT_FILENO, &wfds);
- maxfd = MAX (maxfd, STDOUT_FILENO);
- }
- if (0 < write_pout.size)
- {
- FD_SET (fdpout, &wfds);
- maxfd = MAX (maxfd, fdpout);
- }
-
- retval = select (maxfd + 1, &rfds, &wfds, NULL, &tv);
- if ((-1 == retval) && (EINTR == errno))
- continue;
- if (0 > retval)
- {
- fprintf (stderr, "select failed: %s\n", strerror (errno));
- closeprog = 1;
- break;
- }
-
- if (FD_ISSET (STDOUT_FILENO, &wfds))
- {
- ret = write (STDOUT_FILENO,
- write_std.buf + write_std.pos,
- write_std.size - write_std.pos);
- if (0 > ret)
- {
- closeprog = 1;
- fprintf (stderr,
- "Write ERROR to STDOUT_FILENO: %s\n",
- strerror (errno));
- break;
- }
- else
- {
- write_std.pos += ret;
- /* check if finished writing */
- if (write_std.pos == write_std.size)
- {
- write_std.pos = 0;
- write_std.size = 0;
- }
- }
- }
-
- if (FD_ISSET (fdpout, &wfds))
- {
- ret = write (fdpout,
- write_pout.buf + write_pout.pos,
- write_pout.size - write_pout.pos);
-
- if (0 > ret)
- {
- closeprog = 1;
- fprintf (stderr,
- "Write ERROR to fdpout failed: %s\n",
- strerror (errno));
- }
- else
- {
- write_pout.pos += ret;
- /* check if finished writing */
- if (write_pout.pos == write_pout.size)
- {
- write_pout.pos = 0;
- write_pout.size = 0;
- }
- }
- }
-
- if (FD_ISSET (STDIN_FILENO, &rfds))
- {
- readsize = read (STDIN_FILENO, readbuf, sizeof(readbuf));
-
- if (0 > readsize)
- {
- closeprog = 1;
- fprintf (stderr,
- "Error reading from STDIN_FILENO: %s\n",
- strerror (errno));
- }
- else if (0 < readsize)
- {
- GNUNET_MST_from_buffer (stdin_mst,
- readbuf,
- readsize,
- GNUNET_NO,
- GNUNET_NO);
- }
- else
- {
- /* eof */
- closeprog = 1;
- }
- }
-
- if (FD_ISSET (fdpin, &rfds))
- {
- readsize = read (fdpin, readbuf, sizeof(readbuf));
- if (0 > readsize)
- {
- closeprog = 1;
- fprintf (stderr, "Error reading from fdpin: %s\n", strerror (errno));
- break;
- }
- else if (0 < readsize)
- {
- GNUNET_MST_from_buffer (file_in_mst,
- readbuf,
- readsize,
- GNUNET_NO,
- GNUNET_NO);
- }
- else
- {
- /* eof */
- closeprog = 1;
- }
- }
- }
-
-end:
- /* clean up */
- if (NULL != stdin_mst)
- GNUNET_MST_destroy (stdin_mst);
- if (NULL != file_in_mst)
- GNUNET_MST_destroy (file_in_mst);
-
- if (NULL != fpout)
- fclose (fpout);
- if (NULL != fpin)
- fclose (fpin);
- if (1 == first)
- {
- (void) unlink (FIFO_FILE1);
- (void) unlink (FIFO_FILE2);
- }
- return 0;
-}
diff --git a/src/transport/gnunet-helper-transport-wlan.c
b/src/transport/gnunet-helper-transport-wlan.c
deleted file mode 100644
index c1a230bef..000000000
--- a/src/transport/gnunet-helper-transport-wlan.c
+++ /dev/null
@@ -1,2165 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010, 2011, 2012 GNUnet e.V.
- Copyright (c) 2007, 2008, Andy Green <andy@warmcat.com>
- Copyright Copyright (C) 2009 Thomas d'Otreppe
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file src/transport/gnunet-helper-transport-wlan.c
- * @brief mediator between the wlan interface and gnunet; must run as root
(SUID will do)
- * This code will work under GNU/Linux only.
- * @author David Brodski
- * @author Christian Grothoff
- *
- * This program will allow receiving and sending traffic from the WLAN
- * interface. It will force traffic to be in 'ad-hoc' mode, use the
- * proper MAC address of the WLAN interface and use a GNUnet-specific
- * SSID (and a GNUnet-specific SNAP header). It only takes a single
- * argument, which is the name of the WLAN interface to use. The
- * program detects if the interface is not a WLAN interface and exits
- * with an error in that case.
- *
- * Once initialized, the program will first send a 'struct
- * GNUNET_TRANSPORT_WLAN_HelperControlMessage' to 'stdout'. That
- * message contains the MAC address of the WLAN interface. It will
- * then read messages from the WLAN interface and send them together
- * with performance information as 'struct
- * GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage' messages to 'stdout'.
- * Furthermore, it will read a stream of messages from 'stdin' that
- * have the format from 'struct
- * GNUNET_TRANSPORT_WLAN_RadiotapSendMessage'. Those messages will
- * then be sent via the WLAN interface; however, the sender MAC
- * address will be forced to be the correct address from our WLAN
- * card. If 'stdin' closes, receiving from the WLAN interface will
- * continue. If 'stdout' causes a SIGPIPE, the process dies from the
- * signal. Errors cause an error message to be reported to 'stderr',
- * in most cases the process also exits (with status code '1'). The
- * program never terminates normally; it is safe to kill the
- * process with SIGTERM or SIGKILL at any time.
- *
- * Since it uses RAW sockets, the binary must be installed SUID or run
- * as 'root'. In order to keep the security risk of the resulting
- * SUID binary minimal, the program ONLY opens the RAW socket with
- * root privileges, then drops them and only then starts to process
- * command line arguments. The code also does not link against any
- * shared libraries (except libc) and is strictly minimal (except for
- * checking for errors). The following list of people have reviewed
- * this code and considered it safe since the last modification (if
- * you reviewed it, please have your name added to the list):
- *
- * - Christian Grothoff (Apr 3rd 2012)
- */
-
-/*-
- * we use our local copy of ieee80211_radiotap.h
- *
- * - since we can't support extensions we don't understand
- * - since linux does not include it in userspace headers
- *
- * Portions of this code were taken from the ieee80211_radiotap.h header,
- * which is
- *
- * Copyright (c) 2003, 2004 David Young. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of David Young may not be used to endorse or promote
- * products derived from this software without specific prior
- * written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY DAVID YOUNG ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DAVID
- * YOUNG BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- */
-
-/*
- * Modifications to fit into the linux IEEE 802.11 stack,
- * Mike Kershaw (dragorn@kismetwireless.net)
- */
-/*
- * parts taken from aircrack-ng, parts changend.
- */
-#include "platform.h"
-#include "gnunet_private_config.h"
-#include <netpacket/packet.h>
-#include <linux/if_ether.h>
-#include <linux/wireless.h>
-
-#include "gnunet_protocols.h"
-#include "plugin_transport_wlan.h"
-
-/**
- * Packet format type for the messages we receive from
- * the kernel. This is for Ethernet 10Mbps format (no
- * performance information included).
- */
-#define ARPHRD_ETHER 1
-
-
-/**
- * Packet format type for the messages we receive from
- * the kernel. This is for plain messages (with no
- * performance information included).
- */
-#define ARPHRD_IEEE80211 801
-
-
-/**
- * Packet format type for the messages we receive from
- * the kernel. This is for the PRISM format.
- */
-#define ARPHRD_IEEE80211_PRISM 802
-
-/**
- * Packet format type for the messages we receive from
- * the kernel. This is for messages with a
- * 'struct Ieee80211RadiotapHeader' (see below).
- */
-#define ARPHRD_IEEE80211_FULL 803
-
-
-/**
- * Maximum size of a message allowed in either direction
- * (used for our receive and sent buffers).
- */
-#define MAXLINE 4096
-
-
-/* ********* structure of messages of type ARPHRD_IEEE80211_PRISM ***********
*/
-
-/**
- * Device name length in PRISM frames.
- * (In the kernel, this is "WLAN_DEVNAMELEN_MAX")
- */
-#define PRISM_DEVICE_NAME_LENGTH 16
-
-/**
- * Monitor Frame (indicator that we have a 'struct PrismHeader').
- */
-#define PRISM_MSGCODE_MONITOR 0x0041
-
-/**
- * Mac time element. In micro-seconds.
- * Drivers appear to use a 64bit counter to hold mactime internal
- * the then fill the prism header with the lower 32 bits
- */
-#define PRISM_DID_MACTIME 0x2041
-
-/**
- * Channel element
- */
-#define PRISM_DID_CHANNEL 0x3041
-
-/**
- * Signal element. Should be the signal strength in dbm, some people
- * suggest that instead "100 - (strength in dbm)" is used (to make this
- * a positive integer).
- */
-#define PRISM_DID_SIGNAL 0x6041
-
-/**
- * Noise element
- */
-#define PRISM_DID_NOISE 0x7041
-
-/**
- * Rate element, in units/multiples of 500Khz
- */
-#define PRISM_DID_RATE 0x8041
-
-
-/**
- * Value is set (supplied)
- */
-#define PRISM_STATUS_OK 0
-
-/**
- * Value not supplied.
- */
-#define PRISM_STATUS_NO_VALUE 1
-
-
-/**
- * Values in the 'struct PrismHeader'. All in host byte order (!).
- */
-struct PrismValue
-{
- /**
- * This has a different ID for each parameter, see
- * PRISM_DID_* constants.
- */
- uint32_t did;
-
- /**
- * See PRISM_STATUS_*-constants. Note that they are unusual: 0 = set; 1 =
not set
- */
- uint16_t status;
-
- /**
- * length of data (which is always a uint32_t, but presumably this can be
used
- * to specify that fewer bytes are used (with values in 'len' from 0-4). We
- * ignore this field.
- */
- uint16_t len;
-
- /**
- * The data value
- */
- uint32_t data;
-} __attribute__ ((packed));
-
-
-/**
- * Prism header format ('struct p80211msg' in Linux). All in host byte order
(!).
- */
-struct PrismHeader
-{
- /**
- * We expect this to be a PRISM_MSGCODE_*.
- */
- uint32_t msgcode;
-
- /**
- * The length of the entire header.
- */
- uint32_t msglen;
-
- /**
- * Name of the device that captured the packet.
- */
- char devname[PRISM_DEVICE_NAME_LENGTH];
-
- /* followed by 'struct PrismValue's. Documentation suggests that these
- are typically the hosttime, mactime, channel, rssi, sq, signal, noise,
- rate, istx and frmlen values, but documentation is sparse. So we
- will use the 'did' fields to find out what we actually got. */
-} __attribute__ ((packed));
-
-
-/* ****** end of structure of messages of type ARPHRD_IEEE80211_PRISM *******
*/
-
-/* ********** structure of messages of type ARPHRD_IEEE80211_FULL ***********
*/
-
-/**
- * Bits in the 'it_present' bitmask from the 'struct
- * Ieee80211RadiotapHeader'. For each value, we give the name, data
- * type, unit and then a description below. Note that the actual size
- * of the extension can be bigger as arguments must be padded so that
- * args of a given length must begin at a boundary of that length.
- * However, note that compound args are allowed (eg, 2 x uint16_t for
- * IEEE80211_RADIOTAP_CHANNEL) so total argument length is not a
- * reliable indicator of alignment requirement. See also
- * 'man 9 ieee80211_radiotap'.
- */
-enum RadiotapType
-{
- /**
- * IEEE80211_RADIOTAP_TSFT __le64 microseconds
- *
- * Value in microseconds of the MAC's 64-bit 802.11 Time
- * Synchronization Function timer when the first bit of the
- * MPDU arrived at the MAC. For received frames, only.
- */
- IEEE80211_RADIOTAP_TSFT = 0,
-
- /**
- * IEEE80211_RADIOTAP_FLAGS uint8_t bitmap
- *
- * Properties of transmitted and received frames. See flags
- * defined below.
- */
- IEEE80211_RADIOTAP_FLAGS = 1,
-
- /**
- * IEEE80211_RADIOTAP_RATE uint8_t 500kb/s
- *
- * Tx/Rx data rate
- */
- IEEE80211_RADIOTAP_RATE = 2,
-
- /**
- * IEEE80211_RADIOTAP_CHANNEL 2 x __le16 MHz, bitmap
- *
- * Tx/Rx frequency in MHz, followed by flags (see below).
- */
- IEEE80211_RADIOTAP_CHANNEL = 3,
- /**
- * IEEE80211_RADIOTAP_FHSS __le16 see below
- *
- * For frequency-hopping radios, the hop set (first byte)
- * and pattern (second byte).
- */
- IEEE80211_RADIOTAP_FHSS = 4,
-
- /**
- * IEEE80211_RADIOTAP_DBM_ANTSIGNAL s8 decibels from
- * one milliwatt (dBm)
- *
- * RF signal power at the antenna, decibel difference from
- * one milliwatt.
- */
- IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5,
-
- /**
- * IEEE80211_RADIOTAP_DBM_ANTNOISE s8 decibels from
- * one milliwatt (dBm)
- *
- * RF noise power at the antenna, decibel difference from one
- * milliwatt.
- */
- IEEE80211_RADIOTAP_DBM_ANTNOISE = 6,
-
- /**
- * IEEE80211_RADIOTAP_LOCK_QUALITY __le16 unitless
- *
- * Quality of Barker code lock. Unitless. Monotonically
- * nondecreasing with "better" lock strength. Called "Signal
- * Quality" in datasheets. (Is there a standard way to measure
- * this?)
- */
- IEEE80211_RADIOTAP_LOCK_QUALITY = 7,
-
- /**
- * IEEE80211_RADIOTAP_TX_ATTENUATION __le16 unitless
- *
- * Transmit power expressed as unitless distance from max
- * power set at factory calibration. 0 is max power.
- * Monotonically nondecreasing with lower power levels.
- */
- IEEE80211_RADIOTAP_TX_ATTENUATION = 8,
-
- /**
- * IEEE80211_RADIOTAP_DB_TX_ATTENUATION __le16 decibels (dB)
- *
- * Transmit power expressed as decibel distance from max power
- * set at factory calibration. 0 is max power. Monotonically
- * nondecreasing with lower power levels.
- */
- IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9,
-
- /**
- * IEEE80211_RADIOTAP_DBM_TX_POWER s8 decibels from
- * one milliwatt (dBm)
- *
- * Transmit power expressed as dBm (decibels from a 1 milliwatt
- * reference). This is the absolute power level measured at
- * the antenna port.
- */
- IEEE80211_RADIOTAP_DBM_TX_POWER = 10,
-
- /**
- * IEEE80211_RADIOTAP_ANTENNA uint8_t antenna index
- *
- * Unitless indication of the Rx/Tx antenna for this packet.
- * The first antenna is antenna 0.
- */
- IEEE80211_RADIOTAP_ANTENNA = 11,
-
- /**
- * IEEE80211_RADIOTAP_DB_ANTSIGNAL uint8_t decibel (dB)
- *
- * RF signal power at the antenna, decibel difference from an
- * arbitrary, fixed reference.
- */
- IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12,
-
- /**
- * IEEE80211_RADIOTAP_DB_ANTNOISE uint8_t decibel (dB)
- *
- * RF noise power at the antenna, decibel difference from an
- * arbitrary, fixed reference point.
- */
- IEEE80211_RADIOTAP_DB_ANTNOISE = 13,
-
- /**
- * IEEE80211_RADIOTAP_RX_FLAGS __le16 bitmap
- *
- * Properties of received frames. See flags defined below.
- */
- IEEE80211_RADIOTAP_RX_FLAGS = 14,
-
- /**
- * IEEE80211_RADIOTAP_TX_FLAGS __le16 bitmap
- *
- * Properties of transmitted frames. See flags defined below.
- */
- IEEE80211_RADIOTAP_TX_FLAGS = 15,
-
- /**
- * IEEE80211_RADIOTAP_RTS_RETRIES uint8_t data
- *
- * Number of rts retries a transmitted frame used.
- */
- IEEE80211_RADIOTAP_RTS_RETRIES = 16,
-
- /**
- * IEEE80211_RADIOTAP_DATA_RETRIES uint8_t data
- *
- * Number of unicast retries a transmitted frame used.
- */
- IEEE80211_RADIOTAP_DATA_RETRIES = 17,
-
- /**
- * Extension bit, used to indicate that more bits are needed for
- * the bitmask.
- */
- IEEE80211_RADIOTAP_EXT = 31
-};
-
-/**
- * Bitmask indicating an extension of the bitmask is used.
- * (Mask corresponding to IEEE80211_RADIOTAP_EXT).
- */
-#define IEEE80211_RADIOTAP_PRESENT_EXTEND_MASK (1 << IEEE80211_RADIOTAP_EXT)
-
-
-/**
- * Bit in IEEE80211_RADIOTAP_FLAGS (which we might get
- * as part of a 'struct Ieee80211RadiotapHeader' extension
- * if the IEEE80211_RADIOTAP_FLAGS bit is set in
- * 'it_present'). The radiotap flags are an 8-bit field.
- *
- * Frame was sent/received during CFP (Contention Free Period)
- */
-#define IEEE80211_RADIOTAP_F_CFP 0x01
-
-/**
- * Bit in IEEE80211_RADIOTAP_FLAGS (which we might get
- * as part of a 'struct Ieee80211RadiotapHeader' extension
- * if the IEEE80211_RADIOTAP_FLAGS bit is set in
- * 'it_present'). The radiotap flags are an 8-bit field.
- *
- * Frame was sent/received with short preamble
- */
-#define IEEE80211_RADIOTAP_F_SHORTPRE 0x02
-
-/**
- * Bit in IEEE80211_RADIOTAP_FLAGS (which we might get
- * as part of a 'struct Ieee80211RadiotapHeader' extension
- * if the IEEE80211_RADIOTAP_FLAGS bit is set in
- * 'it_present'). The radiotap flags are an 8-bit field.
- *
- * Frame was sent/received with WEP encryption
- */
-#define IEEE80211_RADIOTAP_F_WEP 0x04
-
-/**
- * Bit in IEEE80211_RADIOTAP_FLAGS (which we might get
- * as part of a 'struct Ieee80211RadiotapHeader' extension
- * if the IEEE80211_RADIOTAP_FLAGS bit is set in
- * 'it_present'). The radiotap flags are an 8-bit field.
- *
- * Frame was sent/received with fragmentation
- */
-#define IEEE80211_RADIOTAP_F_FRAG 0x08
-
-/**
- * Bit in IEEE80211_RADIOTAP_FLAGS (which we might get
- * as part of a 'struct Ieee80211RadiotapHeader' extension
- * if the IEEE80211_RADIOTAP_FLAGS bit is set in
- * 'it_present'). The radiotap flags are an 8-bit field.
- *
- * Frame includes FCS (CRC at the end that needs to be removeD).
- */
-#define IEEE80211_RADIOTAP_F_FCS 0x10
-
-/**
- * Bit in IEEE80211_RADIOTAP_FLAGS (which we might get
- * as part of a 'struct Ieee80211RadiotapHeader' extension
- * if the IEEE80211_RADIOTAP_FLAGS bit is set in
- * 'it_present'). The radiotap flags are an 8-bit field.
- *
- * Frame has padding between 802.11 header and payload
- * (to 32-bit boundary)
- */
-#define IEEE80211_RADIOTAP_F_DATAPAD 0x20
-
-
-/**
- * For IEEE80211_RADIOTAP_RX_FLAGS:
- * frame failed crc check
- */
-#define IEEE80211_RADIOTAP_F_RX_BADFCS 0x0001
-
-/**
- * For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct
RadiotapTransmissionHeader'):
- * failed due to excessive retries
- */
-#define IEEE80211_RADIOTAP_F_TX_FAIL 0x0001
-
-/**
- * For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct
RadiotapTransmissionHeader'):
- * used cts 'protection'
- */
-#define IEEE80211_RADIOTAP_F_TX_CTS 0x0002
-
-/**
- * For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct
RadiotapTransmissionHeader'):
- * used rts/cts handshake
- */
-#define IEEE80211_RADIOTAP_F_TX_RTS 0x0004
-
-/**
- * For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct
RadiotapTransmissionHeader'):
- * frame should not be ACKed
- */
-#define IEEE80211_RADIOTAP_F_TX_NOACK 0x0008
-
-/**
- * For IEEE80211_RADIOTAP_TX_FLAGS ('txflags' in 'struct
RadiotapTransmissionHeader'):
- * sequence number handled by userspace
- */
-#define IEEE80211_RADIOTAP_F_TX_NOSEQ 0x0010
-
-
-/**
- * Generic header for radiotap messages (receiving and sending). A
- * bit mask (it_present) determines which specific records follow.
- *
- * I am trying to describe precisely what the application programmer
- * should expect in the following, and for that reason I tell the
- * units and origin of each measurement (where it applies), or else I
- * use sufficiently weaselly language ("is a monotonically nondecreasing
- * function of...") that I cannot set false expectations for lawyerly
- * readers.
- *
- * The radio capture header precedes the 802.11 header.
- * All data in the header is little endian on all platforms.
- */
-struct Ieee80211RadiotapHeader
-{
- /**
- * Version 0. Only increases for drastic changes, introduction of
- * compatible new fields does not count.
- */
- uint8_t it_version;
-
- /**
- * Padding. Set to 0.
- */
- uint8_t it_pad;
-
- /**
- * length of the whole header in bytes, including it_version,
- * it_pad, it_len, and data fields.
- */
- uint16_t it_len;
-
- /**
- * A bitmap telling which fields are present. Set bit 31
- * (0x80000000) to extend the bitmap by another 32 bits. Additional
- * extensions are made by setting bit 31.
- */
- uint32_t it_present;
-};
-
-
-/**
- * Format of the header we need to prepend to messages to be sent to the
- * Kernel.
- */
-struct RadiotapTransmissionHeader
-{
- /**
- * First we begin with the 'generic' header we also get when receiving
- * messages.
- */
- struct Ieee80211RadiotapHeader header;
-
- /**
- * Transmission rate (we use 0, kernel makes up its mind anyway).
- */
- uint8_t rate;
-
- /**
- * Padding (we use 0). There is a requirement to pad args, so that
- * args of a given length must begin at a boundary of that length.
- * As our next argument is the 'it_len' with 2 bytes, we need 1 byte
- * of padding.
- */
- uint8_t pad1;
-
- /**
- * Transmission flags from on the IEEE80211_RADIOTAP_F_TX_* constant family.
- */
- uint16_t txflags;
-};
-
-/**
- * The above 'struct RadiotapTransmissionHeader' should have the
- * following value for 'header.it_present' based on the presence of
- * the 'rate' and 'txflags' in the overall struct.
- */
-#define IEEE80211_RADIOTAP_OUR_TRANSMISSION_HEADER_MASK ((1 \
- << \
-
IEEE80211_RADIOTAP_RATE) \
- | (1 \
- << \
-
IEEE80211_RADIOTAP_TX_FLAGS))
-
-
-/**
- * struct Ieee80211RadiotapHeaderIterator - tracks walk through present
radiotap arguments
- * in the radiotap header. Used when we parse radiotap packets received from
the kernel.
- */
-struct Ieee80211RadiotapHeaderIterator
-{
- /**
- * pointer to the radiotap header we are walking through
- */
- const struct Ieee80211RadiotapHeader *rtheader;
-
- /**
- * pointer to current radiotap arg
- */
- const uint8_t *this_arg;
-
- /**
- * internal next argument pointer
- */
- const uint8_t *arg;
-
- /**
- * internal pointer to next present uint32_t (if IEEE80211_RADIOTAP_EXT is
used).
- */
- const uint32_t *next_bitmap;
-
- /**
- * length of radiotap header in host byte ordering
- */
- size_t max_length;
-
- /**
- * internal shifter for current uint32_t bitmap, (it_present in host byte
order),
- * If bit 0 is set, the 'arg_index' argument is present.
- */
- uint32_t bitmap_shifter;
-
- /**
- * IEEE80211_RADIOTAP_... index of current arg
- */
- unsigned int this_arg_index;
-
- /**
- * internal next argument index
- */
- unsigned int arg_index;
-};
-
-
-/* ************** end of structure of ARPHRD_IEEE80211_FULL ************** */
-
-/* ************************** our globals ******************************* */
-
-/**
- * struct for storing the information of the hardware. There is only
- * one of these.
- */
-struct HardwareInfos
-{
- /**
- * file descriptor for the raw socket
- */
- int fd_raw;
-
- /**
- * Which format has the header that we're getting when receiving packets?
- * Some ARPHRD_IEEE80211_XXX-value.
- */
- int arptype_in;
-
- /**
- * Name of the interface, not necessarily 0-terminated (!).
- */
- char iface[IFNAMSIZ];
-
- /**
- * MAC address of our own WLAN interface.
- */
- struct GNUNET_TRANSPORT_WLAN_MacAddress pl_mac;
-};
-
-
-/**
- * IO buffer used for buffering data in transit (to wireless or to stdout).
- */
-struct SendBuffer
-{
- /**
- * How many bytes of data are stored in 'buf' for transmission right now?
- * Data always starts at offset 0 and extends to 'size'.
- */
- size_t size;
-
- /**
- * How many bytes that were stored in 'buf' did we already write to the
- * destination? Always smaller than 'size'.
- */
- size_t pos;
-
- /**
- * Buffered data; twice the maximum allowed message size as we add some
- * headers.
- */
- char buf[MAXLINE * 2];
-};
-
-
-/**
- * Buffer for data read from stdin to be transmitted to the wirless card.
- */
-static struct SendBuffer write_pout;
-
-/**
- * Buffer for data read from the wireless card to be transmitted to stdout.
- */
-static struct SendBuffer write_std;
-
-
-/* *********** specialized version of server_mst.c begins here ********** */
-
-/**
- * To what multiple do we align messages? 8 byte should suffice for everyone
- * for now.
- */
-#define ALIGN_FACTOR 8
-
-/**
- * Smallest supported message.
- */
-#define MIN_BUFFER_SIZE sizeof(struct GNUNET_MessageHeader)
-
-
-/**
- * Functions with this signature are called whenever a
- * complete message is received by the tokenizer.
- *
- * @param cls closure
- * @param message the actual message
- */
-typedef void (*MessageTokenizerCallback) (void *cls,
- const struct
- GNUNET_MessageHeader *
- message);
-
-/**
- * Handle to a message stream tokenizer.
- */
-struct MessageStreamTokenizer
-{
- /**
- * Function to call on completed messages.
- */
- MessageTokenizerCallback cb;
-
- /**
- * Closure for cb.
- */
- void *cb_cls;
-
- /**
- * Size of the buffer (starting at 'hdr').
- */
- size_t curr_buf;
-
- /**
- * How many bytes in buffer have we already processed?
- */
- size_t off;
-
- /**
- * How many bytes in buffer are valid right now?
- */
- size_t pos;
-
- /**
- * Beginning of the buffer. Typed like this to force alignment.
- */
- struct GNUNET_MessageHeader *hdr;
-};
-
-
-/**
- * Create a message stream tokenizer.
- *
- * @param cb function to call on completed messages
- * @param cb_cls closure for cb
- * @return handle to tokenizer
- */
-static struct MessageStreamTokenizer *
-mst_create (MessageTokenizerCallback cb,
- void *cb_cls)
-{
- struct MessageStreamTokenizer *ret;
-
- ret = malloc (sizeof(struct MessageStreamTokenizer));
- if (NULL == ret)
- {
- fprintf (stderr, "Failed to allocate buffer for tokenizer\n");
- exit (1);
- }
- ret->hdr = malloc (MIN_BUFFER_SIZE);
- if (NULL == ret->hdr)
- {
- fprintf (stderr, "Failed to allocate buffer for alignment\n");
- exit (1);
- }
- ret->curr_buf = MIN_BUFFER_SIZE;
- ret->cb = cb;
- ret->cb_cls = cb_cls;
- return ret;
-}
-
-
-/**
- * Add incoming data to the receive buffer and call the
- * callback for all complete messages.
- *
- * @param mst tokenizer to use
- * @param buf input data to add
- * @param size number of bytes in buf
- * @return GNUNET_OK if we are done processing (need more data)
- * GNUNET_SYSERR if the data stream is corrupt
- */
-static int
-mst_receive (struct MessageStreamTokenizer *mst,
- const char *buf, size_t size)
-{
- const struct GNUNET_MessageHeader *hdr;
- size_t delta;
- uint16_t want;
- char *ibuf;
- int need_align;
- unsigned long offset;
- int ret;
-
- ret = GNUNET_OK;
- ibuf = (char *) mst->hdr;
- while (mst->pos > 0)
- {
-do_align:
- if ((mst->curr_buf - mst->off < sizeof(struct GNUNET_MessageHeader)) ||
- (0 != (mst->off % ALIGN_FACTOR)))
- {
- /* need to align or need more space */
- mst->pos -= mst->off;
- memmove (ibuf, &ibuf[mst->off], mst->pos);
- mst->off = 0;
- }
- if (mst->pos - mst->off < sizeof(struct GNUNET_MessageHeader))
- {
- delta =
- GNUNET_MIN (sizeof(struct GNUNET_MessageHeader)
- - (mst->pos - mst->off), size);
- GNUNET_memcpy (&ibuf[mst->pos], buf, delta);
- mst->pos += delta;
- buf += delta;
- size -= delta;
- }
- if (mst->pos - mst->off < sizeof(struct GNUNET_MessageHeader))
- {
- return GNUNET_OK;
- }
- hdr = (const struct GNUNET_MessageHeader *) &ibuf[mst->off];
- want = ntohs (hdr->size);
- if (want < sizeof(struct GNUNET_MessageHeader))
- {
- fprintf (stderr,
- "Received invalid message from stdin\n");
- exit (1);
- }
- if (mst->curr_buf - mst->off < want)
- {
- /* need more space */
- mst->pos -= mst->off;
- memmove (ibuf, &ibuf[mst->off], mst->pos);
- mst->off = 0;
- }
- if (want > mst->curr_buf)
- {
- mst->hdr = realloc (mst->hdr, want);
- if (NULL == mst->hdr)
- {
- fprintf (stderr, "Failed to allocate buffer for alignment\n");
- exit (1);
- }
- ibuf = (char *) mst->hdr;
- mst->curr_buf = want;
- }
- hdr = (const struct GNUNET_MessageHeader *) &ibuf[mst->off];
- if (mst->pos - mst->off < want)
- {
- delta = GNUNET_MIN (want - (mst->pos - mst->off), size);
- GNUNET_memcpy (&ibuf[mst->pos], buf, delta);
- mst->pos += delta;
- buf += delta;
- size -= delta;
- }
- if (mst->pos - mst->off < want)
- {
- return GNUNET_OK;
- }
- mst->cb (mst->cb_cls, hdr);
- mst->off += want;
- if (mst->off == mst->pos)
- {
- /* reset to beginning of buffer, it's free right now! */
- mst->off = 0;
- mst->pos = 0;
- }
- }
- while (size > 0)
- {
- if (size < sizeof(struct GNUNET_MessageHeader))
- break;
- offset = (unsigned long) buf;
- need_align = (0 != offset % ALIGN_FACTOR) ? GNUNET_YES : GNUNET_NO;
- if (GNUNET_NO == need_align)
- {
- /* can try to do zero-copy and process directly from original buffer */
- hdr = (const struct GNUNET_MessageHeader *) buf;
- want = ntohs (hdr->size);
- if (want < sizeof(struct GNUNET_MessageHeader))
- {
- fprintf (stderr,
- "Received invalid message from stdin\n");
- exit (1);
- }
- if (size < want)
- break; /* or not, buffer incomplete, so copy to
private buffer... */
- mst->cb (mst->cb_cls, hdr);
- buf += want;
- size -= want;
- }
- else
- {
- /* need to copy to private buffer to align;
- * yes, we go a bit more spaghetti than usual here */
- goto do_align;
- }
- }
- if (size > 0)
- {
- if (size + mst->pos > mst->curr_buf)
- {
- mst->hdr = realloc (mst->hdr, size + mst->pos);
- if (NULL == mst->hdr)
- {
- fprintf (stderr, "Failed to allocate buffer for alignment\n");
- exit (1);
- }
- ibuf = (char *) mst->hdr;
- mst->curr_buf = size + mst->pos;
- }
- if (mst->pos + size > mst->curr_buf)
- {
- fprintf (stderr,
- "Assertion failed\n");
- exit (1);
- }
- GNUNET_memcpy (&ibuf[mst->pos], buf, size);
- mst->pos += size;
- }
- return ret;
-}
-
-
-/**
- * Destroys a tokenizer.
- *
- * @param mst tokenizer to destroy
- */
-static void
-mst_destroy (struct MessageStreamTokenizer *mst)
-{
- free (mst->hdr);
- free (mst);
-}
-
-
-/* ***************** end of server_mst.c clone ***************** **/
-
-
-/* ************** code for handling of ARPHRD_IEEE80211_FULL ************** */
-
-/**
- * Radiotap header iteration
- *
- * call __ieee80211_radiotap_iterator_init() to init a semi-opaque iterator
- * struct Ieee80211RadiotapHeaderIterator (no need to init the struct
beforehand)
- * then loop calling __ieee80211_radiotap_iterator_next()... it returns -1
- * if there are no more args in the header, or the next argument type index
- * that is present. The iterator's this_arg member points to the start of the
- * argument associated with the current argument index that is present,
- * which can be found in the iterator's this_arg_index member. This arg
- * index corresponds to the IEEE80211_RADIOTAP_... defines.
- *
- * @param iterator iterator to initialize
- * @param radiotap_header message to parse
- * @param max_length number of valid bytes in radiotap_header
- * @return 0 on success, -1 on error
- */
-static int
-ieee80211_radiotap_iterator_init (struct
- Ieee80211RadiotapHeaderIterator *iterator,
- const struct
- Ieee80211RadiotapHeader *radiotap_header,
- size_t max_length)
-{
- if ((iterator == NULL) ||
- (radiotap_header == NULL))
- return -1;
-
- /* Linux only supports version 0 radiotap format */
- if (0 != radiotap_header->it_version)
- return -1;
-
- /* sanity check for allowed length and radiotap length field */
- if ((max_length < sizeof(struct Ieee80211RadiotapHeader)) ||
- (max_length < (GNUNET_le16toh (radiotap_header->it_len))))
- return -1;
-
- memset (iterator, 0, sizeof(struct Ieee80211RadiotapHeaderIterator));
- iterator->rtheader = radiotap_header;
- iterator->max_length = GNUNET_le16toh (radiotap_header->it_len);
- iterator->bitmap_shifter = GNUNET_le32toh (radiotap_header->it_present);
- iterator->arg = ((uint8_t *) radiotap_header) + sizeof(struct
-
Ieee80211RadiotapHeader);
-
- /* find payload start allowing for extended bitmap(s) */
- if (0 != (iterator->bitmap_shifter & IEEE80211_RADIOTAP_PRESENT_EXTEND_MASK))
- {
- while (GNUNET_le32toh (*((uint32_t *) iterator->arg))
- & IEEE80211_RADIOTAP_PRESENT_EXTEND_MASK)
- {
- iterator->arg += sizeof(uint32_t);
- /*
- * check for insanity where the present bitmaps
- * keep claiming to extend up to or even beyond the
- * stated radiotap header length
- */if (iterator->arg - ((uint8_t *) iterator->rtheader) >
- iterator->max_length)
- return -1;
- }
- iterator->arg += sizeof(uint32_t);
- /*
- * no need to check again for blowing past stated radiotap
- * header length, because ieee80211_radiotap_iterator_next
- * checks it before it is dereferenced
- */}
- /* we are all initialized happily */
- return 0;
-}
-
-
-/**
- * Returns the next radiotap parser iterator arg.
- *
- * This function returns the next radiotap arg index (IEEE80211_RADIOTAP_...)
- * and sets iterator->this_arg to point to the payload for the arg. It takes
- * care of alignment handling and extended present fields. interator->this_arg
- * can be changed by the caller. The args pointed to are in little-endian
- * format.
- *
- * @param iterator: radiotap_iterator to move to next arg (if any)
- * @return next present arg index on success or -1 if no more or error
- */
-static int
-ieee80211_radiotap_iterator_next (struct
- Ieee80211RadiotapHeaderIterator *iterator)
-{
- /*
- * small length lookup table for all radiotap types we heard of
- * starting from b0 in the bitmap, so we can walk the payload
- * area of the radiotap header
- *
- * There is a requirement to pad args, so that args
- * of a given length must begin at a boundary of that length
- * -- but note that compound args are allowed (eg, 2 x uint16_t
- * for IEEE80211_RADIOTAP_CHANNEL) so total arg length is not
- * a reliable indicator of alignment requirement.
- *
- * upper nybble: content alignment for arg
- * lower nybble: content length for arg
- */static const uint8_t rt_sizes[] = {
- [IEEE80211_RADIOTAP_TSFT] = 0x88,
- [IEEE80211_RADIOTAP_FLAGS] = 0x11,
- [IEEE80211_RADIOTAP_RATE] = 0x11,
- [IEEE80211_RADIOTAP_CHANNEL] = 0x24,
- [IEEE80211_RADIOTAP_FHSS] = 0x22,
- [IEEE80211_RADIOTAP_DBM_ANTSIGNAL] = 0x11,
- [IEEE80211_RADIOTAP_DBM_ANTNOISE] = 0x11,
- [IEEE80211_RADIOTAP_LOCK_QUALITY] = 0x22,
- [IEEE80211_RADIOTAP_TX_ATTENUATION] = 0x22,
- [IEEE80211_RADIOTAP_DB_TX_ATTENUATION] = 0x22,
- [IEEE80211_RADIOTAP_DBM_TX_POWER] = 0x11,
- [IEEE80211_RADIOTAP_ANTENNA] = 0x11,
- [IEEE80211_RADIOTAP_DB_ANTSIGNAL] = 0x11,
- [IEEE80211_RADIOTAP_DB_ANTNOISE] = 0x11,
- [IEEE80211_RADIOTAP_TX_FLAGS] = 0x22,
- [IEEE80211_RADIOTAP_RX_FLAGS] = 0x22,
- [IEEE80211_RADIOTAP_RTS_RETRIES] = 0x11,
- [IEEE80211_RADIOTAP_DATA_RETRIES] = 0x11
- /*
- * add more here as they are defined in
- * include/net/ieee80211_radiotap.h
- */
- };
-
- /*
- * for every radiotap entry we can at
- * least skip (by knowing the length)...
- */
- while (iterator->arg_index < sizeof(rt_sizes))
- {
- int hit = (0 != (iterator->bitmap_shifter & 1));
-
- if (hit)
- {
- unsigned int wanted_alignment;
- unsigned int unalignment;
- /*
- * arg is present, account for alignment padding
- * 8-bit args can be at any alignment
- * 16-bit args must start on 16-bit boundary
- * 32-bit args must start on 32-bit boundary
- * 64-bit args must start on 64-bit boundary
- *
- * note that total arg size can differ from alignment of
- * elements inside arg, so we use upper nybble of length table
- * to base alignment on. First, 'wanted_alignment' is set to be
- * 1 for 8-bit, 2 for 16-bit, 4 for 32-bit and 8 for 64-bit
- * arguments. Then, we calculate the 'unalignment' (how many
- * bytes we are over by taking the difference of 'arg' and the
- * overall starting point modulo the desired alignment. As
- * desired alignments are powers of two, we can do modulo with
- * binary "&" (and also avoid the possibility of a division by
- * zero if the 'rt_sizes' table contains bogus entries).
- *
- * also note: these alignments are relative to the start of the
- * radiotap header. There is no guarantee that the radiotap
- * header itself is aligned on any kind of boundary, thus we
- * need to really look at the delta here.
- */wanted_alignment = rt_sizes[iterator->arg_index] >> 4;
- unalignment = (((void *) iterator->arg) - ((void *) iterator->rtheader))
- & (wanted_alignment - 1);
- if (0 != unalignment)
- {
- /* need padding (by 'wanted_alignment - unalignment') */
- iterator->arg_index += wanted_alignment - unalignment;
- }
-
- /*
- * this is what we will return to user, but we need to
- * move on first so next call has something fresh to test
- */
- iterator->this_arg_index = iterator->arg_index;
- iterator->this_arg = iterator->arg;
-
- /* internally move on the size of this arg (using lower nybble from
- the table) */
- iterator->arg += rt_sizes[iterator->arg_index] & 0x0f;
-
- /*
- * check for insanity where we are given a bitmap that
- * claims to have more arg content than the length of the
- * radiotap section. We will normally end up equalling this
- * max_length on the last arg, never exceeding it.
- */if ((((void *) iterator->arg) - ((void *) iterator->rtheader)) >
- iterator->max_length)
- return -1;
- }
-
- /* Now, move on to next bit / next entry */
- iterator->arg_index++;
-
- if (0 == (iterator->arg_index % 32))
- {
- /* completed current uint32_t bitmap */
- if (0 != (iterator->bitmap_shifter & 1))
- {
- /* bit 31 was set, there is more; move to next uint32_t bitmap */
- iterator->bitmap_shifter = GNUNET_le32toh (*iterator->next_bitmap);
- iterator->next_bitmap++;
- }
- else
- {
- /* no more bitmaps: end (by setting arg_index to high, unsupported
value) */
- iterator->arg_index = sizeof(rt_sizes);
- }
- }
- else
- {
- /* just try the next bit (while loop will move on) */
- iterator->bitmap_shifter >>= 1;
- }
-
- /* if we found a valid arg earlier, return it now */
- if (hit)
- return iterator->this_arg_index;
- }
-
- /* we don't know how to handle any more args (or there are no more),
- so we're done (this is not an error) */
- return -1;
-}
-
-
-/**
- * Calculate crc32, the start of the calculation
- *
- * @param buf buffer to calc the crc
- * @param len len of the buffer
- * @return crc sum
- */
-static unsigned long
-calc_crc_osdep (const unsigned char *buf, size_t len)
-{
- static const unsigned long int crc_tbl_osdep[256] = {
- 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
- 0xE963A535, 0x9E6495A3,
- 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD,
- 0xE7B82D07, 0x90BF1D91,
- 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB,
- 0xF4D4B551, 0x83D385C7,
- 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
- 0xFA0F3D63, 0x8D080DF5,
- 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447,
- 0xD20D85FD, 0xA50AB56B,
- 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75,
- 0xDCD60DCF, 0xABD13D59,
- 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
- 0xCFBA9599, 0xB8BDA50F,
- 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11,
- 0xC1611DAB, 0xB6662D3D,
- 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F,
- 0x9FBFE4A5, 0xE8B8D433,
- 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
- 0x91646C97, 0xE6635C01,
- 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B,
- 0x8208F4C1, 0xF50FC457,
- 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49,
- 0x8CD37CF3, 0xFBD44C65,
- 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
- 0xA4D1C46D, 0xD3D6F4FB,
- 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5,
- 0xAA0A4C5F, 0xDD0D7CC9,
- 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3,
- 0xB966D409, 0xCE61E49F,
- 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
- 0xB7BD5C3B, 0xC0BA6CAD,
- 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF,
- 0x04DB2615, 0x73DC1683,
- 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D,
- 0x0A00AE27, 0x7D079EB1,
- 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
- 0x196C3671, 0x6E6B06E7,
- 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9,
- 0x17B7BE43, 0x60B08ED5,
- 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767,
- 0x3FB506DD, 0x48B2364B,
- 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
- 0x316E8EEF, 0x4669BE79,
- 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703,
- 0x220216B9, 0x5505262F,
- 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31,
- 0x2CD99E8B, 0x5BDEAE1D,
- 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
- 0x72076785, 0x05005713,
- 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D,
- 0x7CDCEFB7, 0x0BDBDF21,
- 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B,
- 0x6FB077E1, 0x18B74777,
- 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
- 0x616BFFD3, 0x166CCF45,
- 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7,
- 0x4969474D, 0x3E6E77DB,
- 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5,
- 0x47B2CF7F, 0x30B5FFE9,
- 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
- 0x54DE5729, 0x23D967BF,
- 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1,
- 0x5A05DF1B, 0x2D02EF8D
- };
-
- unsigned long crc = 0xFFFFFFFF;
-
- for (; len > 0; len--, buf++)
- crc = crc_tbl_osdep[(crc ^ *buf) & 0xFF] ^ (crc >> 8);
- return(~crc);
-}
-
-
-/**
- * Calculate and check crc of the wlan packet
- *
- * @param buf buffer of the packet, with len + 4 bytes of data,
- * the last 4 bytes being the checksum
- * @param len length of the payload in data
- * @return 0 on success (checksum matches), 1 on error
- */
-static int
-check_crc_buf_osdep (const unsigned char *buf, size_t len)
-{
- unsigned long crc;
-
- crc = calc_crc_osdep (buf, len);
- buf += len;
- if ((((crc) & 0xFF) == buf[0]) && (((crc >> 8) & 0xFF) == buf[1]) &&
- ( ((crc >> 16) & 0xFF) == buf[2]) && ( ((crc >> 24) & 0xFF) == buf[3]) )
- return 0;
- return 1;
-}
-
-
-/* ************end of code for handling of ARPHRD_IEEE80211_FULL
************** */
-
-
-/* ************beginning of code for reading packets from kernel
************** */
-
-/**
- * Return the channel from the frequency (in Mhz)
- *
- * @param frequency of the channel
- * @return number of the channel
- */
-static int
-get_channel_from_frequency (int32_t frequency)
-{
- if ((frequency >= 2412) && (frequency <= 2472))
- return (frequency - 2407) / 5;
- if (frequency == 2484)
- return 14;
- if ((frequency >= 5000) && (frequency <= 6100))
- return (frequency - 5000) / 5;
- return -1;
-}
-
-
-/**
- * Get the channel used by our WLAN interface.
- *
- * @param dev pointer to the dev struct of the card
- * @return channel number, -1 on error
- */
-static int
-linux_get_channel (const struct HardwareInfos *dev)
-{
- struct iwreq wrq;
- int32_t frequency;
-
- memset (&wrq, 0, sizeof(struct iwreq));
- strncpy (wrq.ifr_name, dev->iface, IFNAMSIZ);
- if (0 > ioctl (dev->fd_raw, SIOCGIWFREQ, &wrq))
- return -1;
- frequency = wrq.u.freq.m; /* 'iw_freq' defines 'm' as '__s32', so we keep it
signed */
- if (100000000 < frequency)
- frequency /= 100000;
- else if (1000000 < frequency)
- frequency /= 1000;
- if (1000 < frequency)
- return get_channel_from_frequency (frequency);
- return frequency;
-}
-
-
-/**
- * Read from the raw socket (the wlan card), parse the packet and
- * put the result into the buffer for transmission to 'stdout'.
- *
- * @param dev pointer to the struct of the wlan card
- * @param buf buffer to read to; first bytes will be the 'struct
GNUNET_TRANSPORT_WLAN_Ieee80211Frame',
- * followed by the actual payload
- * @param buf_size size of the buffer
- * @param ri where to write radiotap_rx info
- * @return number of bytes written to 'buf'
- */
-static ssize_t
-linux_read (struct HardwareInfos *dev,
- unsigned char *buf, size_t buf_size,
- struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *ri)
-{
- unsigned char tmpbuf[buf_size];
- ssize_t caplen;
- size_t n;
- int got_signal = 0;
- int got_noise = 0;
- int got_channel = 0;
- int fcs_removed = 0;
-
- caplen = read (dev->fd_raw, tmpbuf, buf_size);
- if (0 > caplen)
- {
- if (EAGAIN == errno)
- return 0;
- fprintf (stderr, "Failed to read from RAW socket: %s\n", strerror (errno));
- return -1;
- }
-
- memset (ri, 0, sizeof(*ri));
- switch (dev->arptype_in)
- {
- case ARPHRD_IEEE80211_PRISM:
- {
- const struct PrismHeader *ph;
-
- ph = (const struct PrismHeader*) tmpbuf;
- n = ph->msglen;
- if ((n < 8) || (n >= caplen))
- return 0; /* invalid format */
- if ((PRISM_MSGCODE_MONITOR == ph->msgcode) &&
- (n >= sizeof(struct PrismHeader)))
- {
- const char *pos;
- size_t left;
- struct PrismValue pv;
-
- left = n - sizeof(struct PrismHeader);
- pos = (const char *) &ph[1];
- while (left > sizeof(struct PrismValue))
- {
- left -= sizeof(struct PrismValue);
- GNUNET_memcpy (&pv, pos, sizeof(struct PrismValue));
- pos += sizeof(struct PrismValue);
-
- switch (pv.did)
- {
- case PRISM_DID_NOISE:
- if (PRISM_STATUS_OK == pv.status)
- {
- ri->ri_noise = pv.data;
- /* got_noise = 1; */
- }
- break;
-
- case PRISM_DID_RATE:
- if (PRISM_STATUS_OK == pv.status)
- ri->ri_rate = pv.data * 500000;
- break;
-
- case PRISM_DID_CHANNEL:
- if (PRISM_STATUS_OK == pv.status)
- {
- ri->ri_channel = pv.data;
- got_channel = 1;
- }
- break;
-
- case PRISM_DID_MACTIME:
- if (PRISM_STATUS_OK == pv.status)
- ri->ri_mactime = pv.data;
- break;
-
- case PRISM_DID_SIGNAL:
- if (PRISM_STATUS_OK == pv.status)
- {
- ri->ri_power = pv.data;
- /* got_signal = 1; */
- }
- break;
- }
- }
- }
- if ((n < 8) || (n >= caplen))
- return 0; /* invalid format */
- }
- break;
-
- case ARPHRD_IEEE80211_FULL:
- {
- struct Ieee80211RadiotapHeaderIterator iterator;
- struct Ieee80211RadiotapHeader *rthdr;
-
- memset (&iterator, 0, sizeof(iterator));
- rthdr = (struct Ieee80211RadiotapHeader *) tmpbuf;
- n = GNUNET_le16toh (rthdr->it_len);
- if ((n < sizeof(struct Ieee80211RadiotapHeader)) || (n >= caplen))
- return 0; /* invalid 'it_len' */
- if (0 != ieee80211_radiotap_iterator_init (&iterator, rthdr, caplen))
- return 0;
- /* go through the radiotap arguments we have been given by the driver */
- while (0 <= ieee80211_radiotap_iterator_next (&iterator))
- {
- switch (iterator.this_arg_index)
- {
- case IEEE80211_RADIOTAP_TSFT:
- ri->ri_mactime = GNUNET_le64toh (*((uint64_t *) iterator.this_arg));
- break;
-
- case IEEE80211_RADIOTAP_DBM_ANTSIGNAL:
- if (! got_signal)
- {
- ri->ri_power = *((int8_t *) iterator.this_arg);
- got_signal = 1;
- }
- break;
-
- case IEEE80211_RADIOTAP_DB_ANTSIGNAL:
- if (! got_signal)
- {
- ri->ri_power = *((int8_t *) iterator.this_arg);
- got_signal = 1;
- }
- break;
-
- case IEEE80211_RADIOTAP_DBM_ANTNOISE:
- if (! got_noise)
- {
- ri->ri_noise = *((int8_t *) iterator.this_arg);
- got_noise = 1;
- }
- break;
-
- case IEEE80211_RADIOTAP_DB_ANTNOISE:
- if (! got_noise)
- {
- ri->ri_noise = *((int8_t *) iterator.this_arg);
- got_noise = 1;
- }
- break;
-
- case IEEE80211_RADIOTAP_ANTENNA:
- ri->ri_antenna = *iterator.this_arg;
- break;
-
- case IEEE80211_RADIOTAP_CHANNEL:
- ri->ri_channel = *iterator.this_arg;
- got_channel = 1;
- break;
-
- case IEEE80211_RADIOTAP_RATE:
- ri->ri_rate = (*iterator.this_arg) * 500000;
- break;
-
- case IEEE80211_RADIOTAP_FLAGS:
- {
- uint8_t flags = *iterator.this_arg;
- /* is the CRC visible at the end? if so, remove */
- if (0 != (flags & IEEE80211_RADIOTAP_F_FCS))
- {
- fcs_removed = 1;
- caplen -= sizeof(uint32_t);
- }
- break;
- }
-
- case IEEE80211_RADIOTAP_RX_FLAGS:
- {
- uint16_t flags = ntohs (*((uint16_t *) iterator.this_arg));
- if (0 != (flags & IEEE80211_RADIOTAP_F_RX_BADFCS))
- return 0;
- }
- break;
- } /* end of 'switch' */
- } /* end of the 'while' loop */
- }
- break;
-
- case ARPHRD_IEEE80211:
- n = 0; /* no header */
- break;
-
- case ARPHRD_ETHER:
- {
- if (sizeof(struct GNUNET_TRANSPORT_WLAN_Ieee8023Frame) > caplen)
- return 0; /* invalid */
- GNUNET_memcpy (&buf[sizeof(struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame)],
- tmpbuf + sizeof(struct
- GNUNET_TRANSPORT_WLAN_Ieee8023Frame),
- caplen - sizeof(struct
- GNUNET_TRANSPORT_WLAN_Ieee8023Frame)
- - 4 /* 4 byte FCS */);
- return caplen - sizeof(struct GNUNET_TRANSPORT_WLAN_Ieee8023Frame) - 4;
- }
-
- default:
- errno = ENOTSUP; /* unsupported format */
- return -1;
- }
- caplen -= n;
- if (! got_channel)
- ri->ri_channel = linux_get_channel (dev);
-
- /* detect CRC32 at the end, even if the flag wasn't set and remove it */
- if ((0 == fcs_removed) &&
- (0 == check_crc_buf_osdep (tmpbuf + n, caplen - sizeof(uint32_t))))
- {
- /* NOTE: this heuristic can of course fail if there happens to
- be a matching checksum at the end. Would be good to have
- some data to see how often this heuristic actually works. */
- caplen -= sizeof(uint32_t);
- }
- /* copy payload to target buffer */
- GNUNET_memcpy (buf, tmpbuf + n, caplen);
- return caplen;
-}
-
-
-/* ************end of code for reading packets from kernel ************** */
-
-/* ************other helper functions for main start here ************** */
-
-
-/**
- * Open the wireless network interface for reading/writing.
- *
- * @param dev pointer to the device struct
- * @return 0 on success
- */
-static int
-open_device_raw (struct HardwareInfos *dev)
-{
- struct ifreq ifr;
- struct iwreq wrq;
- struct packet_mreq mr;
- struct sockaddr_ll sll;
-
- /* find the interface index */
- memset (&ifr, 0, sizeof(ifr));
- strncpy (ifr.ifr_name, dev->iface, IFNAMSIZ);
- if (-1 == ioctl (dev->fd_raw, SIOCGIFINDEX, &ifr))
- {
- fprintf (stderr, "ioctl(SIOCGIFINDEX) on interface `%.*s' failed: %s\n",
- IFNAMSIZ, dev->iface, strerror (errno));
- return 1;
- }
-
- /* lookup the hardware type */
- memset (&sll, 0, sizeof(sll));
- sll.sll_family = AF_PACKET;
- sll.sll_ifindex = ifr.ifr_ifindex;
- sll.sll_protocol = htons (ETH_P_ALL);
- if (-1 == ioctl (dev->fd_raw, SIOCGIFHWADDR, &ifr))
- {
- fprintf (stderr, "ioctl(SIOCGIFHWADDR) on interface `%.*s' failed: %s\n",
- IFNAMSIZ, dev->iface, strerror (errno));
- return 1;
- }
- if (((ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211) &&
- (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) &&
- (ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_PRISM) &&
- (ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_FULL)))
- {
- fprintf (stderr,
- "Error: interface `%.*s' is not using a supported hardware
address family (got %d)\n",
- IFNAMSIZ, dev->iface,
- ifr.ifr_hwaddr.sa_family);
- return 1;
- }
-
- /* lookup iw mode */
- memset (&wrq, 0, sizeof(struct iwreq));
- strncpy (wrq.ifr_name, dev->iface, IFNAMSIZ);
- if (-1 == ioctl (dev->fd_raw, SIOCGIWMODE, &wrq))
- {
- /* most probably not supported (ie for rtap ipw interface) *
- * so just assume its correctly set... */
- wrq.u.mode = IW_MODE_MONITOR;
- }
-
- if ((wrq.u.mode != IW_MODE_MONITOR) &&
- (wrq.u.mode != IW_MODE_ADHOC))
- {
- fprintf (stderr,
- "Error: interface `%.*s' is not in monitor or ad-hoc mode (got
%d)\n",
- IFNAMSIZ, dev->iface,
- wrq.u.mode);
- return 1;
- }
-
- /* Is interface st to up, broadcast & running ? */
- if ((ifr.ifr_flags | IFF_UP | IFF_BROADCAST | IFF_RUNNING) != ifr.ifr_flags)
- {
- /* Bring interface up */
- ifr.ifr_flags |= IFF_UP | IFF_BROADCAST | IFF_RUNNING;
-
- if (-1 == ioctl (dev->fd_raw, SIOCSIFFLAGS, &ifr))
- {
- fprintf (stderr, "ioctl(SIOCSIFFLAGS) on interface `%.*s' failed: %s\n",
- IFNAMSIZ, dev->iface, strerror (errno));
- return 1;
- }
- }
-
- /* bind the raw socket to the interface */
- if (-1 == bind (dev->fd_raw, (struct sockaddr *) &sll, sizeof(sll)))
- {
- fprintf (stderr, "Failed to bind interface `%.*s': %s\n", IFNAMSIZ,
- dev->iface, strerror (errno));
- return 1;
- }
-
- /* lookup the hardware type */
- if (-1 == ioctl (dev->fd_raw, SIOCGIFHWADDR, &ifr))
- {
- fprintf (stderr, "ioctl(SIOCGIFHWADDR) on interface `%.*s' failed: %s\n",
- IFNAMSIZ, dev->iface, strerror (errno));
- return 1;
- }
-
- GNUNET_memcpy (&dev->pl_mac, ifr.ifr_hwaddr.sa_data, MAC_ADDR_SIZE);
- dev->arptype_in = ifr.ifr_hwaddr.sa_family;
- if ((ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) &&
- (ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211) &&
- (ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_PRISM) &&
- (ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_FULL))
- {
- fprintf (stderr, "Unsupported hardware link type %d on interface `%.*s'\n",
- ifr.ifr_hwaddr.sa_family, IFNAMSIZ, dev->iface);
- return 1;
- }
-
- /* enable promiscuous mode */
- memset (&mr, 0, sizeof(mr));
- mr.mr_ifindex = sll.sll_ifindex;
- mr.mr_type = PACKET_MR_PROMISC;
- if (0 !=
- setsockopt (dev->fd_raw, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr,
- sizeof(mr)))
- {
- fprintf (stderr,
- "Failed to enable promiscuous mode on interface `%.*s'\n",
- IFNAMSIZ,
- dev->iface);
- return 1;
- }
- return 0;
-}
-
-
-/**
- * Test if the given interface name really corresponds to a wireless
- * device.
- *
- * @param iface name of the interface
- * @return 0 on success, 1 on error
- */
-static int
-test_wlan_interface (const char *iface)
-{
- char strbuf[512];
- struct stat sbuf;
- int ret;
-
- ret = snprintf (strbuf, sizeof(strbuf),
- "/sys/class/net/%s/phy80211/subsystem",
- iface);
- if ((ret < 0) || (ret >= sizeof(strbuf)) || (0 != stat (strbuf, &sbuf)))
- {
- fprintf (stderr,
- "Did not find 802.11 interface `%s'. Exiting.\n",
- iface);
- exit (1);
- }
- return 0;
-}
-
-
-/**
- * Test incoming packets mac for being our own.
- *
- * @param taIeeeHeader buffer of the packet
- * @param dev the Hardware_Infos struct
- * @return 0 if mac belongs to us, 1 if mac is for another target
- */
-static int
-mac_test (const struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *taIeeeHeader,
- const struct HardwareInfos *dev)
-{
- static struct GNUNET_TRANSPORT_WLAN_MacAddress all_zeros;
-
- if ((0 == memcmp (&taIeeeHeader->addr3, &all_zeros, MAC_ADDR_SIZE)) ||
- (0 == memcmp (&taIeeeHeader->addr1, &all_zeros, MAC_ADDR_SIZE)))
- return 0; /* some drivers set no Macs, then assume it is all for us! */
-
- if (0 != memcmp (&taIeeeHeader->addr3, &mac_bssid_gnunet, MAC_ADDR_SIZE))
- return 1; /* not a GNUnet ad-hoc package */
- if ((0 == memcmp (&taIeeeHeader->addr1, &dev->pl_mac, MAC_ADDR_SIZE)) ||
- (0 == memcmp (&taIeeeHeader->addr1, &bc_all_mac, MAC_ADDR_SIZE)))
- return 0; /* for us, or broadcast */
- return 1; /* not for us */
-}
-
-
-/**
- * Set the wlan header to sane values to make attacks more difficult
- *
- * @param taIeeeHeader pointer to the header of the packet
- * @param dev pointer to the Hardware_Infos struct
- */
-static void
-mac_set (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *taIeeeHeader,
- const struct HardwareInfos *dev)
-{
- taIeeeHeader->frame_control = htons (IEEE80211_FC0_TYPE_DATA);
- taIeeeHeader->addr2 = dev->pl_mac;
- taIeeeHeader->addr3 = mac_bssid_gnunet;
-}
-
-
-/**
- * Process data from the stdin. Takes the message, prepends the
- * radiotap transmission header, forces the sender MAC to be correct
- * and puts it into our buffer for transmission to the kernel.
- *
- * @param cls pointer to the device struct ('struct HardwareInfos*')
- * @param hdr pointer to the start of the packet
- */
-static void
-stdin_send_hw (void *cls, const struct GNUNET_MessageHeader *hdr)
-{
- struct HardwareInfos *dev = cls;
- const struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *header;
- struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *wlanheader;
- size_t sendsize;
- struct RadiotapTransmissionHeader rtheader;
- struct GNUNET_TRANSPORT_WLAN_Ieee8023Frame etheader;
-
- sendsize = ntohs (hdr->size);
- if ((sendsize <
- sizeof(struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage)) ||
- (GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER != ntohs (hdr->type)))
- {
- fprintf (stderr, "Received malformed message\n");
- exit (1);
- }
- sendsize -= (sizeof(struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage)
- - sizeof(struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame));
- if (MAXLINE < sendsize)
- {
- fprintf (stderr, "Packet too big for buffer\n");
- exit (1);
- }
- header = (const struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *) hdr;
- switch (dev->arptype_in)
- {
- case ARPHRD_IEEE80211_PRISM:
- case ARPHRD_IEEE80211_FULL:
- case ARPHRD_IEEE80211:
- rtheader.header.it_version = 0;
- rtheader.header.it_pad = 0;
- rtheader.header.it_len = GNUNET_htole16 (sizeof(rtheader));
- rtheader.header.it_present = GNUNET_htole16 (
- IEEE80211_RADIOTAP_OUR_TRANSMISSION_HEADER_MASK);
- rtheader.rate = header->rate;
- rtheader.pad1 = 0;
- rtheader.txflags = GNUNET_htole16 (IEEE80211_RADIOTAP_F_TX_NOACK
- | IEEE80211_RADIOTAP_F_TX_NOSEQ);
- GNUNET_memcpy (write_pout.buf, &rtheader, sizeof(rtheader));
- GNUNET_memcpy (&write_pout.buf[sizeof(rtheader)], &header->frame,
sendsize);
- wlanheader = (struct
- GNUNET_TRANSPORT_WLAN_Ieee80211Frame *)
&write_pout.buf[sizeof(
-
rtheader)
- ];
-
- /* payload contains MAC address, but we don't trust it, so we'll
- * overwrite it with OUR MAC address to prevent mischief */
- mac_set (wlanheader, dev);
- write_pout.size = sendsize + sizeof(rtheader);
- break;
-
- case ARPHRD_ETHER:
- etheader.dst = header->frame.addr1;
- /* etheader.src = header->frame.addr2; --- untrusted input */
- etheader.src = dev->pl_mac;
- etheader.type = htons (ETH_P_IP);
- GNUNET_memcpy (write_pout.buf, ðeader, sizeof(etheader));
- GNUNET_memcpy (&write_pout.buf[sizeof(etheader)], &header[1], sendsize
- - sizeof(struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame));
- write_pout.size = sendsize - sizeof(struct
- GNUNET_TRANSPORT_WLAN_Ieee80211Frame)
- + sizeof(etheader);
- break;
-
- default:
- fprintf (stderr,
- "Unsupported ARPTYPE!\n");
- break;
- }
-}
-
-
-/**
- * Main function of the helper. This code accesses a WLAN interface
- * in monitoring mode (layer 2) and then forwards traffic in both
- * directions between the WLAN interface and stdin/stdout of this
- * process. Error messages are written to stdout.
- *
- * @param argc number of arguments, must be 2
- * @param argv arguments only argument is the name of the interface (e.g.
'mon0')
- * @return 0 on success (never happens, as we don't return unless aborted), 1
on error
- */
-int
-main (int argc, char *argv[])
-{
- struct HardwareInfos dev;
- char readbuf[MAXLINE];
- int maxfd;
- fd_set rfds;
- fd_set wfds;
- int stdin_open;
- struct MessageStreamTokenizer *stdin_mst;
- int raw_eno;
-
- /* assert privs so we can modify the firewall rules! */
- {
-#ifdef HAVE_SETRESUID
- uid_t uid = getuid ();
-
- if (0 != setresuid (uid, 0, 0))
- {
- fprintf (stderr,
- "Failed to setresuid to root: %s\n",
- strerror (errno));
- return 254;
- }
-#else
- if (0 != seteuid (0))
- {
- fprintf (stderr,
- "Failed to seteuid back to root: %s\n", strerror (errno));
- return 254;
- }
-#endif
- }
-
- /* make use of SGID capabilities on POSIX */
- memset (&dev, 0, sizeof(dev));
- dev.fd_raw = socket (PF_PACKET, SOCK_RAW, htons (ETH_P_ALL));
- raw_eno = errno; /* remember for later */
-
- /* now that we've dropped root rights, we can do error checking */
- if (2 != argc)
- {
- fprintf (stderr,
- "You must specify the name of the interface as the first and only
argument to this program.\n");
- if (-1 != dev.fd_raw)
- (void) close (dev.fd_raw);
- return 1;
- }
-
- if (-1 == dev.fd_raw)
- {
- fprintf (stderr, "Failed to create raw socket: %s\n", strerror (raw_eno));
- return 1;
- }
- if (dev.fd_raw >= FD_SETSIZE)
- {
- fprintf (stderr, "File descriptor too large for select (%d > %d)\n",
- dev.fd_raw, FD_SETSIZE);
- (void) close (dev.fd_raw);
- return 1;
- }
- if (0 != test_wlan_interface (argv[1]))
- {
- (void) close (dev.fd_raw);
- return 1;
- }
- memcpy (dev.iface, argv[1], IFNAMSIZ);
- if (0 != open_device_raw (&dev))
- {
- (void) close (dev.fd_raw);
- return 1;
- }
-
- /* drop privs */
- {
- uid_t uid = getuid ();
-#ifdef HAVE_SETRESUID
- if (0 != setresuid (uid, uid, uid))
- {
- fprintf (stderr, "Failed to setresuid: %s\n", strerror (errno));
- if (-1 != dev.fd_raw)
- (void) close (dev.fd_raw);
- return 1;
- }
-#else
- if (0 != (setuid (uid) | seteuid (uid)))
- {
- fprintf (stderr, "Failed to setuid: %s\n", strerror (errno));
- if (-1 != dev.fd_raw)
- (void) close (dev.fd_raw);
- return 1;
- }
-#endif
- }
-
-
- /* send MAC address of the WLAN interface to STDOUT first */
- {
- struct GNUNET_TRANSPORT_WLAN_HelperControlMessage macmsg;
-
- macmsg.hdr.size = htons (sizeof(macmsg));
- macmsg.hdr.type = htons (GNUNET_MESSAGE_TYPE_WLAN_HELPER_CONTROL);
- GNUNET_memcpy (&macmsg.mac, &dev.pl_mac, sizeof(struct
-
GNUNET_TRANSPORT_WLAN_MacAddress));
- GNUNET_memcpy (write_std.buf, &macmsg, sizeof(macmsg));
- write_std.size = sizeof(macmsg);
- }
-
- stdin_mst = mst_create (&stdin_send_hw, &dev);
- stdin_open = 1;
- while (1)
- {
- maxfd = -1;
- FD_ZERO (&rfds);
- if ((0 == write_pout.size) && (1 == stdin_open))
- {
- FD_SET (STDIN_FILENO, &rfds);
- maxfd = MAX (maxfd, STDIN_FILENO);
- }
- if (0 == write_std.size)
- {
- FD_SET (dev.fd_raw, &rfds);
- maxfd = MAX (maxfd, dev.fd_raw);
- }
- FD_ZERO (&wfds);
- if (0 < write_std.size)
- {
- FD_SET (STDOUT_FILENO, &wfds);
- maxfd = MAX (maxfd, STDOUT_FILENO);
- }
- if (0 < write_pout.size)
- {
- FD_SET (dev.fd_raw, &wfds);
- maxfd = MAX (maxfd, dev.fd_raw);
- }
- {
- int retval = select (maxfd + 1, &rfds, &wfds, NULL, NULL);
- if ((-1 == retval) && (EINTR == errno))
- continue;
- if (0 > retval)
- {
- fprintf (stderr, "select failed: %s\n", strerror (errno));
- break;
- }
- }
- if (FD_ISSET (STDOUT_FILENO, &wfds))
- {
- ssize_t ret =
- write (STDOUT_FILENO, write_std.buf + write_std.pos,
- write_std.size - write_std.pos);
- if (0 > ret)
- {
- fprintf (stderr, "Failed to write to STDOUT: %s\n", strerror (errno));
- break;
- }
- write_std.pos += ret;
- if (write_std.pos == write_std.size)
- {
- write_std.pos = 0;
- write_std.size = 0;
- }
- }
- if (FD_ISSET (dev.fd_raw, &wfds))
- {
- ssize_t ret =
- write (dev.fd_raw, write_pout.buf + write_pout.pos,
- write_pout.size - write_pout.pos);
- if (0 > ret)
- {
- fprintf (stderr, "Failed to write to WLAN device: %s\n",
- strerror (errno));
- break;
- }
- write_pout.pos += ret;
- if ((write_pout.pos != write_pout.size) && (0 != ret))
- {
- /* we should not get partial sends with packet-oriented devices... */
- fprintf (stderr, "Write error, partial send: %u/%u\n",
- (unsigned int) write_pout.pos,
- (unsigned int) write_pout.size);
- break;
- }
- if (write_pout.pos == write_pout.size)
- {
- write_pout.pos = 0;
- write_pout.size = 0;
- }
- }
-
- if (FD_ISSET (STDIN_FILENO, &rfds))
- {
- ssize_t ret =
- read (STDIN_FILENO, readbuf, sizeof(readbuf));
- if (0 > ret)
- {
- fprintf (stderr, "Read error from STDIN: %s\n", strerror (errno));
- break;
- }
- if (0 == ret)
- {
- /* stop reading... */
- stdin_open = 0;
- }
- mst_receive (stdin_mst, readbuf, ret);
- }
-
- if (FD_ISSET (dev.fd_raw, &rfds))
- {
- struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *rrm;
- ssize_t ret;
-
- rrm = (struct
- GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *) write_std.buf;
- ret =
- linux_read (&dev, (unsigned char *) &rrm->frame,
- sizeof(write_std.buf)
- - sizeof(struct
- GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage)
- + sizeof(struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame),
- rrm);
- if (0 > ret)
- {
- fprintf (stderr, "Read error from raw socket: %s\n", strerror (errno));
- break;
- }
- if ((0 < ret) && (0 == mac_test (&rrm->frame, &dev)))
- {
- write_std.size = ret
- + sizeof(struct
- GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage)
- - sizeof(struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame);
- rrm->header.size = htons (write_std.size);
- rrm->header.type = htons (GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER);
- }
- }
- }
- /* Error handling, try to clean up a bit at least */
- mst_destroy (stdin_mst);
- (void) close (dev.fd_raw);
- return 1; /* we never exit 'normally' */
-}
-
-
-/* end of gnunet-helper-transport-wlan.c */
diff --git a/src/transport/gnunet-service-transport.c
b/src/transport/gnunet-service-transport.c
deleted file mode 100644
index 93790e293..000000000
--- a/src/transport/gnunet-service-transport.c
+++ /dev/null
@@ -1,2778 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/gnunet-service-transport.c
- * @brief main for gnunet-service-transport
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_statistics_service.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_peerinfo_service.h"
-#include "gnunet_ats_service.h"
-#include "gnunet-service-transport.h"
-#include "gnunet-service-transport_ats.h"
-#include "gnunet-service-transport_hello.h"
-#include "gnunet-service-transport_neighbours.h"
-#include "gnunet-service-transport_plugins.h"
-#include "gnunet-service-transport_validation.h"
-#include "gnunet-service-transport_manipulation.h"
-#include "transport.h"
-
-/**
- * Size of the blacklist hash map.
- */
-#define TRANSPORT_BLACKLIST_HT_SIZE 64
-
-/**
- * How many messages can we have pending for a given client process
- * before we start to drop incoming messages? We typically should
- * have only one client and so this would be the primary buffer for
- * messages, so the number should be chosen rather generously.
- *
- * The expectation here is that most of the time the queue is large
- * enough so that a drop is virtually never required. Note that
- * this value must be about as large as 'TOTAL_MSGS' in the
- * 'test_transport_api_reliability.c', otherwise that testcase may
- * fail.
- */
-#define MAX_PENDING (128 * 1024)
-
-
-/**
- * Information we need for an asynchronous session kill.
- */
-struct GNUNET_ATS_SessionKiller
-{
- /**
- * Kept in a DLL.
- */
- struct GNUNET_ATS_SessionKiller *next;
-
- /**
- * Kept in a DLL.
- */
- struct GNUNET_ATS_SessionKiller *prev;
-
- /**
- * Session to kill.
- */
- struct GNUNET_ATS_Session *session;
-
- /**
- * Plugin for the session.
- */
- struct GNUNET_TRANSPORT_PluginFunctions *plugin;
-
- /**
- * The kill task.
- */
- struct GNUNET_SCHEDULER_Task *task;
-};
-
-
-/**
- * What type of client is the `struct TransportClient` about?
- */
-enum ClientType
-{
- /**
- * We do not know yet (client is fresh).
- */
- CT_NONE = 0,
-
- /**
- * Is the CORE service, we need to forward traffic to it.
- */
- CT_CORE = 1,
-
- /**
- * It is a monitor, forward monitor data.
- */
- CT_MONITOR = 2,
-
- /**
- * It is a blacklist, query about allowed connections.
- */
- CT_BLACKLIST = 3,
-
- /**
- * CORE client without any handlers.
- */
- CT_CORE_NO_HANDLERS = 4
-};
-
-
-/**
- * Context we use when performing a blacklist check.
- */
-struct GST_BlacklistCheck;
-
-/**
- * Client connected to the transport service.
- */
-struct TransportClient
-{
- /**
- * This is a doubly-linked list.
- */
- struct TransportClient *next;
-
- /**
- * This is a doubly-linked list.
- */
- struct TransportClient *prev;
-
- /**
- * Handle to the client.
- */
- struct GNUNET_SERVICE_Client *client;
-
- /**
- * Message queue to the client.
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * What type of client is this?
- */
- enum ClientType type;
-
- union
- {
- /**
- * Peer identity to monitor the addresses of.
- * Zero to monitor all neighbours. Valid if
- * @e type is CT_MONITOR.
- */
- struct GNUNET_PeerIdentity monitor_peer;
-
- /**
- * Additional details if @e type is CT_BLACKLIST.
- */
- struct
- {
- /**
- * Blacklist check that we're currently performing (or NULL
- * if we're performing one that has been cancelled).
- */
- struct GST_BlacklistCheck *bc;
-
- /**
- * Set to #GNUNET_YES if we're currently waiting for a reply.
- */
- int waiting_for_reply;
-
- /**
- * #GNUNET_YES if we have to call receive_done for this client
- */
- int call_receive_done;
- } blacklist;
- } details;
-};
-
-
-/**
- * Context we use when performing a blacklist check.
- */
-struct GST_BlacklistCheck
-{
- /**
- * This is a linked list.
- */
- struct GST_BlacklistCheck *next;
-
- /**
- * This is a linked list.
- */
- struct GST_BlacklistCheck *prev;
-
- /**
- * Peer being checked.
- */
- struct GNUNET_PeerIdentity peer;
-
- /**
- * Continuation to call with the result.
- */
- GST_BlacklistTestContinuation cont;
-
- /**
- * Closure for @e cont.
- */
- void *cont_cls;
-
- /**
- * Address for #GST_blacklist_abort_matching(), can be NULL.
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * Session for #GST_blacklist_abort_matching(), can be NULL.
- */
- struct GNUNET_ATS_Session *session;
-
- /**
- * Our current position in the blacklisters list.
- */
- struct TransportClient *bl_pos;
-
- /**
- * Current task performing the check.
- */
- struct GNUNET_SCHEDULER_Task *task;
-};
-
-
-/**
- * Context for address to string operations
- */
-struct AddressToStringContext
-{
- /**
- * This is a doubly-linked list.
- */
- struct AddressToStringContext *next;
-
- /**
- * This is a doubly-linked list.
- */
- struct AddressToStringContext *prev;
-
- /**
- * Client that made the request.
- */
- struct TransportClient *tc;
-};
-
-
-/**
- * Closure for #handle_send_transmit_continuation()
- */
-struct SendTransmitContinuationContext
-{
- /**
- * Client that made the request.
- */
- struct TransportClient *tc;
-
- /**
- * Peer that was the target.
- */
- struct GNUNET_PeerIdentity target;
-
- /**
- * At what time did we receive the message?
- */
- struct GNUNET_TIME_Absolute send_time;
-
- /**
- * Unique ID, for logging.
- */
- unsigned long long uuid;
-
- /**
- * Set to #GNUNET_YES if the connection for @e target goes
- * down and we thus must no longer send the
- * #GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK message.
- */
- int down;
-};
-
-
-/**
- * Head of linked list of all clients to this service.
- */
-static struct TransportClient *clients_head;
-
-/**
- * Tail of linked list of all clients to this service.
- */
-static struct TransportClient *clients_tail;
-
-/**
- * Map of peer identities to active send transmit continuation
- * contexts. Used to flag contexts as 'dead' when a connection goes
- * down. Values are of type `struct SendTransmitContinuationContext
- * *`.
- */
-static struct GNUNET_CONTAINER_MultiPeerMap *active_stccs;
-
-/**
- * Head of linked list of all pending address iterations
- */
-static struct AddressToStringContext *a2s_head;
-
-/**
- * Tail of linked list of all pending address iterations
- */
-static struct AddressToStringContext *a2s_tail;
-
-/**
- * Head of DLL of active blacklisting queries.
- */
-static struct GST_BlacklistCheck *bc_head;
-
-/**
- * Tail of DLL of active blacklisting queries.
- */
-static struct GST_BlacklistCheck *bc_tail;
-
-/**
- * Hashmap of blacklisted peers. Values are of type 'char *' (transport
names),
- * can be NULL if we have no static blacklist.
- */
-static struct GNUNET_CONTAINER_MultiPeerMap *blacklist;
-
-/**
- * Notification context, to send updates on changes to active plugin
- * connections.
- */
-static struct GNUNET_NotificationContext *plugin_nc;
-
-/**
- * Plugin monitoring client we are currently syncing, NULL if all
- * monitoring clients are in sync.
- */
-static struct TransportClient *sync_client;
-
-/**
- * Peer identity that is all zeros, used as a way to indicate
- * "all peers". Used for comparisons.
- */
-static struct GNUNET_PeerIdentity all_zeros;
-
-/**
- * Statistics handle.
- */
-struct GNUNET_STATISTICS_Handle *GST_stats;
-
-/**
- * Configuration handle.
- */
-const struct GNUNET_CONFIGURATION_Handle *GST_cfg;
-
-/**
- * Configuration handle.
- */
-struct GNUNET_PeerIdentity GST_my_identity;
-
-/**
- * Handle to peerinfo service.
- */
-struct GNUNET_PEERINFO_Handle *GST_peerinfo;
-
-/**
- * Our private key.
- */
-struct GNUNET_CRYPTO_EddsaPrivateKey GST_my_private_key;
-
-/**
- * ATS scheduling handle.
- */
-struct GNUNET_ATS_SchedulingHandle *GST_ats;
-
-/**
- * ATS connectivity handle.
- */
-struct GNUNET_ATS_ConnectivityHandle *GST_ats_connect;
-
-/**
- * Hello address expiration
- */
-struct GNUNET_TIME_Relative hello_expiration;
-
-/**
- * Head of DLL of asynchronous tasks to kill sessions.
- */
-static struct GNUNET_ATS_SessionKiller *sk_head;
-
-/**
- * Tail of DLL of asynchronous tasks to kill sessions.
- */
-static struct GNUNET_ATS_SessionKiller *sk_tail;
-
-/**
- * Interface scanner determines our LAN address range(s).
- */
-struct GNUNET_NT_InterfaceScanner *GST_is;
-
-/**
- * Queue the given message for transmission to the given client
- *
- * @param tc target of the message
- * @param msg message to transmit
- * @param may_drop #GNUNET_YES if the message can be dropped
- */
-static void
-unicast (struct TransportClient *tc,
- const struct GNUNET_MessageHeader *msg,
- int may_drop)
-{
- struct GNUNET_MQ_Envelope *env;
-
- if ((GNUNET_MQ_get_length (tc->mq) >= MAX_PENDING) &&
- (GNUNET_YES == may_drop))
- {
- GNUNET_log (
- GNUNET_ERROR_TYPE_DEBUG,
- "Dropping message of type %u and size %u, have %u/%u messages pending\n",
- ntohs (msg->type),
- ntohs (msg->size),
- GNUNET_MQ_get_length (tc->mq),
- MAX_PENDING);
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# messages dropped due to slow client"),
- 1,
- GNUNET_NO);
- return;
- }
- env = GNUNET_MQ_msg_copy (msg);
- GNUNET_MQ_send (tc->mq, env);
-}
-
-
-/**
- * Called whenever a client connects. Allocates our
- * data structures associated with that client.
- *
- * @param cls closure, NULL
- * @param client identification of the client
- * @param mq message queue for the client
- * @return our `struct TransportClient`
- */
-static void *
-client_connect_cb (void *cls,
- struct GNUNET_SERVICE_Client *client,
- struct GNUNET_MQ_Handle *mq)
-{
- struct TransportClient *tc;
-
- tc = GNUNET_new (struct TransportClient);
- tc->client = client;
- tc->mq = mq;
- GNUNET_CONTAINER_DLL_insert (clients_head, clients_tail, tc);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client %p connected\n", tc);
- return tc;
-}
-
-
-/**
- * Perform next action in the blacklist check.
- *
- * @param cls the `struct GST_BlacklistCheck *`
- */
-static void
-do_blacklist_check (void *cls);
-
-
-/**
- * Mark the peer as down so we don't call the continuation
- * context in the future.
- *
- * @param cls a `struct TransportClient`
- * @param peer a peer we are sending to
- * @param value a `struct SendTransmitContinuationContext` to mark
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-mark_match_down (void *cls, const struct GNUNET_PeerIdentity *peer, void
*value)
-{
- struct TransportClient *tc = cls;
- struct SendTransmitContinuationContext *stcc = value;
-
- if (tc == stcc->tc)
- {
- stcc->down = GNUNET_YES;
- stcc->tc = NULL;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Called whenever a client is disconnected. Frees our
- * resources associated with that client.
- *
- * @param cls closure, NULL
- * @param client identification of the client
- * @param app_ctx our `struct TransportClient`
- */
-static void
-client_disconnect_cb (void *cls,
- struct GNUNET_SERVICE_Client *client,
- void *app_ctx)
-{
- struct TransportClient *tc = app_ctx;
- struct GST_BlacklistCheck *bc;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Client %p disconnected, cleaning up.\n",
- tc);
- if (NULL != active_stccs)
- GNUNET_CONTAINER_multipeermap_iterate (active_stccs,
- &mark_match_down,
- tc);
- for (struct AddressToStringContext *cur = a2s_head; NULL != cur;
- cur = cur->next)
- {
- if (cur->tc == tc)
- cur->tc = NULL;
- }
- GNUNET_CONTAINER_DLL_remove (clients_head, clients_tail, tc);
- switch (tc->type)
- {
- case CT_NONE:
- break;
-
- case CT_CORE:
- break;
-
- case CT_MONITOR:
- break;
-
- case CT_BLACKLIST:
- for (bc = bc_head; NULL != bc; bc = bc->next)
- {
- if (bc->bl_pos != tc)
- continue;
- bc->bl_pos = tc->next;
- if (NULL == bc->task)
- bc->task = GNUNET_SCHEDULER_add_now (&do_blacklist_check, bc);
- }
- break;
-
- case CT_CORE_NO_HANDLERS:
- break;
- }
- GNUNET_free (tc);
-}
-
-
-/**
- * Function called for each of our connected neighbours. Notify the
- * client about the existing neighbour.
- *
- * @param cls the `struct TransportClient *` to notify
- * @param peer identity of the neighbour
- * @param address the address
- * @param state the current state of the peer
- * @param state_timeout the time out for the state
- * @param bandwidth_in inbound bandwidth in NBO
- * @param bandwidth_out outbound bandwidth in NBO
- */
-static void
-notify_client_about_neighbour (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Address *address,
- enum GNUNET_TRANSPORT_PeerState state,
- struct GNUNET_TIME_Absolute state_timeout,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
- struct GNUNET_BANDWIDTH_Value32NBO
bandwidth_out)
-{
- struct TransportClient *tc = cls;
- struct ConnectInfoMessage cim;
-
- if (GNUNET_NO == GST_neighbours_test_connected (peer))
- return;
- cim.header.size = htons (sizeof(struct ConnectInfoMessage));
- cim.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_CONNECT);
- cim.id = *peer;
- cim.quota_out = bandwidth_out;
- unicast (tc, &cim.header, GNUNET_NO);
-}
-
-
-/**
- * Initialize a normal client. We got a start message from this
- * client, add it to the list of clients for broadcasting of inbound
- * messages.
- *
- * @param cls the client
- * @param start the start message that was sent
- */
-static void
-handle_client_start (void *cls, const struct StartMessage *start)
-{
- struct TransportClient *tc = cls;
- const struct GNUNET_MessageHeader *hello;
- uint32_t options;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client %p sent START\n", tc);
- options = ntohl (start->options);
- if ((0 != (1 & options)) &&
- (0 != memcmp (&start->self,
- &GST_my_identity,
- sizeof(struct GNUNET_PeerIdentity))))
- {
- /* client thinks this is a different peer, reject */
- GNUNET_break (0);
- GNUNET_SERVICE_client_drop (tc->client);
- return;
- }
- if (CT_NONE != tc->type)
- {
- GNUNET_break (0);
- GNUNET_SERVICE_client_drop (tc->client);
- return;
- }
- if (0 != (2 & options))
- tc->type = CT_CORE;
- else
- tc->type = CT_CORE_NO_HANDLERS;
- hello = GST_hello_get ();
- if (NULL != hello)
- unicast (tc, hello, GNUNET_NO);
- GST_neighbours_iterate (¬ify_client_about_neighbour, tc);
- GNUNET_SERVICE_client_continue (tc->client);
-}
-
-
-/**
- * Client sent us a HELLO. Check the request.
- *
- * @param cls the client
- * @param message the HELLO message
- */
-static int
-check_client_hello (void *cls, const struct GNUNET_MessageHeader *message)
-{
- return GNUNET_OK; /* FIXME: check here? */
-}
-
-
-/**
- * Client sent us a HELLO. Process the request.
- *
- * @param cls the client
- * @param message the HELLO message
- */
-static void
-handle_client_hello (void *cls, const struct GNUNET_MessageHeader *message)
-{
- struct TransportClient *tc = cls;
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Received HELLO message\n");
- GST_validation_handle_hello (message);
- GNUNET_SERVICE_client_continue (tc->client);
-}
-
-
-/**
- * Function called after the transmission is done. Notify the client that it
is
- * OK to send the next message.
- *
- * @param cls closure
- * @param success #GNUNET_OK on success, #GNUNET_NO on failure, #GNUNET_SYSERR
if we're not connected
- * @param bytes_payload bytes payload sent
- * @param bytes_on_wire bytes sent on wire
- */
-static void
-handle_send_transmit_continuation (void *cls,
- int success,
- size_t bytes_payload,
- size_t bytes_on_wire)
-{
- struct SendTransmitContinuationContext *stcc = cls;
- struct SendOkMessage send_ok_msg;
-#ifdef ENABLE_TTD
- struct GNUNET_TIME_Relative delay;
- const struct GNUNET_HELLO_Address *addr;
-
- delay = GNUNET_TIME_absolute_get_duration (stcc->send_time);
- addr = GST_neighbour_get_current_address (&stcc->target);
-
- if (delay.rel_value_us > GNUNET_CONSTANTS_LATENCY_WARN.rel_value_us)
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "It took us %s to send %u/%u bytes to %s (%d, %s)\n",
- GNUNET_STRINGS_relative_time_to_string (delay, GNUNET_YES),
- (unsigned int) bytes_payload,
- (unsigned int) bytes_on_wire,
- GNUNET_i2s (&stcc->target),
- success,
- (NULL != addr) ? addr->transport_name : "%");
- else
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "It took us %s to send %u/%u bytes to %s (%d, %s)\n",
- GNUNET_STRINGS_relative_time_to_string (delay, GNUNET_YES),
- (unsigned int) bytes_payload,
- (unsigned int) bytes_on_wire,
- GNUNET_i2s (&stcc->target),
- success,
- (NULL != addr) ? addr->transport_name : "%");
-#endif
-
- if (GNUNET_NO == stcc->down)
- {
- /* Only send confirmation if we are still connected */
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Sending SEND_OK for transmission request %llu\n",
- stcc->uuid);
- send_ok_msg.header.size = htons (sizeof(send_ok_msg));
- send_ok_msg.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK);
- send_ok_msg.bytes_msg = htons (bytes_payload);
- send_ok_msg.bytes_physical = htonl (bytes_on_wire);
- send_ok_msg.success = htons (success);
- send_ok_msg.peer = stcc->target;
- unicast (stcc->tc, &send_ok_msg.header, GNUNET_NO);
- }
- GNUNET_assert (
- GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_remove (active_stccs, &stcc->target, stcc));
- GNUNET_free (stcc);
-}
-
-
-/**
- * Client asked for transmission to a peer. Process the request.
- *
- * @param cls the client
- * @param obm the send message that was sent
- */
-static int
-check_client_send (void *cls, const struct OutboundMessage *obm)
-{
- uint16_t size;
- const struct GNUNET_MessageHeader *obmm;
-
- size = ntohs (obm->header.size) - sizeof(struct OutboundMessage);
- if (size < sizeof(struct GNUNET_MessageHeader))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- obmm = (const struct GNUNET_MessageHeader *) &obm[1];
- if (size != ntohs (obmm->size))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Client asked for transmission to a peer. Process the request.
- *
- * @param cls the client
- * @param obm the send message that was sent
- */
-static void
-handle_client_send (void *cls, const struct OutboundMessage *obm)
-{
- static unsigned long long uuid_gen;
- struct TransportClient *tc = cls;
- const struct GNUNET_MessageHeader *obmm;
- struct SendTransmitContinuationContext *stcc;
-
- obmm = (const struct GNUNET_MessageHeader *) &obm[1];
- if (GNUNET_NO == GST_neighbours_test_connected (&obm->peer))
- {
- /* not connected, not allowed to send; can happen due to asynchronous
operations */
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Could not send message to peer `%s': not connected\n",
- GNUNET_i2s (&obm->peer));
- GNUNET_STATISTICS_update (
- GST_stats,
- gettext_noop ("# bytes payload dropped (other peer was not connected)"),
- ntohs (obmm->size),
- GNUNET_NO);
- GNUNET_SERVICE_client_continue (tc->client);
- return;
- }
- GNUNET_log (
- GNUNET_ERROR_TYPE_DEBUG,
- "Received SEND request %llu for `%s' and first message of type %u and
total size %u\n",
- uuid_gen,
- GNUNET_i2s (&obm->peer),
- ntohs (obmm->type),
- ntohs (obmm->size));
- GNUNET_SERVICE_client_continue (tc->client);
-
- stcc = GNUNET_new (struct SendTransmitContinuationContext);
- stcc->target = obm->peer;
- stcc->tc = tc;
- stcc->send_time = GNUNET_TIME_absolute_get ();
- stcc->uuid = uuid_gen++;
- (void) GNUNET_CONTAINER_multipeermap_put (
- active_stccs,
- &stcc->target,
- stcc,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
- GST_manipulation_send (&obm->peer,
- obmm,
- ntohs (obmm->size),
- GNUNET_TIME_relative_ntoh (obm->timeout),
- &handle_send_transmit_continuation,
- stcc);
-}
-
-
-/**
- * Take the given address and append it to the set of results sent back to
- * the client. This function may be called several times for a single
- * conversion. The last invocation will be with a @a address of
- * NULL and a @a res of #GNUNET_OK. Thus, to indicate conversion
- * errors, the callback might be called first with @a address NULL and
- * @a res being #GNUNET_SYSERR. In that case, there will still be a
- * subsequent call later with @a address NULL and @a res #GNUNET_OK.
- *
- * @param cls the `struct AddressToStringContext`
- * @param buf text to transmit (contains the human-readable address, or NULL)
- * @param res #GNUNET_OK if conversion was successful, #GNUNET_SYSERR on error,
- * never #GNUNET_NO
- */
-static void
-transmit_address_to_client (void *cls, const char *buf, int res)
-{
- struct AddressToStringContext *actx = cls;
- struct GNUNET_MQ_Envelope *env;
- struct AddressToStringResultMessage *atsm;
- size_t slen;
-
- GNUNET_assert ((GNUNET_OK == res) || (GNUNET_SYSERR == res));
- if (NULL == actx->tc)
- return;
- if (NULL == buf)
- {
- env = GNUNET_MQ_msg (atsm,
-
GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING_REPLY);
- if (GNUNET_OK == res)
- {
- /* this was the last call, transmit */
- atsm->res = htonl (GNUNET_OK);
- atsm->addr_len = htonl (0);
- GNUNET_MQ_send (actx->tc->mq, env);
- GNUNET_CONTAINER_DLL_remove (a2s_head, a2s_tail, actx);
- GNUNET_free (actx);
- return;
- }
- if (GNUNET_SYSERR == res)
- {
- /* address conversion failed, but there will be more callbacks */
- atsm->res = htonl (GNUNET_SYSERR);
- atsm->addr_len = htonl (0);
- GNUNET_MQ_send (actx->tc->mq, env);
- return;
- }
- }
- GNUNET_assert (GNUNET_OK == res);
- /* successful conversion, append*/
- slen = strlen (buf) + 1;
- env =
- GNUNET_MQ_msg_extra (atsm,
- slen,
-
GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING_REPLY);
- atsm->res = htonl (GNUNET_YES);
- atsm->addr_len = htonl (slen);
- GNUNET_memcpy (&atsm[1], buf, slen);
- GNUNET_MQ_send (actx->tc->mq, env);
-}
-
-
-/**
- * Client asked to resolve an address. Check the request.
- *
- * @param cls the client
- * @param alum the resolution request
- * @return #GNUNET_OK if @a alum is well-formed
- */
-static int
-check_client_address_to_string (void *cls,
- const struct AddressLookupMessage *alum)
-{
- const char *plugin_name;
- const char *address;
- uint32_t address_len;
- uint16_t size;
-
- size = ntohs (alum->header.size);
- address_len = ntohs (alum->addrlen);
- if (size <= sizeof(struct AddressLookupMessage) + address_len)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- address = (const char *) &alum[1];
- plugin_name = (const char *) &address[address_len];
- if ('\0' != plugin_name[size - sizeof(struct AddressLookupMessage)
- - address_len - 1])
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Client asked to resolve an address. Process the request.
- *
- * @param cls the client
- * @param alum the resolution request
- */
-static void
-handle_client_address_to_string (void *cls,
- const struct AddressLookupMessage *alum)
-{
- struct TransportClient *tc = cls;
- struct GNUNET_TRANSPORT_PluginFunctions *papi;
- const char *plugin_name;
- const char *address;
- uint32_t address_len;
- struct AddressToStringContext *actx;
- struct GNUNET_MQ_Envelope *env;
- struct AddressToStringResultMessage *atsm;
- struct GNUNET_TIME_Relative rtimeout;
- int32_t numeric;
-
- address_len = ntohs (alum->addrlen);
- address = (const char *) &alum[1];
- plugin_name = (const char *) &address[address_len];
- rtimeout = GNUNET_TIME_relative_ntoh (alum->timeout);
- numeric = ntohs (alum->numeric_only);
- papi = GST_plugins_printer_find (plugin_name);
- if (NULL == papi)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Failed to find plugin `%s'\n",
- plugin_name);
- env = GNUNET_MQ_msg (atsm,
-
GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING_REPLY);
- atsm->res = htonl (GNUNET_SYSERR);
- atsm->addr_len = htonl (0);
- GNUNET_MQ_send (tc->mq, env);
- env = GNUNET_MQ_msg (atsm,
-
GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING_REPLY);
- atsm->res = htonl (GNUNET_OK);
- atsm->addr_len = htonl (0);
- GNUNET_MQ_send (tc->mq, env);
- return;
- }
- actx = GNUNET_new (struct AddressToStringContext);
- actx->tc = tc;
- GNUNET_CONTAINER_DLL_insert (a2s_head, a2s_tail, actx);
- GNUNET_SERVICE_client_disable_continue_warning (tc->client);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Pretty-printing address of %u bytes using plugin `%s'\n",
- address_len,
- plugin_name);
- papi->address_pretty_printer (papi->cls,
- plugin_name,
- address,
- address_len,
- numeric,
- rtimeout,
- &transmit_address_to_client,
- actx);
-}
-
-
-/**
- * Compose #PeerIterateResponseMessage using the given peer and address.
- *
- * @param peer identity of the peer
- * @param address the address, NULL on disconnect
- * @return composed message
- */
-static struct PeerIterateResponseMessage *
-compose_address_iterate_response_message (
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Address *address)
-{
- struct PeerIterateResponseMessage *msg;
- size_t size;
- size_t tlen;
- size_t alen;
- char *addr;
-
- GNUNET_assert (NULL != peer);
- if (NULL != address)
- {
- tlen = strlen (address->transport_name) + 1;
- alen = address->address_length;
- }
- else
- {
- tlen = 0;
- alen = 0;
- }
- size = (sizeof(struct PeerIterateResponseMessage) + alen + tlen);
- msg = GNUNET_malloc (size);
- msg->header.size = htons (size);
- msg->header.type =
- htons (GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PEER_RESPONSE);
- msg->reserved = htonl (0);
- msg->peer = *peer;
- msg->addrlen = htonl (alen);
- msg->pluginlen = htonl (tlen);
-
- if (NULL != address)
- {
- msg->local_address_info = htonl ((uint32_t) address->local_info);
- addr = (char *) &msg[1];
- GNUNET_memcpy (addr, address->address, alen);
- GNUNET_memcpy (&addr[alen], address->transport_name, tlen);
- }
- return msg;
-}
-
-
-/**
- * Context for #send_validation_information() and
- * #send_peer_information().
- */
-struct IterationContext
-{
- /**
- * Context to use for the transmission.
- */
- struct TransportClient *tc;
-
- /**
- * Which peers do we care about?
- */
- struct GNUNET_PeerIdentity id;
-
- /**
- * #GNUNET_YES if @e id should be ignored because we want all peers.
- */
- int all;
-};
-
-
-/**
- * Output information of neighbours to the given client.
- *
- * @param cls the `struct PeerIterationContext *`
- * @param peer identity of the neighbour
- * @param address the address
- * @param state current state this peer is in
- * @param state_timeout timeout for the current state of the peer
- * @param bandwidth_in inbound quota in NBO
- * @param bandwidth_out outbound quota in NBO
- */
-static void
-send_peer_information (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Address *address,
- enum GNUNET_TRANSPORT_PeerState state,
- struct GNUNET_TIME_Absolute state_timeout,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out)
-{
- struct IterationContext *pc = cls;
- struct GNUNET_MQ_Envelope *env;
- struct PeerIterateResponseMessage *msg;
-
- if ((GNUNET_YES != pc->all) && (0 != memcmp (peer, &pc->id, sizeof(pc->id))))
- return;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Sending information about `%s' using address `%s' in state
`%s'\n",
- GNUNET_i2s (peer),
- (NULL != address) ? GST_plugins_a2s (address) : "<none>",
- GNUNET_TRANSPORT_ps2s (state));
- msg = compose_address_iterate_response_message (peer, address);
- msg->state = htonl (state);
- msg->state_timeout = GNUNET_TIME_absolute_hton (state_timeout);
- env = GNUNET_MQ_msg_copy (&msg->header);
- GNUNET_free (msg);
- GNUNET_MQ_send (pc->tc->mq, env);
-}
-
-
-/**
- * Client asked to obtain information about a specific or all peers
- * Process the request.
- *
- * @param cls the client
- * @param msg the peer address information request
- */
-static void
-handle_client_monitor_peers (void *cls, const struct PeerMonitorMessage *msg)
-{
- struct TransportClient *tc = cls;
- struct IterationContext pc;
-
- if (CT_NONE != tc->type)
- {
- GNUNET_break (0);
- GNUNET_SERVICE_client_drop (tc->client);
- return;
- }
- GNUNET_SERVICE_client_disable_continue_warning (tc->client);
- GNUNET_SERVICE_client_mark_monitor (tc->client);
-
- /* Send initial list */
- pc.tc = tc;
- if (0 == memcmp (&msg->peer, &all_zeros, sizeof(struct GNUNET_PeerIdentity)))
- {
- /* iterate over all neighbours */
- pc.all = GNUNET_YES;
- pc.id = msg->peer;
- }
- else
- {
- /* just return one neighbour */
- pc.all = GNUNET_NO;
- pc.id = msg->peer;
- }
- GST_neighbours_iterate (&send_peer_information, &pc);
-
- if (GNUNET_YES != ntohl (msg->one_shot))
- {
- tc->details.monitor_peer = msg->peer;
- tc->type = CT_MONITOR;
- if (0 !=
- memcmp (&msg->peer, &all_zeros, sizeof(struct GNUNET_PeerIdentity)))
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Client %p started monitoring of the peer `%s'\n",
- tc,
- GNUNET_i2s (&msg->peer));
- else
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Client %p started monitoring all peers\n",
- tc);
- }
- else
- {
- struct GNUNET_MessageHeader *msg;
- struct GNUNET_MQ_Envelope *env;
-
- env =
- GNUNET_MQ_msg (msg,
- GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PEER_RESPONSE_END);
- GNUNET_MQ_send (tc->mq, env);
- }
-}
-
-
-/**
- * Function called by the plugin with information about the
- * current sessions managed by the plugin (for monitoring).
- *
- * @param cls closure
- * @param session session handle this information is about,
- * NULL to indicate that we are "in sync" (initial
- * iteration complete)
- * @param info information about the state of the session,
- * NULL if @a session is also NULL and we are
- * merely signalling that the initial iteration is over
- */
-static void
-plugin_session_info_cb (void *cls,
- struct GNUNET_ATS_Session *session,
- const struct GNUNET_TRANSPORT_SessionInfo *info)
-{
- struct GNUNET_MQ_Envelope *env;
- struct TransportPluginMonitorMessage *msg;
- struct GNUNET_MessageHeader *sync;
- size_t size;
- size_t slen;
- uint16_t alen;
- char *name;
- char *addr;
-
- if (0 == GNUNET_notification_context_get_size (plugin_nc))
- {
- GST_plugins_monitor_subscribe (NULL, NULL);
- return;
- }
- if ((NULL == info) && (NULL == session))
- {
- /* end of initial iteration */
- if (NULL != sync_client)
- {
- env =
- GNUNET_MQ_msg (sync,
GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PLUGIN_SYNC);
- GNUNET_MQ_send (sync_client->mq, env);
- sync_client = NULL;
- }
- return;
- }
- GNUNET_assert (NULL != info);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Plugin event for peer %s on transport %s\n",
- GNUNET_i2s (&info->address->peer),
- info->address->transport_name);
- slen = strlen (info->address->transport_name) + 1;
- alen = info->address->address_length;
- size = sizeof(struct TransportPluginMonitorMessage) + slen + alen;
- if (size > UINT16_MAX)
- {
- GNUNET_break (0);
- return;
- }
- msg = GNUNET_malloc (size);
- msg->header.size = htons (size);
- msg->header.type = htons
(GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PLUGIN_EVENT);
- msg->session_state = htons ((uint16_t) info->state);
- msg->is_inbound = htons ((int16_t) info->is_inbound);
- msg->msgs_pending = htonl (info->num_msg_pending);
- msg->bytes_pending = htonl (info->num_bytes_pending);
- msg->timeout = GNUNET_TIME_absolute_hton (info->session_timeout);
- msg->delay = GNUNET_TIME_absolute_hton (info->receive_delay);
- msg->peer = info->address->peer;
- msg->session_id = (uint64_t) (intptr_t) session;
- msg->plugin_name_len = htons (slen);
- msg->plugin_address_len = htons (alen);
- name = (char *) &msg[1];
- GNUNET_memcpy (name, info->address->transport_name, slen);
- addr = &name[slen];
- GNUNET_memcpy (addr, info->address->address, alen);
- if (NULL != sync_client)
- {
- struct GNUNET_MQ_Envelope *env;
-
- env = GNUNET_MQ_msg_copy (&msg->header);
- GNUNET_MQ_send (sync_client->mq, env);
- }
- else
- {
- GNUNET_notification_context_broadcast (plugin_nc, &msg->header, GNUNET_NO);
- }
- GNUNET_free (msg);
-}
-
-
-/**
- * Client asked to obtain information about all plugin connections.
- *
- * @param cls the client
- * @param message the peer address information request
- */
-static void
-handle_client_monitor_plugins (void *cls,
- const struct GNUNET_MessageHeader *message)
-{
- struct TransportClient *tc = cls;
-
- GNUNET_SERVICE_client_mark_monitor (tc->client);
- GNUNET_SERVICE_client_disable_continue_warning (tc->client);
- GNUNET_notification_context_add (plugin_nc, tc->mq);
- GNUNET_assert (NULL == sync_client);
- sync_client = tc;
- GST_plugins_monitor_subscribe (&plugin_session_info_cb, NULL);
-}
-
-
-/**
- * Broadcast the given message to all of our clients.
- *
- * @param msg message to broadcast
- * @param may_drop #GNUNET_YES if the message can be dropped / is payload
- */
-void
-GST_clients_broadcast (const struct GNUNET_MessageHeader *msg, int may_drop)
-{
- int done;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Asked to broadcast message of type %u with %u bytes\n",
- (unsigned int) ntohs (msg->type),
- (unsigned int) ntohs (msg->size));
- done = GNUNET_NO;
- for (struct TransportClient *tc = clients_head; NULL != tc; tc = tc->next)
- {
- if (CT_NONE == tc->type)
- continue; /* client not yet ready */
- if ((GNUNET_YES == may_drop) && (CT_CORE != tc->type))
- continue; /* skip, this client does not care about payload */
- unicast (tc, msg, may_drop);
- done = GNUNET_YES;
- }
- if (GNUNET_NO == done)
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Message of type %u not delivered, is CORE service up?\n",
- ntohs (msg->type));
-}
-
-
-/**
- * Broadcast the new active address to all clients monitoring the peer.
- *
- * @param peer peer this update is about (never NULL)
- * @param address address, NULL on disconnect
- * @param state the current state of the peer
- * @param state_timeout the time out for the state
- */
-void
-GST_clients_broadcast_peer_notification (
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Address *address,
- enum GNUNET_TRANSPORT_PeerState state,
- struct GNUNET_TIME_Absolute state_timeout)
-{
- struct GNUNET_MQ_Envelope *env;
- struct PeerIterateResponseMessage *msg;
-
- msg = compose_address_iterate_response_message (peer, address);
- msg->state = htonl (state);
- msg->state_timeout = GNUNET_TIME_absolute_hton (state_timeout);
- for (struct TransportClient *tc = clients_head; NULL != tc; tc = tc->next)
- {
- if (CT_MONITOR != tc->type)
- continue;
- if ((0 == memcmp (&tc->details.monitor_peer,
- &all_zeros,
- sizeof(struct GNUNET_PeerIdentity))) ||
- (0 == memcmp (&tc->details.monitor_peer,
- peer,
- sizeof(struct GNUNET_PeerIdentity))))
- {
- env = GNUNET_MQ_msg_copy (&msg->header);
- GNUNET_MQ_send (tc->mq, env);
- }
- }
- GNUNET_free (msg);
-}
-
-
-/**
- * Mark the peer as down so we don't call the continuation
- * context in the future.
- *
- * @param cls NULL
- * @param peer peer that got disconnected
- * @param value a `struct SendTransmitContinuationContext` to mark
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-mark_peer_down (void *cls, const struct GNUNET_PeerIdentity *peer, void *value)
-{
- struct SendTransmitContinuationContext *stcc = value;
-
- stcc->down = GNUNET_YES;
- return GNUNET_OK;
-}
-
-
-/**
- * Notify all clients about a disconnect, and cancel
- * pending SEND_OK messages for this peer.
- *
- * @param peer peer that disconnected
- */
-void
-GST_clients_broadcast_disconnect (const struct GNUNET_PeerIdentity *peer)
-{
- struct DisconnectInfoMessage disconnect_msg;
-
- GNUNET_CONTAINER_multipeermap_get_multiple (active_stccs,
- peer,
- &mark_peer_down,
- NULL);
- disconnect_msg.header.size = htons (sizeof(struct DisconnectInfoMessage));
- disconnect_msg.header.type = htons
(GNUNET_MESSAGE_TYPE_TRANSPORT_DISCONNECT);
- disconnect_msg.reserved = htonl (0);
- disconnect_msg.peer = *peer;
- GST_clients_broadcast (&disconnect_msg.header, GNUNET_NO);
-}
-
-
-/**
- * Transmit our HELLO message to the given (connected) neighbour.
- *
- * @param cls the 'HELLO' message
- * @param peer identity of the peer
- * @param address the address
- * @param state current state this peer is in
- * @param state_timeout timeout for the current state of the peer
- * @param bandwidth_in inbound quota in NBO
- * @param bandwidth_out outbound quota in NBO
- */
-static void
-transmit_our_hello (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Address *address,
- enum GNUNET_TRANSPORT_PeerState state,
- struct GNUNET_TIME_Absolute state_timeout,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out)
-{
- const struct GNUNET_MessageHeader *hello = cls;
-
- if (0 == memcmp (peer, &GST_my_identity, sizeof(struct GNUNET_PeerIdentity)))
- return; /* not to ourselves */
- if (GNUNET_NO == GST_neighbours_test_connected (peer))
- return;
-
- GST_neighbours_send (peer,
- hello,
- ntohs (hello->size),
- hello_expiration,
- NULL,
- NULL);
-}
-
-
-/**
- * My HELLO has changed. Tell everyone who should know.
- *
- * @param cls unused
- * @param hello new HELLO
- */
-static void
-process_hello_update (void *cls, const struct GNUNET_MessageHeader *hello)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Broadcasting HELLO to clients\n");
- GST_clients_broadcast (hello, GNUNET_NO);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Broadcasting HELLO to neighbours\n");
- GST_neighbours_iterate (&transmit_our_hello, (void *) hello);
-}
-
-
-/**
- * We received some payload. Prepare to pass it on to our clients.
- *
- * @param address address and (claimed) identity of the other peer
- * @param session identifier used for this session (NULL for plugins
- * that do not offer bi-directional communication to the sender
- * using the same "connection")
- * @param message the message to process
- * @return how long the plugin should wait until receiving more data
- */
-static struct GNUNET_TIME_Relative
-process_payload (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- const struct GNUNET_MessageHeader *message)
-{
- struct GNUNET_TIME_Relative ret;
- int do_forward;
- struct InboundMessage *im;
- size_t msg_size = ntohs (message->size);
- size_t size = sizeof(struct InboundMessage) + msg_size;
- char buf[size] GNUNET_ALIGN;
-
- do_forward = GNUNET_SYSERR;
- ret = GST_neighbours_calculate_receive_delay (&address->peer,
- msg_size,
- &do_forward);
- if (! GST_neighbours_test_connected (&address->peer))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Discarded %u bytes type %u payload from peer `%s'\n",
- (unsigned int) msg_size,
- ntohs (message->type),
- GNUNET_i2s (&address->peer));
- GNUNET_STATISTICS_update (
- GST_stats,
- gettext_noop ("# bytes payload discarded due to not connected peer"),
- msg_size,
- GNUNET_NO);
- return ret;
- }
-
- if (GNUNET_YES != do_forward)
- return ret;
- im = (struct InboundMessage *) buf;
- im->header.size = htons (size);
- im->header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_RECV);
- im->peer = address->peer;
- GNUNET_memcpy (&im[1], message, ntohs (message->size));
- GST_clients_broadcast (&im->header, GNUNET_YES);
- return ret;
-}
-
-
-/**
- * Task to asynchronously terminate a session.
- *
- * @param cls the `struct GNUNET_ATS_SessionKiller` with the information for
the kill
- */
-static void
-kill_session_task (void *cls)
-{
- struct GNUNET_ATS_SessionKiller *sk = cls;
-
- sk->task = NULL;
- GNUNET_CONTAINER_DLL_remove (sk_head, sk_tail, sk);
- sk->plugin->disconnect_session (sk->plugin->cls, sk->session);
- GNUNET_free (sk);
-}
-
-
-/**
- * Force plugin to terminate session due to communication
- * issue.
- *
- * @param plugin_name name of the plugin
- * @param session session to termiante
- */
-static void
-kill_session (const char *plugin_name, struct GNUNET_ATS_Session *session)
-{
- struct GNUNET_TRANSPORT_PluginFunctions *plugin;
- struct GNUNET_ATS_SessionKiller *sk;
-
- for (sk = sk_head; NULL != sk; sk = sk->next)
- if (sk->session == session)
- return;
- plugin = GST_plugins_find (plugin_name);
- if (NULL == plugin)
- {
- GNUNET_break (0);
- return;
- }
- /* need to issue disconnect asynchronously */
- sk = GNUNET_new (struct GNUNET_ATS_SessionKiller);
- sk->session = session;
- sk->plugin = plugin;
- sk->task = GNUNET_SCHEDULER_add_now (&kill_session_task, sk);
- GNUNET_CONTAINER_DLL_insert (sk_head, sk_tail, sk);
-}
-
-
-/**
- * Black list check result for try_connect call
- * If connection to the peer is allowed request address and ???
- *
- * @param cls the message
- * @param peer the peer
- * @param address the address
- * @param session the session
- * @param result the result
- */
-static void
-connect_bl_check_cont (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- int result)
-{
- struct GNUNET_MessageHeader *msg = cls;
-
- if (GNUNET_OK == result)
- {
- /* Blacklist allows to speak to this peer, forward SYN to neighbours */
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Received SYN message from peer `%s' at `%s'\n",
- GNUNET_i2s (peer),
- GST_plugins_a2s (address));
- if (GNUNET_OK != GST_neighbours_handle_session_syn (msg, peer))
- {
- GST_blacklist_abort_matching (address, session);
- kill_session (address->transport_name, session);
- }
- GNUNET_free (msg);
- return;
- }
- GNUNET_free (msg);
- if (GNUNET_SYSERR == result)
- return; /* check was aborted, session destroyed */
- /* Blacklist denies to speak to this peer */
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Discarding SYN message from `%s' due to denied blacklist
check\n",
- GNUNET_i2s (peer));
- kill_session (address->transport_name, session);
-}
-
-
-/**
- * Function called by the transport for each received message.
- *
- * @param cls closure, const char* with the name of the plugin we received the
message from
- * @param address address and (claimed) identity of the other peer
- * @param message the message, NULL if we only care about
- * learning about the delay until we should receive again
- * @param session identifier used for this session (NULL for plugins
- * that do not offer bi-directional communication to the sender
- * using the same "connection")
- * @return how long the plugin should wait until receiving more data
- * (plugins that do not support this, can ignore the return value)
- */
-struct GNUNET_TIME_Relative
-GST_receive_callback (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- const struct GNUNET_MessageHeader *message)
-{
- const char *plugin_name = cls;
- struct GNUNET_TIME_Relative ret;
- uint16_t type;
-
- ret = GNUNET_TIME_UNIT_ZERO;
- if (NULL == message)
- goto end;
- type = ntohs (message->type);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received message with type %u from peer `%s' at %s\n",
- type,
- GNUNET_i2s (&address->peer),
- GST_plugins_a2s (address));
-
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# bytes total received"),
- ntohs (message->size),
- GNUNET_NO);
- GST_neighbours_notify_data_recv (address, message);
- switch (type)
- {
- case GNUNET_MESSAGE_TYPE_HELLO_URI:
- /* Future HELLO message, discard */
- return ret;
-
- case GNUNET_MESSAGE_TYPE_HELLO:
- if (GNUNET_OK != GST_validation_handle_hello (message))
- {
- GNUNET_break_op (0);
- GST_blacklist_abort_matching (address, session);
- }
- return ret;
-
- case GNUNET_MESSAGE_TYPE_TRANSPORT_PING:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Processing PING from `%s'\n",
- GST_plugins_a2s (address));
- if (GNUNET_OK !=
- GST_validation_handle_ping (&address->peer, message, address, session))
- {
- GST_blacklist_abort_matching (address, session);
- kill_session (plugin_name, session);
- }
- break;
-
- case GNUNET_MESSAGE_TYPE_TRANSPORT_PONG:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Processing PONG from `%s'\n",
- GST_plugins_a2s (address));
- if (GNUNET_OK != GST_validation_handle_pong (&address->peer, message))
- {
- GNUNET_break_op (0);
- GST_blacklist_abort_matching (address, session);
- kill_session (plugin_name, session);
- }
- break;
-
- case GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_SYN:
- /* Do blacklist check if communication with this peer is allowed */
- (void) GST_blacklist_test_allowed (&address->peer,
- NULL,
- &connect_bl_check_cont,
- GNUNET_copy_message (message),
- address,
- session);
- break;
-
- case GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_SYN_ACK:
- if (GNUNET_OK !=
- GST_neighbours_handle_session_syn_ack (message, address, session))
- {
- GST_blacklist_abort_matching (address, session);
- kill_session (plugin_name, session);
- }
- break;
-
- case GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_ACK:
- if (GNUNET_OK !=
- GST_neighbours_handle_session_ack (message, address, session))
- {
- GNUNET_break_op (0);
- GST_blacklist_abort_matching (address, session);
- kill_session (plugin_name, session);
- }
- break;
-
- case GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_DISCONNECT:
- GST_neighbours_handle_disconnect_message (&address->peer, message);
- break;
-
- case GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_QUOTA:
- GST_neighbours_handle_quota_message (&address->peer, message);
- break;
-
- case GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_KEEPALIVE:
- GST_neighbours_keepalive (&address->peer, message);
- break;
-
- case GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_KEEPALIVE_RESPONSE:
- GST_neighbours_keepalive_response (&address->peer, message);
- break;
-
- default:
- /* should be payload */
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# bytes payload received"),
- ntohs (message->size),
- GNUNET_NO);
- ret = process_payload (address, session, message);
- break;
- }
-end:
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Allowing receive from peer %s to continue in %s\n",
- GNUNET_i2s (&address->peer),
- GNUNET_STRINGS_relative_time_to_string (ret, GNUNET_YES));
- return ret;
-}
-
-
-/**
- * Function that will be called for each address the transport
- * is aware that it might be reachable under. Update our HELLO.
- *
- * @param cls name of the plugin (const char*)
- * @param add_remove should the address added (YES) or removed (NO) from the
- * set of valid addresses?
- * @param address the address to add or remove
- */
-static void
-plugin_env_address_change_notification (
- void *cls,
- int add_remove,
- const struct GNUNET_HELLO_Address *address)
-{
- static int addresses = 0;
-
- if (GNUNET_YES == add_remove)
- {
- addresses++;
- GNUNET_STATISTICS_update (GST_stats, "# transport addresses", 1,
GNUNET_NO);
- }
- else if (GNUNET_NO == add_remove)
- {
- if (0 == addresses)
- {
- GNUNET_break (0);
- }
- else
- {
- addresses--;
- GNUNET_STATISTICS_update (GST_stats,
- "# transport addresses",
- -1,
- GNUNET_NO);
- }
- }
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Transport now has %u addresses to communicate\n",
- addresses);
- GST_hello_modify_addresses (add_remove, address);
-}
-
-
-/**
- * Function that will be called whenever the plugin internally
- * cleans up a session pointer and hence the service needs to
- * discard all of those sessions as well. Plugins that do not
- * use sessions can simply omit calling this function and always
- * use NULL wherever a session pointer is needed. This function
- * should be called BEFORE a potential "TransmitContinuation"
- * from the "TransmitFunction".
- *
- * @param cls closure
- * @param address which address was the session for
- * @param session which session is being destroyed
- */
-static void
-plugin_env_session_end (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session)
-{
- struct GNUNET_ATS_SessionKiller *sk;
-
- if (NULL == address)
- {
- GNUNET_break (0);
- return;
- }
- if (NULL == session)
- {
- GNUNET_break (0);
- return;
- }
- GNUNET_assert (strlen (address->transport_name) > 0);
-
- GNUNET_log (
- GNUNET_ERROR_TYPE_DEBUG,
- "Notification from plugin about terminated session %p from peer `%s'
address `%s'\n",
- session,
- GNUNET_i2s (&address->peer),
- GST_plugins_a2s (address));
-
- GST_neighbours_session_terminated (&address->peer, session);
- GST_ats_del_session (address, session);
- GST_blacklist_abort_matching (address, session);
-
- for (sk = sk_head; NULL != sk; sk = sk->next)
- {
- if (sk->session == session)
- {
- GNUNET_CONTAINER_DLL_remove (sk_head, sk_tail, sk);
- GNUNET_SCHEDULER_cancel (sk->task);
- GNUNET_free (sk);
- break;
- }
- }
-}
-
-
-/**
- * Black list check result from blacklist check triggered when a
- * plugin gave us a new session in #plugin_env_session_start(). If
- * connection to the peer is disallowed, kill the session.
- *
- * @param cls NULL
- * @param peer the peer
- * @param address address associated with the request
- * @param session session associated with the request
- * @param result the result
- */
-static void
-plugin_env_session_start_bl_check_cont (
- void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- int result)
-{
- if (GNUNET_OK != result)
- {
- kill_session (address->transport_name, session);
- return;
- }
- if (GNUNET_YES !=
- GNUNET_HELLO_address_check_option (address,
- GNUNET_HELLO_ADDRESS_INFO_INBOUND))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Informing verifier about inbound session's address `%s'\n",
- GST_plugins_a2s (address));
- GST_validation_handle_address (address);
- }
-}
-
-
-/**
- * Plugin tells transport service about a new inbound session
- *
- * @param cls unused
- * @param address the address
- * @param session the new session
- * @param scope network scope information
- */
-static void
-plugin_env_session_start (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- enum GNUNET_NetworkType scope)
-{
- struct GNUNET_ATS_Properties prop;
-
- if (NULL == address)
- {
- GNUNET_break (0);
- return;
- }
- if (NULL == session)
- {
- GNUNET_break (0);
- return;
- }
- GNUNET_log (
- GNUNET_ERROR_TYPE_INFO,
- "Notification from plugin `%s' about new session from peer `%s' address
`%s'\n",
- address->transport_name,
- GNUNET_i2s (&address->peer),
- GST_plugins_a2s (address));
- if (GNUNET_YES ==
- GNUNET_HELLO_address_check_option (address,
- GNUNET_HELLO_ADDRESS_INFO_INBOUND))
- {
- /* inbound is always new, but outbound MAY already be known, but
- for example for UNIX, we have symmetric connections and thus we
- may not know the address yet; add if necessary! */
- /* FIXME: maybe change API here so we just pass scope? */
- memset (&prop, 0, sizeof(prop));
- GNUNET_break (GNUNET_NT_UNSPECIFIED != scope);
- prop.scope = scope;
- GST_ats_add_inbound_address (address, session, &prop);
- }
- /* Do blacklist check if communication with this peer is allowed */
- (void) GST_blacklist_test_allowed (&address->peer,
- address->transport_name,
- &plugin_env_session_start_bl_check_cont,
- NULL,
- address,
- session);
-}
-
-
-/**
- * Function called by ATS to notify the callee that the
- * assigned bandwidth or address for a given peer was changed. If the
- * callback is called with address/bandwidth assignments of zero, the
- * ATS disconnect function will still be called once the disconnect
- * actually happened.
- *
- * @param cls closure
- * @param peer the peer this address is intended for
- * @param address address to use (for peer given in address)
- * @param session session to use (if available)
- * @param bandwidth_out assigned outbound bandwidth for the connection in NBO,
- * 0 to disconnect from peer
- * @param bandwidth_in assigned inbound bandwidth for the connection in NBO,
- * 0 to disconnect from peer
- * @param ats ATS information
- * @param ats_count number of @a ats elements
- */
-static void
-ats_request_address_change (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in)
-{
- uint32_t bw_in = ntohl (bandwidth_in.value__);
- uint32_t bw_out = ntohl (bandwidth_out.value__);
-
- if (NULL == peer)
- {
- /* ATS service died, all suggestions become invalid!
- (but we'll keep using the allocations for a little
- while, to keep going while ATS restarts) */
- /* FIXME: We should drop all
- connections now, as ATS won't explicitly tell
- us and be unaware of ongoing resource allocations! */
- return;
- }
- /* ATS tells me to disconnect from peer */
- if ((0 == bw_in) && (0 == bw_out))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "ATS tells me to disconnect from peer `%s'\n",
- GNUNET_i2s (peer));
- GST_neighbours_force_disconnect (peer);
- return;
- }
- GNUNET_assert (NULL != address);
- GNUNET_STATISTICS_update (GST_stats,
- "# ATS suggestions received",
- 1,
- GNUNET_NO);
- GST_neighbours_switch_to_address (address,
- session,
- bandwidth_in,
- bandwidth_out);
-}
-
-
-/**
- * Closure for #test_connection_ok().
- */
-struct TestConnectionContext
-{
- /**
- * Is this the first neighbour we're checking?
- */
- int first;
-
- /**
- * Handle to the blacklisting client we need to ask.
- */
- struct TransportClient *tc;
-};
-
-
-/**
- * Got the result about an existing connection from a new blacklister.
- * Shutdown the neighbour if necessary.
- *
- * @param cls unused
- * @param peer the neighbour that was investigated
- * @param address address associated with the request
- * @param session session associated with the request
- * @param allowed #GNUNET_OK if we can keep it,
- * #GNUNET_NO if we must shutdown the connection
- */
-static void
-confirm_or_drop_neighbour (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- int allowed)
-{
- if (GNUNET_OK == allowed)
- return; /* we're done */
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# disconnects due to blacklist"),
- 1,
- GNUNET_NO);
- GST_neighbours_force_disconnect (peer);
-}
-
-
-/**
- * Test if an existing connection is still acceptable given a new
- * blacklisting client.
- *
- * @param cls the `struct TestConnectionContext *`
- * @param peer identity of the peer
- * @param address the address
- * @param state current state this peer is in
- * @param state_timeout timeout for the current state of the peer
- * @param bandwidth_in bandwidth assigned inbound
- * @param bandwidth_out bandwidth assigned outbound
- */
-static void
-test_connection_ok (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Address *address,
- enum GNUNET_TRANSPORT_PeerState state,
- struct GNUNET_TIME_Absolute state_timeout,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out)
-{
- struct TestConnectionContext *tcc = cls;
- struct GST_BlacklistCheck *bc;
-
- bc = GNUNET_new (struct GST_BlacklistCheck);
- GNUNET_CONTAINER_DLL_insert (bc_head, bc_tail, bc);
- bc->peer = *peer;
- bc->address = GNUNET_HELLO_address_copy (address);
- bc->cont = &confirm_or_drop_neighbour;
- bc->cont_cls = NULL;
- bc->bl_pos = tcc->tc;
- if (GNUNET_YES == tcc->first)
- {
- /* all would wait for the same client, no need to
- * create more than just the first task right now */
- bc->task = GNUNET_SCHEDULER_add_now (&do_blacklist_check, bc);
- tcc->first = GNUNET_NO;
- }
-}
-
-
-/**
- * Initialize a blacklisting client. We got a blacklist-init
- * message from this client, add it to the list of clients
- * to query for blacklisting.
- *
- * @param cls the client
- * @param message the blacklist-init message that was sent
- */
-static void
-handle_client_blacklist_init (void *cls,
- const struct GNUNET_MessageHeader *message)
-{
- struct TransportClient *tc = cls;
- struct TestConnectionContext tcc;
-
- if (CT_NONE != tc->type)
- {
- GNUNET_break (0);
- GNUNET_SERVICE_client_drop (tc->client);
- return;
- }
- GNUNET_SERVICE_client_mark_monitor (tc->client);
- tc->type = CT_BLACKLIST;
- tc->details.blacklist.call_receive_done = GNUNET_YES;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "New blacklist client %p\n", tc);
- /* confirm that all existing connections are OK! */
- tcc.tc = tc;
- tcc.first = GNUNET_YES;
- GST_neighbours_iterate (&test_connection_ok, &tcc);
-}
-
-
-/**
- * Free the given entry in the blacklist.
- *
- * @param cls unused
- * @param key host identity (unused)
- * @param value the blacklist entry
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-free_blacklist_entry (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- char *be = value;
-
- GNUNET_free (be);
- return GNUNET_OK;
-}
-
-
-/**
- * Set traffic metric to manipulate
- *
- * @param cls closure
- * @param tm message containing information
- */
-static void
-handle_client_set_metric (void *cls, const struct TrafficMetricMessage *tm)
-{
- struct TransportClient *tc = cls;
-
- GST_manipulation_set_metric (tm);
- GNUNET_SERVICE_client_continue (tc->client);
-}
-
-
-/**
- * Function called when the service shuts down. Unloads our plugins
- * and cancels pending validations.
- *
- * @param cls closure, unused
- */
-static void
-shutdown_task (void *cls)
-{
- struct AddressToStringContext *cur;
-
- GST_neighbours_stop ();
- GST_plugins_unload ();
- GST_validation_stop ();
- GST_ats_done ();
- GNUNET_ATS_scheduling_done (GST_ats);
- GST_ats = NULL;
- GNUNET_ATS_connectivity_done (GST_ats_connect);
- GST_ats_connect = NULL;
- GNUNET_NT_scanner_done (GST_is);
- GST_is = NULL;
- while (NULL != (cur = a2s_head))
- {
- GNUNET_CONTAINER_DLL_remove (a2s_head, a2s_tail, cur);
- GNUNET_free (cur);
- }
- if (NULL != plugin_nc)
- {
- GNUNET_notification_context_destroy (plugin_nc);
- plugin_nc = NULL;
- }
- GNUNET_CONTAINER_multipeermap_destroy (active_stccs);
- active_stccs = NULL;
- if (NULL != blacklist)
- {
- GNUNET_CONTAINER_multipeermap_iterate (blacklist,
- &free_blacklist_entry,
- NULL);
- GNUNET_CONTAINER_multipeermap_destroy (blacklist);
- blacklist = NULL;
- }
- GST_hello_stop ();
- GST_manipulation_stop ();
-
- if (NULL != GST_peerinfo)
- {
- GNUNET_PEERINFO_disconnect (GST_peerinfo);
- GST_peerinfo = NULL;
- }
- if (NULL != GST_stats)
- {
- GNUNET_STATISTICS_destroy (GST_stats, GNUNET_NO);
- GST_stats = NULL;
- }
-}
-
-
-static void
-do_blacklist_check (void *cls)
-{
- struct GST_BlacklistCheck *bc = cls;
- struct TransportClient *tc;
- struct GNUNET_MQ_Envelope *env;
- struct BlacklistMessage *bm;
-
- bc->task = NULL;
- while (NULL != (tc = bc->bl_pos))
- {
- if (CT_BLACKLIST == tc->type)
- break;
- bc->bl_pos = tc->next;
- }
- if (NULL == tc)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "No other blacklist clients active, will allow neighbour
`%s'\n",
- GNUNET_i2s (&bc->peer));
-
- bc->cont (bc->cont_cls, &bc->peer, bc->address, bc->session, GNUNET_OK);
- GST_blacklist_test_cancel (bc);
- return;
- }
- if ((NULL != tc->details.blacklist.bc) ||
- (GNUNET_NO != tc->details.blacklist.waiting_for_reply))
- return; /* someone else busy with this client */
- tc->details.blacklist.bc = bc;
- env = GNUNET_MQ_msg (bm, GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST_QUERY);
- bm->is_allowed = htonl (0);
- bm->peer = bc->peer;
- GNUNET_MQ_send (tc->mq, env);
- if (GNUNET_YES == tc->details.blacklist.call_receive_done)
- {
- tc->details.blacklist.call_receive_done = GNUNET_NO;
- GNUNET_SERVICE_client_continue (tc->client);
- }
- tc->details.blacklist.waiting_for_reply = GNUNET_YES;
-}
-
-
-/**
- * A blacklisting client has sent us reply. Process it.
- *
- * @param cls the client
- * @param msg the blacklist-reply message that was sent
- */
-static void
-handle_client_blacklist_reply (void *cls, const struct BlacklistMessage *msg)
-{
- struct TransportClient *tc = cls;
- struct GST_BlacklistCheck *bc;
-
- if (CT_BLACKLIST != tc->type)
- {
- GNUNET_break (0);
- GNUNET_SERVICE_client_drop (tc->client);
- return;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Blacklist client %p sent reply for `%s'\n",
- tc,
- GNUNET_i2s (&msg->peer));
- bc = tc->details.blacklist.bc;
- tc->details.blacklist.bc = NULL;
- tc->details.blacklist.waiting_for_reply = GNUNET_NO;
- tc->details.blacklist.call_receive_done = GNUNET_YES;
- if (NULL != bc)
- {
- /* only run this if the blacklist check has not been
- * cancelled in the meantime... */
- GNUNET_assert (bc->bl_pos == tc);
- if (ntohl (msg->is_allowed) == GNUNET_SYSERR)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Blacklist check failed, peer not allowed\n");
- /* For the duration of the continuation, make the ongoing
- check invisible (to avoid double-cancellation); then
- add it back again so we can re-use GST_blacklist_test_cancel() */
- GNUNET_CONTAINER_DLL_remove (bc_head, bc_tail, bc);
- bc->cont (bc->cont_cls, &bc->peer, bc->address, bc->session, GNUNET_NO);
- GNUNET_CONTAINER_DLL_insert (bc_head, bc_tail, bc);
- GST_blacklist_test_cancel (bc);
- tc->details.blacklist.call_receive_done = GNUNET_NO;
- GNUNET_SERVICE_client_continue (tc->client);
- return;
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Blacklist check succeeded, continuing with checks\n");
- tc->details.blacklist.call_receive_done = GNUNET_NO;
- GNUNET_SERVICE_client_continue (tc->client);
- bc->bl_pos = tc->next;
- bc->task = GNUNET_SCHEDULER_add_now (&do_blacklist_check, bc);
- }
- }
- /* check if any other blacklist checks are waiting for this blacklister */
- for (bc = bc_head; bc != NULL; bc = bc->next)
- if ((bc->bl_pos == tc) && (NULL == bc->task))
- {
- bc->task = GNUNET_SCHEDULER_add_now (&do_blacklist_check, bc);
- break;
- }
-}
-
-
-/**
- * Add the given peer to the blacklist (for the given transport).
- *
- * @param peer peer to blacklist
- * @param transport_name transport to blacklist for this peer, NULL for all
- */
-void
-GST_blacklist_add_peer (const struct GNUNET_PeerIdentity *peer,
- const char *transport_name)
-{
- char *transport = NULL;
-
- if (NULL != transport_name)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Adding peer `%s' with plugin `%s' to blacklist\n",
- GNUNET_i2s (peer),
- transport_name);
- transport = GNUNET_strdup (transport_name);
- }
- else
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Adding peer `%s' with all plugins to blacklist\n",
- GNUNET_i2s (peer));
- if (NULL == blacklist)
- blacklist =
- GNUNET_CONTAINER_multipeermap_create (TRANSPORT_BLACKLIST_HT_SIZE,
- GNUNET_NO);
-
- GNUNET_CONTAINER_multipeermap_put (blacklist,
- peer,
- transport,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
-}
-
-
-/**
- * Abort blacklist if @a address and @a session match.
- *
- * @param address address used to abort matching checks
- * @param session session used to abort matching checks
- */
-void
-GST_blacklist_abort_matching (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session)
-{
- struct GST_BlacklistCheck *bc;
- struct GST_BlacklistCheck *n;
-
- n = bc_head;
- while (NULL != (bc = n))
- {
- n = bc->next;
- if ((bc->session == session) &&
- (0 == GNUNET_HELLO_address_cmp (bc->address, address)))
- {
- bc->cont (bc->cont_cls,
- &bc->peer,
- bc->address,
- bc->session,
- GNUNET_SYSERR);
- GST_blacklist_test_cancel (bc);
- }
- }
-}
-
-
-/**
- * Test if the given blacklist entry matches. If so,
- * abort the iteration.
- *
- * @param cls the transport name to match (const char*)
- * @param key the key (unused)
- * @param value the 'char *' (name of a blacklisted transport)
- * @return #GNUNET_OK if the entry does not match, #GNUNET_NO if it matches
- */
-static int
-test_blacklisted (void *cls, const struct GNUNET_PeerIdentity *key, void
*value)
-{
- const char *transport_name = cls;
- char *be = value;
-
- /* Blacklist entry be:
- * (NULL == be): peer is blacklisted with all plugins
- * (NULL != be): peer is blacklisted for a specific plugin
- *
- * If (NULL != transport_name) we look for a transport specific entry:
- * if (transport_name == be) forbidden
- *
- */GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Comparing BL request for peer `%4s':`%s' with BL entry: `%s'\n",
- GNUNET_i2s (key),
- (NULL == transport_name) ? "unspecified" : transport_name,
- (NULL == be) ? "all plugins" : be);
- /* all plugins for this peer were blacklisted: disallow */
- if (NULL == value)
- return GNUNET_NO;
-
- /* blacklist check for specific transport */
- if ((NULL != transport_name) && (NULL != value))
- {
- if (0 == strcmp (transport_name, be))
- return GNUNET_NO; /* plugin is blacklisted! */
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Test if a peer/transport combination is blacklisted.
- *
- * @param peer the identity of the peer to test
- * @param transport_name name of the transport to test, never NULL
- * @param cont function to call with result
- * @param cont_cls closure for @a cont
- * @param address address to pass back to @a cont, can be NULL
- * @param session session to pass back to @a cont, can be NULL
- * @return handle to the blacklist check, NULL if the decision
- * was made instantly and @a cont was already called
- */
-struct GST_BlacklistCheck *
-GST_blacklist_test_allowed (const struct GNUNET_PeerIdentity *peer,
- const char *transport_name,
- GST_BlacklistTestContinuation cont,
- void *cont_cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session)
-{
- struct GST_BlacklistCheck *bc;
- struct TransportClient *tc;
-
- GNUNET_assert (NULL != peer);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Blacklist check for peer `%s':%s\n",
- GNUNET_i2s (peer),
- (NULL != transport_name) ? transport_name : "unspecified");
-
- /* Check local blacklist by iterating over hashmap
- * If iteration is aborted, we found a matching blacklist entry */
- if ((NULL != blacklist) &&
- (GNUNET_SYSERR ==
- GNUNET_CONTAINER_multipeermap_get_multiple (blacklist,
- peer,
- &test_blacklisted,
- (void *) transport_name)))
- {
- /* Disallowed by config, disapprove instantly */
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# disconnects due to blacklist"),
- 1,
- GNUNET_NO);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ ("Disallowing connection to peer `%s' on transport %s\n"),
- GNUNET_i2s (peer),
- (NULL != transport_name) ? transport_name : "unspecified");
- if (NULL != cont)
- cont (cont_cls, peer, address, session, GNUNET_NO);
- return NULL;
- }
-
- for (tc = clients_head; NULL != tc; tc = tc->next)
- if (CT_BLACKLIST == tc->type)
- break;
- if (NULL == tc)
- {
- /* no blacklist clients, approve instantly */
- if (NULL != cont)
- cont (cont_cls, peer, address, session, GNUNET_OK);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Allowing connection to peer `%s' %s\n",
- GNUNET_i2s (peer),
- (NULL != transport_name) ? transport_name : "");
- return NULL;
- }
-
- /* need to query blacklist clients */
- bc = GNUNET_new (struct GST_BlacklistCheck);
- GNUNET_CONTAINER_DLL_insert (bc_head, bc_tail, bc);
- bc->peer = *peer;
- bc->address = GNUNET_HELLO_address_copy (address);
- bc->session = session;
- bc->cont = cont;
- bc->cont_cls = cont_cls;
- bc->bl_pos = tc;
- bc->task = GNUNET_SCHEDULER_add_now (&do_blacklist_check, bc);
- return bc;
-}
-
-
-void
-GST_blacklist_test_cancel (struct GST_BlacklistCheck *bc)
-{
- GNUNET_CONTAINER_DLL_remove (bc_head, bc_tail, bc);
- if (NULL != bc->bl_pos)
- {
- if ((CT_BLACKLIST == bc->bl_pos->type) &&
- (bc->bl_pos->details.blacklist.bc == bc))
- {
- /* we're at the head of the queue, remove us! */
- bc->bl_pos->details.blacklist.bc = NULL;
- }
- }
- if (NULL != bc->task)
- {
- GNUNET_SCHEDULER_cancel (bc->task);
- bc->task = NULL;
- }
- GNUNET_free (bc->address);
- GNUNET_free (bc);
-}
-
-
-/**
- * Function to iterate over options in the blacklisting section for a peer.
- *
- * @param cls closure
- * @param section name of the section
- * @param option name of the option
- * @param value value of the option
- */
-static void
-blacklist_cfg_iter (void *cls,
- const char *section,
- const char *option,
- const char *value)
-{
- unsigned int *res = cls;
- struct GNUNET_PeerIdentity peer;
- char *plugs;
- char *pos;
-
- if (GNUNET_OK !=
- GNUNET_CRYPTO_eddsa_public_key_from_string (option,
- strlen (option),
- &peer.public_key))
- return;
-
- if ((NULL == value) || (0 == strcmp (value, "")))
- {
- /* Blacklist whole peer */
- GST_blacklist_add_peer (&peer, NULL);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ ("Adding blacklisting entry for peer `%s'\n"),
- GNUNET_i2s (&peer));
- }
- else
- {
- plugs = GNUNET_strdup (value);
- for (pos = strtok (plugs, " "); pos != NULL; pos = strtok (NULL, " "))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ ("Adding blacklisting entry for peer `%s':`%s'\n"),
- GNUNET_i2s (&peer),
- pos);
- GST_blacklist_add_peer (&peer, pos);
- }
- GNUNET_free (plugs);
- }
- (*res)++;
-}
-
-
-/**
- * Read blacklist configuration
- *
- * @param cfg the configuration handle
- * @param my_id my peer identity
- */
-static void
-read_blacklist_configuration (const struct GNUNET_CONFIGURATION_Handle *cfg,
- const struct GNUNET_PeerIdentity *my_id)
-{
- char cfg_sect[512];
- unsigned int res = 0;
-
- GNUNET_snprintf (cfg_sect,
- sizeof(cfg_sect),
- "transport-blacklist-%s",
- GNUNET_i2s_full (my_id));
- GNUNET_CONFIGURATION_iterate_section_values (cfg,
- cfg_sect,
- &blacklist_cfg_iter,
- &res);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Loaded %u blacklisting entries from configuration\n",
- res);
-}
-
-
-/**
- * Initiate transport service.
- *
- * @param cls closure
- * @param c configuration to use
- * @param service the initialized service
- */
-static void
-run (void *cls,
- const struct GNUNET_CONFIGURATION_Handle *c,
- struct GNUNET_SERVICE_Handle *service)
-{
- char *keyfile;
- long long unsigned int max_fd_cfg;
- int max_fd_rlimit;
- int max_fd;
- int friend_only;
-
- /* setup globals */
- GST_cfg = c;
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (c,
- "PEER",
- "PRIVATE_KEY",
- &keyfile))
- {
- GNUNET_log (
- GNUNET_ERROR_TYPE_ERROR,
- _ (
- "Transport service is lacking key configuration settings.
Exiting.\n"));
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_time (c,
- "transport",
- "HELLO_EXPIRATION",
- &hello_expiration))
- {
- hello_expiration = GNUNET_CONSTANTS_HELLO_ADDRESS_EXPIRATION;
- }
- if (GNUNET_SYSERR ==
- GNUNET_CRYPTO_eddsa_key_from_file (keyfile,
- GNUNET_YES,
- &GST_my_private_key))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to setup peer's private key\n");
- GNUNET_SCHEDULER_shutdown ();
- GNUNET_free (keyfile);
- return;
- }
- GNUNET_free (keyfile);
- GST_stats = GNUNET_STATISTICS_create ("transport", GST_cfg);
- GST_peerinfo = GNUNET_PEERINFO_connect (GST_cfg);
- GNUNET_CRYPTO_eddsa_key_get_public (&GST_my_private_key,
- &GST_my_identity.public_key);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "My identity is `%s'\n",
- GNUNET_i2s_full (&GST_my_identity));
-
- GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL);
- if (NULL == GST_peerinfo)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Could not access PEERINFO service. Exiting.\n"));
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
-
- max_fd_rlimit = 0;
-#if HAVE_GETRLIMIT
- {
- struct rlimit r_file;
-
- if (0 == getrlimit (RLIMIT_NOFILE, &r_file))
- {
- max_fd_rlimit = r_file.rlim_cur;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Maximum number of open files was: %u/%u\n",
- (unsigned int) r_file.rlim_cur,
- (unsigned int) r_file.rlim_max);
- }
- max_fd_rlimit =
- (9 * max_fd_rlimit) / 10; /* Keep 10% for rest of transport */
- }
-#endif
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (GST_cfg,
- "transport",
- "MAX_FD",
- &max_fd_cfg))
- max_fd_cfg = max_fd_rlimit;
-
- if (max_fd_cfg > max_fd_rlimit)
- max_fd = max_fd_cfg;
- else
- max_fd = max_fd_rlimit;
- if (max_fd < DEFAULT_MAX_FDS)
- max_fd = DEFAULT_MAX_FDS;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Limiting number of sockets to %u: validation %u, neighbors:
%u\n",
- max_fd,
- (max_fd / 3),
- (max_fd / 3) * 2);
-
- friend_only =
- GNUNET_CONFIGURATION_get_value_yesno (GST_cfg, "topology", "FRIENDS-ONLY");
- if (GNUNET_SYSERR == friend_only)
- friend_only = GNUNET_NO; /* According to topology defaults */
- /* start subsystems */
- /* Disable DSTJ peer */
- {
- struct GNUNET_PeerIdentity dstj;
- const char *ds = "DSTJBRRKZ8TBW3FGK6B0M5QXWT9WYNZ45H5MCV4HY7ST64Q8T9F0";
-
- GNUNET_assert (
- GNUNET_OK ==
- GNUNET_CRYPTO_eddsa_public_key_from_string (ds,
- strlen (ds),
- &dstj.public_key));
- GST_blacklist_add_peer (&dstj, NULL);
- }
- read_blacklist_configuration (GST_cfg, &GST_my_identity);
- GST_is = GNUNET_NT_scanner_init ();
- GST_ats_connect = GNUNET_ATS_connectivity_init (GST_cfg);
- GST_ats =
- GNUNET_ATS_scheduling_init (GST_cfg, &ats_request_address_change, NULL);
- GST_ats_init ();
- GST_manipulation_init ();
- GST_plugins_load (&GST_manipulation_recv,
- &plugin_env_address_change_notification,
- &plugin_env_session_start,
- &plugin_env_session_end);
- GST_hello_start (friend_only, &process_hello_update, NULL);
- GST_neighbours_start ((max_fd / 3) * 2);
- active_stccs = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_YES);
- plugin_nc = GNUNET_notification_context_create (0);
- GST_validation_start ((max_fd / 3));
-}
-
-
-/**
- * Define "main" method using service macro.
- */
-GNUNET_SERVICE_MAIN (
- "transport",
- GNUNET_SERVICE_OPTION_NONE,
- &run,
- &client_connect_cb,
- &client_disconnect_cb,
- NULL,
- GNUNET_MQ_hd_fixed_size (client_start,
- GNUNET_MESSAGE_TYPE_TRANSPORT_START,
- struct StartMessage,
- NULL),
- GNUNET_MQ_hd_var_size (client_hello,
- GNUNET_MESSAGE_TYPE_HELLO,
- struct GNUNET_MessageHeader,
- NULL),
- GNUNET_MQ_hd_var_size (client_send,
- GNUNET_MESSAGE_TYPE_TRANSPORT_SEND,
- struct OutboundMessage,
- NULL),
- GNUNET_MQ_hd_var_size (client_address_to_string,
- GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING,
- struct AddressLookupMessage,
- NULL),
- GNUNET_MQ_hd_fixed_size (client_monitor_peers,
- GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PEER_REQUEST,
- struct PeerMonitorMessage,
- NULL),
- GNUNET_MQ_hd_fixed_size (client_blacklist_init,
- GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST_INIT,
- struct GNUNET_MessageHeader,
- NULL),
- GNUNET_MQ_hd_fixed_size (client_blacklist_reply,
- GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST_REPLY,
- struct BlacklistMessage,
- NULL),
- GNUNET_MQ_hd_fixed_size (client_set_metric,
- GNUNET_MESSAGE_TYPE_TRANSPORT_TRAFFIC_METRIC,
- struct TrafficMetricMessage,
- NULL),
- GNUNET_MQ_hd_fixed_size (client_monitor_plugins,
- GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PLUGIN_START,
- struct GNUNET_MessageHeader,
- NULL),
- GNUNET_MQ_handler_end ());
-
-
-/* end of file gnunet-service-transport.c */
diff --git a/src/transport/gnunet-service-transport_ats.c
b/src/transport/gnunet-service-transport_ats.c
deleted file mode 100644
index 2438a0a48..000000000
--- a/src/transport/gnunet-service-transport_ats.c
+++ /dev/null
@@ -1,906 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/gnunet-service-transport_ats.c
- * @brief interfacing between transport and ATS service
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet-service-transport.h"
-#include "gnunet-service-transport_ats.h"
-#include "gnunet-service-transport_manipulation.h"
-#include "gnunet-service-transport_plugins.h"
-#include "gnunet_ats_service.h"
-
-/**
- * Log convenience function.
- */
-#define LOG(kind, ...) GNUNET_log_from (kind, "transport-ats", __VA_ARGS__)
-
-
-/**
- * Information we track for each address known to ATS.
- */
-struct AddressInfo
-{
- /**
- * The address (with peer identity). Must never change
- * while this struct is in the #p2a map.
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * Session (can be NULL)
- */
- struct GNUNET_ATS_Session *session;
-
- /**
- * Record with ATS API for the address.
- */
- struct GNUNET_ATS_AddressRecord *ar;
-
- /**
- * Performance properties of this address.
- */
- struct GNUNET_ATS_Properties properties;
-
- /**
- * Time until when this address is blocked and should thus not be
- * made available to ATS (@e ar should be NULL until this time).
- * Used when transport determines that for some reason it
- * (temporarily) cannot use an address, even though it has been
- * validated.
- */
- struct GNUNET_TIME_Absolute blocked;
-
- /**
- * If an address is blocked as part of an exponential back-off,
- * we track the current size of the backoff here.
- */
- struct GNUNET_TIME_Relative back_off;
-
- /**
- * Task scheduled to unblock an ATS-blocked address at
- * @e blocked time, or NULL if the address is not blocked
- * (and thus @e ar is non-NULL).
- */
- struct GNUNET_SCHEDULER_Task *unblock_task;
-
- /**
- * Set to #GNUNET_YES if the address has expired but we could
- * not yet remove it because we still have a valid session.
- */
- int expired;
-};
-
-
-/**
- * Map from peer identities to one or more `struct AddressInfo` values
- * for the peer.
- */
-static struct GNUNET_CONTAINER_MultiPeerMap *p2a;
-
-/**
- * Number of blocked addresses.
- */
-static unsigned int num_blocked;
-
-
-/**
- * Closure for #find_ai_cb() and #find_ai_no_session_cb().
- */
-struct FindClosure
-{
- /**
- * Session to look for (only used if the address is inbound).
- */
- struct GNUNET_ATS_Session *session;
-
- /**
- * Address to look for.
- */
- const struct GNUNET_HELLO_Address *address;
-
- /**
- * Where to store the result.
- */
- struct AddressInfo *ret;
-};
-
-
-/**
- * Provide an update on the `p2a` map size to statistics.
- * This function should be called whenever the `p2a` map
- * is changed.
- */
-static void
-publish_p2a_stat_update ()
-{
- GNUNET_STATISTICS_set (GST_stats,
- gettext_noop ("# Addresses given to ATS"),
- GNUNET_CONTAINER_multipeermap_size (p2a) -
num_blocked,
- GNUNET_NO);
- GNUNET_STATISTICS_set (GST_stats,
- "# blocked addresses",
- num_blocked,
- GNUNET_NO);
-}
-
-
-/**
- * Find matching address info. Both the address and the session
- * must match; note that expired addresses are still found (as
- * the session kind-of keeps those alive).
- *
- * @param cls the `struct FindClosure`
- * @param key which peer is this about
- * @param value the `struct AddressInfo`
- * @return #GNUNET_YES to continue to iterate, #GNUNET_NO if we found the value
- */
-static int
-find_ai_cb (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct FindClosure *fc = cls;
- struct AddressInfo *ai = value;
-
- if ((0 ==
- GNUNET_HELLO_address_cmp (fc->address,
- ai->address)) &&
- (fc->session == ai->session))
- {
- fc->ret = ai;
- return GNUNET_NO;
- }
- return GNUNET_YES;
-}
-
-
-/**
- * Find the address information struct for the
- * given @a address and @a session.
- *
- * @param address address to look for
- * @param session session to match for inbound connections
- * @return NULL if this combination is unknown
- */
-static struct AddressInfo *
-find_ai (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session)
-{
- struct FindClosure fc;
-
- fc.address = address;
- fc.session = session;
- fc.ret = NULL;
- GNUNET_CONTAINER_multipeermap_get_multiple (p2a,
- &address->peer,
- &find_ai_cb,
- &fc);
- return fc.ret;
-}
-
-
-/**
- * Find matching address info, ignoring sessions and expired
- * addresses.
- *
- * @param cls the `struct FindClosure`
- * @param key which peer is this about
- * @param value the `struct AddressInfo`
- * @return #GNUNET_YES to continue to iterate, #GNUNET_NO if we found the value
- */
-static int
-find_ai_no_session_cb (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct FindClosure *fc = cls;
- struct AddressInfo *ai = value;
-
- if (ai->expired)
- return GNUNET_YES; /* expired do not count here */
- if (0 ==
- GNUNET_HELLO_address_cmp (fc->address,
- ai->address))
- {
- fc->ret = ai;
- return GNUNET_NO;
- }
- return GNUNET_YES;
-}
-
-
-/**
- * Find the address information struct for the
- * given address (ignoring sessions)
- *
- * @param address address to look for
- * @return NULL if this combination is unknown
- */
-static struct AddressInfo *
-find_ai_no_session (const struct GNUNET_HELLO_Address *address)
-{
- struct FindClosure fc;
-
- fc.address = address;
- fc.session = NULL;
- fc.ret = NULL;
- GNUNET_CONTAINER_multipeermap_get_multiple (p2a,
- &address->peer,
- &find_ai_no_session_cb,
- &fc);
- return fc.ret;
-}
-
-
-/**
- * Test if ATS knows about this @a address and @a session.
- * Note that even if the address is expired, we return
- * #GNUNET_YES if the respective session matches.
- *
- * @param address the address
- * @param session the session
- * @return #GNUNET_YES if @a address is known, #GNUNET_NO if not.
- */
-int
-GST_ats_is_known (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session)
-{
- return (NULL != find_ai (address, session)) ? GNUNET_YES : GNUNET_NO;
-}
-
-
-/**
- * Test if ATS knows about this @a address. Note that
- * expired addresses do not count.
- *
- * @param address the address
- * @return #GNUNET_YES if @a address is known, #GNUNET_NO if not.
- */
-int
-GST_ats_is_known_no_session (const struct GNUNET_HELLO_Address *address)
-{
- return (NULL != find_ai_no_session (address))
- ? GNUNET_YES
- : GNUNET_NO;
-}
-
-
-/**
- * The blocking time for an address has expired, allow ATS to
- * suggest it again.
- *
- * @param cls the `struct AddressInfo` of the address to unblock
- */
-static void
-unblock_address (void *cls)
-{
- struct AddressInfo *ai = cls;
-
- ai->unblock_task = NULL;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Unblocking address %s of peer %s\n",
- GST_plugins_a2s (ai->address),
- GNUNET_i2s (&ai->address->peer));
- ai->ar = GNUNET_ATS_address_add (GST_ats,
- ai->address,
- ai->session,
- &ai->properties);
- GNUNET_break (NULL != ai->ar);
- num_blocked--;
- publish_p2a_stat_update ();
-}
-
-
-/**
- * Temporarily block a valid address for use by ATS for address
- * suggestions. This function should be called if an address was
- * suggested by ATS but failed to perform (i.e. failure to establish a
- * session or to exchange the PING/PONG).
- *
- * @param address the address to block
- * @param session the session (can be NULL)
- */
-void
-GST_ats_block_address (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session)
-{
- struct AddressInfo *ai;
-
- if (0 ==
- memcmp (&GST_my_identity,
- &address->peer,
- sizeof(struct GNUNET_PeerIdentity)))
- return; /* our own, ignore! */
- ai = find_ai (address,
- session);
- if ((NULL == ai) || (NULL == ai->ar))
- {
- /* The address is already gone/blocked, this can happen during a blacklist
- * callback. */
- return;
- }
- ai->back_off = GNUNET_TIME_STD_BACKOFF (ai->back_off);
- if (GNUNET_YES ==
- GNUNET_HELLO_address_check_option (address,
- GNUNET_HELLO_ADDRESS_INFO_INBOUND))
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Removing address %s of peer %s from use (inbound died)\n",
- GST_plugins_a2s (address),
- GNUNET_i2s (&address->peer));
- else
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Blocking address %s of peer %s from use for %s\n",
- GST_plugins_a2s (address),
- GNUNET_i2s (&address->peer),
- GNUNET_STRINGS_relative_time_to_string (ai->back_off,
- GNUNET_YES));
- /* destroy session and address */
- if ((NULL == session) ||
- (GNUNET_NO ==
- GNUNET_ATS_address_del_session (ai->ar,
- session)))
- {
- GNUNET_ATS_address_destroy (ai->ar);
- }
- /* "ar" has been freed, regardless how the branch
- above played out: it was either freed in
- #GNUNET_ATS_address_del_session() because it was
- incoming, or explicitly in
- #GNUNET_ATS_address_del_session(). */ai->ar = NULL;
-
- /* determine when the address should come back to life */
- ai->blocked = GNUNET_TIME_relative_to_absolute (ai->back_off);
- ai->unblock_task = GNUNET_SCHEDULER_add_delayed (ai->back_off,
- &unblock_address,
- ai);
- num_blocked++;
- publish_p2a_stat_update ();
-}
-
-
-/**
- * Reset address blocking time. Resets the exponential
- * back-off timer for this address to zero. Called when
- * an address was used to create a successful connection.
- *
- * @param address the address to reset the blocking timer
- * @param session the session (can be NULL)
- */
-void
-GST_ats_block_reset (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session)
-{
- struct AddressInfo *ai;
-
- if (0 ==
- memcmp (&GST_my_identity,
- &address->peer,
- sizeof(struct GNUNET_PeerIdentity)))
- return; /* our own, ignore! */
- ai = find_ai (address, session);
- if (NULL == ai)
- {
- GNUNET_break (0);
- return;
- }
- /* address is in successful use, so it should not be blocked right now */
- GNUNET_break (NULL == ai->unblock_task);
- ai->back_off = GNUNET_TIME_UNIT_ZERO;
-}
-
-
-/**
- * Notify ATS about a new inbound @a address. The @a address in
- * combination with the @a session must be new, but this function will
- * perform a santiy check. If the @a address is indeed new, make it
- * available to ATS.
- *
- * @param address the address
- * @param session the session
- * @param prop performance information
- */
-void
-GST_ats_add_inbound_address (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- const struct GNUNET_ATS_Properties *prop)
-{
- struct GNUNET_ATS_AddressRecord *ar;
- struct AddressInfo *ai;
-
- if (0 ==
- memcmp (&GST_my_identity,
- &address->peer,
- sizeof(struct GNUNET_PeerIdentity)))
- return; /* our own, ignore! */
-
- /* Sanity checks for a valid inbound address */
- if (NULL == address->transport_name)
- {
- GNUNET_break (0);
- return;
- }
- GNUNET_break (GNUNET_NT_UNSPECIFIED != prop->scope);
- GNUNET_assert (GNUNET_YES ==
- GNUNET_HELLO_address_check_option (address,
-
GNUNET_HELLO_ADDRESS_INFO_INBOUND));
- GNUNET_assert (NULL != session);
- ai = find_ai (address, session);
- if (NULL != ai)
- {
- /* This should only be called for new sessions, and thus
- we should not already have the address */
- GNUNET_break (0);
- return;
- }
- /* Is indeed new, let's tell ATS */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Notifying ATS about peer `%s''s new inbound address `%s' session %p in
network %s\n",
- GNUNET_i2s (&address->peer),
- GST_plugins_a2s (address),
- session,
- GNUNET_NT_to_string (prop->scope));
- ar = GNUNET_ATS_address_add (GST_ats,
- address,
- session,
- prop);
- GNUNET_assert (NULL != ar);
- ai = GNUNET_new (struct AddressInfo);
- ai->address = GNUNET_HELLO_address_copy (address);
- ai->session = session;
- ai->properties = *prop;
- ai->ar = ar;
- (void) GNUNET_CONTAINER_multipeermap_put (p2a,
- &ai->address->peer,
- ai,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
- publish_p2a_stat_update ();
-}
-
-
-void
-GST_ats_add_address (const struct GNUNET_HELLO_Address *address,
- const struct GNUNET_ATS_Properties *prop)
-{
- struct GNUNET_ATS_AddressRecord *ar;
- struct AddressInfo *ai;
-
- if (0 ==
- memcmp (&GST_my_identity,
- &address->peer,
- sizeof(struct GNUNET_PeerIdentity)))
- return; /* our own, ignore! */
- /* validadte address */
- if (NULL == address->transport_name)
- {
- GNUNET_break (0);
- return;
- }
- GNUNET_assert (GNUNET_YES !=
- GNUNET_HELLO_address_check_option (address,
-
GNUNET_HELLO_ADDRESS_INFO_INBOUND));
- ai = find_ai_no_session (address);
- GNUNET_assert (NULL == ai);
- GNUNET_break (GNUNET_NT_UNSPECIFIED != prop->scope);
-
- /* address seems sane, let's tell ATS */
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Notifying ATS about peer %s's new address `%s'\n",
- GNUNET_i2s (&address->peer),
- GST_plugins_a2s (address));
- ar = GNUNET_ATS_address_add (GST_ats,
- address,
- NULL,
- prop);
- GNUNET_assert (NULL != ar);
- ai = GNUNET_new (struct AddressInfo);
- ai->address = GNUNET_HELLO_address_copy (address);
- ai->ar = ar;
- ai->properties = *prop;
- (void) GNUNET_CONTAINER_multipeermap_put (p2a,
- &ai->address->peer,
- ai,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
- publish_p2a_stat_update ();
-}
-
-
-/**
- * Notify ATS about a new @a session now existing for the given
- * @a address. Essentially, an outbound @a address was used
- * to establish a @a session. It is safe to call this function
- * repeatedly for the same @a address and @a session pair.
- *
- * @param address the address
- * @param session the session
- */
-void
-GST_ats_new_session (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session)
-{
- struct AddressInfo *ai;
-
- if (0 ==
- memcmp (&GST_my_identity,
- &address->peer,
- sizeof(struct GNUNET_PeerIdentity)))
- return; /* our own, ignore! */
- ai = find_ai (address, NULL);
- if (NULL == ai)
- {
- /* We may simply already be aware of the session, even if some
- other part of the code could not tell if it just created a new
- session or just got one recycled from the plugin; hence, we may
- be called with "new" session even for an "old" session; in that
- case, check that this is the case, but just ignore it. */GNUNET_assert
(NULL != (find_ai (address, session)));
- return;
- }
- GNUNET_assert (NULL == ai->session);
- ai->session = session;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Telling ATS about new session for peer %s\n",
- GNUNET_i2s (&address->peer));
- /* Note that the address might currently be blocked; we only
- tell ATS about the session if the address is currently not
- blocked; otherwise, ATS will be told about the session on
- unblock. */
- if (NULL != ai->ar)
- GNUNET_ATS_address_add_session (ai->ar,
- session);
- else
- GNUNET_assert (NULL != ai->unblock_task);
-}
-
-
-/**
- * Release memory used by the given address data.
- *
- * @param ai the `struct AddressInfo`
- */
-static void
-destroy_ai (struct AddressInfo *ai)
-{
- GNUNET_assert (NULL == ai->session);
- if (NULL != ai->unblock_task)
- {
- GNUNET_SCHEDULER_cancel (ai->unblock_task);
- ai->unblock_task = NULL;
- num_blocked--;
- }
- GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove (p2a,
- &ai->address->peer,
- ai));
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Telling ATS to destroy address from peer %s\n",
- GNUNET_i2s (&ai->address->peer));
- if (NULL != ai->ar)
- {
- GNUNET_ATS_address_destroy (ai->ar);
- ai->ar = NULL;
- }
- publish_p2a_stat_update ();
- GNUNET_HELLO_address_free (ai->address);
- GNUNET_free (ai);
-}
-
-
-/**
- * Notify ATS that the @a session (but not the @a address) of
- * a given @a address is no longer relevant. (The @a session
- * went down.) This function may be called even if for the
- * respective outbound address #GST_ats_new_session() was
- * never called and thus the pair is unknown to ATS. In this
- * case, the call is simply ignored.
- *
- * @param address the address
- * @param session the session
- */
-void
-GST_ats_del_session (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session)
-{
- struct AddressInfo *ai;
-
- if (0 ==
- memcmp (&GST_my_identity,
- &address->peer,
- sizeof(struct GNUNET_PeerIdentity)))
- return; /* our own, ignore! */
- if (NULL == session)
- {
- GNUNET_break (0);
- return;
- }
- ai = find_ai (address,
- session);
- if (NULL == ai)
- {
- /* We sometimes create sessions just for sending a PING,
- and if those are destroyed they were never known to
- ATS which means we end up here (however, in this
- case, the address must be an outbound address). */
- GNUNET_break (GNUNET_YES !=
- GNUNET_HELLO_address_check_option (address,
-
GNUNET_HELLO_ADDRESS_INFO_INBOUND));
- return;
- }
- GNUNET_assert (session == ai->session);
- ai->session = NULL;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Telling ATS to destroy session %p from peer %s\n",
- session,
- GNUNET_i2s (&address->peer));
- if (GNUNET_YES == ai->expired)
- {
- /* last reason to keep this 'ai' around is now gone, the
- session is dead as well, clean up */
- if (NULL != ai->ar)
- {
- /* Address expired but not blocked, and thus 'ar' was still
- live because of the session; deleting just the session
- will do for an inbound session, but for an outbound we
- then also need to destroy the address with ATS. */
- if (GNUNET_NO ==
- GNUNET_ATS_address_del_session (ai->ar,
- session))
- {
- GNUNET_ATS_address_destroy (ai->ar);
- }
- /* "ar" has been freed, regardless how the branch
- above played out: it was either freed in
- #GNUNET_ATS_address_del_session() because it was
- incoming, or explicitly in
- #GNUNET_ATS_address_del_session(). */ai->ar = NULL;
- }
- destroy_ai (ai);
- return;
- }
-
- if (NULL == ai->ar)
- {
- /* If ATS doesn't know about the address/session, this means
- this address was blocked. */
- if (GNUNET_YES ==
- GNUNET_HELLO_address_check_option (address,
- GNUNET_HELLO_ADDRESS_INFO_INBOUND))
- {
- /* This was a blocked inbound session, which now lost the
- session. But inbound addresses are by themselves useless,
- so we must forget about the address as well. */
- destroy_ai (ai);
- return;
- }
- /* Otherwise, we are done as we have set `ai->session` to NULL
- already and ATS will simply not be told about the session when
- the connection is unblocked and the outbound address becomes
- available again. . */
- return;
- }
-
- /* This is the "simple" case where ATS knows about the session and
- the address is neither blocked nor expired. Delete the session,
- and if it was inbound, free the address as well. */
- if (GNUNET_YES ==
- GNUNET_ATS_address_del_session (ai->ar,
- session))
- {
- /* This was an inbound address, the session is now gone, so we
- need to also forget about the address itself. */
- ai->ar = NULL;
- destroy_ai (ai);
- }
-}
-
-
-/**
- * Notify ATS about DV @a distance change to an @a address.
- * Does nothing if the @a address is not known to us.
- *
- * @param address the address
- * @param distance new distance value
- */
-void
-GST_ats_update_distance (const struct GNUNET_HELLO_Address *address,
- uint32_t distance)
-{
- struct AddressInfo *ai;
-
- ai = find_ai_no_session (address);
- if (NULL == ai)
- {
- /* We do not know about this address, do nothing. */
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Updated distance for peer `%s' to %u\n",
- GNUNET_i2s (&address->peer),
- distance);
- ai->properties.distance = distance;
- /* Give manipulation its chance to change metrics */
- GST_manipulation_manipulate_metrics (address,
- ai->session,
- &ai->properties);
- /* Address may be blocked, only give ATS if address is
- currently active. */
- if (NULL != ai->ar)
- GNUNET_ATS_address_update (ai->ar,
- &ai->properties);
-}
-
-
-void
-GST_ats_update_delay (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_TIME_Relative delay)
-{
- struct AddressInfo *ai;
-
- ai = find_ai_no_session (address);
- if (NULL == ai)
- {
- /* We do not know about this address, do nothing. */
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Updated latency for peer `%s' to %s\n",
- GNUNET_i2s (&address->peer),
- GNUNET_STRINGS_relative_time_to_string (delay,
- GNUNET_YES));
- ai->properties.delay = delay;
- /* Give manipulation its chance to change metrics */
- GST_manipulation_manipulate_metrics (address,
- ai->session,
- &ai->properties);
- /* Address may be blocked, only give ATS if address is
- currently active. */
- if (NULL != ai->ar)
- GNUNET_ATS_address_update (ai->ar,
- &ai->properties);
-}
-
-
-/**
- * Notify ATS about utilization changes to an @a address.
- * Does nothing if the @a address is not known to us.
- *
- * @param address our information about the address
- * @param bps_in new utilization inbound
- * @param bps_out new utilization outbound
- */
-void
-GST_ats_update_utilization (const struct GNUNET_HELLO_Address *address,
- uint32_t bps_in,
- uint32_t bps_out)
-{
- struct AddressInfo *ai;
-
- ai = find_ai_no_session (address);
- if (NULL == ai)
- {
- /* We do not know about this address, do nothing. */
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Updating utilization for peer `%s' address %s: %u/%u\n",
- GNUNET_i2s (&address->peer),
- GST_plugins_a2s (address),
- (unsigned int) bps_in,
- (unsigned int) bps_out);
- ai->properties.utilization_in = bps_in;
- ai->properties.utilization_out = bps_out;
- /* Give manipulation its chance to change metrics */
- GST_manipulation_manipulate_metrics (address,
- ai->session,
- &ai->properties);
- /* Address may be blocked, only give ATS if address is
- currently active. */
- if (NULL != ai->ar)
- GNUNET_ATS_address_update (ai->ar,
- &ai->properties);
-}
-
-
-/**
- * Notify ATS that the address has expired and thus cannot
- * be used any longer. This function must only be called
- * if the corresponding session is already gone.
- *
- * @param address the address
- */
-void
-GST_ats_expire_address (const struct GNUNET_HELLO_Address *address)
-{
- struct AddressInfo *ai;
-
- if (0 ==
- memcmp (&GST_my_identity,
- &address->peer,
- sizeof(struct GNUNET_PeerIdentity)))
- return; /* our own, ignore! */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Address %s of peer %s expired\n",
- GST_plugins_a2s (address),
- GNUNET_i2s (&address->peer));
- ai = find_ai_no_session (address);
- if (NULL == ai)
- {
- GNUNET_assert (0);
- return;
- }
- if (NULL != ai->session)
- {
- /* Got an active session, just remember the expiration
- and act upon it when the session goes down. */
- ai->expired = GNUNET_YES;
- return;
- }
- /* Address expired, no session, free resources */
- destroy_ai (ai);
-}
-
-
-/**
- * Initialize ATS subsystem.
- */
-void
-GST_ats_init ()
-{
- p2a = GNUNET_CONTAINER_multipeermap_create (4, GNUNET_YES);
-}
-
-
-/**
- * Release memory used by the given address data.
- *
- * @param cls NULL
- * @param key which peer is this about
- * @param value the `struct AddressInfo`
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-destroy_ai_cb (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct AddressInfo *ai = value;
-
- destroy_ai (ai);
- return GNUNET_OK;
-}
-
-
-/**
- * Shutdown ATS subsystem.
- */
-void
-GST_ats_done ()
-{
- GNUNET_CONTAINER_multipeermap_iterate (p2a,
- &destroy_ai_cb,
- NULL);
- publish_p2a_stat_update ();
- GNUNET_CONTAINER_multipeermap_destroy (p2a);
- p2a = NULL;
-}
-
-
-/* end of gnunet-service-transport_ats.c */
diff --git a/src/transport/gnunet-service-transport_ats.h
b/src/transport/gnunet-service-transport_ats.h
deleted file mode 100644
index ca972d1cc..000000000
--- a/src/transport/gnunet-service-transport_ats.h
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/gnunet-service-transport_ats.h
- * @brief interfacing between transport and ATS service
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_TRANSPORT_ATS_H
-#define GNUNET_SERVICE_TRANSPORT_ATS_H
-
-#include "gnunet_ats_service.h"
-
-/**
- * Initialize ATS subsystem.
- */
-void
-GST_ats_init (void);
-
-
-/**
- * Shutdown ATS subsystem.
- */
-void
-GST_ats_done (void);
-
-
-/**
- * Test if ATS knows about this @a address and @a session.
- * Note that even if the address is expired, we return
- * #GNUNET_YES if the respective session matches.
- *
- * @param address the address
- * @param session the session
- * @return #GNUNET_YES if @a address is known, #GNUNET_NO if not.
- */
-int
-GST_ats_is_known (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session);
-
-
-/**
- * Test if ATS knows about this @a address. Note that
- * expired addresses do not count.
- *
- * @param address the address
- * @return #GNUNET_YES if @a address is known, #GNUNET_NO if not.
- */
-int
-GST_ats_is_known_no_session (const struct GNUNET_HELLO_Address *address);
-
-
-/**
- * Temporarily block a valid address for use by ATS for address
- * suggestions. This function should be called if an address was
- * suggested by ATS but failed to perform (i.e. failure to establish a
- * session or to exchange the PING/PONG).
- *
- * @param address the address to block
- * @param session the session (can be NULL)
- */
-void
-GST_ats_block_address (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session);
-
-
-/**
- * Reset address blocking time. Resets the exponential
- * back-off timer for this address to zero. Called when
- * an address was used to create a successful connection.
- *
- * @param address the address to reset the blocking timer
- * @param session the session (can be NULL)
- */
-void
-GST_ats_block_reset (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session);
-
-
-/**
- * Notify ATS about a new inbound @a address. The @a address in
- * combination with the @a session must be new, but this function will
- * perform a santiy check. If the @a address is indeed new, make it
- * available to ATS.
- *
- * @param address the address
- * @param session the session
- * @param prop performance information
- */
-void
-GST_ats_add_inbound_address (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- const struct GNUNET_ATS_Properties *prop);
-
-
-/**
- * Notify ATS about a new address including the network the address is
- * located in. The address must NOT be inbound and must be new to ATS.
- *
- * @param address the address
- * @param prop performance information
- */
-void
-GST_ats_add_address (const struct GNUNET_HELLO_Address *address,
- const struct GNUNET_ATS_Properties *prop);
-
-
-/**
- * Notify ATS about a new @a session now existing for the given
- * @a address. Essentially, an outbound @a address was used
- * to establish a @a session. It is safe to call this function
- * repeatedly for the same @a address and @a session pair.
- *
- * @param address the address
- * @param session the session
- */
-void
-GST_ats_new_session (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session);
-
-
-/**
- * Notify ATS about utilization changes to an @a address.
- * Does nothing if the @a address is not known to us.
- *
- * @param address our information about the address
- * @param bps_in new utilization inbound
- * @param bps_out new utilization outbound
- */
-void
-GST_ats_update_utilization (const struct GNUNET_HELLO_Address *address,
- uint32_t bps_in,
- uint32_t bps_out);
-
-
-/**
- * Notify ATS about @a delay changes to properties of an @a address.
- * Does nothing if the @a address is not known to us.
- *
- * @param address the address
- * @param delay new delay value
- */
-void
-GST_ats_update_delay (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_TIME_Relative delay);
-
-
-/**
- * Notify ATS about DV @a distance change to an @a address.
- * Does nothing if the @a address is not known to us.
- *
- * @param address the address
- * @param distance new distance value
- */
-void
-GST_ats_update_distance (const struct GNUNET_HELLO_Address *address,
- uint32_t distance);
-
-
-/**
- * Notify ATS that the @a session (but not the @a address) of
- * a given @a address is no longer relevant. (The @a session
- * went down.) This function may be called even if for the
- * respective outbound address #GST_ats_new_session() was
- * never called and thus the pair is unknown to ATS. In this
- * case, the call is simply ignored.
- *
- * @param address the address
- * @param session the session
- */
-void
-GST_ats_del_session (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session);
-
-
-/**
- * Notify ATS that the address has expired and thus cannot
- * be used any longer. This function must only be called
- * if the corresponding session is already gone.
- *
- * @param address the address
- */
-void
-GST_ats_expire_address (const struct GNUNET_HELLO_Address *address);
-
-
-#endif
diff --git a/src/transport/gnunet-service-transport_hello.c
b/src/transport/gnunet-service-transport_hello.c
deleted file mode 100644
index 1e5e8a225..000000000
--- a/src/transport/gnunet-service-transport_hello.c
+++ /dev/null
@@ -1,358 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010,2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/gnunet-service-transport_hello.c
- * @brief hello management implementation
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_constants.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_peerinfo_service.h"
-#include "gnunet_statistics_service.h"
-#include "gnunet-service-transport_hello.h"
-#include "gnunet-service-transport.h"
-#include "gnunet-service-transport_plugins.h"
-
-
-/**
- * How often do we refresh our HELLO (due to expiration concerns)?
- */
-#define HELLO_REFRESH_PERIOD GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_HOURS, 6)
-
-/**
- * Hello address expiration
- */
-extern struct GNUNET_TIME_Relative hello_expiration;
-
-
-/**
- * Entry in linked list of network addresses for ourselves. Also
- * includes a cached signature for 'struct TransportPongMessage's.
- */
-struct OwnAddressList
-{
- /**
- * This is a doubly-linked list.
- */
- struct OwnAddressList *next;
-
- /**
- * This is a doubly-linked list.
- */
- struct OwnAddressList *prev;
-
- /**
- * The address.
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * How long until the current signature expires? (ZERO if the
- * signature was never created).
- */
- struct GNUNET_TIME_Absolute pong_sig_expires;
-
- /**
- * Signature for a 'struct TransportPongMessage' for this address.
- */
- struct GNUNET_CRYPTO_EddsaSignature pong_signature;
-
- /**
- * How often has this address been added/removed? Used as
- * some plugins may learn the same external address from
- * multiple origins.
- */
- unsigned int rc;
-};
-
-
-/**
- * Our HELLO message.
- */
-static struct GNUNET_HELLO_Message *our_hello;
-
-/**
- * Function to call on HELLO changes.
- */
-static GST_HelloCallback hello_cb;
-
-/**
- * Closure for #hello_cb.
- */
-static void *hello_cb_cls;
-
-/**
- * Head of my addresses.
- */
-static struct OwnAddressList *oal_head;
-
-/**
- * Tail of my addresses.
- */
-static struct OwnAddressList *oal_tail;
-
-/**
- * Should we use a friend-only HELLO?
- */
-static int friend_option;
-
-/**
- * Identifier of #refresh_hello_task().
- */
-static struct GNUNET_SCHEDULER_Task *hello_task;
-
-
-/**
- * Closure for #address_generator().
- */
-struct GeneratorContext
-{
- /**
- * Where are we in the DLL?
- */
- struct OwnAddressList *addr_pos;
-
- /**
- * When do addresses expire?
- */
- struct GNUNET_TIME_Absolute expiration;
-};
-
-
-/**
- * Add an address from the `struct OwnAddressList` to the buffer.
- *
- * @param cls the `struct GeneratorContext`
- * @param max maximum number of bytes left
- * @param buf where to write the address
- * @return bytes written or #GNUNET_SYSERR to signal the
- * end of the iteration.
- */
-static ssize_t
-address_generator (void *cls,
- size_t max,
- void *buf)
-{
- struct GeneratorContext *gc = cls;
- ssize_t ret;
-
- if (NULL == gc->addr_pos)
- return GNUNET_SYSERR; /* Done */
- ret = GNUNET_HELLO_add_address (gc->addr_pos->address,
- gc->expiration,
- buf,
- max);
- gc->addr_pos = gc->addr_pos->next;
- return ret;
-}
-
-
-/**
- * Construct our HELLO message from all of the addresses of
- * all of the transports.
- *
- * @param cls unused
- */
-static void
-refresh_hello_task (void *cls)
-{
- struct GeneratorContext gc;
-
- hello_task = NULL;
- gc.addr_pos = oal_head;
- gc.expiration = GNUNET_TIME_relative_to_absolute (hello_expiration);
-
- GNUNET_free (our_hello);
- our_hello = GNUNET_HELLO_create (&GST_my_identity.public_key,
- &address_generator,
- &gc,
- friend_option);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Refreshed my %s HELLO, new size is %d\n",
- (GNUNET_YES == friend_option) ? "friend-only" : "public",
- GNUNET_HELLO_size (our_hello));
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# refreshed my HELLO"),
- 1,
- GNUNET_NO);
- if (NULL != hello_cb)
- hello_cb (hello_cb_cls,
- GST_hello_get ());
- GNUNET_PEERINFO_add_peer (GST_peerinfo,
- our_hello,
- NULL,
- NULL);
- hello_task =
- GNUNET_SCHEDULER_add_delayed (HELLO_REFRESH_PERIOD,
- &refresh_hello_task,
- NULL);
-}
-
-
-/**
- * Schedule task to refresh hello (but only if such a
- * task exists already, as otherwise the module might
- * have been shutdown).
- */
-static void
-refresh_hello ()
-{
- if (NULL != hello_task)
- {
- GNUNET_SCHEDULER_cancel (hello_task);
- hello_task = GNUNET_SCHEDULER_add_now (&refresh_hello_task,
- NULL);
- }
-}
-
-
-/**
- * Initialize the HELLO module.
- *
- * @param friend_only use a friend only hello
- * @param cb function to call whenever our HELLO changes
- * @param cb_cls closure for @a cb
- */
-void
-GST_hello_start (int friend_only,
- GST_HelloCallback cb,
- void *cb_cls)
-{
- hello_cb = cb;
- hello_cb_cls = cb_cls;
- friend_option = friend_only;
- refresh_hello_task (NULL);
-}
-
-
-/**
- * Shutdown the HELLO module.
- */
-void
-GST_hello_stop ()
-{
- hello_cb = NULL;
- hello_cb_cls = NULL;
- if (NULL != hello_task)
- {
- GNUNET_SCHEDULER_cancel (hello_task);
- hello_task = NULL;
- }
- if (NULL != our_hello)
- {
- GNUNET_free (our_hello);
- our_hello = NULL;
- }
-}
-
-
-/**
- * Obtain this peers HELLO message.
- *
- * @return our HELLO message
- */
-const struct GNUNET_MessageHeader *
-GST_hello_get ()
-{
- return (const struct GNUNET_MessageHeader *) our_hello;
-}
-
-
-/**
- * Add or remove an address from this peer's HELLO message.
- *
- * @param addremove #GNUNET_YES to add, #GNUNET_NO to remove
- * @param address address to add or remove
- */
-void
-GST_hello_modify_addresses (int addremove,
- const struct GNUNET_HELLO_Address *address)
-{
- struct OwnAddressList *al;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- (GNUNET_YES == addremove)
- ? "Adding `%s' to the set of our addresses\n"
- : "Removing `%s' from the set of our addresses\n",
- GST_plugins_a2s (address));
- GNUNET_assert (NULL != address);
- for (al = oal_head; al != NULL; al = al->next)
- if (0 == GNUNET_HELLO_address_cmp (address, al->address))
- break;
- if (GNUNET_NO == addremove)
- {
- if (NULL == al)
- {
- /* address to be removed not found!? */
- GNUNET_break (0);
- return;
- }
- al->rc--;
- if (0 != al->rc)
- return; /* RC not yet zero */
- GNUNET_CONTAINER_DLL_remove (oal_head,
- oal_tail,
- al);
- GNUNET_HELLO_address_free (al->address);
- GNUNET_free (al);
- refresh_hello ();
- return;
- }
- if (NULL != al)
- {
- /* address added twice or more */
- al->rc++;
- return;
- }
- al = GNUNET_new (struct OwnAddressList);
- al->rc = 1;
- GNUNET_CONTAINER_DLL_insert (oal_head,
- oal_tail,
- al);
- al->address = GNUNET_HELLO_address_copy (address);
- refresh_hello ();
-}
-
-
-int
-GST_hello_test_address (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_CRYPTO_EddsaSignature **sig,
- struct GNUNET_TIME_Absolute **sig_expiration)
-{
- struct OwnAddressList *al;
-
- for (al = oal_head; al != NULL; al = al->next)
- if (0 == GNUNET_HELLO_address_cmp (address,
- al->address))
- {
- *sig = &al->pong_signature;
- *sig_expiration = &al->pong_sig_expires;
- return GNUNET_YES;
- }
- *sig = NULL;
- *sig_expiration = NULL;
- return GNUNET_NO;
-}
-
-
-/* end of file gnunet-service-transport_hello.c */
diff --git a/src/transport/gnunet-service-transport_hello.h
b/src/transport/gnunet-service-transport_hello.h
deleted file mode 100644
index be089dd35..000000000
--- a/src/transport/gnunet-service-transport_hello.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010,2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/gnunet-service-transport_hello.h
- * @brief hello API
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_TRANSPORT_HELLO_H
-#define GNUNET_SERVICE_TRANSPORT_HELLO_H
-
-#include "gnunet_statistics_service.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_hello_lib.h"
-
-
-/**
- * Signature of a function to call whenever our hello changes.
- *
- * @param cls closure
- * @param hello updated HELLO
- */
-typedef void
-(*GST_HelloCallback) (void *cls,
- const struct GNUNET_MessageHeader *hello);
-
-
-/**
- * Initialize the HELLO module.
- *
- * @param friend_only use a friend only hello
- * @param cb function to call whenever our HELLO changes
- * @param cb_cls closure for @a cb
- */
-void
-GST_hello_start (int friend_only,
- GST_HelloCallback cb,
- void *cb_cls);
-
-
-/**
- * Shutdown the HELLO module.
- */
-void
-GST_hello_stop (void);
-
-
-/**
- * Obtain this peers HELLO message.
- *
- * @return our HELLO message
- */
-const struct GNUNET_MessageHeader *
-GST_hello_get (void);
-
-
-/**
- * Add or remove an address from this peer's HELLO message.
- *
- * @param addremove #GNUNET_YES to add, #GNUNET_NO to remove
- * @param address address to add or remove
- */
-void
-GST_hello_modify_addresses (int addremove,
- const struct GNUNET_HELLO_Address *address);
-
-
-/**
- * Test if a particular address is one of ours.
- *
- * @param address the address to test
- * @param sig location where to cache PONG signatures for this address [set]
- * @param sig_expiration how long until the current 'sig' expires?
- * (ZERO if sig was never created) [set]
- * @return #GNUNET_YES if this is one of our addresses,
- * #GNUNET_NO if not
- */
-int
-GST_hello_test_address (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_CRYPTO_EddsaSignature **sig,
- struct GNUNET_TIME_Absolute **sig_expiration);
-
-
-#endif
-/* end of file gnunet-service-transport_hello.h */
diff --git a/src/transport/gnunet-service-transport_manipulation.c
b/src/transport/gnunet-service-transport_manipulation.c
deleted file mode 100644
index 9f39b2dca..000000000
--- a/src/transport/gnunet-service-transport_manipulation.c
+++ /dev/null
@@ -1,586 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2013 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/gnunet-service-transport_manipulation.c
- * @brief transport component manipulation traffic for simulation
- * @author Christian Grothoff
- * @author Matthias Wachs
- */
-#include "platform.h"
-#include "gnunet-service-transport_hello.h"
-#include "gnunet-service-transport_neighbours.h"
-#include "gnunet-service-transport_plugins.h"
-#include "gnunet-service-transport_validation.h"
-#include "gnunet-service-transport.h"
-#include "transport.h"
-
-
-/**
- * Struct containing information about manipulations to a specific peer
- */
-struct TM_Peer
-{
- /**
- * Peer ID
- */
- struct GNUNET_PeerIdentity peer;
-
- /**
- * How long to delay incoming messages for this peer.
- */
- struct GNUNET_TIME_Relative delay_in;
-
- /**
- * How long to delay outgoing messages for this peer.
- */
- struct GNUNET_TIME_Relative delay_out;
-
- /**
- * Manipulated properties to use for this peer.
- */
- struct GNUNET_ATS_Properties properties;
-
- /**
- * Task to schedule delayed sendding
- */
- struct GNUNET_SCHEDULER_Task *send_delay_task;
-
- /**
- * Send queue DLL head
- */
- struct DelayQueueEntry *send_head;
-
- /**
- * Send queue DLL tail
- */
- struct DelayQueueEntry *send_tail;
-};
-
-
-/**
- * Entry in the delay queue for an outbound delayed message
- */
-struct DelayQueueEntry
-{
- /**
- * Next in DLL
- */
- struct DelayQueueEntry *prev;
-
- /**
- * Previous in DLL
- */
- struct DelayQueueEntry *next;
-
- /**
- * Peer this entry is belonging to if (NULL == tmp): enqueued in
- * generic DLL and scheduled by generic_send_delay_task else:
- * enqueued in tmp->send_head and tmp->send_tail and scheduled by
- * tmp->send_delay_task
- */
- struct TM_Peer *tmp;
-
- /**
- * Peer ID
- */
- struct GNUNET_PeerIdentity id;
-
- /**
- * Absolute time when to send
- */
- struct GNUNET_TIME_Absolute sent_at;
-
- /**
- * The message
- */
- void *msg;
-
- /**
- * The message size
- */
- size_t msg_size;
-
- /**
- * Message timeout
- */
- struct GNUNET_TIME_Relative timeout;
-
- /**
- * Transports send continuation
- */
- GST_NeighbourSendContinuation cont;
-
- /**
- * Transports send continuation cls
- */
- void *cont_cls;
-};
-
-/**
- * Hashmap contain all peers currently manipulated
- */
-static struct GNUNET_CONTAINER_MultiPeerMap *peers;
-
-/**
- * Inbound delay to apply to all peers.
- */
-static struct GNUNET_TIME_Relative delay_in;
-
-/**
- * Outbound delay to apply to all peers.
- */
-static struct GNUNET_TIME_Relative delay_out;
-
-/**
- * DLL head for delayed messages based on general delay
- */
-static struct DelayQueueEntry *generic_dqe_head;
-
-/**
- * DLL tail for delayed messages based on general delay
- */
-static struct DelayQueueEntry *generic_dqe_tail;
-
-/**
- * Task to schedule delayed sending based on general delay
- */
-static struct GNUNET_SCHEDULER_Task *generic_send_delay_task;
-
-
-/**
- * Set traffic metric to manipulate
- *
- * @param tm message containing information
- */
-void
-GST_manipulation_set_metric (const struct TrafficMetricMessage *tm)
-{
- static struct GNUNET_PeerIdentity zero;
- struct TM_Peer *tmp;
-
- if (0 == memcmp (&tm->peer,
- &zero,
- sizeof(struct GNUNET_PeerIdentity)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received traffic metrics for all peers\n");
- delay_in = GNUNET_TIME_relative_ntoh (tm->delay_in);
- delay_out = GNUNET_TIME_relative_ntoh (tm->delay_out);
- return;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received traffic metrics for peer `%s'\n",
- GNUNET_i2s (&tm->peer));
- if (NULL ==
- (tmp = GNUNET_CONTAINER_multipeermap_get (peers,
- &tm->peer)))
- {
- tmp = GNUNET_new (struct TM_Peer);
- tmp->peer = tm->peer;
- GNUNET_CONTAINER_multipeermap_put (peers,
- &tm->peer,
- tmp,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
- }
- GNUNET_ATS_properties_ntoh (&tmp->properties,
- &tm->properties);
- tmp->delay_in = GNUNET_TIME_relative_ntoh (tm->delay_in);
- tmp->delay_out = GNUNET_TIME_relative_ntoh (tm->delay_out);
-}
-
-
-/**
- * We have delayed transmission, now it is time to send the
- * message.
- *
- * @param cls the `struct DelayQueueEntry` to transmit
- */
-static void
-send_delayed (void *cls)
-{
- struct DelayQueueEntry *dqe = cls;
- struct DelayQueueEntry *next;
- struct TM_Peer *tmp = dqe->tmp;
-
- GNUNET_break (GNUNET_YES ==
- GST_neighbours_test_connected (&dqe->id));
- if (NULL != tmp)
- {
- tmp->send_delay_task = NULL;
- GNUNET_CONTAINER_DLL_remove (tmp->send_head,
- tmp->send_tail,
- dqe);
- next = tmp->send_head;
- if (NULL != next)
- {
- /* More delayed messages */
- tmp->send_delay_task = GNUNET_SCHEDULER_add_at (next->sent_at,
- &send_delayed,
- next);
- }
- }
- else
- {
- /* Remove from generic queue */
- generic_send_delay_task = NULL;
- GNUNET_CONTAINER_DLL_remove (generic_dqe_head,
- generic_dqe_tail,
- dqe);
- next = generic_dqe_head;
- if (NULL != next)
- {
- /* More delayed messages */
- generic_send_delay_task = GNUNET_SCHEDULER_add_at (next->sent_at,
- &send_delayed,
- next);
- }
- }
- GST_neighbours_send (&dqe->id,
- dqe->msg,
- dqe->msg_size,
- dqe->timeout,
- dqe->cont,
- dqe->cont_cls);
- GNUNET_free (dqe);
-}
-
-
-/**
- * Adapter function between transport's send function and transport plugins.
- * Delays message transmission if an artificial delay is configured.
- *
- * @param target the peer the message to send to
- * @param msg the message received
- * @param msg_size message size
- * @param timeout timeout
- * @param cont the continuation to call after sending
- * @param cont_cls cls for @a cont
- */
-void
-GST_manipulation_send (const struct GNUNET_PeerIdentity *target,
- const void *msg,
- size_t msg_size,
- struct GNUNET_TIME_Relative timeout,
- GST_NeighbourSendContinuation cont,
- void *cont_cls)
-{
- struct TM_Peer *tmp;
- struct DelayQueueEntry *dqe;
- struct GNUNET_TIME_Relative delay;
-
- if (NULL != (tmp =
- GNUNET_CONTAINER_multipeermap_get (peers,
- target)))
- delay = tmp->delay_out;
- else
- delay = delay_out;
- if (0 == delay.rel_value_us)
- {
- /* Normal sending */
- GST_neighbours_send (target,
- msg,
- msg_size,
- timeout,
- cont, cont_cls);
- return;
- }
- dqe = GNUNET_malloc (sizeof(struct DelayQueueEntry) + msg_size);
- dqe->id = *target;
- dqe->tmp = tmp;
- dqe->sent_at = GNUNET_TIME_relative_to_absolute (delay);
- dqe->cont = cont;
- dqe->cont_cls = cont_cls;
- dqe->msg = &dqe[1];
- dqe->msg_size = msg_size;
- dqe->timeout = timeout;
- GNUNET_memcpy (dqe->msg,
- msg,
- msg_size);
- if (NULL == tmp)
- {
- GNUNET_CONTAINER_DLL_insert_tail (generic_dqe_head,
- generic_dqe_tail,
- dqe);
- if (NULL == generic_send_delay_task)
- generic_send_delay_task = GNUNET_SCHEDULER_add_delayed (delay,
- &send_delayed,
- dqe);
- }
- else
- {
- GNUNET_CONTAINER_DLL_insert_tail (tmp->send_head,
- tmp->send_tail,
- dqe);
- if (NULL == tmp->send_delay_task)
- tmp->send_delay_task = GNUNET_SCHEDULER_add_delayed (delay,
- &send_delayed,
- dqe);
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Delaying %u byte message to peer `%s' with peer specific delay
for %s\n",
- (unsigned int) msg_size,
- GNUNET_i2s (target),
- GNUNET_STRINGS_relative_time_to_string (delay,
- GNUNET_YES));
-}
-
-
-/**
- * Function that will be called to manipulate ATS information according to
- * current manipulation settings
- *
- * @param address binary address
- * @param session the session
- * @param[in,out] prop metrics to modify
- */
-void
-GST_manipulation_manipulate_metrics (const struct GNUNET_HELLO_Address
*address,
- struct GNUNET_ATS_Session *session,
- struct GNUNET_ATS_Properties *prop)
-{
- const struct GNUNET_PeerIdentity *peer = &address->peer;
- struct TM_Peer *tmp;
-
- tmp = GNUNET_CONTAINER_multipeermap_get (peers,
- peer);
- if (NULL != tmp)
- *prop = tmp->properties;
-}
-
-
-/**
- * Adapter function between transport plugins and transport receive function
- * manipulation delays for next send.
- *
- * @param cls the closure for transport
- * @param address the address and the peer the message was received from
- * @param message the message received
- * @param session the session the message was received on
- * @return manipulated delay for next receive
- */
-struct GNUNET_TIME_Relative
-GST_manipulation_recv (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- const struct GNUNET_MessageHeader *message)
-{
- struct TM_Peer *tmp;
- struct GNUNET_TIME_Relative quota_delay;
- struct GNUNET_TIME_Relative m_delay;
-
- if (NULL !=
- (tmp = GNUNET_CONTAINER_multipeermap_get (peers,
- &address->peer)))
- m_delay = tmp->delay_in;
- else
- m_delay = delay_in;
-
- quota_delay = GST_receive_callback (cls,
- address,
- session,
- message);
- m_delay = GNUNET_TIME_relative_max (m_delay,
- quota_delay);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Delaying next receive for peer `%s' for %s\n",
- GNUNET_i2s (&address->peer),
- GNUNET_STRINGS_relative_time_to_string (m_delay,
- GNUNET_YES));
- return m_delay;
-}
-
-
-/**
- * Initialize traffic manipulation
- */
-void
-GST_manipulation_init ()
-{
- struct GNUNET_TIME_Relative delay;
-
- if ((GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_time (GST_cfg,
- "transport",
- "MANIPULATE_DELAY_IN",
- &delay)) &&
- (delay.rel_value_us > 0))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Delaying inbound traffic for %s\n",
- GNUNET_STRINGS_relative_time_to_string (delay,
- GNUNET_YES));
- delay_in = delay;
- }
- if ((GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_time (GST_cfg,
- "transport",
- "MANIPULATE_DELAY_OUT",
- &delay)) &&
- (delay.rel_value_us > 0))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Delaying outbound traffic for %s\n",
- GNUNET_STRINGS_relative_time_to_string (delay,
- GNUNET_YES));
- delay_out = delay;
- }
- peers = GNUNET_CONTAINER_multipeermap_create (4,
- GNUNET_NO);
-}
-
-
-/**
- * Notify manipulation about disconnect so it can discard queued messages
- *
- * @param peer the disconnecting peer
- */
-void
-GST_manipulation_peer_disconnect (const struct GNUNET_PeerIdentity *peer)
-{
- struct TM_Peer *tmp;
- struct DelayQueueEntry *dqe;
- struct DelayQueueEntry *next;
-
- tmp = GNUNET_CONTAINER_multipeermap_get (peers,
- peer);
- if (NULL != tmp)
- {
- while (NULL != (dqe = tmp->send_head))
- {
- GNUNET_CONTAINER_DLL_remove (tmp->send_head,
- tmp->send_tail,
- dqe);
- if (NULL != dqe->cont)
- dqe->cont (dqe->cont_cls,
- GNUNET_SYSERR,
- dqe->msg_size,
- 0);
- GNUNET_free (dqe);
- }
- }
- next = generic_dqe_head;
- while (NULL != (dqe = next))
- {
- next = dqe->next;
- if (0 == memcmp (peer,
- &dqe->id,
- sizeof(dqe->id)))
- {
- GNUNET_CONTAINER_DLL_remove (generic_dqe_head,
- generic_dqe_tail,
- dqe);
- if (NULL != dqe->cont)
- dqe->cont (dqe->cont_cls,
- GNUNET_SYSERR,
- dqe->msg_size,
- 0);
- GNUNET_free (dqe);
- }
- }
- if (NULL != generic_send_delay_task)
- {
- GNUNET_SCHEDULER_cancel (generic_send_delay_task);
- generic_send_delay_task = NULL;
- if (NULL != generic_dqe_head)
- generic_send_delay_task
- = GNUNET_SCHEDULER_add_at (generic_dqe_head->sent_at,
- &send_delayed,
- generic_dqe_head);
- }
-}
-
-
-/**
- * Free manipulation information about a peer.
- *
- * @param cls NULL
- * @param key peer the info is about
- * @param value a `struct TM_Peer` to free
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-free_tmps (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct TM_Peer *tmp = value;
- struct DelayQueueEntry *dqe;
-
- GNUNET_break (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove (peers,
- key,
- value));
- while (NULL != (dqe = tmp->send_head))
- {
- GNUNET_CONTAINER_DLL_remove (tmp->send_head,
- tmp->send_tail,
- dqe);
- if (NULL != dqe->cont)
- dqe->cont (dqe->cont_cls,
- GNUNET_SYSERR,
- dqe->msg_size,
- 0);
- GNUNET_free (dqe);
- }
- if (NULL != tmp->send_delay_task)
- {
- GNUNET_SCHEDULER_cancel (tmp->send_delay_task);
- tmp->send_delay_task = NULL;
- }
- GNUNET_free (tmp);
- return GNUNET_OK;
-}
-
-
-/**
- * Stop traffic manipulation
- */
-void
-GST_manipulation_stop ()
-{
- struct DelayQueueEntry *cur;
-
- GNUNET_CONTAINER_multipeermap_iterate (peers,
- &free_tmps,
- NULL);
- GNUNET_CONTAINER_multipeermap_destroy (peers);
- peers = NULL;
- while (NULL != (cur = generic_dqe_head))
- {
- GNUNET_CONTAINER_DLL_remove (generic_dqe_head,
- generic_dqe_tail,
- cur);
- if (NULL != cur->cont)
- cur->cont (cur->cont_cls,
- GNUNET_SYSERR,
- cur->msg_size,
- 0);
- GNUNET_free (cur);
- }
- if (NULL != generic_send_delay_task)
- {
- GNUNET_SCHEDULER_cancel (generic_send_delay_task);
- generic_send_delay_task = NULL;
- }
-}
-
-
-/* end of file gnunet-service-transport_manipulation.c */
diff --git a/src/transport/gnunet-service-transport_manipulation.h
b/src/transport/gnunet-service-transport_manipulation.h
deleted file mode 100644
index b84f3fc32..000000000
--- a/src/transport/gnunet-service-transport_manipulation.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/gnunet-service-transport_neighbours.h
- * @brief neighbour manipulation API, allows manipulation of
- * performance metrics (delay and towards ATS)
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_TRANSPORT_MANIPULATION_H
-#define GNUNET_SERVICE_TRANSPORT_MANIPULATION_H
-
-#include "platform.h"
-#include "gnunet-service-transport_hello.h"
-#include "gnunet-service-transport_neighbours.h"
-#include "gnunet-service-transport_plugins.h"
-#include "gnunet-service-transport_validation.h"
-#include "gnunet-service-transport.h"
-#include "transport.h"
-
-
-/**
- * Set traffic metric to manipulate
- *
- * @param message containing information
- */
-void
-GST_manipulation_set_metric (const struct TrafficMetricMessage *tm);
-
-
-/**
- * Adapter function between transport's send function and transport plugins
- *
- * @param target the peer the message to send to
- * @param msg the message received
- * @param msg_size message size
- * @param timeout timeout
- * @param cont the continuation to call after sending
- * @param cont_cls cls for continuation
- */
-void
-GST_manipulation_send (const struct GNUNET_PeerIdentity *target,
- const void *msg,
- size_t msg_size,
- struct GNUNET_TIME_Relative timeout,
- GST_NeighbourSendContinuation cont,
- void *cont_cls);
-
-
-/**
- * Adapter function between transport plugins and transport receive function
- * manipulation delays for next send.
- *
- * @param cls the closure for transport
- * @param address the address and the peer the message was received from
- * @param message the message received
- * @param session the session the message was received on
- * @return manipulated delay for next receive
- */
-struct GNUNET_TIME_Relative
-GST_manipulation_recv (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- const struct GNUNET_MessageHeader *message);
-
-
-/**
- * Function that will be called to manipulate ATS information according to
- * current manipulation settings
- *
- * @param address binary address
- * @param session the session
- * @param prop[IN|OUT] metrics to modify
- */
-void
-GST_manipulation_manipulate_metrics (const struct GNUNET_HELLO_Address
*address,
- struct GNUNET_ATS_Session *session,
- struct GNUNET_ATS_Properties *prop);
-
-
-/**
- * Notify manipulation about disconnect so it can discard queued messages
- *
- * @param peer the disconnecting peer
- */
-void
-GST_manipulation_peer_disconnect (const struct GNUNET_PeerIdentity *peer);
-
-
-/**
- * Initialize traffic manipulation
- */
-void
-GST_manipulation_init (void);
-
-
-/**
- * Stop traffic manipulation
- */
-void
-GST_manipulation_stop (void);
-
-#endif
-/* end of file gnunet-service-transport_neighbours.h */
diff --git a/src/transport/gnunet-service-transport_neighbours.c
b/src/transport/gnunet-service-transport_neighbours.c
deleted file mode 100644
index e61441d9f..000000000
--- a/src/transport/gnunet-service-transport_neighbours.c
+++ /dev/null
@@ -1,3947 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/gnunet-service-transport_neighbours.c
- * @brief neighbour management
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_ats_service.h"
-#include "gnunet-service-transport_ats.h"
-#include "gnunet-service-transport_neighbours.h"
-#include "gnunet-service-transport_manipulation.h"
-#include "gnunet-service-transport_plugins.h"
-#include "gnunet-service-transport_validation.h"
-#include "gnunet-service-transport.h"
-#include "gnunet_peerinfo_service.h"
-#include "gnunet_constants.h"
-#include "transport.h"
-
-/**
- * Experimental option to ignore SessionQuotaMessages from
- * the other peer.
- */
-#define IGNORE_INBOUND_QUOTA GNUNET_YES
-
-/**
- * Size of the neighbour hash map.
- */
-#define NEIGHBOUR_TABLE_SIZE 256
-
-/**
- * Time we give plugin to transmit DISCONNECT message before the
- * neighbour entry self-destructs.
- */
-#define DISCONNECT_SENT_TIMEOUT GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_MILLISECONDS, 500)
-
-/**
- * How often must a peer violate bandwidth quotas before we start
- * to simply drop its messages?
- */
-#define QUOTA_VIOLATION_DROP_THRESHOLD 10
-
-/**
- * How long are we willing to wait for a response from ATS before timing out?
- */
-#define ATS_RESPONSE_TIMEOUT GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_SECONDS, 5)
-
-/**
- * How long are we willing to wait for an ACK from the other peer before
- * giving up on our connect operation?
- */
-#define SETUP_CONNECTION_TIMEOUT GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_SECONDS, 15)
-
-/**
- * How long are we willing to wait for a successful reconnect if
- * an existing connection went down? Much shorter than the
- * usual SETUP_CONNECTION_TIMEOUT as we do not inform the
- * higher layers about the disconnect during this period.
- */
-#define FAST_RECONNECT_TIMEOUT GNUNET_TIME_UNIT_SECONDS
-
-/**
- * Interval to send utilization data
- */
-#define UTIL_TRANSMISSION_INTERVAL GNUNET_TIME_UNIT_SECONDS
-
-/**
- * State describing which kind a reply this neighbour should send
- */
-enum GST_ACK_State
-{
- /**
- * We did not receive a SYN message for this neighbour
- */
- ACK_UNDEFINED = 0,
-
- /**
- * The neighbour received a SYN message and has to send a SYN_ACK
- * as reply
- */
- ACK_SEND_SYN_ACK = 1,
-
- /**
- * The neighbour sent a SYN_ACK message and has to send a ACK
- * as reply
- */
- ACK_SEND_ACK = 2
-};
-
-
-GNUNET_NETWORK_STRUCT_BEGIN
-
-/**
- * Message a peer sends to another to indicate that it intends to
- * setup a connection/session for data exchange. A 'SESSION_SYN'
- * should be answered with a 'SESSION_SYN_ACK' with the same body
- * to confirm. A 'SESSION_SYN_ACK' should then be followed with
- * a 'ACK'. Once the 'ACK' is received, both peers
- * should be connected.
- */
-struct TransportSynMessage
-{
- /**
- * Header of type #GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_SYN
- * or #GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_SYN_ACK
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Always zero.
- */
- uint32_t reserved GNUNET_PACKED;
-
- /**
- * Absolute time at the sender. Only the most recent connect
- * message implies which session is preferred by the sender.
- */
- struct GNUNET_TIME_AbsoluteNBO timestamp;
-};
-
-
-/**
- * Message a peer sends to another when connected to indicate that a
- * session is in use and the peer is still alive or to respond to a keep alive.
- * A peer sends a message with type
#GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_KEEPALIVE
- * to request a message with
#GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_KEEPALIVE_RESPONSE.
- * When the keep alive response with type is received, transport service
- * will call the respective plugin to update the session timeout
- */
-struct GNUNET_ATS_SessionKeepAliveMessage
-{
- /**
- * Header of type #GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_KEEPALIVE or
- * #GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_KEEPALIVE_RESPONSE.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * A nonce to identify the session the keep alive is used for
- */
- uint32_t nonce GNUNET_PACKED;
-};
-
-
-/**
- * Message a peer sends to another when connected to indicate that
- * the other peer should limit transmissions to the indicated
- * quota.
- */
-struct GNUNET_ATS_SessionQuotaMessage
-{
- /**
- * Header of type #GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_QUOTA.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Quota to use (for sending), in bytes per second.
- */
- uint32_t quota GNUNET_PACKED;
-};
-
-
-/**
- * Message we send to the other peer to notify it that we intentionally
- * are disconnecting (to reduce timeouts). This is just a friendly
- * notification, peers must not rely on always receiving disconnect
- * messages.
- */
-struct GNUNET_ATS_SessionDisconnectMessage
-{
- /**
- * Header of type #GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_DISCONNECT
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Always zero.
- */
- uint32_t reserved GNUNET_PACKED;
-
- /**
- * Purpose of the signature. Extends over the timestamp.
- * Purpose should be #GNUNET_SIGNATURE_PURPOSE_TRANSPORT_DISCONNECT.
- */
- struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
-
- /**
- * Absolute time at the sender. Only the most recent connect
- * message implies which session is preferred by the sender.
- */
- struct GNUNET_TIME_AbsoluteNBO timestamp;
-
- /**
- * Public key of the sender.
- */
- struct GNUNET_CRYPTO_EddsaPublicKey public_key;
-
- /**
- * Signature of the peer that sends us the disconnect. Only
- * valid if the timestamp is AFTER the timestamp from the
- * corresponding 'SYN' message.
- */
- struct GNUNET_CRYPTO_EddsaSignature signature;
-};
-
-GNUNET_NETWORK_STRUCT_END
-
-
-/**
- * For each neighbour we keep a list of messages
- * that we still want to transmit to the neighbour.
- */
-struct MessageQueue
-{
- /**
- * This is a doubly linked list.
- */
- struct MessageQueue *next;
-
- /**
- * This is a doubly linked list.
- */
- struct MessageQueue *prev;
-
- /**
- * Function to call once we're done.
- */
- GST_NeighbourSendContinuation cont;
-
- /**
- * Closure for @e cont
- */
- void *cont_cls;
-
- /**
- * The message(s) we want to transmit, GNUNET_MessageHeader(s)
- * stuck together in memory. Allocated at the end of this struct.
- */
- const char *message_buf;
-
- /**
- * Size of the message buf
- */
- size_t message_buf_size;
-
- /**
- * At what time should we fail?
- */
- struct GNUNET_TIME_Absolute timeout;
-};
-
-
-/**
- * A possible address we could use to communicate with a neighbour.
- */
-struct NeighbourAddress
-{
- /**
- * Active session for this address.
- */
- struct GNUNET_ATS_Session *session;
-
- /**
- * Network-level address information.
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * Timestamp of the 'SESSION_CONNECT' message we sent to the other
- * peer for this address. Use to check that the ACK is in response
- * to our most recent 'SYN'.
- */
- struct GNUNET_TIME_Absolute connect_timestamp;
-
- /**
- * Inbound bandwidth from ATS for this address.
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in;
-
- /**
- * Outbound bandwidth from ATS for this address.
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out;
-
- /**
- * Did we tell ATS that this is our 'active' address?
- */
- int ats_active;
-
- /**
- * The current nonce sent in the last keep alive messages
- */
- uint32_t keep_alive_nonce;
-};
-
-
-/**
- * Entry in neighbours.
- */
-struct NeighbourMapEntry
-{
- /**
- * Head of list of messages we would like to send to this peer;
- * must contain at most one message per client.
- */
- struct MessageQueue *messages_head;
-
- /**
- * Tail of list of messages we would like to send to this peer; must
- * contain at most one message per client.
- */
- struct MessageQueue *messages_tail;
-
- /**
- * Are we currently trying to send a message? If so, which one?
- */
- struct MessageQueue *is_active;
-
- /**
- * Primary address we currently use to communicate with the neighbour.
- */
- struct NeighbourAddress primary_address;
-
- /**
- * Alternative address currently under consideration for communicating
- * with the neighbour.
- */
- struct NeighbourAddress alternative_address;
-
- /**
- * Identity of this neighbour.
- */
- struct GNUNET_PeerIdentity id;
-
- /**
- * Main task that drives this peer (timeouts, keepalives, etc.).
- * Always runs the #master_task().
- */
- struct GNUNET_SCHEDULER_Task *task;
-
- /**
- * Task to disconnect neighbour after we received a DISCONNECT message
- */
- struct GNUNET_SCHEDULER_Task *delayed_disconnect_task;
-
- /**
- * At what time should we sent the next keep-alive message?
- */
- struct GNUNET_TIME_Absolute keep_alive_time;
-
- /**
- * At what time did we sent the last keep-alive message? Used
- * to calculate round-trip time ("latency").
- */
- struct GNUNET_TIME_Absolute last_keep_alive_time;
-
- /**
- * Timestamp we should include in our next SYN_ACK message.
- * (only valid if 'send_connect_ack' is #GNUNET_YES). Used to build
- * our SYN_ACK message.
- */
- struct GNUNET_TIME_Absolute connect_ack_timestamp;
-
- /**
- * ATS address suggest handle
- */
- struct GNUNET_ATS_ConnectivitySuggestHandle *suggest_handle;
-
- /**
- * Time where we should cut the connection (timeout) if we don't
- * make progress in the state machine (or get a KEEPALIVE_RESPONSE
- * if we are in #GNUNET_TRANSPORT_PS_CONNECTED).
- */
- struct GNUNET_TIME_Absolute timeout;
-
- /**
- * Tracker for inbound bandwidth.
- */
- struct GNUNET_BANDWIDTH_Tracker in_tracker;
-
- /**
- * How often has the other peer (recently) violated the inbound
- * traffic limit? Incremented by 10 per violation, decremented by 1
- * per non-violation (for each time interval).
- */
- unsigned int quota_violation_count;
-
- /**
- * Latest quota the other peer send us in bytes per second.
- * We should not send more, least the other peer throttle
- * receiving our traffic.
- */
- struct GNUNET_BANDWIDTH_Value32NBO neighbour_receive_quota;
-
- /**
- * The current state of the peer.
- */
- enum GNUNET_TRANSPORT_PeerState state;
-
- /**
- * Did we sent an KEEP_ALIVE message and are we expecting a response?
- */
- int expect_latency_response;
-
- /**
- * When a peer wants to connect we have to reply to the 1st SYN message
- * with a SYN_ACK message. But sometime we cannot send this message
- * immediately since we do not have an address and then we have to remember
- * to send this message as soon as we have an address.
- *
- * Flag to set if we still need to send a SYN_ACK message to the other peer
- * (once we have an address to use and the peer has been allowed by our
- * blacklist). Initially set to #ACK_UNDEFINED. Set to #ACK_SEND_SYN_ACK
- * if we need to send a SYN_ACK. Set to #ACK_SEND_ACK if we did
- * send a SYN_ACK and should go to #S_CONNECTED upon receiving a
- * 'ACK' (regardless of what our own state machine might say).
- */
- enum GST_ACK_State ack_state;
-
- /**
- * Tracking utilization of outbound bandwidth
- */
- uint32_t util_total_bytes_sent;
-
- /**
- * Tracking utilization of inbound bandwidth
- */
- uint32_t util_total_bytes_recv;
-
- /**
- * Date of last utilization transmission
- */
- struct GNUNET_TIME_Absolute last_util_transmission;
-};
-
-
-/**
- * Hash map from peer identities to the respective `struct NeighbourMapEntry`.
- */
-static struct GNUNET_CONTAINER_MultiPeerMap *neighbours;
-
-/**
- * List of pending blacklist checks: head
- */
-static struct BlacklistCheckSwitchContext *pending_bc_head;
-
-/**
- * List of pending blacklist checks: tail
- */
-static struct BlacklistCheckSwitchContext *pending_bc_tail;
-
-/**
- * counter for connected neighbours
- */
-static unsigned int neighbours_connected;
-
-/**
- * Number of bytes we have currently queued for transmission.
- */
-static unsigned long long bytes_in_send_queue;
-
-/**
- * Task transmitting utilization data
- */
-static struct GNUNET_SCHEDULER_Task *util_transmission_tk;
-
-
-/**
- * Convert the given ACK state to a string.
- *
- * @param s state
- * @return corresponding human-readable string
- */
-static char *
-print_ack_state (enum GST_ACK_State s)
-{
- switch (s)
- {
- case ACK_UNDEFINED:
- return "UNDEFINED";
-
- case ACK_SEND_SYN_ACK:
- return "SEND_SYN_ACK";
-
- case ACK_SEND_ACK:
- return "SEND_ACK";
-
- default:
- GNUNET_break (0);
- return "N/A";
- }
-}
-
-
-/**
- * Send information about a new outbound quota to our clients.
- * Note that the outbound quota is enforced client-side (i.e.
- * in libgnunettransport).
- *
- * @param n affected peer
- */
-static void
-send_outbound_quota_to_clients (struct NeighbourMapEntry *n)
-{
- struct QuotaSetMessage q_msg;
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_min;
-
- if (! GNUNET_TRANSPORT_is_connected (n->state))
- return;
-#if IGNORE_INBOUND_QUOTA
- bandwidth_min = n->primary_address.bandwidth_out;
-#else
- bandwidth_min = GNUNET_BANDWIDTH_value_min (n->primary_address.bandwidth_out,
- n->neighbour_receive_quota);
-#endif
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Sending outbound quota of %u Bps for peer `%s' to all
clients\n",
- ntohl (bandwidth_min.value__),
- GNUNET_i2s (&n->id));
- q_msg.header.size = htons (sizeof(struct QuotaSetMessage));
- q_msg.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_SET_QUOTA);
- q_msg.quota = bandwidth_min;
- q_msg.peer = n->id;
- GST_clients_broadcast (&q_msg.header,
- GNUNET_NO);
-}
-
-
-/**
- * Notify our clients that another peer connected to us.
- *
- * @param n the peer that connected
- */
-static void
-neighbours_connect_notification (struct NeighbourMapEntry *n)
-{
- size_t len = sizeof(struct ConnectInfoMessage);
- char buf[len] GNUNET_ALIGN;
- struct ConnectInfoMessage *connect_msg = (struct ConnectInfoMessage *) buf;
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_min;
-
-#if IGNORE_INBOUND_QUOTA
- bandwidth_min = n->primary_address.bandwidth_out;
-#else
- bandwidth_min = GNUNET_BANDWIDTH_value_min (n->primary_address.bandwidth_out,
- n->neighbour_receive_quota);
-#endif
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "We are now connected to peer `%s'\n",
- GNUNET_i2s (&n->id));
- connect_msg->header.size = htons (sizeof(buf));
- connect_msg->header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_CONNECT);
- connect_msg->id = n->id;
- connect_msg->quota_out = bandwidth_min;
- GST_clients_broadcast (&connect_msg->header,
- GNUNET_NO);
-}
-
-
-/**
- * Notify our clients (and manipulation) that a peer disconnected from
- * us.
- *
- * @param n the peer that disconnected
- */
-static void
-neighbours_disconnect_notification (struct NeighbourMapEntry *n)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Peer `%s' disconnected\n",
- GNUNET_i2s (&n->id));
- GST_manipulation_peer_disconnect (&n->id);
- GST_clients_broadcast_disconnect (&n->id);
-}
-
-
-/**
- * Notify transport clients that a neighbour peer changed its active
- * address.
- *
- * @param peer identity of the peer
- * @param address address possibly NULL if peer is not connected
- * @param state current state this peer is in
- * @param state_timeout timeout for the current state of the peer
- * @param bandwidth_in bandwidth assigned inbound, 0 on disconnect
- * @param bandwidth_out bandwidth assigned outbound, 0 on disconnect
- */
-static void
-neighbours_changed_notification (const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Address *address,
- enum GNUNET_TRANSPORT_PeerState state,
- struct GNUNET_TIME_Absolute state_timeout,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_in,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_out)
-{
- (void) bandwidth_in;
- (void) bandwidth_out;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Notifying about change for peer `%s' with address `%s' in state
`%s' timing out at %s\n",
- GNUNET_i2s (peer),
- GST_plugins_a2s (address),
- GNUNET_TRANSPORT_ps2s (state),
- GNUNET_STRINGS_absolute_time_to_string (state_timeout));
- /* FIXME: include bandwidth in notification! */
- GST_clients_broadcast_peer_notification (peer,
- address,
- state,
- state_timeout);
-}
-
-
-/**
- * Lookup a neighbour entry in the neighbours hash map.
- *
- * @param pid identity of the peer to look up
- * @return the entry, NULL if there is no existing record
- */
-static struct NeighbourMapEntry *
-lookup_neighbour (const struct GNUNET_PeerIdentity *pid)
-{
- if (NULL == neighbours)
- return NULL;
- return GNUNET_CONTAINER_multipeermap_get (neighbours, pid);
-}
-
-
-/**
- * Test if we're connected to the given peer.
- *
- * @param n neighbour entry of peer to test
- * @return #GNUNET_YES if we are connected, #GNUNET_NO if not
- */
-static int
-test_connected (struct NeighbourMapEntry *n)
-{
- if (NULL == n)
- return GNUNET_NO;
- return GNUNET_TRANSPORT_is_connected (n->state);
-}
-
-
-/**
- * We don't need a given neighbour address any more.
- * Release its resources and give appropriate notifications
- * to ATS and other subsystems.
- *
- * @param na address we are done with; @a na itself must NOT be 'free'd, only
the contents!
- */
-static void
-free_address (struct NeighbourAddress *na)
-{
- if (GNUNET_YES == na->ats_active)
- GST_validation_set_address_use (na->address,
- GNUNET_NO);
- if (NULL != na->address)
- {
- GST_ats_block_address (na->address,
- na->session);
- GNUNET_HELLO_address_free (na->address);
- na->address = NULL;
- }
- na->bandwidth_in = GNUNET_BANDWIDTH_value_init (0);
- na->bandwidth_out = GNUNET_BANDWIDTH_value_init (0);
- na->ats_active = GNUNET_NO;
- na->keep_alive_nonce = 0;
- na->session = NULL;
-}
-
-
-/**
- * Master task run for every neighbour. Performs all of the time-related
- * activities (keep alive, send next message, disconnect if idle, finish
- * clean up after disconnect).
- *
- * @param cls the `struct NeighbourMapEntry` for which we are running
- */
-static void
-master_task (void *cls);
-
-
-/**
- * Set net state and state timeout for this neighbour and notify monitoring
- *
- * @param n the respective neighbour
- * @param s the new state
- * @param timeout the new timeout
- */
-static void
-set_state_and_timeout (struct NeighbourMapEntry *n,
- enum GNUNET_TRANSPORT_PeerState s,
- struct GNUNET_TIME_Absolute timeout)
-{
- if (GNUNET_TRANSPORT_is_connected (s) &&
- (! GNUNET_TRANSPORT_is_connected (n->state)))
- {
- neighbours_connect_notification (n);
- GNUNET_STATISTICS_set (GST_stats,
- gettext_noop ("# peers connected"),
- ++neighbours_connected,
- GNUNET_NO);
- }
- if ((! GNUNET_TRANSPORT_is_connected (s)) &&
- GNUNET_TRANSPORT_is_connected (n->state))
- {
- GNUNET_STATISTICS_set (GST_stats,
- gettext_noop ("# peers connected"),
- --neighbours_connected,
- GNUNET_NO);
- neighbours_disconnect_notification (n);
- }
- n->state = s;
- if ((timeout.abs_value_us < n->timeout.abs_value_us) &&
- (NULL != n->task))
- {
- /* new timeout is earlier, reschedule master task */
- GNUNET_SCHEDULER_cancel (n->task);
- n->task = GNUNET_SCHEDULER_add_at (timeout,
- &master_task,
- n);
- }
- n->timeout = timeout;
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Neighbour `%s' changed state to %s with timeout %s\n",
- GNUNET_i2s (&n->id),
- GNUNET_TRANSPORT_ps2s (s),
- GNUNET_STRINGS_absolute_time_to_string (timeout));
- neighbours_changed_notification (&n->id,
- n->primary_address.address,
- n->state,
- n->timeout,
- n->primary_address.bandwidth_in,
- n->primary_address.bandwidth_out);
-}
-
-
-/**
- * Initialize the alternative address of a neighbour
- *
- * @param n the neighbour
- * @param address address of the other peer, NULL if other peer
- * connected to us
- * @param session session to use (or NULL, in which case an
- * address must be setup)
- * @param bandwidth_in inbound quota to be used when connection is up
- * @param bandwidth_out outbound quota to be used when connection is up
- */
-static void
-set_alternative_address (struct NeighbourMapEntry *n,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out)
-{
- struct GNUNET_TRANSPORT_PluginFunctions *papi;
-
- if (NULL == (papi = GST_plugins_find (address->transport_name)))
- {
- GNUNET_break (0);
- return;
- }
- if (session == n->alternative_address.session)
- {
- n->alternative_address.bandwidth_in = bandwidth_in;
- n->alternative_address.bandwidth_out = bandwidth_out;
- return;
- }
- if (NULL != n->alternative_address.address)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Replacing existing alternative address with another one\n");
- free_address (&n->alternative_address);
- }
- if (NULL == session)
- session = papi->get_session (papi->cls,
- address);
- if (NULL == session)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Failed to obtain new session for peer `%s' and address
'%s'\n",
- GNUNET_i2s (&address->peer),
- GST_plugins_a2s (address));
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# session creation failed"),
- 1,
- GNUNET_NO);
- return;
- }
- GST_ats_new_session (address,
- session);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Neighbour `%s' configured alternative address %s\n",
- GNUNET_i2s (&n->id),
- GST_plugins_a2s (address));
-
- n->alternative_address.address = GNUNET_HELLO_address_copy (address);
- n->alternative_address.bandwidth_in = bandwidth_in;
- n->alternative_address.bandwidth_out = bandwidth_out;
- n->alternative_address.session = session;
- n->alternative_address.ats_active = GNUNET_NO;
- n->alternative_address.keep_alive_nonce = 0;
- GNUNET_assert (GNUNET_YES ==
- GST_ats_is_known (n->alternative_address.address,
- n->alternative_address.session));
-}
-
-
-/**
- * Transmit a message using the current session of the given
- * neighbour.
- *
- * @param n entry for the recipient
- * @param msgbuf buffer to transmit
- * @param msgbuf_size number of bytes in @a msgbuf buffer
- * @param priority transmission priority
- * @param timeout transmission timeout
- * @param use_keepalive_timeout #GNUNET_YES to use plugin-specific keep-alive
- * timeout (@a timeout is ignored in that case), #GNUNET_NO otherwise
- * @param cont continuation to call when finished (can be NULL)
- * @param cont_cls closure for @a cont
- * @return timeout (copy of @a timeout or a calculated one if
- * @a use_keepalive_timeout is #GNUNET_YES.
- */
-static struct GNUNET_TIME_Relative
-send_with_session (struct NeighbourMapEntry *n,
- const void *msgbuf,
- size_t msgbuf_size,
- uint32_t priority,
- struct GNUNET_TIME_Relative timeout,
- unsigned int use_keepalive_timeout,
- GNUNET_TRANSPORT_TransmitContinuation cont,
- void *cont_cls)
-{
- struct GNUNET_TRANSPORT_PluginFunctions *papi;
- struct GNUNET_TIME_Relative result = GNUNET_TIME_UNIT_FOREVER_REL;
-
- GNUNET_assert (NULL != n->primary_address.session);
- if ((((NULL == (papi = GST_plugins_find (
- n->primary_address.address->transport_name))) ||
- (-1 == papi->send (papi->cls,
- n->primary_address.session,
- msgbuf,
- msgbuf_size,
- priority,
- (result = (GNUNET_NO == use_keepalive_timeout) ?
- timeout :
- GNUNET_TIME_relative_divide (
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
- papi->
- query_keepalive_factor (papi->cls))),
- cont,
- cont_cls)))) &&
- (NULL != cont))
- cont (cont_cls,
- &n->id,
- GNUNET_SYSERR,
- msgbuf_size,
- 0);
- GST_neighbours_notify_data_sent (n->primary_address.address,
- n->primary_address.session,
- msgbuf_size);
- GNUNET_break (NULL != papi);
- return result;
-}
-
-
-/**
- * Clear the primary address of a neighbour since this address is not
- * valid anymore and notify monitoring about it
- *
- * @param n the neighbour
- */
-static void
-unset_primary_address (struct NeighbourMapEntry *n)
-{
- /* Notify monitoring about change */
- if (NULL == n->primary_address.address)
- return;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Disabling primary address\n");
- neighbours_changed_notification (&n->id,
- n->primary_address.address,
- n->state,
- n->timeout,
- GNUNET_BANDWIDTH_value_init (0),
- GNUNET_BANDWIDTH_value_init (0));
- free_address (&n->primary_address);
-}
-
-
-/**
- * Free a neighbour map entry.
- *
- * @param n entry to free
- */
-static void
-free_neighbour (struct NeighbourMapEntry *n)
-{
- struct MessageQueue *mq;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Freeing neighbour state of peer `%s'\n",
- GNUNET_i2s (&n->id));
- n->is_active = NULL; /* always free'd by its own continuation! */
-
- /* fail messages currently in the queue */
- while (NULL != (mq = n->messages_head))
- {
- GNUNET_CONTAINER_DLL_remove (n->messages_head,
- n->messages_tail,
- mq);
- if (NULL != mq->cont)
- mq->cont (mq->cont_cls,
- GNUNET_SYSERR,
- mq->message_buf_size,
- 0);
- GNUNET_free (mq);
- }
- /* Mark peer as disconnected */
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_DISCONNECT_FINISHED,
- GNUNET_TIME_UNIT_FOREVER_ABS);
- /* free addresses and mark as unused */
- unset_primary_address (n);
-
- if (NULL != n->alternative_address.address)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Cleaning up alternative address\n");
- free_address (&n->alternative_address);
- }
- GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove (neighbours,
- &n->id,
- n));
-
- /* Cancel address requests for this peer */
- if (NULL != n->suggest_handle)
- {
- GNUNET_ATS_connectivity_suggest_cancel (n->suggest_handle);
- n->suggest_handle = NULL;
- }
-
- /* Cancel the disconnect task */
- if (NULL != n->delayed_disconnect_task)
- {
- GNUNET_SCHEDULER_cancel (n->delayed_disconnect_task);
- n->delayed_disconnect_task = NULL;
- }
-
- /* Cancel the master task */
- if (NULL != n->task)
- {
- GNUNET_SCHEDULER_cancel (n->task);
- n->task = NULL;
- }
- /* free rest of memory */
- GNUNET_free (n);
-}
-
-
-/**
- * Function called when the 'DISCONNECT' message has been sent by the
- * plugin. Frees the neighbour --- if the entry still exists.
- *
- * @param cls NULL
- * @param target identity of the neighbour that was disconnected
- * @param result #GNUNET_OK if the disconnect got out successfully
- * @param payload bytes payload
- * @param physical bytes on wire
- */
-static void
-send_disconnect_cont (void *cls,
- const struct GNUNET_PeerIdentity *target,
- int result,
- size_t payload,
- size_t physical)
-{
- struct NeighbourMapEntry *n;
-
- (void) cls;
- (void) result;
- (void) payload;
- (void) physical;
- n = lookup_neighbour (target);
- if (NULL == n)
- return; /* already gone */
- if (GNUNET_TRANSPORT_PS_DISCONNECT != n->state)
- return; /* have created a fresh entry since */
- if (NULL != n->task)
- GNUNET_SCHEDULER_cancel (n->task);
- n->task = GNUNET_SCHEDULER_add_now (&master_task, n);
-}
-
-
-/**
- * Transmit a DISCONNECT message to the other peer.
- *
- * @param n neighbour to send DISCONNECT message.
- */
-static void
-send_disconnect (struct NeighbourMapEntry *n)
-{
- struct GNUNET_ATS_SessionDisconnectMessage disconnect_msg;
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Sending DISCONNECT message to peer `%4s'\n",
- GNUNET_i2s (&n->id));
- disconnect_msg.header.size = htons (sizeof(struct
-
GNUNET_ATS_SessionDisconnectMessage));
- disconnect_msg.header.type =
- htons (GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_DISCONNECT);
- disconnect_msg.reserved = htonl (0);
- disconnect_msg.purpose.size =
- htonl (sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)
- + sizeof(struct GNUNET_CRYPTO_EddsaPublicKey)
- + sizeof(struct GNUNET_TIME_AbsoluteNBO));
- disconnect_msg.purpose.purpose =
- htonl (GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_DISCONNECT);
- disconnect_msg.timestamp =
- GNUNET_TIME_absolute_hton (GNUNET_TIME_absolute_get ());
- disconnect_msg.public_key = GST_my_identity.public_key;
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CRYPTO_eddsa_sign_ (&GST_my_private_key,
- &disconnect_msg.purpose,
- &disconnect_msg.signature));
-
- (void) send_with_session (n,
- &disconnect_msg,
- sizeof(disconnect_msg),
- UINT32_MAX,
- GNUNET_TIME_UNIT_FOREVER_REL,
- GNUNET_NO,
- &send_disconnect_cont,
- NULL);
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# DISCONNECT messages sent"),
- 1,
- GNUNET_NO);
-}
-
-
-/**
- * Disconnect from the given neighbour, clean up the record.
- *
- * @param n neighbour to disconnect from
- */
-static void
-disconnect_neighbour (struct NeighbourMapEntry *n)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Disconnecting from peer %s in state %s\n",
- GNUNET_i2s (&n->id),
- GNUNET_TRANSPORT_ps2s (n->state));
- /* depending on state, notify neighbour and/or upper layers of this peer
- about disconnect */
- switch (n->state)
- {
- case GNUNET_TRANSPORT_PS_NOT_CONNECTED:
- case GNUNET_TRANSPORT_PS_INIT_ATS:
- /* other peer is completely unaware of us, no need to send DISCONNECT */
- free_neighbour (n);
- return;
-
- case GNUNET_TRANSPORT_PS_SYN_SENT:
- send_disconnect (n);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_DISCONNECT,
- GNUNET_TIME_UNIT_FOREVER_ABS);
- break;
-
- case GNUNET_TRANSPORT_PS_SYN_RECV_ATS:
- /* we never ACK'ed the other peer's request, no need to send DISCONNECT */
- free_neighbour (n);
- return;
-
- case GNUNET_TRANSPORT_PS_SYN_RECV_ACK:
- /* we DID ACK the other peer's request, must send DISCONNECT */
- send_disconnect (n);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_DISCONNECT,
- GNUNET_TIME_UNIT_FOREVER_ABS);
- break;
-
- case GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT:
- case GNUNET_TRANSPORT_PS_CONNECTED:
- case GNUNET_TRANSPORT_PS_RECONNECT_SENT:
- /* we are currently connected, need to send disconnect and do
- internal notifications and update statistics */
- send_disconnect (n);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_DISCONNECT,
- GNUNET_TIME_UNIT_FOREVER_ABS);
- break;
-
- case GNUNET_TRANSPORT_PS_RECONNECT_ATS:
- /* Disconnecting while waiting for an ATS address to reconnect,
- * cannot send DISCONNECT */
- free_neighbour (n);
- return;
-
- case GNUNET_TRANSPORT_PS_DISCONNECT:
- /* already disconnected, ignore */
- break;
-
- case GNUNET_TRANSPORT_PS_DISCONNECT_FINISHED:
- /* already cleaned up, how did we get here!? */
- GNUNET_assert (0);
- break;
-
- default:
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unhandled state `%s'\n",
- GNUNET_TRANSPORT_ps2s (n->state));
- GNUNET_break (0);
- break;
- }
- /* schedule timeout to clean up */
- if (NULL != n->task)
- GNUNET_SCHEDULER_cancel (n->task);
- n->task = GNUNET_SCHEDULER_add_delayed (DISCONNECT_SENT_TIMEOUT,
- &master_task,
- n);
-}
-
-
-/**
- * Change the incoming quota for the given peer. Updates
- * our own receive rate and informs the neighbour about
- * the new quota.
- *
- * @param n neighbour entry to change quota for
- * @param quota new quota
- * @return #GNUNET_YES if @a n is still valid, #GNUNET_NO if
- * @a n was freed
- */
-static int
-set_incoming_quota (struct NeighbourMapEntry *n,
- struct GNUNET_BANDWIDTH_Value32NBO quota)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Setting inbound quota of %u Bps for peer `%s' to all clients\n",
- ntohl (quota.value__), GNUNET_i2s (&n->id));
- GNUNET_BANDWIDTH_tracker_update_quota (&n->in_tracker,
- quota);
- if (0 != ntohl (quota.value__))
- {
- struct GNUNET_ATS_SessionQuotaMessage sqm;
-
- sqm.header.size = htons (sizeof(struct GNUNET_ATS_SessionQuotaMessage));
- sqm.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_QUOTA);
- sqm.quota = quota.value__;
- if (NULL != n->primary_address.session)
- (void) send_with_session (n,
- &sqm,
- sizeof(sqm),
- UINT32_MAX - 1,
- GNUNET_TIME_UNIT_FOREVER_REL,
- GNUNET_NO,
- NULL, NULL);
- return GNUNET_YES;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Disconnecting peer `%s' due to SET_QUOTA\n",
- GNUNET_i2s (&n->id));
- if (GNUNET_YES == test_connected (n))
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# disconnects due to quota of 0"),
- 1, GNUNET_NO);
- disconnect_neighbour (n);
- return GNUNET_NO;
-}
-
-
-/**
- * Initialize the primary address of a neighbour
- *
- * @param n the neighbour
- * @param address address of the other peer, NULL if other peer
- * connected to us
- * @param session session to use (or NULL, in which case an
- * address must be setup)
- * @param bandwidth_in inbound quota to be used when connection is up
- * @param bandwidth_out outbound quota to be used when connection is up
- */
-static void
-set_primary_address (struct NeighbourMapEntry *n,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out)
-{
- if (session == n->primary_address.session)
- {
- GST_validation_set_address_use (n->primary_address.address,
- GNUNET_YES);
- if (n->primary_address.bandwidth_in.value__ != bandwidth_in.value__)
- {
- n->primary_address.bandwidth_in = bandwidth_in;
- if (GNUNET_YES !=
- set_incoming_quota (n,
- bandwidth_in))
- return;
- }
- if (n->primary_address.bandwidth_out.value__ != bandwidth_out.value__)
- {
- n->primary_address.bandwidth_out = bandwidth_out;
- send_outbound_quota_to_clients (n);
- }
- return;
- }
- if ((NULL != n->primary_address.address) &&
- (0 == GNUNET_HELLO_address_cmp (address,
- n->primary_address.address)))
- {
- GNUNET_break (0);
- return;
- }
- if (NULL == session)
- {
- GNUNET_break (0);
- GST_ats_block_address (address,
- session);
- return;
- }
- if (NULL != n->primary_address.address)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Replacing existing primary address with another one\n");
- free_address (&n->primary_address);
- }
- n->primary_address.address = GNUNET_HELLO_address_copy (address);
- n->primary_address.bandwidth_in = bandwidth_in;
- n->primary_address.bandwidth_out = bandwidth_out;
- n->primary_address.session = session;
- n->primary_address.keep_alive_nonce = 0;
- GNUNET_assert (GNUNET_YES ==
- GST_ats_is_known (n->primary_address.address,
- n->primary_address.session));
- /* subsystems about address use */
- GST_validation_set_address_use (n->primary_address.address,
- GNUNET_YES);
- if (GNUNET_YES !=
- set_incoming_quota (n,
- bandwidth_in))
- return;
- send_outbound_quota_to_clients (n);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Neighbour `%s' switched to address `%s'\n",
- GNUNET_i2s (&n->id),
- GST_plugins_a2s (address));
-
- neighbours_changed_notification (&n->id,
- n->primary_address.address,
- n->state,
- n->timeout,
- n->primary_address.bandwidth_in,
- n->primary_address.bandwidth_out);
-}
-
-
-/**
- * We're done with our transmission attempt, continue processing.
- *
- * @param cls the `struct MessageQueue` of the message
- * @param receiver intended receiver
- * @param success whether it worked or not
- * @param size_payload bytes payload sent
- * @param physical bytes sent on wire
- */
-static void
-transmit_send_continuation (void *cls,
- const struct GNUNET_PeerIdentity *receiver,
- int success,
- size_t size_payload,
- size_t physical)
-{
- struct MessageQueue *mq = cls;
- struct NeighbourMapEntry *n;
-
- if (NULL == (n = lookup_neighbour (receiver)))
- {
- if (NULL != mq->cont)
- mq->cont (mq->cont_cls,
- GNUNET_SYSERR /* not connected */,
- size_payload,
- 0);
- GNUNET_free (mq);
- return; /* disconnect or other error while transmitting, can happen */
- }
- if (n->is_active == mq)
- {
- /* this is still "our" neighbour, remove us from its queue
- and allow it to send the next message now */
- n->is_active = NULL;
- if (NULL != n->task)
- GNUNET_SCHEDULER_cancel (n->task);
- n->task = GNUNET_SCHEDULER_add_now (&master_task,
- n);
- }
- if (bytes_in_send_queue < mq->message_buf_size)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Bytes_in_send_queue `%llu', Message_size %u, result: %s,
payload %u, on wire %u\n",
- bytes_in_send_queue,
- (unsigned int) mq->message_buf_size,
- (GNUNET_OK == success) ? "OK" : "FAIL",
- (unsigned int) size_payload,
- (unsigned int) physical);
- GNUNET_break (0);
- }
-
- GNUNET_break (size_payload == mq->message_buf_size);
- bytes_in_send_queue -= mq->message_buf_size;
- GNUNET_STATISTICS_set (GST_stats,
- gettext_noop (
- "# bytes in message queue for other peers"),
- bytes_in_send_queue,
- GNUNET_NO);
- if (GNUNET_OK == success)
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# messages transmitted to other peers"),
- 1,
- GNUNET_NO);
- else
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- (
- "# transmission failures for messages to other
peers"),
- 1, GNUNET_NO);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Sending message to `%s' of type %u with %u bytes was a %s\n",
- GNUNET_i2s (receiver),
- ntohs (((struct GNUNET_MessageHeader *) mq->message_buf)->type),
- (unsigned int) mq->message_buf_size,
- (success == GNUNET_OK) ? "success" : "FAILURE");
- if (NULL != mq->cont)
- mq->cont (mq->cont_cls,
- success,
- size_payload,
- physical);
- GNUNET_free (mq);
-}
-
-
-/**
- * Check the message list for the given neighbour and if we can
- * send a message, do so. This function should only be called
- * if the connection is at least generally ready for transmission.
- * While we will only send one message at a time, no bandwidth
- * quota management is performed here. If a message was given to
- * the plugin, the continuation will automatically re-schedule
- * the 'master' task once the next message might be transmitted.
- *
- * @param n target peer for which to transmit
- */
-static void
-try_transmission_to_peer (struct NeighbourMapEntry *n)
-{
- struct MessageQueue *mq;
- struct GNUNET_TIME_Relative timeout;
-
- if (NULL == n->primary_address.address)
- {
- /* no address, why are we here? */
- GNUNET_break (0);
- return;
- }
- if ((0 == n->primary_address.address->address_length) &&
- (NULL == n->primary_address.session))
- {
- /* no address, why are we here? */
- GNUNET_break (0);
- return;
- }
- if (NULL != n->is_active)
- {
- /* transmission already pending */
- return;
- }
-
- /* timeout messages from the queue that are past their due date */
- while (NULL != (mq = n->messages_head))
- {
- timeout = GNUNET_TIME_absolute_get_remaining (mq->timeout);
- if (timeout.rel_value_us > 0)
- break;
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# messages timed out while in transport
queue"),
- 1,
- GNUNET_NO);
- GNUNET_CONTAINER_DLL_remove (n->messages_head,
- n->messages_tail,
- mq);
- n->is_active = mq;
- transmit_send_continuation (mq,
- &n->id,
- GNUNET_SYSERR,
- mq->message_buf_size,
- 0); /* timeout */
- }
- if (NULL == mq)
- return; /* no more messages */
- if (NULL == n->primary_address.address)
- {
- /* transmit_send_continuation() caused us to drop session,
- can't try transmission anymore. */
- return;
- }
-
-
- GNUNET_CONTAINER_DLL_remove (n->messages_head,
- n->messages_tail,
- mq);
- n->is_active = mq;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Giving message with %u bytes to plugin session %p\n",
- (unsigned int) mq->message_buf_size,
- n->primary_address.session);
- (void) send_with_session (n,
- mq->message_buf,
- mq->message_buf_size,
- 0 /* priority */,
- timeout,
- GNUNET_NO,
- &transmit_send_continuation,
- mq);
-}
-
-
-/**
- * Send keepalive message to the neighbour. Must only be called
- * if we are on 'connected' state or while trying to switch addresses.
- * Will internally determine if a keepalive is truly needed (so can
- * always be called).
- *
- * @param n neighbour that went idle and needs a keepalive
- */
-static void
-send_keepalive (struct NeighbourMapEntry *n)
-{
- struct GNUNET_ATS_SessionKeepAliveMessage m;
- struct GNUNET_TIME_Relative timeout;
- uint32_t nonce;
-
- GNUNET_assert ((GNUNET_TRANSPORT_PS_CONNECTED == n->state) ||
- (GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT == n->state));
- if (GNUNET_TIME_absolute_get_remaining (n->keep_alive_time).rel_value_us > 0)
- return; /* no keepalive needed at this time */
-
- nonce = 0; /* 0 indicates 'not set' */
- while (0 == nonce)
- nonce = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE,
- UINT32_MAX);
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Sending KEEPALIVE to peer `%s' with nonce %u\n",
- GNUNET_i2s (&n->id),
- nonce);
- m.header.size = htons (sizeof(struct GNUNET_ATS_SessionKeepAliveMessage));
- m.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_KEEPALIVE);
- m.nonce = htonl (nonce);
-
- timeout = send_with_session (n,
- &m,
- sizeof(m),
- UINT32_MAX /* priority */,
- GNUNET_TIME_UNIT_FOREVER_REL,
- GNUNET_YES,
- NULL, NULL);
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# KEEPALIVES sent"),
- 1,
- GNUNET_NO);
- n->primary_address.keep_alive_nonce = nonce;
- n->expect_latency_response = GNUNET_YES;
- n->last_keep_alive_time = GNUNET_TIME_absolute_get ();
- n->keep_alive_time = GNUNET_TIME_relative_to_absolute (timeout);
-}
-
-
-/**
- * Keep the connection to the given neighbour alive longer,
- * we received a KEEPALIVE (or equivalent); send a response.
- *
- * @param neighbour neighbour to keep alive (by sending keep alive response)
- * @param m the keep alive message containing the nonce to respond to
- */
-void
-GST_neighbours_keepalive (const struct GNUNET_PeerIdentity *neighbour,
- const struct GNUNET_MessageHeader *m)
-{
- struct NeighbourMapEntry *n;
- const struct GNUNET_ATS_SessionKeepAliveMessage *msg_in;
- struct GNUNET_ATS_SessionKeepAliveMessage msg;
-
- if (sizeof(struct GNUNET_ATS_SessionKeepAliveMessage) != ntohs (m->size))
- {
- GNUNET_break_op (0);
- return;
- }
-
- msg_in = (const struct GNUNET_ATS_SessionKeepAliveMessage *) m;
- if (NULL == (n = lookup_neighbour (neighbour)))
- {
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# KEEPALIVE messages discarded (peer
unknown)"),
- 1, GNUNET_NO);
- return;
- }
- if (NULL == n->primary_address.session)
- {
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# KEEPALIVE messages discarded (no
session)"),
- 1, GNUNET_NO);
- return;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received KEEPALIVE request from peer `%s' with nonce %u\n",
- GNUNET_i2s (&n->id),
- ntohl (msg_in->nonce));
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# KEEPALIVES received in good order"),
- 1,
- GNUNET_NO);
-
- /* send reply to allow neighbour to measure latency */
- msg.header.size = htons (sizeof(struct GNUNET_ATS_SessionKeepAliveMessage));
- msg.header.type = htons (
- GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_KEEPALIVE_RESPONSE);
- msg.nonce = msg_in->nonce;
- (void) send_with_session (n,
- &msg,
- sizeof(struct GNUNET_ATS_SessionKeepAliveMessage),
- UINT32_MAX /* priority */,
- GNUNET_TIME_UNIT_FOREVER_REL,
- GNUNET_YES,
- NULL, NULL);
-}
-
-
-/**
- * We received a KEEP_ALIVE_RESPONSE message and use this to calculate
- * latency to this peer. Pass the updated information (existing ats
- * plus calculated latency) to ATS.
- *
- * @param neighbour neighbour to keep alive
- * @param m the message containing the keep alive response
- */
-void
-GST_neighbours_keepalive_response (const struct GNUNET_PeerIdentity *neighbour,
- const struct GNUNET_MessageHeader *m)
-{
- struct NeighbourMapEntry *n;
- const struct GNUNET_ATS_SessionKeepAliveMessage *msg;
- struct GNUNET_TRANSPORT_PluginFunctions *papi;
- struct GNUNET_TIME_Relative latency;
-
- if (sizeof(struct GNUNET_ATS_SessionKeepAliveMessage) != ntohs (m->size))
- {
- GNUNET_break_op (0);
- return;
- }
-
- msg = (const struct GNUNET_ATS_SessionKeepAliveMessage *) m;
- if (NULL == (n = lookup_neighbour (neighbour)))
- {
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# KEEPALIVE_RESPONSEs discarded (not
connected)"),
- 1,
- GNUNET_NO);
- return;
- }
- if ((GNUNET_TRANSPORT_PS_CONNECTED != n->state) ||
- (GNUNET_YES != n->expect_latency_response))
- {
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# KEEPALIVE_RESPONSEs discarded (not
expected)"),
- 1,
- GNUNET_NO);
- return;
- }
- if (NULL == n->primary_address.address)
- {
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# KEEPALIVE_RESPONSEs discarded (address
changed)"),
- 1,
- GNUNET_NO);
- return;
- }
- if (n->primary_address.keep_alive_nonce != ntohl (msg->nonce))
- {
- if (0 == n->primary_address.keep_alive_nonce)
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# KEEPALIVE_RESPONSEs discarded (no
nonce)"),
- 1,
- GNUNET_NO);
- else
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# KEEPALIVE_RESPONSEs discarded (bad
nonce)"),
- 1,
- GNUNET_NO);
- return;
- }
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# KEEPALIVE_RESPONSEs received (OK)"),
- 1,
- GNUNET_NO);
-
-
- /* Update session timeout here */
- if (NULL != (papi = GST_plugins_find (
- n->primary_address.address->transport_name)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Updating session for peer `%s' for session %p\n",
- GNUNET_i2s (&n->id),
- n->primary_address.session);
- papi->update_session_timeout (papi->cls,
- &n->id,
- n->primary_address.session);
- }
- else
- {
- GNUNET_break (0);
- }
-
- n->primary_address.keep_alive_nonce = 0;
- n->expect_latency_response = GNUNET_NO;
- set_state_and_timeout (n,
- n->state,
- GNUNET_TIME_relative_to_absolute (
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT));
-
- latency = GNUNET_TIME_absolute_get_duration (n->last_keep_alive_time);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received KEEPALIVE_RESPONSE from peer `%s', latency is %s\n",
- GNUNET_i2s (&n->id),
- GNUNET_STRINGS_relative_time_to_string (latency,
- GNUNET_YES));
- GST_ats_update_delay (n->primary_address.address,
- GNUNET_TIME_relative_divide (latency,
- 2));
-}
-
-
-/**
- * We have received a message from the given sender. How long should
- * we delay before receiving more? (Also used to keep the peer marked
- * as live).
- *
- * @param sender sender of the message
- * @param size size of the message
- * @param do_forward set to #GNUNET_YES if the message should be forwarded to
clients
- * #GNUNET_NO if the neighbour is not connected or violates
the quota,
- * #GNUNET_SYSERR if the connection is not fully up yet
- * @return how long to wait before reading more from this sender
- */
-struct GNUNET_TIME_Relative
-GST_neighbours_calculate_receive_delay (const struct
- GNUNET_PeerIdentity *sender,
- ssize_t size,
- int *do_forward)
-{
- struct NeighbourMapEntry *n;
- struct GNUNET_TIME_Relative ret;
-
- if (NULL == neighbours)
- {
- *do_forward = GNUNET_NO;
- return GNUNET_TIME_UNIT_FOREVER_REL; /* This can happen during shutdown
*/
- }
- if (NULL == (n = lookup_neighbour (sender)))
- {
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# messages discarded due to lack of neighbour
record"),
- 1,
- GNUNET_NO);
- *do_forward = GNUNET_NO;
- return GNUNET_TIME_UNIT_ZERO;
- }
- if (! test_connected (n))
- {
- *do_forward = GNUNET_SYSERR;
- return GNUNET_TIME_UNIT_ZERO;
- }
- if (GNUNET_YES == GNUNET_BANDWIDTH_tracker_consume (&n->in_tracker, size))
- {
- n->quota_violation_count++;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Bandwidth quota (%u b/s) violation detected (total of %u).\n",
- n->in_tracker.available_bytes_per_s__,
- n->quota_violation_count);
- /* Discount 32k per violation */
- GNUNET_BANDWIDTH_tracker_consume (&n->in_tracker, -32 * 1024);
- }
- else
- {
- if (n->quota_violation_count > 0)
- {
- /* try to add 32k back */
- GNUNET_BANDWIDTH_tracker_consume (&n->in_tracker, 32 * 1024);
- n->quota_violation_count--;
- }
- }
- if (n->quota_violation_count > QUOTA_VIOLATION_DROP_THRESHOLD)
- {
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# bandwidth quota violations by other
peers"),
- 1, GNUNET_NO);
- *do_forward = GNUNET_NO;
- return GNUNET_CONSTANTS_QUOTA_VIOLATION_TIMEOUT;
- }
- *do_forward = GNUNET_YES;
- ret = GNUNET_BANDWIDTH_tracker_get_delay (&n->in_tracker, 32 * 1024);
- if (ret.rel_value_us > 0)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Throttling read (%lld bytes excess at %u b/s), waiting %s
before reading more.\n",
- (long long) n->in_tracker.consumption_since_last_update__,
- (unsigned int) n->in_tracker.available_bytes_per_s__,
- GNUNET_STRINGS_relative_time_to_string (ret, GNUNET_YES));
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# ms throttling suggested"),
- (int64_t) ret.rel_value_us / 1000LL,
- GNUNET_NO);
- }
- return ret;
-}
-
-
-void
-GST_neighbours_send (const struct GNUNET_PeerIdentity *target,
- const void *msg,
- size_t msg_size,
- struct GNUNET_TIME_Relative timeout,
- GST_NeighbourSendContinuation cont,
- void *cont_cls)
-{
- struct NeighbourMapEntry *n;
- struct MessageQueue *mq;
-
- /* All ove these cases should never happen; they are all API violations.
- But we check anyway, just to be sure. */
- if (NULL == (n = lookup_neighbour (target)))
- {
- GNUNET_break (0);
- if (NULL != cont)
- cont (cont_cls,
- GNUNET_SYSERR,
- msg_size,
- 0);
- return;
- }
- if (GNUNET_YES != test_connected (n))
- {
- GNUNET_break (0);
- if (NULL != cont)
- cont (cont_cls,
- GNUNET_SYSERR,
- msg_size,
- 0);
- return;
- }
- bytes_in_send_queue += msg_size;
- GNUNET_STATISTICS_set (GST_stats,
- gettext_noop
- ("# bytes in message queue for other peers"),
- bytes_in_send_queue, GNUNET_NO);
- mq = GNUNET_malloc (sizeof(struct MessageQueue) + msg_size);
- mq->cont = cont;
- mq->cont_cls = cont_cls;
- GNUNET_memcpy (&mq[1], msg, msg_size);
- mq->message_buf = (const char *) &mq[1];
- mq->message_buf_size = msg_size;
- mq->timeout = GNUNET_TIME_relative_to_absolute (timeout);
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Enqueueing %u bytes to send to peer %s\n",
- (unsigned int) msg_size,
- GNUNET_i2s (target));
- GNUNET_CONTAINER_DLL_insert_tail (n->messages_head,
- n->messages_tail,
- mq);
- if (NULL != n->task)
- GNUNET_SCHEDULER_cancel (n->task);
- n->task = GNUNET_SCHEDULER_add_now (&master_task, n);
-}
-
-
-/**
- * Continuation called from our attempt to transmitted our
- * #GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_SYN to the specified @a
- * target. Continue processing based on the @a result. Specifically,
- * if we failed to transmit, discard the address we used.
- *
- * @param cls NULL
- * @param target which peer received the transmission
- * @param result #GNUNET_OK if sending worked
- * @param size_payload how many bytes of payload were sent (ignored)
- * @param size_on_wire how much bandwidth was consumed on the wire (ignored)
- */
-static void
-send_session_syn_cont (void *cls,
- const struct GNUNET_PeerIdentity *target,
- int result,
- size_t size_payload,
- size_t size_on_wire)
-{
- struct NeighbourMapEntry *n;
-
- (void) cls;
- (void) size_payload;
- (void) size_on_wire;
- n = lookup_neighbour (target);
- if (NULL == n)
- {
- /* SYN continuation was called after neighbor was freed,
- * for example due to a time out for the state or the session
- * used was already terminated: nothing to do here... */
- return;
- }
-
- if ((GNUNET_TRANSPORT_PS_SYN_SENT != n->state) &&
- (GNUNET_TRANSPORT_PS_RECONNECT_SENT != n->state) &&
- (GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT != n->state))
- {
- /* SYN continuation was called after neighbor changed state,
- * for example due to a time out for the state or the session
- * used was already terminated: nothing to do here... */
- return;
- }
- if (GNUNET_OK == result)
- return;
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ ("Failed to send SYN message to peer `%s'\n"),
- GNUNET_i2s (target));
- switch (n->state)
- {
- case GNUNET_TRANSPORT_PS_SYN_SENT:
- /* Remove address and request an additional one */
- unset_primary_address (n);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_INIT_ATS,
- GNUNET_TIME_relative_to_absolute (
- FAST_RECONNECT_TIMEOUT));
- break;
-
- case GNUNET_TRANSPORT_PS_RECONNECT_SENT:
- /* Remove address and request an additional one */
- unset_primary_address (n);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_RECONNECT_ATS,
- GNUNET_TIME_relative_to_absolute (
- ATS_RESPONSE_TIMEOUT));
- break;
-
- case GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT:
- /* Remove address and request and go back to primary address */
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# Failed attempts to switch addresses (failed
to send SYN CONT)"),
- 1,
- GNUNET_NO);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Switch failed, cleaning up alternative address\n");
- free_address (&n->alternative_address);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_CONNECTED,
- GNUNET_TIME_relative_to_absolute (
- ATS_RESPONSE_TIMEOUT));
- break;
-
- default:
- disconnect_neighbour (n);
- break;
- }
-}
-
-
-/**
- * Send a SYN message via the given address.
- *
- * @param na address to use
- */
-static void
-send_syn (struct NeighbourAddress *na)
-{
- struct GNUNET_TRANSPORT_PluginFunctions *papi;
- struct TransportSynMessage connect_msg;
- struct NeighbourMapEntry *n;
-
- GNUNET_assert (NULL != na->session);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Sending SYN message to peer `%s' at %s\n",
- GNUNET_i2s (&na->address->peer),
- GST_plugins_a2s (na->address));
-
- papi = GST_plugins_find (na->address->transport_name);
- GNUNET_assert (NULL != papi);
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# SYN messages sent"),
- 1, GNUNET_NO);
- na->connect_timestamp = GNUNET_TIME_absolute_get ();
- connect_msg.header.size = htons (sizeof(struct TransportSynMessage));
- connect_msg.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_SYN);
- connect_msg.reserved = htonl (0);
- connect_msg.timestamp = GNUNET_TIME_absolute_hton (na->connect_timestamp);
- if (-1 ==
- papi->send (papi->cls,
- na->session,
- (const char *) &connect_msg,
- sizeof(struct TransportSynMessage),
- UINT_MAX,
- SETUP_CONNECTION_TIMEOUT,
- &send_session_syn_cont, NULL))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- _ ("Failed to transmit SYN message to %s\n"),
- GST_plugins_a2s (na->address));
- n = lookup_neighbour (&na->address->peer);
- if (NULL == n)
- {
- GNUNET_break (0);
- return;
- }
- switch (n->state)
- {
- case GNUNET_TRANSPORT_PS_SYN_SENT:
- /* Remove address and request and additional one */
- GNUNET_assert (na == &n->primary_address);
- unset_primary_address (n);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_INIT_ATS,
- GNUNET_TIME_relative_to_absolute (
- FAST_RECONNECT_TIMEOUT));
- /* Hard failure to send the SYN message with this address:
- Destroy address and session */
- break;
-
- case GNUNET_TRANSPORT_PS_RECONNECT_SENT:
- /* Remove address and request an additional one */
- GNUNET_assert (na == &n->primary_address);
- unset_primary_address (n);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_RECONNECT_ATS,
- GNUNET_TIME_relative_to_absolute (
- ATS_RESPONSE_TIMEOUT));
- break;
-
- case GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT:
- GNUNET_assert (na == &n->alternative_address);
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# Failed attempts to switch addresses
(failed to send SYN)"),
- 1,
- GNUNET_NO);
- /* Remove address and request an additional one */
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Switch failed, cleaning up alternative address\n");
- free_address (&n->alternative_address);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_CONNECTED,
- GNUNET_TIME_relative_to_absolute (
- ATS_RESPONSE_TIMEOUT));
- break;
-
- default:
- GNUNET_break (0);
- disconnect_neighbour (n);
- break;
- }
- return;
- }
- GST_neighbours_notify_data_sent (na->address,
- na->session,
- sizeof(struct TransportSynMessage));
-}
-
-
-/**
- * Continuation called from our attempt to transmitted our
- * #GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_SYN_ACK to the specified @a
- * target. Continue processing based on the @a result. Specifically,
- * if we failed to transmit, discard the address we used.
- *
- * @param cls NULL
- * @param target which peer received the transmission
- * @param result #GNUNET_OK if sending worked
- * @param size_payload how many bytes of payload were sent (ignored)
- * @param size_on_wire how much bandwidth was consumed on the wire (ignored)
- */
-static void
-send_session_syn_ack_cont (void *cls,
- const struct GNUNET_PeerIdentity *target,
- int result,
- size_t size_payload,
- size_t size_on_wire)
-{
- struct NeighbourMapEntry *n;
-
- (void) cls;
- (void) size_payload;
- (void) size_on_wire;
- n = lookup_neighbour (target);
- if (NULL == n)
- {
- /* SYN_ACK continuation was called after neighbor was freed,
- * for example due to a time out for the state or the session
- * used was already terminated: nothing to do here... */
- return;
- }
-
- if (GNUNET_TRANSPORT_PS_SYN_RECV_ACK != n->state)
- {
- /* SYN_ACK continuation was called after neighbor changed state,
- * for example due to a time out for the state or the session
- * used was already terminated: nothing to do here... */
- return;
- }
- if (GNUNET_OK == result)
- return;
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ (
- "Failed to send SYN_ACK message to peer `%s' using address
`%s'\n"),
- GNUNET_i2s (target),
- GST_plugins_a2s (n->primary_address.address));
-
- /* Remove address and request and additional one */
- /* FIXME: what if the neighbour's primary address
- changed in the meantime? Might want to instead
- pass "something" around in closure to be sure. */
- unset_primary_address (n);
- n->ack_state = ACK_SEND_SYN_ACK;
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_SYN_RECV_ATS,
- GNUNET_TIME_relative_to_absolute (
- ATS_RESPONSE_TIMEOUT));
-}
-
-
-/**
- * Send a SYN_ACK message via the given address.
- *
- * @param na address and session to use
- * @param timestamp timestamp to use for the ACK message
- * @return #GNUNET_SYSERR if sending immediately failed, #GNUNET_OK otherwise
- */
-static void
-send_syn_ack_message (struct NeighbourAddress *na,
- struct GNUNET_TIME_Absolute timestamp)
-{
- const struct GNUNET_HELLO_Address *address = na->address;
- struct GNUNET_ATS_Session *session = na->session;
- struct GNUNET_TRANSPORT_PluginFunctions *papi;
- struct TransportSynMessage connect_msg;
- struct NeighbourMapEntry *n;
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Sending SYN_ACK to peer `%s'\n",
- GNUNET_i2s (&address->peer));
-
- if (NULL == (papi = GST_plugins_find (address->transport_name)))
- {
- GNUNET_break (0);
- return;
- }
- if (NULL == session)
- session = papi->get_session (papi->cls,
- address);
- if (NULL == session)
- {
- GNUNET_break (0);
- return;
- }
- GST_ats_new_session (address,
- session);
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# SYN_ACK messages sent"),
- 1, GNUNET_NO);
- connect_msg.header.size = htons (sizeof(struct TransportSynMessage));
- connect_msg.header.type = htons (
- GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_SYN_ACK);
- connect_msg.reserved = htonl (0);
- connect_msg.timestamp = GNUNET_TIME_absolute_hton (timestamp);
-
- if (GNUNET_SYSERR ==
- papi->send (papi->cls,
- session,
- (const char *) &connect_msg,
- sizeof(struct TransportSynMessage),
- UINT_MAX,
- GNUNET_TIME_UNIT_FOREVER_REL,
- &send_session_syn_ack_cont, NULL))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- _ ("Failed to transmit SYN_ACK message to %s\n"),
- GST_plugins_a2s (address));
-
- n = lookup_neighbour (&address->peer);
- if (NULL == n)
- {
- GNUNET_break (0);
- return;
- }
- /* Remove address and request and additional one */
- unset_primary_address (n);
- n->ack_state = ACK_SEND_SYN_ACK;
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_SYN_RECV_ATS,
- GNUNET_TIME_relative_to_absolute (
- ATS_RESPONSE_TIMEOUT));
- return;
- }
-}
-
-
-/**
- * Function called by the bandwidth tracker for a peer whenever
- * the tracker's state changed such that we need to recalculate
- * the delay for flow control. We calculate the latest delay
- * and inform the plugin (if applicable).
- *
- * @param cls the `struct NeighbourMapEntry` to update calculations for
- */
-static void
-inbound_bw_tracker_update (void *cls)
-{
- struct NeighbourMapEntry *n = cls;
- struct GNUNET_TRANSPORT_PluginFunctions *papi;
- struct GNUNET_TIME_Relative delay;
- int do_forward;
-
- if (NULL == n->primary_address.address)
- return; /* not active, ignore */
- papi = GST_plugins_find (n->primary_address.address->transport_name);
- GNUNET_assert (NULL != papi);
- if (NULL == papi->update_inbound_delay)
- return;
- delay = GST_neighbours_calculate_receive_delay (&n->id,
- 0,
- &do_forward);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "New inbound delay for peer `%s' is %llu ms\n",
- GNUNET_i2s (&n->id),
- (unsigned long long) delay.rel_value_us / 1000LL);
- if (NULL == n->primary_address.session)
- return;
- papi->update_inbound_delay (papi->cls,
- &n->id,
- n->primary_address.session,
- delay);
-}
-
-
-/**
- * Create a fresh entry in the neighbour map for the given peer
- *
- * @param peer peer to create an entry for
- * @return new neighbour map entry
- */
-static struct NeighbourMapEntry *
-setup_neighbour (const struct GNUNET_PeerIdentity *peer)
-{
- struct NeighbourMapEntry *n;
-
- if (0 ==
- memcmp (&GST_my_identity,
- peer,
- sizeof(struct GNUNET_PeerIdentity)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Cowardly refusing to consider myself my neighbour!\n");
- return NULL;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Creating new neighbour entry for `%s'\n",
- GNUNET_i2s (peer));
- n = GNUNET_new (struct NeighbourMapEntry);
- n->id = *peer;
- n->ack_state = ACK_UNDEFINED;
- n->last_util_transmission = GNUNET_TIME_absolute_get ();
- n->neighbour_receive_quota = GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT;
- GNUNET_BANDWIDTH_tracker_init (&n->in_tracker,
- &inbound_bw_tracker_update,
- n,
- GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT,
- MAX_BANDWIDTH_CARRY_S);
- n->task = GNUNET_SCHEDULER_add_now (&master_task, n);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_NOT_CONNECTED,
- GNUNET_TIME_UNIT_FOREVER_ABS);
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_put (neighbours,
- &n->id,
- n,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
- n->suggest_handle = GNUNET_ATS_connectivity_suggest (GST_ats_connect,
- peer,
- 0);
-
- return n;
-}
-
-
-/**
- * Entry in a DLL we use to keep track of pending blacklist checks.
- */
-struct BlacklistCheckSwitchContext
-{
- /**
- * DLL prev pointer.
- */
- struct BlacklistCheckSwitchContext *prev;
-
- /**
- * DLL next pointer.
- */
- struct BlacklistCheckSwitchContext *next;
-
- /**
- * Handle to the blacklist check we are performing.
- */
- struct GST_BlacklistCheck *blc;
-
- /**
- * Inbound bandwidth that was assigned to @e address.
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in;
-
- /**
- * Outbound bandwidth that was assigned to @e address.
- */
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out;
-};
-
-
-/**
- * We received a 'SYN' message from the other peer.
- * Consider switching to it.
- *
- * @param message possibly a `struct TransportSynMessage` (check format)
- * @param peer identity of the peer to switch the address for
- * @return #GNUNET_OK if the message was fine, #GNUNET_SYSERR on serious error
- */
-int
-GST_neighbours_handle_session_syn (const struct GNUNET_MessageHeader *message,
- const struct GNUNET_PeerIdentity *peer)
-{
- const struct TransportSynMessage *scm;
- struct NeighbourMapEntry *n;
- struct GNUNET_TIME_Absolute ts;
-
- if (ntohs (message->size) != sizeof(struct TransportSynMessage))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# SYN messages received"),
- 1, GNUNET_NO);
- if (NULL == neighbours)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ (
- "SYN request from peer `%s' ignored due impending
shutdown\n"),
- GNUNET_i2s (peer));
- return GNUNET_OK; /* we're shutting down */
- }
- scm = (const struct TransportSynMessage *) message;
- GNUNET_break_op (0 == ntohl (scm->reserved));
- ts = GNUNET_TIME_absolute_ntoh (scm->timestamp);
- if (0 ==
- memcmp (&GST_my_identity,
- peer,
- sizeof(struct GNUNET_PeerIdentity)))
- {
- /* loopback connection-to-self, ignore */
- return GNUNET_SYSERR;
- }
- n = lookup_neighbour (peer);
- if (NULL == n)
- {
- /* This is a new neighbour and set to not connected */
- n = setup_neighbour (peer);
- GNUNET_assert (NULL != n);
- }
-
- /* Remember this SYN message in neighbour */
- n->ack_state = ACK_SEND_SYN_ACK;
- n->connect_ack_timestamp = ts;
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Received SYN for peer `%s' in state %s/%s\n",
- GNUNET_i2s (peer),
- GNUNET_TRANSPORT_ps2s (n->state),
- print_ack_state (n->ack_state));
-
- switch (n->state)
- {
- case GNUNET_TRANSPORT_PS_NOT_CONNECTED:
- /* Request an address from ATS to send SYN_ACK to this peer */
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_SYN_RECV_ATS,
- GNUNET_TIME_relative_to_absolute (
- ATS_RESPONSE_TIMEOUT));
- break;
-
- case GNUNET_TRANSPORT_PS_INIT_ATS:
- /* SYN message takes priority over us asking ATS for address:
- * Wait for ATS to suggest an address and send SYN_ACK */
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_SYN_RECV_ATS,
- GNUNET_TIME_relative_to_absolute (
- ATS_RESPONSE_TIMEOUT));
- break;
-
- case GNUNET_TRANSPORT_PS_SYN_RECV_ATS:
- /* We already wait for an address to send an SYN_ACK */
- break;
-
- case GNUNET_TRANSPORT_PS_SYN_SENT:
- case GNUNET_TRANSPORT_PS_SYN_RECV_ACK:
- /* Send ACK immediately */
- n->ack_state = ACK_SEND_ACK;
- send_syn_ack_message (&n->primary_address,
- ts);
- break;
-
- case GNUNET_TRANSPORT_PS_CONNECTED:
- /* we are already connected and can thus send the ACK immediately */
- GNUNET_assert (NULL != n->primary_address.address);
- GNUNET_assert (NULL != n->primary_address.session);
- n->ack_state = ACK_SEND_ACK;
- send_syn_ack_message (&n->primary_address,
- ts);
- break;
-
- case GNUNET_TRANSPORT_PS_RECONNECT_ATS:
- /* We wait for ATS address suggestion */
- break;
-
- case GNUNET_TRANSPORT_PS_RECONNECT_SENT:
- /* We received a SYN message while waiting for a SYN_ACK in fast
- * reconnect. Send SYN_ACK immediately */
- n->ack_state = ACK_SEND_ACK;
- send_syn_ack_message (&n->primary_address,
- n->connect_ack_timestamp);
- break;
-
- case GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT:
- /* We are already connected and can thus send the ACK immediately;
- still, it can never hurt to have an alternative address, so also
- tell ATS about it */
- GNUNET_assert (NULL != n->primary_address.address);
- GNUNET_assert (NULL != n->primary_address.session);
- n->ack_state = ACK_SEND_ACK;
- send_syn_ack_message (&n->primary_address,
- ts);
- break;
-
- case GNUNET_TRANSPORT_PS_DISCONNECT:
- /* Get rid of remains and re-try */
- free_neighbour (n);
- n = setup_neighbour (peer);
- GNUNET_assert (NULL != n);
- /* Remember the SYN time stamp for ACK message */
- n->ack_state = ACK_SEND_SYN_ACK;
- n->connect_ack_timestamp = ts;
- /* Request an address for the peer */
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_SYN_RECV_ATS,
- GNUNET_TIME_relative_to_absolute (
- ATS_RESPONSE_TIMEOUT));
- break;
-
- case GNUNET_TRANSPORT_PS_DISCONNECT_FINISHED:
- /* should not be possible */
- GNUNET_assert (0);
- break;
-
- default:
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unhandled state `%s'\n",
- GNUNET_TRANSPORT_ps2s (n->state));
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Check if the given @a address is the same that we are already
- * using for the respective neighbour. If so, update the bandwidth
- * assignment and possibly the session and return #GNUNET_OK.
- * If the new address is different from what the neighbour is
- * using right now, return #GNUNET_NO.
- *
- * @param address address of the other peer,
- * @param session session to use or NULL if transport should initiate a session
- * @param bandwidth_in inbound quota to be used when connection is up,
- * 0 to disconnect from peer
- * @param bandwidth_out outbound quota to be used when connection is up,
- * 0 to disconnect from peer
- * @return #GNUNET_OK if we were able to just update the bandwidth and session,
- * #GNUNET_NO if more extensive changes are required (address changed)
- */
-static int
-try_run_fast_ats_update (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out)
-{
- struct NeighbourMapEntry *n;
-
- n = lookup_neighbour (&address->peer);
- if ((NULL == n) ||
- (NULL == n->primary_address.address) ||
- (0 != GNUNET_HELLO_address_cmp (address,
- n->primary_address.address)))
- return GNUNET_NO;
- /* We are not really switching addresses, but merely adjusting
- session and/or bandwidth, can do fast ATS update! */
- if (session != n->primary_address.session)
- {
- /* switch to a different session, but keeping same address; could
- happen if there is a 2nd inbound connection */
- n->primary_address.session = session;
- GNUNET_assert (GNUNET_YES ==
- GST_ats_is_known (n->primary_address.address,
- n->primary_address.session));
- }
- if (n->primary_address.bandwidth_in.value__ != bandwidth_in.value__)
- {
- n->primary_address.bandwidth_in = bandwidth_in;
- if (GNUNET_YES !=
- set_incoming_quota (n,
- bandwidth_in))
- return GNUNET_NO;
- }
- if (n->primary_address.bandwidth_out.value__ != bandwidth_out.value__)
- {
- n->primary_address.bandwidth_out = bandwidth_out;
- send_outbound_quota_to_clients (n);
- }
- return GNUNET_OK;
-}
-
-
-/**
- * We've been asked to switch addresses, and just now got the result
- * from the blacklist check to see if this is allowed.
- *
- * @param cls the `struct BlacklistCheckSwitchContext` with
- * the information about the future address
- * @param peer the peer we may switch addresses on
- * @param address address associated with the request
- * @param session session associated with the request
- * @param result #GNUNET_OK if the connection is allowed,
- * #GNUNET_NO if not,
- * #GNUNET_SYSERR if operation was aborted
- */
-static void
-switch_address_bl_check_cont (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- int result)
-{
- struct BlacklistCheckSwitchContext *blc_ctx = cls;
- struct GNUNET_TRANSPORT_PluginFunctions *papi;
- struct NeighbourMapEntry *n;
-
- if (GNUNET_SYSERR == result)
- goto cleanup;
-
- papi = GST_plugins_find (address->transport_name);
- if (NULL == papi)
- {
- /* This can happen during shutdown. */
- goto cleanup;
- }
-
- if (GNUNET_NO == result)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Blacklist denied to switch to suggested address `%s' session
%p for peer `%s'\n",
- GST_plugins_a2s (address),
- session,
- GNUNET_i2s (peer));
- GNUNET_STATISTICS_update (GST_stats,
- "# ATS suggestions ignored (blacklist denied)",
- 1,
- GNUNET_NO);
- if (NULL != session)
- papi->disconnect_session (papi->cls,
- session);
- if (GNUNET_YES !=
- GNUNET_HELLO_address_check_option (address,
- GNUNET_HELLO_ADDRESS_INFO_INBOUND))
- GST_ats_block_address (address,
- NULL);
- goto cleanup;
- }
-
-
- if (NULL == session)
- {
- /* need to create a session, ATS only gave us an address */
- session = papi->get_session (papi->cls,
- address);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Obtained new session for peer `%s' and address '%s': %p\n",
- GNUNET_i2s (&address->peer),
- GST_plugins_a2s (address),
- session);
- if (NULL != session)
- GST_ats_new_session (address,
- session);
- }
- if (NULL == session)
- {
- /* session creation failed, bad!, fail! */
- GNUNET_STATISTICS_update (GST_stats,
- "# ATS suggestions ignored (failed to create
session)",
- 1,
- GNUNET_NO);
- /* No session could be obtained, remove blacklist check and clean up */
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Failed to obtain new session for peer `%s' and address
'%s'\n",
- GNUNET_i2s (&address->peer),
- GST_plugins_a2s (address));
- GST_ats_block_address (address,
- session);
- goto cleanup;
- }
-
- /* We did this check already before going into blacklist, but
- it is theoretically possible that the situation changed in
- the meantime, hence we check again here */
- if (GNUNET_OK ==
- try_run_fast_ats_update (address,
- session,
- blc_ctx->bandwidth_in,
- blc_ctx->bandwidth_out))
- goto cleanup; /* was just a minor update, we're done */
-
- /* check if we also need to setup the neighbour entry */
- if (NULL == (n = lookup_neighbour (peer)))
- {
- n = setup_neighbour (peer);
- if (NULL == n)
- {
- /* not sure how this can happen... */
- GNUNET_break (0);
- goto cleanup;
- }
- n->state = GNUNET_TRANSPORT_PS_INIT_ATS;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Peer `%s' switches to address `%s'\n",
- GNUNET_i2s (&address->peer),
- GST_plugins_a2s (address));
-
- switch (n->state)
- {
- case GNUNET_TRANSPORT_PS_NOT_CONNECTED:
- GNUNET_break (0);
- GST_ats_block_address (address,
- session);
- free_neighbour (n);
- return;
-
- case GNUNET_TRANSPORT_PS_INIT_ATS:
- /* We requested an address and ATS suggests one:
- * set primary address and send SYN message*/
- set_primary_address (n,
- address,
- session,
- blc_ctx->bandwidth_in,
- blc_ctx->bandwidth_out);
- if (ACK_SEND_SYN_ACK == n->ack_state)
- {
- /* Send pending SYN_ACK message */
- n->ack_state = ACK_SEND_ACK;
- send_syn_ack_message (&n->primary_address,
- n->connect_ack_timestamp);
- }
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_SYN_SENT,
- GNUNET_TIME_relative_to_absolute (
- SETUP_CONNECTION_TIMEOUT));
- send_syn (&n->primary_address);
- break;
-
- case GNUNET_TRANSPORT_PS_SYN_SENT:
- /* ATS suggested a new address while waiting for an SYN_ACK:
- * Switch and send new SYN */
- /* ATS suggests a different address, switch again */
- set_primary_address (n,
- address,
- session,
- blc_ctx->bandwidth_in,
- blc_ctx->bandwidth_out);
- if (ACK_SEND_SYN_ACK == n->ack_state)
- {
- /* Send pending SYN_ACK message */
- n->ack_state = ACK_SEND_ACK;
- send_syn_ack_message (&n->primary_address,
- n->connect_ack_timestamp);
- }
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_SYN_SENT,
- GNUNET_TIME_relative_to_absolute (
- SETUP_CONNECTION_TIMEOUT));
- send_syn (&n->primary_address);
- break;
-
- case GNUNET_TRANSPORT_PS_SYN_RECV_ATS:
- /* We requested an address and ATS suggests one:
- * set primary address and send SYN_ACK message*/
- set_primary_address (n,
- address,
- session,
- blc_ctx->bandwidth_in,
- blc_ctx->bandwidth_out);
- /* Send an ACK message as a response to the SYN msg */
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_SYN_RECV_ACK,
- GNUNET_TIME_relative_to_absolute (
- SETUP_CONNECTION_TIMEOUT));
- send_syn_ack_message (&n->primary_address,
- n->connect_ack_timestamp);
- if ((ACK_SEND_SYN_ACK == n->ack_state) ||
- (ACK_UNDEFINED == n->ack_state))
- n->ack_state = ACK_SEND_ACK;
- break;
-
- case GNUNET_TRANSPORT_PS_SYN_RECV_ACK:
- /* ATS asks us to switch while we were trying to connect; switch to new
- address and check blacklist again */
- if ((ACK_SEND_SYN_ACK == n->ack_state))
- {
- n->ack_state = ACK_SEND_ACK;
- send_syn_ack_message (&n->primary_address,
- n->connect_ack_timestamp);
- }
- set_primary_address (n,
- address,
- session,
- blc_ctx->bandwidth_in,
- blc_ctx->bandwidth_out);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_SYN_RECV_ACK,
- GNUNET_TIME_relative_to_absolute (
- SETUP_CONNECTION_TIMEOUT));
- break;
-
- case GNUNET_TRANSPORT_PS_CONNECTED:
- GNUNET_assert (NULL != n->primary_address.address);
- GNUNET_assert (NULL != n->primary_address.session);
- GNUNET_break (n->primary_address.session != session);
- /* ATS asks us to switch a life connection; see if we can get
- a SYN_ACK on it before we actually do this! */
- set_alternative_address (n,
- address,
- session,
- blc_ctx->bandwidth_in,
- blc_ctx->bandwidth_out);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT,
- GNUNET_TIME_relative_to_absolute (
- SETUP_CONNECTION_TIMEOUT));
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# Attempts to switch addresses"),
- 1,
- GNUNET_NO);
- send_syn (&n->alternative_address);
- break;
-
- case GNUNET_TRANSPORT_PS_RECONNECT_ATS:
- set_primary_address (n,
- address,
- session,
- blc_ctx->bandwidth_in,
- blc_ctx->bandwidth_out);
- if (ACK_SEND_SYN_ACK == n->ack_state)
- {
- /* Send pending SYN_ACK message */
- n->ack_state = ACK_SEND_ACK;
- send_syn_ack_message (&n->primary_address,
- n->connect_ack_timestamp);
- }
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_RECONNECT_SENT,
- GNUNET_TIME_relative_to_absolute (
- FAST_RECONNECT_TIMEOUT));
- send_syn (&n->primary_address);
- break;
-
- case GNUNET_TRANSPORT_PS_RECONNECT_SENT:
- /* ATS asks us to switch while we were trying to reconnect; switch to new
- address and send SYN again */
- set_primary_address (n,
- address,
- session,
- blc_ctx->bandwidth_in,
- blc_ctx->bandwidth_out);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_RECONNECT_SENT,
- GNUNET_TIME_relative_to_absolute (
- FAST_RECONNECT_TIMEOUT));
- send_syn (&n->primary_address);
- break;
-
- case GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT:
- if ((0 == GNUNET_HELLO_address_cmp (n->primary_address.address,
- address)) &&
- (n->primary_address.session == session))
- {
- /* ATS switches back to still-active session */
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "ATS double-switched, cleaning up alternative address\n");
- free_address (&n->alternative_address);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_CONNECTED,
- n->timeout);
- break;
- }
- /* ATS asks us to switch a life connection, send */
- set_alternative_address (n,
- address,
- session,
- blc_ctx->bandwidth_in,
- blc_ctx->bandwidth_out);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT,
- GNUNET_TIME_relative_to_absolute (
- SETUP_CONNECTION_TIMEOUT));
- send_syn (&n->alternative_address);
- break;
-
- case GNUNET_TRANSPORT_PS_DISCONNECT:
- /* not going to switch addresses while disconnecting */
- GNUNET_STATISTICS_update (GST_stats,
- "# ATS suggestion ignored (disconnecting)",
- 1,
- GNUNET_NO);
- return;
-
- case GNUNET_TRANSPORT_PS_DISCONNECT_FINISHED:
- GNUNET_assert (0);
- break;
-
- default:
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unhandled state `%s'\n",
- GNUNET_TRANSPORT_ps2s (n->state));
- GNUNET_break (0);
- break;
- }
-cleanup:
- GNUNET_CONTAINER_DLL_remove (pending_bc_head,
- pending_bc_tail,
- blc_ctx);
- GNUNET_free (blc_ctx);
-}
-
-
-/**
- * For the given peer, switch to this address.
- *
- * Before accepting this addresses and actively using it, a blacklist check
- * is performed.
- *
- * If any check fails or the suggestion can somehow not be followed, we
- * MUST call #GST_ats_block_address() to tell ATS that the suggestion
- * could not be satisfied and force ATS to do something else.
- *
- * @param address address of the other peer,
- * @param session session to use or NULL if transport should initiate a session
- * @param bandwidth_in inbound quota to be used when connection is up,
- * 0 to disconnect from peer
- * @param bandwidth_out outbound quota to be used when connection is up,
- * 0 to disconnect from peer
- */
-void
-GST_neighbours_switch_to_address (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_in,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_out)
-{
- struct GST_BlacklistCheck *blc;
- struct BlacklistCheckSwitchContext *blc_ctx;
-
- GNUNET_assert (NULL != address->transport_name);
- if (GNUNET_OK ==
- try_run_fast_ats_update (address,
- session,
- bandwidth_in,
- bandwidth_out))
- return;
-
- /* Check if plugin is available */
- if (NULL == (GST_plugins_find (address->transport_name)))
- {
- /* we don't have the plugin for this address */
- GNUNET_break (0);
- GST_ats_block_address (address,
- session);
- return;
- }
- if ((NULL == session) &&
- (GNUNET_HELLO_address_check_option (address,
- GNUNET_HELLO_ADDRESS_INFO_INBOUND)))
- {
- /* This is a inbound address and we do not have a session to use! */
- GNUNET_break (0);
- GST_ats_block_address (address,
- session);
- return;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "ATS suggests address '%s' for peer `%s' at %u/%u speed\n",
- GST_plugins_a2s (address),
- GNUNET_i2s (&address->peer),
- (unsigned int) ntohl (bandwidth_in.value__),
- (unsigned int) ntohl (bandwidth_out.value__));
-
- /* Perform blacklist check */
- blc_ctx = GNUNET_new (struct BlacklistCheckSwitchContext);
- blc_ctx->bandwidth_in = bandwidth_in;
- blc_ctx->bandwidth_out = bandwidth_out;
- GNUNET_CONTAINER_DLL_insert (pending_bc_head,
- pending_bc_tail,
- blc_ctx);
- if (NULL != (blc = GST_blacklist_test_allowed (&address->peer,
- address->transport_name,
- &switch_address_bl_check_cont,
- blc_ctx,
- address,
- session)))
- {
- blc_ctx->blc = blc;
- }
-}
-
-
-/**
- * Function called to send network utilization data to ATS for
- * each active connection.
- *
- * @param cls NULL
- * @param key peer we send utilization data for
- * @param value the `struct NeighbourMapEntry *` with data to send
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-send_utilization_data (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct NeighbourMapEntry *n = value;
- uint32_t bps_in;
- uint32_t bps_out;
- struct GNUNET_TIME_Relative delta;
-
- (void) cls;
- if ((GNUNET_YES != test_connected (n)) ||
- (NULL == n->primary_address.address))
- return GNUNET_OK;
- delta = GNUNET_TIME_absolute_get_difference (n->last_util_transmission,
- GNUNET_TIME_absolute_get ());
- bps_in = 0;
- if ((0 != n->util_total_bytes_recv) && (0 != delta.rel_value_us))
- bps_in = (1000LL * 1000LL * n->util_total_bytes_recv)
- / (delta.rel_value_us);
- bps_out = 0;
- if ((0 != n->util_total_bytes_sent) && (0 != delta.rel_value_us))
- bps_out = (1000LL * 1000LL * n->util_total_bytes_sent) /
delta.rel_value_us;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "`%s' total: received %u Bytes/s, sent %u Bytes/s\n",
- GNUNET_i2s (key),
- bps_in,
- bps_out);
- GST_ats_update_utilization (n->primary_address.address,
- bps_in,
- bps_out);
- n->util_total_bytes_recv = 0;
- n->util_total_bytes_sent = 0;
- n->last_util_transmission = GNUNET_TIME_absolute_get ();
- return GNUNET_OK;
-}
-
-
-/**
- * Task transmitting utilization in a regular interval
- *
- * @param cls the `struct NeighbourMapEntry` for which we are running
- */
-static void
-utilization_transmission (void *cls)
-{
- (void) cls;
- util_transmission_tk = NULL;
- GNUNET_CONTAINER_multipeermap_iterate (neighbours,
- &send_utilization_data,
- NULL);
- util_transmission_tk
- = GNUNET_SCHEDULER_add_delayed (UTIL_TRANSMISSION_INTERVAL,
- &utilization_transmission,
- NULL);
-}
-
-
-/**
- * Track information about data we received from the
- * given address (used to notify ATS about our utilization
- * of allocated resources).
- *
- * @param address the address we got data from
- * @param message the message we received (really only the size is used)
- */
-void
-GST_neighbours_notify_data_recv (const struct GNUNET_HELLO_Address *address,
- const struct GNUNET_MessageHeader *message)
-{
- struct NeighbourMapEntry *n;
-
- n = lookup_neighbour (&address->peer);
- if (NULL == n)
- return;
- n->util_total_bytes_recv += ntohs (message->size);
-}
-
-
-/**
- * Track information about data we transmitted using the given @a
- * address and @a session (used to notify ATS about our utilization of
- * allocated resources).
- *
- * @param address the address we transmitted data to
- * @param session session we used to transmit data
- * @param message the message we sent (really only the size is used)
- */
-void
-GST_neighbours_notify_data_sent (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- size_t size)
-{
- struct NeighbourMapEntry *n;
-
- n = lookup_neighbour (&address->peer);
- if (NULL == n)
- return;
- if (n->primary_address.session != session)
- return;
- n->util_total_bytes_sent += size;
-}
-
-
-static void
-master_task (void *cls)
-{
- struct NeighbourMapEntry *n = cls;
- struct GNUNET_TIME_Relative delay;
-
- n->task = NULL;
- delay = GNUNET_TIME_absolute_get_remaining (n->timeout);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Master task runs for neighbour `%s' in state %s with timeout in
%s\n",
- GNUNET_i2s (&n->id),
- GNUNET_TRANSPORT_ps2s (n->state),
- GNUNET_STRINGS_relative_time_to_string (delay,
- GNUNET_YES));
- switch (n->state)
- {
- case GNUNET_TRANSPORT_PS_NOT_CONNECTED:
- /* invalid state for master task, clean up */
- GNUNET_break (0);
- free_neighbour (n);
- return;
-
- case GNUNET_TRANSPORT_PS_INIT_ATS:
- if (0 == delay.rel_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Connection to `%s' timed out waiting for ATS to provide
address\n",
- GNUNET_i2s (&n->id));
- free_neighbour (n);
- return;
- }
- break;
-
- case GNUNET_TRANSPORT_PS_SYN_SENT:
- if (0 == delay.rel_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Connection to `%s' timed out waiting for other peer to send
SYN_ACK\n",
- GNUNET_i2s (&n->id));
- /* Remove address and request and additional one */
- unset_primary_address (n);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_INIT_ATS,
- GNUNET_TIME_relative_to_absolute (
- ATS_RESPONSE_TIMEOUT));
- return;
- }
- break;
-
- case GNUNET_TRANSPORT_PS_SYN_RECV_ATS:
- if (0 == delay.rel_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Connection to `%s' timed out waiting ATS to provide address
to use for SYN_ACK\n",
- GNUNET_i2s (&n->id));
- free_neighbour (n);
- return;
- }
- break;
-
- case GNUNET_TRANSPORT_PS_SYN_RECV_ACK:
- if (0 == delay.rel_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Connection to `%s' timed out waiting for other peer to send
ACK\n",
- GNUNET_i2s (&n->id));
- disconnect_neighbour (n);
- return;
- }
- break;
-
- case GNUNET_TRANSPORT_PS_CONNECTED:
- if (0 == delay.rel_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Connection to `%s' timed out, missing
KEEPALIVE_RESPONSEs\n",
- GNUNET_i2s (&n->id));
- disconnect_neighbour (n);
- return;
- }
- try_transmission_to_peer (n);
- send_keepalive (n);
- break;
-
- case GNUNET_TRANSPORT_PS_RECONNECT_ATS:
- if (0 == delay.rel_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Connection to `%s' timed out, waiting for ATS replacement
address\n",
- GNUNET_i2s (&n->id));
- disconnect_neighbour (n);
- return;
- }
- break;
-
- case GNUNET_TRANSPORT_PS_RECONNECT_SENT:
- if (0 == delay.rel_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Connection to `%s' timed out, waiting for other peer to
SYN_ACK replacement address\n",
- GNUNET_i2s (&n->id));
- disconnect_neighbour (n);
- return;
- }
- break;
-
- case GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT:
- if (0 == delay.rel_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Switch failed, cleaning up alternative address\n");
- free_address (&n->alternative_address);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_CONNECTED,
- GNUNET_TIME_relative_to_absolute (
- SETUP_CONNECTION_TIMEOUT));
- }
- try_transmission_to_peer (n);
- send_keepalive (n);
- break;
-
- case GNUNET_TRANSPORT_PS_DISCONNECT:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Cleaning up connection to `%s' after sending DISCONNECT\n",
- GNUNET_i2s (&n->id));
- free_neighbour (n);
- return;
-
- case GNUNET_TRANSPORT_PS_DISCONNECT_FINISHED:
- /* how did we get here!? */
- GNUNET_assert (0);
- break;
-
- default:
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unhandled state `%s'\n",
- GNUNET_TRANSPORT_ps2s (n->state));
- GNUNET_break (0);
- break;
- }
- delay = GNUNET_TIME_absolute_get_remaining (n->timeout);
- if ((GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT == n->state) ||
- (GNUNET_TRANSPORT_PS_CONNECTED == n->state))
- {
- /* if we are *now* in one of the two states, we're sending
- keep alive messages, so we need to consider the keepalive
- delay, not just the connection timeout */
- delay = GNUNET_TIME_relative_min (GNUNET_TIME_absolute_get_remaining (
- n->keep_alive_time),
- delay);
- }
- if (NULL == n->task)
- n->task = GNUNET_SCHEDULER_add_delayed (delay,
- &master_task,
- n);
-}
-
-
-/**
- * Send a ACK message to the neighbour to confirm that we
- * got its SYN_ACK.
- *
- * @param n neighbour to send the ACK to
- */
-static void
-send_session_ack_message (struct NeighbourMapEntry *n)
-{
- struct GNUNET_MessageHeader msg;
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Sending ACK message to peer `%s'\n",
- GNUNET_i2s (&n->id));
-
- msg.size = htons (sizeof(struct GNUNET_MessageHeader));
- msg.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_ACK);
- (void) send_with_session (n,
- &msg,
- sizeof(struct GNUNET_MessageHeader),
- UINT32_MAX,
- GNUNET_TIME_UNIT_FOREVER_REL,
- GNUNET_NO,
- NULL, NULL);
-}
-
-
-/**
- * We received a 'SESSION_SYN_ACK' message from the other peer.
- * Consider switching to it.
- *
- * @param message possibly a `struct GNUNET_ATS_SessionConnectMessage` (check
format)
- * @param peer identity of the peer to switch the address for
- * @param address address of the other peer, NULL if other peer
- * connected to us
- * @param session session to use (or NULL)
- * @return #GNUNET_OK if the message was fine, #GNUNET_SYSERR on serious error
- */
-int
-GST_neighbours_handle_session_syn_ack (const struct
- GNUNET_MessageHeader *message,
- const struct
- GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session)
-{
- const struct TransportSynMessage *scm;
- struct GNUNET_TIME_Absolute ts;
- struct NeighbourMapEntry *n;
-
- (void) session;
- if (ntohs (message->size) != sizeof(struct TransportSynMessage))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# SYN_ACK messages received"),
- 1, GNUNET_NO);
- scm = (const struct TransportSynMessage *) message;
- GNUNET_break_op (ntohl (scm->reserved) == 0);
- if (NULL == (n = lookup_neighbour (&address->peer)))
- {
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# unexpected SYN_ACK messages (no peer)"),
- 1, GNUNET_NO);
- return GNUNET_SYSERR;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received SYN_ACK message from peer `%s' in state %s/%s\n",
- GNUNET_i2s (&address->peer),
- GNUNET_TRANSPORT_ps2s (n->state),
- print_ack_state (n->ack_state));
- ts = GNUNET_TIME_absolute_ntoh (scm->timestamp);
- switch (n->state)
- {
- case GNUNET_TRANSPORT_PS_NOT_CONNECTED:
- GNUNET_break (0);
- free_neighbour (n);
- return GNUNET_SYSERR;
-
- case GNUNET_TRANSPORT_PS_INIT_ATS:
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# unexpected SYN_ACK messages (not ready)"),
- 1,
- GNUNET_NO);
- break;
-
- case GNUNET_TRANSPORT_PS_SYN_SENT:
- if (ts.abs_value_us != n->primary_address.connect_timestamp.abs_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "SYN_ACK ignored as the timestamp does not match our SYN
request\n");
- return GNUNET_OK;
- }
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_CONNECTED,
- GNUNET_TIME_relative_to_absolute (
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT));
- set_primary_address (n,
- n->primary_address.address,
- n->primary_address.session,
- n->primary_address.bandwidth_in,
- n->primary_address.bandwidth_out);
- send_session_ack_message (n);
- break;
-
- case GNUNET_TRANSPORT_PS_SYN_RECV_ATS:
- case GNUNET_TRANSPORT_PS_SYN_RECV_ACK:
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# unexpected SYN_ACK messages (not ready)"),
- 1,
- GNUNET_NO);
- break;
-
- case GNUNET_TRANSPORT_PS_CONNECTED:
- /* duplicate SYN_ACK, let's answer by duplicate ACK just in case */
- send_session_ack_message (n);
- break;
-
- case GNUNET_TRANSPORT_PS_RECONNECT_ATS:
- /* we didn't expect any SYN_ACK, as we are waiting for ATS
- to give us a new address... */
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# unexpected SYN_ACK messages (waiting on
ATS)"),
- 1,
- GNUNET_NO);
- break;
-
- case GNUNET_TRANSPORT_PS_RECONNECT_SENT:
- /* Reconnecting with new address address worked; go back to connected! */
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_CONNECTED,
- GNUNET_TIME_relative_to_absolute (
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT));
- send_session_ack_message (n);
- break;
-
- case GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT:
- /* new address worked; adopt it and go back to connected! */
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_CONNECTED,
- GNUNET_TIME_relative_to_absolute (
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT));
- GNUNET_break (GNUNET_NO == n->alternative_address.ats_active);
-
- /* Set primary addresses */
- set_primary_address (n,
- n->alternative_address.address,
- n->alternative_address.session,
- n->alternative_address.bandwidth_in,
- n->alternative_address.bandwidth_out);
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# Successful attempts to switch addresses"),
- 1,
- GNUNET_NO);
-
- GNUNET_HELLO_address_free (n->alternative_address.address);
- memset (&n->alternative_address,
- 0,
- sizeof(n->alternative_address));
- send_session_ack_message (n);
- break;
-
- case GNUNET_TRANSPORT_PS_DISCONNECT:
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# unexpected SYN_ACK messages
(disconnecting)"),
- 1, GNUNET_NO);
- return GNUNET_SYSERR;
-
- case GNUNET_TRANSPORT_PS_DISCONNECT_FINISHED:
- GNUNET_assert (0);
- break;
-
- default:
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unhandled state `%s'\n",
- GNUNET_TRANSPORT_ps2s (n->state));
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * A session was terminated. Take note; if needed, try to get
- * an alternative address from ATS.
- *
- * @param peer identity of the peer where the session died
- * @param session session that is gone
- * @return #GNUNET_YES if this was a session used, #GNUNET_NO if
- * this session was not in use
- */
-int
-GST_neighbours_session_terminated (const struct GNUNET_PeerIdentity *peer,
- struct GNUNET_ATS_Session *session)
-{
- struct NeighbourMapEntry *n;
-
- if (NULL == (n = lookup_neighbour (peer)))
- return GNUNET_NO; /* can't affect us */
- if (session != n->primary_address.session)
- {
- /* Free alternative address */
- if (session == n->alternative_address.session)
- {
- if (GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT == n->state)
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_CONNECTED,
- n->timeout);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Session died, cleaning up alternative address\n");
- free_address (&n->alternative_address);
- }
- return GNUNET_NO; /* doesn't affect us further */
- }
-
- n->expect_latency_response = GNUNET_NO;
- /* The session for neighbour's primary address died */
- switch (n->state)
- {
- case GNUNET_TRANSPORT_PS_NOT_CONNECTED:
- GNUNET_break (0);
- free_neighbour (n);
- return GNUNET_YES;
-
- case GNUNET_TRANSPORT_PS_INIT_ATS:
- GNUNET_break (0);
- free_neighbour (n);
- return GNUNET_YES;
-
- case GNUNET_TRANSPORT_PS_SYN_SENT:
- /* The session used to send the SYN terminated:
- * this implies a connect error*/
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Failed to send SYN in CONNECT_SENT with `%s' %p: session
terminated\n",
- GST_plugins_a2s (n->primary_address.address),
- n->primary_address.session);
-
- /* Destroy the address since it cannot be used */
- unset_primary_address (n);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_INIT_ATS,
- GNUNET_TIME_relative_to_absolute (
- ATS_RESPONSE_TIMEOUT));
- break;
-
- case GNUNET_TRANSPORT_PS_SYN_RECV_ATS:
- case GNUNET_TRANSPORT_PS_SYN_RECV_ACK:
- /* error on inbound session; free neighbour entirely */
- free_neighbour (n);
- return GNUNET_YES;
-
- case GNUNET_TRANSPORT_PS_CONNECTED:
- /* Our primary connection died, try a fast reconnect */
- unset_primary_address (n);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_RECONNECT_ATS,
- GNUNET_TIME_relative_to_absolute (
- ATS_RESPONSE_TIMEOUT));
- break;
-
- case GNUNET_TRANSPORT_PS_RECONNECT_ATS:
- /* we don't have an address, how can it go down? */
- GNUNET_break (0);
- break;
-
- case GNUNET_TRANSPORT_PS_RECONNECT_SENT:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Failed to send SYN in RECONNECT_SENT with `%s' %p: session
terminated\n",
- GST_plugins_a2s (n->primary_address.address),
- n->primary_address.session);
- /* Destroy the address since it cannot be used */
- unset_primary_address (n);
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_RECONNECT_ATS,
- GNUNET_TIME_relative_to_absolute (
- ATS_RESPONSE_TIMEOUT));
- break;
-
- case GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT:
- /* primary went down while we were waiting for SYN_ACK on secondary;
- secondary as primary */
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Connection `%s' %p to peer `%s' was terminated while
switching, "
- "switching to alternative address `%s' %p\n",
- GST_plugins_a2s (n->primary_address.address),
- n->primary_address.session,
- GNUNET_i2s (peer),
- GST_plugins_a2s (n->alternative_address.address),
- n->alternative_address.session);
-
- /* Destroy the inbound address since it cannot be used */
- free_address (&n->primary_address);
- n->primary_address = n->alternative_address;
- GNUNET_assert (GNUNET_YES ==
- GST_ats_is_known (n->primary_address.address,
- n->primary_address.session));
- memset (&n->alternative_address,
- 0,
- sizeof(struct NeighbourAddress));
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_RECONNECT_SENT,
- GNUNET_TIME_relative_to_absolute (
- FAST_RECONNECT_TIMEOUT));
- break;
-
- case GNUNET_TRANSPORT_PS_DISCONNECT:
- unset_primary_address (n);
- break;
-
- case GNUNET_TRANSPORT_PS_DISCONNECT_FINISHED:
- /* neighbour was freed and plugins told to terminate session */
- return GNUNET_NO;
-
- default:
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unhandled state `%s'\n",
- GNUNET_TRANSPORT_ps2s (n->state));
- GNUNET_break (0);
- break;
- }
- if (NULL != n->task)
- GNUNET_SCHEDULER_cancel (n->task);
- n->task = GNUNET_SCHEDULER_add_now (&master_task, n);
- return GNUNET_YES;
-}
-
-
-/**
- * We received a 'ACK' message from the other peer.
- * If we sent a 'SYN_ACK' last, this means we are now
- * connected. Otherwise, do nothing.
- *
- * @param message possibly a 'struct GNUNET_ATS_SessionConnectMessage' (check
format)
- * @param address address of the other peer
- * @param session session to use (or NULL)
- * @return #GNUNET_OK if the message was fine, #GNUNET_SYSERR on serious error
- */
-int
-GST_neighbours_handle_session_ack (const struct GNUNET_MessageHeader *message,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session)
-{
- struct NeighbourMapEntry *n;
-
- (void) session;
- if (ntohs (message->size) != sizeof(struct GNUNET_MessageHeader))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# ACK messages received"),
- 1,
- GNUNET_NO);
- if (NULL == (n = lookup_neighbour (&address->peer)))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received ACK for peer `%s' in state %s/%s\n",
- GNUNET_i2s (&address->peer),
- GNUNET_TRANSPORT_ps2s (n->state),
- print_ack_state (n->ack_state));
-
- /* Check if we are in a plausible state for having sent
- a SYN_ACK. If not, return, otherwise break.
-
- The remote peers sends a ACK as a response for a SYN_ACK
- message.
-
- We expect a ACK:
- - If a remote peer has sent a SYN, we responded with a SYN_ACK and
- now wait for the ACK to finally be connected
- - If we sent a SYN_ACK to this peer before */if
(((GNUNET_TRANSPORT_PS_SYN_RECV_ACK != n->state) &&
- (ACK_SEND_ACK != n->ack_state)) ||
- (NULL == n->primary_address.address))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Received unexpected ACK message from peer `%s' in state
%s/%s\n",
- GNUNET_i2s (&address->peer),
- GNUNET_TRANSPORT_ps2s (n->state),
- print_ack_state (n->ack_state));
-
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# unexpected ACK messages"),
- 1,
- GNUNET_NO);
- return GNUNET_OK;
- }
- if (GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT == n->state)
- {
- /* We tried to switch addresses while being connect. We explicitly wait
- * for a SYN_ACK before going to GNUNET_TRANSPORT_PS_CONNECTED,
- * so we do not want to set the address as in use! */
- return GNUNET_OK;
- }
- set_state_and_timeout (n,
- GNUNET_TRANSPORT_PS_CONNECTED,
- GNUNET_TIME_relative_to_absolute (
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT));
-
- if (NULL == n->primary_address.address)
- {
- /* See issue #3693.
- * We are in state = PSY_SYN_RECV_ACK or ack_state = ACK_SEND_ACK, which
- * really means we did try (and succeed) to send a SYN and are waiting for
- * an ACK.
- * That suggests that the primary_address used to be non-NULL, but maybe it
- * got reset to NULL without the state being changed appropriately?
- */GNUNET_break (0);
- return GNUNET_OK;
- }
-
- /* Reset backoff for primary address */
- GST_ats_block_reset (n->primary_address.address,
- n->primary_address.session);
- return GNUNET_OK;
-}
-
-
-/**
- * Test if we're connected to the given peer.
- *
- * @param target peer to test
- * @return #GNUNET_YES if we are connected, #GNUNET_NO if not
- */
-int
-GST_neighbours_test_connected (const struct GNUNET_PeerIdentity *target)
-{
- return test_connected (lookup_neighbour (target));
-}
-
-
-/**
- * Task to asynchronously run #free_neighbour().
- *
- * @param cls the `struct NeighbourMapEntry` to free
- */
-static void
-delayed_disconnect (void *cls)
-{
- struct NeighbourMapEntry *n = cls;
-
- n->delayed_disconnect_task = NULL;
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Disconnecting by request from peer %s\n",
- GNUNET_i2s (&n->id));
- free_neighbour (n);
-}
-
-
-void
-GST_neighbours_handle_quota_message (const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_MessageHeader *msg)
-{
- struct NeighbourMapEntry *n;
- const struct GNUNET_ATS_SessionQuotaMessage *sqm;
- struct GNUNET_BANDWIDTH_Value32NBO last;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received QUOTA message from peer `%s'\n",
- GNUNET_i2s (peer));
- if (ntohs (msg->size) != sizeof(struct GNUNET_ATS_SessionQuotaMessage))
- {
- GNUNET_break_op (0);
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# quota messages ignored (malformed)"),
- 1,
- GNUNET_NO);
- return;
- }
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# QUOTA messages received"),
- 1, GNUNET_NO);
- sqm = (const struct GNUNET_ATS_SessionQuotaMessage *) msg;
- if (NULL == (n = lookup_neighbour (peer)))
- {
- /* gone already */
- return;
- }
- last = GNUNET_BANDWIDTH_value_max (GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT,
- GNUNET_BANDWIDTH_value_init (ntohl (
-
sqm->quota)));
- if (last.value__ != n->neighbour_receive_quota.value__)
- {
- n->neighbour_receive_quota = last;
- send_outbound_quota_to_clients (n);
- }
-}
-
-
-/**
- * We received a disconnect message from the given peer,
- * validate and process.
- *
- * @param peer sender of the message
- * @param msg the disconnect message
- */
-void
-GST_neighbours_handle_disconnect_message (const struct
- GNUNET_PeerIdentity *peer,
- const struct
- GNUNET_MessageHeader *msg)
-{
- struct NeighbourMapEntry *n;
- const struct GNUNET_ATS_SessionDisconnectMessage *sdm;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received DISCONNECT message from peer `%s'\n",
- GNUNET_i2s (peer));
- if (ntohs (msg->size) != sizeof(struct GNUNET_ATS_SessionDisconnectMessage))
- {
- GNUNET_break_op (0);
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# disconnect messages ignored (malformed)"),
- 1,
- GNUNET_NO);
- return;
- }
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# DISCONNECT messages received"),
- 1, GNUNET_NO);
- sdm = (const struct GNUNET_ATS_SessionDisconnectMessage *) msg;
- if (NULL == (n = lookup_neighbour (peer)))
- {
- /* gone already */
- return;
- }
- if (GNUNET_TIME_absolute_ntoh (sdm->timestamp).abs_value_us <=
- n->connect_ack_timestamp.abs_value_us)
- {
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# disconnect messages ignored (timestamp)"),
- 1,
- GNUNET_NO);
- return;
- }
- if (0 != memcmp (peer,
- &sdm->public_key,
- sizeof(struct GNUNET_PeerIdentity)))
- {
- GNUNET_break_op (0);
- return;
- }
- if (ntohl (sdm->purpose.size) !=
- sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)
- + sizeof(struct GNUNET_CRYPTO_EddsaPublicKey)
- + sizeof(struct GNUNET_TIME_AbsoluteNBO))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "DISCONNECT message from peer `%s' has invalid size\n",
- GNUNET_i2s (peer));
- GNUNET_break_op (0);
- return;
- }
- if (GNUNET_OK !=
- GNUNET_CRYPTO_eddsa_verify_ (
- GNUNET_MESSAGE_TYPE_TRANSPORT_SESSION_DISCONNECT,
- &sdm->purpose,
- &sdm->signature,
- &sdm->public_key))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "DISCONNECT message from peer `%s' cannot be verified \n",
- GNUNET_i2s (peer));
- GNUNET_break_op (0);
- return;
- }
- if (NULL == n->delayed_disconnect_task)
- {
- n->delayed_disconnect_task = GNUNET_SCHEDULER_add_now (&delayed_disconnect,
- n);
- }
-}
-
-
-/**
- * Closure for the #neighbours_iterate() function.
- */
-struct IteratorContext
-{
- /**
- * Function to call on each connected neighbour.
- */
- GST_NeighbourIterator cb;
-
- /**
- * Closure for @e cb.
- */
- void *cb_cls;
-};
-
-
-/**
- * Call the callback from the closure for each neighbour.
- *
- * @param cls the `struct IteratorContext`
- * @param key the hash of the public key of the neighbour
- * @param value the `struct NeighbourMapEntry`
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-neighbours_iterate (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct IteratorContext *ic = cls;
- struct NeighbourMapEntry *n = value;
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in;
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out;
-
- (void) key;
- if (NULL != n->primary_address.address)
- {
- bandwidth_in = n->primary_address.bandwidth_in;
- bandwidth_out = n->primary_address.bandwidth_out;
- }
- else
- {
- bandwidth_in = GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT;
- bandwidth_out = GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT;
- }
- ic->cb (ic->cb_cls,
- &n->id,
- n->primary_address.address,
- n->state,
- n->timeout,
- bandwidth_in, bandwidth_out);
- return GNUNET_OK;
-}
-
-
-/**
- * Iterate over all connected neighbours.
- *
- * @param cb function to call
- * @param cb_cls closure for @a cb
- */
-void
-GST_neighbours_iterate (GST_NeighbourIterator cb,
- void *cb_cls)
-{
- struct IteratorContext ic;
-
- if (NULL == neighbours)
- return; /* can happen during shutdown */
- ic.cb = cb;
- ic.cb_cls = cb_cls;
- GNUNET_CONTAINER_multipeermap_iterate (neighbours,
- &neighbours_iterate,
- &ic);
-}
-
-
-/**
- * If we have an active connection to the given target, it must be shutdown.
- *
- * @param target peer to disconnect from
- */
-void
-GST_neighbours_force_disconnect (const struct GNUNET_PeerIdentity *target)
-{
- struct NeighbourMapEntry *n;
-
- if (NULL == (n = lookup_neighbour (target)))
- return; /* not active */
- if (GNUNET_YES == test_connected (n))
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# disconnected from peer upon explicit
request"),
- 1,
- GNUNET_NO);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Forced disconnect from peer %s\n",
- GNUNET_i2s (target));
- disconnect_neighbour (n);
-}
-
-
-/**
- * Obtain current address information for the given neighbour.
- *
- * @param peer
- * @return address currently used
- */
-const struct GNUNET_HELLO_Address *
-GST_neighbour_get_current_address (const struct GNUNET_PeerIdentity *peer)
-{
- struct NeighbourMapEntry *n;
-
- n = lookup_neighbour (peer);
- if (NULL == n)
- return NULL;
- return n->primary_address.address;
-}
-
-
-/**
- * Initialize the neighbours subsystem.
- *
- * @param max_fds maximum number of fds to use
- */
-void
-GST_neighbours_start (unsigned int max_fds)
-{
- (void) max_fds;
- neighbours = GNUNET_CONTAINER_multipeermap_create (NEIGHBOUR_TABLE_SIZE,
- GNUNET_NO);
- util_transmission_tk = GNUNET_SCHEDULER_add_delayed (
- UTIL_TRANSMISSION_INTERVAL,
- &utilization_transmission,
- NULL);
-}
-
-
-/**
- * Disconnect from the given neighbour.
- *
- * @param cls unused
- * @param key hash of neighbour's public key (not used)
- * @param value the `struct NeighbourMapEntry` of the neighbour
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-disconnect_all_neighbours (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct NeighbourMapEntry *n = value;
-
- (void) cls;
- (void) key;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Disconnecting peer `%4s' during shutdown\n",
- GNUNET_i2s (&n->id));
- free_neighbour (n);
- return GNUNET_OK;
-}
-
-
-/**
- * Cleanup the neighbours subsystem.
- */
-void
-GST_neighbours_stop ()
-{
- if (NULL == neighbours)
- return;
- if (NULL != util_transmission_tk)
- {
- GNUNET_SCHEDULER_cancel (util_transmission_tk);
- util_transmission_tk = NULL;
- }
- GNUNET_CONTAINER_multipeermap_iterate (neighbours,
- &disconnect_all_neighbours,
- NULL);
- GNUNET_CONTAINER_multipeermap_destroy (neighbours);
- neighbours = NULL;
-}
-
-
-/* end of file gnunet-service-transport_neighbours.c */
diff --git a/src/transport/gnunet-service-transport_neighbours.h
b/src/transport/gnunet-service-transport_neighbours.h
deleted file mode 100644
index 7ce911aa1..000000000
--- a/src/transport/gnunet-service-transport_neighbours.h
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/gnunet-service-transport_neighbours.h
- * @brief neighbour management API
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_TRANSPORT_NEIGHBOURS_H
-#define GNUNET_SERVICE_TRANSPORT_NEIGHBOURS_H
-
-#include "gnunet_statistics_service.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_transport_plugin.h"
-#include "gnunet-service-transport.h"
-#include "transport.h"
-#include "gnunet_util_lib.h"
-
-
-/**
- * Initialize the neighbours subsystem.
- *
- * @param max_fds maximum number of fds to use
- */
-void
-GST_neighbours_start (unsigned int max_fds);
-
-
-/**
- * Cleanup the neighbours subsystem.
- */
-void
-GST_neighbours_stop (void);
-
-
-/**
- * Test if we're connected to the given peer.
- *
- * @param target peer to test
- * @return #GNUNET_YES if we are connected, #GNUNET_NO if not
- */
-int
-GST_neighbours_test_connected (const struct GNUNET_PeerIdentity *target);
-
-
-/**
- * Function called after the transmission is done.
- *
- * @param cls closure
- * @param success #GNUNET_OK on success, #GNUNET_NO on failure, #GNUNET_SYSERR
if we're not connected
- * @param bytes_payload how much payload was transmitted
- * @param bytes_on_wire how many bytes were used on the wire
- */
-typedef void
-(*GST_NeighbourSendContinuation) (void *cls,
- int success,
- size_t bytes_payload,
- size_t bytes_on_wire);
-
-
-/**
- * Transmit a message to the given target using the active connection.
- *
- * @param target destination
- * @param msg message to send
- * @param msg_size number of bytes in @a msg
- * @param timeout when to fail with timeout
- * @param cont function to call when done
- * @param cont_cls closure for @a cont
- */
-void
-GST_neighbours_send (const struct GNUNET_PeerIdentity *target,
- const void *msg,
- size_t msg_size,
- struct GNUNET_TIME_Relative timeout,
- GST_NeighbourSendContinuation cont, void *cont_cls);
-
-
-/**
- * We have received a message from the given sender.
- * How long should we delay before receiving more?
- * (Also used to keep the peer marked as live).
- *
- * @param sender sender of the message
- * @param size size of the message
- * @param do_forward set to #GNUNET_YES if the message should be forwarded to
clients
- * #GNUNET_NO if the neighbour is not connected or violates
the quota
- * @return how long to wait before reading more from this sender
- */
-struct GNUNET_TIME_Relative
-GST_neighbours_calculate_receive_delay (const struct
- GNUNET_PeerIdentity *sender,
- ssize_t size,
- int *do_forward);
-
-
-/**
- * Keep the connection to the given neighbour alive longer,
- * we received a KEEPALIVE (or equivalent); send a response.
- *
- * @param neighbour neighbour to keep alive (by sending keep alive response)
- * @param m the keep alive message containing the nonce to respond to
- */
-void
-GST_neighbours_keepalive (const struct GNUNET_PeerIdentity *neighbour,
- const struct GNUNET_MessageHeader *m);
-
-
-/**
- * We received a KEEP_ALIVE_RESPONSE message and use this to calculate
- * latency to this peer. Pass the updated information (existing ats
- * plus calculated latency) to ATS.
- *
- * @param neighbour neighbour to keep alive
- * @param m the message containing the keep alive response
- */
-void
-GST_neighbours_keepalive_response (const struct GNUNET_PeerIdentity *neighbour,
- const struct GNUNET_MessageHeader *m);
-
-
-/**
- * If we have an active connection to the given target, it must be shutdown.
- *
- * @param target peer to disconnect from
- */
-void
-GST_neighbours_force_disconnect (const struct GNUNET_PeerIdentity *target);
-
-
-/**
- * Function called for each neighbour.
- *
- * @param cls closure
- * @param peer identity of the neighbour
- * @param address the address of the neighbour
- * @param state current state the peer is in
- * @param state_timeout timeout for this state
- * @param bandwidth_in inbound quota in NBO
- * @param bandwidth_out outbound quota in NBO
- */
-typedef void
-(*GST_NeighbourIterator) (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Address *address,
- enum GNUNET_TRANSPORT_PeerState state,
- struct GNUNET_TIME_Absolute state_timeout,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
- struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out);
-
-
-/**
- * Iterate over all connected neighbours.
- *
- * @param cb function to call
- * @param cb_cls closure for @a cb
- */
-void
-GST_neighbours_iterate (GST_NeighbourIterator cb, void *cb_cls);
-
-
-/**
- * A session was terminated. Take note.
- *
- * @param peer identity of the peer where the session died
- * @param session session that is gone
- * @return #GNUNET_YES if this was a session used, #GNUNET_NO if
- * this session was not in use
- */
-int
-GST_neighbours_session_terminated (const struct GNUNET_PeerIdentity *peer,
- struct GNUNET_ATS_Session *session);
-
-
-/**
- * Track information about data we received from the
- * given address (used to notify ATS about our utilization
- * of allocated resources).
- *
- * @param address the address we got data from
- * @param message the message we received (really only the size is used)
- */
-void
-GST_neighbours_notify_data_recv (const struct GNUNET_HELLO_Address *address,
- const struct GNUNET_MessageHeader *message);
-
-
-/**
- * Track information about data we transmitted using the given @a
- * address and @a session (used to notify ATS about our utilization of
- * allocated resources).
- *
- * @param address the address we transmitted data to
- * @param session session we used to transmit data
- * @param message the message we sent (really only the size is used)
- */
-void
-GST_neighbours_notify_data_sent (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- size_t size);
-
-
-/**
- * For an existing neighbour record, set the active connection to
- * use the given address.
- *
- * @param address address of the other peer to start using
- * @param session session to use (or NULL)
- * @param bandwidth_in inbound quota to be used when connection is up
- * @param bandwidth_out outbound quota to be used when connection is up
- */
-void
-GST_neighbours_switch_to_address (const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_in,
- struct GNUNET_BANDWIDTH_Value32NBO
- bandwidth_out);
-
-
-/**
- * We received a 'SESSION_CONNECT' message from the other peer.
- * Consider switching to it.
- *
- * @param message possibly a 'struct GNUNET_ATS_SessionConnectMessage' (check
format)
- * @param peer identity of the peer to switch the address for
- * @return #GNUNET_OK if the message was fine, #GNUNET_SYSERR on serious error
- */
-int
-GST_neighbours_handle_session_syn (const struct GNUNET_MessageHeader *message,
- const struct GNUNET_PeerIdentity *peer);
-
-
-/**
- * We received a 'SESSION_CONNECT_ACK' message from the other peer.
- * Consider switching to it.
- *
- * @param message possibly a `struct GNUNET_ATS_SessionConnectMessage` (check
format)
- * @param address address of the other peer
- * @param session session to use (or NULL)
- * @return #GNUNET_OK if the message was fine, #GNUNET_SYSERR on serious error
- */
-int
-GST_neighbours_handle_session_syn_ack (const struct
- GNUNET_MessageHeader *message,
- const struct
- GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session);
-
-
-/**
- * We received a 'SESSION_ACK' message from the other peer.
- * If we sent a 'CONNECT_ACK' last, this means we are now
- * connected. Otherwise, do nothing.
- *
- * @param message possibly a 'struct GNUNET_ATS_SessionConnectMessage' (check
format)
- * @param address address of the other peer
- * @param session session to use (or NULL)
- * @return #GNUNET_OK if the message was fine, #GNUNET_SYSERR on serious error
- */
-int
-GST_neighbours_handle_session_ack (const struct GNUNET_MessageHeader *message,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session);
-
-
-/**
- * Obtain current address information for the given neighbour.
- *
- * @param peer
- * @return address currently used
- */
-const struct GNUNET_HELLO_Address *
-GST_neighbour_get_current_address (const struct GNUNET_PeerIdentity *peer);
-
-
-/**
- * We received a quota message from the given peer,
- * validate and process.
- *
- * @param peer sender of the message
- * @param msg the quota message
- */
-void
-GST_neighbours_handle_quota_message (const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_MessageHeader *msg);
-
-
-/**
- * We received a disconnect message from the given peer,
- * validate and process.
- *
- * @param peer sender of the message
- * @param msg the disconnect message
- */
-void
-GST_neighbours_handle_disconnect_message (const struct
- GNUNET_PeerIdentity *peer,
- const struct
- GNUNET_MessageHeader *msg);
-
-
-#endif
-/* end of file gnunet-service-transport_neighbours.h */
diff --git a/src/transport/gnunet-service-transport_plugins.c
b/src/transport/gnunet-service-transport_plugins.c
deleted file mode 100644
index 218ef80ab..000000000
--- a/src/transport/gnunet-service-transport_plugins.c
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2014 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/gnunet-service-transport_plugins.c
- * @brief plugin management
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet-service-transport.h"
-#include "gnunet-service-transport_hello.h"
-#include "gnunet-service-transport_ats.h"
-#include "gnunet-service-transport_plugins.h"
-
-/**
- * Entry in doubly-linked list of all of our plugins.
- */
-struct TransportPlugin
-{
- /**
- * This is a doubly-linked list.
- */
- struct TransportPlugin *next;
-
- /**
- * This is a doubly-linked list.
- */
- struct TransportPlugin *prev;
-
- /**
- * API of the transport as returned by the plugin's
- * initialization function.
- */
- struct GNUNET_TRANSPORT_PluginFunctions *api;
-
- /**
- * Short name for the plugin (e.g. "tcp").
- */
- char *short_name;
-
- /**
- * Name of the library (e.g. "gnunet_plugin_transport_tcp").
- */
- char *lib_name;
-
- /**
- * Environment this transport service is using
- * for this plugin.
- */
- struct GNUNET_TRANSPORT_PluginEnvironment env;
-};
-
-/**
- * Head of DLL of all loaded plugins.
- */
-static struct TransportPlugin *plugins_head;
-
-/**
- * Head of DLL of all loaded plugins.
- */
-static struct TransportPlugin *plugins_tail;
-
-
-/**
- * Function that will be called to update metrics for an address
- *
- * @param cls closure
- * @param address address to update metrics for
- * @param distance new distance
- */
-static void
-plugin_env_update_distance (void *cls,
- const struct GNUNET_HELLO_Address *address,
- uint32_t distance)
-{
- GST_ats_update_distance (address,
- distance);
-}
-
-
-/**
- * Function that will be called to figure if an address is an loopback,
- * LAN, WAN etc. address
- *
- * @param cls closure
- * @param addr binary address
- * @param addrlen length of the @a addr
- * @return type of the network @a addr belongs to
- */
-static enum GNUNET_NetworkType
-plugin_env_address_to_type (void *cls,
- const struct sockaddr *addr,
- size_t addrlen)
-{
- if (NULL == GST_is)
- {
- GNUNET_break (0);
- return GNUNET_NT_UNSPECIFIED;
- }
- return GNUNET_NT_scanner_get_type (GST_is,
- addr,
- addrlen);
-}
-
-
-void
-GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb,
- GNUNET_TRANSPORT_AddressNotification address_cb,
- GNUNET_TRANSPORT_SessionStart session_start_cb,
- GNUNET_TRANSPORT_SessionEnd session_end_cb)
-{
- struct TransportPlugin *plug;
- struct TransportPlugin *next;
- unsigned long long tneigh;
- char *libname;
- char *plugs;
- char *pos;
- int fail;
-
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_number (GST_cfg,
- "TRANSPORT",
- "NEIGHBOUR_LIMIT",
- &tneigh))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Transport service is lacking NEIGHBOUR_LIMIT option.\n"));
- return;
- }
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_string (GST_cfg,
- "TRANSPORT",
- "PLUGINS",
- &plugs))
- return;
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ ("Starting transport plugins `%s'\n"),
- plugs);
- for (pos = strtok (plugs, " "); pos != NULL; pos = strtok (NULL, " "))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ ("Loading `%s' transport plugin\n"),
- pos);
- GNUNET_asprintf (&libname,
- "libgnunet_plugin_transport_%s",
- pos);
- plug = GNUNET_new (struct TransportPlugin);
- plug->short_name = GNUNET_strdup (pos);
- plug->lib_name = libname;
- plug->env.cfg = GST_cfg;
- plug->env.my_identity = &GST_my_identity;
- plug->env.get_our_hello = &GST_hello_get;
- plug->env.cls = plug->short_name;
- plug->env.receive = recv_cb;
- plug->env.notify_address = address_cb;
- plug->env.session_start = session_start_cb;
- plug->env.session_end = session_end_cb;
- plug->env.get_address_type = &plugin_env_address_to_type;
- plug->env.update_address_distance = &plugin_env_update_distance;
- plug->env.max_connections = tneigh;
- plug->env.stats = GST_stats;
- GNUNET_CONTAINER_DLL_insert (plugins_head,
- plugins_tail,
- plug);
- }
- GNUNET_free (plugs);
- next = plugins_head;
- while (NULL != next)
- {
- plug = next;
- next = plug->next;
- plug->api = GNUNET_PLUGIN_load (plug->lib_name,
- &plug->env);
- if (NULL == plug->api)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to load transport plugin for `%s'\n"),
- plug->lib_name);
- GNUNET_CONTAINER_DLL_remove (plugins_head,
- plugins_tail,
- plug);
- GNUNET_free (plug->short_name);
- GNUNET_free (plug->lib_name);
- GNUNET_free (plug);
- continue;
- }
- fail = GNUNET_NO;
- if (NULL == plug->api->address_pretty_printer)
- {
- fail = GNUNET_YES;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Missing function `%s' in transport plugin for `%s'\n"),
- "address_pretty_printer",
- plug->lib_name);
- }
- if (NULL == plug->api->address_to_string)
- {
- fail = GNUNET_YES;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Missing function `%s' in transport plugin for `%s'\n"),
- "address_to_string",
- plug->lib_name);
- }
- if (NULL == plug->api->string_to_address)
- {
- fail = GNUNET_YES;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Missing function `%s' in transport plugin for `%s'\n"),
- "string_to_address",
- plug->lib_name);
- }
- if (NULL == plug->api->check_address)
- {
- fail = GNUNET_YES;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Missing function `%s' in transport plugin for `%s'\n"),
- "check_address",
- plug->lib_name);
- }
- if (NULL == plug->api->get_session)
- {
- fail = GNUNET_YES;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Missing function `%s' in transport plugin for `%s'\n"),
- "get_session",
- plug->lib_name);
- }
- if (NULL == plug->api->get_network)
- {
- fail = GNUNET_YES;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Missing function `%s' in transport plugin for `%s'\n"),
- "get_network",
- plug->lib_name);
- }
- if (NULL == plug->api->send)
- {
- fail = GNUNET_YES;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Missing function `%s' in transport plugin for `%s'\n"),
- "send",
- plug->lib_name);
- }
- if (NULL == plug->api->disconnect_peer)
- {
- fail = GNUNET_YES;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Missing function `%s' in transport plugin for `%s'\n"),
- "disconnect_peer",
- plug->lib_name);
- }
- if (NULL == plug->api->disconnect_session)
- {
- fail = GNUNET_YES;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Missing function `%s' in transport plugin for `%s'\n"),
- "disconnect_session",
- plug->lib_name);
- }
- if (NULL == plug->api->query_keepalive_factor)
- {
- fail = GNUNET_YES;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Missing function `%s' in transport plugin for `%s'\n"),
- "query_keepalive_factor",
- plug->lib_name);
- }
- if (NULL == plug->api->update_session_timeout)
- {
- fail = GNUNET_YES;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Missing function `%s' in transport plugin for `%s'\n"),
- "update_session_timeout",
- plug->lib_name);
- }
- if (GNUNET_YES == fail)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Did not load plugin `%s' due to missing functions\n"),
- plug->lib_name);
- GNUNET_break (NULL == GNUNET_PLUGIN_unload (plug->lib_name, plug->api));
- GNUNET_CONTAINER_DLL_remove (plugins_head,
- plugins_tail,
- plug);
- GNUNET_free (plug->short_name);
- GNUNET_free (plug->lib_name);
- GNUNET_free (plug);
- }
- }
-}
-
-
-/**
- * Unload all plugins
- */
-void
-GST_plugins_unload ()
-{
- struct TransportPlugin *plug;
-
- while (NULL != (plug = plugins_head))
- {
- GNUNET_break (NULL == GNUNET_PLUGIN_unload (plug->lib_name, plug->api));
- GNUNET_free (plug->lib_name);
- GNUNET_free (plug->short_name);
- GNUNET_CONTAINER_DLL_remove (plugins_head, plugins_tail, plug);
- GNUNET_free (plug);
- }
-}
-
-
-/**
- * Obtain the plugin API based on a plugin name.
- *
- * @param name name of the plugin
- * @return the plugin's API, NULL if the plugin is not loaded
- */
-struct GNUNET_TRANSPORT_PluginFunctions *
-GST_plugins_find (const char *name)
-{
- struct TransportPlugin *pos;
-
- for (pos = plugins_head; NULL != pos; pos = pos->next)
- if (0 == strcmp (name, pos->short_name))
- break;
- if (NULL == pos)
- return NULL;
- return pos->api;
-}
-
-
-/**
- * Obtain the plugin API based on a the stripped plugin name after the
underscore.
- *
- * Example: GST_plugins_printer_find (http_client) will return all plugins
- * starting with the prefix "http":
- * http_client or server if loaded
- *
- * @param name name of the plugin
- * @return the plugin's API, NULL if the plugin is not loaded
- */
-struct GNUNET_TRANSPORT_PluginFunctions *
-GST_plugins_printer_find (const char *name)
-{
- struct TransportPlugin *pos;
- char *stripped = GNUNET_strdup (name);
- char *sep = strchr (stripped, '_');
-
- if (NULL != sep)
- sep[0] = '\0';
- for (pos = plugins_head; NULL != pos; pos = pos->next)
- if (pos->short_name == strstr (pos->short_name, stripped))
- break;
- GNUNET_free (stripped);
- if (NULL == pos)
- return NULL;
- return pos->api;
-}
-
-
-/**
- * Convert a given address to a human-readable format. Note that the
- * return value will be overwritten on the next call to this function.
- *
- * @param address the address to convert
- * @return statically allocated (!) human-readable address
- */
-const char *
-GST_plugins_a2s (const struct GNUNET_HELLO_Address *address)
-{
- struct GNUNET_TRANSPORT_PluginFunctions *api;
- static char unable_to_show[1024];
- static const char *s;
-
- if (NULL == address)
- return "<NULL>";
- if (0 == address->address_length)
- return TRANSPORT_SESSION_INBOUND_STRING; /* Addresse with length 0 are
inbound, address->address itself may be NULL */
- api = GST_plugins_printer_find (address->transport_name);
- if (NULL == api)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Failed to find transport plugin `%s'\n",
- address->transport_name);
- return "<plugin unknown>";
- }
- if (0 == address->address_length)
- {
- GNUNET_snprintf (unable_to_show,
- sizeof(unable_to_show),
- "<unable to stringify %u-byte long address of %s
transport>",
- (unsigned int) address->address_length,
- address->transport_name);
- return unable_to_show;
- }
- return(NULL != (s = api->address_to_string (NULL,
- address->address,
- address->address_length))
- ? s
- : "<invalid>");
-}
-
-
-void
-GST_plugins_monitor_subscribe (GNUNET_TRANSPORT_SessionInfoCallback cb,
- void *cb_cls)
-{
- struct TransportPlugin *pos;
-
- for (pos = plugins_head; NULL != pos; pos = pos->next)
- if (NULL == pos->api->setup_monitor)
- GNUNET_break (0);
- else
- pos->api->setup_monitor (pos->api->cls,
- cb,
- cb_cls);
-}
-
-
-/* end of file gnunet-service-transport_plugins.c */
diff --git a/src/transport/gnunet-service-transport_plugins.h
b/src/transport/gnunet-service-transport_plugins.h
deleted file mode 100644
index fdd819fc5..000000000
--- a/src/transport/gnunet-service-transport_plugins.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010,2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/gnunet-service-transport_plugins.h
- * @brief plugin management API
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_TRANSPORT_PLUGINS_H
-#define GNUNET_SERVICE_TRANSPORT_PLUGINS_H
-
-#include "gnunet_statistics_service.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_transport_plugin.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_hello_lib.h"
-
-
-/**
- * Load and initialize all plugins. The respective functions will be
- * invoked by the plugins when the respective events happen. The
- * closure will be set to a 'const char*' containing the name of the
- * plugin that caused the call.
- *
- * @param recv_cb function to call when data is received
- * @param address_cb function to call when our public addresses changed
- * @param session_start_cb function to call when a session was created
- * @param session_end_cb function to call when a session was terminated
- */
-void
-GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb,
- GNUNET_TRANSPORT_AddressNotification address_cb,
- GNUNET_TRANSPORT_SessionStart session_start_cb,
- GNUNET_TRANSPORT_SessionEnd session_end_cb);
-
-/**
- * Unload all plugins
- */
-void
-GST_plugins_unload (void);
-
-
-/**
- * Obtain the plugin API based on a plugin name.
- *
- * @param name name of the plugin
- * @return the plugin's API, NULL if the plugin is not loaded
- */
-struct GNUNET_TRANSPORT_PluginFunctions *
-GST_plugins_find (const char *name);
-
-
-/**
- * Obtain the plugin API based on a the stripped plugin name after the
underscore.
- *
- * Example: GST_plugins_printer_find (http_client) will return all plugins
- * starting with the prefix "http":
- * http_client or server if loaded
- *
- * @param name name of the plugin
- * @return the plugin's API, NULL if the plugin is not loaded
- */
-struct GNUNET_TRANSPORT_PluginFunctions *
-GST_plugins_printer_find (const char *name);
-
-
-/**
- * Convert a given address to a human-readable format. Note that the
- * return value will be overwritten on the next call to this function.
- *
- * @param address address to convert
- * @return statically allocated (!) human-readable address
- */
-const char *
-GST_plugins_a2s (const struct GNUNET_HELLO_Address *address);
-
-
-/**
- * Register callback with all plugins to monitor their status.
- *
- * @param cb callback to register, NULL to unsubscribe
- * @param cb_cls closure for @a cb
- */
-void
-GST_plugins_monitor_subscribe (GNUNET_TRANSPORT_SessionInfoCallback cb,
- void *cb_cls);
-
-
-#endif
-/* end of file gnunet-service-transport_plugins.h */
diff --git a/src/transport/gnunet-service-transport_validation.c
b/src/transport/gnunet-service-transport_validation.c
deleted file mode 100644
index 86161bd85..000000000
--- a/src/transport/gnunet-service-transport_validation.c
+++ /dev/null
@@ -1,1819 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/gnunet-service-transport_validation.c
- * @brief address validation subsystem
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet-service-transport_ats.h"
-#include "gnunet-service-transport_hello.h"
-#include "gnunet-service-transport_neighbours.h"
-#include "gnunet-service-transport_plugins.h"
-#include "gnunet-service-transport_validation.h"
-#include "gnunet-service-transport.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_ats_service.h"
-#include "gnunet_peerinfo_service.h"
-#include "gnunet_signatures.h"
-
-/**
- * Current state of a validation process.
- *
- * FIXME: what state is used to indicate that a validation
- * was successful? If that is clarified/determined, "UGH" in
- * ~gnunetpeerinfogtk.c:1103 should be resolved.
- */
-enum GNUNET_TRANSPORT_ValidationState
-{
- /**
- * Undefined state
- *
- * Used for final callback indicating operation done
- */
- GNUNET_TRANSPORT_VS_NONE,
-
- /**
- * Fresh validation entry
- *
- * Entry was just created, no validation process was executed
- */
- GNUNET_TRANSPORT_VS_NEW,
-
- /**
- * Updated validation entry
- *
- * This is an update for an existing validation entry
- */
- GNUNET_TRANSPORT_VS_UPDATE,
-
- /**
- * Timeout for validation entry
- *
- * A timeout occurred during the validation process
- */
- GNUNET_TRANSPORT_VS_TIMEOUT,
-
- /**
- * Validation entry is removed
- *
- * The validation entry is getting removed due to a failed validation
- */
- GNUNET_TRANSPORT_VS_REMOVE
-};
-
-
-/**
- * How long is a PONG signature valid? We'll recycle a signature until
- * 1/4 of this time is remaining. PONGs should expire so that if our
- * external addresses change an adversary cannot replay them indefinitely.
- * OTOH, we don't want to spend too much time generating PONG signatures,
- * so they must have some lifetime to reduce our CPU usage.
- */
-#define PONG_SIGNATURE_LIFETIME GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_HOURS, 1)
-
-/**
- * After how long do we expire an address in a HELLO that we just
- * validated? This value is also used for our own addresses when we
- * create a HELLO.
- */
-#define HELLO_ADDRESS_EXPIRATION GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_HOURS, 12)
-
-/**
- * How often do we allow PINGing an address that we have not yet
- * validated? This also determines how long we track an address that
- * we cannot validate (because after this time we can destroy the
- * validation record).
- */
-#define UNVALIDATED_PING_KEEPALIVE GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_MINUTES, 5)
-
-/**
- * How often do we PING an address that we have successfully validated
- * in the past but are not actively using? Should be (significantly)
- * smaller than HELLO_ADDRESS_EXPIRATION.
- */
-#define VALIDATED_PING_FREQUENCY GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_MINUTES, 15)
-
-/**
- * How often do we PING an address that we are currently using?
- */
-#define CONNECTED_PING_FREQUENCY GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_MINUTES, 2)
-
-/**
- * How much delay is acceptable for sending the PING or PONG?
- */
-#define ACCEPTABLE_PING_DELAY GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_SECONDS, 1)
-
-/**
- * Size of the validation map hashmap.
- */
-#define VALIDATION_MAP_SIZE 256
-
-/**
- * Priority to use for PINGs
- */
-#define PING_PRIORITY 2
-
-/**
- * Priority to use for PONGs
- */
-#define PONG_PRIORITY 4
-
-
-GNUNET_NETWORK_STRUCT_BEGIN
-
-/**
- * Message used to ask a peer to validate receipt (to check an address
- * from a HELLO). Followed by the address we are trying to validate,
- * or an empty address if we are just sending a PING to confirm that a
- * connection which the receiver (of the PING) initiated is still valid.
- */
-struct TransportPingMessage
-{
- /**
- * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_PING
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Challenge code (to ensure fresh reply).
- */
- uint32_t challenge GNUNET_PACKED;
-
- /**
- * Who is the intended recipient?
- */
- struct GNUNET_PeerIdentity target;
-};
-
-
-/**
- * Message used to validate a HELLO. The challenge is included in the
- * confirmation to make matching of replies to requests possible. The
- * signature signs our public key, an expiration time and our address.<p>
- *
- * This message is followed by our transport address that the PING tried
- * to confirm (if we liked it). The address can be empty (zero bytes)
- * if the PING had not address either (and we received the request via
- * a connection that we initiated).
- */
-struct TransportPongMessage
-{
- /**
- * Type will be #GNUNET_MESSAGE_TYPE_TRANSPORT_PONG
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Challenge code from PING (showing freshness). Not part of what
- * is signed so that we can re-use signatures.
- */
- uint32_t challenge GNUNET_PACKED;
-
- /**
- * Signature.
- */
- struct GNUNET_CRYPTO_EddsaSignature signature;
-
- /**
- * #GNUNET_SIGNATURE_PURPOSE_TRANSPORT_PONG_OWN to confirm that this is a
- * plausible address for the signing peer.
- */
- struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
-
- /**
- * When does this signature expire?
- */
- struct GNUNET_TIME_AbsoluteNBO expiration;
-
- /**
- * Size of address appended to this message (part of what is
- * being signed, hence not redundant).
- */
- uint32_t addrlen GNUNET_PACKED;
-};
-GNUNET_NETWORK_STRUCT_END
-
-/**
- * Information about an address under validation
- */
-struct ValidationEntry
-{
- /**
- * The address.
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * Handle to the blacklist check (if we're currently in it).
- */
- struct GST_BlacklistCheck *bc;
-
- /**
- * Cached PONG signature
- */
- struct GNUNET_CRYPTO_EddsaSignature pong_sig_cache;
-
- /**
- * ID of task that will clean up this entry if nothing happens.
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * ID of task that will trigger address revalidation.
- */
- struct GNUNET_SCHEDULER_Task *revalidation_task;
-
- /**
- * At what time did we send the latest validation request (PING)?
- */
- struct GNUNET_TIME_Absolute send_time;
-
- /**
- * At what time do we send the next validation request (PING)?
- */
- struct GNUNET_TIME_Absolute next_validation;
-
- /**
- * Until when is this address valid?
- * ZERO if it is not currently considered valid.
- */
- struct GNUNET_TIME_Absolute valid_until;
-
- /**
- * Until when is the cached PONG signature valid?
- * ZERO if it is not currently considered valid.
- */
- struct GNUNET_TIME_Absolute pong_sig_valid_until;
-
- /**
- * How long until we can try to validate this address again?
- * FOREVER if the address is for an unsupported plugin (from PEERINFO)
- * ZERO if the address is considered valid (no validation needed)
- * otherwise a time in the future if we're currently denying re-validation
- */
- struct GNUNET_TIME_Absolute revalidation_block;
-
- /**
- * Last observed latency for this address (round-trip), delay between
- * last PING sent and PONG received; FOREVER if we never got a PONG.
- */
- struct GNUNET_TIME_Relative latency;
-
- /**
- * Current state of this validation entry
- */
- enum GNUNET_TRANSPORT_ValidationState state;
-
- /**
- * Challenge number we used.
- */
- uint32_t challenge;
-
- /**
- * When passing the address in #add_valid_peer_address(), did we
- * copy the address to the HELLO yet?
- */
- int copied;
-
- /**
- * Are we currently using this address for a connection?
- */
- int in_use;
-
- /**
- * Are we expecting a PONG message for this validation entry?
- */
- int expecting_pong;
-
- /**
- * Is this address known to ATS as valid right now?
- */
- int known_to_ats;
-
- /**
- * Which network type does our address belong to?
- */
- enum GNUNET_NetworkType network;
-};
-
-
-/**
- * Map of PeerIdentities to 'struct ValidationEntry*'s (addresses
- * of the given peer that we are currently validating, have validated
- * or are blocked from re-validation for a while).
- */
-static struct GNUNET_CONTAINER_MultiPeerMap *validation_map;
-
-/**
- * Context for peerinfo iteration.
- */
-static struct GNUNET_PEERINFO_NotifyContext *pnc;
-
-/**
- * Minimum delay between to validations
- */
-static struct GNUNET_TIME_Relative validation_delay;
-
-/**
- * Number of validations running; any PING that was not yet
- * matched by a PONG and for which we have not yet hit the
- * timeout is considered a running 'validation'.
- */
-static unsigned int validations_running;
-
-/**
- * Validition fast start threshold
- */
-static unsigned int validations_fast_start_threshold;
-
-/**
- * When is next validation allowed
- */
-static struct GNUNET_TIME_Absolute validation_next;
-
-
-/**
- * Context for the validation entry match function.
- */
-struct ValidationEntryMatchContext
-{
- /**
- * Where to store the result?
- */
- struct ValidationEntry *ve;
-
- /**
- * Address we're interested in.
- */
- const struct GNUNET_HELLO_Address *address;
-};
-
-
-/**
- * Provide an update on the `validation_map` map size to statistics.
- * This function should be called whenever the `validation_map`
- * is changed.
- */
-static void
-publish_ve_stat_update ()
-{
- GNUNET_STATISTICS_set (GST_stats,
- gettext_noop ("# Addresses in validation map"),
- GNUNET_CONTAINER_multipeermap_size (validation_map),
- GNUNET_NO);
-}
-
-
-/**
- * Iterate over validation entries until a matching one is found.
- *
- * @param cls the `struct ValidationEntryMatchContext *`
- * @param key peer identity (unused)
- * @param value a `struct ValidationEntry *` to match
- * @return #GNUNET_YES if the entry does not match,
- * #GNUNET_NO if the entry does match
- */
-static int
-validation_entry_match (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct ValidationEntryMatchContext *vemc = cls;
- struct ValidationEntry *ve = value;
-
- if (0 == GNUNET_HELLO_address_cmp (ve->address,
- vemc->address))
- {
- vemc->ve = ve;
- return GNUNET_NO;
- }
- return GNUNET_YES;
-}
-
-
-/**
- * A validation entry changed. Update the state and notify
- * monitors.
- *
- * @param ve validation entry that changed
- * @param state new state
- */
-static void
-validation_entry_changed (struct ValidationEntry *ve,
- enum GNUNET_TRANSPORT_ValidationState state)
-{
- ve->state = state;
-}
-
-
-/**
- * Iterate over validation entries and free them.
- *
- * @param cls (unused)
- * @param key peer identity (unused)
- * @param value a `struct ValidationEntry *` to clean up
- * @return #GNUNET_YES (continue to iterate)
- */
-static int
-cleanup_validation_entry (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct ValidationEntry *ve = value;
-
- ve->next_validation = GNUNET_TIME_UNIT_ZERO_ABS;
- ve->valid_until = GNUNET_TIME_UNIT_ZERO_ABS;
-
- /* Notify about deleted entry */
- validation_entry_changed (ve,
- GNUNET_TRANSPORT_VS_REMOVE);
-
- if (NULL != ve->bc)
- {
- GST_blacklist_test_cancel (ve->bc);
- ve->bc = NULL;
- }
- GNUNET_break (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_remove (validation_map,
- &ve->address->peer,
- ve));
- publish_ve_stat_update ();
- if (GNUNET_YES == ve->known_to_ats)
- {
- GST_ats_expire_address (ve->address);
- GNUNET_assert (GNUNET_NO ==
- GST_ats_is_known_no_session (ve->address));
- ve->known_to_ats = GNUNET_NO;
- }
- GNUNET_HELLO_address_free (ve->address);
- if (NULL != ve->timeout_task)
- {
- GNUNET_SCHEDULER_cancel (ve->timeout_task);
- ve->timeout_task = NULL;
- }
- if (NULL != ve->revalidation_task)
- {
- GNUNET_SCHEDULER_cancel (ve->revalidation_task);
- ve->revalidation_task = NULL;
- }
- if ((GNUNET_YES == ve->expecting_pong) &&
- (validations_running > 0))
- {
- validations_running--;
- GNUNET_STATISTICS_set (GST_stats,
- gettext_noop ("# validations running"),
- validations_running,
- GNUNET_NO);
- }
- GNUNET_free (ve);
- return GNUNET_OK;
-}
-
-
-/**
- * Address validation cleanup task. Assesses if the record is no
- * longer valid and then possibly triggers its removal.
- *
- * @param cls the `struct ValidationEntry`
- */
-static void
-timeout_hello_validation (void *cls)
-{
- struct ValidationEntry *ve = cls;
- struct GNUNET_TIME_Absolute max;
- struct GNUNET_TIME_Relative left;
-
- ve->timeout_task = NULL;
- /* For valid addresses, we want to wait until the expire;
- for addresses under PING validation, we want to wait
- until we give up on the PING */
- max = GNUNET_TIME_absolute_max (ve->valid_until,
- ve->revalidation_block);
- left = GNUNET_TIME_absolute_get_remaining (max);
- if (left.rel_value_us > 0)
- {
- /* We should wait a bit longer. This happens when
- address lifetimes are extended due to successful
- validations. */
- ve->timeout_task =
- GNUNET_SCHEDULER_add_delayed (left,
- &timeout_hello_validation,
- ve);
- return;
- }
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# address records discarded (timeout)"),
- 1,
- GNUNET_NO);
- cleanup_validation_entry (NULL,
- &ve->address->peer,
- ve);
-}
-
-
-/**
- * Function called with the result from blacklisting.
- * Send a PING to the other peer if a communication is allowed.
- *
- * @param cls our `struct ValidationEntry`
- * @param pid identity of the other peer
- * @param address_null address associated with the request, always NULL
- * @param session_null session associated with the request, always NULL
- * @param result #GNUNET_OK if the connection is allowed,
- * #GNUNET_NO if not,
- * #GNUNET_SYSERR if operation was aborted
- */
-static void
-transmit_ping_if_allowed (void *cls,
- const struct GNUNET_PeerIdentity *pid,
- const struct GNUNET_HELLO_Address *address_null,
- struct GNUNET_ATS_Session *session_null,
- int result)
-{
- struct ValidationEntry *ve = cls;
- struct TransportPingMessage ping;
- struct GNUNET_TRANSPORT_PluginFunctions *papi;
- struct GNUNET_TIME_Absolute next;
- const struct GNUNET_MessageHeader *hello;
- ssize_t ret;
- size_t tsize;
- size_t slen;
- uint16_t hsize;
- struct GNUNET_ATS_Session *session;
-
- ve->bc = NULL;
- if (GNUNET_OK != result)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Blacklist denies sending PING to `%s' `%s' `%s'\n",
- GNUNET_i2s (pid),
- GST_plugins_a2s (ve->address),
- ve->address->transport_name);
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# address records discarded (blacklist)"),
- 1,
- GNUNET_NO);
- cleanup_validation_entry (NULL,
- pid,
- ve);
- return;
- }
- hello = GST_hello_get ();
- GNUNET_assert (NULL != hello);
- slen = strlen (ve->address->transport_name) + 1;
- hsize = ntohs (hello->size);
- tsize = sizeof(struct TransportPingMessage)
- + ve->address->address_length + slen + hsize;
-
- ping.header.size =
- htons (sizeof(struct TransportPingMessage)
- + ve->address->address_length + slen);
- ping.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_PING);
- ping.challenge = htonl (ve->challenge);
- ping.target = *pid;
-
- if (tsize >= GNUNET_MAX_MESSAGE_SIZE)
- {
- GNUNET_break (0);
- hsize = 0;
- tsize =
- sizeof(struct TransportPingMessage) + ve->address->address_length
- + slen + hsize;
- }
- {
- char message_buf[tsize] GNUNET_ALIGN;
-
- GNUNET_memcpy (message_buf,
- hello,
- hsize);
- GNUNET_memcpy (&message_buf[hsize],
- &ping,
- sizeof(struct TransportPingMessage));
- GNUNET_memcpy (&message_buf[sizeof(struct TransportPingMessage) + hsize],
- ve->address->transport_name,
- slen);
- GNUNET_memcpy (&message_buf[sizeof(struct TransportPingMessage) + slen
- + hsize],
- ve->address->address,
- ve->address->address_length);
- papi = GST_plugins_find (ve->address->transport_name);
- GNUNET_assert (NULL != papi);
- session = papi->get_session (papi->cls,
- ve->address);
- if (NULL == session)
- {
- /* Could not get a valid session */
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Failed to get session to send PING to `%s' at `%s'\n",
- GNUNET_i2s (pid),
- GST_plugins_a2s (ve->address));
- return;
- }
-
- ret = papi->send (papi->cls, session,
- message_buf, tsize,
- PING_PRIORITY,
- ACCEPTABLE_PING_DELAY,
- NULL, NULL);
- if (-1 == ret)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Failed to send PING to `%s' at `%s'\n",
- GNUNET_i2s (pid),
- GST_plugins_a2s (ve->address));
- return;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Transmitted plain PING to `%s' `%s' `%s'\n",
- GNUNET_i2s (pid),
- GST_plugins_a2s (ve->address),
- ve->address->transport_name);
- ve->network = papi->get_network (papi->cls,
- session);
- GNUNET_break (GNUNET_NT_UNSPECIFIED != ve->network);
- GST_neighbours_notify_data_sent (ve->address,
- session,
- tsize);
- next = GNUNET_TIME_relative_to_absolute (validation_delay);
- validation_next = GNUNET_TIME_absolute_max (next,
- validation_next);
- ve->send_time = GNUNET_TIME_absolute_get ();
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# PINGs for address validation sent"),
- 1,
- GNUNET_NO);
- ve->expecting_pong = GNUNET_YES;
- validations_running++;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Validation started, %u validation processes running\n",
- validations_running);
- GNUNET_STATISTICS_set (GST_stats,
- gettext_noop ("# validations running"),
- validations_running,
- GNUNET_NO);
- /* Notify about PING sent */
- validation_entry_changed (ve,
- GNUNET_TRANSPORT_VS_UPDATE);
- }
-}
-
-
-/**
- * Do address validation again to keep address valid.
- *
- * @param cls the `struct ValidationEntry`
- */
-static void
-revalidate_address (void *cls)
-{
- struct ValidationEntry *ve = cls;
- struct GNUNET_TIME_Relative canonical_delay;
- struct GNUNET_TIME_Relative delay;
- struct GNUNET_TIME_Relative blocked_for;
- struct GST_BlacklistCheck *bc;
- uint32_t rdelay;
-
- ve->revalidation_task = NULL;
- delay = GNUNET_TIME_absolute_get_remaining (ve->revalidation_block);
- /* Considering current connectivity situation, what is the maximum
- block period permitted? */
- if (GNUNET_YES == ve->in_use)
- canonical_delay = CONNECTED_PING_FREQUENCY;
- else if (GNUNET_TIME_absolute_get_remaining (ve->valid_until).rel_value_us >
- 0)
- canonical_delay = VALIDATED_PING_FREQUENCY;
- else
- canonical_delay = UNVALIDATED_PING_KEEPALIVE;
- /* Use delay that is MIN of original delay and possibly adjusted
- new maximum delay (which may be lower); the real delay
- is originally randomized between "canonical_delay" and "2 *
canonical_delay",
- so continue to permit that window for the operation. */
- delay = GNUNET_TIME_relative_min (delay,
- GNUNET_TIME_relative_multiply (
- canonical_delay,
- 2));
- ve->revalidation_block = GNUNET_TIME_relative_to_absolute (delay);
- if (delay.rel_value_us > 0)
- {
- /* should wait a bit longer */
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Waiting for %s longer before (re)validating address `%s'\n",
- GNUNET_STRINGS_relative_time_to_string (delay,
- GNUNET_YES),
- GST_plugins_a2s (ve->address));
- ve->revalidation_task =
- GNUNET_SCHEDULER_add_delayed (delay,
- &revalidate_address, ve);
- ve->next_validation = GNUNET_TIME_relative_to_absolute (delay);
- return;
- }
- /* check if globally we have too many active validations at a
- too high rate, if so, delay ours */
- blocked_for = GNUNET_TIME_absolute_get_remaining (validation_next);
- if ((validations_running > validations_fast_start_threshold) &&
- (blocked_for.rel_value_us > 0))
- {
- /* Validations are blocked, have to wait for blocked_for time */
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Validations blocked for another %s, delaying validating
address `%s'\n",
- GNUNET_STRINGS_relative_time_to_string (blocked_for,
- GNUNET_YES),
- GST_plugins_a2s (ve->address));
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop (
- "# validations delayed by global throttle"),
- 1,
- GNUNET_NO);
- ve->revalidation_task =
- GNUNET_SCHEDULER_add_delayed (blocked_for,
- &revalidate_address,
- ve);
- ve->next_validation = GNUNET_TIME_relative_to_absolute (blocked_for);
- return;
- }
-
- /* We are good to go; remember to not go again for `canonical_delay` time;
- add up to `canonical_delay` to randomize start time */
- ve->revalidation_block = GNUNET_TIME_relative_to_absolute (canonical_delay);
- /* schedule next PINGing with some extra random delay to avoid synchronous
re-validations */
- rdelay =
- GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
- canonical_delay.rel_value_us);
-
- delay = GNUNET_TIME_relative_add (canonical_delay,
- GNUNET_TIME_relative_multiply
- (GNUNET_TIME_UNIT_MICROSECONDS,
- rdelay));
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Validating now, next scheduled for %s, now validating address
`%s'\n",
- GNUNET_STRINGS_relative_time_to_string (blocked_for,
- GNUNET_YES),
- GST_plugins_a2s (ve->address));
- ve->revalidation_task =
- GNUNET_SCHEDULER_add_delayed (delay,
- &revalidate_address,
- ve);
- ve->next_validation = GNUNET_TIME_relative_to_absolute (delay);
-
- /* start PINGing by checking blacklist */
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# address revalidations started"),
1,
- GNUNET_NO);
- if (NULL != ve->bc)
- {
- GST_blacklist_test_cancel (ve->bc);
- ve->bc = NULL;
- }
- bc = GST_blacklist_test_allowed (&ve->address->peer,
- ve->address->transport_name,
- &transmit_ping_if_allowed,
- ve,
- NULL,
- NULL);
- if (NULL != bc)
- {
- /* If transmit_ping_if_allowed was already called it may have freed ve,
- * so only set ve->bc if it has not been called.
- */
- ve->bc = bc;
- }
-}
-
-
-/**
- * Find a ValidationEntry entry for the given neighbour that matches
- * the given address and transport. If none exists, create one (but
- * without starting any validation).
- *
- * @param address address to find
- * @return validation entry matching the given specifications, NULL
- * if we don't have an existing entry and no public key was given
- */
-static struct ValidationEntry *
-find_validation_entry (const struct GNUNET_HELLO_Address *address)
-{
- struct ValidationEntryMatchContext vemc;
- struct ValidationEntry *ve;
-
- vemc.ve = NULL;
- vemc.address = address;
- GNUNET_CONTAINER_multipeermap_get_multiple (validation_map,
- &address->peer,
- &validation_entry_match, &vemc);
- if (NULL != (ve = vemc.ve))
- return ve;
- GNUNET_assert (GNUNET_NO ==
- GST_ats_is_known_no_session (address));
- ve = GNUNET_new (struct ValidationEntry);
- ve->in_use = GNUNET_SYSERR; /* not defined */
- ve->address = GNUNET_HELLO_address_copy (address);
- ve->pong_sig_valid_until = GNUNET_TIME_UNIT_ZERO_ABS;
- memset (&ve->pong_sig_cache,
- '\0',
- sizeof(struct GNUNET_CRYPTO_EddsaSignature));
- ve->latency = GNUNET_TIME_UNIT_FOREVER_REL;
- ve->challenge =
- GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX);
- ve->timeout_task =
- GNUNET_SCHEDULER_add_delayed (UNVALIDATED_PING_KEEPALIVE,
- &timeout_hello_validation,
- ve);
- GNUNET_CONTAINER_multipeermap_put (validation_map,
- &address->peer,
- ve,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
- publish_ve_stat_update ();
- validation_entry_changed (ve,
- GNUNET_TRANSPORT_VS_NEW);
- return ve;
-}
-
-
-/**
- * Iterator which adds the given address to the set of validated
- * addresses.
- *
- * @param cls original HELLO message
- * @param address the address
- * @param expiration expiration time
- * @return #GNUNET_OK (keep the address), could return
- * #GNUNET_NO (delete address, but this is ignored);
- * #GNUNET_SYSERR would abort iteration (but we always iterate all)
- */
-static int
-add_valid_address (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_TIME_Absolute expiration)
-{
- const struct GNUNET_HELLO_Message *hello = cls;
- struct ValidationEntry *ve;
- struct GNUNET_PeerIdentity pid;
- struct GNUNET_ATS_Properties prop;
- struct GNUNET_TRANSPORT_PluginFunctions *papi;
-
- if (0 == GNUNET_TIME_absolute_get_remaining (expiration).rel_value_us)
- return GNUNET_OK; /* expired */
- if (GNUNET_OK != GNUNET_HELLO_get_id (hello, &pid))
- {
- GNUNET_break (0);
- return GNUNET_OK; /* invalid HELLO !? */
- }
- if (NULL == (papi = GST_plugins_find (address->transport_name)))
- {
- /* might have been valid in the past, but we don't have that
- plugin loaded right now */
- return GNUNET_OK;
- }
- if (NULL ==
- papi->address_to_string (papi->cls,
- address->address,
- address->address_length))
- {
- /* Why do we try to add an ill-formed address? */
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Address with %u bytes for plugin %s and peer %s is
malformed\n",
- (unsigned int) address->address_length,
- address->transport_name,
- GNUNET_i2s (&pid));
- return GNUNET_OK;
- }
-
- ve = find_validation_entry (address);
- ve->network = papi->get_network_for_address (papi->cls,
- address);
- GNUNET_break (GNUNET_NT_UNSPECIFIED != ve->network);
- ve->valid_until = GNUNET_TIME_absolute_max (ve->valid_until,
- expiration);
- if (NULL == ve->revalidation_task)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Starting revalidations for valid address `%s'\n",
- GST_plugins_a2s (ve->address));
- ve->next_validation = GNUNET_TIME_absolute_get ();
- ve->revalidation_task = GNUNET_SCHEDULER_add_now (&revalidate_address, ve);
- }
- validation_entry_changed (ve,
- GNUNET_TRANSPORT_VS_UPDATE);
- memset (&prop, 0, sizeof(prop));
- prop.scope = ve->network;
- prop.delay = GNUNET_TIME_relative_divide (ve->latency, 2);
- if (GNUNET_YES != ve->known_to_ats)
- {
- ve->known_to_ats = GNUNET_YES;
- GST_ats_add_address (address, &prop);
- GNUNET_assert (GNUNET_YES ==
- GST_ats_is_known_no_session (ve->address));
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Function called for any HELLO known to PEERINFO.
- *
- * @param cls unused (NULL)
- * @param peer id of the peer, NULL for last call (during iteration,
- * as we are monitoring, this should never happen)
- * @param hello hello message for the peer (can be NULL)
- * @param err_msg error message
- */
-static void
-process_peerinfo_hello (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_HELLO_Message *hello,
- const char *err_msg)
-{
- GNUNET_assert (NULL != peer);
- if (NULL == hello)
- return;
- if (0 == memcmp (&GST_my_identity,
- peer,
- sizeof(struct GNUNET_PeerIdentity)))
- {
- /* Peerinfo returned own identity, skip validation */
- return;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Handling HELLO for peer `%s'\n",
- GNUNET_i2s (peer));
- GNUNET_assert (NULL ==
- GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO,
- &add_valid_address,
- (void *) hello));
-}
-
-
-/**
- * Start the validation subsystem.
- *
- * @param max_fds maximum number of fds to use
- */
-void
-GST_validation_start (unsigned int max_fds)
-{
- /**
- * Initialization for validation throttling
- *
- * We have a maximum number max_fds of connections we can use for validation
- * We monitor the number of validations in parallel and start to throttle it
- * when doing to many validations in parallel:
- * if (running validations < (max_fds / 2))
- * - "fast start": run validation immediately
- * - have delay of (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value_us) /
(max_fds / 2)
- * (300 sec / ~150 == ~2 sec.) between two validations
- */validation_next = GNUNET_TIME_absolute_get ();
- validation_delay.rel_value_us =
- (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value_us) / (max_fds / 2);
- validations_fast_start_threshold = (max_fds / 2);
- validations_running = 0;
- GNUNET_STATISTICS_set (GST_stats,
- gettext_noop ("# validations running"),
- validations_running,
- GNUNET_NO);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Validation uses a fast start threshold of %u connections and a
delay of %s\n",
- validations_fast_start_threshold,
- GNUNET_STRINGS_relative_time_to_string (validation_delay,
- GNUNET_YES));
- validation_map = GNUNET_CONTAINER_multipeermap_create (VALIDATION_MAP_SIZE,
- GNUNET_NO);
- pnc = GNUNET_PEERINFO_notify (GST_cfg, GNUNET_YES,
- &process_peerinfo_hello, NULL);
-}
-
-
-/**
- * Stop the validation subsystem.
- */
-void
-GST_validation_stop ()
-{
- GNUNET_CONTAINER_multipeermap_iterate (validation_map,
- &cleanup_validation_entry,
- NULL);
- GNUNET_CONTAINER_multipeermap_destroy (validation_map);
- validation_map = NULL;
- GNUNET_PEERINFO_notify_cancel (pnc);
-}
-
-
-/**
- * Send the given PONG to the given address.
- *
- * @param cls the PONG message
- * @param valid_until is ZERO if we never validated the address,
- * otherwise a time up to when we consider it (or was) valid
- * @param validation_block is FOREVER if the address is for an unsupported
plugin (from PEERINFO)
- * is ZERO if the address is considered valid (no
validation needed)
- * otherwise a time in the future if we're currently
denying re-validation
- * @param address target address
- */
-static void
-multicast_pong (void *cls,
- struct GNUNET_TIME_Absolute valid_until,
- struct GNUNET_TIME_Absolute validation_block,
- const struct GNUNET_HELLO_Address *address)
-{
- struct TransportPongMessage *pong = cls;
- struct GNUNET_TRANSPORT_PluginFunctions *papi;
- struct GNUNET_ATS_Session *session;
-
- papi = GST_plugins_find (address->transport_name);
- if (NULL == papi)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Plugin %s not supported, cannot send PONG\n",
- address->transport_name);
- return;
- }
- GNUNET_assert (NULL != papi->send);
- GNUNET_assert (NULL != papi->get_session);
- session = papi->get_session (papi->cls, address);
- if (NULL == session)
- {
- GNUNET_break (0);
- return;
- }
- GST_ats_new_session (address, session);
- papi->send (papi->cls, session,
- (const char *) pong,
- ntohs (pong->header.size),
- PONG_PRIORITY,
- ACCEPTABLE_PING_DELAY,
- NULL, NULL);
- GST_neighbours_notify_data_sent (address,
- session,
- pong->header.size);
-}
-
-
-/**
- * We've received a PING. If appropriate, generate a PONG.
- *
- * @param sender peer sending the PING
- * @param hdr the PING
- * @param sender_address the sender address as we got it
- * @param session session we got the PING from
- * @return #GNUNET_OK if the message was fine, #GNUNET_SYSERR on serious error
- */
-int
-GST_validation_handle_ping (const struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_MessageHeader *hdr,
- const struct GNUNET_HELLO_Address *sender_address,
- struct GNUNET_ATS_Session *session)
-{
- const struct TransportPingMessage *ping;
- struct TransportPongMessage *pong;
- struct GNUNET_TRANSPORT_PluginFunctions *papi;
- struct GNUNET_CRYPTO_EddsaSignature *sig_cache;
- struct GNUNET_TIME_Absolute *sig_cache_exp;
- const char *addr;
- const char *addrend;
- char *plugin_name;
- char *pos;
- size_t len_address;
- size_t len_plugin;
- ssize_t ret;
- struct GNUNET_HELLO_Address address;
-
- if (0 ==
- memcmp (&GST_my_identity,
- sender,
- sizeof(struct GNUNET_PeerIdentity)))
- return GNUNET_OK; /* our own, ignore! */
- if (ntohs (hdr->size) < sizeof(struct TransportPingMessage))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- ping = (const struct TransportPingMessage *) hdr;
- if (0 !=
- memcmp (&ping->target,
- &GST_my_identity,
- sizeof(struct GNUNET_PeerIdentity)))
- {
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# PING message for different peer received"),
- 1,
- GNUNET_NO);
- return GNUNET_SYSERR;
- }
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# PING messages received"), 1,
- GNUNET_NO);
- addr = (const char *) &ping[1];
- len_address = ntohs (hdr->size) - sizeof(struct TransportPingMessage);
- /* peer wants to confirm that this is one of our addresses, this is what is
- * used for address validation */
-
- sig_cache = NULL;
- sig_cache_exp = NULL;
- papi = NULL;
- if (len_address > 0)
- {
- addrend = memchr (addr, '\0', len_address);
- if (NULL == addrend)
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- addrend++;
- len_plugin = strlen (addr) + 1;
- len_address -= len_plugin;
- address.local_info = GNUNET_HELLO_ADDRESS_INFO_NONE;
- address.address = addrend;
- address.address_length = len_address;
- address.transport_name = addr;
- address.peer = GST_my_identity;
-
- if (NULL == address.transport_name)
- {
- GNUNET_break (0);
- }
-
- if (0 != strstr (address.transport_name, "_client"))
- {
- plugin_name = GNUNET_strdup (address.transport_name);
- pos = strstr (plugin_name, "_client");
- GNUNET_assert (NULL != pos);
- GNUNET_snprintf (pos, strlen ("_server") + 1, "%s", "_server");
- }
- else
- plugin_name = GNUNET_strdup (address.transport_name);
-
- if (NULL == (papi = GST_plugins_find (plugin_name)))
- {
- /* we don't have the plugin for this address */
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ (
- "Plugin `%s' not available, cannot confirm having this
address\n"),
- plugin_name);
- GNUNET_free (plugin_name);
- return GNUNET_SYSERR;
- }
- GNUNET_free (plugin_name);
- if (GNUNET_OK !=
- papi->check_address (papi->cls,
- addrend,
- len_address))
- {
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# failed address checks during
validation"),
- 1,
- GNUNET_NO);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ (
- "Address `%s' is not one of my addresses, not confirming
PING\n"),
- GST_plugins_a2s (&address));
- return GNUNET_SYSERR;
- }
- else
- {
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- (
- "# successful address checks during
validation"),
- 1,
- GNUNET_NO);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Address `%s' is one of my addresses, confirming PING\n",
- GST_plugins_a2s (&address));
- }
-
- if (GNUNET_YES !=
- GST_hello_test_address (&address,
- &sig_cache,
- &sig_cache_exp))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- _ (
- "Not confirming PING from peer `%s' with address `%s'
since I cannot confirm having this address.\n"),
- GNUNET_i2s (sender),
- GST_plugins_a2s (&address));
- return GNUNET_SYSERR;
- }
- }
- else
- {
- addrend = NULL; /* make gcc happy */
- len_plugin = 0;
- static struct GNUNET_CRYPTO_EddsaSignature no_address_signature;
- static struct GNUNET_TIME_Absolute no_address_signature_expiration;
-
- sig_cache = &no_address_signature;
- sig_cache_exp = &no_address_signature_expiration;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "I am `%s', sending PONG to peer `%s'\n",
- GNUNET_i2s_full (&GST_my_identity),
- GNUNET_i2s (sender));
-
- /* message with structure:
- * [TransportPongMessage][Transport name][Address] */
-
- pong = GNUNET_malloc (sizeof(struct TransportPongMessage) + len_address
- + len_plugin);
- pong->header.size =
- htons (sizeof(struct TransportPongMessage) + len_address + len_plugin);
- pong->header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_PONG);
- pong->purpose.size =
- htonl (sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose)
- + sizeof(uint32_t) + sizeof(struct GNUNET_TIME_AbsoluteNBO)
- + len_address + len_plugin);
- pong->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_TRANSPORT_PONG_OWN);
- GNUNET_memcpy (&pong->challenge, &ping->challenge, sizeof(ping->challenge));
- pong->addrlen = htonl (len_address + len_plugin);
- GNUNET_memcpy (&pong[1], addr, len_plugin); /* Copy transport plugin */
- if (len_address > 0)
- {
- GNUNET_assert (NULL != addrend);
- GNUNET_memcpy (&((char *) &pong[1])[len_plugin], addrend, len_address);
- }
- if (GNUNET_TIME_absolute_get_remaining (*sig_cache_exp).rel_value_us <
- PONG_SIGNATURE_LIFETIME.rel_value_us / 4)
- {
- /* create / update cached sig */
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Creating PONG signature to indicate ownership.\n");
- *sig_cache_exp = GNUNET_TIME_relative_to_absolute
(PONG_SIGNATURE_LIFETIME);
- pong->expiration = GNUNET_TIME_absolute_hton (*sig_cache_exp);
- if (GNUNET_OK !=
- GNUNET_CRYPTO_eddsa_sign_ (&GST_my_private_key,
- &pong->purpose,
- sig_cache))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to create PONG signature for peer `%s'\n"),
- GNUNET_i2s (sender));
- }
- }
- else
- {
- pong->expiration = GNUNET_TIME_absolute_hton (*sig_cache_exp);
- }
- pong->signature = *sig_cache;
-
- GNUNET_assert (NULL != sender_address);
-
- /* first see if the session we got this PING from can be used to transmit
- * a response reliably */
- if (NULL == papi)
- {
- ret = -1;
- }
- else
- {
- GNUNET_assert (NULL != papi->send);
- GNUNET_assert (NULL != papi->get_session);
- if (NULL == session)
- {
- session = papi->get_session (papi->cls, sender_address);
- }
- if (NULL == session)
- {
- GNUNET_break (0);
- ret = -1;
- }
- else
- {
- ret = papi->send (papi->cls, session,
- (const char *) pong,
- ntohs (pong->header.size),
- PONG_PRIORITY, ACCEPTABLE_PING_DELAY,
- NULL, NULL);
- if (-1 != ret)
- GST_neighbours_notify_data_sent (sender_address,
- session,
- pong->header.size);
- }
- }
- if (-1 != ret)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Transmitted PONG to `%s' via reliable mechanism\n",
- GNUNET_i2s (sender));
- /* done! */
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# PONGs unicast via reliable transport"), 1,
- GNUNET_NO);
- GNUNET_free (pong);
- return GNUNET_OK;
- }
-
- /* no reliable method found, try transmission via all known addresses */
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# PONGs multicast to all available addresses"),
- 1,
- GNUNET_NO);
- GST_validation_get_addresses (sender,
- &multicast_pong, pong);
- GNUNET_free (pong);
- return GNUNET_OK;
-}
-
-
-/**
- * Validate an individual address.
- *
- * @param address address we should try to validate
- */
-void
-GST_validation_handle_address (const struct GNUNET_HELLO_Address *address)
-{
- struct GNUNET_TRANSPORT_PluginFunctions *papi;
- struct ValidationEntry *ve;
-
- papi = GST_plugins_find (address->transport_name);
- if (NULL == papi)
- {
- /* This plugin is currently unavailable ... ignore */
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "No plugin available for %s\n",
- address->transport_name);
- return;
- }
- ve = find_validation_entry (address);
- if (NULL == ve->revalidation_task)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Validation process started for fresh address `%s' of %s\n",
- GST_plugins_a2s (ve->address),
- GNUNET_i2s (&ve->address->peer));
- ve->revalidation_task = GNUNET_SCHEDULER_add_now (&revalidate_address, ve);
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Validation already running for address `%s' of %s\n",
- GST_plugins_a2s (ve->address),
- GNUNET_i2s (&ve->address->peer));
- }
-}
-
-
-/**
- * Iterator callback to go over all addresses and try to validate them
- * (unless blocked or already validated).
- *
- * @param cls NULL
- * @param address the address
- * @param expiration expiration time
- * @return #GNUNET_OK (keep the address)
- */
-static int
-validate_address_iterator (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_TIME_Absolute expiration)
-{
- if (0 == GNUNET_TIME_absolute_get_remaining (expiration).rel_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Skipping expired address from HELLO\n");
- return GNUNET_OK; /* expired */
- }
- GST_validation_handle_address (address);
- return GNUNET_OK;
-}
-
-
-/**
- * Add the validated peer address to the HELLO.
- *
- * @param cls the `struct ValidationEntry *` with the validated address
- * @param max space in @a buf
- * @param buf where to add the address
- * @return number of bytes written, #GNUNET_SYSERR to signal the
- * end of the iteration.
- */
-static ssize_t
-add_valid_peer_address (void *cls,
- size_t max,
- void *buf)
-{
- struct ValidationEntry *ve = cls;
-
- if (GNUNET_YES == ve->copied)
- return GNUNET_SYSERR; /* Done */
- ve->copied = GNUNET_YES;
- return GNUNET_HELLO_add_address (ve->address,
- ve->valid_until,
- buf,
- max);
-}
-
-
-/**
- * We've received a PONG. Check if it matches a pending PING and
- * mark the respective address as confirmed.
- *
- * @param sender peer sending the PONG
- * @param hdr the PONG
- * @return #GNUNET_OK if the message was fine, #GNUNET_SYSERR on serious error
- */
-int
-GST_validation_handle_pong (const struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_MessageHeader *hdr)
-{
- const struct TransportPongMessage *pong;
- struct ValidationEntry *ve;
- const char *tname;
- const char *addr;
- size_t addrlen;
- size_t slen;
- size_t size;
- struct GNUNET_HELLO_Message *hello;
- struct GNUNET_HELLO_Address address;
- int sig_res;
- int do_verify;
-
- if (0 ==
- memcmp (&GST_my_identity,
- sender,
- sizeof(struct GNUNET_PeerIdentity)))
- return GNUNET_OK; /* our own, ignore! */
-
- if (ntohs (hdr->size) < sizeof(struct TransportPongMessage))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# PONG messages received"), 1,
- GNUNET_NO);
-
- /* message with structure:
- * [TransportPongMessage][Transport name][Address] */
-
- pong = (const struct TransportPongMessage *) hdr;
- tname = (const char *) &pong[1];
- size = ntohs (hdr->size) - sizeof(struct TransportPongMessage);
- addr = memchr (tname, '\0', size);
- if (NULL == addr)
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- addr++;
- slen = strlen (tname) + 1;
- addrlen = size - slen;
-
- if (NULL == GST_plugins_find (tname))
- {
- /* we got the PONG, but the transport plugin specified in it
- is not supported by this peer, so this cannot be a good
- PONG for us. */
- GNUNET_break_op (0);
- return GNUNET_OK;
- }
-
- address.peer = *sender;
- address.address = addr;
- address.address_length = addrlen;
- address.transport_name = tname;
- address.local_info = GNUNET_HELLO_ADDRESS_INFO_NONE;
- ve = find_validation_entry (&address);
- if ((NULL == ve) || (GNUNET_NO == ve->expecting_pong))
- {
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- (
- "# PONGs dropped, no matching pending
validation"),
- 1, GNUNET_NO);
- return GNUNET_OK;
- }
- /* now check that PONG is well-formed */
- if (0 != memcmp (&ve->address->peer,
- sender,
- sizeof(struct GNUNET_PeerIdentity)))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- if (0 ==
- GNUNET_TIME_absolute_get_remaining
- (GNUNET_TIME_absolute_ntoh (pong->expiration)).rel_value_us)
- {
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop
- ("# PONGs dropped, signature expired"), 1,
- GNUNET_NO);
- return GNUNET_SYSERR;
- }
-
- sig_res = GNUNET_SYSERR;
- do_verify = GNUNET_YES;
- if (0 != GNUNET_TIME_absolute_get_remaining (
- ve->pong_sig_valid_until).rel_value_us)
- {
- /* We have a cached and valid signature for this peer,
- * try to compare instead of verify */
- if (0 == memcmp (&ve->pong_sig_cache,
- &pong->signature,
- sizeof(struct GNUNET_CRYPTO_EddsaSignature)))
- {
- /* signatures are identical, we can skip verification */
- sig_res = GNUNET_OK;
- do_verify = GNUNET_NO;
- }
- else
- {
- sig_res = GNUNET_SYSERR;
- /* signatures do not match, we have to verify */
- }
- }
-
- if (GNUNET_YES == do_verify)
- {
- /* Do expensive verification */
- sig_res = GNUNET_CRYPTO_eddsa_verify_ (
- GNUNET_SIGNATURE_PURPOSE_TRANSPORT_PONG_OWN,
- &pong->purpose,
- &pong->signature,
- &ve->address->peer.public_key);
- if (sig_res == GNUNET_SYSERR)
- {
- GNUNET_break_op (0);
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Failed to verify: invalid signature on address `%s':%s from
peer `%s'\n",
- tname,
- GST_plugins_a2s (ve->address),
- GNUNET_i2s (sender));
- }
- }
- if (sig_res == GNUNET_SYSERR)
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Validation process successful for peer `%s' with plugin `%s'
address `%s'\n",
- GNUNET_i2s (sender),
- tname,
- GST_plugins_a2s (ve->address));
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# validations succeeded"),
- 1,
- GNUNET_NO);
- /* validity achieved, remember it! */
- ve->expecting_pong = GNUNET_NO;
- ve->valid_until = GNUNET_TIME_relative_to_absolute
(HELLO_ADDRESS_EXPIRATION);
- ve->pong_sig_cache = pong->signature;
- ve->pong_sig_valid_until = GNUNET_TIME_absolute_ntoh (pong->expiration);
- ve->latency = GNUNET_TIME_absolute_get_duration (ve->send_time);
- {
- if (GNUNET_YES == ve->known_to_ats)
- {
- GNUNET_assert (GNUNET_YES ==
- GST_ats_is_known_no_session (ve->address));
- GST_ats_update_delay (ve->address,
- GNUNET_TIME_relative_divide (ve->latency, 2));
- }
- else
- {
- struct GNUNET_ATS_Properties prop;
-
- memset (&prop, 0, sizeof(prop));
- GNUNET_break (GNUNET_NT_UNSPECIFIED != ve->network);
- prop.scope = ve->network;
- prop.delay = GNUNET_TIME_relative_divide (ve->latency, 2);
- GNUNET_assert (GNUNET_NO ==
- GST_ats_is_known_no_session (ve->address));
- ve->known_to_ats = GNUNET_YES;
- GST_ats_add_address (ve->address, &prop);
- GNUNET_assert (GNUNET_YES ==
- GST_ats_is_known_no_session (ve->address));
- }
- }
- if (validations_running > 0)
- {
- validations_running--;
- GNUNET_STATISTICS_set (GST_stats,
- gettext_noop ("# validations running"),
- validations_running,
- GNUNET_NO);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Validation finished, %u validation processes running\n",
- validations_running);
- }
- else
- {
- GNUNET_break (0);
- }
-
- /* Notify about new validity */
- validation_entry_changed (ve,
- GNUNET_TRANSPORT_VS_UPDATE);
-
- /* build HELLO to store in PEERINFO */
- GNUNET_STATISTICS_update (GST_stats,
- gettext_noop ("# HELLOs given to peerinfo"),
- 1,
- GNUNET_NO);
- ve->copied = GNUNET_NO;
- hello = GNUNET_HELLO_create (&ve->address->peer.public_key,
- &add_valid_peer_address,
- ve,
- GNUNET_NO);
- GNUNET_break (NULL !=
- GNUNET_PEERINFO_add_peer (GST_peerinfo,
- hello,
- NULL,
- NULL));
- GNUNET_free (hello);
- return GNUNET_OK;
-}
-
-
-/**
- * We've received a HELLO, check which addresses are new and trigger
- * validation.
- *
- * @param hello the HELLO we received
- * @return #GNUNET_OK if the message was fine, #GNUNET_SYSERR on serious error
- */
-int
-GST_validation_handle_hello (const struct GNUNET_MessageHeader *hello)
-{
- const struct GNUNET_HELLO_Message *hm =
- (const struct GNUNET_HELLO_Message *) hello;
- struct GNUNET_PeerIdentity pid;
- int friend;
-
- friend = GNUNET_HELLO_is_friend_only (hm);
- if (((GNUNET_YES != friend) &&
- (GNUNET_NO != friend)) ||
- (GNUNET_OK != GNUNET_HELLO_get_id (hm, &pid)))
- {
- /* malformed HELLO */
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- if (0 ==
- memcmp (&GST_my_identity,
- &pid,
- sizeof(struct GNUNET_PeerIdentity)))
- {
- /* got our own HELLO, how boring */
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Validation received our own HELLO (%s), ignoring\n",
- GNUNET_i2s (&pid));
- return GNUNET_OK;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Validation received HELLO message for peer `%s' with size %u,
checking for new addresses\n",
- GNUNET_i2s (&pid),
- ntohs (hello->size));
- GNUNET_assert (NULL ==
- GNUNET_HELLO_iterate_addresses (hm,
- GNUNET_NO,
- &validate_address_iterator,
- NULL));
- return GNUNET_OK;
-}
-
-
-/**
- * Closure for #iterate_addresses().
- */
-struct IteratorContext
-{
- /**
- * Function to call on each address.
- */
- GST_ValidationAddressCallback cb;
-
- /**
- * Closure for @e cb.
- */
- void *cb_cls;
-};
-
-
-/**
- * Call the callback in the closure for each validation entry.
- *
- * @param cls the `struct IteratorContext`
- * @param key the peer's identity
- * @param value the `struct ValidationEntry`
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-iterate_addresses (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct IteratorContext *ic = cls;
- struct ValidationEntry *ve = value;
-
- ic->cb (ic->cb_cls,
- ve->valid_until,
- ve->revalidation_block,
- ve->address);
- return GNUNET_OK;
-}
-
-
-/**
- * Call the given function for each address for the given target.
- * Can either give a snapshot (synchronous API) or be continuous.
- *
- * @param target peer information is requested for
- * @param cb function to call; will not be called after this function returns
- * @param cb_cls closure for @a cb
- */
-void
-GST_validation_get_addresses (const struct GNUNET_PeerIdentity *target,
- GST_ValidationAddressCallback cb,
- void *cb_cls)
-{
- struct IteratorContext ic;
-
- ic.cb = cb;
- ic.cb_cls = cb_cls;
- GNUNET_CONTAINER_multipeermap_get_multiple (validation_map,
- target,
- &iterate_addresses, &ic);
-}
-
-
-/**
- * Update if we are using an address for a connection actively right now.
- * Based on this, the validation module will measure latency for the
- * address more or less often.
- *
- * @param address the address that we are now using (or not)
- * @param in_use #GNUNET_YES if we are now using the address for a connection,
- * #GNUNET_NO if we are no longer using the address for a
connection
- */
-void
-GST_validation_set_address_use (const struct GNUNET_HELLO_Address *address,
- int in_use)
-{
- struct ValidationEntry *ve;
-
- if (GNUNET_HELLO_address_check_option (address,
- GNUNET_HELLO_ADDRESS_INFO_INBOUND))
- return; /* ignore inbound for validation */
- if (NULL == GST_plugins_find (address->transport_name))
- {
- /* How can we use an address for which we don't have the plugin? */
- GNUNET_break (0);
- return;
- }
- ve = find_validation_entry (address);
- if (NULL == ve)
- {
- GNUNET_break (0);
- return;
- }
- if (in_use == ve->in_use)
- return;
- ve->in_use = in_use;
- if (GNUNET_YES == in_use)
- {
- /* from now on, higher frequency, so reschedule now */
- if (NULL != ve->revalidation_task)
- GNUNET_SCHEDULER_cancel (ve->revalidation_task);
- ve->revalidation_task = GNUNET_SCHEDULER_add_now (&revalidate_address,
- ve);
- }
-}
-
-
-/* end of file gnunet-service-transport_validation.c */
diff --git a/src/transport/gnunet-service-transport_validation.h
b/src/transport/gnunet-service-transport_validation.h
deleted file mode 100644
index 2a0428869..000000000
--- a/src/transport/gnunet-service-transport_validation.h
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010,2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/gnunet-service-transport_validation.h
- * @brief address validation API
- * @author Christian Grothoff
- */
-#ifndef GNUNET_SERVICE_TRANSPORT_VALIDATION_H
-#define GNUNET_SERVICE_TRANSPORT_VALIDATION_H
-
-#include "gnunet_statistics_service.h"
-#include "gnunet_transport_plugin.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_hello_lib.h"
-
-/**
- * Start the validation subsystem.
- *
- * @param max_fds maximum number of fds to use
- */
-void
-GST_validation_start (unsigned int max_fds);
-
-
-/**
- * Stop the validation subsystem.
- */
-void
-GST_validation_stop (void);
-
-
-/**
- * Update if we are using an address for a connection actively right now.
- * Based on this, the validation module will measure latency for the
- * address more or less often.
- *
- * @param address the address that we are now using (or not)
- * @param in_use #GNUNET_YES if we are now using the address for a connection,
- * #GNUNET_NO if we are no longer using the address for a
connection
- */
-void
-GST_validation_set_address_use (const struct GNUNET_HELLO_Address *address,
- int in_use);
-
-
-/**
- * We've received a PING. If appropriate, generate a PONG.
- *
- * @param sender peer sending the PING
- * @param hdr the PING
- * @param sender_address address of the sender, NULL if we did not initiate
- * @param session session we got the PING from
- * @return #GNUNET_OK if the message was fine, #GNUNET_SYSERR on serious error
- */
-int
-GST_validation_handle_ping (const struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_MessageHeader *hdr,
- const struct GNUNET_HELLO_Address *sender_address,
- struct GNUNET_ATS_Session *session);
-
-
-/**
- * We've received a PONG. Check if it matches a pending PING and
- * mark the respective address as confirmed.
- *
- * @param sender peer sending the PONG
- * @param hdr the PONG
- * @return #GNUNET_OK if the message was fine, #GNUNET_SYSERR on serious error
- */
-int
-GST_validation_handle_pong (const struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_MessageHeader *hdr);
-
-
-/**
- * We've received a HELLO, check which addresses are new and trigger
- * validation.
- *
- * @param hello the HELLO we received
- * @return #GNUNET_OK if the message was fine, #GNUNET_SYSERR on serious error
- */
-int
-GST_validation_handle_hello (const struct GNUNET_MessageHeader *hello);
-
-
-/**
- * Validate an individual address.
- *
- * @param address address we should try to validate
- */
-void
-GST_validation_handle_address (const struct GNUNET_HELLO_Address *address);
-
-
-/**
- * Function called for each address (or address status change) that
- * the validation module is aware of (for the given target).
- *
- * @param cls closure
- * @param public_key public key for the peer, never NULL
- * @param valid_until is ZERO if we never validated the address,
- * otherwise a time up to when we consider it (or was) valid
- * @param validation_block is FOREVER if the address is for an unsupported
plugin (from PEERINFO)
- * is ZERO if the address is considered valid (no
validation needed)
- * otherwise a time in the future if we're currently
denying re-validation
- * @param address the address
- */
-typedef void
-(*GST_ValidationAddressCallback) (void *cls,
- struct GNUNET_TIME_Absolute valid_until,
- struct GNUNET_TIME_Absolute validation_block,
- const struct GNUNET_HELLO_Address *address);
-
-
-/**
- * Call the given function for each address for the given target.
- *
- * @param target peer information is requested for
- * @param cb function to call; will not be called after this function returns
- * @param cb_cls closure for @a cb
- */
-void
-GST_validation_get_addresses (const struct GNUNET_PeerIdentity *target,
- GST_ValidationAddressCallback cb, void *cb_cls);
-
-
-#endif
-/* end of file gnunet-service-transport_validation.h */
diff --git a/src/transport/gnunet-transport-wlan-receiver.c
b/src/transport/gnunet-transport-wlan-receiver.c
deleted file mode 100644
index 7f34a957f..000000000
--- a/src/transport/gnunet-transport-wlan-receiver.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2012 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/gnunet-transport-wlan-receiver.c
- * @brief program to send via WLAN as much as possible (to test
physical/theoretical throughput)
- * @author David Brodski
- */
-#include "platform.h"
-#include "gnunet_protocols.h"
-#include "plugin_transport_wlan.h"
-
-int
-main (int argc, char *argv[])
-{
- char msg_buf[65536];
- unsigned long long count;
- double bytes_per_s;
- time_t start;
- time_t akt;
- ssize_t ret;
- pid_t pid;
- int commpipe[2]; /* This holds the fd for the input & output of the pipe */
-
- if (2 != argc)
- {
- fprintf (stderr,
- "This program must be started with the interface name as
argument.\n");
- fprintf (stderr,
- "Usage: %s interface-name\n"
- "e.g. %s mon0\n",
- argv[0],
- argv[0]);
- return 1;
- }
-
- /* Setup communication pipeline first */
- if (pipe (commpipe))
- {
- fprintf (stderr, "Failed to create pipe: %s\n", strerror (errno));
- exit (1);
- }
-
- /* Attempt to fork and check for errors */
- if ((pid = fork ()) == -1)
- {
- fprintf (stderr, "Failed to fork: %s\n", strerror (errno));
- exit (1);
- }
-
- if (pid)
- {
- /* A positive (non-negative) PID indicates the parent process */
- if (0 != close (commpipe[1])) /* Close unused side of pipe (in side) */
- fprintf (stderr, "Failed to close fd: %s\n", strerror (errno));
- start = time (NULL);
- count = 0;
- while (1)
- {
- ret = read (commpipe[0], msg_buf, sizeof(msg_buf));
- if (0 > ret)
- {
- fprintf (stderr, "read failed: %s\n", strerror (errno));
- break;
- }
- count += ret;
- akt = time (NULL);
- if (akt - start > 30)
- {
- bytes_per_s = count / (akt - start);
- bytes_per_s /= 1024;
- printf ("recv %f kb/s\n", bytes_per_s);
- start = akt;
- count = 0;
- }
- }
- }
- else
- {
- /* A zero PID indicates that this is the child process */
- (void) close (1);
- if (-1 ==
- dup2 (commpipe[1], 1)) /* Replace stdin with the in side of the pipe
*/
- fprintf (stderr, "dup2 failed: %s\n", strerror (errno));
- (void) close (commpipe[0]); /* Close unused side of pipe (in side) */
- /* Replace the child fork with a new process */
- if (execlp ("gnunet-helper-transport-wlan",
- "gnunet-helper-transport-wlan",
- argv[1],
- NULL) == -1)
- {
- fprintf (stderr, "Could not start gnunet-helper-transport-wlan!");
- _exit (1);
- }
- }
- return 0;
-}
diff --git a/src/transport/gnunet-transport-wlan-sender.c
b/src/transport/gnunet-transport-wlan-sender.c
deleted file mode 100644
index 5256ec7be..000000000
--- a/src/transport/gnunet-transport-wlan-sender.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/gnunet-transport-wlan-sender.c
- * @brief program to send via WLAN as much as possible (to test
physical/theoretical throughput)
- * @author David Brodski
- */
-#include "platform.h"
-#include "plugin_transport_wlan.h"
-#include "gnunet_protocols.h"
-
-#define WLAN_MTU 1500
-
-/**
- * LLC fields for better compatibility
- */
-#define WLAN_LLC_DSAP_FIELD 0x1f
-#define WLAN_LLC_SSAP_FIELD 0x1f
-
-#define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */
-
-#define IEEE80211_FC0_VERSION_MASK 0x03
-#define IEEE80211_FC0_VERSION_SHIFT 0
-#define IEEE80211_FC0_VERSION_0 0x00
-#define IEEE80211_FC0_TYPE_MASK 0x0c
-#define IEEE80211_FC0_TYPE_SHIFT 2
-#define IEEE80211_FC0_TYPE_MGT 0x00
-#define IEEE80211_FC0_TYPE_CTL 0x04
-#define IEEE80211_FC0_TYPE_DATA 0x08
-
-
-/**
- * function to fill the radiotap header
- * @param header pointer to the radiotap header
- * @param size total message size
- * @return GNUNET_YES at success
- */
-static int
-getRadiotapHeader (struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *header,
- uint16_t size)
-{
- header->header.size = htons (size);
- header->header.type = htons (GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER);
- header->rate = 255;
- header->tx_power = 0;
- header->antenna = 0;
- return GNUNET_YES;
-}
-
-
-/**
- * function to generate the wlan hardware header for one packet
- * @param Header address to write the header to
- * @param to_mac_addr pointer to the address of the recipient
- * @param mac pointer to the mac address to send from (normally overwritten
over by helper)
- * @param size size of the whole packet, needed to calculate the time to send
the packet
- * @return GNUNET_YES if there was no error
- */
-static int
-getWlanHeader (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *Header,
- const struct GNUNET_TRANSPORT_WLAN_MacAddress *to_mac_addr,
- const struct GNUNET_TRANSPORT_WLAN_MacAddress *mac,
- unsigned int size)
-{
- const int rate = 11000000;
-
- Header->frame_control = htons (IEEE80211_FC0_TYPE_DATA);
- Header->addr3 = mac_bssid_gnunet;
- Header->addr2 = *mac;
- Header->addr1 = *to_mac_addr;
- Header->duration = GNUNET_htole16 ((size * 1000000) / rate + 290);
- Header->llc[0] = WLAN_LLC_DSAP_FIELD;
- Header->llc[1] = WLAN_LLC_SSAP_FIELD;
- Header->llc[2] = 0; // FIXME
- Header->llc[3] = 0; // FIXME
- return GNUNET_YES;
-}
-
-
-int
-main (int argc, char *argv[])
-{
- char msg_buf[WLAN_MTU];
- struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *radiotap;
- unsigned int temp[6];
- struct GNUNET_TRANSPORT_WLAN_MacAddress inmac;
- struct GNUNET_TRANSPORT_WLAN_MacAddress outmac;
- struct GNUNET_TRANSPORT_WLAN_HelperControlMessage hcm;
- unsigned long long count;
- double bytes_per_s;
- time_t start;
- time_t akt;
- int i;
- ssize_t ret;
- pid_t pid;
- int commpipe[2]; /* This holds the fd for the input & output of the pipe */
- int macpipe[2]; /* This holds the fd for the input & output of the pipe */
-
- if (4 != argc)
- {
- fprintf (
- stderr,
- "This program must be started with the interface and the targets and
source mac as argument.\n");
- fprintf (stderr,
- "Usage: interface-name mac-DST mac-SRC\n"
- "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n");
- return 1;
- }
- if (6 != sscanf (argv[2],
- "%x-%x-%x-%x-%x-%x",
- &temp[0],
- &temp[1],
- &temp[2],
- &temp[3],
- &temp[4],
- &temp[5]))
- {
- fprintf (stderr,
- "Usage: interface-name mac-DST mac-SRC\n"
- "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n");
- return 1;
- }
- for (i = 0; i < 6; i++)
- outmac.mac[i] = temp[i];
- if (6 != sscanf (argv[3],
- "%x-%x-%x-%x-%x-%x",
- &temp[0],
- &temp[1],
- &temp[2],
- &temp[3],
- &temp[4],
- &temp[5]))
- {
- fprintf (stderr,
- "Usage: interface-name mac-DST mac-SRC\n"
- "e.g. mon0 11-22-33-44-55-66 12-34-56-78-90-ab\n");
- return 1;
- }
- for (i = 0; i < 6; i++)
- inmac.mac[i] = temp[i];
-
-
- /* Setup communication pipeline first */
- if (pipe (commpipe))
- {
- fprintf (stderr, "Failed to create pipe: %s\n", strerror (errno));
- exit (1);
- }
- if (pipe (macpipe))
- {
- fprintf (stderr, "Failed to create pipe: %s\n", strerror (errno));
- exit (1);
- }
-
- /* Attempt to fork and check for errors */
- if ((pid = fork ()) == -1)
- {
- fprintf (stderr, "Failed to fork: %s\n", strerror (errno));
- exit (1);
- }
- memset (msg_buf, 0x42, sizeof(msg_buf));
- if (pid)
- {
- /* A positive (non-negative) PID indicates the parent process */
- if (0 != close (commpipe[0])) /* Close unused side of pipe (in side) */
- fprintf (stderr, "Failed to close fd: %s\n", strerror (errno));
- setvbuf (stdout,
- (char *) NULL,
- _IONBF,
- 0); /* Set non-buffered output on stdout */
-
- if (0 != close (macpipe[1]))
- fprintf (stderr, "Failed to close fd: %s\n", strerror (errno));
- if (sizeof(hcm) != read (macpipe[0], &hcm, sizeof(hcm)))
- fprintf (stderr, "Failed to read hcm...\n");
- fprintf (stderr,
- "Got MAC %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",
- hcm.mac.mac[0],
- hcm.mac.mac[1],
- hcm.mac.mac[2],
- hcm.mac.mac[3],
- hcm.mac.mac[4],
- hcm.mac.mac[5]);
- radiotap = (struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *) msg_buf;
- getRadiotapHeader (radiotap, WLAN_MTU);
- getWlanHeader (&radiotap->frame, &outmac, &inmac, WLAN_MTU);
- start = time (NULL);
- count = 0;
- while (1)
- {
- ret = write (commpipe[1], msg_buf, WLAN_MTU);
- if (0 > ret)
- {
- fprintf (stderr, "write failed: %s\n", strerror (errno));
- break;
- }
- count += ret;
- akt = time (NULL);
- if (akt - start > 30)
- {
- bytes_per_s = count / (akt - start);
- bytes_per_s /= 1024;
- printf ("send %f kbytes/s\n", bytes_per_s);
- start = akt;
- count = 0;
- }
- }
- }
- else
- {
- /* A zero PID indicates that this is the child process */
- (void) close (0);
- (void) close (1);
- if (-1 ==
- dup2 (commpipe[0], 0)) /* Replace stdin with the in side of the pipe
*/
- fprintf (stderr, "dup2 failed: %s\n", strerror (errno));
- if (-1 ==
- dup2 (macpipe[1], 1)) /* Replace stdout with the out side of the pipe
*/
- fprintf (stderr, "dup2 failed: %s\n", strerror (errno));
- (void) close (commpipe[1]); /* Close unused side of pipe (out side) */
- (void) close (macpipe[0]); /* Close unused side of pipe (in side) */
- /* Replace the child fork with a new process */
- if (execlp ("gnunet-helper-transport-wlan",
- "gnunet-helper-transport-wlan",
- argv[1],
- NULL) == -1)
- {
- fprintf (stderr, "Could not start gnunet-helper-transport-wlan!");
- _exit (1);
- }
- }
- return 0;
-}
diff --git a/src/transport/perf_http_peer1.conf
b/src/transport/perf_http_peer1.conf
deleted file mode 100644
index e97e16289..000000000
--- a/src/transport/perf_http_peer1.conf
+++ /dev/null
@@ -1,37 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport]
-PLUGINS = http_client
-
-[nat]
-# Disable IPv6 support
-DISABLEV6 = YES
-# Do we use addresses from localhost address ranges? (::1, 127.0.0.0/8)
-RETURN_LOCAL_ADDRESSES = NO
-
-[hostlist]
-OPTIONS = -b
-SERVERS = http://localhost:9080/
-
-[ats]
-# Network specific inbound/outbound quotas
-UNSPECIFIED_QUOTA_IN = unlimited
-UNSPECIFIED_QUOTA_OUT = unlimited
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = unlimited
-WAN_QUOTA_OUT = unlimited
-# WLAN
-WLAN_QUOTA_IN = unlimited
-WLAN_QUOTA_OUT = unlimited
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = unlimited
-BLUETOOTH_QUOTA_OUT = unlimited
-# ATS options
diff --git a/src/transport/perf_http_peer2.conf
b/src/transport/perf_http_peer2.conf
deleted file mode 100644
index a1c83bde5..000000000
--- a/src/transport/perf_http_peer2.conf
+++ /dev/null
@@ -1,40 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport]
-PLUGINS = http_server
-
-[nat]
-# Disable IPv6 support
-DISABLEV6 = YES
-# Do we use addresses from localhost address ranges? (::1, 127.0.0.0/8)
-RETURN_LOCAL_ADDRESSES = NO
-
-[hostlist]
-HTTPPORT = 9080
-OPTIONS = -p
-BINDTOIPV4 = YES
-BINDTOIP = 127.0.0.1
-
-[ats]
-# Network specific inbound/outbound quotas
-UNSPECIFIED_QUOTA_IN = unlimited
-UNSPECIFIED_QUOTA_OUT = unlimited
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = unlimited
-WAN_QUOTA_OUT = unlimited
-# WLAN
-WLAN_QUOTA_IN = unlimited
-WLAN_QUOTA_OUT = unlimited
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = unlimited
-BLUETOOTH_QUOTA_OUT = unlimited
-# ATS options
-
diff --git a/src/transport/perf_https_peer1.conf
b/src/transport/perf_https_peer1.conf
deleted file mode 100644
index e943671c2..000000000
--- a/src/transport/perf_https_peer1.conf
+++ /dev/null
@@ -1,37 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport]
-PLUGINS = https_client
-
-[nat]
-# Disable IPv6 support
-DISABLEV6 = YES
-# Do we use addresses from localhost address ranges? (::1, 127.0.0.0/8)
-RETURN_LOCAL_ADDRESSES = NO
-
-[hostlist]
-OPTIONS = -b
-SERVERS = http://localhost:9080/
-
-[ats]
-# Network specific inbound/outbound quotas
-UNSPECIFIED_QUOTA_IN = unlimited
-UNSPECIFIED_QUOTA_OUT = unlimited
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = unlimited
-WAN_QUOTA_OUT = unlimited
-# WLAN
-WLAN_QUOTA_IN = unlimited
-WLAN_QUOTA_OUT = unlimited
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = unlimited
-BLUETOOTH_QUOTA_OUT = unlimited
-# ATS options
diff --git a/src/transport/perf_https_peer2.conf
b/src/transport/perf_https_peer2.conf
deleted file mode 100644
index 6e30f9e60..000000000
--- a/src/transport/perf_https_peer2.conf
+++ /dev/null
@@ -1,40 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport]
-PLUGINS = https_server
-
-[nat]
-# Disable IPv6 support
-DISABLEV6 = YES
-# Do we use addresses from localhost address ranges? (::1, 127.0.0.0/8)
-RETURN_LOCAL_ADDRESSES = NO
-
-[hostlist]
-HTTPPORT = 9080
-OPTIONS = -p
-BINDTOIPV4 = YES
-BINDTOIP = 127.0.0.1
-
-[ats]
-# Network specific inbound/outbound quotas
-UNSPECIFIED_QUOTA_IN = unlimited
-UNSPECIFIED_QUOTA_OUT = unlimited
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = unlimited
-WAN_QUOTA_OUT = unlimited
-# WLAN
-WLAN_QUOTA_IN = unlimited
-WLAN_QUOTA_OUT = unlimited
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = unlimited
-BLUETOOTH_QUOTA_OUT = unlimited
-# ATS options
-
diff --git a/src/transport/perf_tcp_peer1.conf
b/src/transport/perf_tcp_peer1.conf
deleted file mode 100644
index e56c47ada..000000000
--- a/src/transport/perf_tcp_peer1.conf
+++ /dev/null
@@ -1,31 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport]
-PLUGINS = tcp
-
-[hostlist]
-OPTIONS = -b
-SERVERS = http://localhost:9080/
-
-[ats]
-# Network specific inbound/outbound quotas
-UNSPECIFIED_QUOTA_IN = unlimited
-UNSPECIFIED_QUOTA_OUT = unlimited
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = unlimited
-WAN_QUOTA_OUT = unlimited
-# WLAN
-WLAN_QUOTA_IN = unlimited
-WLAN_QUOTA_OUT = unlimited
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = unlimited
-BLUETOOTH_QUOTA_OUT = unlimited
-# ATS options
diff --git a/src/transport/perf_tcp_peer2.conf
b/src/transport/perf_tcp_peer2.conf
deleted file mode 100644
index 3264161f5..000000000
--- a/src/transport/perf_tcp_peer2.conf
+++ /dev/null
@@ -1,34 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport]
-PLUGINS = tcp
-
-[hostlist]
-HTTPPORT = 9080
-OPTIONS = -p
-BINDTOIPV4 = YES
-BINDTOIP = 127.0.0.1
-
-[ats]
-# Network specific inbound/outbound quotas
-UNSPECIFIED_QUOTA_IN = unlimited
-UNSPECIFIED_QUOTA_OUT = unlimited
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = unlimited
-WAN_QUOTA_OUT = unlimited
-# WLAN
-WLAN_QUOTA_IN = unlimited
-WLAN_QUOTA_OUT = unlimited
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = unlimited
-BLUETOOTH_QUOTA_OUT = unlimited
-# ATS options
-
diff --git a/src/transport/perf_udp_peer1.conf
b/src/transport/perf_udp_peer1.conf
deleted file mode 100644
index 68bf43908..000000000
--- a/src/transport/perf_udp_peer1.conf
+++ /dev/null
@@ -1,43 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport]
-PLUGINS = udp
-
-[transport-udp]
-BROADCAST = NO
-BROADCAST_RECEIVE = NO
-BROADCAST_INTERVAL = 30 s
-MAX_BPS = 1000000000
-
-[nat]
-# Disable IPv6 support
-DISABLEV6 = YES
-# Do we use addresses from localhost address ranges? (::1, 127.0.0.0/8)
-RETURN_LOCAL_ADDRESSES = NO
-
-[hostlist]
-OPTIONS = -b
-SERVERS = http://localhost:9080/
-
-[ats]
-# Network specific inbound/outbound quotas
-UNSPECIFIED_QUOTA_IN = unlimited
-UNSPECIFIED_QUOTA_OUT = unlimited
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = unlimited
-WAN_QUOTA_OUT = unlimited
-# WLAN
-WLAN_QUOTA_IN = unlimited
-WLAN_QUOTA_OUT = unlimited
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = unlimited
-BLUETOOTH_QUOTA_OUT = unlimited
-# ATS options
diff --git a/src/transport/perf_udp_peer2.conf
b/src/transport/perf_udp_peer2.conf
deleted file mode 100644
index efed935f8..000000000
--- a/src/transport/perf_udp_peer2.conf
+++ /dev/null
@@ -1,48 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport]
-PLUGINS = udp
-
-
-[transport-udp]
-# Use PORT = 0 to autodetect a port available
-BROADCAST = NO
-BROADCAST_RECEIVE = NO
-BROADCAST_INTERVAL = 30 s
-MAX_BPS = 1000000000
-
-[nat]
-# Disable IPv6 support
-DISABLEV6 = YES
-# Do we use addresses from localhost address ranges? (::1, 127.0.0.0/8)
-RETURN_LOCAL_ADDRESSES = NO
-
-[hostlist]
-HTTPPORT = 9080
-OPTIONS = -p
-BINDTOIPV4 = YES
-BINDTOIP = 127.0.0.1
-
-[ats]
-# Network specific inbound/outbound quotas
-UNSPECIFIED_QUOTA_IN = unlimited
-UNSPECIFIED_QUOTA_OUT = unlimited
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = unlimited
-WAN_QUOTA_OUT = unlimited
-# WLAN
-WLAN_QUOTA_IN = unlimited
-WLAN_QUOTA_OUT = unlimited
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = unlimited
-BLUETOOTH_QUOTA_OUT = unlimited
-# ATS options
-
diff --git a/src/transport/perf_unix_peer1.conf
b/src/transport/perf_unix_peer1.conf
deleted file mode 100644
index 06cd63fc6..000000000
--- a/src/transport/perf_unix_peer1.conf
+++ /dev/null
@@ -1,52 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport]
-PORT = 12001
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-PLUGINS = unix
-
-[transport-unix]
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-unix.sock
-
-[arm]
-PORT = 12005
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12004
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12003
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12002
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[hostlist]
-OPTIONS = -b
-SERVERS = http://localhost:9080/
-
-[ats]
-# Network specific inbound/outbound quotas
-UNSPECIFIED_QUOTA_IN = unlimited
-UNSPECIFIED_QUOTA_OUT = unlimited
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = unlimited
-WAN_QUOTA_OUT = unlimited
-# WLAN
-WLAN_QUOTA_IN = unlimited
-WLAN_QUOTA_OUT = unlimited
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = unlimited
-BLUETOOTH_QUOTA_OUT = unlimited
-# ATS options
diff --git a/src/transport/perf_unix_peer2.conf
b/src/transport/perf_unix_peer2.conf
deleted file mode 100644
index feadb6fec..000000000
--- a/src/transport/perf_unix_peer2.conf
+++ /dev/null
@@ -1,56 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport]
-PORT = 12010
-PLUGINS = unix
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
-
-[transport-unix]
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-unix.sock
-
-[arm]
-PORT = 12014
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12013
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12012
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12011
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[hostlist]
-HTTPPORT = 9080
-OPTIONS = -p
-BINDTOIPV4 = YES
-BINDTOIP = 127.0.0.1
-
-[ats]
-# Network specific inbound/outbound quotas
-UNSPECIFIED_QUOTA_IN = unlimited
-UNSPECIFIED_QUOTA_OUT = unlimited
-# LOOPBACK
-LOOPBACK_QUOTA_IN = unlimited
-LOOPBACK_QUOTA_OUT = unlimited
-# LAN
-LAN_QUOTA_IN = unlimited
-LAN_QUOTA_OUT = unlimited
-# WAN
-WAN_QUOTA_IN = unlimited
-WAN_QUOTA_OUT = unlimited
-# WLAN
-WLAN_QUOTA_IN = unlimited
-WLAN_QUOTA_OUT = unlimited
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = unlimited
-BLUETOOTH_QUOTA_OUT = unlimited
-# ATS options
-
diff --git a/src/transport/plugin_transport_http.h
b/src/transport/plugin_transport_http.h
deleted file mode 100644
index a3b59513e..000000000
--- a/src/transport/plugin_transport_http.h
+++ /dev/null
@@ -1,579 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/plugin_transport_http.h
- * @brief http transport service plugin
- * @author Matthias Wachs
- */
-#ifndef PLUGIN_TRANSPORT_HTTP_H
-#define PLUGIN_TRANSPORT_HTTP_H
-
-#include "platform.h"
-#include "gnunet_common.h"
-#include "gnunet_constants.h"
-#include "gnunet_protocols.h"
-#include "gnunet_connection_lib.h"
-#include "gnunet_service_lib.h"
-#include "gnunet_statistics_service.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_resolver_service.h"
-#include "gnunet_server_lib.h"
-#include "gnunet_container_lib.h"
-#include "gnunet_transport_plugin.h"
-#include "gnunet_os_lib.h"
-#include "gnunet_nat_lib.h"
-#include "microhttpd.h"
-/* Just included for the right curl.h */
-#include "gnunet_curl_lib.h"
-
-
-#define DEBUG_HTTP GNUNET_EXTRA_LOGGING
-#define VERBOSE_SERVER GNUNET_EXTRA_LOGGING
-#define VERBOSE_CLIENT GNUNET_EXTRA_LOGGING
-#define VERBOSE_CURL GNUNET_NO
-
-#if BUILD_HTTPS
-#define LIBGNUNET_PLUGIN_TRANSPORT_INIT libgnunet_plugin_transport_https_init
-#define LIBGNUNET_PLUGIN_TRANSPORT_DONE libgnunet_plugin_transport_https_done
-#else
-#define LIBGNUNET_PLUGIN_TRANSPORT_INIT libgnunet_plugin_transport_http_init
-#define LIBGNUNET_PLUGIN_TRANSPORT_DONE libgnunet_plugin_transport_http_done
-#endif
-
-#define INBOUND GNUNET_YES
-#define OUTBOUND GNUNET_NO
-
-
-#define HTTP_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_SECONDS, 15)
-
-/**
- * Encapsulation of all of the state of the plugin.
- */
-struct Plugin
-{
- /**
- * Our environment.
- */
- struct GNUNET_TRANSPORT_PluginEnvironment *env;
-
- /**
- * Head of linked list of open sessions.
- */
- struct GNUNET_ATS_Session *head;
-
- /**
- * Tail of linked list of open sessions.
- */
- struct GNUNET_ATS_Session *tail;
-
- /**
- * NAT handle & address management
- */
- struct GNUNET_NAT_Handle *nat;
-
- /**
- * Our own IPv4 addresses DLL head
- */
- struct HttpAddressWrapper *addr_head;
-
- /**
- * Our own IPv4 addresses DLL tail
- */
- struct HttpAddressWrapper *addr_tail;
-
- /**
- * External hostname the plugin can be connected to, can be different to
- * the host's FQDN, used e.g. for reverse proxying
- */
- char *external_hostname;
-
- /**
- * External hostname the plugin can be connected to, can be different to
- * the host's FQDN, used e.g. for reverse proxying
- */
- struct HttpAddress *ext_addr;
-
- /**
- * External address length
- */
- size_t ext_addr_len;
-
- /**
- * Task calling transport service about external address
- */
- struct GNUNET_SCHEDULER_Task *notify_ext_task;
-
- /**
- * Plugin name.
- * Equals configuration section: transport-http, transport-https
- */
- char *name;
-
- /**
- * Plugin protocol
- * http, https
- */
- char *protocol;
-
- /**
- * Use IPv4? #GNUNET_YES or #GNUNET_NO
- */
- int ipv4;
-
- /**
- * Use IPv6? #GNUNET_YES or #GNUNET_NO
- */
- int ipv6;
-
- /**
- * Does plugin just use outbound connections and not accept inbound?
- */
- int client_only;
-
- /**
- * Port used
- */
- uint16_t port;
-
- /**
- * Maximum number of sockets the plugin can use
- * Each http inbound /outbound connections are two connections
- */
- int max_connections;
-
- /**
- * Number of outbound sessions
- */
- unsigned int outbound_sessions;
-
- /**
- * Number of inbound sessions
- */
- unsigned int inbound_sessions;
-
- /**
- * libCurl TLS crypto init string, can be set to enhance performance
- *
- * Example:
- *
- * Use RC4-128 instead of AES:
- * NONE:+VERS-TLS1.0:+ARCFOUR-128:+SHA1:+RSA:+COMP-NULL
- */
- char *crypto_init;
-
- /**
- * TLS key
- */
- char *key;
-
- /**
- * TLS certificate
- */
- char *cert;
-
- /**
- * Current number of establishes connections
- */
- int cur_connections;
-
- /**
- * Last used unique HTTP connection tag
- */
- uint32_t last_tag;
-
- /**
- * MHD IPv4 daemon
- */
- struct MHD_Daemon *server_v4;
-
- /**
- * MHD IPv4 task
- */
- struct GNUNET_SCHEDULER_Task *server_v4_task;
-
- /**
- * The IPv4 server is scheduled to run asap
- */
- int server_v4_immediately;
-
- /**
- * MHD IPv6 daemon
- */
- struct MHD_Daemon *server_v6;
-
- /**
- * MHD IPv4 task
- */
- struct GNUNET_SCHEDULER_Task *server_v6_task;
-
- /**
- * The IPv6 server is scheduled to run asap
- */
- int server_v6_immediately;
-
- /**
- * IPv4 server socket to bind to
- */
- struct sockaddr_in *server_addr_v4;
-
- /**
- * IPv6 server socket to bind to
- */
- struct sockaddr_in6 *server_addr_v6;
-
- /**
- * Head of server semi connections
- * A full session consists of 2 semi-connections: send and receive
- * If not both directions are established the server keeps this sessions here
- */
- struct GNUNET_ATS_Session *server_semi_head;
-
- /**
- * Tail of server semi connections
- * A full session consists of 2 semi-connections: send and receive
- * If not both directions are established the server keeps this sessions here
- */
- struct GNUNET_ATS_Session *server_semi_tail;
-
- /**
- * cURL Multihandle
- */
- CURLM *client_mh;
-
- /**
- * curl perform task
- */
- struct GNUNET_SCHEDULER_Task *client_perform_task;
-};
-
-GNUNET_NETWORK_STRUCT_BEGIN
-
-/**
- * HTTP addresses including a full URI
- */
-struct HttpAddress
-{
- /**
- * Length of the address following in NBO
- */
- uint32_t addr_len GNUNET_PACKED;
-
- /**
- * Address following
- */
- void *addr GNUNET_PACKED;
-};
-
-/**
- * IPv4 addresses
- */
-struct IPv4HttpAddress
-{
- /**
- * IPv4 address, in network byte order.
- */
- uint32_t ipv4_addr GNUNET_PACKED;
-
- /**
- * Port number, in network byte order.
- */
- uint16_t u4_port GNUNET_PACKED;
-};
-
-/**
- * IPv4 addresses
- */
-struct IPv6HttpAddress
-{
- /**
- * IPv6 address.
- */
- struct in6_addr ipv6_addr GNUNET_PACKED;
-
- /**
- * Port number, in network byte order.
- */
- uint16_t u6_port GNUNET_PACKED;
-};
-GNUNET_NETWORK_STRUCT_END
-
-
-struct ServerRequest
-{
- /**
- * _RECV or _SEND
- */
- int direction;
-
- /**
- * Should this connection get disconnected? #GNUNET_YES / #GNUNET_NO
- */
- int disconnect;
-
- /**
- * The session this server connection belongs to
- */
- struct GNUNET_ATS_Session *session;
-
- /**
- * The MHD connection
- */
- struct MHD_Connection *mhd_conn;
-};
-
-
-/**
- * Session handle for connections.
- */
-struct GNUNET_ATS_Session
-{
- /**
- * To whom are we talking to
- */
- struct GNUNET_PeerIdentity target;
-
- /**
- * Stored in a linked list.
- */
- struct GNUNET_ATS_Session *next;
-
- /**
- * Stored in a linked list.
- */
- struct GNUNET_ATS_Session *prev;
-
- /**
- * Pointer to the global plugin struct.
- */
- struct Plugin *plugin;
-
- /**
- * Address
- */
- void *addr;
-
- /**
- * Address length
- */
- size_t addrlen;
-
- /**
- * ATS network type in NBO
- */
- uint32_t ats_address_network_type;
-
- /**
- * next pointer for double linked list
- */
- struct HTTP_Message *msg_head;
-
- /**
- * previous pointer for double linked list
- */
- struct HTTP_Message *msg_tail;
-
- /**
- * Message stream tokenizer for incoming data
- */
- struct GNUNET_SERVER_MessageStreamTokenizer *msg_tk;
-
- /**
- * Absolute time when to receive data again
- * Used for receive throttling
- */
- struct GNUNET_TIME_Absolute next_receive;
-
- /**
- * Inbound or outbound connection
- * Outbound: #GNUNET_NO (client is used to send and receive)
- * Inbound : #GNUNET_YES (server is used to send and receive)
- */
- int inbound;
-
- /**
- * Unique HTTP/S connection tag for this connection
- */
- uint32_t tag;
-
- /**
- * Client send handle
- */
- void *client_put;
-
- /**
- * Client receive handle
- */
- void *client_get;
-
- /**
- * Task to wake up client receive handle when receiving is allowed again
- */
- struct GNUNET_SCHEDULER_Task *recv_wakeup_task;
-
- /**
- * Session timeout task
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * Is client send handle paused since there are no data to send?
- * #GNUNET_YES or #GNUNET_NO
- */
- int client_put_paused;
-
- /**
- * Client send handle
- */
- struct ServerRequest *server_recv;
-
- /**
- * Client send handle
- */
- struct ServerRequest *server_send;
-};
-
-
-/**
- * Message to send using http
- */
-struct HTTP_Message
-{
- /**
- * next pointer for double linked list
- */
- struct HTTP_Message *next;
-
- /**
- * previous pointer for double linked list
- */
- struct HTTP_Message *prev;
-
- /**
- * buffer containing data to send
- */
- char *buf;
-
- /**
- * amount of data already sent
- */
- size_t pos;
-
- /**
- * buffer length
- */
- size_t size;
-
- /**
- * Continuation function to call once the transmission buffer
- * has again space available. NULL if there is no
- * continuation to call.
- */
- GNUNET_TRANSPORT_TransmitContinuation transmit_cont;
-
- /**
- * Closure for @e transmit_cont.
- */
- void *transmit_cont_cls;
-};
-
-
-struct GNUNET_ATS_Session *
-create_session (struct Plugin *plugin,
- const struct GNUNET_PeerIdentity *target,
- const void *addr,
- size_t addrlen);
-
-
-int
-exist_session (struct Plugin *plugin,
- struct GNUNET_ATS_Session *s);
-
-
-void
-delete_session (struct GNUNET_ATS_Session *s);
-
-
-int
-exist_session (struct Plugin *plugin,
- struct GNUNET_ATS_Session *s);
-
-
-struct GNUNET_TIME_Relative
-http_plugin_receive (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_MessageHeader *message,
- struct GNUNET_ATS_Session *session,
- const char *sender_address,
- uint16_t sender_address_len);
-
-
-const char *
-http_plugin_address_to_string (void *cls,
- const void *addr,
- size_t addrlen);
-
-
-int
-client_disconnect (struct GNUNET_ATS_Session *s);
-
-
-int
-client_connect (struct GNUNET_ATS_Session *s);
-
-
-int
-client_send (struct GNUNET_ATS_Session *s, struct HTTP_Message *msg);
-
-
-int
-client_start (struct Plugin *plugin);
-
-
-void
-client_stop (struct Plugin *plugin);
-
-
-int
-server_disconnect (struct GNUNET_ATS_Session *s);
-
-
-int
-server_send (struct GNUNET_ATS_Session *s, struct HTTP_Message *msg);
-
-
-int
-server_start (struct Plugin *plugin);
-
-
-void
-server_stop (struct Plugin *plugin);
-
-
-void
-notify_session_end (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- struct GNUNET_ATS_Session *s);
-
-
-/*#ifndef PLUGIN_TRANSPORT_HTTP_H*/
-#endif
-/* end of plugin_transport_http.h */
diff --git a/src/transport/plugin_transport_http_client.c
b/src/transport/plugin_transport_http_client.c
deleted file mode 100644
index 82468992b..000000000
--- a/src/transport/plugin_transport_http_client.c
+++ /dev/null
@@ -1,2523 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2002-2014 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/plugin_transport_http_client.c
- * @brief HTTP/S client transport plugin
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-
-#if BUILD_HTTPS
-#define PLUGIN_NAME "https_client"
-#define HTTP_STAT_STR_CONNECTIONS "# HTTPS client connections"
-#define LIBGNUNET_PLUGIN_TRANSPORT_INIT \
- libgnunet_plugin_transport_https_client_init
-#define LIBGNUNET_PLUGIN_TRANSPORT_DONE \
- libgnunet_plugin_transport_https_client_done
-#else
-#define PLUGIN_NAME "http_client"
-#define HTTP_STAT_STR_CONNECTIONS "# HTTP client connections"
-#define LIBGNUNET_PLUGIN_TRANSPORT_INIT \
- libgnunet_plugin_transport_http_client_init
-#define LIBGNUNET_PLUGIN_TRANSPORT_DONE \
- libgnunet_plugin_transport_http_client_done
-#endif
-
-#define VERBOSE_CURL GNUNET_NO
-
-#define PUT_DISCONNECT_TIMEOUT GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_SECONDS, 1)
-
-#define ENABLE_PUT GNUNET_YES
-#define ENABLE_GET GNUNET_YES
-
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_transport_plugin.h"
-#include "plugin_transport_http_common.h"
-/* Just included for the right curl.h */
-#include "gnunet_curl_lib.h"
-
-
-#define LOG(kind, ...) GNUNET_log_from (kind, PLUGIN_NAME, __VA_ARGS__)
-
-/**
- * Encapsulation of all of the state of the plugin.
- */
-struct HTTP_Client_Plugin;
-
-/**
- * State of a HTTP PUT request
- */
-enum HTTP_PUT_REQUEST_STATE
-{
- /**
- * Just created, not yet connected
- */
- H_NOT_CONNECTED,
-
- /**
- * Connected
- */
- H_CONNECTED,
-
- /**
- * Paused, nothing to send
- */
- H_PAUSED,
-
- /**
- * Temporary disconnect in progress due to inactivity
- */
- H_TMP_DISCONNECTING,
-
- /**
- * Send request while temporary disconnect, reconnect
- */
- H_TMP_RECONNECT_REQUIRED,
-
- /**
- * Temporarily disconnected
- */
- H_TMP_DISCONNECTED,
-
- /**
- * Disconnected
- */
- H_DISCONNECTED
-};
-
-/**
- * Message to send using http
- */
-struct HTTP_Message
-{
- /**
- * next pointer for double linked list
- */
- struct HTTP_Message *next;
-
- /**
- * previous pointer for double linked list
- */
- struct HTTP_Message *prev;
-
- /**
- * buffer containing data to send
- */
- char *buf;
-
- /**
- * Continuation function to call once the transmission buffer
- * has again space available. NULL if there is no
- * continuation to call.
- */
- GNUNET_TRANSPORT_TransmitContinuation transmit_cont;
-
- /**
- * Closure for @e transmit_cont.
- */
- void *transmit_cont_cls;
-
- /**
- * amount of data already sent
- */
- size_t pos;
-
- /**
- * buffer length
- */
- size_t size;
-};
-
-
-/**
- * Session handle for HTTP(S) connections.
- */
-struct GNUNET_ATS_Session;
-
-
-/**
- * A request handle
- *
- */
-struct RequestHandle
-{
- /**
- * Current state of this request
- */
- enum HTTP_PUT_REQUEST_STATE state;
-
- /**
- * The curl easy handle
- */
- CURL *easyhandle;
-
- /**
- * The related session
- */
- struct GNUNET_ATS_Session *s;
-};
-
-
-/**
- * Session handle for connections.
- */
-struct GNUNET_ATS_Session
-{
- /**
- * The URL to connect to
- */
- char *url;
-
- /**
- * Address
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * Pointer to the global plugin struct.
- */
- struct HTTP_Client_Plugin *plugin;
-
- /**
- * Handle for the HTTP PUT request.
- */
- struct RequestHandle put;
-
- /**
- * Handle for the HTTP GET request.
- */
- struct RequestHandle get;
-
- /**
- * next pointer for double linked list
- */
- struct HTTP_Message *msg_head;
-
- /**
- * previous pointer for double linked list
- */
- struct HTTP_Message *msg_tail;
-
- /**
- * Message stream tokenizer for incoming data
- */
- struct GNUNET_MessageStreamTokenizer *msg_tk;
-
- /**
- * Session timeout task
- */
- struct GNUNET_SCHEDULER_Task *put_disconnect_task;
-
- /**
- * Session timeout task
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * Task to wake up client receive handle when receiving is allowed again
- */
- struct GNUNET_SCHEDULER_Task *recv_wakeup_task;
-
- /**
- * Absolute time when to receive data again.
- * Used for receive throttling.
- */
- struct GNUNET_TIME_Absolute next_receive;
-
- /**
- * When does this session time out.
- */
- struct GNUNET_TIME_Absolute timeout;
-
- /**
- * Number of bytes waiting for transmission to this peer.
- */
- unsigned long long bytes_in_queue;
-
- /**
- * Outbound overhead due to HTTP connection
- * Add to next message of this session when calling callback
- */
- size_t overhead;
-
- /**
- * Number of messages waiting for transmission to this peer.
- */
- unsigned int msgs_in_queue;
-
- /**
- * ATS network type.
- */
- enum GNUNET_NetworkType scope;
-};
-
-
-/**
- * Encapsulation of all of the state of the plugin.
- */
-struct HTTP_Client_Plugin
-{
- /**
- * Our environment.
- */
- struct GNUNET_TRANSPORT_PluginEnvironment *env;
-
- /**
- * Open sessions.
- */
- struct GNUNET_CONTAINER_MultiPeerMap *sessions;
-
- /**
- * Function to call about session status changes.
- */
- GNUNET_TRANSPORT_SessionInfoCallback sic;
-
- /**
- * Closure for @e sic.
- */
- void *sic_cls;
-
- /**
- * Plugin name
- */
- char *name;
-
- /**
- * Protocol
- */
- char *protocol;
-
- /**
- * Proxy configuration: hostname or ip of the proxy server
- */
- char *proxy_hostname;
-
- /**
- * Username for the proxy server
- */
- char *proxy_username;
-
- /**
- * Password for the proxy server
- */
- char *proxy_password;
-
- /**
- * cURL Multihandle
- */
- CURLM *curl_multi_handle;
-
- /**
- * curl perform task
- */
- struct GNUNET_SCHEDULER_Task *client_perform_task;
-
- /**
- * Type of proxy server:
- *
- * Valid values as supported by curl:
- * CURLPROXY_HTTP, CURLPROXY_HTTP_1_0 CURLPROXY_SOCKS4, CURLPROXY_SOCKS5,
- * CURLPROXY_SOCKS4A, CURLPROXY_SOCKS5_HOSTNAME
- */
- curl_proxytype proxytype;
-
- /**
- * Use proxy tunneling:
- * Tunnel all operations through a given HTTP instead of have the proxy
- * evaluate the HTTP request
- *
- * Default: #GNUNET_NO, #GNUNET_YES experimental
- */
- int proxy_use_httpproxytunnel;
-
- /**
- * My options to be included in the address
- */
- uint32_t options;
-
- /**
- * Maximum number of sockets the plugin can use
- * Each http connections are two requests
- */
- unsigned int max_requests;
-
- /**
- * Current number of sockets the plugin can use
- * Each http connections are two requests
- */
- unsigned int cur_requests;
-
- /**
- * Last used unique HTTP connection tag
- */
- uint32_t last_tag;
-
- /**
- * use IPv6
- */
- uint16_t use_ipv6;
-
- /**
- * use IPv4
- */
- uint16_t use_ipv4;
-
- /**
- * Should we emulate an XHR client for testing?
- */
- int emulate_xhr;
-};
-
-
-/**
- * Disconnect a session
- *
- * @param cls the `struct HTTP_Client_Plugin *`
- * @param s session
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
- */
-static int
-http_client_plugin_session_disconnect (void *cls, struct GNUNET_ATS_Session
*s);
-
-
-/**
- * If a session monitor is attached, notify it about the new
- * session state.
- *
- * @param plugin our plugin
- * @param session session that changed state
- * @param state new state of the session
- */
-static void
-notify_session_monitor (struct HTTP_Client_Plugin *plugin,
- struct GNUNET_ATS_Session *session,
- enum GNUNET_TRANSPORT_SessionState state)
-{
- struct GNUNET_TRANSPORT_SessionInfo info;
-
- if (NULL == plugin->sic)
- return;
- memset (&info, 0, sizeof(info));
- info.state = state;
- info.is_inbound = GNUNET_NO;
- info.num_msg_pending = session->msgs_in_queue;
- info.num_bytes_pending = session->bytes_in_queue;
- info.receive_delay = session->next_receive;
- info.session_timeout = session->timeout;
- info.address = session->address;
- plugin->sic (plugin->sic_cls,
- session,
- &info);
-}
-
-
-/**
- * Delete session @a s.
- *
- * @param s the session to delete
- */
-static void
-client_delete_session (struct GNUNET_ATS_Session *s)
-{
- struct HTTP_Client_Plugin *plugin = s->plugin;
- struct HTTP_Message *pos;
- struct HTTP_Message *next;
- CURLMcode mret;
-
- if (NULL != s->timeout_task)
- {
- GNUNET_SCHEDULER_cancel (s->timeout_task);
- s->timeout_task = NULL;
- s->timeout = GNUNET_TIME_UNIT_ZERO_ABS;
- }
- if (NULL != s->put_disconnect_task)
- {
- GNUNET_SCHEDULER_cancel (s->put_disconnect_task);
- s->put_disconnect_task = NULL;
- }
- if (NULL != s->recv_wakeup_task)
- {
- GNUNET_SCHEDULER_cancel (s->recv_wakeup_task);
- s->recv_wakeup_task = NULL;
- }
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_remove (plugin->sessions,
- &s->address->peer,
- s));
- if (NULL != s->put.easyhandle)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: disconnecting PUT request to peer `%s'\n",
- s,
- s->put.easyhandle,
- GNUNET_i2s (&s->address->peer));
-
- /* remove curl handle from multi handle */
- mret = curl_multi_remove_handle (plugin->curl_multi_handle,
- s->put.easyhandle);
- GNUNET_break (CURLM_OK == mret);
- curl_easy_cleanup (s->put.easyhandle);
- GNUNET_assert (plugin->cur_requests > 0);
- plugin->cur_requests--;
- s->put.easyhandle = NULL;
- }
- if (NULL != s->get.easyhandle)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: disconnecting GET request to peer `%s'\n",
- s, s->get.easyhandle,
- GNUNET_i2s (&s->address->peer));
- /* remove curl handle from multi handle */
- mret = curl_multi_remove_handle (plugin->curl_multi_handle,
- s->get.easyhandle);
- GNUNET_break (CURLM_OK == mret);
- curl_easy_cleanup (s->get.easyhandle);
- GNUNET_assert (plugin->cur_requests > 0);
- plugin->cur_requests--;
- s->get.easyhandle = NULL;
- }
-
- GNUNET_STATISTICS_set (plugin->env->stats,
- HTTP_STAT_STR_CONNECTIONS,
- plugin->cur_requests,
- GNUNET_NO);
- next = s->msg_head;
- while (NULL != (pos = next))
- {
- next = pos->next;
- GNUNET_CONTAINER_DLL_remove (s->msg_head,
- s->msg_tail,
- pos);
- GNUNET_assert (0 < s->msgs_in_queue);
- s->msgs_in_queue--;
- GNUNET_assert (pos->size <= s->bytes_in_queue);
- s->bytes_in_queue -= pos->size;
- if (NULL != pos->transmit_cont)
- pos->transmit_cont (pos->transmit_cont_cls,
- &s->address->peer,
- GNUNET_SYSERR,
- pos->size,
- pos->pos + s->overhead);
- s->overhead = 0;
- GNUNET_free (pos);
- }
- GNUNET_assert (0 == s->msgs_in_queue);
- GNUNET_assert (0 == s->bytes_in_queue);
- notify_session_monitor (plugin,
- s,
- GNUNET_TRANSPORT_SS_DONE);
- if (NULL != s->msg_tk)
- {
- GNUNET_MST_destroy (s->msg_tk);
- s->msg_tk = NULL;
- }
- GNUNET_HELLO_address_free (s->address);
- GNUNET_free (s->url);
- GNUNET_free (s);
-}
-
-
-/**
- * Increment session timeout due to activity for session @a s.
- *
- * @param s the session
- */
-static void
-client_reschedule_session_timeout (struct GNUNET_ATS_Session *s)
-{
- GNUNET_assert (NULL != s->timeout_task);
- s->timeout = GNUNET_TIME_relative_to_absolute (
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
-}
-
-
-/**
- * Task performing curl operations
- *
- * @param cls plugin as closure
- */
-static void
-client_run (void *cls);
-
-
-/**
- * Function setting up file descriptors and scheduling task to run
- *
- * @param plugin the plugin as closure
- * @param now schedule task in 1ms, regardless of what curl may say
- * @return #GNUNET_SYSERR for hard failure, #GNUNET_OK for ok
- */
-static int
-client_schedule (struct HTTP_Client_Plugin *plugin,
- int now)
-{
- fd_set rs;
- fd_set ws;
- fd_set es;
- int max;
- struct GNUNET_NETWORK_FDSet *grs;
- struct GNUNET_NETWORK_FDSet *gws;
- long to;
- CURLMcode mret;
- struct GNUNET_TIME_Relative timeout;
-
- /* Cancel previous scheduled task */
- if (plugin->client_perform_task != NULL)
- {
- GNUNET_SCHEDULER_cancel (plugin->client_perform_task);
- plugin->client_perform_task = NULL;
- }
- max = -1;
- FD_ZERO (&rs);
- FD_ZERO (&ws);
- FD_ZERO (&es);
- mret = curl_multi_fdset (plugin->curl_multi_handle, &rs, &ws, &es, &max);
- if (mret != CURLM_OK)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("%s failed at %s:%d: `%s'\n"),
- "curl_multi_fdset",
- __FILE__,
- __LINE__,
- curl_multi_strerror (mret));
- return GNUNET_SYSERR;
- }
- mret = curl_multi_timeout (plugin->curl_multi_handle, &to);
- if (-1 == to)
- timeout = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1);
- else
- timeout = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS,
to);
- if (now == GNUNET_YES)
- timeout = GNUNET_TIME_UNIT_MILLISECONDS;
-
- if (CURLM_OK != mret)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("%s failed at %s:%d: `%s'\n"),
- "curl_multi_timeout", __FILE__, __LINE__,
- curl_multi_strerror (mret));
- return GNUNET_SYSERR;
- }
-
- grs = GNUNET_NETWORK_fdset_create ();
- gws = GNUNET_NETWORK_fdset_create ();
- GNUNET_NETWORK_fdset_copy_native (grs, &rs, max + 1);
- GNUNET_NETWORK_fdset_copy_native (gws, &ws, max + 1);
-
- /* Schedule task to run when select is ready to read or write */
- plugin->client_perform_task =
- GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT,
- timeout, grs, gws,
- &client_run, plugin);
- GNUNET_NETWORK_fdset_destroy (gws);
- GNUNET_NETWORK_fdset_destroy (grs);
- return GNUNET_OK;
-}
-
-
-#if VERBOSE_CURL
-/**
- * Logging function
- *
- * @param curl the curl easy handle
- * @param type message type
- * @param data data to log, NOT a 0-terminated string
- * @param size data length
- * @param cls the closure
- * @return always 0
- */
-static int
-client_log (CURL *curl,
- curl_infotype type,
- const char *data,
- size_t size,
- void *cls)
-{
- struct RequestHandle *ch = cls;
- const char *ttype = "UNSPECIFIED";
- char text[size + 2];
-
- if (! ((CURLINFO_TEXT == type) ||
- (CURLINFO_HEADER_IN == type) ||
- (CURLINFO_HEADER_OUT == type)))
- return 0;
- switch (type)
- {
- case CURLINFO_TEXT:
- ttype = "TEXT";
- break;
-
- case CURLINFO_HEADER_IN:
- ttype = "HEADER_IN";
- break;
-
- case CURLINFO_HEADER_OUT:
- ttype = "HEADER_OUT";
- /* Overhead*/
- GNUNET_assert (NULL != ch);
- GNUNET_assert (NULL != ch->easyhandle);
- GNUNET_assert (NULL != ch->s);
- ch->s->overhead += size;
- break;
-
- default:
- ttype = "UNSPECIFIED";
- break;
- }
- GNUNET_memcpy (text, data, size);
- if (text[size - 1] == '\n')
- {
- text[size] = '\0';
- }
- else
- {
- text[size] = '\n';
- text[size + 1] = '\0';
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Request %p %s: %s",
- ch->easyhandle,
- ttype,
- text);
- return 0;
-}
-
-
-#endif
-
-/**
- * Connect GET request
- *
- * @param s the session to connect
- * @return #GNUNET_OK on success, #GNUNET_SYSERR otherwise
- */
-static int
-client_connect_get (struct GNUNET_ATS_Session *s);
-
-
-/**
- * Connect a HTTP put request
- *
- * @param s the session to connect
- * @return #GNUNET_SYSERR for hard failure, #GNUNET_OK for success
- */
-static int
-client_connect_put (struct GNUNET_ATS_Session *s);
-
-
-/**
- * Function that can be used by the transport service to transmit
- * a message using the plugin. Note that in the case of a
- * peer disconnecting, the continuation MUST be called
- * prior to the disconnect notification itself. This function
- * will be called with this peer's HELLO message to initiate
- * a fresh connection to another peer.
- *
- * @param cls closure
- * @param s which session must be used
- * @param msgbuf the message to transmit
- * @param msgbuf_size number of bytes in @a msgbuf
- * @param priority how important is the message (most plugins will
- * ignore message priority and just FIFO)
- * @param to how long to wait at most for the transmission (does not
- * require plugins to discard the message after the timeout,
- * just advisory for the desired delay; most plugins will ignore
- * this as well)
- * @param cont continuation to call once the message has
- * been transmitted (or if the transport is ready
- * for the next transmission call; or if the
- * peer disconnected...); can be NULL
- * @param cont_cls closure for @a cont
- * @return number of bytes used (on the physical network, with overheads);
- * -1 on hard errors (i.e. address invalid); 0 is a legal value
- * and does NOT mean that the message was not transmitted (DV)
- */
-static ssize_t
-http_client_plugin_send (void *cls,
- struct GNUNET_ATS_Session *s,
- const char *msgbuf,
- size_t msgbuf_size,
- unsigned int priority,
- struct GNUNET_TIME_Relative to,
- GNUNET_TRANSPORT_TransmitContinuation cont,
- void *cont_cls)
-{
- struct HTTP_Client_Plugin *plugin = cls;
- struct HTTP_Message *msg;
- char *stat_txt;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: Sending message with %lu to peer `%s' \n",
- s,
- s->put.easyhandle,
- (unsigned long) msgbuf_size,
- GNUNET_i2s (&s->address->peer));
-
- /* create new message and schedule */
- msg = GNUNET_malloc (sizeof(struct HTTP_Message) + msgbuf_size);
- msg->size = msgbuf_size;
- msg->buf = (char *) &msg[1];
- msg->transmit_cont = cont;
- msg->transmit_cont_cls = cont_cls;
- GNUNET_memcpy (msg->buf,
- msgbuf,
- msgbuf_size);
- GNUNET_CONTAINER_DLL_insert_tail (s->msg_head,
- s->msg_tail,
- msg);
- s->msgs_in_queue++;
- s->bytes_in_queue += msg->size;
-
- GNUNET_asprintf (&stat_txt,
- "# bytes currently in %s_client buffers",
- plugin->protocol);
- GNUNET_STATISTICS_update (plugin->env->stats,
- stat_txt, msgbuf_size, GNUNET_NO);
- GNUNET_free (stat_txt);
- notify_session_monitor (plugin,
- s,
- GNUNET_TRANSPORT_SS_UPDATE);
- if (H_TMP_DISCONNECTING == s->put.state)
- {
- /* PUT request is currently getting disconnected */
- s->put.state = H_TMP_RECONNECT_REQUIRED;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: currently disconnecting, reconnecting
immediately\n",
- s,
- s->put.easyhandle);
- return msgbuf_size;
- }
- if (H_PAUSED == s->put.state)
- {
- /* PUT request was paused, unpause */
- GNUNET_assert (s->put_disconnect_task != NULL);
- GNUNET_SCHEDULER_cancel (s->put_disconnect_task);
- s->put_disconnect_task = NULL;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: unpausing request\n",
- s, s->put.easyhandle);
- s->put.state = H_CONNECTED;
- if (NULL != s->put.easyhandle)
- curl_easy_pause (s->put.easyhandle, CURLPAUSE_CONT);
- }
- else if (H_TMP_DISCONNECTED == s->put.state)
- {
- /* PUT request was disconnected, reconnect */
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Session %p: Reconnecting PUT request\n", s);
- GNUNET_break (NULL == s->put.easyhandle);
- if (GNUNET_SYSERR == client_connect_put (s))
- {
- /* Could not reconnect */
- http_client_plugin_session_disconnect (plugin, s);
- return GNUNET_SYSERR;
- }
- }
- client_schedule (s->plugin, GNUNET_YES);
- return msgbuf_size;
-}
-
-
-/**
- * Disconnect a session
- *
- * @param cls the `struct HTTP_Client_Plugin *`
- * @param s session
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
- */
-static int
-http_client_plugin_session_disconnect (void *cls,
- struct GNUNET_ATS_Session *s)
-{
- struct HTTP_Client_Plugin *plugin = cls;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p: notifying transport about ending session\n",
- s);
- plugin->env->session_end (plugin->env->cls,
- s->address,
- s);
- client_delete_session (s);
-
- /* Re-schedule since handles have changed */
- if (NULL != plugin->client_perform_task)
- {
- GNUNET_SCHEDULER_cancel (plugin->client_perform_task);
- plugin->client_perform_task = NULL;
- }
- client_schedule (plugin, GNUNET_YES);
-
- return GNUNET_OK;
-}
-
-
-/**
- * Function that is called to get the keepalive factor.
- * #GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT is divided by this number to
- * calculate the interval between keepalive packets.
- *
- * @param cls closure with the `struct Plugin`
- * @return keepalive factor
- */
-static unsigned int
-http_client_query_keepalive_factor (void *cls)
-{
- return 3;
-}
-
-
-/**
- * Callback to destroys all sessions on exit.
- *
- * @param cls the `struct HTTP_Client_Plugin *`
- * @param peer identity of the peer
- * @param value the `struct GNUNET_ATS_Session *`
- * @return #GNUNET_OK (continue iterating)
- */
-static int
-destroy_session_cb (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *value)
-{
- struct HTTP_Client_Plugin *plugin = cls;
- struct GNUNET_ATS_Session *session = value;
-
- http_client_plugin_session_disconnect (plugin, session);
- return GNUNET_OK;
-}
-
-
-/**
- * Function that can be used to force the plugin to disconnect
- * from the given peer and cancel all previous transmissions
- * (and their continuationc).
- *
- * @param cls closure
- * @param target peer from which to disconnect
- */
-static void
-http_client_plugin_peer_disconnect (void *cls,
- const struct GNUNET_PeerIdentity *target)
-{
- struct HTTP_Client_Plugin *plugin = cls;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Transport tells me to disconnect `%s'\n",
- GNUNET_i2s (target));
- GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessions,
- target,
- &destroy_session_cb,
- plugin);
-}
-
-
-/**
- * Closure for #session_lookup_client_by_address().
- */
-struct GNUNET_ATS_SessionClientCtx
-{
- /**
- * Address we are looking for.
- */
- const struct GNUNET_HELLO_Address *address;
-
- /**
- * Session that was found.
- */
- struct GNUNET_ATS_Session *ret;
-};
-
-
-/**
- * Locate the seession object for a given address.
- *
- * @param cls the `struct GNUNET_ATS_SessionClientCtx *`
- * @param key peer identity
- * @param value the `struct GNUNET_ATS_Session` to check
- * @return #GNUNET_NO if found, #GNUNET_OK if not
- */
-static int
-session_lookup_client_by_address (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct GNUNET_ATS_SessionClientCtx *sc_ctx = cls;
- struct GNUNET_ATS_Session *s = value;
-
- if (0 == GNUNET_HELLO_address_cmp (sc_ctx->address,
- s->address))
- {
- sc_ctx->ret = s;
- return GNUNET_NO;
- }
- return GNUNET_YES;
-}
-
-
-/**
- * Check if a sessions exists for an specific address
- *
- * @param plugin the plugin
- * @param address the address
- * @return the session or NULL
- */
-static struct GNUNET_ATS_Session *
-client_lookup_session (struct HTTP_Client_Plugin *plugin,
- const struct GNUNET_HELLO_Address *address)
-{
- struct GNUNET_ATS_SessionClientCtx sc_ctx;
-
- sc_ctx.address = address;
- sc_ctx.ret = NULL;
- GNUNET_CONTAINER_multipeermap_iterate (plugin->sessions,
- &session_lookup_client_by_address,
- &sc_ctx);
- return sc_ctx.ret;
-}
-
-
-/**
- * When we have nothing to transmit, we pause the HTTP PUT
- * after a while (so that gnurl stops asking). This task
- * is the delayed task that actually disconnects the PUT.
- *
- * @param cls the `struct GNUNET_ATS_Session *` with the put
- */
-static void
-client_put_disconnect (void *cls)
-{
- struct GNUNET_ATS_Session *s = cls;
-
- s->put_disconnect_task = NULL;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: will be disconnected due to no activity\n",
- s, s->put.easyhandle);
- s->put.state = H_TMP_DISCONNECTING;
- if (NULL != s->put.easyhandle)
- curl_easy_pause (s->put.easyhandle,
- CURLPAUSE_CONT);
- client_schedule (s->plugin, GNUNET_YES);
-}
-
-
-/**
- * Callback method used with libcurl
- * Method is called when libcurl needs to read data during sending
- *
- * @param stream pointer where to write data
- * @param size size of an individual element
- * @param nmemb count of elements that can be written to the buffer
- * @param cls our `struct GNUNET_ATS_Session`
- * @return bytes written to stream, returning 0 will terminate request!
- */
-static size_t
-client_send_cb (void *stream,
- size_t size,
- size_t nmemb,
- void *cls)
-{
- struct GNUNET_ATS_Session *s = cls;
- struct HTTP_Client_Plugin *plugin = s->plugin;
- struct HTTP_Message *msg = s->msg_head;
- size_t len;
- char *stat_txt;
-
- if (H_TMP_DISCONNECTING == s->put.state)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: disconnect due to inactivity\n",
- s, s->put.easyhandle);
- return 0;
- }
-
- if (NULL == msg)
- {
- if (GNUNET_YES == plugin->emulate_xhr)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: PUT request finished\n",
- s,
- s->put.easyhandle);
- s->put.state = H_TMP_DISCONNECTING;
- return 0;
- }
-
- /* We have nothing to send, so pause PUT request */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: nothing to send, suspending\n",
- s,
- s->put.easyhandle);
- s->put_disconnect_task
- = GNUNET_SCHEDULER_add_delayed (PUT_DISCONNECT_TIMEOUT,
- &client_put_disconnect,
- s);
- s->put.state = H_PAUSED;
- return CURL_READFUNC_PAUSE;
- }
- /* data to send */
- GNUNET_assert (msg->pos < msg->size);
- /* calculate how much fits in buffer */
- len = GNUNET_MIN (msg->size - msg->pos,
- size * nmemb);
- GNUNET_memcpy (stream,
- &msg->buf[msg->pos],
- len);
- msg->pos += len;
- if (msg->pos == msg->size)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: sent message with %lu bytes sent, removing
message from queue\n",
- s,
- s->put.easyhandle,
- (unsigned long) msg->size);
- /* Calling transmit continuation */
- GNUNET_CONTAINER_DLL_remove (s->msg_head,
- s->msg_tail,
- msg);
- GNUNET_assert (0 < s->msgs_in_queue);
- s->msgs_in_queue--;
- GNUNET_assert (msg->size <= s->bytes_in_queue);
- s->bytes_in_queue -= msg->size;
- if (NULL != msg->transmit_cont)
- msg->transmit_cont (msg->transmit_cont_cls,
- &s->address->peer,
- GNUNET_OK,
- msg->size,
- msg->size + s->overhead);
- s->overhead = 0;
- GNUNET_free (msg);
- }
- notify_session_monitor (plugin,
- s,
- GNUNET_TRANSPORT_SS_UPDATE);
- GNUNET_asprintf (&stat_txt,
- "# bytes currently in %s_client buffers",
- plugin->protocol);
- GNUNET_STATISTICS_update (plugin->env->stats,
- stat_txt,
- -len,
- GNUNET_NO);
- GNUNET_free (stat_txt);
- GNUNET_asprintf (&stat_txt,
- "# bytes transmitted via %s_client",
- plugin->protocol);
- GNUNET_STATISTICS_update (plugin->env->stats,
- stat_txt,
- len,
- GNUNET_NO);
- GNUNET_free (stat_txt);
- return len;
-}
-
-
-/**
- * Wake up a curl handle which was suspended
- *
- * @param cls the session
- */
-static void
-client_wake_up (void *cls)
-{
- struct GNUNET_ATS_Session *s = cls;
-
- s->recv_wakeup_task = NULL;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: Waking up GET handle\n",
- s, s->get.easyhandle);
- if (H_PAUSED == s->put.state)
- {
- /* PUT request was paused, unpause */
- GNUNET_assert (s->put_disconnect_task != NULL);
- GNUNET_SCHEDULER_cancel (s->put_disconnect_task);
- s->put_disconnect_task = NULL;
- s->put.state = H_CONNECTED;
- if (NULL != s->put.easyhandle)
- curl_easy_pause (s->put.easyhandle, CURLPAUSE_CONT);
- }
- if (NULL != s->get.easyhandle)
- curl_easy_pause (s->get.easyhandle, CURLPAUSE_CONT);
-}
-
-
-/**
- * Callback for message stream tokenizer
- *
- * @param cls the session
- * @param message the message received
- * @return always #GNUNET_OK
- */
-static int
-client_receive_mst_cb (void *cls,
- const struct GNUNET_MessageHeader *message)
-{
- struct GNUNET_ATS_Session *s = cls;
- struct HTTP_Client_Plugin *plugin;
- struct GNUNET_TIME_Relative delay;
- char *stat_txt;
-
- plugin = s->plugin;
- delay = s->plugin->env->receive (plugin->env->cls,
- s->address,
- s,
- message);
- GNUNET_asprintf (&stat_txt,
- "# bytes received via %s_client",
- plugin->protocol);
- GNUNET_STATISTICS_update (plugin->env->stats,
- stat_txt,
- ntohs (message->size),
- GNUNET_NO);
- GNUNET_free (stat_txt);
-
- s->next_receive = GNUNET_TIME_relative_to_absolute (delay);
- if (GNUNET_TIME_absolute_get ().abs_value_us < s->next_receive.abs_value_us)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Client: peer `%s' address `%s' next read delayed for %s\n",
- GNUNET_i2s (&s->address->peer),
- http_common_plugin_address_to_string (s->plugin->protocol,
- s->address->address,
- s->address->address_length),
- GNUNET_STRINGS_relative_time_to_string (delay,
- GNUNET_YES));
- }
- client_reschedule_session_timeout (s);
- return GNUNET_OK;
-}
-
-
-/**
- * Callback method used with libcurl when data for a PUT request are
- * received. We do not expect data here, so we just discard it.
- *
- * @param stream pointer where to write data
- * @param size size of an individual element
- * @param nmemb count of elements that can be written to the buffer
- * @param cls destination pointer, passed to the libcurl handle
- * @return bytes read from stream
- */
-static size_t
-client_receive_put (void *stream,
- size_t size,
- size_t nmemb,
- void *cls)
-{
- return size * nmemb;
-}
-
-
-/**
- * Callback method used with libcurl when data for a GET request are
- * received. Forward to MST
- *
- * @param stream pointer where to write data
- * @param size size of an individual element
- * @param nmemb count of elements that can be written to the buffer
- * @param cls destination pointer, passed to the libcurl handle
- * @return bytes read from stream
- */
-static size_t
-client_receive (void *stream,
- size_t size,
- size_t nmemb,
- void *cls)
-{
- struct GNUNET_ATS_Session *s = cls;
- struct GNUNET_TIME_Absolute now;
- size_t len = size * nmemb;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p / request %p: Received %lu bytes from peer `%s'\n",
- s,
- s->get.easyhandle,
- (unsigned long) len,
- GNUNET_i2s (&s->address->peer));
- now = GNUNET_TIME_absolute_get ();
- if (now.abs_value_us < s->next_receive.abs_value_us)
- {
- struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get ();
- struct GNUNET_TIME_Relative delta
- = GNUNET_TIME_absolute_get_difference (now, s->next_receive);
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p / request %p: No inbound bandwidth available! Next read
was delayed for %s\n",
- s,
- s->get.easyhandle,
- GNUNET_STRINGS_relative_time_to_string (delta,
- GNUNET_YES));
- if (s->recv_wakeup_task != NULL)
- {
- GNUNET_SCHEDULER_cancel (s->recv_wakeup_task);
- s->recv_wakeup_task = NULL;
- }
- s->recv_wakeup_task
- = GNUNET_SCHEDULER_add_delayed (delta,
- &client_wake_up,
- s);
- return CURL_WRITEFUNC_PAUSE;
- }
- if (NULL == s->msg_tk)
- s->msg_tk = GNUNET_MST_create (&client_receive_mst_cb,
- s);
- GNUNET_MST_from_buffer (s->msg_tk,
- stream,
- len,
- GNUNET_NO,
- GNUNET_NO);
- return len;
-}
-
-
-static void
-client_run (void *cls)
-{
- struct HTTP_Client_Plugin *plugin = cls;
- int running;
- long http_statuscode;
- CURLMcode mret;
- CURLMsg *msg;
- int put_request; /* GNUNET_YES if easy handle is put, GNUNET_NO for get */
- int msgs_left;
-
- plugin->client_perform_task = NULL;
- /* While data are available or timeouts occurred */
- do
- {
- running = 0;
- /* Perform operations for all handles */
- mret = curl_multi_perform (plugin->curl_multi_handle, &running);
-
- /* Get additional information for all handles */
- while (NULL != (msg = curl_multi_info_read (plugin->curl_multi_handle,
- &msgs_left)))
- {
- CURL *easy_h = msg->easy_handle;
- struct GNUNET_ATS_Session *s = NULL;
- char *d = NULL; /* curl requires 'd' to be a 'char *' */
-
- GNUNET_assert (NULL != easy_h);
-
- /* Obtain session from easy handle */
- GNUNET_assert (CURLE_OK == curl_easy_getinfo (easy_h, CURLINFO_PRIVATE,
- &d));
- s = (struct GNUNET_ATS_Session *) d;
- GNUNET_assert (NULL != s);
-
- if (msg->msg != CURLMSG_DONE)
- continue; /* This should not happen */
-
- /* Get HTTP response code */
- GNUNET_break (CURLE_OK == curl_easy_getinfo (easy_h,
- CURLINFO_RESPONSE_CODE,
- &http_statuscode));
-
- if (easy_h == s->put.easyhandle)
- put_request = GNUNET_YES;
- else
- put_request = GNUNET_NO;
-
- /* Log status of terminated request */
- if ((0 != msg->data.result) || (http_statuscode != 200))
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: %s request to `%s' ended with status %li
reason %i: `%s'\n",
- s, msg->easy_handle,
- (GNUNET_YES == put_request) ? "PUT" : "GET",
- GNUNET_i2s (&s->address->peer),
- http_statuscode,
- msg->data.result,
- curl_easy_strerror (msg->data.result));
- else
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: %s request to `%s' ended normal\n",
- s, msg->easy_handle,
- (GNUNET_YES == put_request) ? "PUT" : "GET",
- GNUNET_i2s (&s->address->peer));
-
- /* Remove easy handle from multi handle */
- curl_multi_remove_handle (plugin->curl_multi_handle, easy_h);
-
- /* Clean up easy handle */
- curl_easy_cleanup (easy_h);
-
- /* Remove information */
- GNUNET_assert (plugin->cur_requests > 0);
- plugin->cur_requests--;
- LOG (GNUNET_ERROR_TYPE_INFO,
- "%s request to %s done, number of requests decreased to %u\n",
- (GNUNET_YES == put_request) ? "PUT" : "GET",
- s->url,
- plugin->cur_requests);
-
- if (GNUNET_YES == put_request)
- {
- /* Clean up a PUT request */
- s->put.easyhandle = NULL;
- s->put.s = NULL;
-
- switch (s->put.state)
- {
- case H_NOT_CONNECTED:
- case H_DISCONNECTED:
- case H_TMP_DISCONNECTED:
- /* This must not happen */
- GNUNET_break (0);
- break;
-
- case H_TMP_RECONNECT_REQUIRED:
- /* Transport called send while disconnect in progress, reconnect */
- if (GNUNET_SYSERR == client_connect_put (s))
- {
- /* Reconnect failed, disconnect session */
- http_client_plugin_session_disconnect (plugin, s);
- }
- break;
-
- case H_TMP_DISCONNECTING:
- /* PUT gets temporarily disconnected */
- s->put.state = H_TMP_DISCONNECTED;
- break;
-
- case H_PAUSED:
- case H_CONNECTED:
- /* PUT gets permanently disconnected */
- s->put.state = H_DISCONNECTED;
- http_client_plugin_session_disconnect (plugin, s);
- break;
-
- default:
- GNUNET_break (0);
- break;
- }
- }
- else if (GNUNET_NO == put_request)
- {
- /* Clean up a GET request */
- s->get.easyhandle = NULL;
- s->get.s = NULL;
-
- /* If we are emulating an XHR client we need to make another GET
- * request.
- */
- if (GNUNET_YES == plugin->emulate_xhr)
- {
- if (GNUNET_SYSERR == client_connect_get (s))
- http_client_plugin_session_disconnect (plugin, s);
- }
- else
- {
- /* GET request was terminated, so disconnect session */
- http_client_plugin_session_disconnect (plugin, s);
- }
- }
- else
- GNUNET_break (0); /* Must not happen */
-
- GNUNET_STATISTICS_set (plugin->env->stats,
- HTTP_STAT_STR_CONNECTIONS,
- plugin->cur_requests,
- GNUNET_NO);
- }
- }
- while (mret == CURLM_CALL_MULTI_PERFORM);
- client_schedule (plugin, GNUNET_NO);
-}
-
-
-#ifdef TCP_STEALTH
-/**
- * Open TCP socket with TCP STEALTH enabled.
- *
- * @param clientp our `struct GNUNET_ATS_Session *`
- * @param purpose why does curl want to open a socket
- * @param address what kind of socket does curl want to have opened?
- * @return opened socket
- */
-static curl_socket_t
-open_tcp_stealth_socket_cb (void *clientp,
- curlsocktype purpose,
- struct curl_sockaddr *address)
-{
- struct GNUNET_ATS_Session *s = clientp;
- int ret;
-
- switch (purpose)
- {
- case CURLSOCKTYPE_IPCXN:
- ret = socket (address->family,
- address->socktype,
- address->protocol);
- if (-1 == ret)
- return CURL_SOCKET_BAD;
- if (((SOCK_STREAM != address->socktype) ||
- ((0 != address->protocol) &&
- (IPPROTO_TCP != address->protocol))))
- return (curl_socket_t) ret;
- if ((0 != setsockopt (ret,
- IPPROTO_TCP,
- TCP_STEALTH,
- &s->address->peer,
- sizeof(struct GNUNET_PeerIdentity))))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("TCP_STEALTH not supported on this platform.\n"));
- (void) close (ret);
- return CURL_SOCKET_BAD;
- }
- return (curl_socket_t) ret;
-
- case CURLSOCKTYPE_ACCEPT:
- GNUNET_break (0);
- return CURL_SOCKET_BAD;
- break;
-
- case CURLSOCKTYPE_LAST:
- GNUNET_break (0);
- return CURL_SOCKET_BAD;
-
- default:
- GNUNET_break (0);
- return CURL_SOCKET_BAD;
- }
-}
-
-
-#endif
-
-
-/**
- * Connect GET request for a session
- *
- * @param s the session to connect
- * @return #GNUNET_OK on success, #GNUNET_SYSERR otherwise
- */
-static int
-client_connect_get (struct GNUNET_ATS_Session *s)
-{
- CURLMcode mret;
- struct HttpAddress *ha;
- uint32_t options;
-
- ha = (struct HttpAddress *) s->address->address;
- options = ntohl (ha->options);
- /* create get request */
- s->get.easyhandle = curl_easy_init ();
- s->get.s = s;
- if (0 != (options & HTTP_OPTIONS_TCP_STEALTH))
- {
-#ifdef TCP_STEALTH
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_OPENSOCKETFUNCTION,
- &open_tcp_stealth_socket_cb);
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_OPENSOCKETDATA,
- s);
-#else
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Cannot connect, TCP STEALTH needed and not supported by
kernel.\n");
- curl_easy_cleanup (s->get.easyhandle);
- s->get.easyhandle = NULL;
- s->get.s = NULL;
- return GNUNET_SYSERR;
-#endif
- }
-
-#if VERBOSE_CURL
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_VERBOSE,
- 1L);
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_DEBUGFUNCTION,
- &client_log);
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_DEBUGDATA,
- &s->get);
-#endif
-#if BUILD_HTTPS
- curl_easy_setopt (s->get.easyhandle, CURLOPT_SSLVERSION,
- CURL_SSLVERSION_TLSv1);
- {
- if (HTTP_OPTIONS_VERIFY_CERTIFICATE ==
- (options & HTTP_OPTIONS_VERIFY_CERTIFICATE))
- {
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_SSL_VERIFYPEER, 1L);
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_SSL_VERIFYHOST,
- 2L);
- }
- else
- {
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_SSL_VERIFYPEER,
- 0L);
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_SSL_VERIFYHOST,
- 0L);
- }
- }
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_PROTOCOLS,
- CURLPROTO_HTTPS);
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_REDIR_PROTOCOLS,
- CURLPROTO_HTTPS);
-#else
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_PROTOCOLS,
- CURLPROTO_HTTP);
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_REDIR_PROTOCOLS,
- CURLPROTO_HTTP);
-#endif
-
- if (NULL != s->plugin->proxy_hostname)
- {
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_PROXY,
- s->plugin->proxy_hostname);
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_PROXYTYPE,
- s->plugin->proxytype);
- if (NULL != s->plugin->proxy_username)
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_PROXYUSERNAME,
- s->plugin->proxy_username);
- if (NULL != s->plugin->proxy_password)
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_PROXYPASSWORD,
- s->plugin->proxy_password);
- if (GNUNET_YES == s->plugin->proxy_use_httpproxytunnel)
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_HTTPPROXYTUNNEL,
- s->plugin->proxy_use_httpproxytunnel);
- }
-
- if (GNUNET_YES == s->plugin->emulate_xhr)
- {
- char *url;
-
- GNUNET_asprintf (&url,
- "%s,1",
- s->url);
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_URL,
- url);
- GNUNET_free (url);
- }
- else
- {
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_URL,
- s->url);
- }
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_READFUNCTION,
- &client_send_cb);
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_READDATA,
- s);
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_WRITEFUNCTION,
- &client_receive);
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_WRITEDATA,
- s);
- /* No timeout by default, timeout done with session timeout */
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_TIMEOUT,
- 0L);
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_PRIVATE, s);
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_CONNECTTIMEOUT_MS,
- (long) (HTTP_CLIENT_NOT_VALIDATED_TIMEOUT.rel_value_us
- / 1000LL));
- curl_easy_setopt (s->get.easyhandle, CURLOPT_BUFFERSIZE,
- 2 * GNUNET_MAX_MESSAGE_SIZE);
-#if CURL_TCP_NODELAY
- curl_easy_setopt (ps->recv_endpoint,
- CURLOPT_TCP_NODELAY,
- 1L);
-#endif
- curl_easy_setopt (s->get.easyhandle,
- CURLOPT_FOLLOWLOCATION,
- 0L);
-
- mret = curl_multi_add_handle (s->plugin->curl_multi_handle,
- s->get.easyhandle);
- if (CURLM_OK != mret)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Session %p : Failed to add GET handle to multihandle: `%s'\n",
- s,
- curl_multi_strerror (mret));
- curl_easy_cleanup (s->get.easyhandle);
- s->get.easyhandle = NULL;
- s->get.s = NULL;
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- s->plugin->cur_requests++;
- LOG (GNUNET_ERROR_TYPE_INFO,
- "GET request `%s' established, number of requests increased to %u\n",
- s->url,
- s->plugin->cur_requests);
- return GNUNET_OK;
-}
-
-
-static int
-client_connect_put (struct GNUNET_ATS_Session *s)
-{
- CURLMcode mret;
- struct HttpAddress *ha;
- uint32_t options;
-
- ha = (struct HttpAddress *) s->address->address;
- options = ntohl (ha->options);
- /* create put request */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p: Init PUT handle\n",
- s);
- s->put.easyhandle = curl_easy_init ();
- s->put.s = s;
-#if VERBOSE_CURL
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_VERBOSE,
- 1L);
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_DEBUGFUNCTION,
- &client_log);
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_DEBUGDATA,
- &s->put);
-#endif
- if (0 != (options & HTTP_OPTIONS_TCP_STEALTH))
- {
-#ifdef TCP_STEALTH
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_OPENSOCKETFUNCTION,
- &open_tcp_stealth_socket_cb);
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_OPENSOCKETDATA,
- s);
-#else
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Cannot connect, TCP STEALTH needed and not supported by
kernel.\n");
- curl_easy_cleanup (s->put.easyhandle);
- s->put.easyhandle = NULL;
- s->put.s = NULL;
- s->put.state = H_DISCONNECTED;
- return GNUNET_SYSERR;
-#endif
- }
-#if BUILD_HTTPS
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_SSLVERSION,
- CURL_SSLVERSION_TLSv1);
- {
- struct HttpAddress *ha;
- ha = (struct HttpAddress *) s->address->address;
-
- if (HTTP_OPTIONS_VERIFY_CERTIFICATE ==
- (ntohl (ha->options) & HTTP_OPTIONS_VERIFY_CERTIFICATE))
- {
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_SSL_VERIFYPEER,
- 1L);
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_SSL_VERIFYHOST,
- 2L);
- }
- else
- {
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_SSL_VERIFYPEER,
- 0L);
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_SSL_VERIFYHOST,
- 0L);
- }
- }
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_PROTOCOLS,
- CURLPROTO_HTTPS);
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_REDIR_PROTOCOLS,
- CURLPROTO_HTTPS);
-#else
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_PROTOCOLS,
- CURLPROTO_HTTP);
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_REDIR_PROTOCOLS,
- CURLPROTO_HTTP);
-#endif
- if (NULL != s->plugin->proxy_hostname)
- {
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_PROXY,
- s->plugin->proxy_hostname);
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_PROXYTYPE,
- s->plugin->proxytype);
- if (NULL != s->plugin->proxy_username)
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_PROXYUSERNAME,
- s->plugin->proxy_username);
- if (NULL != s->plugin->proxy_password)
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_PROXYPASSWORD,
- s->plugin->proxy_password);
- if (GNUNET_YES == s->plugin->proxy_use_httpproxytunnel)
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_HTTPPROXYTUNNEL,
- s->plugin->proxy_use_httpproxytunnel);
- }
-
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_URL,
- s->url);
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_UPLOAD,
- 1L);
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_READFUNCTION,
- &client_send_cb);
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_READDATA,
- s);
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_WRITEFUNCTION,
- &client_receive_put);
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_WRITEDATA,
- s);
- /* No timeout by default, timeout done with session timeout */
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_TIMEOUT,
- 0L);
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_PRIVATE,
- s);
- curl_easy_setopt (s->put.easyhandle,
- CURLOPT_CONNECTTIMEOUT_MS,
- (long) (HTTP_CLIENT_NOT_VALIDATED_TIMEOUT.rel_value_us
- / 1000LL));
- curl_easy_setopt (s->put.easyhandle, CURLOPT_BUFFERSIZE,
- 2 * GNUNET_MAX_MESSAGE_SIZE);
-#if CURL_TCP_NODELAY
- curl_easy_setopt (s->put.easyhandle, CURLOPT_TCP_NODELAY, 1);
-#endif
- mret = curl_multi_add_handle (s->plugin->curl_multi_handle,
- s->put.easyhandle);
- if (CURLM_OK != mret)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Session %p : Failed to add PUT handle to multihandle: `%s'\n",
- s, curl_multi_strerror (mret));
- curl_easy_cleanup (s->put.easyhandle);
- s->put.easyhandle = NULL;
- s->put.s = NULL;
- s->put.state = H_DISCONNECTED;
- return GNUNET_SYSERR;
- }
- s->put.state = H_CONNECTED;
- s->plugin->cur_requests++;
-
- LOG (GNUNET_ERROR_TYPE_INFO,
- "PUT request `%s' established, number of requests increased to %u\n",
- s->url, s->plugin->cur_requests);
-
- return GNUNET_OK;
-}
-
-
-/**
- * Connect both PUT and GET request for a session
- *
- * @param s the session to connect
- * @return #GNUNET_OK on success, #GNUNET_SYSERR otherwise
- */
-static int
-client_connect (struct GNUNET_ATS_Session *s)
-{
- struct HTTP_Client_Plugin *plugin = s->plugin;
- int res = GNUNET_OK;
-
- /* create url */
- if (NULL ==
- http_common_plugin_address_to_string (plugin->protocol,
- s->address->address,
- s->address->address_length))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Invalid address peer `%s'\n",
- GNUNET_i2s (&s->address->peer));
- return GNUNET_SYSERR;
- }
-
- GNUNET_asprintf (&s->url,
- "%s/%s;%u",
- http_common_plugin_address_to_url (NULL,
- s->address->address,
-
s->address->address_length),
- GNUNET_i2s_full (plugin->env->my_identity),
- plugin->last_tag);
-
- plugin->last_tag++;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Initiating outbound session peer `%s' using address `%s'\n",
- GNUNET_i2s (&s->address->peer), s->url);
-
- if (GNUNET_SYSERR == client_connect_get (s))
- return GNUNET_SYSERR;
- /* If we are emulating an XHR client then delay sending a PUT request until
- * there is something to send.
- */
- if (GNUNET_YES == plugin->emulate_xhr)
- {
- s->put.state = H_TMP_DISCONNECTED;
- }
- else if (GNUNET_SYSERR == client_connect_put (s))
- return GNUNET_SYSERR;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p: connected with GET %p and PUT %p\n",
- s, s->get.easyhandle,
- s->put.easyhandle);
- /* Perform connect */
- GNUNET_STATISTICS_set (plugin->env->stats,
- HTTP_STAT_STR_CONNECTIONS,
- plugin->cur_requests,
- GNUNET_NO);
- /* Re-schedule since handles have changed */
- if (NULL != plugin->client_perform_task)
- {
- GNUNET_SCHEDULER_cancel (plugin->client_perform_task);
- plugin->client_perform_task = NULL;
- }
-
- /* Schedule task to run immediately */
- plugin->client_perform_task = GNUNET_SCHEDULER_add_now (client_run,
- plugin);
- return res;
-}
-
-
-/**
- * Function obtain the network type for a session
- *
- * @param cls closure (`struct Plugin*`)
- * @param session the session
- * @return the network type
- */
-static enum GNUNET_NetworkType
-http_client_plugin_get_network (void *cls,
- struct GNUNET_ATS_Session *session)
-{
- return session->scope;
-}
-
-
-/**
- * Function obtain the network type for an address.
- *
- * @param cls closure (`struct Plugin *`)
- * @param address the address
- * @return the network type
- */
-static enum GNUNET_NetworkType
-http_client_plugin_get_network_for_address (void *cls,
- const struct
- GNUNET_HELLO_Address *address)
-{
- struct HTTP_Client_Plugin *plugin = cls;
-
- return http_common_get_network_for_address (plugin->env,
- address);
-}
-
-
-/**
- * Session was idle, so disconnect it
- *
- * @param cls the `struct GNUNET_ATS_Session` of the idle session
- */
-static void
-client_session_timeout (void *cls)
-{
- struct GNUNET_ATS_Session *s = cls;
- struct GNUNET_TIME_Relative left;
-
- s->timeout_task = NULL;
- left = GNUNET_TIME_absolute_get_remaining (s->timeout);
- if (0 != left.rel_value_us)
- {
- /* not actually our turn yet, but let's at least update
- the monitor, it may think we're about to die ... */
- notify_session_monitor (s->plugin,
- s,
- GNUNET_TRANSPORT_SS_UPDATE);
- s->timeout_task = GNUNET_SCHEDULER_add_delayed (left,
- &client_session_timeout,
- s);
- return;
- }
- LOG (TIMEOUT_LOG,
- "Session %p was idle for %s, disconnecting\n",
- s,
- GNUNET_STRINGS_relative_time_to_string (HTTP_CLIENT_SESSION_TIMEOUT,
- GNUNET_YES));
- GNUNET_assert (GNUNET_OK ==
- http_client_plugin_session_disconnect (s->plugin,
- s));
-}
-
-
-/**
- * Creates a new outbound session the transport service will use to
- * send data to the peer
- *
- * @param cls the plugin
- * @param address the address
- * @return the session or NULL of max connections exceeded
- */
-static struct GNUNET_ATS_Session *
-http_client_plugin_get_session (void *cls,
- const struct GNUNET_HELLO_Address *address)
-{
- struct HTTP_Client_Plugin *plugin = cls;
- struct GNUNET_ATS_Session *s;
- struct sockaddr *sa;
- enum GNUNET_NetworkType net_type;
- size_t salen = 0;
- int res;
-
- GNUNET_assert (NULL != address->address);
-
- /* find existing session */
- s = client_lookup_session (plugin, address);
- if (NULL != s)
- return s;
-
- /* create a new session */
- if (plugin->max_requests <= plugin->cur_requests)
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "Maximum number of requests (%u) reached: "
- "cannot connect to peer `%s'\n",
- plugin->max_requests,
- GNUNET_i2s (&address->peer));
- return NULL;
- }
-
- /* Determine network location */
- net_type = GNUNET_NT_UNSPECIFIED;
- sa = http_common_socket_from_address (address->address,
- address->address_length,
- &res);
- if (GNUNET_SYSERR == res)
- return NULL;
- if (GNUNET_YES == res)
- {
- GNUNET_assert (NULL != sa);
- if (AF_INET == sa->sa_family)
- {
- salen = sizeof(struct sockaddr_in);
- }
- else if (AF_INET6 == sa->sa_family)
- {
- salen = sizeof(struct sockaddr_in6);
- }
- net_type = plugin->env->get_address_type (plugin->env->cls, sa, salen);
- GNUNET_free (sa);
- }
- else if (GNUNET_NO == res)
- {
- /* Cannot convert to sockaddr -> is external hostname */
- net_type = GNUNET_NT_WAN;
- }
- if (GNUNET_NT_UNSPECIFIED == net_type)
- {
- GNUNET_break (0);
- return NULL;
- }
-
- s = GNUNET_new (struct GNUNET_ATS_Session);
- s->plugin = plugin;
- s->address = GNUNET_HELLO_address_copy (address);
- s->scope = net_type;
-
- s->put.state = H_NOT_CONNECTED;
- s->timeout = GNUNET_TIME_relative_to_absolute (HTTP_CLIENT_SESSION_TIMEOUT);
- s->timeout_task = GNUNET_SCHEDULER_add_delayed (HTTP_CLIENT_SESSION_TIMEOUT,
- &client_session_timeout,
- s);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Created new session %p for `%s' address `%s''\n",
- s,
- http_common_plugin_address_to_string (plugin->protocol,
- s->address->address,
- s->address->address_length),
- GNUNET_i2s (&s->address->peer));
-
- /* add new session */
- (void) GNUNET_CONTAINER_multipeermap_put (plugin->sessions,
- &s->address->peer,
- s,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
- /* initiate new connection */
- if (GNUNET_SYSERR == client_connect (s))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Cannot connect to peer `%s' address `%s''\n",
- http_common_plugin_address_to_string (plugin->protocol,
- s->address->address,
- s->address->address_length),
- GNUNET_i2s (&s->address->peer));
- client_delete_session (s);
- return NULL;
- }
- notify_session_monitor (plugin,
- s,
- GNUNET_TRANSPORT_SS_INIT);
- notify_session_monitor (plugin,
- s,
- GNUNET_TRANSPORT_SS_UP); /* or handshake? */
- return s;
-}
-
-
-/**
- * Setup http_client plugin
- *
- * @param plugin the plugin handle
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
- */
-static int
-client_start (struct HTTP_Client_Plugin *plugin)
-{
- curl_global_init (CURL_GLOBAL_ALL);
- plugin->curl_multi_handle = curl_multi_init ();
-
- if (NULL == plugin->curl_multi_handle)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ (
- "Could not initialize curl multi handle, failed to start %s
plugin!\n"),
- plugin->name);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Another peer has suggested an address for this
- * peer and transport plugin. Check that this could be a valid
- * address. If so, consider adding it to the list
- * of addresses.
- *
- * @param cls closure with the `struct Plugin`
- * @param addr pointer to the address
- * @param addrlen length of @a addr
- * @return #GNUNET_OK if this is a plausible address for this peer
- * and transport; always returns #GNUNET_NO (this is the client!)
- */
-static int
-http_client_plugin_address_suggested (void *cls,
- const void *addr,
- size_t addrlen)
-{
- /* A HTTP/S client does not have any valid address so:*/
- return GNUNET_NO;
-}
-
-
-/**
- * Exit point from the plugin.
- *
- * @param cls api as closure
- * @return NULL
- */
-void *
-LIBGNUNET_PLUGIN_TRANSPORT_DONE (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
- struct HTTP_Client_Plugin *plugin = api->cls;
-
- if (NULL == api->cls)
- {
- /* Stub shutdown */
- GNUNET_free (api);
- return NULL;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- _ ("Shutting down plugin `%s'\n"),
- plugin->name);
- GNUNET_CONTAINER_multipeermap_iterate (plugin->sessions,
- &destroy_session_cb,
- plugin);
- if (NULL != plugin->client_perform_task)
- {
- GNUNET_SCHEDULER_cancel (plugin->client_perform_task);
- plugin->client_perform_task = NULL;
- }
- if (NULL != plugin->curl_multi_handle)
- {
- curl_multi_cleanup (plugin->curl_multi_handle);
- plugin->curl_multi_handle = NULL;
- }
- curl_global_cleanup ();
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- _ ("Shutdown for plugin `%s' complete\n"),
- plugin->name);
- GNUNET_CONTAINER_multipeermap_destroy (plugin->sessions);
- GNUNET_free (plugin->proxy_hostname);
- GNUNET_free (plugin->proxy_username);
- GNUNET_free (plugin->proxy_password);
- GNUNET_free (plugin);
- GNUNET_free (api);
- return NULL;
-}
-
-
-/**
- * Configure plugin
- *
- * @param plugin the plugin handle
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
- */
-static int
-client_configure_plugin (struct HTTP_Client_Plugin *plugin)
-{
- unsigned long long max_requests;
- char *proxy_type;
-
- /* Optional parameters */
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_number (plugin->env->cfg,
- plugin->name,
- "MAX_CONNECTIONS",
- &max_requests))
- max_requests = 128;
- plugin->max_requests = max_requests;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- _ ("Maximum number of requests is %u\n"),
- plugin->max_requests);
-
- /* Read proxy configuration */
- if (GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_string (plugin->env->cfg,
- plugin->name,
- "PROXY",
- &plugin->proxy_hostname))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Found proxy host: `%s'\n",
- plugin->proxy_hostname);
- /* proxy username */
- if (GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_string (plugin->env->cfg,
- plugin->name,
- "PROXY_USERNAME",
- &plugin->proxy_username))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Found proxy username name: `%s'\n",
- plugin->proxy_username);
- }
-
- /* proxy password */
- if (GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_string (plugin->env->cfg,
- plugin->name,
- "PROXY_PASSWORD",
- &plugin->proxy_password))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Found proxy password name: `%s'\n",
- plugin->proxy_password);
- }
-
- /* proxy type */
- if (GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_string (plugin->env->cfg,
- plugin->name,
- "PROXY_TYPE",
- &proxy_type))
- {
- GNUNET_STRINGS_utf8_toupper (proxy_type, proxy_type);
-
- if (0 == strcmp (proxy_type, "HTTP"))
- plugin->proxytype = CURLPROXY_HTTP;
- else if (0 == strcmp (proxy_type, "SOCKS4"))
- plugin->proxytype = CURLPROXY_SOCKS4;
- else if (0 == strcmp (proxy_type, "SOCKS5"))
- plugin->proxytype = CURLPROXY_SOCKS5;
- else if (0 == strcmp (proxy_type, "SOCKS4A"))
- plugin->proxytype = CURLPROXY_SOCKS4A;
- else if (0 == strcmp (proxy_type, "SOCKS5_HOSTNAME "))
- plugin->proxytype = CURLPROXY_SOCKS5_HOSTNAME;
- else
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ (
- "Invalid proxy type: `%s', disabling proxy! Check
configuration!\n"),
- proxy_type);
-
- GNUNET_free (proxy_type);
- GNUNET_free (plugin->proxy_hostname);
- plugin->proxy_hostname = NULL;
- GNUNET_free (plugin->proxy_username);
- plugin->proxy_username = NULL;
- GNUNET_free (plugin->proxy_password);
- plugin->proxy_password = NULL;
-
- return GNUNET_SYSERR;
- }
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Found proxy type: `%s'\n",
- proxy_type);
- }
-
- /* proxy http tunneling */
- plugin->proxy_use_httpproxytunnel
- = GNUNET_CONFIGURATION_get_value_yesno (plugin->env->cfg,
- plugin->name,
- "PROXY_HTTP_TUNNELING");
- if (GNUNET_SYSERR == plugin->proxy_use_httpproxytunnel)
- plugin->proxy_use_httpproxytunnel = GNUNET_NO;
-
- GNUNET_free (proxy_type);
- }
-
- /* Should we emulate an XHR client for testing? */
- plugin->emulate_xhr
- = GNUNET_CONFIGURATION_get_value_yesno (plugin->env->cfg,
- plugin->name,
- "EMULATE_XHR");
- return GNUNET_OK;
-}
-
-
-/**
- * Function to convert an address to a human-readable string.
- *
- * @param cls closure
- * @param addr address to convert
- * @param addrlen address length
- * @return res string if conversion was successful, NULL otherwise
- */
-static const char *
-http_client_plugin_address_to_string (void *cls,
- const void *addr,
- size_t addrlen)
-{
- return http_common_plugin_address_to_string (PLUGIN_NAME,
- addr,
- addrlen);
-}
-
-
-/**
- * Function that will be called whenever the transport service wants to
- * notify the plugin that a session is still active and in use and
- * therefore the session timeout for this session has to be updated
- *
- * @param cls closure
- * @param peer which peer was the session for
- * @param session which session is being updated
- */
-static void
-http_client_plugin_update_session_timeout (void *cls,
- const struct
- GNUNET_PeerIdentity *peer,
- struct GNUNET_ATS_Session *session)
-{
- client_reschedule_session_timeout (session);
-}
-
-
-/**
- * Function that will be called whenever the transport service wants to
- * notify the plugin that the inbound quota changed and that the plugin
- * should update it's delay for the next receive value
- *
- * @param cls closure
- * @param peer which peer was the session for
- * @param s which session is being updated
- * @param delay new delay to use for receiving
- */
-static void
-http_client_plugin_update_inbound_delay (void *cls,
- const struct GNUNET_PeerIdentity
*peer,
- struct GNUNET_ATS_Session *s,
- struct GNUNET_TIME_Relative delay)
-{
- s->next_receive = GNUNET_TIME_relative_to_absolute (delay);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "New inbound delay %s\n",
- GNUNET_STRINGS_relative_time_to_string (delay,
- GNUNET_NO));
- if (s->recv_wakeup_task != NULL)
- {
- GNUNET_SCHEDULER_cancel (s->recv_wakeup_task);
- s->recv_wakeup_task
- = GNUNET_SCHEDULER_add_delayed (delay,
- &client_wake_up,
- s);
- }
-}
-
-
-/**
- * Return information about the given session to the
- * monitor callback.
- *
- * @param cls the `struct Plugin` with the monitor callback (`sic`)
- * @param peer peer we send information about
- * @param value our `struct GNUNET_ATS_Session` to send information about
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-send_session_info_iter (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *value)
-{
- struct HTTP_Client_Plugin *plugin = cls;
- struct GNUNET_ATS_Session *session = value;
-
- notify_session_monitor (plugin,
- session,
- GNUNET_TRANSPORT_SS_INIT);
- notify_session_monitor (plugin,
- session,
- GNUNET_TRANSPORT_SS_UP); /* FIXME: or handshake? */
- return GNUNET_OK;
-}
-
-
-/**
- * Begin monitoring sessions of a plugin. There can only
- * be one active monitor per plugin (i.e. if there are
- * multiple monitors, the transport service needs to
- * multiplex the generated events over all of them).
- *
- * @param cls closure of the plugin
- * @param sic callback to invoke, NULL to disable monitor;
- * plugin will being by iterating over all active
- * sessions immediately and then enter monitor mode
- * @param sic_cls closure for @a sic
- */
-static void
-http_client_plugin_setup_monitor (void *cls,
- GNUNET_TRANSPORT_SessionInfoCallback sic,
- void *sic_cls)
-{
- struct HTTP_Client_Plugin *plugin = cls;
-
- plugin->sic = sic;
- plugin->sic_cls = sic_cls;
- if (NULL != sic)
- {
- GNUNET_CONTAINER_multipeermap_iterate (plugin->sessions,
- &send_session_info_iter,
- plugin);
- /* signal end of first iteration */
- sic (sic_cls, NULL, NULL);
- }
-}
-
-
-/**
- * Entry point for the plugin.
- */
-void *
-LIBGNUNET_PLUGIN_TRANSPORT_INIT (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginEnvironment *env = cls;
- struct GNUNET_TRANSPORT_PluginFunctions *api;
- struct HTTP_Client_Plugin *plugin;
-
- if (NULL == env->receive)
- {
- /* run in 'stub' mode (i.e. as part of gnunet-peerinfo), don't fully
- initialize the plugin or the API */
- api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
- api->cls = NULL;
- api->address_to_string = &http_client_plugin_address_to_string;
- api->string_to_address = &http_common_plugin_string_to_address;
- api->address_pretty_printer = &http_common_plugin_address_pretty_printer;
- return api;
- }
-
- plugin = GNUNET_new (struct HTTP_Client_Plugin);
- plugin->env = env;
- plugin->sessions = GNUNET_CONTAINER_multipeermap_create (128,
- GNUNET_YES);
- api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
- api->cls = plugin;
- api->send = &http_client_plugin_send;
- api->disconnect_session = &http_client_plugin_session_disconnect;
- api->query_keepalive_factor = &http_client_query_keepalive_factor;
- api->disconnect_peer = &http_client_plugin_peer_disconnect;
- api->check_address = &http_client_plugin_address_suggested;
- api->get_session = &http_client_plugin_get_session;
- api->address_to_string = &http_client_plugin_address_to_string;
- api->string_to_address = &http_common_plugin_string_to_address;
- api->address_pretty_printer = &http_common_plugin_address_pretty_printer;
- api->get_network = &http_client_plugin_get_network;
- api->get_network_for_address = &http_client_plugin_get_network_for_address;
- api->update_session_timeout = &http_client_plugin_update_session_timeout;
- api->update_inbound_delay = &http_client_plugin_update_inbound_delay;
- api->setup_monitor = &http_client_plugin_setup_monitor;
-#if BUILD_HTTPS
- plugin->name = "transport-https_client";
- plugin->protocol = "https";
-#else
- plugin->name = "transport-http_client";
- plugin->protocol = "http";
-#endif
- plugin->last_tag = 1;
-
- if (GNUNET_SYSERR == client_configure_plugin (plugin))
- {
- LIBGNUNET_PLUGIN_TRANSPORT_DONE (api);
- return NULL;
- }
-
- /* Start client */
- if (GNUNET_SYSERR == client_start (plugin))
- {
- LIBGNUNET_PLUGIN_TRANSPORT_DONE (api);
- return NULL;
- }
- return api;
-}
-
-
-/* end of plugin_transport_http_client.c */
diff --git a/src/transport/plugin_transport_http_common.c
b/src/transport/plugin_transport_http_common.c
deleted file mode 100644
index a033985e1..000000000
--- a/src/transport/plugin_transport_http_common.c
+++ /dev/null
@@ -1,903 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2002-2013 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/plugin_transport_http_common.c
- * @brief functionality shared between http(s)client plugins
- * @author Matthias Wachs
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_transport_plugin.h"
-#include "plugin_transport_http_common.h"
-#include "gnunet_resolver_service.h"
-
-static void
-http_clean_splitted (struct SplittedHTTPAddress *spa)
-{
- if (NULL != spa)
- {
- GNUNET_free (spa->protocol);
- GNUNET_free (spa->host);
- GNUNET_free (spa->path);
- GNUNET_free (spa);
- }
-}
-
-
-struct SplittedHTTPAddress *
-http_split_address (const char *addr)
-{
- struct SplittedHTTPAddress *sp;
- char *src = GNUNET_strdup (addr);
- char *protocol_start = NULL;
- char *host_start = NULL;
- char *v6_end = NULL;
- char *port_start = NULL;
- char *path_start = NULL;
-
- protocol_start = src;
-
- sp = GNUNET_new (struct SplittedHTTPAddress);
- /* Address string consists of protocol://host[:port]path*/
-
- host_start = strstr (src, "://");
- if (NULL == host_start)
- {
- GNUNET_free (src);
- GNUNET_free (sp);
- return NULL;
- }
- host_start[0] = '\0';
- sp->protocol = GNUNET_strdup (protocol_start);
-
- host_start += strlen ("://");
- if (strlen (host_start) == 0)
- {
- GNUNET_free (src);
- GNUNET_free (sp->protocol);
- GNUNET_free (sp);
- return NULL;
- }
-
- /* Find path start */
- path_start = strchr (host_start, '/');
- if (NULL != path_start)
- {
- sp->path = GNUNET_strdup (path_start);
- path_start[0] = '\0';
- }
- else
- sp->path = GNUNET_strdup ("");
-
- if (strlen (host_start) < 1)
- {
- GNUNET_free (src);
- GNUNET_free (sp->protocol);
- GNUNET_free (sp->path);
- GNUNET_free (sp);
- return NULL;
- }
-
- if (NULL != (port_start = strrchr (host_start, ':')))
- {
- /* *We COULD have a port, but also an IPv6 address! */
- if (NULL != (v6_end = strchr (host_start, ']')))
- {
- if (v6_end < port_start)
- {
- /* IPv6 address + port */
- port_start[0] = '\0';
- port_start++;
- sp->port = atoi (port_start);
- if ((0 == sp->port) || (65535 < sp->port))
- {
- GNUNET_free (src);
- GNUNET_free (sp->protocol);
- GNUNET_free (sp->path);
- GNUNET_free (sp);
- return NULL;
- }
- }
- else
- {
- /* IPv6 address + no port */
- if (0 == strcmp (sp->protocol, "https"))
- sp->port = HTTPS_DEFAULT_PORT;
- else if (0 == strcmp (sp->protocol, "http"))
- sp->port = HTTP_DEFAULT_PORT;
- }
- }
- else
- {
- /* No IPv6 address */
- port_start[0] = '\0';
- port_start++;
- sp->port = atoi (port_start);
- if ((0 == sp->port) || (65535 < sp->port))
- {
- GNUNET_free (src);
- GNUNET_free (sp->protocol);
- GNUNET_free (sp->path);
- GNUNET_free (sp);
- return NULL;
- }
- }
- }
- else
- {
- /* No ':' as port separator, default port for protocol */
- if (0 == strcmp (sp->protocol, "https"))
- sp->port = HTTPS_DEFAULT_PORT;
- else if (0 == strcmp (sp->protocol, "http"))
- sp->port = HTTP_DEFAULT_PORT;
- else
- {
- GNUNET_break (0);
- GNUNET_free (src);
- GNUNET_free (sp->protocol);
- GNUNET_free (sp->path);
- GNUNET_free (sp);
- return NULL;
- }
- }
- if (strlen (host_start) > 0)
- sp->host = GNUNET_strdup (host_start);
- else
- {
- GNUNET_break (0);
- GNUNET_free (src);
- GNUNET_free (sp->protocol);
- GNUNET_free (sp->path);
- GNUNET_free (sp);
- return NULL;
- }
- GNUNET_free (src);
- return sp;
-}
-
-
-/**
- * Closure for #append_port().
- */
-struct PrettyPrinterContext
-{
- /**
- * DLL
- */
- struct PrettyPrinterContext *next;
-
- /**
- * DLL
- */
- struct PrettyPrinterContext *prev;
-
- /**
- * Resolver handle
- */
- struct GNUNET_RESOLVER_RequestHandle *resolver_handle;
-
- /**
- * Function to call with the result.
- */
- GNUNET_TRANSPORT_AddressStringCallback asc;
-
- /**
- * Clsoure for @e asc.
- */
- void *asc_cls;
-
- /**
- * Timeout task
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * Split Address
- */
- struct SplittedHTTPAddress *saddr;
-
- /**
- * Plugin String
- */
- char *plugin;
-
- /**
- * Was conversion successful
- */
- int success;
-
- /**
- * Address options
- */
- uint32_t options;
-};
-
-/**
- * Head of PPC list
- */
-static struct PrettyPrinterContext *dll_ppc_head;
-
-/**
- * Tail of PPC list
- */
-static struct PrettyPrinterContext *dll_ppc_tail;
-
-/**
- * Function called for a quick conversion of the binary address to
- * a numeric address. Note that the caller must not free the
- * address and that the next call to this function is allowed
- * to override the address again.
- *
- * @param plugin the name of the plugin
- * @param saddr the split http address
- * @param options address options
- * @param dnsresult dns name to include in address
- * @return string representing the same address or NULL on error
- */
-static const char *
-http_common_plugin_dnsresult_to_address (const char *plugin,
- const struct
- SplittedHTTPAddress *saddr,
- uint32_t options,
- const char *dnsresult)
-{
- static char rbuf[1024];
- char *res;
-
- GNUNET_asprintf (&res, "%s.%u.%s://%s:%u%s", plugin, options,
saddr->protocol,
- dnsresult, saddr->port, saddr->path);
- if (strlen (res) + 1 < 500)
- {
- GNUNET_memcpy (rbuf, res, strlen (res) + 1);
- GNUNET_free (res);
- return rbuf;
- }
- GNUNET_break (0);
- GNUNET_free (res);
- return NULL;
-}
-
-
-static void
-http_common_dns_reverse_lookup_cb (void *cls, const char *hostname)
-{
- struct PrettyPrinterContext *ppc = cls;
-
- if (NULL != hostname)
- {
- ppc->asc (ppc->asc_cls,
- http_common_plugin_dnsresult_to_address (ppc->plugin, ppc->saddr,
- ppc->options,
- hostname), GNUNET_OK);
- ppc->success = GNUNET_YES;
- }
- else
- {
- ppc->asc (ppc->asc_cls, NULL,
- (GNUNET_NO == ppc->success) ? GNUNET_SYSERR : GNUNET_OK);
-
- GNUNET_CONTAINER_DLL_remove (dll_ppc_head, dll_ppc_tail, ppc);
- http_clean_splitted (ppc->saddr);
- GNUNET_free (ppc->plugin);
- GNUNET_free (ppc);
- }
-}
-
-
-static int
-http_common_dns_reverse_lookup (const struct sockaddr *sockaddr,
- socklen_t sockaddr_len,
- const char *type,
- struct SplittedHTTPAddress *saddr,
- uint32_t options,
- struct GNUNET_TIME_Relative timeout,
- GNUNET_TRANSPORT_AddressStringCallback asc,
- void *asc_cls)
-{
- struct PrettyPrinterContext *ppc;
-
- ppc = GNUNET_new (struct PrettyPrinterContext);
- ppc->saddr = saddr;
- ppc->asc = asc;
- ppc->asc_cls = asc_cls;
- ppc->plugin = GNUNET_strdup (type);
- ppc->options = options;
- ppc->resolver_handle = GNUNET_RESOLVER_hostname_get (sockaddr,
- sockaddr_len,
- GNUNET_YES,
- timeout,
- &
-
http_common_dns_reverse_lookup_cb,
- ppc);
- if (NULL == ppc->resolver_handle)
- {
- GNUNET_free (ppc->plugin);
- GNUNET_free (ppc);
- return GNUNET_SYSERR;
- }
- GNUNET_CONTAINER_DLL_insert (dll_ppc_head,
- dll_ppc_tail,
- ppc);
- return GNUNET_OK;
-}
-
-
-static void
-http_common_dns_ip_lookup_cb (void *cls,
- const struct sockaddr *addr,
- socklen_t addrlen)
-{
- struct PrettyPrinterContext *ppc = cls;
-
- if (NULL != addr)
- {
- ppc->asc (ppc->asc_cls,
- http_common_plugin_dnsresult_to_address (ppc->plugin, ppc->saddr,
- ppc->options,
- GNUNET_a2s (addr,
- addrlen)),
- GNUNET_OK);
- ppc->success = GNUNET_YES;
- ppc->asc (ppc->asc_cls, GNUNET_a2s (addr, addrlen), GNUNET_OK);
- }
- else
- {
- ppc->asc (ppc->asc_cls, NULL,
- (GNUNET_NO == ppc->success) ? GNUNET_SYSERR : GNUNET_OK);
-
- GNUNET_CONTAINER_DLL_remove (dll_ppc_head, dll_ppc_tail, ppc);
- GNUNET_free (ppc->plugin);
- http_clean_splitted (ppc->saddr);
- GNUNET_free (ppc);
- }
-}
-
-
-static int
-http_common_dns_ip_lookup (const char *name,
- const char *type,
- struct SplittedHTTPAddress *saddr,
- uint32_t options,
- struct GNUNET_TIME_Relative timeout,
- GNUNET_TRANSPORT_AddressStringCallback asc,
- void *asc_cls)
-{
- struct PrettyPrinterContext *ppc;
-
- ppc = GNUNET_new (struct PrettyPrinterContext);
- ppc->success = GNUNET_NO;
- ppc->saddr = saddr;
- ppc->asc = asc;
- ppc->asc_cls = asc_cls;
- ppc->plugin = GNUNET_strdup (type);
- ppc->options = options;
- ppc->resolver_handle = GNUNET_RESOLVER_ip_get (name,
- AF_UNSPEC,
- timeout,
- &http_common_dns_ip_lookup_cb,
- ppc);
- if (NULL == ppc->resolver_handle)
- {
- GNUNET_free (ppc->plugin);
- GNUNET_free (ppc);
- return GNUNET_SYSERR;
- }
- GNUNET_CONTAINER_DLL_insert (dll_ppc_head,
- dll_ppc_tail,
- ppc);
- return GNUNET_OK;
-}
-
-
-void
-http_common_plugin_address_pretty_printer (void *cls, const char *type,
- const void *addr,
- size_t addrlen,
- int numeric,
- struct GNUNET_TIME_Relative timeout,
-
GNUNET_TRANSPORT_AddressStringCallback
- asc,
- void *asc_cls)
-{
- const struct HttpAddress *address = addr;
- struct SplittedHTTPAddress *saddr;
- struct sockaddr *sock_addr;
- const char *ret;
- char *addr_str;
- int res;
- int have_ip;
-
- saddr = NULL;
- sock_addr = NULL;
- if ((addrlen < sizeof(struct HttpAddress)) ||
- (addrlen != http_common_address_get_size (address)))
- {
- GNUNET_break (0);
- goto handle_error;
- }
-
- addr_str = (char *) &address[1];
- if (addr_str[ntohl (address->urlen) - 1] != '\0')
- {
- GNUNET_break (0);
- goto handle_error;
- }
-
- saddr = http_split_address (addr_str);
- if (NULL == saddr)
- {
- GNUNET_break (0);
- goto handle_error;
- }
-
- sock_addr = http_common_socket_from_address (addr, addrlen, &res);
- if (GNUNET_SYSERR == res)
- {
- /* Malformed address */
- GNUNET_break (0);
- goto handle_error;
- }
- else if (GNUNET_NO == res)
- {
- /* Could not convert to IP */
- have_ip = GNUNET_NO;
- }
- else if (GNUNET_YES == res)
- {
- /* Converted to IP */
- have_ip = GNUNET_YES;
- }
- else
- {
- /* Must not happen */
- GNUNET_break (0);
- goto handle_error;
- }
-
- if ((GNUNET_YES == numeric) &&
- (GNUNET_YES == have_ip))
- {
- /* No lookup required */
- ret = http_common_plugin_address_to_string (type, address, addrlen);
- asc (asc_cls, ret, (NULL == ret) ? GNUNET_SYSERR : GNUNET_OK);
- asc (asc_cls, NULL, GNUNET_OK);
- http_clean_splitted (saddr);
- GNUNET_free (sock_addr);
- return;
- }
- if ((GNUNET_YES == numeric) &&
- (GNUNET_NO == have_ip))
- {
- /* Forward lookup */
- if (GNUNET_SYSERR ==
- http_common_dns_ip_lookup (saddr->host, type, saddr,
- address->options, timeout,
- asc, asc_cls))
- {
- GNUNET_break (0);
- goto handle_error;
- }
- /* Wait for resolver callback */
- GNUNET_free (sock_addr);
- return;
- }
- if ((GNUNET_NO == numeric) &&
- (GNUNET_YES == have_ip))
- {
- /* Reverse lookup */
- if (GNUNET_SYSERR ==
- http_common_dns_reverse_lookup (sock_addr,
- (AF_INET == sock_addr->sa_family)
- ? sizeof(struct sockaddr_in)
- : sizeof(struct sockaddr_in6),
- type,
- saddr,
- address->options, timeout,
- asc, asc_cls))
- {
- GNUNET_break (0);
- goto handle_error;
- }
- /* Wait for resolver callback */
- GNUNET_free (sock_addr);
- return;
- }
- if ((GNUNET_NO == numeric) &&
- (GNUNET_NO == have_ip))
- {
- /* No lookup required */
- ret = http_common_plugin_address_to_string (type, address, addrlen);
- asc (asc_cls, ret, (NULL == ret) ? GNUNET_SYSERR : GNUNET_OK);
- asc (asc_cls, NULL, GNUNET_OK);
- GNUNET_free (sock_addr);
- http_clean_splitted (saddr);
- return;
- }
- /* Error (argument supplied not GNUNET_YES or GNUNET_NO) */
- GNUNET_break (0);
- goto handle_error;
-
-handle_error:
- /* Report error */
- asc (asc_cls, NULL, GNUNET_SYSERR);
- asc (asc_cls, NULL, GNUNET_OK);
- GNUNET_free (sock_addr);
- if (NULL != saddr)
- http_clean_splitted (saddr);
-}
-
-
-/**
- * FIXME.
- */
-const char *
-http_common_plugin_address_to_url (void *cls,
- const void *addr,
- size_t addrlen)
-{
- static char rbuf[1024];
- const struct HttpAddress *address = addr;
- const char *addr_str;
-
- if (NULL == addr)
- {
- GNUNET_break (0);
- return NULL;
- }
- if (0 == addrlen)
- {
- GNUNET_break (0);
- return NULL;
- }
- if (addrlen != http_common_address_get_size (address))
- {
- GNUNET_break (0);
- return NULL;
- }
- addr_str = (char *) &address[1];
- if (addr_str[ntohl (address->urlen) - 1] != '\0')
- return NULL;
-
- GNUNET_memcpy (rbuf,
- &address[1],
- ntohl (address->urlen));
- return rbuf;
-}
-
-
-const char *
-http_common_plugin_address_to_string (const char *plugin,
- const void *addr,
- size_t addrlen)
-{
- static char rbuf[1024];
- const struct HttpAddress *address = addr;
- const char *addr_str;
- char *res;
-
- GNUNET_assert (NULL != plugin);
- if (NULL == addr)
- return NULL;
- if (0 == addrlen)
- return NULL;
- if (addrlen != http_common_address_get_size (address))
- return NULL;
- addr_str = (char *) &address[1];
- if (addr_str[ntohl (address->urlen) - 1] != '\0')
- return NULL;
- GNUNET_asprintf (&res, "%s.%u.%s", plugin, ntohl (address->options),
- (char*) &address[1]);
- if (strlen (res) + 1 < 500)
- {
- GNUNET_memcpy (rbuf, res, strlen (res) + 1);
- GNUNET_free (res);
- return rbuf;
- }
- GNUNET_break (0);
- GNUNET_free (res);
- return NULL;
-}
-
-
-int
-http_common_plugin_string_to_address (void *cls,
- const char *addr,
- uint16_t addrlen,
- void **buf,
- size_t *added)
-{
- struct HttpAddress *a;
- char *address;
- char *plugin;
- char *optionstr;
- size_t urlen;
- uint32_t options;
-
- /* Format protocol.options.address:port */
- address = NULL;
- plugin = NULL;
- optionstr = NULL;
- if ((NULL == addr) || (addrlen == 0))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if ('\0' != addr[addrlen - 1])
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if (strlen (addr) != addrlen - 1)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- plugin = GNUNET_strdup (addr);
- optionstr = strchr (plugin, '.');
- if (NULL == optionstr)
- {
- GNUNET_break (0);
- GNUNET_free (plugin);
- return GNUNET_SYSERR;
- }
- optionstr[0] = '\0';
- optionstr++;
- options = atol (optionstr); /* 0 on conversion error, that's ok */
- address = strchr (optionstr, '.');
- if (NULL == address)
- {
- GNUNET_break (0);
- GNUNET_free (plugin);
- return GNUNET_SYSERR;
- }
- address[0] = '\0';
- address++;
- urlen = strlen (address) + 1;
-
- a = GNUNET_malloc (sizeof(struct HttpAddress) + urlen);
- a->options = htonl (options);
- a->urlen = htonl (urlen);
- GNUNET_memcpy (&a[1], address, urlen);
-
- (*buf) = a;
- (*added) = sizeof(struct HttpAddress) + urlen;
- GNUNET_free (plugin);
- return GNUNET_OK;
-}
-
-
-struct HttpAddress *
-http_common_address_from_socket (const char *protocol,
- const struct sockaddr *addr,
- socklen_t addrlen)
-{
- struct HttpAddress *address = NULL;
- char *res;
- size_t len;
-
- GNUNET_asprintf (&res,
- "%s://%s",
- protocol,
- GNUNET_a2s (addr,
- addrlen));
- len = strlen (res) + 1;
- address = GNUNET_malloc (sizeof(struct HttpAddress) + len);
- address->options = htonl (HTTP_OPTIONS_NONE);
- address->urlen = htonl (len);
- GNUNET_memcpy (&address[1], res, len);
- GNUNET_free (res);
- return address;
-}
-
-
-/**
- * Create a socketaddr from a HTTP address
- *
- * @param addr a `sockaddr *` address
- * @param addrlen length of the @a addr
- * @param res the result:
- * #GNUNET_SYSERR, invalid input,
- * #GNUNET_YES: could convert to ip,
- * #GNUNET_NO: valid input but could not convert to ip (hostname?)
- * @return the string
- */
-struct sockaddr *
-http_common_socket_from_address (const void *addr,
- size_t addrlen,
- int *res)
-{
- const struct HttpAddress *ha;
- struct SplittedHTTPAddress *spa;
- struct sockaddr_storage *s;
- char *to_conv;
- size_t urlen;
-
- (*res) = GNUNET_SYSERR;
- ha = (const struct HttpAddress *) addr;
- if (NULL == addr)
- {
- GNUNET_break (0);
- return NULL;
- }
- if (0 == addrlen)
- {
- GNUNET_break (0);
- return NULL;
- }
- if (addrlen < sizeof(struct HttpAddress))
- {
- GNUNET_break (0);
- return NULL;
- }
- urlen = ntohl (ha->urlen);
- if (sizeof(struct HttpAddress) + urlen != addrlen)
- {
- /* This is a legacy addresses */
- return NULL;
- }
- if (addrlen < sizeof(struct HttpAddress) + urlen)
- {
- /* This is a legacy addresses */
- return NULL;
- }
- if (((char *) addr)[addrlen - 1] != '\0')
- {
- GNUNET_break (0);
- return NULL;
- }
- spa = http_split_address ((const char *) &ha[1]);
- if (NULL == spa)
- {
- (*res) = GNUNET_SYSERR;
- return NULL;
- }
-
- s = GNUNET_new (struct sockaddr_storage);
- GNUNET_asprintf (&to_conv, "%s:%u", spa->host, spa->port);
- if (GNUNET_SYSERR
- == GNUNET_STRINGS_to_address_ip (to_conv, strlen (to_conv), s))
- {
- /* could be a hostname */
- GNUNET_free (s);
- (*res) = GNUNET_NO;
- s = NULL;
- }
- else if ((AF_INET != s->ss_family) && (AF_INET6 != s->ss_family))
- {
- GNUNET_free (s);
- (*res) = GNUNET_SYSERR;
- s = NULL;
- }
- else
- {
- (*res) = GNUNET_YES;
- }
- http_clean_splitted (spa);
- GNUNET_free (to_conv);
- return (struct sockaddr *) s;
-}
-
-
-/**
- * Get the length of an address
- *
- * @param addr address
- * @return the size
- */
-size_t
-http_common_address_get_size (const struct HttpAddress *addr)
-{
- return sizeof(struct HttpAddress) + ntohl (addr->urlen);
-}
-
-
-/**
- * Compare addr1 to addr2
- *
- * @param addr1 address1
- * @param addrlen1 address 1 length
- * @param addr2 address2
- * @param addrlen2 address 2 length
- * @return #GNUNET_YES if equal, #GNUNET_NO if not, #GNUNET_SYSERR on error
- */
-size_t
-http_common_cmp_addresses (const void *addr1,
- size_t addrlen1,
- const void *addr2,
- size_t addrlen2)
-{
- const char *a1 = addr1;
- const char *a2 = addr2;
- const struct HttpAddress *ha1;
- const struct HttpAddress *ha2;
-
- ha1 = (const struct HttpAddress *) a1;
- ha2 = (const struct HttpAddress *) a2;
-
- if (NULL == a1)
- return GNUNET_SYSERR;
- if (0 == addrlen1)
- return GNUNET_SYSERR;
- if (a1[addrlen1 - 1] != '\0')
- return GNUNET_SYSERR;
-
- if (NULL == a2)
- return GNUNET_SYSERR;
- if (0 == addrlen2)
- return GNUNET_SYSERR;
- if (a2[addrlen2 - 1] != '\0')
- return GNUNET_SYSERR;
-
- if (addrlen1 != addrlen2)
- return GNUNET_NO;
- if (ha1->urlen != ha2->urlen)
- return GNUNET_NO;
-
- if (0 == strcmp ((const char *) &ha1[1], (const char *) &ha2[1]))
- return GNUNET_YES;
- return GNUNET_NO;
-}
-
-
-/**
- * Function obtain the network type for an address.
- *
- * @param env the environment
- * @param address the address
- * @return the network type
- */
-enum GNUNET_NetworkType
-http_common_get_network_for_address (struct
- GNUNET_TRANSPORT_PluginEnvironment *env,
- const struct GNUNET_HELLO_Address
*address)
-{
- struct sockaddr *sa;
- enum GNUNET_NetworkType net_type;
- size_t salen = 0;
- int res;
-
- net_type = GNUNET_NT_UNSPECIFIED;
- sa = http_common_socket_from_address (address->address,
- address->address_length,
- &res);
- if (GNUNET_SYSERR == res)
- return net_type;
- if (GNUNET_YES == res)
- {
- GNUNET_assert (NULL != sa);
- if (AF_INET == sa->sa_family)
- {
- salen = sizeof(struct sockaddr_in);
- }
- else if (AF_INET6 == sa->sa_family)
- {
- salen = sizeof(struct sockaddr_in6);
- }
- net_type = env->get_address_type (env->cls,
- sa,
- salen);
- GNUNET_free (sa);
- }
- return net_type;
-}
-
-
-/* end of plugin_transport_http_common.c */
diff --git a/src/transport/plugin_transport_http_common.h
b/src/transport/plugin_transport_http_common.h
deleted file mode 100644
index 7a532249d..000000000
--- a/src/transport/plugin_transport_http_common.h
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2002-2014 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/plugin_transport_http_common.c
- * @brief functionality shared by http client and server transport service
plugin
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_common.h"
-#include "gnunet_transport_plugin.h"
-
-/**
- * Timeout values for testing
- */
-#define TESTING GNUNET_NO
-
-#if TESTING
-#define HTTP_SERVER_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_SECONDS, 3)
-#define HTTP_CLIENT_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_SECONDS, 3)
-#define HTTP_CLIENT_SESSION_TIMEOUT GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_SECONDS, 7)
-#define SERVER_SESSION_TIMEOUT GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_SECONDS, 7)
-#define TIMEOUT_LOG GNUNET_ERROR_TYPE_DEBUG
-
-#else
-
-#if BUILD_HTTPS
-#define PROTOCOL "https"
-#else
-#define PROTOCOL "http"
-#endif
-
-#define HTTP_SERVER_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_SECONDS, 15)
-#define HTTP_CLIENT_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_SECONDS, 15)
-#define HTTP_CLIENT_SESSION_TIMEOUT GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT
-#define HTTP_SERVER_SESSION_TIMEOUT GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT
-#define TIMEOUT_LOG GNUNET_ERROR_TYPE_DEBUG
-
-#endif
-
-#define HTTP_DEFAULT_PORT 80
-#define HTTPS_DEFAULT_PORT 443
-
-/**
- * Bits in the `options` field of HTTP addresses.
- */
-enum HttpAddressOptions
-{
- /**
- * No bits set.
- */
- HTTP_OPTIONS_NONE = 0,
-
- /**
- * Verify X509 server certificate, it should be valid.
- * (if this bit is not set, it is probably just self-
- * signed and not expected to be verified).
- */
- HTTP_OPTIONS_VERIFY_CERTIFICATE = 1,
-
- /**
- * Enable TCP Stealth-style port knocking.
- */
- HTTP_OPTIONS_TCP_STEALTH = 2
-};
-
-
-GNUNET_NETWORK_STRUCT_BEGIN
-
-/**
- * HttpAddress
- */
-struct HttpAddress
-{
- /**
- * Address options
- * see `enum HttpAddressOptions`
- */
- uint32_t options GNUNET_PACKED;
-
- /**
- * Length of URL located after struct
- */
- uint32_t urlen GNUNET_PACKED;
-};
-
-GNUNET_NETWORK_STRUCT_END
-
-/**
- * Representation of HTTP URL split into its components.
- */
-struct SplittedHTTPAddress
-{
- char *protocol;
- char *host;
- char *path;
- int port;
-};
-
-
-/**
- * Split an HTTP address into protocol, hostname, port
- * and path components.
- */
-struct SplittedHTTPAddress *
-http_split_address (const char *addr);
-
-
-/**
- * Convert the transports address to a nice, human-readable
- * format.
- *
- * @param cls closure
- * @param type name of the transport that generated the address
- * @param addr one of the addresses of the host, NULL for the last address
- * the specific address format depends on the transport
- * @param addrlen length of @a addr
- * @param numeric should (IP) addresses be displayed in numeric form?
- * @param timeout after how long should we give up?
- * @param asc function to call on each string
- * @param asc_cls closure for @a asc
- */
-void
-http_common_plugin_address_pretty_printer (void *cls,
- const char *type,
- const void *addr,
- size_t addrlen,
- int numeric,
- struct GNUNET_TIME_Relative timeout,
-
GNUNET_TRANSPORT_AddressStringCallback
- asc,
- void *asc_cls);
-
-
-/**
- * Function called for a quick conversion of the binary address to
- * a numeric address. Note that the caller must not free the
- * address and that the next call to this function is allowed
- * to override the address again.
- *
- * @param plugin name of the plugin
- * @param addr binary address
- * @param addrlen length of @a addr
- * @return string representing the same address
- */
-const char *
-http_common_plugin_address_to_string (const char *plugin,
- const void *addr,
- size_t addrlen);
-
-
-/**
- * Function called to convert a string address to
- * a binary address.
- *
- * @param cls closure (`struct Plugin*`)
- * @param addr string address
- * @param addrlen length of @a addr
- * @param buf location to store the buffer
- * If the function returns #GNUNET_SYSERR, its contents are undefined.
- * @param added length of created address
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
- */
-int
-http_common_plugin_string_to_address (void *cls,
- const char *addr,
- uint16_t addrlen,
- void **buf,
- size_t *added);
-
-
-/**
- * Create a HTTP address from a socketaddr
- *
- * @param protocol protocol
- * @param addr `sockaddr *` address
- * @param addrlen length of the @a addr
- * @return A pointer to a `struct HttpAddress` derived from @a addr
- */
-struct HttpAddress *
-http_common_address_from_socket (const char *protocol,
- const struct sockaddr *addr,
- socklen_t addrlen);
-
-
-/**
- * Create a socketaddr from a HTTP address
- *
- * @param addr a `sockaddr *` address
- * @param addrlen length of the @a addr
- * @param res the result:
- * #GNUNET_SYSERR, invalid input,
- * #GNUNET_YES: could convert to ip,
- * #GNUNET_NO: valid input but could not convert to ip (hostname?)
- * @return the string
- */
-struct sockaddr *
-http_common_socket_from_address (const void *addr,
- size_t addrlen,
- int *res);
-
-
-const char *
-http_common_plugin_address_to_url (void *cls,
- const void *addr,
- size_t addrlen);
-
-
-/**
- * Get the length of an address
- *
- * @param addr address
- * @return the size
- */
-size_t
-http_common_address_get_size (const struct HttpAddress *addr);
-
-
-/**
- * Compare addr1 to addr2
- *
- * @param addr1 address1
- * @param addrlen1 length of @a address1
- * @param addr2 address2
- * @param addrlen2 length of @a address2
- * @return #GNUNET_YES if equal, #GNUNET_NO else
- */
-size_t
-http_common_cmp_addresses (const void *addr1,
- size_t addrlen1,
- const void *addr2,
- size_t addrlen2);
-
-
-/**
- * Function obtain the network type for an address.
- *
- * @param env the environment
- * @param address the address
- * @return the network type
- */
-enum GNUNET_NetworkType
-http_common_get_network_for_address (struct
- GNUNET_TRANSPORT_PluginEnvironment *env,
- const struct
- GNUNET_HELLO_Address *address);
-
-
-/* end of plugin_transport_http_common.h */
diff --git a/src/transport/plugin_transport_http_server.c
b/src/transport/plugin_transport_http_server.c
deleted file mode 100644
index 3ad2356b0..000000000
--- a/src/transport/plugin_transport_http_server.c
+++ /dev/null
@@ -1,3603 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2002-2014, 2017 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/plugin_transport_http_server.c
- * @brief HTTP/S server transport plugin
- * @author Matthias Wachs
- * @author David Barksdale
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_statistics_service.h"
-#include "gnunet_transport_plugin.h"
-#include "gnunet_nat_service.h"
-#include "plugin_transport_http_common.h"
-#include <microhttpd.h>
-#include <regex.h>
-#include "gnunet_mhd_compat.h"
-
-#if BUILD_HTTPS
-#define PLUGIN_NAME "https_server"
-#define LIBGNUNET_PLUGIN_TRANSPORT_INIT \
- libgnunet_plugin_transport_https_server_init
-#define LIBGNUNET_PLUGIN_TRANSPORT_DONE \
- libgnunet_plugin_transport_https_server_done
-#else
-#define PLUGIN_NAME "http_server"
-#define LIBGNUNET_PLUGIN_TRANSPORT_INIT \
- libgnunet_plugin_transport_http_server_init
-#define LIBGNUNET_PLUGIN_TRANSPORT_DONE \
- libgnunet_plugin_transport_http_server_done
-#endif
-
-#define HTTP_ERROR_RESPONSE \
- "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\"><HTML><HEAD><TITLE>404
Not Found</TITLE></HEAD><BODY><H1>Not Found</H1>The requested URL was not found
on this server.<P><HR><ADDRESS></ADDRESS></BODY></HTML>"
-#define _RECEIVE 0
-#define _SEND 1
-
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "transport-" PLUGIN_NAME, \
- __VA_ARGS__)
-
-
-/**
- * Information we keep with MHD for an HTTP request.
- */
-struct ServerRequest
-{
- /**
- * The session this server request belongs to
- * Can be NULL, when session was disconnected and freed
- */
- struct GNUNET_ATS_Session *session;
-
- /**
- * The MHD connection
- */
- struct MHD_Connection *mhd_conn;
-
- /**
- * The MHD daemon
- */
- struct MHD_Daemon *mhd_daemon;
-
- /**
- * Options requested by peer
- */
- uint32_t options;
-#define OPTION_LONG_POLL 1 /* GET request wants long-poll semantics */
-
- /**
- * _RECV or _SEND
- */
- int direction;
-
- /**
- * For PUT requests: Is this the first or last callback with size 0
- * For GET requests: Have we sent a message
- */
- int connected;
-
- /**
- * Currently suspended
- */
- bool suspended;
-};
-
-
-/**
- * Wrapper to manage addresses
- */
-struct HttpAddressWrapper
-{
- /**
- * Linked list next
- */
- struct HttpAddressWrapper *next;
-
- /**
- * Linked list previous
- */
- struct HttpAddressWrapper *prev;
-
- /**
- * An address we are using.
- */
- struct HttpAddress *address;
-
- /**
- * Length of the address.
- */
- size_t addrlen;
-};
-
-
-/**
- * Message to send using http
- */
-struct HTTP_Message
-{
- /**
- * next pointer for double linked list
- */
- struct HTTP_Message *next;
-
- /**
- * previous pointer for double linked list
- */
- struct HTTP_Message *prev;
-
- /**
- * buffer containing data to send
- */
- char *buf;
-
- /**
- * amount of data already sent
- */
- size_t pos;
-
- /**
- * buffer length
- */
- size_t size;
-
- /**
- * HTTP/S specific overhead
- */
- size_t overhead;
-
- /**
- * Continuation function to call once the transmission buffer
- * has again space available. NULL if there is no
- * continuation to call.
- */
- GNUNET_TRANSPORT_TransmitContinuation transmit_cont;
-
- /**
- * Closure for transmit_cont.
- */
- void *transmit_cont_cls;
-};
-
-
-/**
- * Session handle for connections.
- */
-struct GNUNET_ATS_Session
-{
- /**
- * To whom are we talking to (set to our identity
- * if we are still waiting for the welcome message)
- */
- struct GNUNET_PeerIdentity target;
-
- /**
- * Pointer to the global plugin struct.
- */
- struct HTTP_Server_Plugin *plugin;
-
- /**
- * next pointer for double linked list
- */
- struct HTTP_Message *msg_head;
-
- /**
- * previous pointer for double linked list
- */
- struct HTTP_Message *msg_tail;
-
- /**
- * Message stream tokenizer for incoming data
- */
- struct GNUNET_MessageStreamTokenizer *msg_tk;
-
- /**
- * Client recv handle
- */
- struct ServerRequest *server_recv;
-
- /**
- * Client send handle
- */
- struct ServerRequest *server_send;
-
- /**
- * Address
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * Absolute time when to receive data again
- * Used for receive throttling
- */
- struct GNUNET_TIME_Absolute next_receive;
-
- /**
- * Absolute time when this connection will time out.
- */
- struct GNUNET_TIME_Absolute timeout;
-
- /**
- * Session timeout task
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * Task to resume MHD handling when receiving is allowed again
- */
- struct GNUNET_SCHEDULER_Task *recv_wakeup_task;
-
- /**
- * Number of bytes waiting for transmission to this peer.
- */
- unsigned long long bytes_in_queue;
-
- /**
- * Number of messages waiting for transmission to this peer.
- */
- unsigned int msgs_in_queue;
-
- /**
- * Unique HTTP/S connection tag for this connection
- */
- uint32_t tag;
-
- /**
- * ATS network type.
- */
- enum GNUNET_NetworkType scope;
-
- /**
- * #GNUNET_YES if this session is known to the service.
- */
- int known_to_service;
-};
-
-
-/**
- * Encapsulation of all of the state of the plugin.
- */
-struct HTTP_Server_Plugin
-{
- /**
- * Our environment.
- */
- struct GNUNET_TRANSPORT_PluginEnvironment *env;
-
- /**
- * Hash map of open sessions.
- */
- struct GNUNET_CONTAINER_MultiPeerMap *sessions;
-
- /**
- * Function to call about session status changes.
- */
- GNUNET_TRANSPORT_SessionInfoCallback sic;
-
- /**
- * Closure for @e sic.
- */
- void *sic_cls;
-
- /**
- * Plugin name
- */
- char *name;
-
- /**
- * Protocol
- */
- char *protocol;
-
- /**
- * External address
- */
- char *external_hostname;
-
- /**
- * External hostname the plugin can be connected to, can be different to
- * the host's FQDN, used e.g. for reverse proxying
- */
- struct GNUNET_HELLO_Address *ext_addr;
-
- /**
- * NAT handle & address management
- */
- struct GNUNET_NAT_Handle *nat;
-
- /**
- * IPv4 addresses DLL head
- */
- struct HttpAddressWrapper *addr_head;
-
- /**
- * IPv4 addresses DLL tail
- */
- struct HttpAddressWrapper *addr_tail;
-
- /**
- * IPv4 server socket to bind to
- */
- struct sockaddr_in *server_addr_v4;
-
- /**
- * IPv6 server socket to bind to
- */
- struct sockaddr_in6 *server_addr_v6;
-
- /**
- * MHD IPv4 daemon
- */
- struct MHD_Daemon *server_v4;
-
- /**
- * MHD IPv4 daemon
- */
- struct MHD_Daemon *server_v6;
-
-#if BUILD_HTTPS
- /**
- * Crypto related
- *
- * Example:
- *
- * Use RC4-128 instead of AES:
- * NONE:+VERS-TLS1.0:+ARCFOUR-128:+SHA1:+RSA:+COMP-NULL
- *
- */
- char *crypto_init;
-
- /**
- * TLS key
- */
- char *key;
-
- /**
- * TLS certificate
- */
- char *cert;
-#endif
-
- /**
- * MHD IPv4 task
- */
- struct GNUNET_SCHEDULER_Task *server_v4_task;
-
- /**
- * MHD IPv6 task
- */
- struct GNUNET_SCHEDULER_Task *server_v6_task;
-
- /**
- * Task calling transport service about external address
- */
- struct GNUNET_SCHEDULER_Task *notify_ext_task;
-
- /**
- * Notify transport only about external address
- */
- unsigned int external_only;
-
- /**
- * The IPv4 server is scheduled to run asap
- */
- int server_v4_immediately;
-
- /**
- * The IPv6 server is scheduled to run asap
- */
- int server_v6_immediately;
-
- /**
- * Verify external address
- */
- int verify_external_hostname;
-
- /**
- * Maximum number of sockets the plugin can use
- * Each http request /request connections are two connections
- */
- unsigned int max_request;
-
- /**
- * Current number of sockets the plugin can use
- * Each http connection are two requests
- */
- unsigned int cur_request;
-
- /**
- * Did we immediately end the session in disconnect_cb
- */
- int in_shutdown;
-
- /**
- * Length of peer id
- */
- int peer_id_length;
-
- /**
- * My options to be included in the address
- */
- uint32_t options;
-
- /**
- * use IPv6
- */
- uint16_t use_ipv6;
-
- /**
- * use IPv4
- */
- uint16_t use_ipv4;
-
- /**
- * Port used
- */
- uint16_t port;
-
- /**
- * Regex for parsing URLs. FIXME: this seems overkill.
- */
- regex_t url_regex;
-};
-
-
-/**
- * If a session monitor is attached, notify it about the new
- * session state.
- *
- * @param plugin our plugin
- * @param session session that changed state
- * @param state new state of the session
- */
-static void
-notify_session_monitor (struct HTTP_Server_Plugin *plugin,
- struct GNUNET_ATS_Session *session,
- enum GNUNET_TRANSPORT_SessionState state)
-{
- struct GNUNET_TRANSPORT_SessionInfo info;
-
- if (NULL == plugin->sic)
- return;
- memset (&info, 0, sizeof(info));
- info.state = state;
- info.is_inbound = GNUNET_YES;
- info.num_msg_pending = session->msgs_in_queue;
- info.num_bytes_pending = session->bytes_in_queue;
- info.receive_delay = session->next_receive;
- info.session_timeout = session->timeout;
- info.address = session->address;
- plugin->sic (plugin->sic_cls,
- session,
- &info);
-}
-
-
-/**
- * Wake up an MHD connection which was suspended
- *
- * @param cls the session
- */
-static void
-server_wake_up (void *cls)
-{
- struct GNUNET_ATS_Session *s = cls;
-
- s->recv_wakeup_task = NULL;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p: Waking up PUT handle\n",
- s);
- GNUNET_assert (s->server_recv->suspended);
- MHD_resume_connection (s->server_recv->mhd_conn);
- s->server_recv->suspended = false;
-}
-
-
-/**
- * Reschedule the execution of both IPv4 and IPv6 server.
- *
- * @param plugin the plugin
- * @param server which server to schedule v4 or v6?
- * @param now #GNUNET_YES to schedule execution immediately, #GNUNET_NO to wait
- * until timeout
- */
-static void
-server_reschedule (struct HTTP_Server_Plugin *plugin,
- struct MHD_Daemon *server,
- int now);
-
-
-/**
- * Deletes the session. Must not be used afterwards.
- *
- * @param s the session to delete
- */
-static void
-server_delete_session (struct GNUNET_ATS_Session *s)
-{
- struct HTTP_Server_Plugin *plugin = s->plugin;
- struct HTTP_Message *msg;
-
- if (NULL != s->timeout_task)
- {
- GNUNET_SCHEDULER_cancel (s->timeout_task);
- s->timeout_task = NULL;
- s->timeout = GNUNET_TIME_UNIT_ZERO_ABS;
- }
- if (NULL != s->recv_wakeup_task)
- {
- GNUNET_SCHEDULER_cancel (s->recv_wakeup_task);
- s->recv_wakeup_task = NULL;
- if (NULL != s->server_recv)
- {
- GNUNET_assert (s->server_recv->suspended);
- s->server_recv->suspended = false;
- MHD_resume_connection (s->server_recv->mhd_conn);
- }
- }
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_remove (plugin->sessions,
- &s->target,
- s));
- while (NULL != (msg = s->msg_head))
- {
- GNUNET_CONTAINER_DLL_remove (s->msg_head,
- s->msg_tail,
- msg);
- if (NULL != msg->transmit_cont)
- msg->transmit_cont (msg->transmit_cont_cls,
- &s->target,
- GNUNET_SYSERR,
- msg->size,
- msg->pos + msg->overhead);
- GNUNET_assert (s->msgs_in_queue > 0);
- s->msgs_in_queue--;
- GNUNET_assert (s->bytes_in_queue >= msg->size);
- s->bytes_in_queue -= msg->size;
- GNUNET_free (msg);
- }
-
- GNUNET_assert (0 == s->msgs_in_queue);
- GNUNET_assert (0 == s->bytes_in_queue);
-
- if (NULL != s->server_send)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Server: %p / %p Terminating inbound PUT session to peer `%s'\n",
- s, s->server_send,
- GNUNET_i2s (&s->target));
- s->server_send->session = NULL;
- MHD_set_connection_option (s->server_send->mhd_conn,
- MHD_CONNECTION_OPTION_TIMEOUT,
- 1 /* 0 = no timeout, so this is MIN */);
- if (s->server_send->suspended)
- {
- s->server_send->suspended = false;
- MHD_resume_connection (s->server_send->mhd_conn);
- }
- server_reschedule (plugin,
- s->server_send->mhd_daemon,
- GNUNET_YES);
- }
-
- if (NULL != s->server_recv)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Server: %p / %p Terminating inbound GET session to peer `%s'\n",
- s, s->server_recv, GNUNET_i2s (&s->target));
- s->server_recv->session = NULL;
- MHD_set_connection_option (s->server_recv->mhd_conn,
- MHD_CONNECTION_OPTION_TIMEOUT,
- 1 /* 0 = no timeout, so this is MIN */);
- server_reschedule (plugin,
- s->server_recv->mhd_daemon,
- GNUNET_YES);
- }
- notify_session_monitor (plugin,
- s,
- GNUNET_TRANSPORT_SS_DONE);
- if (GNUNET_YES == s->known_to_service)
- {
- plugin->env->session_end (plugin->env->cls,
- s->address,
- s);
- s->known_to_service = GNUNET_NO;
- }
- if (NULL != s->msg_tk)
- {
- GNUNET_MST_destroy (s->msg_tk);
- s->msg_tk = NULL;
- }
- GNUNET_HELLO_address_free (s->address);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p destroyed\n",
- s);
- GNUNET_free (s);
-}
-
-
-/**
- * Disconnect session @a s by telling MHD to close the
- * connections (reducing timeout, etc.).
- *
- * @param cls closure with the `struct HTTP_Server_Plugin`
- * @param s the session
- * @return #GNUNET_OK on success
- */
-static int
-http_server_plugin_disconnect_session (void *cls,
- struct GNUNET_ATS_Session *s)
-{
- server_delete_session (s);
- return GNUNET_OK;
-}
-
-
-/**
- * Session was idle, so disconnect it
- *
- * @param cls the session
- */
-static void
-server_session_timeout (void *cls)
-{
- struct GNUNET_ATS_Session *s = cls;
- struct GNUNET_TIME_Relative left;
-
- s->timeout_task = NULL;
- left = GNUNET_TIME_absolute_get_remaining (s->timeout);
- if (0 != left.rel_value_us)
- {
- /* not actually our turn yet, but let's at least update
- the monitor, it may think we're about to die ... */
- notify_session_monitor (s->plugin,
- s,
- GNUNET_TRANSPORT_SS_UP);
- s->timeout_task = GNUNET_SCHEDULER_add_delayed (left,
- &server_session_timeout,
- s);
- return;
- }
- GNUNET_log (TIMEOUT_LOG,
- "Session %p was idle for %s, disconnecting\n",
- s,
- GNUNET_STRINGS_relative_time_to_string (
- HTTP_SERVER_SESSION_TIMEOUT,
- GNUNET_YES));
- server_delete_session (s);
-}
-
-
-/**
- * Increment session timeout due to activity session @a s
- *
- * @param s the session
- */
-static void
-server_reschedule_session_timeout (struct GNUNET_ATS_Session *s)
-{
- GNUNET_assert (NULL != s->timeout_task);
- s->timeout = GNUNET_TIME_relative_to_absolute (
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
-}
-
-
-/**
- * Function that can be used by the transport service to transmit
- * a message using the plugin. Note that in the case of a
- * peer disconnecting, the continuation MUST be called
- * prior to the disconnect notification itself. This function
- * will be called with this peer's HELLO message to initiate
- * a fresh connection to another peer.
- *
- * @param cls closure
- * @param session which session must be used
- * @param msgbuf the message to transmit
- * @param msgbuf_size number of bytes in @a msgbuf
- * @param priority how important is the message (most plugins will
- * ignore message priority and just FIFO)
- * @param to how long to wait at most for the transmission (does not
- * require plugins to discard the message after the timeout,
- * just advisory for the desired delay; most plugins will ignore
- * this as well)
- * @param cont continuation to call once the message has
- * been transmitted (or if the transport is ready
- * for the next transmission call; or if the
- * peer disconnected...); can be NULL
- * @param cont_cls closure for @a cont
- * @return number of bytes used (on the physical network, with overheads);
- * -1 on hard errors (i.e. address invalid); 0 is a legal value
- * and does NOT mean that the message was not transmitted (DV)
- */
-static ssize_t
-http_server_plugin_send (void *cls,
- struct GNUNET_ATS_Session *session,
- const char *msgbuf,
- size_t msgbuf_size,
- unsigned int priority,
- struct GNUNET_TIME_Relative to,
- GNUNET_TRANSPORT_TransmitContinuation cont,
- void *cont_cls)
-{
- struct HTTP_Server_Plugin *plugin = cls;
- struct HTTP_Message *msg;
- ssize_t bytes_sent = 0;
- char *stat_txt;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p/request %p: Sending message with %lu to peer `%s'\n",
- session,
- session->server_send,
- (unsigned long) msgbuf_size,
- GNUNET_i2s (&session->target));
-
- /* create new message and schedule */
- bytes_sent = sizeof(struct HTTP_Message) + msgbuf_size;
- msg = GNUNET_malloc (bytes_sent);
- msg->next = NULL;
- msg->size = msgbuf_size;
- msg->pos = 0;
- msg->buf = (char *) &msg[1];
- msg->transmit_cont = cont;
- msg->transmit_cont_cls = cont_cls;
- GNUNET_memcpy (msg->buf,
- msgbuf,
- msgbuf_size);
- GNUNET_CONTAINER_DLL_insert_tail (session->msg_head,
- session->msg_tail,
- msg);
- session->msgs_in_queue++;
- session->bytes_in_queue += msg->size;
- notify_session_monitor (plugin,
- session,
- GNUNET_TRANSPORT_SS_UP);
- GNUNET_asprintf (&stat_txt,
- "# bytes currently in %s_server buffers",
- plugin->protocol);
- GNUNET_STATISTICS_update (plugin->env->stats,
- stat_txt, msgbuf_size, GNUNET_NO);
- GNUNET_free (stat_txt);
-
- if (NULL != session->server_send)
- {
- if (session->server_send->suspended)
- {
- MHD_resume_connection (session->server_send->mhd_conn);
- session->server_send->suspended = false;
- }
- server_reschedule (session->plugin,
- session->server_send->mhd_daemon,
- GNUNET_YES);
- }
- return bytes_sent;
-}
-
-
-/**
- * Terminate session during shutdown.
- *
- * @param cls the `struct HTTP_Server_Plugin *`
- * @param peer for which this is a session
- * @param value the `struct GNUNET_ATS_Session` to clean up
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-destroy_session_shutdown_cb (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *value)
-{
- struct GNUNET_ATS_Session *s = value;
- struct ServerRequest *sc_send;
- struct ServerRequest *sc_recv;
-
- sc_send = s->server_send;
- sc_recv = s->server_recv;
- server_delete_session (s);
- if (NULL != sc_send)
- sc_send->session = NULL;
- if (NULL != sc_recv)
- sc_recv->session = NULL;
-
- return GNUNET_OK;
-}
-
-
-/**
- * Terminate session.
- *
- * @param cls the `struct HTTP_Server_Plugin *`
- * @param peer for which this is a session
- * @param value the `struct GNUNET_ATS_Session` to clean up
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-destroy_session_cb (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *value)
-{
- struct GNUNET_ATS_Session *s = value;
-
- server_delete_session (s);
- return GNUNET_OK;
-}
-
-
-/**
- * Function that can be used to force the plugin to disconnect
- * from the given peer and cancel all previous transmissions
- * (and their continuationc).
- *
- * @param cls closure
- * @param target peer from which to disconnect
- */
-static void
-http_server_plugin_disconnect_peer (void *cls,
- const struct GNUNET_PeerIdentity *target)
-{
- struct HTTP_Server_Plugin *plugin = cls;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Transport tells me to disconnect `%s'\n",
- GNUNET_i2s (target));
- GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessions,
- target,
- &destroy_session_cb,
- plugin);
-}
-
-
-/**
- * Another peer has suggested an address for this
- * peer and transport plugin. Check that this could be a valid
- * address. If so, consider adding it to the list
- * of addresses.
- *
- * @param cls closure
- * @param addr pointer to the address
- * @param addrlen length of @a addr
- * @return #GNUNET_OK if this is a plausible address for this peer
- * and transport
- */
-static int
-http_server_plugin_address_suggested (void *cls,
- const void *addr,
- size_t addrlen)
-{
- struct HTTP_Server_Plugin *plugin = cls;
- struct HttpAddressWrapper *next;
- struct HttpAddressWrapper *pos;
- const struct HttpAddress *haddr = addr;
-
- if ((NULL != plugin->ext_addr) &&
- (GNUNET_YES == (http_common_cmp_addresses (addr, addrlen,
- plugin->ext_addr->address,
- plugin->ext_addr->
- address_length))) )
- {
- /* Checking HTTP_OPTIONS_VERIFY_CERTIFICATE option for external hostname */
- if ((ntohl (haddr->options) & HTTP_OPTIONS_VERIFY_CERTIFICATE) !=
- (plugin->options & HTTP_OPTIONS_VERIFY_CERTIFICATE))
- return GNUNET_NO; /* VERIFY option not set as required! */
- return GNUNET_OK;
- }
- next = plugin->addr_head;
- while (NULL != (pos = next))
- {
- next = pos->next;
- if (GNUNET_YES == (http_common_cmp_addresses (addr,
- addrlen,
- pos->address,
- pos->addrlen)))
- return GNUNET_OK;
- }
- return GNUNET_NO;
-}
-
-
-/**
- * Creates a new outbound session the transport
- * service will use to send data to the peer.
- *
- * Since HTTP/S server cannot create sessions, always returns NULL.
- *
- * @param cls the plugin
- * @param address the address
- * @return always NULL
- */
-static struct GNUNET_ATS_Session *
-http_server_plugin_get_session (void *cls,
- const struct GNUNET_HELLO_Address *address)
-{
- return NULL;
-}
-
-
-/**
- * Call MHD IPv4 to process pending requests and then go back
- * and schedule the next run.
- *
- * @param cls plugin as closure
- */
-static void
-server_v4_run (void *cls)
-{
- struct HTTP_Server_Plugin *plugin = cls;
-
- plugin->server_v4_task = NULL;
- plugin->server_v4_immediately = GNUNET_NO;
- GNUNET_assert (MHD_YES == MHD_run (plugin->server_v4));
- server_reschedule (plugin, plugin->server_v4, GNUNET_NO);
-}
-
-
-/**
- * Call MHD IPv6 to process pending requests and then go back
- * and schedule the next run.
- *
- * @param cls plugin as closure
- */
-static void
-server_v6_run (void *cls)
-{
- struct HTTP_Server_Plugin *plugin = cls;
-
- plugin->server_v6_task = NULL;
- plugin->server_v6_immediately = GNUNET_NO;
- GNUNET_assert (MHD_YES == MHD_run (plugin->server_v6));
- server_reschedule (plugin, plugin->server_v6, GNUNET_NO);
-}
-
-
-/**
- * Function that queries MHD's select sets and
- * starts the task waiting for them.
- *
- * @param plugin plugin
- * @param daemon_handle the MHD daemon handle
- * @param now schedule now
- * @return gnunet task identifier
- */
-static struct GNUNET_SCHEDULER_Task *
-server_schedule (struct HTTP_Server_Plugin *plugin,
- struct MHD_Daemon *daemon_handle,
- int now)
-{
- struct GNUNET_SCHEDULER_Task *ret;
- fd_set rs;
- fd_set ws;
- fd_set es;
- struct GNUNET_NETWORK_FDSet *wrs;
- struct GNUNET_NETWORK_FDSet *wws;
- int max;
- MHD_UNSIGNED_LONG_LONG timeout;
- static unsigned long long last_timeout = 0;
- int haveto;
- struct GNUNET_TIME_Relative tv;
-
- if (GNUNET_YES == plugin->in_shutdown)
- return NULL;
-
- ret = NULL;
- FD_ZERO (&rs);
- FD_ZERO (&ws);
- FD_ZERO (&es);
- wrs = GNUNET_NETWORK_fdset_create ();
- wws = GNUNET_NETWORK_fdset_create ();
- max = -1;
- GNUNET_assert (MHD_YES ==
- MHD_get_fdset (daemon_handle,
- &rs,
- &ws,
- &es,
- &max));
- haveto = MHD_get_timeout (daemon_handle, &timeout);
- if (haveto == MHD_YES)
- {
- if (timeout != last_timeout)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "SELECT Timeout changed from %llu to %llu (ms)\n",
- last_timeout, timeout);
- last_timeout = timeout;
- }
- if (timeout <= GNUNET_TIME_UNIT_SECONDS.rel_value_us / 1000LL)
- tv.rel_value_us = (uint64_t) timeout * 1000LL;
- else
- tv = GNUNET_TIME_UNIT_SECONDS;
- }
- else
- tv = GNUNET_TIME_UNIT_SECONDS;
- /* Force immediate run, since we have outbound data to send */
- if (now == GNUNET_YES)
- tv = GNUNET_TIME_UNIT_MILLISECONDS;
- GNUNET_NETWORK_fdset_copy_native (wrs, &rs, max + 1);
- GNUNET_NETWORK_fdset_copy_native (wws, &ws, max + 1);
-
- if (daemon_handle == plugin->server_v4)
- {
- if (plugin->server_v4_task != NULL)
- {
- GNUNET_SCHEDULER_cancel (plugin->server_v4_task);
- plugin->server_v4_task = NULL;
- }
-#if 0
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Scheduling IPv4 server task in %llu ms\n",
- tv);
-#endif
- ret =
- GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT,
- tv, wrs, wws,
- &server_v4_run, plugin);
- }
- if (daemon_handle == plugin->server_v6)
- {
- if (plugin->server_v6_task != NULL)
- {
- GNUNET_SCHEDULER_cancel (plugin->server_v6_task);
- plugin->server_v6_task = NULL;
- }
-#if 0
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Scheduling IPv6 server task in %llu ms\n", tv);
-#endif
- ret =
- GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT,
- tv, wrs, wws,
- &server_v6_run, plugin);
- }
- GNUNET_NETWORK_fdset_destroy (wrs);
- GNUNET_NETWORK_fdset_destroy (wws);
- return ret;
-}
-
-
-/**
- * Reschedule the execution of both IPv4 and IPv6 server
- *
- * @param plugin the plugin
- * @param server which server to schedule v4 or v6?
- * @param now #GNUNET_YES to schedule execution immediately, #GNUNET_NO to wait
- * until timeout
- */
-static void
-server_reschedule (struct HTTP_Server_Plugin *plugin,
- struct MHD_Daemon *server,
- int now)
-{
- if ((server == plugin->server_v4) && (plugin->server_v4 != NULL))
- {
- if (GNUNET_YES == plugin->server_v4_immediately)
- return; /* No rescheduling, server will run asap */
-
- if (GNUNET_YES == now)
- plugin->server_v4_immediately = GNUNET_YES;
-
- if (plugin->server_v4_task != NULL)
- {
- GNUNET_SCHEDULER_cancel (plugin->server_v4_task);
- plugin->server_v4_task = NULL;
- }
- plugin->server_v4_task = server_schedule (plugin, plugin->server_v4, now);
- }
-
- if ((server == plugin->server_v6) && (plugin->server_v6 != NULL))
- {
- if (GNUNET_YES == plugin->server_v6_immediately)
- return; /* No rescheduling, server will run asap */
-
- if (GNUNET_YES == now)
- plugin->server_v6_immediately = GNUNET_YES;
-
- if (plugin->server_v6_task != NULL)
- {
- GNUNET_SCHEDULER_cancel (plugin->server_v6_task);
- plugin->server_v6_task = NULL;
- }
- plugin->server_v6_task = server_schedule (plugin, plugin->server_v6, now);
- }
-}
-
-
-/**
- * Function that is called to get the keepalive factor.
- * GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT is divided by this number to
- * calculate the interval between keepalive packets.
- *
- * @param cls closure with the `struct HTTP_Server_Plugin`
- * @return keepalive factor
- */
-static unsigned int
-http_server_query_keepalive_factor (void *cls)
-{
- return 3;
-}
-
-
-/**
- * Function that will be called whenever the transport service wants to
- * notify the plugin that a session is still active and in use and
- * therefore the session timeout for this session has to be updated
- *
- * @param cls closure
- * @param peer which peer was the session for
- * @param session which session is being updated
- */
-static void
-http_server_plugin_update_session_timeout (void *cls,
- const struct
- GNUNET_PeerIdentity *peer,
- struct GNUNET_ATS_Session *session)
-{
- server_reschedule_session_timeout (session);
-}
-
-
-/**
- * Tell MHD that the connection should timeout after @a to seconds.
- *
- * @param plugin our plugin
- * @param s session for which the timeout changes
- * @param to timeout in seconds
- */
-static void
-server_mhd_connection_timeout (struct HTTP_Server_Plugin *plugin,
- struct GNUNET_ATS_Session *s,
- unsigned int to)
-{
- /* Setting timeouts for other connections */
- if (NULL != s->server_recv)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Setting timeout for %p to %u sec.\n",
- s->server_recv, to);
- MHD_set_connection_option (s->server_recv->mhd_conn,
- MHD_CONNECTION_OPTION_TIMEOUT,
- to);
- server_reschedule (plugin, s->server_recv->mhd_daemon, GNUNET_NO);
- }
- if (NULL != s->server_send)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Setting timeout for %p to %u sec.\n",
- s->server_send, to);
- MHD_set_connection_option (s->server_send->mhd_conn,
- MHD_CONNECTION_OPTION_TIMEOUT,
- to);
- server_reschedule (plugin, s->server_send->mhd_daemon, GNUNET_NO);
- }
-}
-
-
-/**
- * Parse incoming URL for tag and target
- *
- * @param plugin plugin
- * @param url incoming url
- * @param target where to store the target
- * @param tag where to store the tag
- * @param options where to store the options
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
- */
-static int
-server_parse_url (struct HTTP_Server_Plugin *plugin,
- const char *url,
- struct GNUNET_PeerIdentity *target,
- uint32_t *tag,
- uint32_t *options)
-{
- regmatch_t matches[4];
- const char *tag_start;
- const char *target_start;
- char *tag_end;
- char *options_end;
- size_t hash_length;
- unsigned long int rc;
-
- /* URL parsing */
-#define URL_REGEX \
- ("^.*/([0-9A-Z]+);([0-9]+)(,[0-9]+)?$")
-
- if (NULL == url)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
-
- if (regexec (&plugin->url_regex, url, 4, matches, 0))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "URL `%s' did not match regex\n", url);
- return GNUNET_SYSERR;
- }
-
- target_start = &url[matches[1].rm_so];
- tag_start = &url[matches[2].rm_so];
-
- /* convert tag */
- rc = strtoul (tag_start, &tag_end, 10);
- if (&url[matches[2].rm_eo] != tag_end)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "URL tag did not line up with submatch\n");
- return GNUNET_SYSERR;
- }
- if (rc == 0)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "URL tag is zero\n");
- return GNUNET_SYSERR;
- }
- if ((rc == ULONG_MAX) && (ERANGE == errno))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "URL tag > ULONG_MAX\n");
- return GNUNET_SYSERR;
- }
- if (rc > UINT32_MAX)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "URL tag > UINT32_MAX\n");
- return GNUNET_SYSERR;
- }
- (*tag) = (uint32_t) rc;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Found tag `%u' in url\n",
- *tag);
-
- /* convert peer id */
- hash_length = matches[1].rm_eo - matches[1].rm_so;
- if (hash_length != plugin->peer_id_length)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "URL target is %lu bytes, expecting %u\n",
- (unsigned long) hash_length, plugin->peer_id_length);
- return GNUNET_SYSERR;
- }
- if (GNUNET_OK !=
- GNUNET_CRYPTO_eddsa_public_key_from_string (target_start,
- hash_length,
- &target->public_key))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "URL target conversion failed\n");
- return GNUNET_SYSERR;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Found target `%s' in URL\n",
- GNUNET_i2s_full (target));
-
- /* convert options */
- if (-1 == matches[3].rm_so)
- {
- *options = 0;
- }
- else
- {
- rc = strtoul (&url[matches[3].rm_so + 1], &options_end, 10);
- if (&url[matches[3].rm_eo] != options_end)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "URL options did not line up with submatch\n");
- return GNUNET_SYSERR;
- }
- if ((rc == ULONG_MAX) && (ERANGE == errno))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "URL options > ULONG_MAX\n");
- return GNUNET_SYSERR;
- }
- if (rc > UINT32_MAX)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "URL options > UINT32_MAX\n");
- return GNUNET_SYSERR;
- }
- (*options) = (uint32_t) rc;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Found options `%u' in url\n",
- *options);
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Closure for #session_tag_it().
- */
-struct GNUNET_ATS_SessionTagContext
-{
- /**
- * Set to session matching the tag.
- */
- struct GNUNET_ATS_Session *res;
-
- /**
- * Tag we are looking for.
- */
- uint32_t tag;
-};
-
-
-/**
- * Find a session with a matching tag.
- *
- * @param cls the `struct GNUNET_ATS_SessionTagContext *`
- * @param key peer identity (unused)
- * @param value the `struct GNUNET_ATS_Session *`
- * @return #GNUNET_NO if we found the session, #GNUNET_OK if not
- */
-static int
-session_tag_it (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct GNUNET_ATS_SessionTagContext *stc = cls;
- struct GNUNET_ATS_Session *s = value;
-
- if (s->tag == stc->tag)
- {
- stc->res = s;
- return GNUNET_NO;
- }
- return GNUNET_YES;
-}
-
-
-/**
- * Lookup a mhd connection and create one if none is found
- *
- * @param plugin the plugin handle
- * @param mhd_connection the incoming mhd_connection
- * @param url incoming requested URL
- * @param method PUT or GET
- * @return the server connecetion
- */
-static struct ServerRequest *
-server_lookup_connection (struct HTTP_Server_Plugin *plugin,
- struct MHD_Connection *mhd_connection,
- const char *url,
- const char *method)
-{
- struct GNUNET_ATS_Session *s = NULL;
- struct ServerRequest *sc = NULL;
- const union MHD_ConnectionInfo *conn_info;
- struct HttpAddress *addr;
- struct GNUNET_PeerIdentity target;
- size_t addr_len;
- struct GNUNET_ATS_SessionTagContext stc;
- uint32_t options;
- int direction = GNUNET_SYSERR;
- unsigned int to;
- enum GNUNET_NetworkType scope;
-
- conn_info = MHD_get_connection_info (mhd_connection,
- MHD_CONNECTION_INFO_CLIENT_ADDRESS);
- if ((conn_info->client_addr->sa_family != AF_INET) &&
- (conn_info->client_addr->sa_family != AF_INET6))
- return NULL;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "New %s request from %s\n",
- method,
- url);
- stc.tag = 0;
- options = 0; /* make gcc happy */
- if (GNUNET_SYSERR ==
- server_parse_url (plugin, url, &target, &stc.tag, &options))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Invalid url %s\n", url);
- return NULL;
- }
- if (0 == strcmp (MHD_HTTP_METHOD_PUT, method))
- direction = _RECEIVE;
- else if (0 == strcmp (MHD_HTTP_METHOD_GET, method))
- direction = _SEND;
- else
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Invalid method %s for request from %s\n",
- method, url);
- return NULL;
- }
-
- plugin->cur_request++;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "New %s request from %s with tag %u (%u of %u)\n",
- method,
- GNUNET_i2s (&target),
- stc.tag,
- plugin->cur_request, plugin->max_request);
- /* find existing session */
- stc.res = NULL;
- GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessions,
- &target,
- &session_tag_it,
- &stc);
- if (NULL == (s = stc.res))
- {
- /* create new session */
- addr = NULL;
- switch (conn_info->client_addr->sa_family)
- {
- case (AF_INET):
- addr = http_common_address_from_socket (plugin->protocol,
- conn_info->client_addr,
- sizeof(struct sockaddr_in));
- addr_len = http_common_address_get_size (addr);
- scope = plugin->env->get_address_type (plugin->env->cls,
- conn_info->client_addr,
- sizeof(struct sockaddr_in));
- break;
-
- case (AF_INET6):
- addr = http_common_address_from_socket (plugin->protocol,
- conn_info->client_addr,
- sizeof(struct sockaddr_in6));
- addr_len = http_common_address_get_size (addr);
- scope = plugin->env->get_address_type (plugin->env->cls,
- conn_info->client_addr,
- sizeof(struct sockaddr_in6));
- break;
-
- default:
- /* external host name */
- return NULL;
- }
- s = GNUNET_new (struct GNUNET_ATS_Session);
- s->target = target;
- s->plugin = plugin;
- s->scope = scope;
- s->address = GNUNET_HELLO_address_allocate (&s->target,
- PLUGIN_NAME,
- addr,
- addr_len,
-
GNUNET_HELLO_ADDRESS_INFO_INBOUND);
- s->next_receive = GNUNET_TIME_UNIT_ZERO_ABS;
- s->tag = stc.tag;
- s->timeout = GNUNET_TIME_relative_to_absolute
(HTTP_SERVER_SESSION_TIMEOUT);
- s->timeout_task = GNUNET_SCHEDULER_add_delayed
(HTTP_SERVER_SESSION_TIMEOUT,
- &server_session_timeout,
- s);
- (void) GNUNET_CONTAINER_multipeermap_put (plugin->sessions,
- &s->target,
- s,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
- notify_session_monitor (plugin,
- s,
- GNUNET_TRANSPORT_SS_INIT);
- notify_session_monitor (plugin,
- s,
- GNUNET_TRANSPORT_SS_HANDSHAKE);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Creating new session %p for peer `%s' connecting from `%s'\n",
- s, GNUNET_i2s (&target),
- http_common_plugin_address_to_string (plugin->protocol,
- addr,
- addr_len));
- GNUNET_free (addr);
- }
-
- if ((_RECEIVE == direction) &&
- (NULL != s->server_recv))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Duplicate PUT request from `%s' tag %u, dismissing new request\n",
- GNUNET_i2s (&target),
- stc.tag);
- return NULL;
- }
- if ((_SEND == direction) && (NULL != s->server_send))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Duplicate GET request from `%s' tag %u, dismissing new request\n",
- GNUNET_i2s (&target),
- stc.tag);
- return NULL;
- }
- sc = GNUNET_new (struct ServerRequest);
- if (conn_info->client_addr->sa_family == AF_INET)
- sc->mhd_daemon = plugin->server_v4;
- if (conn_info->client_addr->sa_family == AF_INET6)
- sc->mhd_daemon = plugin->server_v6;
- sc->mhd_conn = mhd_connection;
- sc->direction = direction;
- sc->connected = GNUNET_NO;
- sc->session = s;
- sc->options = options;
- if (direction == _SEND)
- {
- s->server_send = sc;
- }
- if (direction == _RECEIVE)
- {
- s->server_recv = sc;
- }
-
- if ((GNUNET_NO == s->known_to_service) &&
- (NULL != s->server_send) &&
- (NULL != s->server_recv))
- {
- s->known_to_service = GNUNET_YES;
- notify_session_monitor (plugin,
- s,
- GNUNET_TRANSPORT_SS_UP);
- plugin->env->session_start (plugin->env->cls,
- s->address,
- s,
- s->scope);
- }
-
- to = (HTTP_SERVER_SESSION_TIMEOUT.rel_value_us / 1000LL / 1000LL);
- server_mhd_connection_timeout (plugin, s, to);
- return sc;
-}
-
-
-/**
- * Callback called by MHD when it needs data to send
- *
- * @param cls current session
- * @param pos position in buffer
- * @param buf the buffer to write data to
- * @param max max number of bytes available in @a buf
- * @return bytes written to @a buf
- */
-static ssize_t
-server_send_callback (void *cls,
- uint64_t pos,
- char *buf,
- size_t max)
-{
- struct ServerRequest *sc = cls;
- struct GNUNET_ATS_Session *s = sc->session;
- ssize_t bytes_read = 0;
- struct HTTP_Message *msg;
- char *stat_txt;
-
- if (NULL == s)
- {
- /* session is disconnecting */
- return 0;
- }
-
- sc = s->server_send;
- if (NULL == sc)
- return 0;
- msg = s->msg_head;
- if (NULL != msg)
- {
- /* sending */
- bytes_read = GNUNET_MIN (msg->size - msg->pos,
- max);
- GNUNET_memcpy (buf, &msg->buf[msg->pos], bytes_read);
- msg->pos += bytes_read;
-
- /* removing message */
- if (msg->pos == msg->size)
- {
- GNUNET_CONTAINER_DLL_remove (s->msg_head,
- s->msg_tail,
- msg);
- if (NULL != msg->transmit_cont)
- msg->transmit_cont (msg->transmit_cont_cls, &s->target, GNUNET_OK,
- msg->size, msg->size + msg->overhead);
- GNUNET_assert (s->msgs_in_queue > 0);
- s->msgs_in_queue--;
- GNUNET_assert (s->bytes_in_queue >= msg->size);
- s->bytes_in_queue -= msg->size;
- GNUNET_free (msg);
- notify_session_monitor (s->plugin,
- s,
- GNUNET_TRANSPORT_SS_UPDATE);
- }
- }
- if (0 < bytes_read)
- {
- sc->connected = GNUNET_YES;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Sent %lu bytes to peer `%s' with session %p \n",
- (unsigned long) bytes_read,
- GNUNET_i2s (&s->target),
- s);
- GNUNET_asprintf (&stat_txt,
- "# bytes currently in %s_server buffers",
- s->plugin->protocol);
- GNUNET_STATISTICS_update (s->plugin->env->stats,
- stat_txt,
- -bytes_read,
- GNUNET_NO);
- GNUNET_free (stat_txt);
- GNUNET_asprintf (&stat_txt,
- "# bytes transmitted via %s_server",
- s->plugin->protocol);
- GNUNET_STATISTICS_update (s->plugin->env->stats,
- stat_txt, bytes_read, GNUNET_NO);
- GNUNET_free (stat_txt);
- }
- else if ((sc->options & OPTION_LONG_POLL) && sc->connected)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Completing GET response to peer `%s' with session %p\n",
- GNUNET_i2s (&s->target),
- s);
- return MHD_CONTENT_READER_END_OF_STREAM;
- }
- else
- {
- MHD_suspend_connection (s->server_send->mhd_conn);
- s->server_send->suspended = true;
- return 0;
- }
- return bytes_read;
-}
-
-
-/**
- * Callback called by MessageStreamTokenizer when a message has arrived
- *
- * @param cls current session as closure
- * @param message the message to be forwarded to transport service
- * @return #GNUNET_OK (all OK)
- */
-static int
-server_receive_mst_cb (void *cls,
- const struct GNUNET_MessageHeader *message)
-{
- struct GNUNET_ATS_Session *s = cls;
- struct HTTP_Server_Plugin *plugin = s->plugin;
- struct GNUNET_TIME_Relative delay;
- char *stat_txt;
-
- if (GNUNET_NO == s->known_to_service)
- {
- s->known_to_service = GNUNET_YES;
- plugin->env->session_start (plugin->env->cls,
- s->address,
- s,
- s->scope);
- notify_session_monitor (plugin,
- s,
- GNUNET_TRANSPORT_SS_UP);
- }
- delay = plugin->env->receive (plugin->env->cls,
- s->address,
- s,
- message);
- GNUNET_asprintf (&stat_txt,
- "# bytes received via %s_server",
- plugin->protocol);
- GNUNET_STATISTICS_update (plugin->env->stats,
- stat_txt,
- ntohs (message->size),
- GNUNET_NO);
- GNUNET_free (stat_txt);
- s->next_receive = GNUNET_TIME_relative_to_absolute (delay);
- if (delay.rel_value_us > 0)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Peer `%s' address `%s' next read delayed for %s\n",
- GNUNET_i2s (&s->target),
- http_common_plugin_address_to_string (plugin->protocol,
- s->address->address,
- s->address->address_length),
- GNUNET_STRINGS_relative_time_to_string (delay,
- GNUNET_YES));
- }
- server_reschedule_session_timeout (s);
- return GNUNET_OK;
-}
-
-
-/**
- * Add headers to a request indicating that we allow Cross-Origin Resource
- * Sharing.
- *
- * @param response response object to modify
- */
-static void
-add_cors_headers (struct MHD_Response *response)
-{
- MHD_add_response_header (response,
- "Access-Control-Allow-Origin",
- "*");
- MHD_add_response_header (response,
- "Access-Control-Allow-Methods",
- "GET, PUT, OPTIONS");
- MHD_add_response_header (response,
- "Access-Control-Max-Age",
- "86400");
-}
-
-
-/**
- * MHD callback for a new incoming connection
- *
- * @param cls the plugin handle
- * @param mhd_connection the mhd connection
- * @param url the requested URL
- * @param method GET or PUT
- * @param version HTTP version
- * @param upload_data upload data
- * @param upload_data_size size of @a upload_data
- * @param httpSessionCache the session cache to remember the connection
- * @return #MHD_YES if connection is accepted, #MHD_NO on reject
- */
-static MHD_RESULT
-server_access_cb (void *cls,
- struct MHD_Connection *mhd_connection,
- const char *url,
- const char *method,
- const char *version,
- const char *upload_data,
- size_t *upload_data_size,
- void **httpSessionCache)
-{
- struct HTTP_Server_Plugin *plugin = cls;
- struct ServerRequest *sc = *httpSessionCache;
- struct GNUNET_ATS_Session *s;
- struct MHD_Response *response;
- MHD_RESULT res = MHD_YES;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- _ (
- "Access from connection %p (%u of %u) for `%s' `%s' url `%s' with
upload data size %lu\n"),
- sc,
- plugin->cur_request,
- plugin->max_request,
- method,
- version,
- url,
- (unsigned long) (*upload_data_size));
- if (NULL == sc)
- {
- /* CORS pre-flight request */
- if (0 == strcmp (MHD_HTTP_METHOD_OPTIONS, method))
- {
- response = MHD_create_response_from_buffer (0, NULL,
- MHD_RESPMEM_PERSISTENT);
- add_cors_headers (response);
- res = MHD_queue_response (mhd_connection, MHD_HTTP_OK, response);
- MHD_destroy_response (response);
- return res;
- }
- /* new connection */
- sc = server_lookup_connection (plugin, mhd_connection, url, method);
- if (NULL != sc)
- {
- /* attach to new / existing session */
- (*httpSessionCache) = sc;
- }
- else
- {
- /* existing session already has matching connection, refuse */
- response = MHD_create_response_from_buffer (strlen (HTTP_ERROR_RESPONSE),
- HTTP_ERROR_RESPONSE,
- MHD_RESPMEM_PERSISTENT);
- MHD_add_response_header (response,
- MHD_HTTP_HEADER_CONTENT_TYPE,
- "text/html");
- add_cors_headers (response);
- res = MHD_queue_response (mhd_connection, MHD_HTTP_NOT_FOUND, response);
- MHD_destroy_response (response);
- return res;
- }
- }
- /* 'old' connection */
- if (NULL == (s = sc->session))
- {
- /* Session was already disconnected;
- sent HTTP/1.1: 200 OK as response */
- response = MHD_create_response_from_buffer (strlen ("Thank you!"),
- "Thank you!",
- MHD_RESPMEM_PERSISTENT);
- add_cors_headers (response);
- MHD_queue_response (mhd_connection, MHD_HTTP_OK, response);
- MHD_destroy_response (response);
- return MHD_YES;
- }
-
- if (sc->direction == _SEND)
- {
- response = MHD_create_response_from_callback (MHD_SIZE_UNKNOWN, 32 * 1024,
- &server_send_callback, sc,
- NULL);
- add_cors_headers (response);
- MHD_queue_response (mhd_connection, MHD_HTTP_OK, response);
- MHD_destroy_response (response);
- return MHD_YES;
- }
- if (sc->direction == _RECEIVE)
- {
- if ((*upload_data_size == 0) && (sc->connected == GNUNET_NO))
- {
- /* (*upload_data_size == 0) first callback when header are passed */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p / Connection %p: Peer `%s' PUT on address `%s'
connected\n",
- s, sc,
- GNUNET_i2s (&s->target),
- http_common_plugin_address_to_string (plugin->protocol,
- s->address->address,
- s->address->address_length));
- sc->connected = GNUNET_YES;
- return MHD_YES;
- }
- else if ((*upload_data_size == 0) && (sc->connected == GNUNET_YES))
- {
- /* (*upload_data_size == 0) when upload is complete */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p / Connection %p: Peer `%s' PUT on address `%s' finished
upload\n",
- s, sc,
- GNUNET_i2s (&s->target),
- http_common_plugin_address_to_string (plugin->protocol,
- s->address->address,
- s->address->address_length));
- sc->connected = GNUNET_NO;
- /* Sent HTTP/1.1: 200 OK as PUT Response\ */
- response = MHD_create_response_from_buffer (strlen ("Thank you!"),
- "Thank you!",
- MHD_RESPMEM_PERSISTENT);
- add_cors_headers (response);
- MHD_queue_response (mhd_connection, MHD_HTTP_OK, response);
- MHD_destroy_response (response);
- return MHD_YES;
- }
- else if ((*upload_data_size > 0) && (sc->connected == GNUNET_YES))
- {
- struct GNUNET_TIME_Relative delay;
-
- /* (*upload_data_size > 0) for every segment received */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p / Connection %p: Peer `%s' PUT on address `%s' received
%lu bytes\n",
- s, sc,
- GNUNET_i2s (&s->target),
- http_common_plugin_address_to_string (plugin->protocol,
- s->address->address,
- s->address->address_length),
- (unsigned long) *upload_data_size);
- delay = GNUNET_TIME_absolute_get_remaining (s->next_receive);
- if (0 == delay.rel_value_us)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "PUT with %lu bytes forwarded to MST\n",
- (unsigned long) *upload_data_size);
- if (s->msg_tk == NULL)
- {
- s->msg_tk = GNUNET_MST_create (&server_receive_mst_cb,
- s);
- }
- GNUNET_MST_from_buffer (s->msg_tk,
- upload_data,
- *upload_data_size,
- GNUNET_NO, GNUNET_NO);
- server_mhd_connection_timeout (plugin, s,
-
GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.
- rel_value_us / 1000LL
- / 1000LL);
- (*upload_data_size) = 0;
- }
- else
- {
- /* delay processing */
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p / Connection %p: no inbound bandwidth
available! Next read was delayed by %s\n",
- s,
- sc,
- GNUNET_STRINGS_relative_time_to_string (delay,
- GNUNET_YES));
- GNUNET_assert (s->server_recv->mhd_conn == mhd_connection);
- MHD_suspend_connection (s->server_recv->mhd_conn);
- s->server_recv->suspended = true;
- if (NULL == s->recv_wakeup_task)
- s->recv_wakeup_task
- = GNUNET_SCHEDULER_add_delayed (delay,
- &server_wake_up,
- s);
- }
- return MHD_YES;
- }
- else
- {
- GNUNET_break (0);
- return MHD_NO;
- }
- }
- return res;
-}
-
-
-/**
- * Callback from MHD when a connection disconnects
- *
- * @param cls closure with the `struct HTTP_Server_Plugin *`
- * @param connection the disconnected MHD connection
- * @param httpSessionCache the pointer to distinguish
- */
-static void
-server_disconnect_cb (void *cls,
- struct MHD_Connection *connection,
- void **httpSessionCache)
-{
- struct HTTP_Server_Plugin *plugin = cls;
- struct ServerRequest *sc = *httpSessionCache;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Disconnect for connection %p\n",
- sc);
- if (NULL == sc)
- {
- /* CORS pre-flight request finished */
- return;
- }
-
- if (NULL != sc->session)
- {
- if (sc->direction == _SEND)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Peer `%s' connection %p, GET on address `%s' disconnected\n",
- GNUNET_i2s (&sc->session->target),
- sc->session->server_send,
- http_common_plugin_address_to_string (plugin->protocol,
- sc->session->address->address,
- sc->session->address->
- address_length));
-
- sc->session->server_send = NULL;
- }
- else if (sc->direction == _RECEIVE)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Peer `%s' connection %p PUT on address `%s' disconnected\n",
- GNUNET_i2s (&sc->session->target),
- sc->session->server_recv,
- http_common_plugin_address_to_string (plugin->protocol,
- sc->session->address->address,
- sc->session->address->
- address_length));
- sc->session->server_recv = NULL;
- if (NULL != sc->session->msg_tk)
- {
- GNUNET_MST_destroy (sc->session->msg_tk);
- sc->session->msg_tk = NULL;
- }
- }
- }
- GNUNET_free (sc);
- plugin->cur_request--;
-}
-
-
-/**
- * Callback from MHD when a connection starts/stops
- *
- * @param cls closure with the `struct HTTP_Server_Plugin *`
- * @param connection connection handle
- * @param socket_context socket-specific pointer
- * @param toe reason for connection notification
- * @see #MHD_OPTION_NOTIFY_CONNECTION
- */
-static void
-server_connection_cb (void *cls,
- struct MHD_Connection *connection,
- void **socket_context,
- enum MHD_ConnectionNotificationCode toe)
-{
- struct HTTP_Server_Plugin *plugin = cls;
- const union MHD_ConnectionInfo *info;
-
- if (MHD_CONNECTION_NOTIFY_STARTED == toe)
- return;
-
- /* Reschedule to remove closed socket from our select set */
- info = MHD_get_connection_info (connection,
- MHD_CONNECTION_INFO_DAEMON);
- GNUNET_assert (NULL != info);
- server_reschedule (plugin,
- info->daemon,
- GNUNET_YES);
-}
-
-
-/**
- * Check if incoming connection is accepted.
- *
- * @param cls plugin as closure
- * @param addr address of incoming connection
- * @param addr_len number of bytes in @a addr
- * @return #MHD_YES if connection is accepted, #MHD_NO if connection is
rejected
- */
-static MHD_RESULT
-server_accept_cb (void *cls,
- const struct sockaddr *addr,
- socklen_t addr_len)
-{
- struct HTTP_Server_Plugin *plugin = cls;
-
- if (plugin->cur_request <= plugin->max_request)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- _ ("Accepting connection (%u of %u) from `%s'\n"),
- plugin->cur_request, plugin->max_request,
- GNUNET_a2s (addr, addr_len));
- return MHD_YES;
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ (
- "Server reached maximum number connections (%u), rejecting new
connection\n"),
- plugin->max_request);
- return MHD_NO;
- }
-}
-
-
-/**
- * Log function called by MHD.
- *
- * @param arg NULL
- * @param fmt format string
- * @param ap arguments for the format string (va_start() and va_end()
- * will be called by MHD)
- */
-static void
-server_log (void *arg,
- const char *fmt,
- va_list ap)
-{
- char text[1024];
-
- vsnprintf (text,
- sizeof(text),
- fmt,
- ap);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Server: %s\n",
- text);
-}
-
-
-#if BUILD_HTTPS
-/**
- * Load ssl certificate from file
- *
- * @param file filename
- * @return content of the file
- */
-static char *
-server_load_file (const char *file)
-{
- struct GNUNET_DISK_FileHandle *gn_file;
- uint64_t fsize;
- char *text = NULL;
-
- if (GNUNET_OK != GNUNET_DISK_file_size (file,
- &fsize, GNUNET_NO, GNUNET_YES))
- return NULL;
- text = GNUNET_malloc (fsize + 1);
- gn_file =
- GNUNET_DISK_file_open (file, GNUNET_DISK_OPEN_READ,
- GNUNET_DISK_PERM_USER_READ);
- if (NULL == gn_file)
- {
- GNUNET_free (text);
- return NULL;
- }
- if (GNUNET_SYSERR == GNUNET_DISK_file_read (gn_file, text, fsize))
- {
- GNUNET_free (text);
- GNUNET_DISK_file_close (gn_file);
- return NULL;
- }
- text[fsize] = '\0';
- GNUNET_DISK_file_close (gn_file);
- return text;
-}
-
-
-#endif
-
-
-#if BUILD_HTTPS
-/**
- * Load ssl certificate
- *
- * @param plugin the plugin
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
- */
-static int
-server_load_certificate (struct HTTP_Server_Plugin *plugin)
-{
- int res = GNUNET_OK;
- char *key_file;
- char *cert_file;
-
-
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_filename (plugin->env->cfg,
- plugin->name,
- "KEY_FILE", &key_file))
- {
- GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
- plugin->name, "CERT_FILE");
- return GNUNET_SYSERR;
- }
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_filename (plugin->env->cfg,
- plugin->name,
- "CERT_FILE", &cert_file))
- {
- GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
- plugin->name, "CERT_FILE");
- GNUNET_free (key_file);
- return GNUNET_SYSERR;
- }
- /* Get crypto init string from config. If not present, use
- * default values */
- if (GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_string (plugin->env->cfg,
- plugin->name,
- "CRYPTO_INIT",
- &plugin->crypto_init))
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Using crypto init string `%s'\n",
- plugin->crypto_init);
- else
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Using default crypto init string \n");
-
- /* read key & certificates from file */
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Trying to loading TLS certificate from key-file `%s'
cert-file`%s'\n",
- key_file, cert_file);
-
- plugin->key = server_load_file (key_file);
- plugin->cert = server_load_file (cert_file);
-
- if ((plugin->key == NULL) || (plugin->cert == NULL))
- {
- struct GNUNET_OS_Process *cert_creation;
-
- GNUNET_free (plugin->key);
- plugin->key = NULL;
- GNUNET_free (plugin->cert);
- plugin->cert = NULL;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "No usable TLS certificate found, creating certificate\n");
- errno = 0;
- cert_creation =
- GNUNET_OS_start_process (GNUNET_OS_INHERIT_STD_OUT_AND_ERR,
- NULL, NULL, NULL,
- "gnunet-transport-certificate-creation",
- "gnunet-transport-certificate-creation",
- key_file,
- cert_file,
- NULL);
- if (NULL == cert_creation)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ (
- "Could not create a new TLS certificate, program
`gnunet-transport-certificate-creation' could not be started!\n"));
- GNUNET_free (key_file);
- GNUNET_free (cert_file);
-
- GNUNET_free (plugin->key);
- plugin->key = NULL;
- GNUNET_free (plugin->cert);
- plugin->cert = NULL;
- GNUNET_free (plugin->crypto_init);
- plugin->crypto_init = NULL;
-
- return GNUNET_SYSERR;
- }
- GNUNET_assert (GNUNET_OK == GNUNET_OS_process_wait (cert_creation));
- GNUNET_OS_process_destroy (cert_creation);
-
- plugin->key = server_load_file (key_file);
- plugin->cert = server_load_file (cert_file);
- }
-
- if ((plugin->key == NULL) || (plugin->cert == NULL))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ (
- "No usable TLS certificate found and creating one at `%s/%s'
failed!\n"),
- key_file, cert_file);
- GNUNET_free (key_file);
- GNUNET_free (cert_file);
-
- GNUNET_free (plugin->key);
- plugin->key = NULL;
- GNUNET_free (plugin->cert);
- plugin->cert = NULL;
- GNUNET_free (plugin->crypto_init);
- plugin->crypto_init = NULL;
-
- return GNUNET_SYSERR;
- }
- GNUNET_free (key_file);
- GNUNET_free (cert_file);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "TLS certificate loaded\n");
- return res;
-}
-
-
-#endif
-
-
-/**
- * Invoke `MHD_start_daemon` with the various options we need to
- * setup the HTTP server with the given listen address.
- *
- * @param plugin our plugin
- * @param addr listen address to use
- * @param v6 MHD_NO_FLAG or MHD_USE_IPv6, depending on context
- * @return NULL on error
- */
-static struct MHD_Daemon *
-run_mhd_start_daemon (struct HTTP_Server_Plugin *plugin,
- const struct sockaddr_in *addr,
- int v6)
-{
- struct MHD_Daemon *server;
- unsigned int timeout;
-
-#if MHD_VERSION >= 0x00090E00
- timeout = HTTP_SERVER_NOT_VALIDATED_TIMEOUT.rel_value_us / 1000LL / 1000LL;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "MHD can set timeout per connection! Default time out %u sec.\n",
- timeout);
-#else
- timeout = HTTP_SERVER_SESSION_TIMEOUT.rel_value_us / 1000LL / 1000LL;
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "MHD cannot set timeout per connection! Default time out %u sec.\n",
- timeout);
-#endif
- server = MHD_start_daemon (
-#if VERBOSE_SERVER
- MHD_USE_DEBUG |
-#endif
-#if BUILD_HTTPS
- MHD_USE_SSL |
-#endif
- MHD_USE_SUSPEND_RESUME
- | v6,
- plugin->port,
- &server_accept_cb, plugin,
- &server_access_cb, plugin,
- MHD_OPTION_SOCK_ADDR,
- addr,
- MHD_OPTION_CONNECTION_LIMIT,
- (unsigned int) plugin->max_request,
-#if BUILD_HTTPS
- MHD_OPTION_HTTPS_PRIORITIES,
- plugin->crypto_init,
- MHD_OPTION_HTTPS_MEM_KEY,
- plugin->key,
- MHD_OPTION_HTTPS_MEM_CERT,
- plugin->cert,
-#endif
- MHD_OPTION_CONNECTION_TIMEOUT,
- timeout,
- MHD_OPTION_CONNECTION_MEMORY_LIMIT,
- (size_t) (2
- * GNUNET_MAX_MESSAGE_SIZE),
- MHD_OPTION_NOTIFY_COMPLETED,
- &server_disconnect_cb, plugin,
- MHD_OPTION_NOTIFY_CONNECTION,
- &server_connection_cb, plugin,
- MHD_OPTION_EXTERNAL_LOGGER,
- &server_log, NULL,
- MHD_OPTION_END);
-#ifdef TCP_STEALTH
- if ((NULL != server) &&
- (0 != (plugin->options & HTTP_OPTIONS_TCP_STEALTH)))
- {
- const union MHD_DaemonInfo *di;
-
- di = MHD_get_daemon_info (server,
- MHD_DAEMON_INFO_LISTEN_FD,
- NULL);
- if ((0 != setsockopt ((int) di->listen_fd,
- IPPROTO_TCP,
- TCP_STEALTH,
- plugin->env->my_identity,
- sizeof(struct GNUNET_PeerIdentity))))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("TCP_STEALTH not supported on this platform.\n"));
- MHD_stop_daemon (server);
- server = NULL;
- }
- }
-#endif
- return server;
-}
-
-
-/**
- * Start the HTTP server
- *
- * @param plugin the plugin handle
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
- */
-static int
-server_start (struct HTTP_Server_Plugin *plugin)
-{
- const char *msg;
-
- GNUNET_assert (NULL != plugin);
-#if BUILD_HTTPS
- if (GNUNET_SYSERR == server_load_certificate (plugin))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ (
- "Could not load or create server certificate! Loading plugin
failed!\n"));
- return GNUNET_SYSERR;
- }
-#endif
-
-
- plugin->server_v4 = NULL;
- if (GNUNET_YES == plugin->use_ipv4)
- {
- plugin->server_v4
- = run_mhd_start_daemon (plugin,
- (const struct
- sockaddr_in *) plugin->server_addr_v4,
- MHD_NO_FLAG);
-
- if (NULL == plugin->server_v4)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Failed to start %s IPv4 server component on port %u\n",
- plugin->name,
- plugin->port);
- }
- else
- server_reschedule (plugin,
- plugin->server_v4,
- GNUNET_NO);
- }
-
-
- plugin->server_v6 = NULL;
- if (GNUNET_YES == plugin->use_ipv6)
- {
- plugin->server_v6
- = run_mhd_start_daemon (plugin,
- (const struct
- sockaddr_in *) plugin->server_addr_v6,
- MHD_USE_IPv6);
- if (NULL == plugin->server_v6)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Failed to start %s IPv6 server component on port %u\n",
- plugin->name,
- plugin->port);
- }
- else
- {
- server_reschedule (plugin,
- plugin->server_v6,
- GNUNET_NO);
- }
- }
- msg = "No";
- if ((NULL == plugin->server_v6) &&
- (NULL == plugin->server_v4))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "%s %s server component started on port %u\n",
- msg,
- plugin->name,
- plugin->port);
- return GNUNET_SYSERR;
- }
- if ((NULL != plugin->server_v6) &&
- (NULL != plugin->server_v4))
- msg = "IPv4 and IPv6";
- else if (NULL != plugin->server_v6)
- msg = "IPv6";
- else if (NULL != plugin->server_v4)
- msg = "IPv4";
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "%s %s server component started on port %u\n",
- msg,
- plugin->name,
- plugin->port);
- return GNUNET_OK;
-}
-
-
-/**
- * Add an address to the server's set of addresses and notify transport
- *
- * @param cls the plugin handle
- * @param add_remove #GNUNET_YES on add, #GNUNET_NO on remove
- * @param addr the address
- * @param addrlen address length
- */
-static void
-server_add_address (void *cls,
- int add_remove,
- const struct sockaddr *addr,
- socklen_t addrlen)
-{
- struct HTTP_Server_Plugin *plugin = cls;
- struct GNUNET_HELLO_Address *address;
- struct HttpAddressWrapper *w = NULL;
-
- w = GNUNET_new (struct HttpAddressWrapper);
- w->address = http_common_address_from_socket (plugin->protocol,
- addr,
- addrlen);
- if (NULL == w->address)
- {
- GNUNET_free (w);
- return;
- }
- w->addrlen = http_common_address_get_size (w->address);
-
- GNUNET_CONTAINER_DLL_insert (plugin->addr_head,
- plugin->addr_tail,
- w);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Notifying transport to add address `%s'\n",
- http_common_plugin_address_to_string (plugin->protocol,
- w->address,
- w->addrlen));
- /* modify our published address list */
-#if BUILD_HTTPS
- address = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
- "https_client", w->address,
- w->addrlen,
- GNUNET_HELLO_ADDRESS_INFO_NONE);
-#else
- address = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
- "http_client", w->address,
- w->addrlen,
- GNUNET_HELLO_ADDRESS_INFO_NONE);
-#endif
-
- plugin->env->notify_address (plugin->env->cls,
- add_remove,
- address);
- GNUNET_HELLO_address_free (address);
-}
-
-
-/**
- * Remove an address from the server's set of addresses and notify transport
- *
- * @param cls the plugin handle
- * @param add_remove #GNUNET_YES on add, #GNUNET_NO on remove
- * @param addr the address
- * @param addrlen address length
- */
-static void
-server_remove_address (void *cls,
- int add_remove,
- const struct sockaddr *addr,
- socklen_t addrlen)
-{
- struct HTTP_Server_Plugin *plugin = cls;
- struct GNUNET_HELLO_Address *address;
- struct HttpAddressWrapper *w = plugin->addr_head;
- size_t saddr_len;
- void *saddr;
-
- saddr = http_common_address_from_socket (plugin->protocol,
- addr,
- addrlen);
- if (NULL == saddr)
- return;
- saddr_len = http_common_address_get_size (saddr);
-
- while (NULL != w)
- {
- if (GNUNET_YES ==
- http_common_cmp_addresses (w->address,
- w->addrlen,
- saddr,
- saddr_len))
- break;
- w = w->next;
- }
- GNUNET_free (saddr);
-
- if (NULL == w)
- return;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Notifying transport to remove address `%s'\n",
- http_common_plugin_address_to_string (plugin->protocol,
- w->address,
- w->addrlen));
- GNUNET_CONTAINER_DLL_remove (plugin->addr_head,
- plugin->addr_tail,
- w);
- /* modify our published address list */
-#if BUILD_HTTPS
- address = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
- "https_client", w->address,
- w->addrlen,
- GNUNET_HELLO_ADDRESS_INFO_NONE);
-#else
- address = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
- "http_client", w->address,
- w->addrlen,
- GNUNET_HELLO_ADDRESS_INFO_NONE);
-#endif
- plugin->env->notify_address (plugin->env->cls, add_remove, address);
- GNUNET_HELLO_address_free (address);
- GNUNET_free (w->address);
- GNUNET_free (w);
-}
-
-
-/**
- * Our external IP address/port mapping has changed.
- *
- * @param cls closure, the 'struct LocalAddrList'
- * @param[in,out] app_ctx location where the app can store stuff
- * on add and retrieve it on remove
- * @param add_remove #GNUNET_YES to mean the new public IP address, #GNUNET_NO
to mean
- * the previous (now invalid) one
- * @param ac address class the address belongs to
- * @param addr either the previous or the new public IP address
- * @param addrlen actual length of the address
- */
-static void
-server_nat_port_map_callback (void *cls,
- void **app_ctx,
- int add_remove,
- enum GNUNET_NAT_AddressClass ac,
- const struct sockaddr *addr,
- socklen_t addrlen)
-{
- struct HTTP_Server_Plugin *plugin = cls;
-
- (void) app_ctx;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "NAT called to %s address `%s'\n",
- (add_remove == GNUNET_NO) ? "remove" : "add",
- GNUNET_a2s (addr, addrlen));
-
- if (AF_INET == addr->sa_family)
- {
- struct sockaddr_in *s4 = (struct sockaddr_in *) addr;
-
- if (GNUNET_NO == plugin->use_ipv4)
- return;
-
- if ((NULL != plugin->server_addr_v4) &&
- (0 != memcmp (&plugin->server_addr_v4->sin_addr,
- &s4->sin_addr,
- sizeof(struct in_addr))))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Skipping address `%s' (not bindto address)\n",
- GNUNET_a2s (addr, addrlen));
- return;
- }
- }
-
- if (AF_INET6 == addr->sa_family)
- {
- struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) addr;
- if (GNUNET_NO == plugin->use_ipv6)
- return;
-
- if ((NULL != plugin->server_addr_v6) &&
- (0 != memcmp (&plugin->server_addr_v6->sin6_addr,
- &s6->sin6_addr, sizeof(struct in6_addr))))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Skipping address `%s' (not bindto address)\n",
- GNUNET_a2s (addr, addrlen));
- return;
- }
- }
-
- switch (add_remove)
- {
- case GNUNET_YES:
- server_add_address (cls, add_remove, addr, addrlen);
- break;
-
- case GNUNET_NO:
- server_remove_address (cls, add_remove, addr, addrlen);
- break;
- }
-}
-
-
-/**
- * Get valid server addresses
- *
- * @param plugin the plugin handle
- * @param service_name the servicename
- * @param cfg configuration handle
- * @param addrs addresses
- * @param addr_lens address length
- * @return number of addresses
- */
-static int
-server_get_addresses (struct HTTP_Server_Plugin *plugin,
- const char *service_name,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- struct sockaddr ***addrs,
- socklen_t **addr_lens)
-{
- int disablev6;
- unsigned long long port;
- struct addrinfo hints;
- struct addrinfo *res;
- struct addrinfo *pos;
- struct addrinfo *next;
- unsigned int i;
- int resi;
- int ret;
- struct sockaddr **saddrs;
- socklen_t *saddrlens;
- char *hostname;
-
- *addrs = NULL;
- *addr_lens = NULL;
-
- disablev6 = ! plugin->use_ipv6;
-
- port = 0;
- if (GNUNET_CONFIGURATION_have_value (cfg, service_name, "PORT"))
- {
- GNUNET_break (GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_number (cfg, service_name,
- "PORT", &port));
- if (port > 65535)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ (
- "Require valid port number for service in
configuration!\n"));
- return GNUNET_SYSERR;
- }
- }
- if (0 == port)
- {
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Starting in listen only mode\n");
- return -1; /* listen only */
- }
-
-
- if (GNUNET_CONFIGURATION_have_value (cfg, service_name,
- "BINDTO"))
- {
- GNUNET_break (GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_string (cfg, service_name,
- "BINDTO", &hostname));
- }
- else
- hostname = NULL;
-
- if (NULL != hostname)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Resolving `%s' since that is where `%s' will bind to.\n",
- hostname, service_name);
- memset (&hints, 0, sizeof(struct addrinfo));
- if (disablev6)
- hints.ai_family = AF_INET;
- if ((0 != (ret = getaddrinfo (hostname, NULL, &hints, &res))) ||
- (NULL == res))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to resolve `%s': %s\n"),
- hostname,
- gai_strerror (ret));
- GNUNET_free (hostname);
- return GNUNET_SYSERR;
- }
- next = res;
- i = 0;
- while (NULL != (pos = next))
- {
- next = pos->ai_next;
- if ((disablev6) && (pos->ai_family == AF_INET6))
- continue;
- i++;
- }
- if (0 == i)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to find %saddress for `%s'.\n"),
- disablev6 ? "IPv4 " : "", hostname);
- freeaddrinfo (res);
- GNUNET_free (hostname);
- return GNUNET_SYSERR;
- }
- resi = i;
- saddrs = GNUNET_malloc ((resi + 1) * sizeof(struct sockaddr *));
- saddrlens = GNUNET_malloc ((resi + 1) * sizeof(socklen_t));
- i = 0;
- next = res;
- while (NULL != (pos = next))
- {
- next = pos->ai_next;
- if ((disablev6) && (pos->ai_family == AF_INET6))
- continue;
- if ((pos->ai_protocol != IPPROTO_TCP) && (0 != pos->ai_protocol))
- continue; /* not TCP */
- if ((pos->ai_socktype != SOCK_STREAM) && (0 != pos->ai_socktype))
- continue; /* huh? */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Service will bind to `%s'\n",
- GNUNET_a2s (pos->ai_addr,
- pos->ai_addrlen));
- if (pos->ai_family == AF_INET)
- {
- GNUNET_assert (pos->ai_addrlen == sizeof(struct sockaddr_in));
- saddrlens[i] = pos->ai_addrlen;
- saddrs[i] = GNUNET_malloc (saddrlens[i]);
- GNUNET_memcpy (saddrs[i], pos->ai_addr, saddrlens[i]);
- ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
- }
- else
- {
- GNUNET_assert (pos->ai_family == AF_INET6);
- GNUNET_assert (pos->ai_addrlen == sizeof(struct sockaddr_in6));
- saddrlens[i] = pos->ai_addrlen;
- saddrs[i] = GNUNET_malloc (saddrlens[i]);
- GNUNET_memcpy (saddrs[i], pos->ai_addr, saddrlens[i]);
- ((struct sockaddr_in6 *) saddrs[i])->sin6_port = htons (port);
- }
- i++;
- }
- GNUNET_free (hostname);
- freeaddrinfo (res);
- resi = i;
- }
- else
- {
- /* will bind against everything, just set port */
- if (disablev6)
- {
- /* V4-only */
- resi = 1;
- i = 0;
- saddrs = GNUNET_malloc ((resi + 1) * sizeof(struct sockaddr *));
- saddrlens = GNUNET_malloc ((resi + 1) * sizeof(socklen_t));
-
- saddrlens[i] = sizeof(struct sockaddr_in);
- saddrs[i] = GNUNET_malloc (saddrlens[i]);
-#if HAVE_SOCKADDR_IN_SIN_LEN
- ((struct sockaddr_in *) saddrs[i])->sin_len = saddrlens[i];
-#endif
- ((struct sockaddr_in *) saddrs[i])->sin_family = AF_INET;
- ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
- }
- else
- {
- /* dual stack */
- resi = 2;
- saddrs = GNUNET_malloc ((resi + 1) * sizeof(struct sockaddr *));
- saddrlens = GNUNET_malloc ((resi + 1) * sizeof(socklen_t));
- i = 0;
- saddrlens[i] = sizeof(struct sockaddr_in6);
- saddrs[i] = GNUNET_malloc (saddrlens[i]);
-#if HAVE_SOCKADDR_IN_SIN_LEN
- ((struct sockaddr_in6 *) saddrs[i])->sin6_len = saddrlens[0];
-#endif
- ((struct sockaddr_in6 *) saddrs[i])->sin6_family = AF_INET6;
- ((struct sockaddr_in6 *) saddrs[i])->sin6_port = htons (port);
- i++;
- saddrlens[i] = sizeof(struct sockaddr_in);
- saddrs[i] = GNUNET_malloc (saddrlens[i]);
-#if HAVE_SOCKADDR_IN_SIN_LEN
- ((struct sockaddr_in *) saddrs[i])->sin_len = saddrlens[1];
-#endif
- ((struct sockaddr_in *) saddrs[i])->sin_family = AF_INET;
- ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
- }
- }
- *addrs = saddrs;
- *addr_lens = saddrlens;
- return resi;
-}
-
-
-/**
- * Ask NAT for addresses
- *
- * @param plugin the plugin handle
- */
-static void
-server_start_report_addresses (struct HTTP_Server_Plugin *plugin)
-{
- int res = GNUNET_OK;
- struct sockaddr **addrs;
- socklen_t *addrlens;
-
- res = server_get_addresses (plugin,
- plugin->name,
- plugin->env->cfg,
- &addrs, &addrlens);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- _ ("Found %u addresses to report to NAT service\n"),
- res);
-
- if (GNUNET_SYSERR == res)
- {
- plugin->nat = NULL;
- return;
- }
-
- plugin->nat
- = GNUNET_NAT_register (plugin->env->cfg,
- plugin->name,
- IPPROTO_TCP,
- (unsigned int) res,
- (const struct sockaddr **) addrs,
- addrlens,
- &server_nat_port_map_callback,
- NULL,
- plugin);
- while (res > 0)
- {
- res--;
- GNUNET_assert (NULL != addrs[res]);
- GNUNET_free (addrs[res]);
- }
- GNUNET_free (addrs);
- GNUNET_free (addrlens);
-}
-
-
-/**
- * Stop NAT for addresses
- *
- * @param plugin the plugin handle
- */
-static void
-server_stop_report_addresses (struct HTTP_Server_Plugin *plugin)
-{
- struct HttpAddressWrapper *w;
-
- /* Stop NAT handle */
- if (NULL != plugin->nat)
- {
- GNUNET_NAT_unregister (plugin->nat);
- plugin->nat = NULL;
- }
- /* Clean up addresses */
- while (NULL != plugin->addr_head)
- {
- w = plugin->addr_head;
- GNUNET_CONTAINER_DLL_remove (plugin->addr_head,
- plugin->addr_tail,
- w);
- GNUNET_free (w->address);
- GNUNET_free (w);
- }
-}
-
-
-/**
- * Check if IPv6 supported on this system
- *
- * @param plugin the plugin handle
- * @return #GNUNET_YES on success, else #GNUNET_NO
- */
-static int
-server_check_ipv6_support (struct HTTP_Server_Plugin *plugin)
-{
- struct GNUNET_NETWORK_Handle *desc = NULL;
- int res = GNUNET_NO;
-
- /* Probe IPv6 support */
- desc = GNUNET_NETWORK_socket_create (PF_INET6,
- SOCK_STREAM,
- 0);
- if (NULL == desc)
- {
- if ((errno == ENOBUFS) ||
- (errno == ENOMEM) ||
- (errno == ENFILE) ||
- (errno == EACCES))
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
- "socket");
- }
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ ("Disabling IPv6 since it is not supported on this system!\n"));
- res = GNUNET_NO;
- }
- else
- {
- GNUNET_break (GNUNET_OK ==
- GNUNET_NETWORK_socket_close (desc));
- desc = NULL;
- res = GNUNET_YES;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Testing IPv6 on this system: %s\n",
- (res == GNUNET_YES) ? "successful" : "failed");
- return res;
-}
-
-
-/**
- * Notify server about our external hostname
- *
- * @param cls plugin
- */
-static void
-server_notify_external_hostname (void *cls)
-{
- struct HTTP_Server_Plugin *plugin = cls;
- struct HttpAddress *ext_addr;
- size_t ext_addr_len;
- unsigned int urlen;
- char *url;
-
- plugin->notify_ext_task = NULL;
- GNUNET_asprintf (&url,
- "%s://%s",
- plugin->protocol,
- plugin->external_hostname);
- urlen = strlen (url) + 1;
- ext_addr = GNUNET_malloc (sizeof(struct HttpAddress) + urlen);
- ext_addr->options = htonl (plugin->options);
- ext_addr->urlen = htonl (urlen);
- ext_addr_len = sizeof(struct HttpAddress) + urlen;
- GNUNET_memcpy (&ext_addr[1], url, urlen);
- GNUNET_free (url);
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Notifying transport about external hostname address `%s'\n",
- plugin->external_hostname);
-
-#if BUILD_HTTPS
- if (GNUNET_YES == plugin->verify_external_hostname)
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Enabling SSL verification for external hostname address `%s'\n",
- plugin->external_hostname);
- plugin->ext_addr
- = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
- "https_client",
- ext_addr,
- ext_addr_len,
- GNUNET_HELLO_ADDRESS_INFO_NONE);
- plugin->env->notify_address (plugin->env->cls,
- GNUNET_YES,
- plugin->ext_addr);
- GNUNET_free (ext_addr);
-#else
- plugin->ext_addr
- = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
- "http_client",
- ext_addr,
- ext_addr_len,
- GNUNET_HELLO_ADDRESS_INFO_NONE);
- plugin->env->notify_address (plugin->env->cls,
- GNUNET_YES,
- plugin->ext_addr);
- GNUNET_free (ext_addr);
-#endif
-}
-
-
-/**
- * Configure the plugin
- *
- * @param plugin plugin handle
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
- */
-static int
-server_configure_plugin (struct HTTP_Server_Plugin *plugin)
-{
- unsigned long long port;
- unsigned long long max_connections;
- char *bind4_address = NULL;
- char *bind6_address = NULL;
- char *eh_tmp = NULL;
- int external_hostname_use_port;
-
- /* Use IPv4? */
- if (GNUNET_CONFIGURATION_have_value
- (plugin->env->cfg, plugin->name, "USE_IPv4"))
- {
- plugin->use_ipv4 =
- GNUNET_CONFIGURATION_get_value_yesno (plugin->env->cfg,
- plugin->name,
- "USE_IPv4");
- }
- else
- plugin->use_ipv4 = GNUNET_YES;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- _ ("IPv4 support is %s\n"),
- (plugin->use_ipv4 == GNUNET_YES) ? "enabled" : "disabled");
-
- /* Use IPv6? */
- if (GNUNET_CONFIGURATION_have_value
- (plugin->env->cfg, plugin->name, "USE_IPv6"))
- {
- plugin->use_ipv6 =
- GNUNET_CONFIGURATION_get_value_yesno (plugin->env->cfg,
- plugin->name,
- "USE_IPv6");
- }
- else
- plugin->use_ipv6 = GNUNET_YES;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- _ ("IPv6 support is %s\n"),
- (plugin->use_ipv6 == GNUNET_YES) ? "enabled" : "disabled");
-
- if ((plugin->use_ipv4 == GNUNET_NO) && (plugin->use_ipv6 == GNUNET_NO))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Neither IPv4 nor IPv6 are enabled! Fix in configuration\n"));
- return GNUNET_SYSERR;
- }
-
- /* Reading port number from config file */
- if ((GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_number (plugin->env->cfg,
- plugin->name,
- "PORT", &port)) || (port >
65535))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Port is required! Fix in configuration\n"));
- return GNUNET_SYSERR;
- }
- plugin->port = port;
-
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ ("Using port %u\n"), plugin->port);
-
- if ((plugin->use_ipv4 == GNUNET_YES) &&
- (GNUNET_YES ==
- GNUNET_CONFIGURATION_get_value_string (plugin->env->cfg,
- plugin->name,
- "BINDTO",
- &bind4_address)))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Binding %s plugin to specific IPv4 address: `%s'\n",
- plugin->protocol,
- bind4_address);
- plugin->server_addr_v4 = GNUNET_new (struct sockaddr_in);
- if (1 != inet_pton (AF_INET,
- bind4_address,
- &plugin->server_addr_v4->sin_addr))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Specific IPv4 address `%s' in configuration file is
invalid!\n"),
- bind4_address);
- GNUNET_free (bind4_address);
- GNUNET_free (plugin->server_addr_v4);
- plugin->server_addr_v4 = NULL;
- return GNUNET_SYSERR;
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Binding to IPv4 address %s\n",
- bind4_address);
- plugin->server_addr_v4->sin_family = AF_INET;
- plugin->server_addr_v4->sin_port = htons (plugin->port);
- }
- GNUNET_free (bind4_address);
- }
-
- if ((plugin->use_ipv6 == GNUNET_YES) &&
- (GNUNET_YES ==
- GNUNET_CONFIGURATION_get_value_string (plugin->env->cfg,
- plugin->name,
- "BINDTO6",
- &bind6_address)))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Binding %s plugin to specific IPv6 address: `%s'\n",
- plugin->protocol, bind6_address);
- plugin->server_addr_v6 = GNUNET_new (struct sockaddr_in6);
- if (1 !=
- inet_pton (AF_INET6,
- bind6_address,
- &plugin->server_addr_v6->sin6_addr))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Specific IPv6 address `%s' in configuration file is
invalid!\n"),
- bind6_address);
- GNUNET_free (bind6_address);
- GNUNET_free (plugin->server_addr_v6);
- plugin->server_addr_v6 = NULL;
- return GNUNET_SYSERR;
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Binding to IPv6 address %s\n",
- bind6_address);
- plugin->server_addr_v6->sin6_family = AF_INET6;
- plugin->server_addr_v6->sin6_port = htons (plugin->port);
- }
- GNUNET_free (bind6_address);
- }
-
- plugin->verify_external_hostname = GNUNET_NO;
-#if BUILD_HTTPS
- plugin->verify_external_hostname
- = GNUNET_CONFIGURATION_get_value_yesno (plugin->env->cfg,
- plugin->name,
- "VERIFY_EXTERNAL_HOSTNAME");
- if (GNUNET_SYSERR == plugin->verify_external_hostname)
- plugin->verify_external_hostname = GNUNET_NO;
- if (GNUNET_YES == plugin->verify_external_hostname)
- plugin->options |= HTTP_OPTIONS_VERIFY_CERTIFICATE;
-#endif
- external_hostname_use_port
- = GNUNET_CONFIGURATION_get_value_yesno (plugin->env->cfg,
- plugin->name,
- "EXTERNAL_HOSTNAME_USE_PORT");
- if (GNUNET_SYSERR == external_hostname_use_port)
- external_hostname_use_port = GNUNET_NO;
-
-
- if (GNUNET_YES ==
- GNUNET_CONFIGURATION_get_value_string (plugin->env->cfg,
- plugin->name,
- "EXTERNAL_HOSTNAME",
- &eh_tmp))
- {
- char *tmp;
- char *pos = NULL;
- char *pos_url = NULL;
-
- if (NULL != strstr (eh_tmp, "://"))
- tmp = &strstr (eh_tmp, "://")[3];
- else
- tmp = eh_tmp;
-
- if (GNUNET_YES == external_hostname_use_port)
- {
- if ((strlen (tmp) > 1) && (NULL != (pos = strchr (tmp, '/'))))
- {
- pos_url = pos + 1;
- pos[0] = '\0';
- GNUNET_asprintf (&plugin->external_hostname,
- "%s:%u/%s",
- tmp,
- (uint16_t) port,
- pos_url);
- }
- else
- GNUNET_asprintf (&plugin->external_hostname,
- "%s:%u",
- tmp,
- (uint16_t) port);
- }
- else
- plugin->external_hostname = GNUNET_strdup (tmp);
- GNUNET_free (eh_tmp);
-
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ ("Using external hostname `%s'\n"),
- plugin->external_hostname);
- plugin->notify_ext_task = GNUNET_SCHEDULER_add_now (
- &server_notify_external_hostname,
- plugin);
-
- /* Use only configured external hostname */
- if (GNUNET_CONFIGURATION_have_value
- (plugin->env->cfg,
- plugin->name,
- "EXTERNAL_HOSTNAME_ONLY"))
- {
- plugin->external_only =
- GNUNET_CONFIGURATION_get_value_yesno (plugin->env->cfg,
- plugin->name,
- "EXTERNAL_HOSTNAME_ONLY");
- }
- else
- plugin->external_only = GNUNET_NO;
-
- if (GNUNET_YES == plugin->external_only)
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- _ ("Notifying transport only about hostname `%s'\n"),
- plugin->external_hostname);
- }
- else
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "No external hostname configured\n");
-
- /* Optional parameters */
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_number (plugin->env->cfg,
- plugin->name,
- "MAX_CONNECTIONS",
- &max_connections))
- max_connections = 128;
- plugin->max_request = max_connections;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- _ ("Maximum number of connections is %u\n"),
- plugin->max_request);
-
- plugin->peer_id_length = strlen (GNUNET_i2s_full (plugin->env->my_identity));
-
- return GNUNET_OK;
-}
-
-
-/**
- * Exit point from the plugin.
- *
- * @param cls api
- * @return NULL
- */
-void *
-LIBGNUNET_PLUGIN_TRANSPORT_DONE (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
- struct HTTP_Server_Plugin *plugin = api->cls;
-
- if (NULL == api->cls)
- {
- /* Free for stub mode */
- GNUNET_free (api);
- return NULL;
- }
- plugin->in_shutdown = GNUNET_YES;
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ ("Shutting down plugin `%s'\n"),
- plugin->name);
-
- if (NULL != plugin->notify_ext_task)
- {
- GNUNET_SCHEDULER_cancel (plugin->notify_ext_task);
- plugin->notify_ext_task = NULL;
- }
-
- if (NULL != plugin->ext_addr)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Notifying transport to remove address `%s'\n",
- http_common_plugin_address_to_string (plugin->protocol,
- plugin->ext_addr->address,
-
plugin->ext_addr->address_length));
-#if BUILD_HTTPS
- plugin->env->notify_address (plugin->env->cls,
- GNUNET_NO,
- plugin->ext_addr);
-#else
- plugin->env->notify_address (plugin->env->cls,
- GNUNET_NO,
- plugin->ext_addr);
-#endif
- GNUNET_HELLO_address_free (plugin->ext_addr);
- plugin->ext_addr = NULL;
- }
-
- /* Stop to report addresses to transport service */
- server_stop_report_addresses (plugin);
- if (NULL != plugin->server_v4_task)
- {
- GNUNET_SCHEDULER_cancel (plugin->server_v4_task);
- plugin->server_v4_task = NULL;
- }
-
- if (NULL != plugin->server_v6_task)
- {
- GNUNET_SCHEDULER_cancel (plugin->server_v6_task);
- plugin->server_v6_task = NULL;
- }
-#if BUILD_HTTPS
- GNUNET_free (plugin->crypto_init);
- GNUNET_free (plugin->cert);
- GNUNET_free (plugin->key);
-#endif
- GNUNET_CONTAINER_multipeermap_iterate (plugin->sessions,
- &destroy_session_shutdown_cb,
- plugin);
- GNUNET_CONTAINER_multipeermap_destroy (plugin->sessions);
- plugin->sessions = NULL;
- if (NULL != plugin->server_v4)
- {
- MHD_stop_daemon (plugin->server_v4);
- plugin->server_v4 = NULL;
- }
- if (NULL != plugin->server_v6)
- {
- MHD_stop_daemon (plugin->server_v6);
- plugin->server_v6 = NULL;
- }
- /* Clean up */
- GNUNET_free (plugin->external_hostname);
- GNUNET_free (plugin->ext_addr);
- GNUNET_free (plugin->server_addr_v4);
- GNUNET_free (plugin->server_addr_v6);
- regfree (&plugin->url_regex);
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- _ ("Shutdown for plugin `%s' complete\n"),
- plugin->name);
-
- GNUNET_free (plugin);
- GNUNET_free (api);
- return NULL;
-}
-
-
-/**
- * Function called for a quick conversion of the binary address to
- * a numeric address. Note that the caller must not free the
- * address and that the next call to this function is allowed
- * to override the address again.
- *
- * @param cls unused
- * @param addr binary address
- * @param addrlen length of the address
- * @return string representing the same address
- */
-static const char *
-http_server_plugin_address_to_string (void *cls,
- const void *addr,
- size_t addrlen)
-{
- return http_common_plugin_address_to_string (PLUGIN_NAME,
- addr,
- addrlen);
-}
-
-
-/**
- * Function obtain the network type for a session
- *
- * @param cls closure (`struct HTTP_Server_Plugin *`)
- * @param session the session
- * @return the network type in HBO or #GNUNET_SYSERR
- */
-static enum GNUNET_NetworkType
-http_server_plugin_get_network (void *cls,
- struct GNUNET_ATS_Session *session)
-{
- return session->scope;
-}
-
-
-/**
- * Function obtain the network type for an address.
- *
- * @param cls closure (`struct Plugin *`)
- * @param address the address
- * @return the network type
- */
-static enum GNUNET_NetworkType
-http_server_plugin_get_network_for_address (void *cls,
- const struct
- GNUNET_HELLO_Address *address)
-{
- struct HTTP_Server_Plugin *plugin = cls;
-
- return http_common_get_network_for_address (plugin->env,
- address);
-}
-
-
-/**
- * Function that will be called whenever the transport service wants to
- * notify the plugin that the inbound quota changed and that the plugin
- * should update it's delay for the next receive value
- *
- * @param cls closure
- * @param peer which peer was the session for
- * @param session which session is being updated
- * @param delay new delay to use for receiving
- */
-static void
-http_server_plugin_update_inbound_delay (void *cls,
- const struct GNUNET_PeerIdentity
*peer,
- struct GNUNET_ATS_Session *session,
- struct GNUNET_TIME_Relative delay)
-{
- session->next_receive = GNUNET_TIME_relative_to_absolute (delay);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "New inbound delay %s\n",
- GNUNET_STRINGS_relative_time_to_string (delay,
- GNUNET_NO));
- if (NULL != session->recv_wakeup_task)
- {
- GNUNET_SCHEDULER_cancel (session->recv_wakeup_task);
- session->recv_wakeup_task
- = GNUNET_SCHEDULER_add_delayed (delay,
- &server_wake_up,
- session);
- }
-}
-
-
-/**
- * Return information about the given session to the
- * monitor callback.
- *
- * @param cls the `struct Plugin` with the monitor callback (`sic`)
- * @param peer peer we send information about
- * @param value our `struct GNUNET_ATS_Session` to send information about
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-send_session_info_iter (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *value)
-{
- struct HTTP_Server_Plugin *plugin = cls;
- struct GNUNET_ATS_Session *session = value;
-
- notify_session_monitor (plugin,
- session,
- GNUNET_TRANSPORT_SS_INIT);
- return GNUNET_OK;
-}
-
-
-/**
- * Begin monitoring sessions of a plugin. There can only
- * be one active monitor per plugin (i.e. if there are
- * multiple monitors, the transport service needs to
- * multiplex the generated events over all of them).
- *
- * @param cls closure of the plugin
- * @param sic callback to invoke, NULL to disable monitor;
- * plugin will being by iterating over all active
- * sessions immediately and then enter monitor mode
- * @param sic_cls closure for @a sic
- */
-static void
-http_server_plugin_setup_monitor (void *cls,
- GNUNET_TRANSPORT_SessionInfoCallback sic,
- void *sic_cls)
-{
- struct HTTP_Server_Plugin *plugin = cls;
-
- plugin->sic = sic;
- plugin->sic_cls = sic_cls;
- if (NULL != sic)
- {
- GNUNET_CONTAINER_multipeermap_iterate (plugin->sessions,
- &send_session_info_iter,
- plugin);
- /* signal end of first iteration */
- sic (sic_cls, NULL, NULL);
- }
-}
-
-
-/**
- * Entry point for the plugin.
- *
- * @param cls env
- * @return api
- */
-void *
-LIBGNUNET_PLUGIN_TRANSPORT_INIT (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginEnvironment *env = cls;
- struct GNUNET_TRANSPORT_PluginFunctions *api;
- struct HTTP_Server_Plugin *plugin;
-
- if (NULL == env->receive)
- {
- /* run in 'stub' mode (i.e. as part of gnunet-peerinfo), don't fully
- initialize the plugin or the API */
- api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
- api->cls = NULL;
- api->address_to_string = &http_server_plugin_address_to_string;
- api->string_to_address = &http_common_plugin_string_to_address;
- api->address_pretty_printer = &http_common_plugin_address_pretty_printer;
- return api;
- }
- plugin = GNUNET_new (struct HTTP_Server_Plugin);
- plugin->env = env;
- plugin->sessions = GNUNET_CONTAINER_multipeermap_create (128,
- GNUNET_YES);
-
- api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
- api->cls = plugin;
- api->send = &http_server_plugin_send;
- api->disconnect_peer = &http_server_plugin_disconnect_peer;
- api->disconnect_session = &http_server_plugin_disconnect_session;
- api->query_keepalive_factor = &http_server_query_keepalive_factor;
- api->check_address = &http_server_plugin_address_suggested;
- api->get_session = &http_server_plugin_get_session;
-
- api->address_to_string = &http_server_plugin_address_to_string;
- api->string_to_address = &http_common_plugin_string_to_address;
- api->address_pretty_printer = &http_common_plugin_address_pretty_printer;
- api->get_network = &http_server_plugin_get_network;
- api->get_network_for_address = &http_server_plugin_get_network_for_address;
- api->update_session_timeout = &http_server_plugin_update_session_timeout;
- api->update_inbound_delay = &http_server_plugin_update_inbound_delay;
- api->setup_monitor = &http_server_plugin_setup_monitor;
-#if BUILD_HTTPS
- plugin->name = "transport-https_server";
- plugin->protocol = "https";
-#else
- plugin->name = "transport-http_server";
- plugin->protocol = "http";
-#endif
-
- if (GNUNET_YES ==
- GNUNET_CONFIGURATION_get_value_yesno (env->cfg,
- plugin->name,
- "TCP_STEALTH"))
- {
-#ifdef TCP_STEALTH
- plugin->options |= HTTP_OPTIONS_TCP_STEALTH;
-#else
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("TCP_STEALTH not supported on this platform.\n"));
- LIBGNUNET_PLUGIN_TRANSPORT_DONE (api);
- return NULL;
-#endif
- }
-
- /* Compile URL regex */
- if (regcomp (&plugin->url_regex,
- URL_REGEX,
- REG_EXTENDED))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Unable to compile URL regex\n"));
- LIBGNUNET_PLUGIN_TRANSPORT_DONE (api);
- return NULL;
- }
-
- /* Configure plugin */
- if (GNUNET_SYSERR == server_configure_plugin (plugin))
- {
- LIBGNUNET_PLUGIN_TRANSPORT_DONE (api);
- return NULL;
- }
-
- /* Check IPv6 support */
- if (GNUNET_YES == plugin->use_ipv6)
- plugin->use_ipv6 = server_check_ipv6_support (plugin);
-
- /* Report addresses to transport service */
- if (GNUNET_NO == plugin->external_only)
- server_start_report_addresses (plugin);
-
- if (GNUNET_SYSERR == server_start (plugin))
- {
- LIBGNUNET_PLUGIN_TRANSPORT_DONE (api);
- return NULL;
- }
- return api;
-}
-
-
-/* end of plugin_transport_http_server.c */
diff --git a/src/transport/plugin_transport_smtp.c
b/src/transport/plugin_transport_smtp.c
deleted file mode 100644
index f3db4fc5a..000000000
--- a/src/transport/plugin_transport_smtp.c
+++ /dev/null
@@ -1,750 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2003-2013 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/plugin_transport_smtp.c
- * @brief Implementation of the SMTP transport service
- * @author Christian Grothoff
- * @author Renaldo Ferreira
- */
-
-#include "platform.h"
-#include "gnunet_util.h"
-#include "gnunet_constants.h"
-#include "gnunet_protocols.h"
-#include "gnunet_transport.h"
-#include "gnunet_stats_service.h"
-#include <libesmtp.h>
-#include <signal.h>
-
-
-/**
- * The default maximum size of each outbound SMTP message.
- */
-#define SMTP_MESSAGE_SIZE 65528
-
-#define DEBUG_SMTP GNUNET_EXTRA_LOGGING
-
-#define FILTER_STRING_SIZE 64
-
-/* how long can a line in base64 encoded
- mime text be? (in characters, excluding "\n") */
-#define MAX_CHAR_PER_LINE 76
-
-#define EBUF_LEN 128
-
-/**
- * Host-Address in a SMTP network.
- */
-typedef struct
-{
- /**
- * Filter line that every sender must include in the E-mails such
- * that the receiver can effectively filter out the GNUnet traffic
- * from the E-mail.
- */
- char filter[FILTER_STRING_SIZE];
-
- /**
- * Claimed E-mail address of the sender.
- * Format is "foo@bar.com" with null termination, padded to be
- * of a multiple of 8 bytes long.
- */
- char senderAddress[0];
-} EmailAddress;
-
-GNUNET_NETWORK_STRUCT_BEGIN
-
-/**
- * Encapsulation of a GNUnet message in the SMTP mail body (before
- * base64 encoding).
- */
-typedef struct
-{
- GNUNET_MessageHeader header;
-
- /**
- * What is the identity of the sender (GNUNET_hash of public key)
- */
- GNUNET_PeerIdentity sender;
-} SMTPMessage;
-GNUNET_NETWORK_STRUCT_END
-
-/* *********** globals ************* */
-
-/**
- * apis (our advertised API and the core api )
- */
-static GNUNET_CoreAPIForTransport *core_api;
-
-static struct GNUNET_GE_Context *ectx;
-
-/**
- * Thread that listens for inbound messages
- */
-static struct GNUNET_ThreadHandle *dispatchThread;
-
-/**
- * Flag to indicate that server has been shut down.
- */
-static int smtp_shutdown = GNUNET_YES;
-
-/**
- * Set to the SMTP server hostname (and port) for outgoing messages.
- */
-static char *smtp_server_name;
-
-static char *pipename;
-
-/**
- * Lock for uses of libesmtp (not thread-safe).
- */
-static struct GNUNET_Mutex *lock;
-
-/**
- * Old handler for SIGPIPE (kept to be able to restore).
- */
-static struct sigaction old_handler;
-
-static char *email;
-
-static GNUNET_TransportAPI smtpAPI;
-
-static GNUNET_Stats_ServiceAPI *stats;
-
-static int stat_bytesReceived;
-
-static int stat_bytesSent;
-
-static int stat_bytesDropped;
-
-/**
- * How many e-mails are we allowed to send per hour?
- */
-static unsigned long long rate_limit;
-
-static GNUNET_CronTime last_transmission;
-
-
-/* ********************* the real stuff ******************* */
-
-#define strAUTOncmp(a, b) strncmp (a, b, strlen (b))
-
-/**
- * Listen to the pipe, decode messages and send to core.
- */
-static void *
-listenAndDistribute (void *unused)
-{
- char *line;
- unsigned int linesize;
- SMTPMessage *mp;
- FILE *fdes;
- char *retl;
- char *out;
- unsigned int size;
- GNUNET_TransportPacket *coreMP;
- int fd;
- unsigned int pos;
-
- linesize = ((GNUNET_MAX_BUFFER_SIZE * 4 / 3) + 8) * (MAX_CHAR_PER_LINE + 2)
- / MAX_CHAR_PER_LINE;
/* maximum size of a line supported */
- line = GNUNET_malloc (linesize + 2); /* 2 bytes for off-by-one errors,
just to be safe... */
-
-#define READLINE(l, limit) \
- do { retl = fgets (l, (limit), fdes); \
- if ((retl == NULL) || (smtp_shutdown == GNUNET_YES)) { \
- goto END; \
- } \
- if (core_api->load_monitor != NULL) \
- GNUNET_network_monitor_notify_transmission (core_api->load_monitor, \
- GNUNET_ND_DOWNLOAD, \
- strlen (retl)); \
- } while (0)
-
-
- while (smtp_shutdown == GNUNET_NO)
- {
- fd = OPEN (pipename, O_RDONLY | O_ASYNC);
- if (fd == -1)
- {
- if (smtp_shutdown == GNUNET_NO)
- GNUNET_thread_sleep (5 * GNUNET_CRON_SECONDS);
- continue;
- }
- fdes = fdopen (fd, "r");
- while (smtp_shutdown == GNUNET_NO)
- {
- /* skip until end of header */
- do
- {
- READLINE (line, linesize);
- }
- while ((line[0] != '\r') && (line[0] != '\n')); /* expect newline */
- READLINE (line, linesize); /* read base64 encoded message;
decode, process */
- pos = 0;
- while (1)
- {
- pos = strlen (line) - 1; /* ignore new line */
- READLINE (&line[pos], linesize - pos); /* read base64 encoded
message; decode, process */
- if ((line[pos] == '\r') || (line[pos] == '\n'))
- break; /* empty line => end of message! */
- }
- size = GNUNET_STRINGS_base64_decode (line, pos, &out);
- if (size < sizeof(SMTPMessage))
- {
- GNUNET_GE_BREAK (ectx, 0);
- GNUNET_free (out);
- goto END;
- }
-
- mp = (SMTPMessage *) &out[size - sizeof(SMTPMessage)];
- if (ntohs (mp->header.size) != size)
- {
- GNUNET_GE_LOG (ectx,
- GNUNET_GE_WARNING | GNUNET_GE_BULK | GNUNET_GE_USER,
- _ ("Received malformed message via %s. Ignored.\n"),
- "SMTP");
-#if DEBUG_SMTP
- GNUNET_GE_LOG (ectx,
- GNUNET_GE_DEBUG | GNUNET_GE_REQUEST | GNUNET_GE_USER,
- "Size returned by base64=%d, in the msg=%d.\n", size,
- ntohl (mp->size));
-#endif
- GNUNET_free (out);
- goto END;
- }
- if (stats != NULL)
- stats->change (stat_bytesReceived, size);
- coreMP = GNUNET_new (GNUNET_TransportPacket);
- coreMP->msg = out;
- coreMP->size = size - sizeof(SMTPMessage);
- coreMP->tsession = NULL;
- coreMP->sender = mp->sender;
-#if DEBUG_SMTP
- GNUNET_GE_LOG (ectx, GNUNET_GE_DEBUG | GNUNET_GE_REQUEST |
GNUNET_GE_USER,
- "SMTP message passed to the core.\n");
-#endif
-
- core_api->receive (coreMP);
- }
-END:
-#if DEBUG_SMTP
- GNUNET_GE_LOG (ectx, GNUNET_GE_DEBUG | GNUNET_GE_REQUEST | GNUNET_GE_USER,
- "SMTP message processed.\n");
-#endif
- if (fdes != NULL)
- fclose (fdes);
- }
- GNUNET_free (line);
- return NULL;
-}
-
-
-/* *************** API implementation *************** */
-
-/**
- * Verify that a hello-Message is correct (a node is reachable at that
- * address). Since the reply will be asynchronous, a method must be
- * called on success.
- *
- * @param hello the hello message to verify
- * (the signature/crc have been verified before)
- * @return GNUNET_OK on success, GNUNET_SYSERR on error
- */
-static int
-api_verify_hello (const GNUNET_MessageHello *hello)
-{
- const EmailAddress *maddr;
-
- maddr = (const EmailAddress *) &hello[1];
- if ((ntohs (hello->header.size) !=
- sizeof(GNUNET_MessageHello) + ntohs (hello->senderAddressSize)) ||
- (maddr->senderAddress
- [ntohs (hello->senderAddressSize) - 1 - FILTER_STRING_SIZE] != '\0'))
- {
- GNUNET_GE_BREAK (ectx, 0);
- return GNUNET_SYSERR; /* obviously invalid */
- }
- if (NULL == strstr (maddr->filter, ": "))
- return GNUNET_SYSERR;
- return GNUNET_OK;
-}
-
-
-/**
- * Create a hello-Message for the current node. The hello is created
- * without signature and without a timestamp. The GNUnet core will
- * GNUNET_RSA_sign the message and add an expiration time.
- *
- * @return hello on success, NULL on error
- */
-static GNUNET_MessageHello *
-api_create_hello ()
-{
- GNUNET_MessageHello *msg;
- char *filter;
- EmailAddress *haddr;
- int i;
-
- GNUNET_GC_get_configuration_value_string (core_api->cfg, "SMTP", "FILTER",
- "X-mailer: GNUnet", &filter);
- if (NULL == strstr (filter, ": "))
- {
- GNUNET_GE_LOG (ectx, GNUNET_GE_WARNING | GNUNET_GE_BULK | GNUNET_GE_USER,
- _ ("SMTP filter string to invalid, lacks ': '\n"));
- GNUNET_free (filter);
- return NULL;
- }
-
- if (strlen (filter) > FILTER_STRING_SIZE)
- {
- filter[FILTER_STRING_SIZE] = '\0';
- GNUNET_GE_LOG (ectx, GNUNET_GE_WARNING | GNUNET_GE_BULK | GNUNET_GE_USER,
- _ ("SMTP filter string to long, capped to `%s'\n"), filter);
- }
- i = (strlen (email) + 8) & (~7); /* make multiple of 8 */
- msg =
- GNUNET_malloc (sizeof(GNUNET_MessageHello) + sizeof(EmailAddress) + i);
- memset (msg, 0, sizeof(GNUNET_MessageHello) + sizeof(EmailAddress) + i);
- haddr = (EmailAddress *) &msg[1];
- memset (&haddr->filter[0], 0, FILTER_STRING_SIZE);
- strcpy (&haddr->filter[0], filter);
- GNUNET_memcpy (&haddr->senderAddress[0], email, strlen (email) + 1);
- msg->senderAddressSize = htons (strlen (email) + 1 + sizeof(EmailAddress));
- msg->protocol = htons (GNUNET_TRANSPORT_PROTOCOL_NUMBER_SMTP);
- msg->MTU = htonl (smtpAPI.mtu);
- msg->header.size = htons (GNUNET_sizeof_hello (msg));
- if (api_verify_hello (msg) == GNUNET_SYSERR)
- GNUNET_GE_ASSERT (ectx, 0);
- GNUNET_free (filter);
- return msg;
-}
-
-
-struct GetMessageClosure
-{
- unsigned int esize;
- unsigned int pos;
- char *ebody;
-};
-
-static const char *
-get_message (void **buf, int *len, void *cls)
-{
- struct GetMessageClosure *gmc = cls;
-
- *buf = NULL;
- if (len == NULL)
- {
- gmc->pos = 0;
- return NULL;
- }
- if (gmc->pos == gmc->esize)
- return NULL; /* done */
- *len = gmc->esize;
- gmc->pos = gmc->esize;
- return gmc->ebody;
-}
-
-
-/**
- * Send a message to the specified remote node.
- *
- * @param tsession the GNUNET_MessageHello identifying the remote node
- * @param msg what to send
- * @param size the size of the message
- * @param important is this message important enough to override typical
limits?
- * @return GNUNET_SYSERR on error, GNUNET_OK on success
- */
-static int
-api_send (GNUNET_TSession *tsession, const void *msg, const unsigned int size,
- int important)
-{
- const GNUNET_MessageHello *hello;
- const EmailAddress *haddr;
- char *m;
- char *filter;
- char *fvalue;
- SMTPMessage *mp;
- struct GetMessageClosure gm_cls;
- smtp_session_t session;
- smtp_message_t message;
- smtp_recipient_t recipient;
-
-#define EBUF_LEN 128
- char ebuf[EBUF_LEN];
- GNUNET_CronTime now;
-
- if (smtp_shutdown == GNUNET_YES)
- return GNUNET_SYSERR;
- if ((size == 0) || (size > smtpAPI.mtu))
- {
- GNUNET_GE_BREAK (ectx, 0);
- return GNUNET_SYSERR;
- }
- now = GNUNET_get_time ();
- if ((important != GNUNET_YES) &&
- ( ((now - last_transmission) * rate_limit) < GNUNET_CRON_HOURS) )
- return GNUNET_NO; /* rate too high */
- last_transmission = now;
-
- hello = (const GNUNET_MessageHello *) tsession->internal;
- if (hello == NULL)
- return GNUNET_SYSERR;
- GNUNET_mutex_lock (lock);
- session = smtp_create_session ();
- if (session == NULL)
- {
- GNUNET_GE_LOG (ectx,
- GNUNET_GE_ERROR | GNUNET_GE_ADMIN | GNUNET_GE_USER
- | GNUNET_GE_IMMEDIATE, _ ("SMTP: `%s' failed: %s.\n"),
- "smtp_create_session", smtp_strerror (smtp_errno (), ebuf,
- EBUF_LEN));
- GNUNET_mutex_unlock (lock);
- return GNUNET_SYSERR;
- }
- if (0 == smtp_set_server (session, smtp_server_name))
- {
- GNUNET_GE_LOG (ectx,
- GNUNET_GE_ERROR | GNUNET_GE_ADMIN | GNUNET_GE_USER
- | GNUNET_GE_IMMEDIATE, _ ("SMTP: `%s' failed: %s.\n"),
- "smtp_set_server", smtp_strerror (smtp_errno (), ebuf,
- EBUF_LEN));
- smtp_destroy_session (session);
- GNUNET_mutex_unlock (lock);
- return GNUNET_SYSERR;
- }
- haddr = (const EmailAddress *) &hello[1];
- message = smtp_add_message (session);
- if (message == NULL)
- {
- GNUNET_GE_LOG (ectx,
- GNUNET_GE_WARNING | GNUNET_GE_ADMIN | GNUNET_GE_USER
- | GNUNET_GE_BULK, _ ("SMTP: `%s' failed: %s.\n"),
- "smtp_add_message", smtp_strerror (smtp_errno (), ebuf,
- EBUF_LEN));
- smtp_destroy_session (session);
- GNUNET_mutex_unlock (lock);
- return GNUNET_SYSERR;
- }
- smtp_set_header (message, "To", NULL, haddr->senderAddress);
- smtp_set_header (message, "From", NULL, email);
-
- filter = GNUNET_strdup (haddr->filter);
- fvalue = strstr (filter, ": ");
- GNUNET_GE_ASSERT (NULL, NULL != fvalue);
- fvalue[0] = '\0';
- fvalue += 2;
- if (0 == smtp_set_header (message, filter, fvalue))
- {
- GNUNET_GE_LOG (ectx,
- GNUNET_GE_WARNING | GNUNET_GE_ADMIN | GNUNET_GE_USER
- | GNUNET_GE_BULK, _ ("SMTP: `%s' failed: %s.\n"),
- "smtp_set_header", smtp_strerror (smtp_errno (), ebuf,
- EBUF_LEN));
- smtp_destroy_session (session);
- GNUNET_mutex_unlock (lock);
- GNUNET_free (filter);
- return GNUNET_SYSERR;
- }
- GNUNET_free (filter);
- m = GNUNET_malloc (size + sizeof(SMTPMessage));
- GNUNET_memcpy (m, msg, size);
- mp = (SMTPMessage *) &m[size];
- mp->header.size = htons (size + sizeof(SMTPMessage));
- mp->header.type = htons (0);
- mp->sender = *core_api->my_identity;
- gm_cls.ebody = NULL;
- gm_cls.pos = 0;
- gm_cls.esize = GNUNET_STRINGS_base64_encode (m, size + sizeof(SMTPMessage),
- &gm_cls.ebody);
- GNUNET_free (m);
- if (0 == smtp_size_set_estimate (message, gm_cls.esize))
- {
- GNUNET_GE_LOG (ectx,
- GNUNET_GE_WARNING | GNUNET_GE_ADMIN | GNUNET_GE_USER
- | GNUNET_GE_BULK, _ ("SMTP: `%s' failed: %s.\n"),
- "smtp_size_set_estimate", smtp_strerror (smtp_errno (),
ebuf,
- EBUF_LEN));
- }
- if (0 == smtp_set_messagecb (message, &get_message, &gm_cls))
- {
- GNUNET_GE_LOG (ectx,
- GNUNET_GE_WARNING | GNUNET_GE_ADMIN | GNUNET_GE_USER
- | GNUNET_GE_BULK, _ ("SMTP: `%s' failed: %s.\n"),
- "smtp_set_messagecb", smtp_strerror (smtp_errno (), ebuf,
- EBUF_LEN));
- smtp_destroy_session (session);
- GNUNET_mutex_unlock (lock);
- GNUNET_free (gm_cls.ebody);
- return GNUNET_SYSERR;
- }
- recipient = smtp_add_recipient (message, haddr->senderAddress);
- if (recipient == NULL)
- {
- GNUNET_GE_LOG (ectx,
- GNUNET_GE_WARNING | GNUNET_GE_ADMIN | GNUNET_GE_USER
- | GNUNET_GE_BULK, _ ("SMTP: `%s' failed: %s.\n"),
- "smtp_add_recipient", smtp_strerror (smtp_errno (), ebuf,
- EBUF_LEN));
- smtp_destroy_session (session);
- GNUNET_mutex_unlock (lock);
- return GNUNET_SYSERR;
- }
- if (0 == smtp_start_session (session))
- {
- GNUNET_GE_LOG (ectx,
- GNUNET_GE_WARNING | GNUNET_GE_ADMIN | GNUNET_GE_USER
- | GNUNET_GE_BULK, _ ("SMTP: `%s' failed: %s.\n"),
- "smtp_start_session", smtp_strerror (smtp_errno (), ebuf,
- EBUF_LEN));
- smtp_destroy_session (session);
- GNUNET_mutex_unlock (lock);
- GNUNET_free (gm_cls.ebody);
- return GNUNET_SYSERR;
- }
- if (stats != NULL)
- stats->change (stat_bytesSent, size);
- if (core_api->load_monitor != NULL)
- GNUNET_network_monitor_notify_transmission (core_api->load_monitor,
- GNUNET_ND_UPLOAD,
gm_cls.esize);
- smtp_message_reset_status (message); /* this is needed to plug a
28-byte/message memory leak in libesmtp */
- smtp_destroy_session (session);
- GNUNET_mutex_unlock (lock);
- GNUNET_free (gm_cls.ebody);
- return GNUNET_OK;
-}
-
-
-/**
- * Establish a connection to a remote node.
- * @param hello the hello-Message for the target node
- * @param tsessionPtr the session handle that is to be set
- * @param may_reuse can we re-use an existing connection?
- * @return GNUNET_OK on success, GNUNET_SYSERR if the operation failed
- */
-static int
-api_connect (const GNUNET_MessageHello *hello, GNUNET_TSession **tsessionPtr,
- int may_reuse)
-{
- GNUNET_TSession *tsession;
-
- tsession = GNUNET_new (GNUNET_TSession);
- tsession->internal = GNUNET_malloc (GNUNET_sizeof_hello (hello));
- tsession->peer = hello->senderIdentity;
- GNUNET_memcpy (tsession->internal, hello, GNUNET_sizeof_hello (hello));
- tsession->ttype = smtpAPI.protocol_number;
- (*tsessionPtr) = tsession;
- return GNUNET_OK;
-}
-
-
-/**
- * Disconnect from a remote node.
- *
- * @param tsession the session that is closed
- * @return GNUNET_OK on success, GNUNET_SYSERR if the operation failed
- */
-static int
-api_disconnect (GNUNET_TSession *tsession)
-{
- if (tsession != NULL)
- {
- if (tsession->internal != NULL)
- GNUNET_free (tsession->internal);
- GNUNET_free (tsession);
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Start the server process to receive inbound traffic.
- * @return GNUNET_OK on success, GNUNET_SYSERR if the operation failed
- */
-static int
-api_start_transport_server ()
-{
- smtp_shutdown = GNUNET_NO;
- /* initialize SMTP network */
- dispatchThread = GNUNET_thread_create (&listenAndDistribute, NULL, 1024 * 4);
- if (dispatchThread == NULL)
- {
- GNUNET_GE_DIE_STRERROR (ectx,
- GNUNET_GE_ADMIN | GNUNET_GE_BULK | GNUNET_GE_FATAL,
- "pthread_create");
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Shutdown the server process (stop receiving inbound traffic). Maybe
- * restarted later!
- */
-static int
-api_stop_transport_server ()
-{
- void *unused;
-
- smtp_shutdown = GNUNET_YES;
- GNUNET_thread_stop_sleep (dispatchThread);
- GNUNET_thread_join (dispatchThread, &unused);
- return GNUNET_OK;
-}
-
-
-/**
- * Convert SMTP hello to an IP address (always fails).
- */
-static int
-api_hello_to_address (const GNUNET_MessageHello *hello, void **sa,
- unsigned int *sa_len)
-{
- return GNUNET_SYSERR;
-}
-
-
-/**
- * Always fails.
- */
-static int
-api_associate (GNUNET_TSession *tsession)
-{
- return GNUNET_SYSERR; /* SMTP connections can never be associated */
-}
-
-
-/**
- * Always succeeds (for now; we should look at adding
- * frequency limits to SMTP in the future!).
- */
-static int
-api_test_would_try (GNUNET_TSession *tsession, unsigned int size,
- int important)
-{
- return GNUNET_OK; /* we always try... */
-}
-
-
-/**
- * The exported method. Makes the core api available via a global and
- * returns the smtp transport API.
- */
-GNUNET_TransportAPI *
-inittransport_smtp (struct GNUNET_CoreAPIForTransport *core)
-{
- unsigned long long mtu;
- struct sigaction sa;
-
- core_api = core;
- ectx = core->ectx;
- if (! GNUNET_GC_have_configuration_value (core_api->cfg, "SMTP", "EMAIL"))
- {
- GNUNET_GE_LOG (ectx, GNUNET_GE_ERROR | GNUNET_GE_BULK | GNUNET_GE_USER,
- _
- (
- "No email-address specified, can not start SMTP
transport.\n"));
- return NULL;
- }
- GNUNET_GC_get_configuration_value_number (core_api->cfg, "SMTP", "MTU", 1200,
- SMTP_MESSAGE_SIZE,
- SMTP_MESSAGE_SIZE, &mtu);
- GNUNET_GC_get_configuration_value_number (core_api->cfg, "SMTP", "RATELIMIT",
- 0, 0, 1024 * 1024, &rate_limit);
- stats = core_api->service_request ("stats");
- if (stats != NULL)
- {
- stat_bytesReceived =
- stats->create (gettext_noop ("# bytes received via SMTP"));
- stat_bytesSent = stats->create (gettext_noop ("# bytes sent via SMTP"));
- stat_bytesDropped =
- stats->create (gettext_noop ("# bytes dropped by SMTP (outgoing)"));
- }
- GNUNET_GC_get_configuration_value_filename (core_api->cfg, "SMTP", "PIPE",
- &pipename);
- unlink (pipename);
- if (0 != mkfifo (pipename, S_IWUSR | S_IRUSR | S_IWGRP | S_IWOTH))
- {
- GNUNET_GE_LOG_STRERROR (ectx,
- GNUNET_GE_ADMIN | GNUNET_GE_BULK | GNUNET_GE_FATAL,
- "mkfifo");
- GNUNET_free (pipename);
- core_api->service_release (stats);
- stats = NULL;
- return NULL;
- }
- /* we need to allow the mailer program to send us messages;
- * easiest done by giving it write permissions (see Mantis #1142) */
- if (0 != chmod (pipename, S_IWUSR | S_IRUSR | S_IWGRP | S_IWOTH))
- GNUNET_GE_LOG_STRERROR (ectx,
- GNUNET_GE_ADMIN | GNUNET_GE_BULK
- | GNUNET_GE_WARNING, "chmod");
- GNUNET_GC_get_configuration_value_string (core_api->cfg, "SMTP", "EMAIL",
- NULL,
- &email);
- lock = GNUNET_mutex_create (GNUNET_NO);
- GNUNET_GC_get_configuration_value_string (core_api->cfg, "SMTP", "SERVER",
- "localhost:25", &smtp_server_name);
- sa.sa_handler = SIG_IGN;
- sigemptyset (&sa.sa_mask);
- sa.sa_flags = 0;
- sigaction (SIGPIPE, &sa, &old_handler);
-
- smtpAPI.protocol_number = GNUNET_TRANSPORT_PROTOCOL_NUMBER_SMTP;
- smtpAPI.mtu = mtu - sizeof(SMTPMessage);
- smtpAPI.cost = 50;
- smtpAPI.hello_verify = &api_verify_hello;
- smtpAPI.hello_create = &api_create_hello;
- smtpAPI.connect = &api_connect;
- smtpAPI.send = &api_send;
- smtpAPI.associate = &api_associate;
- smtpAPI.disconnect = &api_disconnect;
- smtpAPI.server_start = &api_start_transport_server;
- smtpAPI.server_stop = &api_stop_transport_server;
- smtpAPI.hello_to_address = &api_hello_to_address;
- smtpAPI.send_now_test = &api_test_would_try;
- return &smtpAPI;
-}
-
-
-void
-donetransport_smtp ()
-{
- sigaction (SIGPIPE, &old_handler, NULL);
- GNUNET_free (smtp_server_name);
- if (stats != NULL)
- {
- core_api->service_release (stats);
- stats = NULL;
- }
- GNUNET_mutex_destroy (lock);
- lock = NULL;
- unlink (pipename);
- GNUNET_free (pipename);
- pipename = NULL;
- GNUNET_free (email);
- email = NULL;
-}
-
-
-/* end of smtp.c */
diff --git a/src/transport/plugin_transport_tcp.c
b/src/transport/plugin_transport_tcp.c
deleted file mode 100644
index e359185b6..000000000
--- a/src/transport/plugin_transport_tcp.c
+++ /dev/null
@@ -1,3967 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2002--2015 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/plugin_transport_tcp.c
- * @brief Implementation of the TCP transport service
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_constants.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_nat_service.h"
-#include "gnunet_protocols.h"
-#include "gnunet_resolver_service.h"
-#include "gnunet_signatures.h"
-#include "gnunet_statistics_service.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_transport_plugin.h"
-#include "transport.h"
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "transport-tcp", __VA_ARGS__)
-
-#define PLUGIN_NAME "tcp"
-
-/**
- * How long until we give up on establishing an NAT connection?
- * Must be > 4 RTT
- */
-#define NAT_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
10)
-
-/**
- * Opaque handle that can be used to cancel
- * a transmit-ready notification.
- */
-struct GNUNET_CONNECTION_TransmitHandle;
-
-/**
- * @brief handle for a server
- */
-struct GNUNET_SERVER_Handle;
-
-/**
- * @brief opaque handle for a client of the server
- */
-struct GNUNET_SERVER_Client;
-
-/**
- * @brief opaque handle server returns for aborting transmission to a client.
- */
-struct GNUNET_SERVER_TransmitHandle;
-
-/**
- * @brief handle for a network connection
- */
-struct GNUNET_CONNECTION_Handle;
-
-/**
- * @brief handle for a network service
- */
-struct LEGACY_SERVICE_Context;
-
-
-/**
- * Stops a service that was started with #GNUNET_SERVICE_start().
- *
- * @param srv service to stop
- */
-void
-LEGACY_SERVICE_stop (struct LEGACY_SERVICE_Context *srv);
-
-
-/**
- * Function called to notify a client about the connection begin ready
- * to queue more data. @a buf will be NULL and @a size zero if the
- * connection was closed for writing in the meantime.
- *
- * @param cls closure
- * @param size number of bytes available in @a buf
- * @param buf where the callee should write the message
- * @return number of bytes written to @a buf
- */
-typedef size_t (*GNUNET_CONNECTION_TransmitReadyNotify) (void *cls,
- size_t size,
- void *buf);
-
-/**
- * Credentials for UNIX domain sockets.
- */
-struct GNUNET_CONNECTION_Credentials
-{
- /**
- * UID of the other end of the connection.
- */
- uid_t uid;
-
- /**
- * GID of the other end of the connection.
- */
- gid_t gid;
-};
-
-
-/**
- * Functions with this signature are called whenever a client
- * is disconnected on the network level.
- *
- * @param cls closure
- * @param client identification of the client; NULL
- * for the last call when the server is destroyed
- */
-typedef void (*GNUNET_SERVER_DisconnectCallback) (
- void *cls,
- struct GNUNET_SERVER_Client *client);
-
-
-/**
- * Functions with this signature are called whenever a client
- * is connected on the network level.
- *
- * @param cls closure
- * @param client identification of the client
- */
-typedef void (*GNUNET_SERVER_ConnectCallback) (
- void *cls,
- struct GNUNET_SERVER_Client *client);
-
-
-/**
- * Function to call for access control checks.
- *
- * @param cls closure
- * @param ucred credentials, if available, otherwise NULL
- * @param addr address
- * @param addrlen length of address
- * @return GNUNET_YES to allow, GNUNET_NO to deny, GNUNET_SYSERR
- * for unknown address family (will be denied).
- */
-typedef int (*GNUNET_CONNECTION_AccessCheck) (
- void *cls,
- const struct GNUNET_CONNECTION_Credentials *ucred,
- const struct sockaddr *addr,
- socklen_t addrlen);
-
-/**
- * Callback function for data received from the network. Note that
- * both "available" and "err" would be 0 if the read simply timed out.
- *
- * @param cls closure
- * @param buf pointer to received data
- * @param available number of bytes available in "buf",
- * possibly 0 (on errors)
- * @param addr address of the sender
- * @param addrlen size of addr
- * @param errCode value of errno (on errors receiving)
- */
-typedef void (*GNUNET_CONNECTION_Receiver) (void *cls,
- const void *buf,
- size_t available,
- const struct sockaddr *addr,
- socklen_t addrlen,
- int errCode);
-
-
-/**
- * Close the connection and free associated resources. There must
- * not be any pending requests for reading or writing to the
- * connection at this time.
- *
- * @param connection connection to destroy
- */
-void
-GNUNET_CONNECTION_destroy (struct GNUNET_CONNECTION_Handle *connection);
-
-
-/**
- * Signature of a function to create a custom tokenizer.
- *
- * @param cls closure from #GNUNET_SERVER_set_callbacks
- * @param client handle to client the tokenzier will be used for
- * @return handle to custom tokenizer ('mst')
- */
-typedef void *(*GNUNET_SERVER_MstCreateCallback) (
- void *cls,
- struct GNUNET_SERVER_Client *client);
-
-
-/**
- * Signature of a function to destroy a custom tokenizer.
- *
- * @param cls closure from #GNUNET_SERVER_set_callbacks
- * @param mst custom tokenizer handle
- */
-typedef void (*GNUNET_SERVER_MstDestroyCallback) (void *cls, void *mst);
-
-/**
- * Signature of a function to receive data for a custom tokenizer.
- *
- * @param cls closure from #GNUNET_SERVER_set_callbacks
- * @param mst custom tokenizer handle
- * @param client_identity ID of client for which this is a buffer,
- * can be NULL (will be passed back to 'cb')
- * @param buf input data to add
- * @param size number of bytes in @a buf
- * @param purge should any excess bytes in the buffer be discarded
- * (i.e. for packet-based services like UDP)
- * @param one_shot only call callback once, keep rest of message in buffer
- * @return #GNUNET_OK if we are done processing (need more data)
- * #GNUNET_NO if one_shot was set and we have another message ready
- * #GNUNET_SYSERR if the data stream is corrupt
- */
-typedef int (*GNUNET_SERVER_MstReceiveCallback) (
- void *cls,
- void *mst,
- struct GNUNET_SERVER_Client *client,
- const char *buf,
- size_t size,
- int purge,
- int one_shot);
-/**
- * Functions with this signature are called whenever a message is
- * received.
- *
- * @param cls closure
- * @param client identification of the client
- * @param message the actual message
- */
-typedef void (*GNUNET_SERVER_MessageCallback) (
- void *cls,
- struct GNUNET_SERVER_Client *client,
- const struct GNUNET_MessageHeader *message);
-
-/**
- * Message handler. Each struct specifies how to handle on particular
- * type of message received.
- */
-struct GNUNET_SERVER_MessageHandler
-{
- /**
- * Function to call for messages of "type".
- */
- GNUNET_SERVER_MessageCallback callback;
-
- /**
- * Closure argument for @e callback.
- */
- void *callback_cls;
-
- /**
- * Type of the message this handler covers.
- */
- uint16_t type;
-
- /**
- * Expected size of messages of this type. Use 0 for
- * variable-size. If non-zero, messages of the given
- * type will be discarded (and the connection closed)
- * if they do not have the right size.
- */
- uint16_t expected_size;
-};
-
-
-/**
- * Options for the service (bitmask).
- */
-enum LEGACY_SERVICE_Options
-{
- /**
- * Use defaults. Terminates all client connections and the listen
- * sockets immediately upon receiving the shutdown signal.
- */
- LEGACY_SERVICE_OPTION_NONE = 0,
-
- /**
- * Do not trigger server shutdown on signal at all; instead, allow
- * for the user to terminate the server explicitly when needed
- * by calling #LEGACY_SERVICE_shutdown().
- */
- LEGACY_SERVICE_OPTION_MANUAL_SHUTDOWN = 1,
-
- /**
- * Trigger a SOFT server shutdown on signals, allowing active
- * non-monitor clients to complete their transactions.
- */
- LEGACY_SERVICE_OPTION_SOFT_SHUTDOWN = 2
-};
-
-
-/**
- * Ask the server to disconnect from the given client. This is the
- * same as passing #GNUNET_SYSERR to #GNUNET_SERVER_receive_done,
- * except that it allows dropping of a client even when not handling a
- * message from that client.
- *
- * @param client the client to disconnect from
- */
-void
-GNUNET_SERVER_client_disconnect (struct GNUNET_SERVER_Client *client);
-
-/**
- * Return user context associated with the given client.
- * Note: you should probably use the macro (call without the underscore).
- *
- * @param client client to query
- * @param size number of bytes in user context struct (for verification only)
- * @return pointer to user context
- */
-void *
-GNUNET_SERVER_client_get_user_context_ (struct GNUNET_SERVER_Client *client,
- size_t size);
-
-
-/**
- * Functions with this signature are called whenever a
- * complete message is received by the tokenizer.
- *
- * Do not call #GNUNET_SERVER_mst_destroy from within
- * the scope of this callback.
- *
- * @param cls closure
- * @param client identification of the client
- * @param message the actual message
- * @return #GNUNET_OK on success, #GNUNET_SYSERR to stop further processing
- */
-typedef int (*GNUNET_SERVER_MessageTokenizerCallback) (
- void *cls,
- void *client,
- const struct GNUNET_MessageHeader *message);
-
-
-/**
- * Create a message stream tokenizer.
- *
- * @param cb function to call on completed messages
- * @param cb_cls closure for @a cb
- * @return handle to tokenizer
- */
-struct GNUNET_SERVER_MessageStreamTokenizer *
-GNUNET_SERVER_mst_create (GNUNET_SERVER_MessageTokenizerCallback cb,
- void *cb_cls);
-
-/**
- * Add incoming data to the receive buffer and call the
- * callback for all complete messages.
- *
- * @param mst tokenizer to use
- * @param client_identity ID of client for which this is a buffer,
- * can be NULL (will be passed back to 'cb')
- * @param buf input data to add
- * @param size number of bytes in @a buf
- * @param purge should any excess bytes in the buffer be discarded
- * (i.e. for packet-based services like UDP)
- * @param one_shot only call callback once, keep rest of message in buffer
- * @return #GNUNET_OK if we are done processing (need more data)
- * #GNUNET_NO if one_shot was set and we have another message ready
- * #GNUNET_SYSERR if the data stream is corrupt
- */
-int
-GNUNET_SERVER_mst_receive (struct GNUNET_SERVER_MessageStreamTokenizer *mst,
- void *client_identity,
- const char *buf,
- size_t size,
- int purge,
- int one_shot);
-
-
-/**
- * Destroys a tokenizer.
- *
- * @param mst tokenizer to destroy
- */
-void
-GNUNET_SERVER_mst_destroy (struct GNUNET_SERVER_MessageStreamTokenizer *mst);
-
-
-/**
- * Set user context to be associated with the given client.
- * Note: you should probably use the macro (call without the underscore).
- *
- * @param client client to query
- * @param ptr pointer to user context
- * @param size number of bytes in user context struct (for verification only)
- */
-void
-GNUNET_SERVER_client_set_user_context_ (struct GNUNET_SERVER_Client *client,
- void *ptr,
- size_t size);
-
-/**
- * Return user context associated with the given client.
- *
- * @param client client to query
- * @param type expected return type (i.e. 'struct Foo')
- * @return pointer to user context of type 'type *'.
- */
-#define GNUNET_SERVER_client_get_user_context(client, type) \
- (type *) GNUNET_SERVER_client_get_user_context_ (client, sizeof(type))
-
-/**
- * Set user context to be associated with the given client.
- *
- * @param client client to query
- * @param value pointer to user context
- */
-#define GNUNET_SERVER_client_set_user_context(client, value) \
- GNUNET_SERVER_client_set_user_context_ (client, value, sizeof(*value))
-
-
-/**
- * Notify us when the server has enough space to transmit
- * a message of the given size to the given client.
- *
- * @param client client to transmit message to
- * @param size requested amount of buffer space
- * @param timeout after how long should we give up (and call
- * notify with buf NULL and size 0)?
- * @param callback function to call when space is available
- * @param callback_cls closure for @a callback
- * @return non-NULL if the notify callback was queued; can be used
- * to cancel the request using
- * #GNUNET_SERVER_notify_transmit_ready_cancel.
- * NULL if we are already going to notify someone else (busy)
- */
-struct GNUNET_SERVER_TransmitHandle *
-GNUNET_SERVER_notify_transmit_ready (
- struct GNUNET_SERVER_Client *client,
- size_t size,
- struct GNUNET_TIME_Relative timeout,
- GNUNET_CONNECTION_TransmitReadyNotify callback,
- void *callback_cls);
-
-/**
- * Abort transmission request.
- *
- * @param th request to abort
- */
-void
-GNUNET_SERVER_notify_transmit_ready_cancel (
- struct GNUNET_SERVER_TransmitHandle *th);
-
-
-/**
- * Notify the server that the given client handle should
- * be kept (keeps the connection up if possible, increments
- * the internal reference counter).
- *
- * @param client the client to keep
- */
-void
-GNUNET_SERVER_client_keep (struct GNUNET_SERVER_Client *client);
-
-
-/**
- * Notify the server that the given client handle is no
- * longer required. Decrements the reference counter. If
- * that counter reaches zero an inactive connection maybe
- * closed.
- *
- * @param client the client to drop
- */
-void
-GNUNET_SERVER_client_drop (struct GNUNET_SERVER_Client *client);
-
-
-/**
- * Function called by the service's run
- * method to run service-specific setup code.
- *
- * @param cls closure
- * @param server the initialized server
- * @param cfg configuration to use
- */
-typedef void (*LEGACY_SERVICE_Main) (
- void *cls,
- struct GNUNET_SERVER_Handle *server,
- const struct GNUNET_CONFIGURATION_Handle *cfg);
-
-
-/**
- * Suspend accepting connections from the listen socket temporarily.
- * Resume activity using #GNUNET_SERVER_resume.
- *
- * @param server server to stop accepting connections.
- */
-void
-GNUNET_SERVER_suspend (struct GNUNET_SERVER_Handle *server);
-
-/**
- * Notify us when the server has enough space to transmit
- * a message of the given size to the given client.
- *
- * @param client client to transmit message to
- * @param size requested amount of buffer space
- * @param timeout after how long should we give up (and call
- * notify with buf NULL and size 0)?
- * @param callback function to call when space is available
- * @param callback_cls closure for @a callback
- * @return non-NULL if the notify callback was queued; can be used
- * to cancel the request using
- * #GNUNET_SERVER_notify_transmit_ready_cancel.
- * NULL if we are already going to notify someone else (busy)
- */
-struct GNUNET_SERVER_TransmitHandle *
-GNUNET_SERVER_notify_transmit_ready (
- struct GNUNET_SERVER_Client *client,
- size_t size,
- struct GNUNET_TIME_Relative timeout,
- GNUNET_CONNECTION_TransmitReadyNotify callback,
- void *callback_cls);
-
-
-/**
- * Add a TCP socket-based connection to the set of handles managed by
- * this server. Use this function for outgoing (P2P) connections that
- * we initiated (and where this server should process incoming
- * messages).
- *
- * @param server the server to use
- * @param connection the connection to manage (client must
- * stop using this connection from now on)
- * @return the client handle
- */
-struct GNUNET_SERVER_Client *
-GNUNET_SERVER_connect_socket (struct GNUNET_SERVER_Handle *server,
- struct GNUNET_CONNECTION_Handle *connection);
-
-
-/**
- * Resume accepting connections from the listen socket.
- *
- * @param server server to resume accepting connections.
- */
-void
-GNUNET_SERVER_resume (struct GNUNET_SERVER_Handle *server);
-
-/**
- * Free resources held by this server.
- *
- * @param server server to destroy
- */
-void
-GNUNET_SERVER_destroy (struct GNUNET_SERVER_Handle *server);
-
-
-#include "tcp_connection_legacy.c"
-#include "tcp_server_mst_legacy.c"
-#include "tcp_server_legacy.c"
-#include "tcp_service_legacy.c"
-
-GNUNET_NETWORK_STRUCT_BEGIN
-
-/**
- * Initial handshake message for a session.
- */
-struct WelcomeMessage
-{
- /**
- * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_WELCOME.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Identity of the node connecting (TCP client)
- */
- struct GNUNET_PeerIdentity clientIdentity;
-};
-
-/**
- * Basically a WELCOME message, but with the purpose
- * of giving the waiting peer a client handle to use
- */
-struct TCP_NAT_ProbeMessage
-{
- /**
- * Type is #GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_NAT_PROBE.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Identity of the sender of the message.
- */
- struct GNUNET_PeerIdentity clientIdentity;
-};
-GNUNET_NETWORK_STRUCT_END
-
-/**
- * Context for sending a NAT probe via TCP.
- */
-struct TCPProbeContext
-{
- /**
- * Active probes are kept in a DLL.
- */
- struct TCPProbeContext *next;
-
- /**
- * Active probes are kept in a DLL.
- */
- struct TCPProbeContext *prev;
-
- /**
- * Probe connection.
- */
- struct GNUNET_CONNECTION_Handle *sock;
-
- /**
- * Message to be sent.
- */
- struct TCP_NAT_ProbeMessage message;
-
- /**
- * Handle to the transmission.
- */
- struct GNUNET_CONNECTION_TransmitHandle *transmit_handle;
-
- /**
- * Transport plugin handle.
- */
- struct Plugin *plugin;
-};
-
-/**
- * Bits in the `options` field of TCP addresses.
- */
-enum TcpAddressOptions
-{
- /**
- * No bits set.
- */
- TCP_OPTIONS_NONE = 0,
-
- /**
- * See #HTTP_OPTIONS_VERIFY_CERTIFICATE.
- */
- TCP_OPTIONS_RESERVED = 1,
-
- /**
- * Enable TCP Stealth-style port knocking.
- */
- TCP_OPTIONS_TCP_STEALTH = 2
-};
-
-GNUNET_NETWORK_STRUCT_BEGIN
-
-/**
- * Network format for IPv4 addresses.
- */
-struct IPv4TcpAddress
-{
- /**
- * Optional options and flags for this address,
- * see `enum TcpAddressOptions`
- */
- uint32_t options GNUNET_PACKED;
-
- /**
- * IPv4 address, in network byte order.
- */
- uint32_t ipv4_addr GNUNET_PACKED;
-
- /**
- * Port number, in network byte order.
- */
- uint16_t t4_port GNUNET_PACKED;
-};
-
-/**
- * Network format for IPv6 addresses.
- */
-struct IPv6TcpAddress
-{
- /**
- * Optional flags for this address
- * see `enum TcpAddressOptions`
- */
- uint32_t options GNUNET_PACKED;
-
- /**
- * IPv6 address.
- */
- struct in6_addr ipv6_addr GNUNET_PACKED;
-
- /**
- * Port number, in network byte order.
- */
- uint16_t t6_port GNUNET_PACKED;
-};
-GNUNET_NETWORK_STRUCT_END
-
-/**
- * Encapsulation of all of the state of the plugin.
- */
-struct Plugin;
-
-/**
- * Information kept for each message that is yet to
- * be transmitted.
- */
-struct PendingMessage
-{
- /**
- * This is a doubly-linked list.
- */
- struct PendingMessage *next;
-
- /**
- * This is a doubly-linked list.
- */
- struct PendingMessage *prev;
-
- /**
- * The pending message
- */
- const char *msg;
-
- /**
- * Continuation function to call once the message
- * has been sent. Can be NULL if there is no
- * continuation to call.
- */
- GNUNET_TRANSPORT_TransmitContinuation transmit_cont;
-
- /**
- * Closure for @e transmit_cont.
- */
- void *transmit_cont_cls;
-
- /**
- * Timeout value for the pending message.
- */
- struct GNUNET_TIME_Absolute timeout;
-
- /**
- * So that the gnunet-service-transport can group messages together,
- * these pending messages need to accept a message buffer and size
- * instead of just a `struct GNUNET_MessageHeader`.
- */
- size_t message_size;
-};
-
-/**
- * Session handle for TCP connections.
- */
-struct GNUNET_ATS_Session
-{
- /**
- * To whom are we talking to (set to our identity
- * if we are still waiting for the welcome message)
- */
- struct GNUNET_PeerIdentity target;
-
- /**
- * Pointer to the global plugin struct.
- */
- struct Plugin *plugin;
-
- /**
- * The client (used to identify this connection)
- */
- struct GNUNET_SERVER_Client *client;
-
- /**
- * Task cleaning up a NAT client connection establishment attempt;
- */
- struct GNUNET_SCHEDULER_Task *nat_connection_timeout;
-
- /**
- * Messages currently pending for transmission
- * to this peer, if any.
- */
- struct PendingMessage *pending_messages_head;
-
- /**
- * Messages currently pending for transmission
- * to this peer, if any.
- */
- struct PendingMessage *pending_messages_tail;
-
- /**
- * Handle for pending transmission request.
- */
- struct GNUNET_SERVER_TransmitHandle *transmit_handle;
-
- /**
- * Address of the other peer.
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * ID of task used to delay receiving more to throttle sender.
- */
- struct GNUNET_SCHEDULER_Task *receive_delay_task;
-
- /**
- * Session timeout task
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * When will this session time out?
- */
- struct GNUNET_TIME_Absolute timeout;
-
- /**
- * When will we continue to read from the socket?
- * (used to enforce inbound quota).
- */
- struct GNUNET_TIME_Absolute receive_delay;
-
- /**
- * Last activity on this connection. Used to select preferred
- * connection.
- */
- struct GNUNET_TIME_Absolute last_activity;
-
- /**
- * Number of bytes waiting for transmission to this peer.
- */
- unsigned long long bytes_in_queue;
-
- /**
- * Number of messages waiting for transmission to this peer.
- */
- unsigned int msgs_in_queue;
-
- /**
- * Network type of the address.
- */
- enum GNUNET_NetworkType scope;
-
- /**
- * Are we still expecting the welcome message? (#GNUNET_YES/#GNUNET_NO)
- */
- int expecting_welcome;
-
- /**
- * Was this session created using NAT traversal?
- */
- int is_nat;
-};
-
-
-/**
- * Context for address to string conversion, closure
- * for #append_port().
- */
-struct PrettyPrinterContext
-{
- /**
- * DLL
- */
- struct PrettyPrinterContext *next;
-
- /**
- * DLL
- */
- struct PrettyPrinterContext *prev;
-
- /**
- * Our plugin.
- */
- struct Plugin *plugin;
-
- /**
- * Timeout task
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * Resolver handle
- */
- struct GNUNET_RESOLVER_RequestHandle *resolver_handle;
-
- /**
- * Function to call with the result.
- */
- GNUNET_TRANSPORT_AddressStringCallback asc;
-
- /**
- * Clsoure for @e asc.
- */
- void *asc_cls;
-
- /**
- * IPv6 address
- */
- int ipv6;
-
- /**
- * Options
- */
- uint32_t options;
-
- /**
- * Port to add after the IP address.
- */
- uint16_t port;
-};
-
-
-/**
- * Encapsulation of all of the state of the plugin.
- */
-struct Plugin
-{
- /**
- * Our environment.
- */
- struct GNUNET_TRANSPORT_PluginEnvironment *env;
-
- /**
- * The listen socket.
- */
- struct GNUNET_CONNECTION_Handle *lsock;
-
- /**
- * Our handle to the NAT module.
- */
- struct GNUNET_NAT_Handle *nat;
-
- /**
- * Map from peer identities to sessions for the given peer.
- */
- struct GNUNET_CONTAINER_MultiPeerMap *sessionmap;
-
- /**
- * Handle to the network service.
- */
- struct LEGACY_SERVICE_Context *service;
-
- /**
- * Handle to the server for this service.
- */
- struct GNUNET_SERVER_Handle *server;
-
- /**
- * Copy of the handler array where the closures are
- * set to this struct's instance.
- */
- struct GNUNET_SERVER_MessageHandler *handlers;
-
- /**
- * Map of peers we have tried to contact behind a NAT
- */
- struct GNUNET_CONTAINER_MultiPeerMap *nat_wait_conns;
-
- /**
- * List of active TCP probes.
- */
- struct TCPProbeContext *probe_head;
-
- /**
- * List of active TCP probes.
- */
- struct TCPProbeContext *probe_tail;
-
- /**
- * Function to call about session status changes.
- */
- GNUNET_TRANSPORT_SessionInfoCallback sic;
-
- /**
- * Closure for @e sic.
- */
- void *sic_cls;
-
- /**
- * ID of task used to update our addresses when one expires.
- */
- struct GNUNET_SCHEDULER_Task *address_update_task;
-
- /**
- * Running pretty printers: head
- */
- struct PrettyPrinterContext *ppc_dll_head;
-
- /**
- * Running pretty printers: tail
- */
- struct PrettyPrinterContext *ppc_dll_tail;
-
- /**
- * Welcome message used by this peer.
- */
- struct WelcomeMessage my_welcome;
-
- /**
- * How many more TCP sessions are we allowed to open right now?
- */
- unsigned long long max_connections;
-
- /**
- * How many more TCP sessions do we have right now?
- */
- unsigned long long cur_connections;
-
- /**
- * Address options
- */
- uint32_t myoptions;
-
- /**
- * Port that we are actually listening on.
- */
- uint16_t open_port;
-
- /**
- * Port that the user said we would have visible to the
- * rest of the world.
- */
- uint16_t adv_port;
-};
-
-
-/**
- * Get the list of addresses that a server for the given service
- * should bind to.
- *
- * @param service_name name of the service
- * @param cfg configuration (which specifies the addresses)
- * @param addrs set (call by reference) to an array of pointers to the
- * addresses the server should bind to and listen on; the
- * array will be NULL-terminated (on success)
- * @param addr_lens set (call by reference) to an array of the lengths
- * of the respective `struct sockaddr` struct in the @a addrs
- * array (on success)
- * @return number of addresses found on success,
- * #GNUNET_SYSERR if the configuration
- * did not specify reasonable finding information or
- * if it specified a hostname that could not be resolved;
- * #GNUNET_NO if the number of addresses configured is
- * zero (in this case, `*addrs` and `*addr_lens` will be
- * set to NULL).
- */
-static int
-get_server_addresses (const char *service_name,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- struct sockaddr ***addrs,
- socklen_t **addr_lens)
-{
- int disablev6;
- struct GNUNET_NETWORK_Handle *desc;
- unsigned long long port;
- char *unixpath;
- struct addrinfo hints;
- struct addrinfo *res;
- struct addrinfo *pos;
- struct addrinfo *next;
- unsigned int i;
- int resi;
- int ret;
- int abstract;
- struct sockaddr **saddrs;
- socklen_t *saddrlens;
- char *hostname;
-
- *addrs = NULL;
- *addr_lens = NULL;
- desc = NULL;
- if (GNUNET_CONFIGURATION_have_value (cfg, service_name, "DISABLEV6"))
- {
- if (GNUNET_SYSERR ==
- (disablev6 = GNUNET_CONFIGURATION_get_value_yesno (cfg,
- service_name,
- "DISABLEV6")))
- return GNUNET_SYSERR;
- }
- else
- disablev6 = GNUNET_NO;
-
- if (! disablev6)
- {
- /* probe IPv6 support */
- desc = GNUNET_NETWORK_socket_create (PF_INET6, SOCK_STREAM, 0);
- if (NULL == desc)
- {
- if ((ENOBUFS == errno) || (ENOMEM == errno) || (ENFILE == errno) ||
- (EACCES == errno))
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket");
- return GNUNET_SYSERR;
- }
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ (
- "Disabling IPv6 support for service `%s', failed to create IPv6
socket: %s\n"),
- service_name,
- strerror (errno));
- disablev6 = GNUNET_YES;
- }
- else
- {
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (desc));
- desc = NULL;
- }
- }
-
- port = 0;
- if (GNUNET_CONFIGURATION_have_value (cfg, service_name, "PORT"))
- {
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (cfg,
- service_name,
- "PORT",
- &port))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Require valid port number for service `%s' in
configuration!\n"),
- service_name);
- }
- if (port > 65535)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Require valid port number for service `%s' in
configuration!\n"),
- service_name);
- return GNUNET_SYSERR;
- }
- }
-
- if (GNUNET_CONFIGURATION_have_value (cfg, service_name, "BINDTO"))
- {
- GNUNET_break (GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_string (cfg,
- service_name,
- "BINDTO",
- &hostname));
- }
- else
- hostname = NULL;
-
- unixpath = NULL;
- abstract = GNUNET_NO;
-#ifdef AF_UNIX
- if ((GNUNET_YES ==
- GNUNET_CONFIGURATION_have_value (cfg, service_name, "UNIXPATH")) &&
- (GNUNET_OK == GNUNET_CONFIGURATION_get_value_filename (cfg,
- service_name,
- "UNIXPATH",
- &unixpath)) &&
- (0 < strlen (unixpath)))
- {
- /* probe UNIX support */
- struct sockaddr_un s_un;
-
- if (strlen (unixpath) >= sizeof(s_un.sun_path))
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ ("UNIXPATH `%s' too long, maximum length is %llu\n"),
- unixpath,
- (unsigned long long) sizeof(s_un.sun_path));
- unixpath = GNUNET_NETWORK_shorten_unixpath (unixpath);
- LOG (GNUNET_ERROR_TYPE_INFO, _ ("Using `%s' instead\n"), unixpath);
- }
-#ifdef __linux__
- abstract = GNUNET_CONFIGURATION_get_value_yesno (cfg,
- "TESTING",
- "USE_ABSTRACT_SOCKETS");
- if (GNUNET_SYSERR == abstract)
- abstract = GNUNET_NO;
-#endif
- if ((GNUNET_YES != abstract) &&
- (GNUNET_OK != GNUNET_DISK_directory_create_for_file (unixpath)))
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "mkdir", unixpath);
- }
- if (NULL != unixpath)
- {
- desc = GNUNET_NETWORK_socket_create (AF_UNIX, SOCK_STREAM, 0);
- if (NULL == desc)
- {
- if ((ENOBUFS == errno) || (ENOMEM == errno) || (ENFILE == errno) ||
- (EACCES == errno))
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket");
- GNUNET_free (hostname);
- GNUNET_free (unixpath);
- return GNUNET_SYSERR;
- }
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ (
- "Disabling UNIX domain socket support for service `%s', failed to
create UNIX domain socket: %s\n"),
- service_name,
- strerror (errno));
- GNUNET_free (unixpath);
- unixpath = NULL;
- }
- else
- {
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (desc));
- desc = NULL;
- }
- }
-#endif
-
- if ((0 == port) && (NULL == unixpath))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ (
- "Have neither PORT nor UNIXPATH for service `%s', but one is
required\n"),
- service_name);
- GNUNET_free (hostname);
- return GNUNET_SYSERR;
- }
- if (0 == port)
- {
- saddrs = GNUNET_malloc (2 * sizeof(struct sockaddr *));
- saddrlens = GNUNET_malloc (2 * sizeof(socklen_t));
- add_unixpath (saddrs, saddrlens, unixpath, abstract);
- GNUNET_free (unixpath);
- GNUNET_free (hostname);
- *addrs = saddrs;
- *addr_lens = saddrlens;
- return 1;
- }
-
- if (NULL != hostname)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Resolving `%s' since that is where `%s' will bind to.\n",
- hostname,
- service_name);
- memset (&hints, 0, sizeof(struct addrinfo));
- if (disablev6)
- hints.ai_family = AF_INET;
- hints.ai_protocol = IPPROTO_TCP;
- if ((0 != (ret = getaddrinfo (hostname, NULL, &hints, &res))) ||
- (NULL == res))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to resolve `%s': %s\n"),
- hostname,
- gai_strerror (ret));
- GNUNET_free (hostname);
- GNUNET_free (unixpath);
- return GNUNET_SYSERR;
- }
- next = res;
- i = 0;
- while (NULL != (pos = next))
- {
- next = pos->ai_next;
- if ((disablev6) && (pos->ai_family == AF_INET6))
- continue;
- i++;
- }
- if (0 == i)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to find %saddress for `%s'.\n"),
- disablev6 ? "IPv4 " : "",
- hostname);
- freeaddrinfo (res);
- GNUNET_free (hostname);
- GNUNET_free (unixpath);
- return GNUNET_SYSERR;
- }
- resi = i;
- if (NULL != unixpath)
- resi++;
- saddrs = GNUNET_malloc ((resi + 1) * sizeof(struct sockaddr *));
- saddrlens = GNUNET_malloc ((resi + 1) * sizeof(socklen_t));
- i = 0;
- if (NULL != unixpath)
- {
- add_unixpath (saddrs, saddrlens, unixpath, abstract);
- i++;
- }
- next = res;
- while (NULL != (pos = next))
- {
- next = pos->ai_next;
- if ((disablev6) && (AF_INET6 == pos->ai_family))
- continue;
- if ((IPPROTO_TCP != pos->ai_protocol) && (0 != pos->ai_protocol))
- continue; /* not TCP */
- if ((SOCK_STREAM != pos->ai_socktype) && (0 != pos->ai_socktype))
- continue; /* huh? */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Service `%s' will bind to `%s'\n",
- service_name,
- GNUNET_a2s (pos->ai_addr, pos->ai_addrlen));
- if (AF_INET == pos->ai_family)
- {
- GNUNET_assert (sizeof(struct sockaddr_in) == pos->ai_addrlen);
- saddrlens[i] = pos->ai_addrlen;
- saddrs[i] = GNUNET_malloc (saddrlens[i]);
- GNUNET_memcpy (saddrs[i], pos->ai_addr, saddrlens[i]);
- ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
- }
- else
- {
- GNUNET_assert (AF_INET6 == pos->ai_family);
- GNUNET_assert (sizeof(struct sockaddr_in6) == pos->ai_addrlen);
- saddrlens[i] = pos->ai_addrlen;
- saddrs[i] = GNUNET_malloc (saddrlens[i]);
- GNUNET_memcpy (saddrs[i], pos->ai_addr, saddrlens[i]);
- ((struct sockaddr_in6 *) saddrs[i])->sin6_port = htons (port);
- }
- i++;
- }
- GNUNET_free (hostname);
- freeaddrinfo (res);
- resi = i;
- }
- else
- {
- /* will bind against everything, just set port */
- if (disablev6)
- {
- /* V4-only */
- resi = 1;
- if (NULL != unixpath)
- resi++;
- i = 0;
- saddrs = GNUNET_malloc ((resi + 1) * sizeof(struct sockaddr *));
- saddrlens = GNUNET_malloc ((resi + 1) * sizeof(socklen_t));
- if (NULL != unixpath)
- {
- add_unixpath (saddrs, saddrlens, unixpath, abstract);
- i++;
- }
- saddrlens[i] = sizeof(struct sockaddr_in);
- saddrs[i] = GNUNET_malloc (saddrlens[i]);
-#if HAVE_SOCKADDR_IN_SIN_LEN
- ((struct sockaddr_in *) saddrs[i])->sin_len = saddrlens[i];
-#endif
- ((struct sockaddr_in *) saddrs[i])->sin_family = AF_INET;
- ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
- }
- else
- {
- /* dual stack */
- resi = 2;
- if (NULL != unixpath)
- resi++;
- saddrs = GNUNET_malloc ((resi + 1) * sizeof(struct sockaddr *));
- saddrlens = GNUNET_malloc ((resi + 1) * sizeof(socklen_t));
- i = 0;
- if (NULL != unixpath)
- {
- add_unixpath (saddrs, saddrlens, unixpath, abstract);
- i++;
- }
- saddrlens[i] = sizeof(struct sockaddr_in6);
- saddrs[i] = GNUNET_malloc (saddrlens[i]);
-#if HAVE_SOCKADDR_IN_SIN_LEN
- ((struct sockaddr_in6 *) saddrs[i])->sin6_len = saddrlens[0];
-#endif
- ((struct sockaddr_in6 *) saddrs[i])->sin6_family = AF_INET6;
- ((struct sockaddr_in6 *) saddrs[i])->sin6_port = htons (port);
- i++;
- saddrlens[i] = sizeof(struct sockaddr_in);
- saddrs[i] = GNUNET_malloc (saddrlens[i]);
-#if HAVE_SOCKADDR_IN_SIN_LEN
- ((struct sockaddr_in *) saddrs[i])->sin_len = saddrlens[1];
-#endif
- ((struct sockaddr_in *) saddrs[i])->sin_family = AF_INET;
- ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
- }
- }
- GNUNET_free (unixpath);
- *addrs = saddrs;
- *addr_lens = saddrlens;
- return resi;
-}
-
-
-/* end ancient copy-and-paste */
-
-
-/**
- * If a session monitor is attached, notify it about the new
- * session state.
- *
- * @param plugin our plugin
- * @param session session that changed state
- * @param state new state of the session
- */
-static void
-notify_session_monitor (struct Plugin *plugin,
- struct GNUNET_ATS_Session *session,
- enum GNUNET_TRANSPORT_SessionState state)
-{
- struct GNUNET_TRANSPORT_SessionInfo info;
-
- if (NULL == plugin->sic)
- return;
- memset (&info, 0, sizeof(info));
- info.state = state;
- info.is_inbound =
- GNUNET_HELLO_address_check_option (session->address,
- GNUNET_HELLO_ADDRESS_INFO_INBOUND);
- info.num_msg_pending = session->msgs_in_queue;
- info.num_bytes_pending = session->bytes_in_queue;
- if (NULL != session->receive_delay_task)
- info.receive_delay = session->receive_delay;
- info.session_timeout = session->timeout;
- info.address = session->address;
- plugin->sic (plugin->sic_cls, session, &info);
-}
-
-
-/**
- * Our external IP address/port mapping has changed.
- *
- * @param cls closure, the `struct Plugin`
- * @param[in,out] app_ctx location where the app can store stuff
- * on add and retrieve it on remove
- * @param add_remove #GNUNET_YES to mean the new public IP address, #GNUNET_NO
to mean
- * the previous (now invalid) one
- * @param ac address class the address belongs to
- * @param addr either the previous or the new public IP address
- * @param addrlen actual length of @a addr
- */
-static void
-tcp_nat_port_map_callback (void *cls,
- void **app_ctx,
- int add_remove,
- enum GNUNET_NAT_AddressClass ac,
- const struct sockaddr *addr,
- socklen_t addrlen)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_HELLO_Address *address;
- struct IPv4TcpAddress t4;
- struct IPv6TcpAddress t6;
- void *arg;
- size_t args;
-
- (void) app_ctx;
- LOG (GNUNET_ERROR_TYPE_INFO,
- "NAT notification to %s address `%s'\n",
- (GNUNET_YES == add_remove) ? "add" : "remove",
- GNUNET_a2s (addr, addrlen));
- /* convert 'addr' to our internal format */
- switch (addr->sa_family)
- {
- case AF_INET:
- GNUNET_assert (addrlen == sizeof(struct sockaddr_in));
- memset (&t4, 0, sizeof(t4));
- t4.options = htonl (plugin->myoptions);
- t4.ipv4_addr = ((struct sockaddr_in *) addr)->sin_addr.s_addr;
- t4.t4_port = ((struct sockaddr_in *) addr)->sin_port;
- arg = &t4;
- args = sizeof(t4);
- break;
-
- case AF_INET6:
- if (IN6_IS_ADDR_LINKLOCAL (&((struct sockaddr_in6 *) addr)->sin6_addr))
- {
- /* skip link local, we don't allow them in
- #tcp_plugin_check_address() */
- return;
- }
- GNUNET_assert (addrlen == sizeof(struct sockaddr_in6));
- memset (&t6, 0, sizeof(t6));
- GNUNET_memcpy (&t6.ipv6_addr,
- &((struct sockaddr_in6 *) addr)->sin6_addr,
- sizeof(struct in6_addr));
- t6.options = htonl (plugin->myoptions);
- t6.t6_port = ((struct sockaddr_in6 *) addr)->sin6_port;
- arg = &t6;
- args = sizeof(t6);
- break;
-
- default:
- GNUNET_break (0);
- return;
- }
- /* modify our published address list */
- GNUNET_assert ((args == sizeof(struct IPv4TcpAddress)) ||
- (args == sizeof(struct IPv6TcpAddress)));
- /* TODO: use 'ac' here in the future... */
- address = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
- PLUGIN_NAME,
- arg,
- args,
- GNUNET_HELLO_ADDRESS_INFO_NONE);
- plugin->env->notify_address (plugin->env->cls, add_remove, address);
- GNUNET_HELLO_address_free (address);
-}
-
-
-/**
- * Function called for a quick conversion of the binary address to
- * a numeric address. Note that the caller must not free the
- * address and that the next call to this function is allowed
- * to override the address again.
- *
- * @param cls closure (`struct Plugin*`)
- * @param addr binary address
- * @param addrlen length of @a addr
- * @return string representing the same address
- */
-static const char *
-tcp_plugin_address_to_string (void *cls, const void *addr, size_t addrlen)
-{
- static char rbuf[INET6_ADDRSTRLEN + 16];
- char buf[INET6_ADDRSTRLEN];
- const void *sb;
- struct in_addr a4;
- struct in6_addr a6;
- const struct IPv4TcpAddress *t4;
- const struct IPv6TcpAddress *t6;
- int af;
- uint16_t port;
- uint32_t options;
-
- switch (addrlen)
- {
- case sizeof(struct IPv6TcpAddress):
- t6 = addr;
- af = AF_INET6;
- port = ntohs (t6->t6_port);
- options = ntohl (t6->options);
- GNUNET_memcpy (&a6, &t6->ipv6_addr, sizeof(a6));
- sb = &a6;
- break;
-
- case sizeof(struct IPv4TcpAddress):
- t4 = addr;
- af = AF_INET;
- port = ntohs (t4->t4_port);
- options = ntohl (t4->options);
- GNUNET_memcpy (&a4, &t4->ipv4_addr, sizeof(a4));
- sb = &a4;
- break;
-
- default:
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ ("Unexpected address length: %u bytes\n"),
- (unsigned int) addrlen);
- return NULL;
- }
- if (NULL == inet_ntop (af, sb, buf, INET6_ADDRSTRLEN))
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "inet_ntop");
- return NULL;
- }
- GNUNET_snprintf (rbuf,
- sizeof(rbuf),
- (af == AF_INET6) ? "%s.%u.[%s]:%u" : "%s.%u.%s:%u",
- PLUGIN_NAME,
- options,
- buf,
- port);
- return rbuf;
-}
-
-
-/**
- * Function called to convert a string address to
- * a binary address.
- *
- * @param cls closure (`struct Plugin*`)
- * @param addr string address
- * @param addrlen length of the address
- * @param buf location to store the buffer
- * @param added location to store the number of bytes in the buffer.
- * If the function returns #GNUNET_SYSERR, its contents are undefined.
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
- */
-static int
-tcp_plugin_string_to_address (void *cls,
- const char *addr,
- uint16_t addrlen,
- void **buf,
- size_t *added)
-{
- struct sockaddr_storage socket_address;
- char *address;
- char *plugin;
- char *optionstr;
- uint32_t options;
-
- /* Format tcp.options.address:port */
- address = NULL;
- plugin = NULL;
- optionstr = NULL;
- if ((NULL == addr) || (0 == addrlen))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if ('\0' != addr[addrlen - 1])
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if (strlen (addr) != addrlen - 1)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- plugin = GNUNET_strdup (addr);
- optionstr = strchr (plugin, '.');
- if (NULL == optionstr)
- {
- GNUNET_break (0);
- GNUNET_free (plugin);
- return GNUNET_SYSERR;
- }
- optionstr[0] = '\0';
- optionstr++;
- options = atol (optionstr);
- address = strchr (optionstr, '.');
- if (NULL == address)
- {
- GNUNET_break (0);
- GNUNET_free (plugin);
- return GNUNET_SYSERR;
- }
- address[0] = '\0';
- address++;
-
- if (GNUNET_OK !=
- GNUNET_STRINGS_to_address_ip (address, strlen (address),
&socket_address))
- {
- GNUNET_break (0);
- GNUNET_free (plugin);
- return GNUNET_SYSERR;
- }
-
- GNUNET_free (plugin);
- switch (socket_address.ss_family)
- {
- case AF_INET: {
- struct IPv4TcpAddress *t4;
- struct sockaddr_in *in4 = (struct sockaddr_in *) &socket_address;
- t4 = GNUNET_new (struct IPv4TcpAddress);
- t4->options = htonl (options);
- t4->ipv4_addr = in4->sin_addr.s_addr;
- t4->t4_port = in4->sin_port;
- *buf = t4;
- *added = sizeof(struct IPv4TcpAddress);
- return GNUNET_OK;
- }
-
- case AF_INET6: {
- struct IPv6TcpAddress *t6;
- struct sockaddr_in6 *in6 = (struct sockaddr_in6 *) &socket_address;
- t6 = GNUNET_new (struct IPv6TcpAddress);
- t6->options = htonl (options);
- t6->ipv6_addr = in6->sin6_addr;
- t6->t6_port = in6->sin6_port;
- *buf = t6;
- *added = sizeof(struct IPv6TcpAddress);
- return GNUNET_OK;
- }
-
- default:
- return GNUNET_SYSERR;
- }
-}
-
-
-/**
- * Find the session handle for the given client.
- * Currently uses both the hashmap and the client
- * context, as the client context is new and the
- * logic still needs to be tested.
- *
- * @param plugin the plugin
- * @param client which client to find the session handle for
- * @return NULL if no matching session exists
- */
-static struct GNUNET_ATS_Session *
-lookup_session_by_client (struct Plugin *plugin,
- struct GNUNET_SERVER_Client *client)
-{
- return GNUNET_SERVER_client_get_user_context (client,
- struct GNUNET_ATS_Session);
-}
-
-
-/**
- * Functions with this signature are called whenever we need
- * to close a session due to a disconnect or failure to
- * establish a connection.
- *
- * @param cls the `struct Plugin`
- * @param session session to close down
- * @return #GNUNET_OK on success
- */
-static int
-tcp_plugin_disconnect_session (void *cls, struct GNUNET_ATS_Session *session)
-{
- struct Plugin *plugin = cls;
- struct PendingMessage *pm;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Disconnecting session of peer `%s' address `%s'\n",
- GNUNET_i2s (&session->target),
- tcp_plugin_address_to_string (session->plugin,
- session->address->address,
- session->address->address_length));
-
- if (NULL != session->timeout_task)
- {
- GNUNET_SCHEDULER_cancel (session->timeout_task);
- session->timeout_task = NULL;
- session->timeout = GNUNET_TIME_UNIT_ZERO_ABS;
- }
-
- if (GNUNET_YES == GNUNET_CONTAINER_multipeermap_remove (plugin->sessionmap,
- &session->target,
- session))
- {
- GNUNET_STATISTICS_update (session->plugin->env->stats,
- gettext_noop ("# TCP sessions active"),
- -1,
- GNUNET_NO);
- }
- else
- {
- GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove
(plugin->nat_wait_conns,
- &session->target,
- session));
- }
- if (NULL != session->client)
- GNUNET_SERVER_client_set_user_context (session->client, NULL);
-
- /* clean up state */
- if (NULL != session->transmit_handle)
- {
- GNUNET_SERVER_notify_transmit_ready_cancel (session->transmit_handle);
- session->transmit_handle = NULL;
- }
- session->plugin->env->session_end (session->plugin->env->cls,
- session->address,
- session);
-
- if (NULL != session->nat_connection_timeout)
- {
- GNUNET_SCHEDULER_cancel (session->nat_connection_timeout);
- session->nat_connection_timeout = NULL;
- }
-
- while (NULL != (pm = session->pending_messages_head))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- (NULL != pm->transmit_cont)
- ? "Could not deliver message to `%s' at %s.\n"
- : "Could not deliver message to `%s' at %s, notifying.\n",
- GNUNET_i2s (&session->target),
- tcp_plugin_address_to_string (session->plugin,
- session->address->address,
- session->address->address_length));
- GNUNET_STATISTICS_update (session->plugin->env->stats,
- gettext_noop ("# bytes currently in TCP
buffers"),
- -(int64_t) pm->message_size,
- GNUNET_NO);
- GNUNET_STATISTICS_update (session->plugin->env->stats,
- gettext_noop (
- "# bytes discarded by TCP (disconnect)"),
- pm->message_size,
- GNUNET_NO);
- GNUNET_CONTAINER_DLL_remove (session->pending_messages_head,
- session->pending_messages_tail,
- pm);
- GNUNET_assert (0 < session->msgs_in_queue);
- session->msgs_in_queue--;
- GNUNET_assert (pm->message_size <= session->bytes_in_queue);
- session->bytes_in_queue -= pm->message_size;
- if (NULL != pm->transmit_cont)
- pm->transmit_cont (pm->transmit_cont_cls,
- &session->target,
- GNUNET_SYSERR,
- pm->message_size,
- 0);
- GNUNET_free (pm);
- }
- GNUNET_assert (0 == session->msgs_in_queue);
- GNUNET_assert (0 == session->bytes_in_queue);
- notify_session_monitor (session->plugin, session, GNUNET_TRANSPORT_SS_DONE);
-
- if (NULL != session->receive_delay_task)
- {
- GNUNET_SCHEDULER_cancel (session->receive_delay_task);
- session->receive_delay_task = NULL;
- }
- if (NULL != session->client)
- {
- GNUNET_SERVER_client_disconnect (session->client);
- session->client = NULL;
- }
- GNUNET_HELLO_address_free (session->address);
- GNUNET_assert (NULL == session->transmit_handle);
- GNUNET_free (session);
- return GNUNET_OK;
-}
-
-
-/**
- * Function that is called to get the keepalive factor.
- * #GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT is divided by this number to
- * calculate the interval between keepalive packets.
- *
- * @param cls closure with the `struct Plugin`
- * @return keepalive factor
- */
-static unsigned int
-tcp_plugin_query_keepalive_factor (void *cls)
-{
- return 3;
-}
-
-
-/**
- * Session was idle for too long, so disconnect it
- *
- * @param cls the `struct GNUNET_ATS_Session` of the idle session
- */
-static void
-session_timeout (void *cls)
-{
- struct GNUNET_ATS_Session *s = cls;
- struct GNUNET_TIME_Relative left;
-
- s->timeout_task = NULL;
- left = GNUNET_TIME_absolute_get_remaining (s->timeout);
- if (0 != left.rel_value_us)
- {
- /* not actually our turn yet, but let's at least update
- the monitor, it may think we're about to die ... */
- notify_session_monitor (s->plugin, s, GNUNET_TRANSPORT_SS_UPDATE);
- s->timeout_task = GNUNET_SCHEDULER_add_delayed (left, &session_timeout, s);
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p was idle for %s, disconnecting\n",
- s,
- GNUNET_STRINGS_relative_time_to_string (
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
- GNUNET_YES));
- /* call session destroy function */
- tcp_plugin_disconnect_session (s->plugin, s);
-}
-
-
-/**
- * Increment session timeout due to activity.
- *
- * @param s session to increment timeout for
- */
-static void
-reschedule_session_timeout (struct GNUNET_ATS_Session *s)
-{
- GNUNET_assert (NULL != s->timeout_task);
- s->timeout =
- GNUNET_TIME_relative_to_absolute
(GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
-}
-
-
-/**
- * Create a new session. Also queues a welcome message.
- *
- * @param plugin the plugin
- * @param address the address to create the session for
- * @param scope network scope the address is from
- * @param client client to use, reference counter must have already been
increased
- * @param is_nat this a NAT session, we should wait for a client to
- * connect to us from an address, then assign that to
- * the session
- * @return new session object
- */
-static struct GNUNET_ATS_Session *
-create_session (struct Plugin *plugin,
- const struct GNUNET_HELLO_Address *address,
- enum GNUNET_NetworkType scope,
- struct GNUNET_SERVER_Client *client,
- int is_nat)
-{
- struct GNUNET_ATS_Session *session;
- struct PendingMessage *pm;
-
- if (GNUNET_YES != is_nat)
- GNUNET_assert (NULL != client);
- else
- GNUNET_assert (NULL == client);
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Creating new session for peer `%s' at address %s\n",
- GNUNET_i2s (&address->peer),
- tcp_plugin_address_to_string (plugin,
- address->address,
- address->address_length));
- session = GNUNET_new (struct GNUNET_ATS_Session);
- session->last_activity = GNUNET_TIME_absolute_get ();
- session->plugin = plugin;
- session->is_nat = is_nat;
- if (NULL != client)
- {
- session->client = client;
- GNUNET_SERVER_client_set_user_context (client, session);
- }
- session->address = GNUNET_HELLO_address_copy (address);
- session->target = address->peer;
- session->expecting_welcome = GNUNET_YES;
- session->scope = scope;
- pm = GNUNET_malloc (sizeof(struct PendingMessage)
- + sizeof(struct WelcomeMessage));
- pm->msg = (const char *) &pm[1];
- pm->message_size = sizeof(struct WelcomeMessage);
- GNUNET_memcpy (&pm[1], &plugin->my_welcome, sizeof(struct WelcomeMessage));
- pm->timeout = GNUNET_TIME_UNIT_FOREVER_ABS;
- GNUNET_STATISTICS_update (plugin->env->stats,
- gettext_noop ("# bytes currently in TCP buffers"),
- pm->message_size,
- GNUNET_NO);
- GNUNET_CONTAINER_DLL_insert (session->pending_messages_head,
- session->pending_messages_tail,
- pm);
- session->msgs_in_queue++;
- session->bytes_in_queue += pm->message_size;
- session->timeout =
- GNUNET_TIME_relative_to_absolute
(GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
- session->timeout_task =
- GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
- &session_timeout,
- session);
- notify_session_monitor (session->plugin, session, GNUNET_TRANSPORT_SS_INIT);
- if (GNUNET_YES != is_nat)
- {
- GNUNET_STATISTICS_update (plugin->env->stats,
- gettext_noop ("# TCP sessions active"),
- 1,
- GNUNET_NO);
- notify_session_monitor (session->plugin, session, GNUNET_TRANSPORT_SS_UP);
- }
- else
- {
- notify_session_monitor (session->plugin,
- session,
- GNUNET_TRANSPORT_SS_HANDSHAKE);
- }
- return session;
-}
-
-
-/**
- * If we have pending messages, ask the server to
- * transmit them (schedule the respective tasks, etc.)
- *
- * @param session for which session should we do this
- */
-static void
-process_pending_messages (struct GNUNET_ATS_Session *session);
-
-
-/**
- * Function called to notify a client about the socket
- * being ready to queue more data. "buf" will be
- * NULL and "size" zero if the socket was closed for
- * writing in the meantime.
- *
- * @param cls closure
- * @param size number of bytes available in @a buf
- * @param buf where the callee should write the message
- * @return number of bytes written to @a buf
- */
-static size_t
-do_transmit (void *cls, size_t size, void *buf)
-{
- struct GNUNET_ATS_Session *session = cls;
- struct GNUNET_PeerIdentity pid;
- struct Plugin *plugin;
- struct PendingMessage *pos;
- struct PendingMessage *hd;
- struct PendingMessage *tl;
- struct GNUNET_TIME_Absolute now;
- char *cbuf;
- size_t ret;
-
- session->transmit_handle = NULL;
- plugin = session->plugin;
- if (NULL == buf)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Timeout trying to transmit to peer `%s', discarding message
queue.\n",
- GNUNET_i2s (&session->target));
- /* timeout; cancel all messages that have already expired */
- hd = NULL;
- tl = NULL;
- ret = 0;
- now = GNUNET_TIME_absolute_get ();
- while ((NULL != (pos = session->pending_messages_head)) &&
- (pos->timeout.abs_value_us <= now.abs_value_us))
- {
- GNUNET_CONTAINER_DLL_remove (session->pending_messages_head,
- session->pending_messages_tail,
- pos);
- GNUNET_assert (0 < session->msgs_in_queue);
- session->msgs_in_queue--;
- GNUNET_assert (pos->message_size <= session->bytes_in_queue);
- session->bytes_in_queue -= pos->message_size;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Failed to transmit %lu byte message to `%s'.\n",
- (unsigned long) pos->message_size,
- GNUNET_i2s (&session->target));
- ret += pos->message_size;
- GNUNET_CONTAINER_DLL_insert_after (hd, tl, tl, pos);
- }
- /* do this call before callbacks (so that if callbacks destroy
- * session, they have a chance to cancel actions done by this
- * call) */
- process_pending_messages (session);
- pid = session->target;
- /* no do callbacks and do not use session again since
- * the callbacks may abort the session */
- while (NULL != (pos = hd))
- {
- GNUNET_CONTAINER_DLL_remove (hd, tl, pos);
- if (NULL != pos->transmit_cont)
- pos->transmit_cont (pos->transmit_cont_cls,
- &pid,
- GNUNET_SYSERR,
- pos->message_size,
- 0);
- GNUNET_free (pos);
- }
- GNUNET_STATISTICS_update (plugin->env->stats,
- gettext_noop ("# bytes currently in TCP
buffers"),
- -(int64_t) ret,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- gettext_noop (
- "# bytes discarded by TCP (timeout)"),
- ret,
- GNUNET_NO);
- if (0 < ret)
- notify_session_monitor (session->plugin,
- session,
- GNUNET_TRANSPORT_SS_UPDATE);
- return 0;
- }
- /* copy all pending messages that would fit */
- ret = 0;
- cbuf = buf;
- hd = NULL;
- tl = NULL;
- while (NULL != (pos = session->pending_messages_head))
- {
- if (ret + pos->message_size > size)
- break;
- GNUNET_CONTAINER_DLL_remove (session->pending_messages_head,
- session->pending_messages_tail,
- pos);
- GNUNET_assert (0 < session->msgs_in_queue);
- session->msgs_in_queue--;
- GNUNET_assert (pos->message_size <= session->bytes_in_queue);
- session->bytes_in_queue -= pos->message_size;
- GNUNET_assert (size >= pos->message_size);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Transmitting message of type %u size %lu to peer %s at %s\n",
- ntohs (((struct GNUNET_MessageHeader *) pos->msg)->type),
- (unsigned long) pos->message_size,
- GNUNET_i2s (&session->target),
- tcp_plugin_address_to_string (session->plugin,
- session->address->address,
- session->address->address_length));
- /* FIXME: this GNUNET_memcpy can be up to 7% of our total runtime */
- GNUNET_memcpy (cbuf, pos->msg, pos->message_size);
- cbuf += pos->message_size;
- ret += pos->message_size;
- size -= pos->message_size;
- GNUNET_CONTAINER_DLL_insert_tail (hd, tl, pos);
- }
- notify_session_monitor (session->plugin, session,
GNUNET_TRANSPORT_SS_UPDATE);
- /* schedule 'continuation' before callbacks so that callbacks that
- * cancel everything don't cause us to use a session that no longer
- * exists... */
- process_pending_messages (session);
- session->last_activity = GNUNET_TIME_absolute_get ();
- pid = session->target;
- /* we'll now call callbacks that may cancel the session; hence
- * we should not use 'session' after this point */
- while (NULL != (pos = hd))
- {
- GNUNET_CONTAINER_DLL_remove (hd, tl, pos);
- if (NULL != pos->transmit_cont)
- pos->transmit_cont (pos->transmit_cont_cls,
- &pid,
- GNUNET_OK,
- pos->message_size,
- pos->message_size); /* FIXME: include TCP overhead
*/
- GNUNET_free (pos);
- }
- GNUNET_assert (NULL == hd);
- GNUNET_assert (NULL == tl);
- GNUNET_STATISTICS_update (plugin->env->stats,
- gettext_noop ("# bytes currently in TCP buffers"),
- -(int64_t) ret,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- gettext_noop ("# bytes transmitted via TCP"),
- ret,
- GNUNET_NO);
- return ret;
-}
-
-
-/**
- * If we have pending messages, ask the server to
- * transmit them (schedule the respective tasks, etc.)
- *
- * @param session for which session should we do this
- */
-static void
-process_pending_messages (struct GNUNET_ATS_Session *session)
-{
- struct PendingMessage *pm;
-
- GNUNET_assert (NULL != session->client);
- if (NULL != session->transmit_handle)
- return;
- if (NULL == (pm = session->pending_messages_head))
- return;
-
- session->transmit_handle =
- GNUNET_SERVER_notify_transmit_ready (session->client,
- pm->message_size,
- GNUNET_TIME_absolute_get_remaining (
- pm->timeout),
- &do_transmit,
- session);
-}
-
-
-/**
- * Function that can be used by the transport service to transmit
- * a message using the plugin. Note that in the case of a
- * peer disconnecting, the continuation MUST be called
- * prior to the disconnect notification itself. This function
- * will be called with this peer's HELLO message to initiate
- * a fresh connection to another peer.
- *
- * @param cls closure
- * @param session which session must be used
- * @param msgbuf the message to transmit
- * @param msgbuf_size number of bytes in @a msgbuf
- * @param priority how important is the message (most plugins will
- * ignore message priority and just FIFO)
- * @param to how long to wait at most for the transmission (does not
- * require plugins to discard the message after the timeout,
- * just advisory for the desired delay; most plugins will ignore
- * this as well)
- * @param cont continuation to call once the message has
- * been transmitted (or if the transport is ready
- * for the next transmission call; or if the
- * peer disconnected...); can be NULL
- * @param cont_cls closure for @a cont
- * @return number of bytes used (on the physical network, with overheads);
- * -1 on hard errors (i.e. address invalid); 0 is a legal value
- * and does NOT mean that the message was not transmitted (DV)
- */
-static ssize_t
-tcp_plugin_send (void *cls,
- struct GNUNET_ATS_Session *session,
- const char *msgbuf,
- size_t msgbuf_size,
- unsigned int priority,
- struct GNUNET_TIME_Relative to,
- GNUNET_TRANSPORT_TransmitContinuation cont,
- void *cont_cls)
-{
- struct Plugin *plugin = cls;
- struct PendingMessage *pm;
-
- /* create new message entry */
- pm = GNUNET_malloc (sizeof(struct PendingMessage) + msgbuf_size);
- pm->msg = (const char *) &pm[1];
- GNUNET_memcpy (&pm[1], msgbuf, msgbuf_size);
- pm->message_size = msgbuf_size;
- pm->timeout = GNUNET_TIME_relative_to_absolute (to);
- pm->transmit_cont = cont;
- pm->transmit_cont_cls = cont_cls;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Asked to transmit %lu bytes to `%s', added message to list.\n",
- (unsigned long) msgbuf_size,
- GNUNET_i2s (&session->target));
-
- if (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_contains_value (plugin->sessionmap,
- &session->target,
- session))
- {
- GNUNET_assert (NULL != session->client);
- GNUNET_SERVER_client_set_timeout (session->client,
-
GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
- GNUNET_STATISTICS_update (plugin->env->stats,
- gettext_noop ("# bytes currently in TCP
buffers"),
- msgbuf_size,
- GNUNET_NO);
-
- /* append pm to pending_messages list */
- GNUNET_CONTAINER_DLL_insert_tail (session->pending_messages_head,
- session->pending_messages_tail,
- pm);
- notify_session_monitor (session->plugin,
- session,
- GNUNET_TRANSPORT_SS_UPDATE);
- session->msgs_in_queue++;
- session->bytes_in_queue += pm->message_size;
- process_pending_messages (session);
- return msgbuf_size;
- }
- if (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_contains_value (plugin->nat_wait_conns,
- &session->target,
- session))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "This NAT WAIT session for peer `%s' is not yet ready!\n",
- GNUNET_i2s (&session->target));
- GNUNET_STATISTICS_update (plugin->env->stats,
- gettext_noop ("# bytes currently in TCP
buffers"),
- msgbuf_size,
- GNUNET_NO);
- /* append pm to pending_messages list */
- GNUNET_CONTAINER_DLL_insert_tail (session->pending_messages_head,
- session->pending_messages_tail,
- pm);
- session->msgs_in_queue++;
- session->bytes_in_queue += pm->message_size;
- notify_session_monitor (session->plugin,
- session,
- GNUNET_TRANSPORT_SS_HANDSHAKE);
- return msgbuf_size;
- }
- LOG (GNUNET_ERROR_TYPE_ERROR, "Invalid session %p\n", session);
- if (NULL != cont)
- cont (cont_cls, &session->target, GNUNET_SYSERR, pm->message_size, 0);
- GNUNET_break (0);
- GNUNET_free (pm);
- return GNUNET_SYSERR; /* session does not exist here */
-}
-
-
-/**
- * Closure for #session_lookup_it().
- */
-struct GNUNET_ATS_SessionItCtx
-{
- /**
- * Address we are looking for.
- */
- const struct GNUNET_HELLO_Address *address;
-
- /**
- * Where to store the session (if we found it).
- */
- struct GNUNET_ATS_Session *result;
-};
-
-
-/**
- * Look for a session by address.
- *
- * @param cls the `struct GNUNET_ATS_SessionItCtx`
- * @param key unused
- * @param value a `struct GNUNET_ATS_Session`
- * @return #GNUNET_YES to continue looking, #GNUNET_NO if we found the session
- */
-static int
-session_lookup_it (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct GNUNET_ATS_SessionItCtx *si_ctx = cls;
- struct GNUNET_ATS_Session *session = value;
-
- if (0 != GNUNET_HELLO_address_cmp (si_ctx->address, session->address))
- return GNUNET_YES;
- si_ctx->result = session;
- return GNUNET_NO;
-}
-
-
-/**
- * Task cleaning up a NAT connection attempt after timeout
- *
- * @param cls the `struct GNUNET_ATS_Session`
- */
-static void
-nat_connect_timeout (void *cls)
-{
- struct GNUNET_ATS_Session *session = cls;
-
- session->nat_connection_timeout = NULL;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "NAT WAIT connection to `%4s' at `%s' could not be established,
removing session\n",
- GNUNET_i2s (&session->target),
- tcp_plugin_address_to_string (session->plugin,
- session->address->address,
- session->address->address_length));
- tcp_plugin_disconnect_session (session->plugin, session);
-}
-
-
-/**
- * Function that will be called whenever the transport service wants to
- * notify the plugin that a session is still active and in use and
- * therefore the session timeout for this session has to be updated
- *
- * @param cls closure
- * @param peer which peer was the session for
- * @param session which session is being updated
- */
-static void
-tcp_plugin_update_session_timeout (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- struct GNUNET_ATS_Session *session)
-{
- reschedule_session_timeout (session);
-}
-
-
-/**
- * Task to signal the server that we can continue
- * receiving from the TCP client now.
- *
- * @param cls the `struct GNUNET_ATS_Session *`
- */
-static void
-delayed_done (void *cls)
-{
- struct GNUNET_ATS_Session *session = cls;
-
- session->receive_delay_task = NULL;
- reschedule_session_timeout (session);
- GNUNET_SERVER_receive_done (session->client, GNUNET_OK);
-}
-
-
-/**
- * Function that will be called whenever the transport service wants to
- * notify the plugin that the inbound quota changed and that the plugin
- * should update it's delay for the next receive value
- *
- * @param cls closure
- * @param peer which peer was the session for
- * @param session which session is being updated
- * @param delay new delay to use for receiving
- */
-static void
-tcp_plugin_update_inbound_delay (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- struct GNUNET_ATS_Session *session,
- struct GNUNET_TIME_Relative delay)
-{
- if (NULL == session->receive_delay_task)
- return;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "New inbound delay %s\n",
- GNUNET_STRINGS_relative_time_to_string (delay, GNUNET_NO));
- session->receive_delay = GNUNET_TIME_relative_to_absolute (delay);
- GNUNET_SCHEDULER_cancel (session->receive_delay_task);
- session->receive_delay_task =
- GNUNET_SCHEDULER_add_delayed (delay, &delayed_done, session);
-}
-
-
-/**
- * Create a new session to transmit data to the target
- * This session will used to send data to this peer and the plugin will
- * notify us by calling the env->session_end function
- *
- * @param cls closure
- * @param address the address to use
- * @return the session if the address is valid, NULL otherwise
- */
-static struct GNUNET_ATS_Session *
-tcp_plugin_get_session (void *cls, const struct GNUNET_HELLO_Address *address)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_ATS_Session *session = NULL;
- int af;
- const void *sb;
- size_t sbs;
- struct GNUNET_CONNECTION_Handle *sa;
- struct sockaddr_in a4;
- struct sockaddr_in6 a6;
- const struct IPv4TcpAddress *t4;
- const struct IPv6TcpAddress *t6;
- unsigned int options;
- enum GNUNET_NetworkType net_type;
- unsigned int is_natd = GNUNET_NO;
- size_t addrlen;
-
-#ifdef TCP_STEALTH
- struct GNUNET_NETWORK_Handle *s;
-#endif
-
- addrlen = address->address_length;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Trying to get session for `%s' address of peer `%s'\n",
- tcp_plugin_address_to_string (plugin,
- address->address,
- address->address_length),
- GNUNET_i2s (&address->peer));
-
- if (GNUNET_HELLO_address_check_option (address,
- GNUNET_HELLO_ADDRESS_INFO_INBOUND))
- {
- GNUNET_break (0);
- return NULL;
- }
-
- /* look for existing session */
- if (GNUNET_YES == GNUNET_CONTAINER_multipeermap_contains (plugin->sessionmap,
- &address->peer))
- {
- struct GNUNET_ATS_SessionItCtx si_ctx;
-
- si_ctx.address = address;
- si_ctx.result = NULL;
- GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessionmap,
- &address->peer,
- &session_lookup_it,
- &si_ctx);
- if (NULL != si_ctx.result)
- {
- session = si_ctx.result;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Found existing session for `%s' address `%s'\n",
- GNUNET_i2s (&address->peer),
- tcp_plugin_address_to_string (plugin,
- address->address,
- address->address_length));
- return session;
- }
- /* This is a bit of a hack, limiting TCP to never allow more than
- one TCP connection to any given peer at the same time.
- Without this, peers sometimes disagree about which of the TCP
- connections they should use, causing one side to believe that
- they transmit successfully, while the other receives nothing. */return
NULL; /* Refuse to have more than one TCP connection per
- peer pair at the same time. */
- }
-
- if (addrlen == sizeof(struct IPv6TcpAddress))
- {
- GNUNET_assert (NULL != address->address); /* make static analysis happy */
- t6 = address->address;
- options = t6->options;
- af = AF_INET6;
- memset (&a6, 0, sizeof(a6));
-#if HAVE_SOCKADDR_IN_SIN_LEN
- a6.sin6_len = sizeof(a6);
-#endif
- a6.sin6_family = AF_INET6;
- a6.sin6_port = t6->t6_port;
- if (t6->t6_port == 0)
- is_natd = GNUNET_YES;
- GNUNET_memcpy (&a6.sin6_addr, &t6->ipv6_addr, sizeof(struct in6_addr));
- sb = &a6;
- sbs = sizeof(a6);
- }
- else if (addrlen == sizeof(struct IPv4TcpAddress))
- {
- GNUNET_assert (NULL != address->address); /* make static analysis happy */
- t4 = address->address;
- options = t4->options;
- af = AF_INET;
- memset (&a4, 0, sizeof(a4));
-#if HAVE_SOCKADDR_IN_SIN_LEN
- a4.sin_len = sizeof(a4);
-#endif
- a4.sin_family = AF_INET;
- a4.sin_port = t4->t4_port;
- if (t4->t4_port == 0)
- is_natd = GNUNET_YES;
- a4.sin_addr.s_addr = t4->ipv4_addr;
- sb = &a4;
- sbs = sizeof(a4);
- }
- else
- {
- GNUNET_STATISTICS_update (
- plugin->env->stats,
- gettext_noop ("# requests to create session with invalid address"),
- 1,
- GNUNET_NO);
- return NULL;
- }
-
- net_type = plugin->env->get_address_type (plugin->env->cls, sb, sbs);
- GNUNET_break (net_type != GNUNET_NT_UNSPECIFIED);
-
- if ((is_natd == GNUNET_YES) && (addrlen == sizeof(struct IPv6TcpAddress)))
- {
- /* NAT client only works with IPv4 addresses */
- return NULL;
- }
-
- if (plugin->cur_connections >= plugin->max_connections)
- {
- /* saturated */
- return NULL;
- }
-
- if ((is_natd == GNUNET_YES) &&
- (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_contains (plugin->nat_wait_conns,
- &address->peer)))
- {
- /* Only do one NAT punch attempt per peer identity */
- return NULL;
- }
-
- if ((is_natd == GNUNET_YES) && (NULL != plugin->nat) &&
- (GNUNET_NO ==
- GNUNET_CONTAINER_multipeermap_contains (plugin->nat_wait_conns,
- &address->peer)))
- {
- struct sockaddr_in local_sa;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Found valid IPv4 NAT address (creating session)!\n");
- session = create_session (plugin, address, net_type, NULL, GNUNET_YES);
- session->nat_connection_timeout =
- GNUNET_SCHEDULER_add_delayed (NAT_TIMEOUT, &nat_connect_timeout,
session);
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_put (
- plugin->nat_wait_conns,
- &session->target,
- session,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Created NAT WAIT connection to `%s' at `%s'\n",
- GNUNET_i2s (&session->target),
- GNUNET_a2s (sb, sbs));
- memset (&local_sa, 0, sizeof(local_sa));
- local_sa.sin_family = AF_INET;
- local_sa.sin_port = htons (plugin->open_port);
- /* We leave sin_address at 0, let the kernel figure it out,
- even if our bind() is more specific. (May want to reconsider
- later.) */
- if (GNUNET_OK == GNUNET_NAT_request_reversal (plugin->nat, &local_sa, &a4))
- return session;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Running NAT client for `%s' at `%s' failed\n",
- GNUNET_i2s (&session->target),
- GNUNET_a2s (sb, sbs));
- tcp_plugin_disconnect_session (plugin, session);
- return NULL;
- }
-
- /* create new outbound session */
- if (0 != (options & TCP_OPTIONS_TCP_STEALTH))
- {
-#ifdef TCP_STEALTH
- s = GNUNET_NETWORK_socket_create (af, SOCK_STREAM, 0);
- if (NULL == s)
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
- "socket");
- sa = NULL;
- }
- else
- {
- if ((GNUNET_OK !=
- GNUNET_NETWORK_socket_setsockopt (s,
- IPPROTO_TCP,
- TCP_STEALTH,
- &session->target,
- sizeof(
- struct GNUNET_PeerIdentity))) ||
- (GNUNET_OK !=
- GNUNET_NETWORK_socket_setsockopt (s,
- IPPROTO_TCP,
- TCP_STEALTH_INTEGRITY,
- &plugin->my_welcome,
- sizeof(struct WelcomeMessage))))
- {
- /* TCP STEALTH not supported by kernel */
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (s));
- sa = NULL;
- }
- else
- {
- sa = GNUNET_CONNECTION_connect_socket (s, sb, sbs);
- }
- }
-#else
- sa = NULL;
-#endif
- }
- else
- {
- sa = GNUNET_CONNECTION_create_from_sockaddr (af, sb, sbs);
- }
- if (NULL == sa)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Failed to create connection to `%s' at `%s'\n",
- GNUNET_i2s (&address->peer),
- GNUNET_a2s (sb, sbs));
- return NULL;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Asked to transmit to `%s', creating fresh session using address
`%s'.\n",
- GNUNET_i2s (&address->peer),
- GNUNET_a2s (sb, sbs));
-
- session = create_session (plugin,
- address,
- net_type,
- GNUNET_SERVER_connect_socket (plugin->server, sa),
- GNUNET_NO);
- (void) GNUNET_CONTAINER_multipeermap_put (
- plugin->sessionmap,
- &session->target,
- session,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
- /* Send TCP Welcome */
- process_pending_messages (session);
-
- return session;
-}
-
-
-/**
- * We have been asked to destroy all connections to a particular peer.
- * This function is called on each applicable session and must tear it
- * down.
- *
- * @param cls the `struct Plugin *`
- * @param key the peer which the session belongs to (unused)
- * @param value the `struct GNUNET_ATS_Session`
- * @return #GNUNET_YES (continue to iterate)
- */
-static int
-session_disconnect_it (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_ATS_Session *session = value;
-
- GNUNET_STATISTICS_update (session->plugin->env->stats,
- gettext_noop (
- "# transport-service disconnect requests for
TCP"),
- 1,
- GNUNET_NO);
- tcp_plugin_disconnect_session (plugin, session);
- return GNUNET_YES;
-}
-
-
-/**
- * Function that can be called to force a disconnect from the
- * specified neighbour. This should also cancel all previously
- * scheduled transmissions. Obviously the transmission may have been
- * partially completed already, which is OK. The plugin is supposed
- * to close the connection (if applicable) and no longer call the
- * transmit continuation(s).
- *
- * Finally, plugin MUST NOT call the services's receive function to
- * notify the service that the connection to the specified target was
- * closed after a getting this call.
- *
- * @param cls closure
- * @param target peer for which the last transmission is
- * to be cancelled
- */
-static void
-tcp_plugin_disconnect (void *cls, const struct GNUNET_PeerIdentity *target)
-{
- struct Plugin *plugin = cls;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Disconnecting peer `%s'\n",
- GNUNET_i2s (target));
- GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessionmap,
- target,
- &session_disconnect_it,
- plugin);
- GNUNET_CONTAINER_multipeermap_get_multiple (plugin->nat_wait_conns,
- target,
- &session_disconnect_it,
- plugin);
-}
-
-
-/**
- * We are processing an address pretty printing request and finished
- * the IP resolution (if applicable). Append our port and forward the
- * result. If called with @a hostname NULL, we are done and should
- * clean up the pretty printer (otherwise, there might be multiple
- * hostnames for the IP address and we might receive more).
- *
- * @param cls the `struct PrettyPrinterContext *`
- * @param hostname hostname part of the address
- */
-static void
-append_port (void *cls, const char *hostname)
-{
- struct PrettyPrinterContext *ppc = cls;
- struct Plugin *plugin = ppc->plugin;
- char *ret;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "append_port called with hostname `%s'\n",
- hostname);
- if (NULL == hostname)
- {
- /* Final call, done */
- ppc->resolver_handle = NULL;
- GNUNET_CONTAINER_DLL_remove (plugin->ppc_dll_head,
- plugin->ppc_dll_tail,
- ppc);
- ppc->asc (ppc->asc_cls, NULL, GNUNET_OK);
- GNUNET_free (ppc);
- return;
- }
- if (GNUNET_YES == ppc->ipv6)
- GNUNET_asprintf (&ret,
- "%s.%u.[%s]:%d",
- PLUGIN_NAME,
- ppc->options,
- hostname,
- ppc->port);
- else
- GNUNET_asprintf (&ret,
- "%s.%u.%s:%d",
- PLUGIN_NAME,
- ppc->options,
- hostname,
- ppc->port);
- ppc->asc (ppc->asc_cls, ret, GNUNET_OK);
- GNUNET_free (ret);
-}
-
-
-/**
- * Convert the transports address to a nice, human-readable format.
- *
- * @param cls closure with the `struct Plugin`
- * @param type name of the transport that generated the address
- * @param addr one of the addresses of the host, NULL for the last address
- * the specific address format depends on the transport
- * @param addrlen length of the @a addr
- * @param numeric should (IP) addresses be displayed in numeric form?
- * @param timeout after how long should we give up?
- * @param asc function to call on each string
- * @param asc_cls closure for @a asc
- */
-static void
-tcp_plugin_address_pretty_printer (void *cls,
- const char *type,
- const void *addr,
- size_t addrlen,
- int numeric,
- struct GNUNET_TIME_Relative timeout,
- GNUNET_TRANSPORT_AddressStringCallback asc,
- void *asc_cls)
-{
- struct Plugin *plugin = cls;
- struct PrettyPrinterContext *ppc;
- const void *sb;
- size_t sbs;
- struct sockaddr_in a4;
- struct sockaddr_in6 a6;
- const struct IPv4TcpAddress *t4;
- const struct IPv6TcpAddress *t6;
- uint16_t port;
- uint32_t options;
-
- if (sizeof(struct IPv6TcpAddress) == addrlen)
- {
- t6 = addr;
- memset (&a6, 0, sizeof(a6));
- a6.sin6_family = AF_INET6;
- a6.sin6_port = t6->t6_port;
- GNUNET_memcpy (&a6.sin6_addr, &t6->ipv6_addr, sizeof(struct in6_addr));
- port = ntohs (t6->t6_port);
- options = ntohl (t6->options);
- sb = &a6;
- sbs = sizeof(a6);
- }
- else if (sizeof(struct IPv4TcpAddress) == addrlen)
- {
- t4 = addr;
- memset (&a4, 0, sizeof(a4));
- a4.sin_family = AF_INET;
- a4.sin_port = t4->t4_port;
- a4.sin_addr.s_addr = t4->ipv4_addr;
- port = ntohs (t4->t4_port);
- options = ntohl (t4->options);
- sb = &a4;
- sbs = sizeof(a4);
- }
- else
- {
- /* invalid address */
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ ("Unexpected address length: %u bytes\n"),
- (unsigned int) addrlen);
- asc (asc_cls, NULL, GNUNET_SYSERR);
- asc (asc_cls, NULL, GNUNET_OK);
- return;
- }
- ppc = GNUNET_new (struct PrettyPrinterContext);
- ppc->plugin = plugin;
- if (addrlen == sizeof(struct IPv6TcpAddress))
- ppc->ipv6 = GNUNET_YES;
- else
- ppc->ipv6 = GNUNET_NO;
- ppc->asc = asc;
- ppc->asc_cls = asc_cls;
- ppc->port = port;
- ppc->options = options;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting DNS reverse lookup\n");
- ppc->resolver_handle = GNUNET_RESOLVER_hostname_get (sb,
- sbs,
- ! numeric,
- timeout,
- &append_port,
- ppc);
- if (NULL == ppc->resolver_handle)
- {
- GNUNET_break (0);
- GNUNET_free (ppc);
- return;
- }
- GNUNET_CONTAINER_DLL_insert (plugin->ppc_dll_head, plugin->ppc_dll_tail,
ppc);
-}
-
-
-/**
- * Function that will be called to check if a binary address for this
- * plugin is well-formed and corresponds to an address for THIS peer
- * (as per our configuration). Naturally, if absolutely necessary,
- * plugins can be a bit conservative in their answer, but in general
- * plugins should make sure that the address does not redirect
- * traffic to a 3rd party that might try to man-in-the-middle our
- * traffic.
- *
- * @param cls closure, our `struct Plugin *`
- * @param addr pointer to the address
- * @param addrlen length of @a addr
- * @return #GNUNET_OK if this is a plausible address for this peer
- * and transport, #GNUNET_SYSERR if not
- */
-static int
-tcp_plugin_check_address (void *cls, const void *addr, size_t addrlen)
-{
- struct Plugin *plugin = cls;
- const struct IPv4TcpAddress *v4;
- const struct IPv6TcpAddress *v6;
-
- if ((addrlen != sizeof(struct IPv4TcpAddress)) &&
- (addrlen != sizeof(struct IPv6TcpAddress)))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
-
- if (addrlen == sizeof(struct IPv4TcpAddress))
- {
- struct sockaddr_in s4;
-
- v4 = (const struct IPv4TcpAddress *) addr;
- if (0 != memcmp (&v4->options, &plugin->myoptions, sizeof(uint32_t)))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- memset (&s4, 0, sizeof(s4));
- s4.sin_family = AF_INET;
-#if HAVE_SOCKADDR_IN_SIN_LEN
- s4.sin_len = sizeof(s4);
-#endif
- s4.sin_port = v4->t4_port;
- s4.sin_addr.s_addr = v4->ipv4_addr;
-
- if (GNUNET_OK !=
- GNUNET_NAT_test_address (plugin->nat, &s4, sizeof(struct sockaddr_in)))
- return GNUNET_SYSERR;
- }
- else
- {
- struct sockaddr_in6 s6;
-
- v6 = (const struct IPv6TcpAddress *) addr;
- if (IN6_IS_ADDR_LINKLOCAL (&v6->ipv6_addr))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- if (0 != memcmp (&v6->options, &plugin->myoptions, sizeof(uint32_t)))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- memset (&s6, 0, sizeof(s6));
- s6.sin6_family = AF_INET6;
-#if HAVE_SOCKADDR_IN_SIN_LEN
- s6.sin6_len = sizeof(s6);
-#endif
- s6.sin6_port = v6->t6_port;
- s6.sin6_addr = v6->ipv6_addr;
-
- if (GNUNET_OK != GNUNET_NAT_test_address (plugin->nat,
- &s6,
- sizeof(struct sockaddr_in6)))
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * We've received a nat probe from this peer via TCP. Finish
- * creating the client session and resume sending of queued
- * messages.
- *
- * @param cls closure
- * @param client identification of the client
- * @param message the actual message
- */
-static void
-handle_tcp_nat_probe (void *cls,
- struct GNUNET_SERVER_Client *client,
- const struct GNUNET_MessageHeader *message)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_ATS_Session *session;
- const struct TCP_NAT_ProbeMessage *tcp_nat_probe;
- size_t alen;
- void *vaddr;
- struct IPv4TcpAddress *t4;
- struct IPv6TcpAddress *t6;
- const struct sockaddr_in *s4;
- const struct sockaddr_in6 *s6;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Received NAT probe\n");
- /* We have received a TCP NAT probe, meaning we (hopefully) initiated
- * a connection to this peer by running gnunet-nat-client. This peer
- * received the punch message and now wants us to use the new connection
- * as the default for that peer. Do so and then send a WELCOME message
- * so we can really be connected!
- */if (ntohs (message->size) != sizeof(struct TCP_NAT_ProbeMessage))
- {
- GNUNET_break_op (0);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
-
- tcp_nat_probe = (const struct TCP_NAT_ProbeMessage *) message;
- if (0 == memcmp (&tcp_nat_probe->clientIdentity,
- plugin->env->my_identity,
- sizeof(struct GNUNET_PeerIdentity)))
- {
- /* refuse connections from ourselves */
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
-
- session = GNUNET_CONTAINER_multipeermap_get (plugin->nat_wait_conns,
- &tcp_nat_probe->clientIdentity);
- if (NULL == session)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Did NOT find session for NAT probe!\n");
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Found session for NAT probe!\n");
-
- if (NULL != session->nat_connection_timeout)
- {
- GNUNET_SCHEDULER_cancel (session->nat_connection_timeout);
- session->nat_connection_timeout = NULL;
- }
-
- if (GNUNET_OK != GNUNET_SERVER_client_get_address (client, &vaddr, &alen))
- {
- GNUNET_break (0);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- tcp_plugin_disconnect_session (plugin, session);
- return;
- }
- GNUNET_assert (
- GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove (plugin->nat_wait_conns,
- &tcp_nat_probe->clientIdentity,
- session));
- GNUNET_SERVER_client_set_user_context (client, session);
- (void) GNUNET_CONTAINER_multipeermap_put (
- plugin->sessionmap,
- &session->target,
- session,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
- session->last_activity = GNUNET_TIME_absolute_get ();
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Found address `%s' for incoming connection\n",
- GNUNET_a2s (vaddr, alen));
- switch (((const struct sockaddr *) vaddr)->sa_family)
- {
- case AF_INET:
- s4 = vaddr;
- t4 = GNUNET_new (struct IPv4TcpAddress);
- t4->options = htonl (TCP_OPTIONS_NONE);
- t4->t4_port = s4->sin_port;
- t4->ipv4_addr = s4->sin_addr.s_addr;
- session->address =
- GNUNET_HELLO_address_allocate (&tcp_nat_probe->clientIdentity,
- PLUGIN_NAME,
- &t4,
- sizeof(struct IPv4TcpAddress),
- GNUNET_HELLO_ADDRESS_INFO_NONE);
- break;
-
- case AF_INET6:
- s6 = vaddr;
- t6 = GNUNET_new (struct IPv6TcpAddress);
- t6->options = htonl (TCP_OPTIONS_NONE);
- t6->t6_port = s6->sin6_port;
- GNUNET_memcpy (&t6->ipv6_addr, &s6->sin6_addr, sizeof(struct in6_addr));
- session->address =
- GNUNET_HELLO_address_allocate (&tcp_nat_probe->clientIdentity,
- PLUGIN_NAME,
- &t6,
- sizeof(struct IPv6TcpAddress),
- GNUNET_HELLO_ADDRESS_INFO_NONE);
- break;
-
- default:
- GNUNET_break_op (0);
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Bad address for incoming connection!\n");
- GNUNET_free (vaddr);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- tcp_plugin_disconnect_session (plugin, session);
- return;
- }
- GNUNET_free (vaddr);
- GNUNET_break (NULL == session->client);
- session->client = client;
- GNUNET_STATISTICS_update (plugin->env->stats,
- gettext_noop ("# TCP sessions active"),
- 1,
- GNUNET_NO);
- process_pending_messages (session);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
-}
-
-
-/**
- * We've received a welcome from this peer via TCP. Possibly create a
- * fresh client record and send back our welcome.
- *
- * @param cls closure
- * @param client identification of the client
- * @param message the actual message
- */
-static void
-handle_tcp_welcome (void *cls,
- struct GNUNET_SERVER_Client *client,
- const struct GNUNET_MessageHeader *message)
-{
- struct Plugin *plugin = cls;
- const struct WelcomeMessage *wm = (const struct WelcomeMessage *) message;
- struct GNUNET_HELLO_Address *address;
- struct GNUNET_ATS_Session *session;
- size_t alen;
- void *vaddr;
- struct IPv4TcpAddress t4;
- struct IPv6TcpAddress t6;
- const struct sockaddr_in *s4;
- const struct sockaddr_in6 *s6;
-
- if (0 == memcmp (&wm->clientIdentity,
- plugin->env->my_identity,
- sizeof(struct GNUNET_PeerIdentity)))
- {
- /* refuse connections from ourselves */
- if (GNUNET_OK == GNUNET_SERVER_client_get_address (client, &vaddr, &alen))
- {
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Received WELCOME message from my own identity `%s' on address
`%s'\n",
- GNUNET_i2s (&wm->clientIdentity),
- GNUNET_a2s (vaddr, alen));
- GNUNET_free (vaddr);
- }
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
-
- if (GNUNET_OK == GNUNET_SERVER_client_get_address (client, &vaddr, &alen))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received WELCOME message from `%s' on address `%s'\n",
- GNUNET_i2s (&wm->clientIdentity),
- GNUNET_a2s (vaddr, alen));
- GNUNET_free (vaddr);
- }
- GNUNET_STATISTICS_update (plugin->env->stats,
- gettext_noop ("# TCP WELCOME messages received"),
- 1,
- GNUNET_NO);
- session = lookup_session_by_client (plugin, client);
- if (NULL != session)
- {
- if (GNUNET_OK == GNUNET_SERVER_client_get_address (client, &vaddr, &alen))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Found existing session %p for peer `%s'\n",
- session,
- GNUNET_a2s (vaddr, alen));
- GNUNET_free (vaddr);
- }
- }
- else
- {
- if (GNUNET_OK == GNUNET_SERVER_client_get_address (client, &vaddr, &alen))
- {
- if (alen == sizeof(struct sockaddr_in))
- {
- s4 = vaddr;
- memset (&t4, '\0', sizeof(t4));
- t4.options = htonl (TCP_OPTIONS_NONE);
- t4.t4_port = s4->sin_port;
- t4.ipv4_addr = s4->sin_addr.s_addr;
- address =
- GNUNET_HELLO_address_allocate (&wm->clientIdentity,
- PLUGIN_NAME,
- &t4,
- sizeof(t4),
- GNUNET_HELLO_ADDRESS_INFO_INBOUND);
- }
- else if (alen == sizeof(struct sockaddr_in6))
- {
- s6 = vaddr;
- memset (&t6, '\0', sizeof(t6));
- t6.options = htonl (TCP_OPTIONS_NONE);
- t6.t6_port = s6->sin6_port;
- GNUNET_memcpy (&t6.ipv6_addr, &s6->sin6_addr, sizeof(struct in6_addr));
- address =
- GNUNET_HELLO_address_allocate (&wm->clientIdentity,
- PLUGIN_NAME,
- &t6,
- sizeof(t6),
- GNUNET_HELLO_ADDRESS_INFO_INBOUND);
- }
- else
- {
- GNUNET_break (0);
- GNUNET_free (vaddr);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- session = create_session (plugin,
- address,
- plugin->env->get_address_type
(plugin->env->cls,
- vaddr,
- alen),
- client,
- GNUNET_NO);
- GNUNET_break (GNUNET_NT_UNSPECIFIED != session->scope);
- GNUNET_HELLO_address_free (address);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Creating new%s session %p for peer `%s' client %p\n",
- GNUNET_HELLO_address_check_option (session->address,
-
GNUNET_HELLO_ADDRESS_INFO_INBOUND)
- ? " inbound"
- : "",
- session,
- tcp_plugin_address_to_string (plugin,
- session->address->address,
- session->address->address_length),
- client);
- GNUNET_free (vaddr);
- (void) GNUNET_CONTAINER_multipeermap_put (
- plugin->sessionmap,
- &session->target,
- session,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
- /* Notify transport and ATS about new session */
- plugin->env->session_start (plugin->env->cls,
- session->address,
- session,
- session->scope);
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Did not obtain TCP socket address for incoming connection\n");
- GNUNET_break (0);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- }
-
- if (GNUNET_YES != session->expecting_welcome)
- {
- GNUNET_break_op (0);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
- }
- session->last_activity = GNUNET_TIME_absolute_get ();
- session->expecting_welcome = GNUNET_NO;
-
- process_pending_messages (session);
- GNUNET_SERVER_client_set_timeout (client,
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
-}
-
-
-/**
- * We've received data for this peer via TCP. Unbox,
- * compute latency and forward.
- *
- * @param cls closure
- * @param client identification of the client
- * @param message the actual message
- */
-static void
-handle_tcp_data (void *cls,
- struct GNUNET_SERVER_Client *client,
- const struct GNUNET_MessageHeader *message)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_ATS_Session *session;
- struct GNUNET_TIME_Relative delay;
- uint16_t type;
-
- type = ntohs (message->type);
- if ((GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_WELCOME == type) ||
- (GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_NAT_PROBE == type))
- {
- /* We don't want to propagate WELCOME and NAT Probe messages up! */
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return;
- }
- session = lookup_session_by_client (plugin, client);
- if (NULL == session)
- {
- /* No inbound session found */
- void *vaddr = NULL;
- size_t alen;
-
- GNUNET_assert (GNUNET_OK ==
- GNUNET_SERVER_client_get_address (client, &vaddr, &alen));
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Received unexpected %u bytes of type %u from `%s'\n",
- (unsigned int) ntohs (message->size),
- (unsigned int) ntohs (message->type),
- GNUNET_a2s (vaddr, alen));
- GNUNET_break_op (0);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- GNUNET_free (vaddr);
- return;
- }
- if (GNUNET_YES == session->expecting_welcome)
- {
- /* Session is expecting WELCOME message */
- void *vaddr = NULL;
- size_t alen;
-
- GNUNET_SERVER_client_get_address (client, &vaddr, &alen);
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Received unexpected %u bytes of type %u from `%s'\n",
- (unsigned int) ntohs (message->size),
- (unsigned int) ntohs (message->type),
- GNUNET_a2s (vaddr, alen));
- GNUNET_break_op (0);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- GNUNET_free (vaddr);
- return;
- }
-
- session->last_activity = GNUNET_TIME_absolute_get ();
- {
- void *vaddr = NULL;
- size_t alen;
-
- GNUNET_SERVER_client_get_address (client, &vaddr, &alen);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Passing %u bytes of type %u from `%s' at %s to transport service.\n",
- (unsigned int) ntohs (message->size),
- (unsigned int) ntohs (message->type),
- GNUNET_i2s (&session->target),
- GNUNET_a2s (vaddr, alen));
- GNUNET_free (vaddr);
- }
-
- GNUNET_STATISTICS_update (plugin->env->stats,
- gettext_noop ("# bytes received via TCP"),
- ntohs (message->size),
- GNUNET_NO);
-
- GNUNET_assert (
- GNUNET_CONTAINER_multipeermap_contains_value (plugin->sessionmap,
- &session->target,
- session));
- delay =
- plugin->env->receive (plugin->env->cls, session->address, session,
message);
- reschedule_session_timeout (session);
- if (0 == delay.rel_value_us)
- {
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Throttling receiving from `%s' for %s\n",
- GNUNET_i2s (&session->target),
- GNUNET_STRINGS_relative_time_to_string (delay, GNUNET_YES));
- GNUNET_SERVER_disable_receive_done_warning (client);
- GNUNET_assert (NULL == session->receive_delay_task);
- session->receive_delay_task =
- GNUNET_SCHEDULER_add_delayed (delay, &delayed_done, session);
- }
-}
-
-
-/**
- * Function called whenever a peer is connected on the "SERVER" level.
- * Increments number of active connections and suspends server if we
- * have reached the limit.
- *
- * @param cls closure
- * @param client identification of the client
- */
-static void
-connect_notify (void *cls, struct GNUNET_SERVER_Client *client)
-{
- struct Plugin *plugin = cls;
-
- if (NULL == client)
- return;
- plugin->cur_connections++;
- GNUNET_STATISTICS_set (plugin->env->stats,
- gettext_noop ("# TCP server connections active"),
- plugin->cur_connections,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- gettext_noop ("# TCP server connect events"),
- 1,
- GNUNET_NO);
- if (plugin->cur_connections != plugin->max_connections)
- return;
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- _ ("TCP connection limit reached, suspending server\n"));
- GNUNET_STATISTICS_update (plugin->env->stats,
- gettext_noop ("# TCP service suspended"),
- 1,
- GNUNET_NO);
- GNUNET_SERVER_suspend (
- plugin->server); /* Maximum number of connections rechead */
-}
-
-
-/**
- * Function called whenever a peer is disconnected on the "SERVER"
- * level. Cleans up the connection, decrements number of active
- * connections and if applicable resumes listening.
- *
- * @param cls closure
- * @param client identification of the client
- */
-static void
-disconnect_notify (void *cls, struct GNUNET_SERVER_Client *client)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_ATS_Session *session;
-
- if (NULL == client)
- return;
- GNUNET_assert (plugin->cur_connections >= 1);
- plugin->cur_connections--;
- session = lookup_session_by_client (plugin, client);
- if (NULL == session)
- return; /* unknown, nothing to do */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Destroying session of `%s' with %s due to network-level disconnect.\n",
- GNUNET_i2s (&session->target),
- tcp_plugin_address_to_string (session->plugin,
- session->address->address,
- session->address->address_length));
-
- if (plugin->cur_connections == plugin->max_connections)
- {
- GNUNET_STATISTICS_update (session->plugin->env->stats,
- gettext_noop ("# TCP service resumed"),
- 1,
- GNUNET_NO);
- GNUNET_SERVER_resume (plugin->server); /* Resume server */
- }
- GNUNET_STATISTICS_set (plugin->env->stats,
- gettext_noop ("# TCP server connections active"),
- plugin->cur_connections,
- GNUNET_NO);
- GNUNET_STATISTICS_update (session->plugin->env->stats,
- gettext_noop (
- "# network-level TCP disconnect events"),
- 1,
- GNUNET_NO);
- tcp_plugin_disconnect_session (plugin, session);
-}
-
-
-/**
- * We can now send a probe message, copy into buffer to really send.
- *
- * @param cls closure, a `struct TCPProbeContext`
- * @param size max size to copy
- * @param buf buffer to copy message to
- * @return number of bytes copied into @a buf
- */
-static size_t
-notify_send_probe (void *cls, size_t size, void *buf)
-{
- struct TCPProbeContext *tcp_probe_ctx = cls;
- struct Plugin *plugin = tcp_probe_ctx->plugin;
- size_t ret;
-
- tcp_probe_ctx->transmit_handle = NULL;
- GNUNET_CONTAINER_DLL_remove (plugin->probe_head,
- plugin->probe_tail,
- tcp_probe_ctx);
- if (NULL == buf)
- {
- GNUNET_CONNECTION_destroy (tcp_probe_ctx->sock);
- GNUNET_free (tcp_probe_ctx);
- return 0;
- }
- GNUNET_assert (size >= sizeof(tcp_probe_ctx->message));
- GNUNET_memcpy (buf, &tcp_probe_ctx->message, sizeof(tcp_probe_ctx->message));
- GNUNET_SERVER_connect_socket (tcp_probe_ctx->plugin->server,
- tcp_probe_ctx->sock);
- ret = sizeof(tcp_probe_ctx->message);
- GNUNET_free (tcp_probe_ctx);
- return ret;
-}
-
-
-/**
- * Function called by the NAT subsystem suggesting another peer wants
- * to connect to us via connection reversal. Try to connect back to the
- * given IP.
- *
- * @param cls closure
- * @param addr address to try
- * @param addrlen number of bytes in @a addr
- */
-static void
-try_connection_reversal (void *cls,
- const struct sockaddr *addr,
- socklen_t addrlen)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_CONNECTION_Handle *sock;
- struct TCPProbeContext *tcp_probe_ctx;
-
- /**
- * We have received an ICMP response, ostensibly from a peer
- * that wants to connect to us! Send a message to establish a connection.
- */
- sock = GNUNET_CONNECTION_create_from_sockaddr (AF_INET, addr, addrlen);
- if (NULL == sock)
- {
- /* failed for some odd reason (out of sockets?); ignore attempt */
- return;
- }
-
- tcp_probe_ctx = GNUNET_new (struct TCPProbeContext);
- tcp_probe_ctx->message.header.size =
- htons (sizeof(struct TCP_NAT_ProbeMessage));
- tcp_probe_ctx->message.header.type =
- htons (GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_NAT_PROBE);
- tcp_probe_ctx->message.clientIdentity = *plugin->env->my_identity;
- tcp_probe_ctx->plugin = plugin;
- tcp_probe_ctx->sock = sock;
- GNUNET_CONTAINER_DLL_insert (plugin->probe_head,
- plugin->probe_tail,
- tcp_probe_ctx);
- tcp_probe_ctx->transmit_handle =
- GNUNET_CONNECTION_notify_transmit_ready (sock,
- ntohs (tcp_probe_ctx->message
- .header.size),
- GNUNET_TIME_UNIT_FOREVER_REL,
- ¬ify_send_probe,
- tcp_probe_ctx);
-}
-
-
-/**
- * Function obtain the network type for a session
- *
- * @param cls closure (`struct Plugin *`)
- * @param session the session
- * @return the network type in HBO or #GNUNET_SYSERR
- */
-static enum GNUNET_NetworkType
-tcp_plugin_get_network (void *cls, struct GNUNET_ATS_Session *session)
-{
- return session->scope;
-}
-
-
-/**
- * Function obtain the network type for an address.
- *
- * @param cls closure (`struct Plugin *`)
- * @param address the address
- * @return the network type
- */
-static enum GNUNET_NetworkType
-tcp_plugin_get_network_for_address (void *cls,
- const struct GNUNET_HELLO_Address *address)
-{
- struct Plugin *plugin = cls;
- size_t addrlen;
- struct sockaddr_in a4;
- struct sockaddr_in6 a6;
- const struct IPv4TcpAddress *t4;
- const struct IPv6TcpAddress *t6;
- const void *sb;
- size_t sbs;
-
- addrlen = address->address_length;
- if (addrlen == sizeof(struct IPv6TcpAddress))
- {
- GNUNET_assert (NULL != address->address); /* make static analysis happy */
- t6 = address->address;
- memset (&a6, 0, sizeof(a6));
-#if HAVE_SOCKADDR_IN_SIN_LEN
- a6.sin6_len = sizeof(a6);
-#endif
- a6.sin6_family = AF_INET6;
- a6.sin6_port = t6->t6_port;
- GNUNET_memcpy (&a6.sin6_addr, &t6->ipv6_addr, sizeof(struct in6_addr));
- sb = &a6;
- sbs = sizeof(a6);
- }
- else if (addrlen == sizeof(struct IPv4TcpAddress))
- {
- GNUNET_assert (NULL != address->address); /* make static analysis happy */
- t4 = address->address;
- memset (&a4, 0, sizeof(a4));
-#if HAVE_SOCKADDR_IN_SIN_LEN
- a4.sin_len = sizeof(a4);
-#endif
- a4.sin_family = AF_INET;
- a4.sin_port = t4->t4_port;
- a4.sin_addr.s_addr = t4->ipv4_addr;
- sb = &a4;
- sbs = sizeof(a4);
- }
- else
- {
- GNUNET_break (0);
- return GNUNET_NT_UNSPECIFIED;
- }
- return plugin->env->get_address_type (plugin->env->cls, sb, sbs);
-}
-
-
-/**
- * Return information about the given session to the
- * monitor callback.
- *
- * @param cls the `struct Plugin` with the monitor callback (`sic`)
- * @param peer peer we send information about
- * @param value our `struct GNUNET_ATS_Session` to send information about
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-send_session_info_iter (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *value)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_ATS_Session *session = value;
-
- notify_session_monitor (plugin, session, GNUNET_TRANSPORT_SS_INIT);
- /* FIXME: cannot tell if this is up or not from current
- session state... */
- notify_session_monitor (plugin, session, GNUNET_TRANSPORT_SS_UP);
- return GNUNET_OK;
-}
-
-
-/**
- * Begin monitoring sessions of a plugin. There can only
- * be one active monitor per plugin (i.e. if there are
- * multiple monitors, the transport service needs to
- * multiplex the generated events over all of them).
- *
- * @param cls closure of the plugin
- * @param sic callback to invoke, NULL to disable monitor;
- * plugin will being by iterating over all active
- * sessions immediately and then enter monitor mode
- * @param sic_cls closure for @a sic
- */
-static void
-tcp_plugin_setup_monitor (void *cls,
- GNUNET_TRANSPORT_SessionInfoCallback sic,
- void *sic_cls)
-{
- struct Plugin *plugin = cls;
-
- plugin->sic = sic;
- plugin->sic_cls = sic_cls;
- if (NULL != sic)
- {
- GNUNET_CONTAINER_multipeermap_iterate (plugin->sessionmap,
- &send_session_info_iter,
- plugin);
- /* signal end of first iteration */
- sic (sic_cls, NULL, NULL);
- }
-}
-
-
-/**
- * Entry point for the plugin.
- *
- * @param cls closure, the `struct GNUNET_TRANSPORT_PluginEnvironment *`
- * @return the `struct GNUNET_TRANSPORT_PluginFunctions *` or NULL on error
- */
-void *
-libgnunet_plugin_transport_tcp_init (void *cls)
-{
- static const struct GNUNET_SERVER_MessageHandler my_handlers[] =
- { { &handle_tcp_welcome,
- NULL,
- GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_WELCOME,
- sizeof(struct WelcomeMessage) },
- { &handle_tcp_nat_probe,
- NULL,
- GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_NAT_PROBE,
- sizeof(struct TCP_NAT_ProbeMessage) },
- { &handle_tcp_data, NULL, GNUNET_MESSAGE_TYPE_ALL, 0 },
- { NULL, NULL, 0, 0 } };
- struct GNUNET_TRANSPORT_PluginEnvironment *env = cls;
- struct GNUNET_TRANSPORT_PluginFunctions *api;
- struct Plugin *plugin;
- struct LEGACY_SERVICE_Context *service;
- unsigned long long aport;
- unsigned long long bport;
- unsigned long long max_connections;
- unsigned int i;
- struct GNUNET_TIME_Relative idle_timeout;
-
-#ifdef TCP_STEALTH
- struct GNUNET_NETWORK_Handle *const *lsocks;
-#endif
- int ret;
- int ret_s;
- struct sockaddr **addrs;
- socklen_t *addrlens;
-
- if (NULL == env->receive)
- {
- /* run in 'stub' mode (i.e. as part of gnunet-peerinfo), don't fully
- initialize the plugin or the API */
- api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
- api->cls = NULL;
- api->address_pretty_printer = &tcp_plugin_address_pretty_printer;
- api->address_to_string = &tcp_plugin_address_to_string;
- api->string_to_address = &tcp_plugin_string_to_address;
- return api;
- }
-
- GNUNET_assert (NULL != env->cfg);
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (env->cfg,
- "transport-tcp",
- "MAX_CONNECTIONS",
- &max_connections))
- max_connections = 128;
-
- aport = 0;
- if ((GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (env->cfg,
- "transport-tcp",
- "PORT",
- &bport)) ||
- (bport > 65535) ||
- ((GNUNET_OK == GNUNET_CONFIGURATION_get_value_number (env->cfg,
- "transport-tcp",
- "ADVERTISED-PORT",
- &aport)) &&
- (aport > 65535)))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Require valid port number for service `%s' in configuration!\n"),
- "transport-tcp");
- return NULL;
- }
- if (0 == aport)
- aport = bport;
- if (0 == bport)
- aport = 0;
- if (0 != bport)
- {
- service = LEGACY_SERVICE_start ("transport-tcp",
- env->cfg,
- LEGACY_SERVICE_OPTION_NONE);
- if (NULL == service)
- {
- LOG (GNUNET_ERROR_TYPE_WARNING, _ ("Failed to start service.\n"));
- return NULL;
- }
- }
- else
- service = NULL;
-
- api = NULL;
- plugin = GNUNET_new (struct Plugin);
- plugin->sessionmap =
- GNUNET_CONTAINER_multipeermap_create (max_connections, GNUNET_YES);
- plugin->max_connections = max_connections;
- plugin->open_port = bport;
- plugin->adv_port = aport;
- plugin->env = env;
- plugin->my_welcome.header.size = htons (sizeof(struct WelcomeMessage));
- plugin->my_welcome.header.type =
- htons (GNUNET_MESSAGE_TYPE_TRANSPORT_TCP_WELCOME);
- plugin->my_welcome.clientIdentity = *plugin->env->my_identity;
-
- if ((NULL != service) &&
- (GNUNET_YES == GNUNET_CONFIGURATION_get_value_yesno (env->cfg,
- "transport-tcp",
- "TCP_STEALTH")))
- {
-#ifdef TCP_STEALTH
- plugin->myoptions |= TCP_OPTIONS_TCP_STEALTH;
- lsocks = LEGACY_SERVICE_get_listen_sockets (service);
- if (NULL != lsocks)
- {
- uint32_t len = sizeof(struct WelcomeMessage);
-
- for (i = 0; NULL != lsocks[i]; i++)
- {
- if (
- (GNUNET_OK !=
- GNUNET_NETWORK_socket_setsockopt (lsocks[i],
- IPPROTO_TCP,
- TCP_STEALTH,
- env->my_identity,
- sizeof(
- struct GNUNET_PeerIdentity))) ||
- (GNUNET_OK !=
- GNUNET_NETWORK_socket_setsockopt (lsocks[i],
- IPPROTO_TCP,
- TCP_STEALTH_INTEGRITY_LEN,
- &len,
- sizeof(len))))
- {
- /* TCP STEALTH not supported by kernel */
- GNUNET_assert (0 == i);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("TCP_STEALTH not supported on this platform.\n"));
- goto die;
- }
- }
- }
-#else
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("TCP_STEALTH not supported on this platform.\n"));
- goto die;
-#endif
- }
-
- if ((NULL != service) &&
- (GNUNET_SYSERR !=
- (ret_s =
- get_server_addresses ("transport-tcp", env->cfg, &addrs,
&addrlens))))
- {
- for (ret = ret_s - 1; ret >= 0; ret--)
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Binding to address `%s'\n",
- GNUNET_a2s (addrs[ret], addrlens[ret]));
- plugin->nat = GNUNET_NAT_register (env->cfg,
- "transport-tcp",
- IPPROTO_TCP,
- (unsigned int) ret_s,
- (const struct sockaddr **) addrs,
- addrlens,
- &tcp_nat_port_map_callback,
- &try_connection_reversal,
- plugin);
- for (ret = ret_s - 1; ret >= 0; ret--)
- GNUNET_free (addrs[ret]);
- GNUNET_free (addrs);
- GNUNET_free (addrlens);
- }
- else
- {
- plugin->nat = GNUNET_NAT_register (plugin->env->cfg,
- "transport-tcp",
- IPPROTO_TCP,
- 0,
- NULL,
- NULL,
- NULL,
- &try_connection_reversal,
- plugin);
- }
- api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
- api->cls = plugin;
- api->send = &tcp_plugin_send;
- api->get_session = &tcp_plugin_get_session;
- api->disconnect_session = &tcp_plugin_disconnect_session;
- api->query_keepalive_factor = &tcp_plugin_query_keepalive_factor;
- api->disconnect_peer = &tcp_plugin_disconnect;
- api->address_pretty_printer = &tcp_plugin_address_pretty_printer;
- api->check_address = &tcp_plugin_check_address;
- api->address_to_string = &tcp_plugin_address_to_string;
- api->string_to_address = &tcp_plugin_string_to_address;
- api->get_network = &tcp_plugin_get_network;
- api->get_network_for_address = &tcp_plugin_get_network_for_address;
- api->update_session_timeout = &tcp_plugin_update_session_timeout;
- api->update_inbound_delay = &tcp_plugin_update_inbound_delay;
- api->setup_monitor = &tcp_plugin_setup_monitor;
- plugin->service = service;
- if (NULL != service)
- {
- plugin->server = LEGACY_SERVICE_get_server (service);
- }
- else
- {
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_time (env->cfg,
- "transport-tcp",
- "TIMEOUT",
- &idle_timeout))
- {
- GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
- "transport-tcp",
- "TIMEOUT");
- goto die;
- }
- plugin->server = GNUNET_SERVER_create_with_sockets (NULL,
- plugin,
- NULL,
- idle_timeout,
- GNUNET_YES);
- }
- plugin->handlers = GNUNET_malloc (sizeof(my_handlers));
- GNUNET_memcpy (plugin->handlers, my_handlers, sizeof(my_handlers));
- for (i = 0;
- i < sizeof(my_handlers) / sizeof(struct GNUNET_SERVER_MessageHandler);
- i++)
- plugin->handlers[i].callback_cls = plugin;
-
- GNUNET_SERVER_add_handlers (plugin->server, plugin->handlers);
- GNUNET_SERVER_connect_notify (plugin->server, &connect_notify, plugin);
- GNUNET_SERVER_disconnect_notify (plugin->server, &disconnect_notify, plugin);
- plugin->nat_wait_conns =
- GNUNET_CONTAINER_multipeermap_create (16, GNUNET_YES);
- if (0 != bport)
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ ("TCP transport listening on port %llu\n"),
- bport);
- else
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ ("TCP transport not listening on any port (client only)\n"));
- if ((aport != bport) && (0 != bport))
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ ("TCP transport advertises itself as being on port %llu\n"),
- aport);
- /* Initially set connections to 0 */
- GNUNET_STATISTICS_set (plugin->env->stats,
- gettext_noop ("# TCP sessions active"),
- 0,
- GNUNET_NO);
- return api;
-
-die:
- if (NULL != plugin->nat)
- GNUNET_NAT_unregister (plugin->nat);
- GNUNET_CONTAINER_multipeermap_destroy (plugin->sessionmap);
- if (NULL != service)
- LEGACY_SERVICE_stop (service);
- GNUNET_free (plugin);
- GNUNET_free (api);
- return NULL;
-}
-
-
-/**
- * Exit point from the plugin.
- *
- * @param cls the `struct GNUNET_TRANSPORT_PluginFunctions`
- * @return NULL
- */
-void *
-libgnunet_plugin_transport_tcp_done (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
- struct Plugin *plugin = api->cls;
- struct TCPProbeContext *tcp_probe;
- struct PrettyPrinterContext *cur;
- struct PrettyPrinterContext *next;
-
- if (NULL == plugin)
- {
- GNUNET_free (api);
- return NULL;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Shutting down TCP plugin\n");
-
- /* Removing leftover sessions */
- GNUNET_CONTAINER_multipeermap_iterate (plugin->sessionmap,
- &session_disconnect_it,
- plugin);
- /* Removing leftover NAT sessions */
- GNUNET_CONTAINER_multipeermap_iterate (plugin->nat_wait_conns,
- &session_disconnect_it,
- plugin);
-
- for (cur = plugin->ppc_dll_head; NULL != cur; cur = next)
- {
- next = cur->next;
- GNUNET_CONTAINER_DLL_remove (plugin->ppc_dll_head,
- plugin->ppc_dll_tail,
- cur);
- GNUNET_RESOLVER_request_cancel (cur->resolver_handle);
- cur->asc (cur->asc_cls, NULL, GNUNET_OK);
- GNUNET_free (cur);
- }
-
- if (NULL != plugin->service)
- LEGACY_SERVICE_stop (plugin->service);
- else
- GNUNET_SERVER_destroy (plugin->server);
- GNUNET_free (plugin->handlers);
- if (NULL != plugin->nat)
- GNUNET_NAT_unregister (plugin->nat);
- while (NULL != (tcp_probe = plugin->probe_head))
- {
- GNUNET_CONTAINER_DLL_remove (plugin->probe_head,
- plugin->probe_tail,
- tcp_probe);
- GNUNET_CONNECTION_destroy (tcp_probe->sock);
- GNUNET_free (tcp_probe);
- }
- GNUNET_CONTAINER_multipeermap_destroy (plugin->nat_wait_conns);
- GNUNET_CONTAINER_multipeermap_destroy (plugin->sessionmap);
- GNUNET_break (0 == plugin->cur_connections);
- GNUNET_free (plugin);
- GNUNET_free (api);
- return NULL;
-}
-
-
-/* end of plugin_transport_tcp.c */
diff --git a/src/transport/plugin_transport_template.c
b/src/transport/plugin_transport_template.c
deleted file mode 100644
index c39c72178..000000000
--- a/src/transport/plugin_transport_template.c
+++ /dev/null
@@ -1,565 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2002-2014 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/plugin_transport_template.c
- * @brief template for a new transport service
- * @author Christian Grothoff
- */
-
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_statistics_service.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_transport_plugin.h"
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "transport-template",
__VA_ARGS__)
-
-/**
- * After how long do we expire an address that we
- * learned from another peer if it is not reconfirmed
- * by anyone?
- */
-#define LEARNED_ADDRESS_EXPIRATION GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_HOURS, 6)
-
-#define PLUGIN_NAME "template"
-
-/**
- * Encapsulation of all of the state of the plugin.
- */
-struct Plugin;
-
-
-/**
- * Session handle for connections.
- */
-struct GNUNET_ATS_Session
-{
- /**
- * To whom are we talking to (set to our identity
- * if we are still waiting for the welcome message)
- */
- struct GNUNET_PeerIdentity sender;
-
- /**
- * Stored in a linked list (or a peer map, or ...)
- */
- struct GNUNET_ATS_Session *next;
-
- /**
- * Pointer to the global plugin struct.
- */
- struct Plugin *plugin;
-
- /**
- * The client (used to identify this connection)
- */
- /* void *client; */
-
- /**
- * Continuation function to call once the transmission buffer
- * has again space available. NULL if there is no
- * continuation to call.
- */
- GNUNET_TRANSPORT_TransmitContinuation transmit_cont;
-
- /**
- * Closure for @e transmit_cont.
- */
- void *transmit_cont_cls;
-
- /**
- * At what time did we reset @e last_received last?
- */
- struct GNUNET_TIME_Absolute last_quota_update;
-
- /**
- * How many bytes have we received since the @e last_quota_update
- * timestamp?
- */
- uint64_t last_received;
-
- /**
- * Number of bytes per ms that this peer is allowed
- * to send to us.
- */
- uint32_t quota;
-};
-
-GNUNET_NETWORK_STRUCT_BEGIN
-
-struct TemplateAddress
-{
- /**
- * Address options in NBO
- */
- uint32_t options GNUNET_PACKED;
-
- /* Add address here */
-};
-
-GNUNET_NETWORK_STRUCT_END
-
-/**
- * Encapsulation of all of the state of the plugin.
- */
-struct Plugin
-{
- /**
- * Our environment.
- */
- struct GNUNET_TRANSPORT_PluginEnvironment *env;
-
- /**
- * List of open sessions (or peer map, or...)
- */
- struct GNUNET_ATS_Session *sessions;
-
- /**
- * Function to call about session status changes.
- */
- GNUNET_TRANSPORT_SessionInfoCallback sic;
-
- /**
- * Closure for @e sic.
- */
- void *sic_cls;
-
- /**
- * Options in HBO to be used with addresses
- */
-};
-
-
-#if 0
-/**
- * If a session monitor is attached, notify it about the new
- * session state.
- *
- * @param plugin our plugin
- * @param session session that changed state
- * @param state new state of the session
- */
-static void
-notify_session_monitor (struct Plugin *plugin,
- struct GNUNET_ATS_Session *session,
- enum GNUNET_TRANSPORT_SessionState state)
-{
- struct GNUNET_TRANSPORT_SessionInfo info;
-
- if (NULL == plugin->sic)
- return;
- memset (&info, 0, sizeof(info));
- info.state = state;
- info.is_inbound = GNUNET_SYSERR; /* FIXME */
- // info.num_msg_pending =
- // info.num_bytes_pending =
- // info.receive_delay =
- // info.session_timeout = session->timeout;
- // info.address = session->address;
- plugin->sic (plugin->sic_cls,
- session,
- &info);
-}
-
-
-#endif
-
-
-/**
- * Function that can be used by the transport service to transmit
- * a message using the plugin. Note that in the case of a
- * peer disconnecting, the continuation MUST be called
- * prior to the disconnect notification itself. This function
- * will be called with this peer's HELLO message to initiate
- * a fresh connection to another peer.
- *
- * @param cls closure
- * @param session which session must be used
- * @param msgbuf the message to transmit
- * @param msgbuf_size number of bytes in @a msgbuf
- * @param priority how important is the message (most plugins will
- * ignore message priority and just FIFO)
- * @param to how long to wait at most for the transmission (does not
- * require plugins to discard the message after the timeout,
- * just advisory for the desired delay; most plugins will ignore
- * this as well)
- * @param cont continuation to call once the message has
- * been transmitted (or if the transport is ready
- * for the next transmission call; or if the
- * peer disconnected...); can be NULL
- * @param cont_cls closure for @a cont
- * @return number of bytes used (on the physical network, with overheads);
- * -1 on hard errors (i.e. address invalid); 0 is a legal value
- * and does NOT mean that the message was not transmitted (DV)
- */
-static ssize_t
-template_plugin_send (void *cls,
- struct GNUNET_ATS_Session *session,
- const char *msgbuf,
- size_t msgbuf_size,
- unsigned int priority,
- struct GNUNET_TIME_Relative to,
- GNUNET_TRANSPORT_TransmitContinuation cont,
- void *cont_cls)
-{
- /* struct Plugin *plugin = cls; */
- ssize_t bytes_sent = 0;
-
- return bytes_sent;
-}
-
-
-/**
- * Function that can be used to force the plugin to disconnect
- * from the given peer and cancel all previous transmissions
- * (and their continuationc).
- *
- * @param cls closure
- * @param target peer from which to disconnect
- */
-static void
-template_plugin_disconnect_peer (void *cls,
- const struct GNUNET_PeerIdentity *target)
-{
- // struct Plugin *plugin = cls;
- // FIXME
-}
-
-
-/**
- * Function that can be used to force the plugin to disconnect
- * from the given peer and cancel all previous transmissions
- * (and their continuationc).
- *
- * @param cls closure
- * @param session session from which to disconnect
- * @return #GNUNET_OK on success
- */
-static int
-template_plugin_disconnect_session (void *cls,
- struct GNUNET_ATS_Session *session)
-{
- // struct Plugin *plugin = cls;
- // FIXME
- return GNUNET_SYSERR;
-}
-
-
-/**
- * Function that is called to get the keepalive factor.
- * GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT is divided by this number to
- * calculate the interval between keepalive packets.
- *
- * @param cls closure with the `struct Plugin`
- * @return keepalive factor
- */
-static unsigned int
-template_plugin_query_keepalive_factor (void *cls)
-{
- return 3;
-}
-
-
-/**
- * Function obtain the network type for a session
- *
- * @param cls closure ('struct Plugin*')
- * @param session the session
- * @return the network type in HBO or #GNUNET_SYSERR
- */
-static enum GNUNET_NetworkType
-template_plugin_get_network (void *cls,
- struct GNUNET_ATS_Session *session)
-{
- GNUNET_assert (NULL != session);
- return GNUNET_NT_UNSPECIFIED; /* Change to correct network type */
-}
-
-
-/**
- * Function obtain the network type for an address.
- *
- * @param cls closure (`struct Plugin *`)
- * @param address the address
- * @return the network type
- */
-static enum GNUNET_NetworkType
-template_plugin_get_network_for_address (void *cls,
- const struct
- GNUNET_HELLO_Address *address)
-{
- return GNUNET_NT_WAN; /* FOR NOW */
-}
-
-
-/**
- * Convert the transports address to a nice, human-readable
- * format.
- *
- * @param cls closure
- * @param type name of the transport that generated the address
- * @param addr one of the addresses of the host, NULL for the last address
- * the specific address format depends on the transport
- * @param addrlen length of the address
- * @param numeric should (IP) addresses be displayed in numeric form?
- * @param timeout after how long should we give up?
- * @param asc function to call on each string
- * @param asc_cls closure for @a asc
- */
-static void
-template_plugin_address_pretty_printer (void *cls, const char *type,
- const void *addr, size_t addrlen,
- int numeric,
- struct GNUNET_TIME_Relative timeout,
- GNUNET_TRANSPORT_AddressStringCallback
- asc, void *asc_cls)
-{
- asc (asc_cls, "converted address", GNUNET_OK); /* return address */
- asc (asc_cls, NULL, GNUNET_OK); /* done */
-}
-
-
-/**
- * Another peer has suggested an address for this
- * peer and transport plugin. Check that this could be a valid
- * address. If so, consider adding it to the list
- * of addresses.
- *
- * @param cls closure
- * @param addr pointer to the address
- * @param addrlen length of addr
- * @return #GNUNET_OK if this is a plausible address for this peer
- * and transport
- */
-static int
-template_plugin_address_suggested (void *cls, const void *addr, size_t addrlen)
-{
- /* struct Plugin *plugin = cls; */
-
- /* check if the address is belonging to the plugin*/
- return GNUNET_OK;
-}
-
-
-/**
- * Function called for a quick conversion of the binary address to
- * a numeric address. Note that the caller must not free the
- * address and that the next call to this function is allowed
- * to override the address again.
- *
- * @param cls closure
- * @param addr binary address
- * @param addrlen length of the address
- * @return string representing the same address
- */
-static const char *
-template_plugin_address_to_string (void *cls, const void *addr, size_t addrlen)
-{
- /*
- * Print address in format template.options.address
- */
-
- if (0 == addrlen)
- {
- return TRANSPORT_SESSION_INBOUND_STRING;
- }
-
- GNUNET_break (0);
- return NULL;
-}
-
-
-/**
- * Function called to convert a string address to
- * a binary address.
- *
- * @param cls closure ('struct Plugin*')
- * @param addr string address
- * @param addrlen length of the @a addr
- * @param buf location to store the buffer
- * @param added location to store the number of bytes in the buffer.
- * If the function returns #GNUNET_SYSERR, its contents are undefined.
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
- */
-static int
-template_plugin_string_to_address (void *cls,
- const char *addr,
- uint16_t addrlen,
- void **buf, size_t *added)
-{
- /*
- * Parse string in format template.options.address
- */
- GNUNET_break (0);
- return GNUNET_SYSERR;
-}
-
-
-/**
- * Create a new session to transmit data to the target
- * This session will used to send data to this peer and the plugin will
- * notify us by calling the env->session_end function
- *
- * @param cls closure
- * @param address pointer to the GNUNET_HELLO_Address
- * @return the session if the address is valid, NULL otherwise
- */
-static struct GNUNET_ATS_Session *
-template_plugin_get_session (void *cls,
- const struct GNUNET_HELLO_Address *address)
-{
- GNUNET_break (0);
- return NULL;
-}
-
-
-static void
-template_plugin_update_session_timeout (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- struct GNUNET_ATS_Session *session)
-{
-}
-
-
-#if 0
-/**
- * Return information about the given session to the
- * monitor callback.
- *
- * @param cls the `struct Plugin` with the monitor callback (`sic`)
- * @param peer peer we send information about
- * @param value our `struct GNUNET_ATS_Session` to send information about
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-send_session_info_iter (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *value)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_ATS_Session *session = value;
-
- notify_session_monitor (plugin,
- session,
- GNUNET_TRANSPORT_SS_UP);
- return GNUNET_OK;
-}
-
-
-#endif
-
-
-/**
- * Begin monitoring sessions of a plugin. There can only
- * be one active monitor per plugin (i.e. if there are
- * multiple monitors, the transport service needs to
- * multiplex the generated events over all of them).
- *
- * @param cls closure of the plugin
- * @param sic callback to invoke, NULL to disable monitor;
- * plugin will being by iterating over all active
- * sessions immediately and then enter monitor mode
- * @param sic_cls closure for @a sic
- */
-static void
-template_plugin_setup_monitor (void *cls,
- GNUNET_TRANSPORT_SessionInfoCallback sic,
- void *sic_cls)
-{
- struct Plugin *plugin = cls;
-
- plugin->sic = sic;
- plugin->sic_cls = sic_cls;
- if (NULL != sic)
- {
-#if 0
- GNUNET_CONTAINER_multipeermap_iterate (NULL /* FIXME */,
- &send_session_info_iter,
- plugin);
-#endif
- /* signal end of first iteration */
- sic (sic_cls, NULL, NULL);
- }
-}
-
-
-/**
- * Entry point for the plugin.
- */
-void *
-libgnunet_plugin_transport_template_init (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginEnvironment *env = cls;
- struct GNUNET_TRANSPORT_PluginFunctions *api;
- struct Plugin *plugin;
-
- if (NULL == env->receive)
- {
- /* run in 'stub' mode (i.e. as part of gnunet-peerinfo), don't fully
- initialize the plugin or the API */
- api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
- api->cls = NULL;
- api->address_to_string = &template_plugin_address_to_string;
- api->string_to_address = &template_plugin_string_to_address;
- api->address_pretty_printer = &template_plugin_address_pretty_printer;
- return api;
- }
-
- plugin = GNUNET_new (struct Plugin);
- plugin->env = env;
- api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
- api->cls = plugin;
- api->send = &template_plugin_send;
- api->disconnect_peer = &template_plugin_disconnect_peer;
- api->disconnect_session = &template_plugin_disconnect_session;
- api->query_keepalive_factor = &template_plugin_query_keepalive_factor;
- api->address_pretty_printer = &template_plugin_address_pretty_printer;
- api->check_address = &template_plugin_address_suggested;
- api->address_to_string = &template_plugin_address_to_string;
- api->string_to_address = &template_plugin_string_to_address;
- api->get_session = &template_plugin_get_session;
- api->get_network = &template_plugin_get_network;
- api->get_network_for_address = &template_plugin_get_network_for_address;
- api->update_session_timeout = &template_plugin_update_session_timeout;
- api->setup_monitor = &template_plugin_setup_monitor;
- LOG (GNUNET_ERROR_TYPE_INFO, "Template plugin successfully loaded\n");
- return api;
-}
-
-
-/**
- * Exit point from the plugin.
- */
-void *
-libgnunet_plugin_transport_template_done (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
- struct Plugin *plugin = api->cls;
-
- GNUNET_free (plugin);
- GNUNET_free (api);
- return NULL;
-}
-
-
-/* end of plugin_transport_template.c */
diff --git a/src/transport/plugin_transport_udp.c
b/src/transport/plugin_transport_udp.c
deleted file mode 100644
index 0d3ca449d..000000000
--- a/src/transport/plugin_transport_udp.c
+++ /dev/null
@@ -1,3897 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2010-2017 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/plugin_transport_udp.c
- * @brief Implementation of the UDP transport protocol
- * @author Christian Grothoff
- * @author Nathan Evans
- * @author Matthias Wachs
- */
-#include "platform.h"
-#include "plugin_transport_udp.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_fragmentation_lib.h"
-#include "gnunet_nat_service.h"
-#include "gnunet_protocols.h"
-#include "gnunet_resolver_service.h"
-#include "gnunet_signatures.h"
-#include "gnunet_constants.h"
-#include "gnunet_statistics_service.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_transport_plugin.h"
-#include "transport.h"
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "transport-udp", __VA_ARGS__)
-
-/**
- * After how much inactivity should a UDP session time out?
- */
-#define UDP_SESSION_TIME_OUT \
- GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 60)
-
-/**
- * Number of messages we can defragment in parallel. We only really
- * defragment 1 message at a time, but if messages get re-ordered, we
- * may want to keep knowledge about the previous message to avoid
- * discarding the current message in favor of a single fragment of a
- * previous message. 3 should be good since we don't expect massive
- * message reorderings with UDP.
- */
-#define UDP_MAX_MESSAGES_IN_DEFRAG 3
-
-/**
- * We keep a defragmentation queue per sender address. How many
- * sender addresses do we support at the same time? Memory consumption
- * is roughly a factor of 32k * #UDP_MAX_MESSAGES_IN_DEFRAG times this
- * value. (So 128 corresponds to 12 MB and should suffice for
- * connecting to roughly 128 peers via UDP).
- */
-#define UDP_MAX_SENDER_ADDRESSES_WITH_DEFRAG 128
-
-
-/**
- * UDP Message-Packet header (after defragmentation).
- */
-struct UDPMessage
-{
- /**
- * Message header.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Always zero for now.
- */
- uint32_t reserved;
-
- /**
- * What is the identity of the sender
- */
- struct GNUNET_PeerIdentity sender;
-};
-
-
-/**
- * Closure for #append_port().
- */
-struct PrettyPrinterContext
-{
- /**
- * DLL
- */
- struct PrettyPrinterContext *next;
-
- /**
- * DLL
- */
- struct PrettyPrinterContext *prev;
-
- /**
- * Our plugin.
- */
- struct Plugin *plugin;
-
- /**
- * Resolver handle
- */
- struct GNUNET_RESOLVER_RequestHandle *resolver_handle;
-
- /**
- * Function to call with the result.
- */
- GNUNET_TRANSPORT_AddressStringCallback asc;
-
- /**
- * Clsoure for @e asc.
- */
- void *asc_cls;
-
- /**
- * Timeout task
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * Is this an IPv6 address?
- */
- int ipv6;
-
- /**
- * Options
- */
- uint32_t options;
-
- /**
- * Port to add after the IP address.
- */
- uint16_t port;
-};
-
-
-/**
- * Session with another peer.
- */
-struct GNUNET_ATS_Session
-{
- /**
- * Which peer is this session for?
- */
- struct GNUNET_PeerIdentity target;
-
- /**
- * Tokenizer for inbound messages.
- */
- struct GNUNET_MessageStreamTokenizer *mst;
-
- /**
- * Plugin this session belongs to.
- */
- struct Plugin *plugin;
-
- /**
- * Context for dealing with fragments.
- */
- struct UDP_FragmentationContext *frag_ctx;
-
- /**
- * Desired delay for next sending we send to other peer
- */
- struct GNUNET_TIME_Relative flow_delay_for_other_peer;
-
- /**
- * Desired delay for transmissions we received from other peer.
- * This is for full messages, the value needs to be adjusted for
- * fragmented messages.
- */
- struct GNUNET_TIME_Relative flow_delay_from_other_peer;
-
- /**
- * Session timeout task
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * When does this session time out?
- */
- struct GNUNET_TIME_Absolute timeout;
-
- /**
- * What time did we last transmit?
- */
- struct GNUNET_TIME_Absolute last_transmit_time;
-
- /**
- * expected delay for ACKs
- */
- struct GNUNET_TIME_Relative last_expected_ack_delay;
-
- /**
- * desired delay between UDP messages
- */
- struct GNUNET_TIME_Relative last_expected_msg_delay;
-
- /**
- * Our own address.
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * Number of bytes waiting for transmission to this peer.
- */
- unsigned long long bytes_in_queue;
-
- /**
- * Number of messages waiting for transmission to this peer.
- */
- unsigned int msgs_in_queue;
-
- /**
- * Reference counter to indicate that this session is
- * currently being used and must not be destroyed;
- * setting @e in_destroy will destroy it as soon as
- * possible.
- */
- unsigned int rc;
-
- /**
- * Network type of the address.
- */
- enum GNUNET_NetworkType scope;
-
- /**
- * Is this session about to be destroyed (sometimes we cannot
- * destroy a session immediately as below us on the stack
- * there might be code that still uses it; in this case,
- * @e rc is non-zero).
- */
- int in_destroy;
-};
-
-
-/**
- * Data structure to track defragmentation contexts based
- * on the source of the UDP traffic.
- */
-struct DefragContext
-{
- /**
- * Defragmentation context.
- */
- struct GNUNET_DEFRAGMENT_Context *defrag;
-
- /**
- * Reference to master plugin struct.
- */
- struct Plugin *plugin;
-
- /**
- * Node in the defrag heap.
- */
- struct GNUNET_CONTAINER_HeapNode *hnode;
-
- /**
- * Source address this receive context is for (allocated at the
- * end of the struct).
- */
- const union UdpAddress *udp_addr;
-
- /**
- * Who's message(s) are we defragmenting here?
- * Only initialized once we succeeded and
- * @e have_sender is set.
- */
- struct GNUNET_PeerIdentity sender;
-
- /**
- * Length of @e udp_addr.
- */
- size_t udp_addr_len;
-
- /**
- * Network type the address belongs to.
- */
- enum GNUNET_NetworkType network_type;
-
- /**
- * Has the @e sender field been initialized yet?
- */
- int have_sender;
-};
-
-
-/**
- * Context to send fragmented messages
- */
-struct UDP_FragmentationContext
-{
- /**
- * Next in linked list
- */
- struct UDP_FragmentationContext *next;
-
- /**
- * Previous in linked list
- */
- struct UDP_FragmentationContext *prev;
-
- /**
- * The plugin
- */
- struct Plugin *plugin;
-
- /**
- * Handle for fragmentation.
- */
- struct GNUNET_FRAGMENT_Context *frag;
-
- /**
- * The session this fragmentation context belongs to
- */
- struct GNUNET_ATS_Session *session;
-
- /**
- * Function to call upon completion of the transmission.
- */
- GNUNET_TRANSPORT_TransmitContinuation cont;
-
- /**
- * Closure for @e cont.
- */
- void *cont_cls;
-
- /**
- * Start time.
- */
- struct GNUNET_TIME_Absolute start_time;
-
- /**
- * Transmission time for the next fragment. Incremented by
- * the @e flow_delay_from_other_peer for each fragment when
- * we setup the fragments.
- */
- struct GNUNET_TIME_Absolute next_frag_time;
-
- /**
- * Desired delay for transmissions we received from other peer.
- * Adjusted to be per fragment (UDP_MTU), even though on the
- * wire it was for "full messages".
- */
- struct GNUNET_TIME_Relative flow_delay_from_other_peer;
-
- /**
- * Message timeout
- */
- struct GNUNET_TIME_Absolute timeout;
-
- /**
- * Payload size of original unfragmented message
- */
- size_t payload_size;
-
- /**
- * Bytes used to send all fragments on wire including UDP overhead
- */
- size_t on_wire_size;
-};
-
-
-/**
- * Function called when a message is removed from the
- * transmission queue.
- *
- * @param cls closure
- * @param udpw message wrapper finished
- * @param result #GNUNET_OK on success (message was sent)
- * #GNUNET_SYSERR if the target disconnected
- * or we had a timeout or other trouble sending
- */
-typedef void (*QueueContinuation) (void *cls,
- struct UDP_MessageWrapper *udpw,
- int result);
-
-
-/**
- * Information we track for each message in the queue.
- */
-struct UDP_MessageWrapper
-{
- /**
- * Session this message belongs to
- */
- struct GNUNET_ATS_Session *session;
-
- /**
- * DLL of messages, previous element
- */
- struct UDP_MessageWrapper *prev;
-
- /**
- * DLL of messages, next element
- */
- struct UDP_MessageWrapper *next;
-
- /**
- * Message with @e msg_size bytes including UDP-specific overhead.
- */
- char *msg_buf;
-
- /**
- * Function to call once the message wrapper is being removed
- * from the queue (with success or failure).
- */
- QueueContinuation qc;
-
- /**
- * Closure for @e qc.
- */
- void *qc_cls;
-
- /**
- * External continuation to call upon completion of the
- * transmission, NULL if this queue entry is not for a
- * message from the application.
- */
- GNUNET_TRANSPORT_TransmitContinuation cont;
-
- /**
- * Closure for @e cont.
- */
- void *cont_cls;
-
- /**
- * Fragmentation context.
- * frag_ctx == NULL if transport <= MTU
- * frag_ctx != NULL if transport > MTU
- */
- struct UDP_FragmentationContext *frag_ctx;
-
- /**
- * Message enqueue time.
- */
- struct GNUNET_TIME_Absolute start_time;
-
- /**
- * Desired transmission time for this message, based on the
- * flow limiting information we got from the other peer.
- */
- struct GNUNET_TIME_Absolute transmission_time;
-
- /**
- * Message timeout.
- */
- struct GNUNET_TIME_Absolute timeout;
-
- /**
- * Size of UDP message to send, including UDP-specific overhead.
- */
- size_t msg_size;
-
- /**
- * Payload size of original message.
- */
- size_t payload_size;
-};
-
-
-GNUNET_NETWORK_STRUCT_BEGIN
-
-/**
- * UDP ACK Message-Packet header.
- */
-struct UDP_ACK_Message
-{
- /**
- * Message header.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Desired delay for flow control, in us (in NBO).
- * A value of UINT32_MAX indicates that the other
- * peer wants us to disconnect.
- */
- uint32_t delay GNUNET_PACKED;
-
- /**
- * What is the identity of the sender
- */
- struct GNUNET_PeerIdentity sender;
-};
-
-GNUNET_NETWORK_STRUCT_END
-
-
-/* ************************* Monitoring *********** */
-
-
-/**
- * If a session monitor is attached, notify it about the new
- * session state.
- *
- * @param plugin our plugin
- * @param session session that changed state
- * @param state new state of the session
- */
-static void
-notify_session_monitor (struct Plugin *plugin,
- struct GNUNET_ATS_Session *session,
- enum GNUNET_TRANSPORT_SessionState state)
-{
- struct GNUNET_TRANSPORT_SessionInfo info;
-
- if (NULL == plugin->sic)
- return;
- if (GNUNET_YES == session->in_destroy)
- return; /* already destroyed, just RC>0 left-over actions */
- memset (&info, 0, sizeof(info));
- info.state = state;
- info.is_inbound = GNUNET_SYSERR; /* hard to say */
- info.num_msg_pending = session->msgs_in_queue;
- info.num_bytes_pending = session->bytes_in_queue;
- /* info.receive_delay remains zero as this is not supported by UDP
- (cannot selectively not receive from 'some' peer while continuing
- to receive from others) */
- info.session_timeout = session->timeout;
- info.address = session->address;
- plugin->sic (plugin->sic_cls, session, &info);
-}
-
-
-/**
- * Return information about the given session to the monitor callback.
- *
- * @param cls the `struct Plugin` with the monitor callback (`sic`)
- * @param peer peer we send information about
- * @param value our `struct GNUNET_ATS_Session` to send information about
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-send_session_info_iter (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *value)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_ATS_Session *session = value;
-
- notify_session_monitor (plugin, session, GNUNET_TRANSPORT_SS_INIT);
- notify_session_monitor (plugin, session, GNUNET_TRANSPORT_SS_UP);
- return GNUNET_OK;
-}
-
-
-/**
- * Begin monitoring sessions of a plugin. There can only
- * be one active monitor per plugin (i.e. if there are
- * multiple monitors, the transport service needs to
- * multiplex the generated events over all of them).
- *
- * @param cls closure of the plugin
- * @param sic callback to invoke, NULL to disable monitor;
- * plugin will being by iterating over all active
- * sessions immediately and then enter monitor mode
- * @param sic_cls closure for @a sic
- */
-static void
-udp_plugin_setup_monitor (void *cls,
- GNUNET_TRANSPORT_SessionInfoCallback sic,
- void *sic_cls)
-{
- struct Plugin *plugin = cls;
-
- plugin->sic = sic;
- plugin->sic_cls = sic_cls;
- if (NULL != sic)
- {
- GNUNET_CONTAINER_multipeermap_iterate (plugin->sessions,
- &send_session_info_iter,
- plugin);
- /* signal end of first iteration */
- sic (sic_cls, NULL, NULL);
- }
-}
-
-
-/* ****************** Little Helpers ****************** */
-
-
-/**
- * Function to free last resources associated with a session.
- *
- * @param s session to free
- */
-static void
-free_session (struct GNUNET_ATS_Session *s)
-{
- if (NULL != s->address)
- {
- GNUNET_HELLO_address_free (s->address);
- s->address = NULL;
- }
- if (NULL != s->frag_ctx)
- {
- GNUNET_FRAGMENT_context_destroy (s->frag_ctx->frag, NULL, NULL);
- GNUNET_free (s->frag_ctx);
- s->frag_ctx = NULL;
- }
- if (NULL != s->mst)
- {
- GNUNET_MST_destroy (s->mst);
- s->mst = NULL;
- }
- GNUNET_free (s);
-}
-
-
-/**
- * Function that is called to get the keepalive factor.
- * #GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT is divided by this number to
- * calculate the interval between keepalive packets.
- *
- * @param cls closure with the `struct Plugin`
- * @return keepalive factor
- */
-static unsigned int
-udp_query_keepalive_factor (void *cls)
-{
- return 15;
-}
-
-
-/**
- * Function obtain the network type for a session
- *
- * @param cls closure (`struct Plugin *`)
- * @param session the session
- * @return the network type
- */
-static enum GNUNET_NetworkType
-udp_plugin_get_network (void *cls, struct GNUNET_ATS_Session *session)
-{
- return session->scope;
-}
-
-
-/**
- * Function obtain the network type for an address.
- *
- * @param cls closure (`struct Plugin *`)
- * @param address the address
- * @return the network type
- */
-static enum GNUNET_NetworkType
-udp_plugin_get_network_for_address (void *cls,
- const struct GNUNET_HELLO_Address *address)
-{
- struct Plugin *plugin = cls;
- size_t addrlen;
- struct sockaddr_in a4;
- struct sockaddr_in6 a6;
- const struct IPv4UdpAddress *u4;
- const struct IPv6UdpAddress *u6;
- const void *sb;
- size_t sbs;
-
- addrlen = address->address_length;
- if (addrlen == sizeof(struct IPv6UdpAddress))
- {
- GNUNET_assert (NULL != address->address); /* make static analysis happy */
- u6 = address->address;
- memset (&a6, 0, sizeof(a6));
-#if HAVE_SOCKADDR_IN_SIN_LEN
- a6.sin6_len = sizeof(a6);
-#endif
- a6.sin6_family = AF_INET6;
- a6.sin6_port = u6->u6_port;
- GNUNET_memcpy (&a6.sin6_addr, &u6->ipv6_addr, sizeof(struct in6_addr));
- sb = &a6;
- sbs = sizeof(a6);
- }
- else if (addrlen == sizeof(struct IPv4UdpAddress))
- {
- GNUNET_assert (NULL != address->address); /* make static analysis happy */
- u4 = address->address;
- memset (&a4, 0, sizeof(a4));
-#if HAVE_SOCKADDR_IN_SIN_LEN
- a4.sin_len = sizeof(a4);
-#endif
- a4.sin_family = AF_INET;
- a4.sin_port = u4->u4_port;
- a4.sin_addr.s_addr = u4->ipv4_addr;
- sb = &a4;
- sbs = sizeof(a4);
- }
- else
- {
- GNUNET_break (0);
- return GNUNET_NT_UNSPECIFIED;
- }
- return plugin->env->get_address_type (plugin->env->cls, sb, sbs);
-}
-
-
-/* ******************* Event loop ******************** */
-
-/**
- * We have been notified that our readset has something to read. We don't
- * know which socket needs to be read, so we have to check each one
- * Then reschedule this function to be called again once more is available.
- *
- * @param cls the plugin handle
- */
-static void
-udp_plugin_select_v4 (void *cls);
-
-
-/**
- * We have been notified that our readset has something to read. We don't
- * know which socket needs to be read, so we have to check each one
- * Then reschedule this function to be called again once more is available.
- *
- * @param cls the plugin handle
- */
-static void
-udp_plugin_select_v6 (void *cls);
-
-
-/**
- * (re)schedule IPv4-select tasks for this plugin.
- *
- * @param plugin plugin to reschedule
- */
-static void
-schedule_select_v4 (struct Plugin *plugin)
-{
- struct GNUNET_TIME_Relative min_delay;
- struct GNUNET_TIME_Relative delay;
- struct UDP_MessageWrapper *udpw;
- struct UDP_MessageWrapper *min_udpw;
-
- if ((GNUNET_YES == plugin->enable_ipv4) && (NULL != plugin->sockv4))
- {
- /* Find a message ready to send:
- * Flow delay from other peer is expired or not set (0) */
- min_delay = GNUNET_TIME_UNIT_FOREVER_REL;
- min_udpw = NULL;
- for (udpw = plugin->ipv4_queue_head; NULL != udpw; udpw = udpw->next)
- {
- delay = GNUNET_TIME_absolute_get_remaining (udpw->transmission_time);
- if (delay.rel_value_us < min_delay.rel_value_us)
- {
- min_delay = delay;
- min_udpw = udpw;
- }
- }
- if (NULL != plugin->select_task_v4)
- GNUNET_SCHEDULER_cancel (plugin->select_task_v4);
- if (NULL != min_udpw)
- {
- if (min_delay.rel_value_us > GNUNET_CONSTANTS_LATENCY_WARN.rel_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Calculated flow delay for UDPv4 at %s for %s\n",
- GNUNET_STRINGS_relative_time_to_string (min_delay,
- GNUNET_YES),
- GNUNET_i2s (&min_udpw->session->target));
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Calculated flow delay for UDPv4 at %s for %s\n",
- GNUNET_STRINGS_relative_time_to_string (min_delay,
- GNUNET_YES),
- GNUNET_i2s (&min_udpw->session->target));
- }
- }
- plugin->select_task_v4 =
- GNUNET_SCHEDULER_add_read_net (min_delay,
- plugin->sockv4,
- &udp_plugin_select_v4,
- plugin);
- }
-}
-
-
-/**
- * (re)schedule IPv6-select tasks for this plugin.
- *
- * @param plugin plugin to reschedule
- */
-static void
-schedule_select_v6 (struct Plugin *plugin)
-{
- struct GNUNET_TIME_Relative min_delay;
- struct GNUNET_TIME_Relative delay;
- struct UDP_MessageWrapper *udpw;
- struct UDP_MessageWrapper *min_udpw;
-
- if ((GNUNET_YES == plugin->enable_ipv6) && (NULL != plugin->sockv6))
- {
- min_delay = GNUNET_TIME_UNIT_FOREVER_REL;
- min_udpw = NULL;
- for (udpw = plugin->ipv6_queue_head; NULL != udpw; udpw = udpw->next)
- {
- delay = GNUNET_TIME_absolute_get_remaining (udpw->transmission_time);
- if (delay.rel_value_us < min_delay.rel_value_us)
- {
- min_delay = delay;
- min_udpw = udpw;
- }
- }
- if (NULL != plugin->select_task_v6)
- GNUNET_SCHEDULER_cancel (plugin->select_task_v6);
- if (NULL != min_udpw)
- {
- if (min_delay.rel_value_us > GNUNET_CONSTANTS_LATENCY_WARN.rel_value_us)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Calculated flow delay for UDPv6 at %s for %s\n",
- GNUNET_STRINGS_relative_time_to_string (min_delay,
- GNUNET_YES),
- GNUNET_i2s (&min_udpw->session->target));
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Calculated flow delay for UDPv6 at %s for %s\n",
- GNUNET_STRINGS_relative_time_to_string (min_delay,
- GNUNET_YES),
- GNUNET_i2s (&min_udpw->session->target));
- }
- }
- plugin->select_task_v6 =
- GNUNET_SCHEDULER_add_read_net (min_delay,
- plugin->sockv6,
- &udp_plugin_select_v6,
- plugin);
- }
-}
-
-
-/* ******************* Address to string and back ***************** */
-
-
-/**
- * Function called for a quick conversion of the binary address to
- * a numeric address. Note that the caller must not free the
- * address and that the next call to this function is allowed
- * to override the address again.
- *
- * @param cls closure
- * @param addr binary address (a `union UdpAddress`)
- * @param addrlen length of the @a addr
- * @return string representing the same address
- */
-const char *
-udp_address_to_string (void *cls, const void *addr, size_t addrlen)
-{
- static char rbuf[INET6_ADDRSTRLEN + 10];
- char buf[INET6_ADDRSTRLEN];
- const void *sb;
- struct in_addr a4;
- struct in6_addr a6;
- const struct IPv4UdpAddress *t4;
- const struct IPv6UdpAddress *t6;
- int af;
- uint16_t port;
- uint32_t options;
-
- if (NULL == addr)
- {
- GNUNET_break_op (0);
- return NULL;
- }
-
- if (addrlen == sizeof(struct IPv6UdpAddress))
- {
- t6 = addr;
- af = AF_INET6;
- options = ntohl (t6->options);
- port = ntohs (t6->u6_port);
- a6 = t6->ipv6_addr;
- sb = &a6;
- }
- else if (addrlen == sizeof(struct IPv4UdpAddress))
- {
- t4 = addr;
- af = AF_INET;
- options = ntohl (t4->options);
- port = ntohs (t4->u4_port);
- a4.s_addr = t4->ipv4_addr;
- sb = &a4;
- }
- else
- {
- GNUNET_break_op (0);
- return NULL;
- }
- inet_ntop (af, sb, buf, INET6_ADDRSTRLEN);
- GNUNET_snprintf (rbuf,
- sizeof(rbuf),
- (af == AF_INET6) ? "%s.%u.[%s]:%u" : "%s.%u.%s:%u",
- PLUGIN_NAME,
- options,
- buf,
- port);
- return rbuf;
-}
-
-
-/**
- * Function called to convert a string address to a binary address.
- *
- * @param cls closure (`struct Plugin *`)
- * @param addr string address
- * @param addrlen length of the address
- * @param buf location to store the buffer
- * @param added location to store the number of bytes in the buffer.
- * If the function returns #GNUNET_SYSERR, its contents are undefined.
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
- */
-static int
-udp_string_to_address (void *cls,
- const char *addr,
- uint16_t addrlen,
- void **buf,
- size_t *added)
-{
- struct sockaddr_storage socket_address;
- char *address;
- char *plugin;
- char *optionstr;
- uint32_t options;
-
- /* Format tcp.options.address:port */
- address = NULL;
- plugin = NULL;
- optionstr = NULL;
-
- if ((NULL == addr) || (0 == addrlen))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if ('\0' != addr[addrlen - 1])
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if (strlen (addr) != addrlen - 1)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- plugin = GNUNET_strdup (addr);
- optionstr = strchr (plugin, '.');
- if (NULL == optionstr)
- {
- GNUNET_break (0);
- GNUNET_free (plugin);
- return GNUNET_SYSERR;
- }
- optionstr[0] = '\0';
- optionstr++;
- options = atol (optionstr);
- address = strchr (optionstr, '.');
- if (NULL == address)
- {
- GNUNET_break (0);
- GNUNET_free (plugin);
- return GNUNET_SYSERR;
- }
- address[0] = '\0';
- address++;
-
- if (GNUNET_OK !=
- GNUNET_STRINGS_to_address_ip (address, strlen (address),
&socket_address))
- {
- GNUNET_break (0);
- GNUNET_free (plugin);
- return GNUNET_SYSERR;
- }
- GNUNET_free (plugin);
-
- switch (socket_address.ss_family)
- {
- case AF_INET: {
- struct IPv4UdpAddress *u4;
- const struct sockaddr_in *in4 =
- (const struct sockaddr_in *) &socket_address;
-
- u4 = GNUNET_new (struct IPv4UdpAddress);
- u4->options = htonl (options);
- u4->ipv4_addr = in4->sin_addr.s_addr;
- u4->u4_port = in4->sin_port;
- *buf = u4;
- *added = sizeof(struct IPv4UdpAddress);
- return GNUNET_OK;
- }
-
- case AF_INET6: {
- struct IPv6UdpAddress *u6;
- const struct sockaddr_in6 *in6 =
- (const struct sockaddr_in6 *) &socket_address;
-
- u6 = GNUNET_new (struct IPv6UdpAddress);
- u6->options = htonl (options);
- u6->ipv6_addr = in6->sin6_addr;
- u6->u6_port = in6->sin6_port;
- *buf = u6;
- *added = sizeof(struct IPv6UdpAddress);
- return GNUNET_OK;
- }
-
- default:
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
-}
-
-
-/**
- * Append our port and forward the result.
- *
- * @param cls a `struct PrettyPrinterContext *`
- * @param hostname result from DNS resolver
- */
-static void
-append_port (void *cls, const char *hostname)
-{
- struct PrettyPrinterContext *ppc = cls;
- struct Plugin *plugin = ppc->plugin;
- char *ret;
-
- if (NULL == hostname)
- {
- /* Final call, done */
- GNUNET_CONTAINER_DLL_remove (plugin->ppc_dll_head,
- plugin->ppc_dll_tail,
- ppc);
- ppc->resolver_handle = NULL;
- ppc->asc (ppc->asc_cls, NULL, GNUNET_OK);
- GNUNET_free (ppc);
- return;
- }
- if (GNUNET_YES == ppc->ipv6)
- GNUNET_asprintf (&ret,
- "%s.%u.[%s]:%d",
- PLUGIN_NAME,
- ppc->options,
- hostname,
- ppc->port);
- else
- GNUNET_asprintf (&ret,
- "%s.%u.%s:%d",
- PLUGIN_NAME,
- ppc->options,
- hostname,
- ppc->port);
- ppc->asc (ppc->asc_cls, ret, GNUNET_OK);
- GNUNET_free (ret);
-}
-
-
-/**
- * Convert the transports address to a nice, human-readable format.
- *
- * @param cls closure with the `struct Plugin *`
- * @param type name of the transport that generated the address
- * @param addr one of the addresses of the host, NULL for the last address
- * the specific address format depends on the transport;
- * a `union UdpAddress`
- * @param addrlen length of the address
- * @param numeric should (IP) addresses be displayed in numeric form?
- * @param timeout after how long should we give up?
- * @param asc function to call on each string
- * @param asc_cls closure for @a asc
- */
-static void
-udp_plugin_address_pretty_printer (void *cls,
- const char *type,
- const void *addr,
- size_t addrlen,
- int numeric,
- struct GNUNET_TIME_Relative timeout,
- GNUNET_TRANSPORT_AddressStringCallback asc,
- void *asc_cls)
-{
- struct Plugin *plugin = cls;
- struct PrettyPrinterContext *ppc;
- const struct sockaddr *sb;
- size_t sbs;
- struct sockaddr_in a4;
- struct sockaddr_in6 a6;
- const struct IPv4UdpAddress *u4;
- const struct IPv6UdpAddress *u6;
- uint16_t port;
- uint32_t options;
-
- if (addrlen == sizeof(struct IPv6UdpAddress))
- {
- u6 = addr;
- memset (&a6, 0, sizeof(a6));
- a6.sin6_family = AF_INET6;
-#if HAVE_SOCKADDR_IN_SIN_LEN
- a6.sin6_len = sizeof(a6);
-#endif
- a6.sin6_port = u6->u6_port;
- a6.sin6_addr = u6->ipv6_addr;
- port = ntohs (u6->u6_port);
- options = ntohl (u6->options);
- sb = (const struct sockaddr *) &a6;
- sbs = sizeof(a6);
- }
- else if (addrlen == sizeof(struct IPv4UdpAddress))
- {
- u4 = addr;
- memset (&a4, 0, sizeof(a4));
- a4.sin_family = AF_INET;
-#if HAVE_SOCKADDR_IN_SIN_LEN
- a4.sin_len = sizeof(a4);
-#endif
- a4.sin_port = u4->u4_port;
- a4.sin_addr.s_addr = u4->ipv4_addr;
- port = ntohs (u4->u4_port);
- options = ntohl (u4->options);
- sb = (const struct sockaddr *) &a4;
- sbs = sizeof(a4);
- }
- else
- {
- /* invalid address */
- GNUNET_break_op (0);
- asc (asc_cls, NULL, GNUNET_SYSERR);
- asc (asc_cls, NULL, GNUNET_OK);
- return;
- }
- ppc = GNUNET_new (struct PrettyPrinterContext);
- ppc->plugin = plugin;
- ppc->asc = asc;
- ppc->asc_cls = asc_cls;
- ppc->port = port;
- ppc->options = options;
- if (addrlen == sizeof(struct IPv6UdpAddress))
- ppc->ipv6 = GNUNET_YES;
- else
- ppc->ipv6 = GNUNET_NO;
- GNUNET_CONTAINER_DLL_insert (plugin->ppc_dll_head, plugin->ppc_dll_tail,
ppc);
- ppc->resolver_handle = GNUNET_RESOLVER_hostname_get (sb,
- sbs,
- ! numeric,
- timeout,
- &append_port,
- ppc);
-}
-
-
-/**
- * Check if the given port is plausible (must be either our listen
- * port or our advertised port). If it is neither, we return
- * #GNUNET_SYSERR.
- *
- * @param plugin global variables
- * @param in_port port number to check
- * @return #GNUNET_OK if port is either our open or advertised port
- */
-static int
-check_port (const struct Plugin *plugin, uint16_t in_port)
-{
- if ((plugin->port == in_port) || (plugin->aport == in_port))
- return GNUNET_OK;
- return GNUNET_SYSERR;
-}
-
-
-/**
- * Function that will be called to check if a binary address for this
- * plugin is well-formed and corresponds to an address for THIS peer
- * (as per our configuration). Naturally, if absolutely necessary,
- * plugins can be a bit conservative in their answer, but in general
- * plugins should make sure that the address does not redirect
- * traffic to a 3rd party that might try to man-in-the-middle our
- * traffic.
- *
- * @param cls closure, should be our handle to the Plugin
- * @param addr pointer to a `union UdpAddress`
- * @param addrlen length of @a addr
- * @return #GNUNET_OK if this is a plausible address for this peer
- * and transport, #GNUNET_SYSERR if not
- */
-static int
-udp_plugin_check_address (void *cls, const void *addr, size_t addrlen)
-{
- struct Plugin *plugin = cls;
- const struct IPv4UdpAddress *v4;
- const struct IPv6UdpAddress *v6;
-
- if (sizeof(struct IPv4UdpAddress) == addrlen)
- {
- struct sockaddr_in s4;
-
- v4 = (const struct IPv4UdpAddress *) addr;
- if (GNUNET_OK != check_port (plugin, ntohs (v4->u4_port)))
- return GNUNET_SYSERR;
- memset (&s4, 0, sizeof(s4));
- s4.sin_family = AF_INET;
-#if HAVE_SOCKADDR_IN_SIN_LEN
- s4.sin_len = sizeof(s4);
-#endif
- s4.sin_port = v4->u4_port;
- s4.sin_addr.s_addr = v4->ipv4_addr;
-
- if (GNUNET_OK !=
- GNUNET_NAT_test_address (plugin->nat, &s4, sizeof(struct sockaddr_in)))
- return GNUNET_SYSERR;
- }
- else if (sizeof(struct IPv6UdpAddress) == addrlen)
- {
- struct sockaddr_in6 s6;
-
- v6 = (const struct IPv6UdpAddress *) addr;
- if (IN6_IS_ADDR_LINKLOCAL (&v6->ipv6_addr))
- return GNUNET_OK; /* plausible, if unlikely... */
- memset (&s6, 0, sizeof(s6));
- s6.sin6_family = AF_INET6;
-#if HAVE_SOCKADDR_IN_SIN_LEN
- s6.sin6_len = sizeof(s6);
-#endif
- s6.sin6_port = v6->u6_port;
- s6.sin6_addr = v6->ipv6_addr;
-
- if (GNUNET_OK != GNUNET_NAT_test_address (plugin->nat,
- &s6,
- sizeof(struct sockaddr_in6)))
- return GNUNET_SYSERR;
- }
- else
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Our external IP address/port mapping has changed.
- *
- * @param cls closure, the `struct Plugin`
- * @param[in,out] app_ctx location where the app can store stuff
- * on add and retrieve it on remove
- * @param add_remove #GNUNET_YES to mean the new public IP address,
- * #GNUNET_NO to mean the previous (now invalid) one
- * @param ac address class the address belongs to
- * @param addr either the previous or the new public IP address
- * @param addrlen actual length of the @a addr
- */
-static void
-udp_nat_port_map_callback (void *cls,
- void **app_ctx,
- int add_remove,
- enum GNUNET_NAT_AddressClass ac,
- const struct sockaddr *addr,
- socklen_t addrlen)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_HELLO_Address *address;
- struct IPv4UdpAddress u4;
- struct IPv6UdpAddress u6;
- void *arg;
- size_t args;
-
- (void) app_ctx;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- (GNUNET_YES == add_remove) ? "NAT notification to add address `%s'\n"
- : "NAT notification to remove address `%s'\n",
- GNUNET_a2s (addr, addrlen));
- /* convert 'address' to our internal format */
- switch (addr->sa_family)
- {
- case AF_INET: {
- const struct sockaddr_in *i4;
-
- GNUNET_assert (sizeof(struct sockaddr_in) == addrlen);
- i4 = (const struct sockaddr_in *) addr;
- if (0 == ntohs (i4->sin_port))
- return; /* Port = 0 means unmapped, ignore these for UDP. */
- memset (&u4, 0, sizeof(u4));
- u4.options = htonl (plugin->myoptions);
- u4.ipv4_addr = i4->sin_addr.s_addr;
- u4.u4_port = i4->sin_port;
- arg = &u4;
- args = sizeof(struct IPv4UdpAddress);
- break;
- }
-
- case AF_INET6: {
- const struct sockaddr_in6 *i6;
-
- GNUNET_assert (sizeof(struct sockaddr_in6) == addrlen);
- i6 = (const struct sockaddr_in6 *) addr;
- if (0 == ntohs (i6->sin6_port))
- return; /* Port = 0 means unmapped, ignore these for UDP. */
- memset (&u6, 0, sizeof(u6));
- u6.options = htonl (plugin->myoptions);
- u6.ipv6_addr = i6->sin6_addr;
- u6.u6_port = i6->sin6_port;
- arg = &u6;
- args = sizeof(struct IPv6UdpAddress);
- break;
- }
-
- default:
- GNUNET_break (0);
- return;
- }
- /* modify our published address list */
- /* TODO: use 'ac' here in the future... */
- address = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
- PLUGIN_NAME,
- arg,
- args,
- GNUNET_HELLO_ADDRESS_INFO_NONE);
- plugin->env->notify_address (plugin->env->cls, add_remove, address);
- GNUNET_HELLO_address_free (address);
-}
-
-
-/* ********************* Finding sessions ******************* */
-
-
-/**
- * Closure for #session_cmp_it().
- */
-struct GNUNET_ATS_SessionCompareContext
-{
- /**
- * Set to session matching the address.
- */
- struct GNUNET_ATS_Session *res;
-
- /**
- * Address we are looking for.
- */
- const struct GNUNET_HELLO_Address *address;
-};
-
-
-/**
- * Find a session with a matching address.
- *
- * @param cls the `struct GNUNET_ATS_SessionCompareContext *`
- * @param key peer identity (unused)
- * @param value the `struct GNUNET_ATS_Session *`
- * @return #GNUNET_NO if we found the session, #GNUNET_OK if not
- */
-static int
-session_cmp_it (void *cls, const struct GNUNET_PeerIdentity *key, void *value)
-{
- struct GNUNET_ATS_SessionCompareContext *cctx = cls;
- struct GNUNET_ATS_Session *s = value;
-
- if (0 == GNUNET_HELLO_address_cmp (s->address, cctx->address))
- {
- GNUNET_assert (GNUNET_NO == s->in_destroy);
- cctx->res = s;
- return GNUNET_NO;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Locate an existing session the transport service is using to
- * send data to another peer. Performs some basic sanity checks
- * on the address and then tries to locate a matching session.
- *
- * @param cls the plugin
- * @param address the address we should locate the session by
- * @return the session if it exists, or NULL if it is not found
- */
-static struct GNUNET_ATS_Session *
-udp_plugin_lookup_session (void *cls,
- const struct GNUNET_HELLO_Address *address)
-{
- struct Plugin *plugin = cls;
- const struct IPv6UdpAddress *udp_a6;
- const struct IPv4UdpAddress *udp_a4;
- struct GNUNET_ATS_SessionCompareContext cctx;
-
- if (NULL == address->address)
- {
- GNUNET_break (0);
- return NULL;
- }
- if (sizeof(struct IPv4UdpAddress) == address->address_length)
- {
- if (NULL == plugin->sockv4)
- return NULL;
- udp_a4 = (const struct IPv4UdpAddress *) address->address;
- if (0 == udp_a4->u4_port)
- {
- GNUNET_break (0);
- return NULL;
- }
- }
- else if (sizeof(struct IPv6UdpAddress) == address->address_length)
- {
- if (NULL == plugin->sockv6)
- return NULL;
- udp_a6 = (const struct IPv6UdpAddress *) address->address;
- if (0 == udp_a6->u6_port)
- {
- GNUNET_break (0);
- return NULL;
- }
- }
- else
- {
- GNUNET_break (0);
- return NULL;
- }
-
- /* check if session already exists */
- cctx.address = address;
- cctx.res = NULL;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Looking for existing session for peer `%s' with address `%s'\n",
- GNUNET_i2s (&address->peer),
- udp_address_to_string (plugin,
- address->address,
- address->address_length));
- GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessions,
- &address->peer,
- &session_cmp_it,
- &cctx);
- if (NULL == cctx.res)
- return NULL;
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Found existing session %p\n", cctx.res);
- return cctx.res;
-}
-
-
-/* ********************** Timeout ****************** */
-
-
-/**
- * Increment session timeout due to activity.
- *
- * @param s session to reschedule timeout activity for
- */
-static void
-reschedule_session_timeout (struct GNUNET_ATS_Session *s)
-{
- if (GNUNET_YES == s->in_destroy)
- return;
- GNUNET_assert (NULL != s->timeout_task);
- s->timeout = GNUNET_TIME_relative_to_absolute (UDP_SESSION_TIME_OUT);
-}
-
-
-/**
- * Function that will be called whenever the transport service wants to
- * notify the plugin that a session is still active and in use and
- * therefore the session timeout for this session has to be updated
- *
- * @param cls closure with the `struct Plugin`
- * @param peer which peer was the session for
- * @param session which session is being updated
- */
-static void
-udp_plugin_update_session_timeout (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- struct GNUNET_ATS_Session *session)
-{
- struct Plugin *plugin = cls;
-
- if (GNUNET_YES !=
- GNUNET_CONTAINER_multipeermap_contains_value (plugin->sessions,
- peer,
- session))
- {
- GNUNET_break (0);
- return;
- }
- /* Reschedule session timeout */
- reschedule_session_timeout (session);
-}
-
-
-/* ************************* Sending ************************ */
-
-
-/**
- * Remove the given message from the transmission queue and
- * update all applicable statistics.
- *
- * @param plugin the UDP plugin
- * @param udpw message wrapper to dequeue
- */
-static void
-dequeue (struct Plugin *plugin, struct UDP_MessageWrapper *udpw)
-{
- struct GNUNET_ATS_Session *session = udpw->session;
-
- if (plugin->bytes_in_buffer < udpw->msg_size)
- {
- GNUNET_break (0);
- }
- else
- {
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, total bytes in send buffers",
- -(long long) udpw->msg_size,
- GNUNET_NO);
- plugin->bytes_in_buffer -= udpw->msg_size;
- }
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, total messages in send buffers",
- -1,
- GNUNET_NO);
- if (sizeof(struct IPv4UdpAddress) == udpw->session->address->address_length)
- {
- GNUNET_CONTAINER_DLL_remove (plugin->ipv4_queue_head,
- plugin->ipv4_queue_tail,
- udpw);
- }
- else if (sizeof(struct IPv6UdpAddress) ==
- udpw->session->address->address_length)
- {
- GNUNET_CONTAINER_DLL_remove (plugin->ipv6_queue_head,
- plugin->ipv6_queue_tail,
- udpw);
- }
- else
- {
- GNUNET_break (0);
- return;
- }
- GNUNET_assert (session->msgs_in_queue > 0);
- session->msgs_in_queue--;
- GNUNET_assert (session->bytes_in_queue >= udpw->msg_size);
- session->bytes_in_queue -= udpw->msg_size;
-}
-
-
-/**
- * Enqueue a message for transmission and update statistics.
- *
- * @param plugin the UDP plugin
- * @param udpw message wrapper to queue
- */
-static void
-enqueue (struct Plugin *plugin, struct UDP_MessageWrapper *udpw)
-{
- struct GNUNET_ATS_Session *session = udpw->session;
-
- if (GNUNET_YES == session->in_destroy)
- {
- GNUNET_break (0);
- GNUNET_free (udpw);
- return;
- }
- if (plugin->bytes_in_buffer > INT64_MAX - udpw->msg_size)
- {
- GNUNET_break (0);
- }
- else
- {
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, total bytes in send buffers",
- udpw->msg_size,
- GNUNET_NO);
- plugin->bytes_in_buffer += udpw->msg_size;
- }
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, total messages in send buffers",
- 1,
- GNUNET_NO);
- if (sizeof(struct IPv4UdpAddress) == udpw->session->address->address_length)
- {
- GNUNET_CONTAINER_DLL_insert (plugin->ipv4_queue_head,
- plugin->ipv4_queue_tail,
- udpw);
- }
- else if (sizeof(struct IPv6UdpAddress) ==
- udpw->session->address->address_length)
- {
- GNUNET_CONTAINER_DLL_insert (plugin->ipv6_queue_head,
- plugin->ipv6_queue_tail,
- udpw);
- }
- else
- {
- GNUNET_break (0);
- udpw->cont (udpw->cont_cls,
- &session->target,
- GNUNET_SYSERR,
- udpw->msg_size,
- 0);
- GNUNET_free (udpw);
- return;
- }
- session->msgs_in_queue++;
- session->bytes_in_queue += udpw->msg_size;
-}
-
-
-/**
- * We have completed our (attempt) to transmit a message that had to
- * be fragmented -- either because we got an ACK saying that all
- * fragments were received, or because of timeout / disconnect. Clean
- * up our state.
- *
- * @param frag_ctx fragmentation context to clean up
- * @param result #GNUNET_OK if we succeeded (got ACK),
- * #GNUNET_SYSERR if the transmission failed
- */
-static void
-fragmented_message_done (struct UDP_FragmentationContext *frag_ctx, int result)
-{
- struct Plugin *plugin = frag_ctx->plugin;
- struct GNUNET_ATS_Session *s = frag_ctx->session;
- struct UDP_MessageWrapper *udpw;
- struct UDP_MessageWrapper *tmp;
- size_t overhead;
- struct GNUNET_TIME_Relative delay;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "%p: Fragmented message removed with result %s\n",
- frag_ctx,
- (result == GNUNET_SYSERR) ? "FAIL" : "SUCCESS");
- /* Call continuation for fragmented message */
- if (frag_ctx->on_wire_size >= frag_ctx->payload_size)
- overhead = frag_ctx->on_wire_size - frag_ctx->payload_size;
- else
- overhead = frag_ctx->on_wire_size;
- delay = GNUNET_TIME_absolute_get_duration (frag_ctx->start_time);
- if (delay.rel_value_us > GNUNET_CONSTANTS_LATENCY_WARN.rel_value_us)
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "Fragmented message acknowledged after %s (expected at %s)\n",
- GNUNET_STRINGS_relative_time_to_string (delay, GNUNET_YES),
- GNUNET_STRINGS_absolute_time_to_string (frag_ctx->next_frag_time));
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Fragmented message acknowledged after %s (expected at %s)\n",
- GNUNET_STRINGS_relative_time_to_string (delay, GNUNET_YES),
- GNUNET_STRINGS_absolute_time_to_string (frag_ctx->next_frag_time));
- }
-
- if (NULL != frag_ctx->cont)
- frag_ctx->cont (frag_ctx->cont_cls,
- &s->target,
- result,
- s->frag_ctx->payload_size,
- frag_ctx->on_wire_size);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, fragmented messages active",
- -1,
- GNUNET_NO);
-
- if (GNUNET_OK == result)
- {
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, fragmented msgs, messages, sent,
success",
- 1,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, fragmented msgs, bytes payload, sent,
success",
- s->frag_ctx->payload_size,
- GNUNET_NO);
- GNUNET_STATISTICS_update (
- plugin->env->stats,
- "# UDP, fragmented msgs, bytes overhead, sent, success",
- overhead,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, total, bytes overhead, sent",
- overhead,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, total, bytes payload, sent",
- s->frag_ctx->payload_size,
- GNUNET_NO);
- }
- else
- {
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, fragmented msgs, messages, sent,
failure",
- 1,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, fragmented msgs, bytes payload, sent,
failure",
- s->frag_ctx->payload_size,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, fragmented msgs, bytes payload, sent,
failure",
- overhead,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, fragmented msgs, bytes payload, sent,
failure",
- overhead,
- GNUNET_NO);
- }
-
- /* Remove remaining fragments from queue, no need to transmit those
- any longer. */
- if (s->address->address_length == sizeof(struct IPv6UdpAddress))
- {
- udpw = plugin->ipv6_queue_head;
- while (NULL != udpw)
- {
- tmp = udpw->next;
- if ((udpw->frag_ctx != NULL) && (udpw->frag_ctx == frag_ctx))
- {
- dequeue (plugin, udpw);
- GNUNET_free (udpw);
- }
- udpw = tmp;
- }
- }
- if (s->address->address_length == sizeof(struct IPv4UdpAddress))
- {
- udpw = plugin->ipv4_queue_head;
- while (NULL != udpw)
- {
- tmp = udpw->next;
- if ((NULL != udpw->frag_ctx) && (udpw->frag_ctx == frag_ctx))
- {
- dequeue (plugin, udpw);
- GNUNET_free (udpw);
- }
- udpw = tmp;
- }
- }
- notify_session_monitor (s->plugin, s, GNUNET_TRANSPORT_SS_UPDATE);
- GNUNET_FRAGMENT_context_destroy (frag_ctx->frag,
- &s->last_expected_msg_delay,
- &s->last_expected_ack_delay);
- s->frag_ctx = NULL;
- GNUNET_free (frag_ctx);
-}
-
-
-/**
- * We are finished with a fragment in the message queue.
- * Notify the continuation and update statistics.
- *
- * @param cls the `struct Plugin *`
- * @param udpw the queue entry
- * @param result #GNUNET_OK on success, #GNUNET_SYSERR on failure
- */
-static void
-qc_fragment_sent (void *cls, struct UDP_MessageWrapper *udpw, int result)
-{
- struct Plugin *plugin = cls;
-
- GNUNET_assert (NULL != udpw->frag_ctx);
- if (GNUNET_OK == result)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Fragment of message with %u bytes transmitted to %s\n",
- (unsigned int) udpw->payload_size,
- GNUNET_i2s (&udpw->session->target));
- GNUNET_FRAGMENT_context_transmission_done (udpw->frag_ctx->frag);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, fragmented msgs, fragments, sent,
success",
- 1,
- GNUNET_NO);
- GNUNET_STATISTICS_update (
- plugin->env->stats,
- "# UDP, fragmented msgs, fragments bytes, sent, success",
- udpw->msg_size,
- GNUNET_NO);
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Failed to transmit fragment of message with %u bytes to %s\n",
- (unsigned int) udpw->payload_size,
- GNUNET_i2s (&udpw->session->target));
- fragmented_message_done (udpw->frag_ctx, GNUNET_SYSERR);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, fragmented msgs, fragments, sent,
failure",
- 1,
- GNUNET_NO);
- GNUNET_STATISTICS_update (
- plugin->env->stats,
- "# UDP, fragmented msgs, fragments bytes, sent, failure",
- udpw->msg_size,
- GNUNET_NO);
- }
-}
-
-
-/**
- * Function that is called with messages created by the fragmentation
- * module. In the case of the `proc` callback of the
- * #GNUNET_FRAGMENT_context_create() function, this function must
- * eventually call #GNUNET_FRAGMENT_context_transmission_done().
- *
- * @param cls closure, the `struct UDP_FragmentationContext`
- * @param msg the message that was created
- */
-static void
-enqueue_fragment (void *cls, const struct GNUNET_MessageHeader *msg)
-{
- struct UDP_FragmentationContext *frag_ctx = cls;
- struct Plugin *plugin = frag_ctx->plugin;
- struct UDP_MessageWrapper *udpw;
- struct GNUNET_ATS_Session *session = frag_ctx->session;
- size_t msg_len = ntohs (msg->size);
-
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Enqueuing fragment with %lu bytes\n",
- (unsigned long) msg_len);
- udpw = GNUNET_malloc (sizeof(struct UDP_MessageWrapper) + msg_len);
- udpw->session = session;
- udpw->msg_buf = (char *) &udpw[1];
- udpw->msg_size = msg_len;
- udpw->payload_size = msg_len; /* FIXME: minus fragment overhead */
- udpw->timeout = frag_ctx->timeout;
- udpw->start_time = frag_ctx->start_time;
- udpw->transmission_time = frag_ctx->next_frag_time;
- frag_ctx->next_frag_time =
- GNUNET_TIME_absolute_add (frag_ctx->next_frag_time,
- frag_ctx->flow_delay_from_other_peer);
- udpw->frag_ctx = frag_ctx;
- udpw->qc = &qc_fragment_sent;
- udpw->qc_cls = plugin;
- GNUNET_memcpy (udpw->msg_buf, msg, msg_len);
- enqueue (plugin, udpw);
- if (session->address->address_length == sizeof(struct IPv4UdpAddress))
- schedule_select_v4 (plugin);
- else
- schedule_select_v6 (plugin);
-}
-
-
-/**
- * We are finished with a message from the message queue.
- * Notify the continuation and update statistics.
- *
- * @param cls the `struct Plugin *`
- * @param udpw the queue entry
- * @param result #GNUNET_OK on success, #GNUNET_SYSERR on failure
- */
-static void
-qc_message_sent (void *cls, struct UDP_MessageWrapper *udpw, int result)
-{
- struct Plugin *plugin = cls;
- size_t overhead;
- struct GNUNET_TIME_Relative delay;
-
- if (udpw->msg_size >= udpw->payload_size)
- overhead = udpw->msg_size - udpw->payload_size;
- else
- overhead = udpw->msg_size;
-
- if (NULL != udpw->cont)
- {
- delay = GNUNET_TIME_absolute_get_duration (udpw->start_time);
- if (delay.rel_value_us > GNUNET_CONSTANTS_LATENCY_WARN.rel_value_us)
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "Message sent via UDP with delay of %s\n",
- GNUNET_STRINGS_relative_time_to_string (delay, GNUNET_YES));
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Message sent via UDP with delay of %s\n",
- GNUNET_STRINGS_relative_time_to_string (delay, GNUNET_YES));
- }
- udpw->cont (udpw->cont_cls,
- &udpw->session->target,
- result,
- udpw->payload_size,
- overhead);
- }
- if (GNUNET_OK == result)
- {
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, unfragmented msgs, messages, sent,
success",
- 1,
- GNUNET_NO);
- GNUNET_STATISTICS_update (
- plugin->env->stats,
- "# UDP, unfragmented msgs, bytes payload, sent, success",
- udpw->payload_size,
- GNUNET_NO);
- GNUNET_STATISTICS_update (
- plugin->env->stats,
- "# UDP, unfragmented msgs, bytes overhead, sent, success",
- overhead,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, total, bytes overhead, sent",
- overhead,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, total, bytes payload, sent",
- udpw->payload_size,
- GNUNET_NO);
- }
- else
- {
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, unfragmented msgs, messages, sent,
failure",
- 1,
- GNUNET_NO);
- GNUNET_STATISTICS_update (
- plugin->env->stats,
- "# UDP, unfragmented msgs, bytes payload, sent, failure",
- udpw->payload_size,
- GNUNET_NO);
- GNUNET_STATISTICS_update (
- plugin->env->stats,
- "# UDP, unfragmented msgs, bytes overhead, sent, failure",
- overhead,
- GNUNET_NO);
- }
-}
-
-
-/**
- * Function that can be used by the transport service to transmit a
- * message using the plugin. Note that in the case of a peer
- * disconnecting, the continuation MUST be called prior to the
- * disconnect notification itself. This function will be called with
- * this peer's HELLO message to initiate a fresh connection to another
- * peer.
- *
- * @param cls closure
- * @param s which session must be used
- * @param msgbuf the message to transmit
- * @param msgbuf_size number of bytes in @a msgbuf
- * @param priority how important is the message (most plugins will
- * ignore message priority and just FIFO)
- * @param to how long to wait at most for the transmission (does not
- * require plugins to discard the message after the timeout,
- * just advisory for the desired delay; most plugins will ignore
- * this as well)
- * @param cont continuation to call once the message has
- * been transmitted (or if the transport is ready
- * for the next transmission call; or if the
- * peer disconnected...); can be NULL
- * @param cont_cls closure for @a cont
- * @return number of bytes used (on the physical network, with overheads);
- * -1 on hard errors (i.e. address invalid); 0 is a legal value
- * and does NOT mean that the message was not transmitted (DV)
- */
-static ssize_t
-udp_plugin_send (void *cls,
- struct GNUNET_ATS_Session *s,
- const char *msgbuf,
- size_t msgbuf_size,
- unsigned int priority,
- struct GNUNET_TIME_Relative to,
- GNUNET_TRANSPORT_TransmitContinuation cont,
- void *cont_cls)
-{
- struct Plugin *plugin = cls;
- size_t udpmlen = msgbuf_size + sizeof(struct UDPMessage);
- struct UDP_FragmentationContext *frag_ctx;
- struct UDP_MessageWrapper *udpw;
- struct UDPMessage *udp;
- char mbuf[udpmlen] GNUNET_ALIGN;
- struct GNUNET_TIME_Relative latency;
-
- if ((sizeof(struct IPv6UdpAddress) == s->address->address_length) &&
- (NULL == plugin->sockv6))
- return GNUNET_SYSERR;
- if ((sizeof(struct IPv4UdpAddress) == s->address->address_length) &&
- (NULL == plugin->sockv4))
- return GNUNET_SYSERR;
- if (udpmlen >= GNUNET_MAX_MESSAGE_SIZE)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if (GNUNET_YES !=
- GNUNET_CONTAINER_multipeermap_contains_value (plugin->sessions,
- &s->target,
- s))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "UDP transmits %lu-byte message to `%s' using address `%s'\n",
- (unsigned long) udpmlen,
- GNUNET_i2s (&s->target),
- udp_address_to_string (plugin,
- s->address->address,
- s->address->address_length));
-
- udp = (struct UDPMessage *) mbuf;
- udp->header.size = htons (udpmlen);
- udp->header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_UDP_MESSAGE);
- udp->reserved = htonl (0);
- udp->sender = *plugin->env->my_identity;
-
- /* We do not update the session time out here! Otherwise this
- * session will not timeout since we send keep alive before session
- * can timeout.
- *
- * For UDP we update session timeout only on receive, this will
- * cover keep alives, since remote peer will reply with keep alive
- * responses!
- */if (udpmlen <= UDP_MTU)
- {
- /* unfragmented message */
- udpw = GNUNET_malloc (sizeof(struct UDP_MessageWrapper) + udpmlen);
- udpw->session = s;
- udpw->msg_buf = (char *) &udpw[1];
- udpw->msg_size = udpmlen; /* message size with UDP overhead */
- udpw->payload_size = msgbuf_size; /* message size without UDP overhead */
- udpw->start_time = GNUNET_TIME_absolute_get ();
- udpw->timeout = GNUNET_TIME_relative_to_absolute (to);
- udpw->transmission_time = s->last_transmit_time;
- s->last_transmit_time =
- GNUNET_TIME_absolute_add (s->last_transmit_time,
- s->flow_delay_from_other_peer);
- udpw->cont = cont;
- udpw->cont_cls = cont_cls;
- udpw->frag_ctx = NULL;
- udpw->qc = &qc_message_sent;
- udpw->qc_cls = plugin;
- GNUNET_memcpy (udpw->msg_buf, udp, sizeof(struct UDPMessage));
- GNUNET_memcpy (&udpw->msg_buf[sizeof(struct UDPMessage)],
- msgbuf,
- msgbuf_size);
- enqueue (plugin, udpw);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, unfragmented messages queued total",
- 1,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, unfragmented bytes payload queued total",
- msgbuf_size,
- GNUNET_NO);
- if (s->address->address_length == sizeof(struct IPv4UdpAddress))
- schedule_select_v4 (plugin);
- else
- schedule_select_v6 (plugin);
- }
- else
- {
- /* fragmented message */
- if (NULL != s->frag_ctx)
- return GNUNET_SYSERR;
- GNUNET_memcpy (&udp[1], msgbuf, msgbuf_size);
- frag_ctx = GNUNET_new (struct UDP_FragmentationContext);
- frag_ctx->plugin = plugin;
- frag_ctx->session = s;
- frag_ctx->cont = cont;
- frag_ctx->cont_cls = cont_cls;
- frag_ctx->start_time = GNUNET_TIME_absolute_get ();
- frag_ctx->next_frag_time = s->last_transmit_time;
- frag_ctx->flow_delay_from_other_peer =
- GNUNET_TIME_relative_divide (s->flow_delay_from_other_peer,
- 1 + (msgbuf_size / UDP_MTU));
- frag_ctx->timeout = GNUNET_TIME_relative_to_absolute (to);
- frag_ctx->payload_size =
- msgbuf_size; /* unfragmented message size without UDP overhead */
- frag_ctx->on_wire_size = 0; /* bytes with UDP and fragmentation overhead
*/
- frag_ctx->frag = GNUNET_FRAGMENT_context_create (plugin->env->stats,
- UDP_MTU,
- &plugin->tracker,
-
s->last_expected_msg_delay,
-
s->last_expected_ack_delay,
- &udp->header,
- &enqueue_fragment,
- frag_ctx);
- s->frag_ctx = frag_ctx;
- s->last_transmit_time = frag_ctx->next_frag_time;
- latency = GNUNET_TIME_absolute_get_remaining (s->last_transmit_time);
- if (latency.rel_value_us > GNUNET_CONSTANTS_LATENCY_WARN.rel_value_us)
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "Enqueued fragments will take %s for transmission to %s (queue
size: %u)\n",
- GNUNET_STRINGS_relative_time_to_string (latency, GNUNET_YES),
- GNUNET_i2s (&s->target),
- (unsigned int) s->msgs_in_queue);
- else
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Enqueued fragments will take %s for transmission to %s (queue
size: %u)\n",
- GNUNET_STRINGS_relative_time_to_string (latency, GNUNET_YES),
- GNUNET_i2s (&s->target),
- (unsigned int) s->msgs_in_queue);
-
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, fragmented messages active",
- 1,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, fragmented messages, total",
- 1,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, fragmented bytes (payload)",
- frag_ctx->payload_size,
- GNUNET_NO);
- }
- notify_session_monitor (s->plugin, s, GNUNET_TRANSPORT_SS_UPDATE);
- return udpmlen;
-}
-
-
-/* ********************** Receiving ********************** */
-
-
-/**
- * Closure for #find_receive_context().
- */
-struct FindReceiveContext
-{
- /**
- * Where to store the result.
- */
- struct DefragContext *rc;
-
- /**
- * Session associated with this context.
- */
- struct GNUNET_ATS_Session *session;
-
- /**
- * Address to find.
- */
- const union UdpAddress *udp_addr;
-
- /**
- * Number of bytes in @e udp_addr.
- */
- size_t udp_addr_len;
-};
-
-
-/**
- * Scan the heap for a receive context with the given address.
- *
- * @param cls the `struct FindReceiveContext`
- * @param node internal node of the heap
- * @param element value stored at the node (a `struct ReceiveContext`)
- * @param cost cost associated with the node
- * @return #GNUNET_YES if we should continue to iterate,
- * #GNUNET_NO if not.
- */
-static int
-find_receive_context (void *cls,
- struct GNUNET_CONTAINER_HeapNode *node,
- void *element,
- GNUNET_CONTAINER_HeapCostType cost)
-{
- struct FindReceiveContext *frc = cls;
- struct DefragContext *e = element;
-
- if ((frc->udp_addr_len == e->udp_addr_len) &&
- (0 == memcmp (frc->udp_addr, e->udp_addr, frc->udp_addr_len)))
- {
- frc->rc = e;
- return GNUNET_NO;
- }
- return GNUNET_YES;
-}
-
-
-/**
- * Functions with this signature are called whenever we need to close
- * a session due to a disconnect or failure to establish a connection.
- *
- * @param cls closure with the `struct Plugin`
- * @param s session to close down
- * @return #GNUNET_OK on success
- */
-static int
-udp_disconnect_session (void *cls, struct GNUNET_ATS_Session *s)
-{
- struct Plugin *plugin = cls;
- struct UDP_MessageWrapper *udpw;
- struct UDP_MessageWrapper *next;
- struct FindReceiveContext frc;
-
- GNUNET_assert (GNUNET_YES != s->in_destroy);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p to peer `%s' at address %s ended\n",
- s,
- GNUNET_i2s (&s->target),
- udp_address_to_string (plugin,
- s->address->address,
- s->address->address_length));
- if (NULL != s->timeout_task)
- {
- GNUNET_SCHEDULER_cancel (s->timeout_task);
- s->timeout_task = NULL;
- }
- if (NULL != s->frag_ctx)
- {
- /* Remove fragmented message due to disconnect */
- fragmented_message_done (s->frag_ctx, GNUNET_SYSERR);
- }
- GNUNET_assert (
- GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove (plugin->sessions, &s->target, s));
- frc.rc = NULL;
- frc.udp_addr = s->address->address;
- frc.udp_addr_len = s->address->address_length;
- /* Lookup existing receive context for this address */
- if (NULL != plugin->defrag_ctxs)
- {
- GNUNET_CONTAINER_heap_iterate (plugin->defrag_ctxs,
- &find_receive_context,
- &frc);
- if (NULL != frc.rc)
- {
- struct DefragContext *d_ctx = frc.rc;
-
- GNUNET_CONTAINER_heap_remove_node (d_ctx->hnode);
- GNUNET_DEFRAGMENT_context_destroy (d_ctx->defrag);
- GNUNET_free (d_ctx);
- }
- }
- s->in_destroy = GNUNET_YES;
- next = plugin->ipv4_queue_head;
- while (NULL != (udpw = next))
- {
- next = udpw->next;
- if (udpw->session == s)
- {
- dequeue (plugin, udpw);
- udpw->qc (udpw->qc_cls, udpw, GNUNET_SYSERR);
- GNUNET_free (udpw);
- }
- }
- next = plugin->ipv6_queue_head;
- while (NULL != (udpw = next))
- {
- next = udpw->next;
- if (udpw->session == s)
- {
- dequeue (plugin, udpw);
- udpw->qc (udpw->qc_cls, udpw, GNUNET_SYSERR);
- GNUNET_free (udpw);
- }
- }
- if ((NULL != s->frag_ctx) && (NULL != s->frag_ctx->cont))
- {
- /* The 'frag_ctx' itself will be freed in #free_session() a bit
- later, as it might be in use right now */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Calling continuation for fragemented message to `%s' with result
SYSERR\n",
- GNUNET_i2s (&s->target));
- s->frag_ctx->cont (s->frag_ctx->cont_cls,
- &s->target,
- GNUNET_SYSERR,
- s->frag_ctx->payload_size,
- s->frag_ctx->on_wire_size);
- }
- notify_session_monitor (s->plugin, s, GNUNET_TRANSPORT_SS_DONE);
- plugin->env->session_end (plugin->env->cls, s->address, s);
- GNUNET_STATISTICS_set (plugin->env->stats,
- "# UDP sessions active",
- GNUNET_CONTAINER_multipeermap_size (plugin->sessions),
- GNUNET_NO);
- if (0 == s->rc)
- free_session (s);
- return GNUNET_OK;
-}
-
-
-/**
- * Handle a #GNUNET_MESSAGE_TYPE_TRANSPORT_UDP_ACK message.
- *
- * @param plugin the UDP plugin
- * @param msg the (presumed) UDP ACK message
- * @param udp_addr sender address
- * @param udp_addr_len number of bytes in @a udp_addr
- */
-static void
-read_process_ack (struct Plugin *plugin,
- const struct GNUNET_MessageHeader *msg,
- const union UdpAddress *udp_addr,
- socklen_t udp_addr_len)
-{
- const struct GNUNET_MessageHeader *ack;
- const struct UDP_ACK_Message *udp_ack;
- struct GNUNET_HELLO_Address *address;
- struct GNUNET_ATS_Session *s;
- struct GNUNET_TIME_Relative flow_delay;
-
- /* check message format */
- if (ntohs (msg->size) <
- sizeof(struct UDP_ACK_Message) + sizeof(struct GNUNET_MessageHeader))
- {
- GNUNET_break_op (0);
- return;
- }
- udp_ack = (const struct UDP_ACK_Message *) msg;
- ack = (const struct GNUNET_MessageHeader *) &udp_ack[1];
- if (ntohs (ack->size) != ntohs (msg->size) - sizeof(struct UDP_ACK_Message))
- {
- GNUNET_break_op (0);
- return;
- }
-
- /* Locate session */
- address = GNUNET_HELLO_address_allocate (&udp_ack->sender,
- PLUGIN_NAME,
- udp_addr,
- udp_addr_len,
- GNUNET_HELLO_ADDRESS_INFO_NONE);
- s = udp_plugin_lookup_session (plugin, address);
- if (NULL == s)
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "UDP session of address %s for ACK not found\n",
- udp_address_to_string (plugin,
- address->address,
- address->address_length));
- GNUNET_HELLO_address_free (address);
- return;
- }
- if (NULL == s->frag_ctx)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG | GNUNET_ERROR_TYPE_BULK,
- "Fragmentation context of address %s for ACK (%s) not found\n",
- udp_address_to_string (plugin,
- address->address,
- address->address_length),
- GNUNET_FRAGMENT_print_ack (ack));
- GNUNET_HELLO_address_free (address);
- return;
- }
- GNUNET_HELLO_address_free (address);
-
- /* evaluate flow delay: how long should we wait between messages? */
- if (UINT32_MAX == ntohl (udp_ack->delay))
- {
- /* Other peer asked for us to terminate the session */
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Asked to disconnect UDP session of %s\n",
- GNUNET_i2s (&udp_ack->sender));
- udp_disconnect_session (plugin, s);
- return;
- }
- flow_delay.rel_value_us = (uint64_t) ntohl (udp_ack->delay);
- if (flow_delay.rel_value_us > GNUNET_CONSTANTS_LATENCY_WARN.rel_value_us)
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "We received a sending delay of %s for %s\n",
- GNUNET_STRINGS_relative_time_to_string (flow_delay, GNUNET_YES),
- GNUNET_i2s (&udp_ack->sender));
- else
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "We received a sending delay of %s for %s\n",
- GNUNET_STRINGS_relative_time_to_string (flow_delay, GNUNET_YES),
- GNUNET_i2s (&udp_ack->sender));
- /* Flow delay is for the reassembled packet, however, our delay
- is per packet, so we need to adjust: */
- s->flow_delay_from_other_peer = flow_delay;
-
- /* Handle ACK */
- if (GNUNET_OK != GNUNET_FRAGMENT_process_ack (s->frag_ctx->frag, ack))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "UDP processes %u-byte acknowledgement from `%s' at `%s'\n",
- (unsigned int) ntohs (msg->size),
- GNUNET_i2s (&udp_ack->sender),
- udp_address_to_string (plugin, udp_addr, udp_addr_len));
- /* Expect more ACKs to arrive */
- return;
- }
-
- /* Remove fragmented message after successful sending */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Message from %s at %s full ACK'ed\n",
- GNUNET_i2s (&udp_ack->sender),
- udp_address_to_string (plugin, udp_addr, udp_addr_len));
- fragmented_message_done (s->frag_ctx, GNUNET_OK);
-}
-
-
-/**
- * Message tokenizer has broken up an incoming message. Pass it on
- * to the service.
- *
- * @param cls the `struct GNUNET_ATS_Session *`
- * @param hdr the actual message
- * @return #GNUNET_OK (always)
- */
-static int
-process_inbound_tokenized_messages (void *cls,
- const struct GNUNET_MessageHeader *hdr)
-{
- struct GNUNET_ATS_Session *session = cls;
- struct Plugin *plugin = session->plugin;
-
- if (GNUNET_YES == session->in_destroy)
- return GNUNET_OK;
- reschedule_session_timeout (session);
- session->flow_delay_for_other_peer =
- plugin->env->receive (plugin->env->cls, session->address, session, hdr);
- return GNUNET_OK;
-}
-
-
-/**
- * Destroy a session, plugin is being unloaded.
- *
- * @param cls the `struct Plugin`
- * @param key hash of public key of target peer
- * @param value a `struct PeerSession *` to clean up
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-disconnect_and_free_it (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct Plugin *plugin = cls;
-
- udp_disconnect_session (plugin, value);
- return GNUNET_OK;
-}
-
-
-/**
- * Disconnect from a remote node. Clean up session if we have one for
- * this peer.
- *
- * @param cls closure for this call (should be handle to Plugin)
- * @param target the peeridentity of the peer to disconnect
- * @return #GNUNET_OK on success, #GNUNET_SYSERR if the operation failed
- */
-static void
-udp_disconnect (void *cls, const struct GNUNET_PeerIdentity *target)
-{
- struct Plugin *plugin = cls;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Disconnecting from peer `%s'\n",
- GNUNET_i2s (target));
- GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessions,
- target,
- &disconnect_and_free_it,
- plugin);
-}
-
-
-/**
- * Session was idle, so disconnect it.
- *
- * @param cls the `struct GNUNET_ATS_Session` to time out
- */
-static void
-session_timeout (void *cls)
-{
- struct GNUNET_ATS_Session *s = cls;
- struct Plugin *plugin = s->plugin;
- struct GNUNET_TIME_Relative left;
-
- s->timeout_task = NULL;
- left = GNUNET_TIME_absolute_get_remaining (s->timeout);
- if (left.rel_value_us > 0)
- {
- /* not actually our turn yet, but let's at least update
- the monitor, it may think we're about to die ... */
- notify_session_monitor (s->plugin, s, GNUNET_TRANSPORT_SS_UPDATE);
- s->timeout_task = GNUNET_SCHEDULER_add_delayed (left, &session_timeout, s);
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p was idle for %s, disconnecting\n",
- s,
- GNUNET_STRINGS_relative_time_to_string (UDP_SESSION_TIME_OUT,
- GNUNET_YES));
- /* call session destroy function */
- udp_disconnect_session (plugin, s);
-}
-
-
-/**
- * Allocate a new session for the given endpoint address.
- * Note that this function does not inform the service
- * of the new session, this is the responsibility of the
- * caller (if needed).
- *
- * @param cls the `struct Plugin`
- * @param address address of the other peer to use
- * @param network_type network type the address belongs to
- * @return NULL on error, otherwise session handle
- */
-static struct GNUNET_ATS_Session *
-udp_plugin_create_session (void *cls,
- const struct GNUNET_HELLO_Address *address,
- enum GNUNET_NetworkType network_type)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_ATS_Session *s;
-
- s = GNUNET_new (struct GNUNET_ATS_Session);
- s->mst = GNUNET_MST_create (&process_inbound_tokenized_messages, s);
- s->plugin = plugin;
- s->address = GNUNET_HELLO_address_copy (address);
- s->target = address->peer;
- s->last_transmit_time = GNUNET_TIME_absolute_get ();
- s->last_expected_ack_delay =
- GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 250);
- s->last_expected_msg_delay = GNUNET_TIME_UNIT_MILLISECONDS;
- s->flow_delay_from_other_peer = GNUNET_TIME_UNIT_ZERO;
- s->flow_delay_for_other_peer = GNUNET_TIME_UNIT_ZERO;
- s->timeout = GNUNET_TIME_relative_to_absolute (UDP_SESSION_TIME_OUT);
- s->timeout_task =
- GNUNET_SCHEDULER_add_delayed (UDP_SESSION_TIME_OUT, &session_timeout, s);
- s->scope = network_type;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Creating new session %p for peer `%s' address `%s'\n",
- s,
- GNUNET_i2s (&address->peer),
- udp_address_to_string (plugin,
- address->address,
- address->address_length));
- GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multipeermap_put (
- plugin->sessions,
- &s->target,
- s,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
- GNUNET_STATISTICS_set (plugin->env->stats,
- "# UDP sessions active",
- GNUNET_CONTAINER_multipeermap_size (plugin->sessions),
- GNUNET_NO);
- notify_session_monitor (plugin, s, GNUNET_TRANSPORT_SS_INIT);
- return s;
-}
-
-
-/**
- * Creates a new outbound session the transport service will use to
- * send data to the peer.
- *
- * @param cls the `struct Plugin *`
- * @param address the address
- * @return the session or NULL of max connections exceeded
- */
-static struct GNUNET_ATS_Session *
-udp_plugin_get_session (void *cls, const struct GNUNET_HELLO_Address *address)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_ATS_Session *s;
- enum GNUNET_NetworkType network_type = GNUNET_NT_UNSPECIFIED;
- const struct IPv4UdpAddress *udp_v4;
- const struct IPv6UdpAddress *udp_v6;
-
- if (NULL == address)
- {
- GNUNET_break (0);
- return NULL;
- }
- if ((address->address_length != sizeof(struct IPv4UdpAddress)) &&
- (address->address_length != sizeof(struct IPv6UdpAddress)))
- {
- GNUNET_break_op (0);
- return NULL;
- }
- if (NULL != (s = udp_plugin_lookup_session (cls, address)))
- return s;
-
- /* need to create new session */
- if (sizeof(struct IPv4UdpAddress) == address->address_length)
- {
- struct sockaddr_in v4;
-
- udp_v4 = (const struct IPv4UdpAddress *) address->address;
- memset (&v4, '\0', sizeof(v4));
- v4.sin_family = AF_INET;
-#if HAVE_SOCKADDR_IN_SIN_LEN
- v4.sin_len = sizeof(struct sockaddr_in);
-#endif
- v4.sin_port = udp_v4->u4_port;
- v4.sin_addr.s_addr = udp_v4->ipv4_addr;
- network_type = plugin->env->get_address_type (plugin->env->cls,
- (const struct sockaddr *)
&v4,
- sizeof(v4));
- }
- if (sizeof(struct IPv6UdpAddress) == address->address_length)
- {
- struct sockaddr_in6 v6;
-
- udp_v6 = (const struct IPv6UdpAddress *) address->address;
- memset (&v6, '\0', sizeof(v6));
- v6.sin6_family = AF_INET6;
-#if HAVE_SOCKADDR_IN_SIN_LEN
- v6.sin6_len = sizeof(struct sockaddr_in6);
-#endif
- v6.sin6_port = udp_v6->u6_port;
- v6.sin6_addr = udp_v6->ipv6_addr;
- network_type = plugin->env->get_address_type (plugin->env->cls,
- (const struct sockaddr *)
&v6,
- sizeof(v6));
- }
- GNUNET_break (GNUNET_NT_UNSPECIFIED != network_type);
- return udp_plugin_create_session (cls, address, network_type);
-}
-
-
-/**
- * We've received a UDP Message. Process it (pass contents to main service).
- *
- * @param plugin plugin context
- * @param msg the message
- * @param udp_addr sender address
- * @param udp_addr_len number of bytes in @a udp_addr
- * @param network_type network type the address belongs to
- */
-static void
-process_udp_message (struct Plugin *plugin,
- const struct UDPMessage *msg,
- const union UdpAddress *udp_addr,
- size_t udp_addr_len,
- enum GNUNET_NetworkType network_type)
-{
- struct GNUNET_ATS_Session *s;
- struct GNUNET_HELLO_Address *address;
-
- GNUNET_break (GNUNET_NT_UNSPECIFIED != network_type);
- if (0 != ntohl (msg->reserved))
- {
- GNUNET_break_op (0);
- return;
- }
- if (ntohs (msg->header.size) <
- sizeof(struct GNUNET_MessageHeader) + sizeof(struct UDPMessage))
- {
- GNUNET_break_op (0);
- return;
- }
-
- address = GNUNET_HELLO_address_allocate (&msg->sender,
- PLUGIN_NAME,
- udp_addr,
- udp_addr_len,
- GNUNET_HELLO_ADDRESS_INFO_NONE);
- if (NULL == (s = udp_plugin_lookup_session (plugin, address)))
- {
- s = udp_plugin_create_session (plugin, address, network_type);
- plugin->env->session_start (plugin->env->cls, address, s, s->scope);
- notify_session_monitor (plugin, s, GNUNET_TRANSPORT_SS_UP);
- }
- GNUNET_free (address);
-
- s->rc++;
- GNUNET_MST_from_buffer (s->mst,
- (const char *) &msg[1],
- ntohs (msg->header.size) - sizeof(struct UDPMessage),
- GNUNET_YES,
- GNUNET_NO);
- s->rc--;
- if ((0 == s->rc) && (GNUNET_YES == s->in_destroy))
- free_session (s);
-}
-
-
-/**
- * Process a defragmented message.
- *
- * @param cls the `struct DefragContext *`
- * @param msg the message
- */
-static void
-fragment_msg_proc (void *cls, const struct GNUNET_MessageHeader *msg)
-{
- struct DefragContext *dc = cls;
- const struct UDPMessage *um;
-
- if (ntohs (msg->type) != GNUNET_MESSAGE_TYPE_TRANSPORT_UDP_MESSAGE)
- {
- GNUNET_break_op (0);
- return;
- }
- if (ntohs (msg->size) < sizeof(struct UDPMessage))
- {
- GNUNET_break_op (0);
- return;
- }
- um = (const struct UDPMessage *) msg;
- dc->sender = um->sender;
- dc->have_sender = GNUNET_YES;
- process_udp_message (dc->plugin,
- um,
- dc->udp_addr,
- dc->udp_addr_len,
- dc->network_type);
-}
-
-
-/**
- * We finished sending an acknowledgement. Update
- * statistics.
- *
- * @param cls the `struct Plugin`
- * @param udpw message queue entry of the ACK
- * @param result #GNUNET_OK if the transmission worked,
- * #GNUNET_SYSERR if we failed to send the ACK
- */
-static void
-ack_message_sent (void *cls, struct UDP_MessageWrapper *udpw, int result)
-{
- struct Plugin *plugin = cls;
-
- if (GNUNET_OK == result)
- {
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, ACK messages sent",
- 1,
- GNUNET_NO);
- }
- else
- {
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, ACK transmissions failed",
- 1,
- GNUNET_NO);
- }
-}
-
-
-/**
- * Transmit an acknowledgement.
- *
- * @param cls the `struct DefragContext *`
- * @param id message ID (unused)
- * @param msg ack to transmit
- */
-static void
-ack_proc (void *cls, uint32_t id, const struct GNUNET_MessageHeader *msg)
-{
- struct DefragContext *rc = cls;
- struct Plugin *plugin = rc->plugin;
- size_t msize = sizeof(struct UDP_ACK_Message) + ntohs (msg->size);
- struct UDP_ACK_Message *udp_ack;
- uint32_t delay;
- struct UDP_MessageWrapper *udpw;
- struct GNUNET_ATS_Session *s;
- struct GNUNET_HELLO_Address *address;
-
- if (GNUNET_NO == rc->have_sender)
- {
- /* tried to defragment but never succeeded, hence will not ACK */
- /* This can happen if we just lost msgs */
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, fragments discarded without ACK",
- 1,
- GNUNET_NO);
- return;
- }
- address = GNUNET_HELLO_address_allocate (&rc->sender,
- PLUGIN_NAME,
- rc->udp_addr,
- rc->udp_addr_len,
- GNUNET_HELLO_ADDRESS_INFO_NONE);
- s = udp_plugin_lookup_session (plugin, address);
- GNUNET_HELLO_address_free (address);
- if (NULL == s)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Trying to transmit ACK to peer `%s' but no session found!\n",
- udp_address_to_string (plugin, rc->udp_addr, rc->udp_addr_len));
- GNUNET_CONTAINER_heap_remove_node (rc->hnode);
- GNUNET_DEFRAGMENT_context_destroy (rc->defrag);
- GNUNET_free (rc);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, ACK transmissions failed",
- 1,
- GNUNET_NO);
- return;
- }
- if (GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us ==
- s->flow_delay_for_other_peer.rel_value_us)
- delay = UINT32_MAX;
- else if (s->flow_delay_for_other_peer.rel_value_us < UINT32_MAX)
- delay = s->flow_delay_for_other_peer.rel_value_us;
- else
- delay = UINT32_MAX - 1; /* largest value we can communicate */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Sending ACK to `%s' including delay of %s\n",
- udp_address_to_string (plugin, rc->udp_addr, rc->udp_addr_len),
- GNUNET_STRINGS_relative_time_to_string (s->flow_delay_for_other_peer,
- GNUNET_YES));
- udpw = GNUNET_malloc (sizeof(struct UDP_MessageWrapper) + msize);
- udpw->msg_size = msize;
- udpw->payload_size = 0;
- udpw->session = s;
- udpw->start_time = GNUNET_TIME_absolute_get ();
- udpw->timeout = GNUNET_TIME_UNIT_FOREVER_ABS;
- udpw->msg_buf = (char *) &udpw[1];
- udpw->qc = &ack_message_sent;
- udpw->qc_cls = plugin;
- udp_ack = (struct UDP_ACK_Message *) udpw->msg_buf;
- udp_ack->header.size = htons ((uint16_t) msize);
- udp_ack->header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_UDP_ACK);
- udp_ack->delay = htonl (delay);
- udp_ack->sender = *plugin->env->my_identity;
- GNUNET_memcpy (&udp_ack[1], msg, ntohs (msg->size));
- enqueue (plugin, udpw);
- notify_session_monitor (plugin, s, GNUNET_TRANSPORT_SS_UPDATE);
- if (s->address->address_length == sizeof(struct IPv4UdpAddress))
- schedule_select_v4 (plugin);
- else
- schedule_select_v6 (plugin);
-}
-
-
-/**
- * We received a fragment, process it.
- *
- * @param plugin our plugin
- * @param msg a message of type #GNUNET_MESSAGE_TYPE_FRAGMENT
- * @param udp_addr sender address
- * @param udp_addr_len number of bytes in @a udp_addr
- * @param network_type network type the address belongs to
- */
-static void
-read_process_fragment (struct Plugin *plugin,
- const struct GNUNET_MessageHeader *msg,
- const union UdpAddress *udp_addr,
- size_t udp_addr_len,
- enum GNUNET_NetworkType network_type)
-{
- struct DefragContext *d_ctx;
- struct GNUNET_TIME_Absolute now;
- struct FindReceiveContext frc;
-
- frc.rc = NULL;
- frc.udp_addr = udp_addr;
- frc.udp_addr_len = udp_addr_len;
-
- /* Lookup existing receive context for this address */
- GNUNET_CONTAINER_heap_iterate (plugin->defrag_ctxs,
- &find_receive_context,
- &frc);
- now = GNUNET_TIME_absolute_get ();
- d_ctx = frc.rc;
-
- if (NULL == d_ctx)
- {
- /* Create a new defragmentation context */
- d_ctx = GNUNET_malloc (sizeof(struct DefragContext) + udp_addr_len);
- GNUNET_memcpy (&d_ctx[1], udp_addr, udp_addr_len);
- d_ctx->udp_addr = (const union UdpAddress *) &d_ctx[1];
- d_ctx->udp_addr_len = udp_addr_len;
- d_ctx->network_type = network_type;
- d_ctx->plugin = plugin;
- d_ctx->defrag =
- GNUNET_DEFRAGMENT_context_create (plugin->env->stats,
- UDP_MTU,
- UDP_MAX_MESSAGES_IN_DEFRAG,
- d_ctx,
- &fragment_msg_proc,
- &ack_proc);
- d_ctx->hnode = GNUNET_CONTAINER_heap_insert (plugin->defrag_ctxs,
- d_ctx,
-
(GNUNET_CONTAINER_HeapCostType)
- now.abs_value_us);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Created new defragmentation context for %u-byte fragment from
`%s'\n",
- (unsigned int) ntohs (msg->size),
- udp_address_to_string (plugin, udp_addr, udp_addr_len));
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Found existing defragmentation context for %u-byte fragment from
`%s'\n",
- (unsigned int) ntohs (msg->size),
- udp_address_to_string (plugin, udp_addr, udp_addr_len));
- }
-
- if (GNUNET_OK == GNUNET_DEFRAGMENT_process_fragment (d_ctx->defrag, msg))
- {
- /* keep this 'rc' from expiring */
- GNUNET_CONTAINER_heap_update_cost (d_ctx->hnode,
- (GNUNET_CONTAINER_HeapCostType)
- now.abs_value_us);
- }
- if (GNUNET_CONTAINER_heap_get_size (plugin->defrag_ctxs) >
- UDP_MAX_SENDER_ADDRESSES_WITH_DEFRAG)
- {
- /* remove 'rc' that was inactive the longest */
- d_ctx = GNUNET_CONTAINER_heap_remove_root (plugin->defrag_ctxs);
- GNUNET_assert (NULL != d_ctx);
- GNUNET_DEFRAGMENT_context_destroy (d_ctx->defrag);
- GNUNET_free (d_ctx);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, Defragmentations aborted",
- 1,
- GNUNET_NO);
- }
-}
-
-
-/**
- * Read and process a message from the given socket.
- *
- * @param plugin the overall plugin
- * @param rsock socket to read from
- */
-static void
-udp_select_read (struct Plugin *plugin, struct GNUNET_NETWORK_Handle *rsock)
-{
- socklen_t fromlen;
- struct sockaddr_storage addr;
- char buf[65536] GNUNET_ALIGN;
- ssize_t size;
- const struct GNUNET_MessageHeader *msg;
- struct IPv4UdpAddress v4;
- struct IPv6UdpAddress v6;
- const struct sockaddr *sa;
- const struct sockaddr_in *sa4;
- const struct sockaddr_in6 *sa6;
- const union UdpAddress *int_addr;
- size_t int_addr_len;
- enum GNUNET_NetworkType network_type;
-
- fromlen = sizeof(addr);
- memset (&addr, 0, sizeof(addr));
- size = GNUNET_NETWORK_socket_recvfrom (rsock,
- buf,
- sizeof(buf),
- (struct sockaddr *) &addr,
- &fromlen);
- sa = (const struct sockaddr *) &addr;
-
- if (-1 == size)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "UDP failed to receive data: %s\n",
- strerror (errno));
- /* Connection failure or something. Not a protocol violation. */
- return;
- }
-
- /* Check if this is a STUN packet */
- if (GNUNET_NO !=
- GNUNET_NAT_stun_handle_packet (plugin->nat,
- (const struct sockaddr *) &addr,
- fromlen,
- buf,
- size))
- return; /* was STUN, do not process further */
-
- if (size < sizeof(struct GNUNET_MessageHeader))
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "UDP got %u bytes from %s, which is not enough for a GNUnet message
header\n",
- (unsigned int) size,
- GNUNET_a2s (sa, fromlen));
- /* _MAY_ be a connection failure (got partial message) */
- /* But it _MAY_ also be that the other side uses non-GNUnet protocol. */
- GNUNET_break_op (0);
- return;
- }
-
- msg = (const struct GNUNET_MessageHeader *) buf;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "UDP received %u-byte message from `%s' type %u\n",
- (unsigned int) size,
- GNUNET_a2s (sa, fromlen),
- ntohs (msg->type));
- if (size != ntohs (msg->size))
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "UDP malformed message (size %u) header from %s\n",
- (unsigned int) size,
- GNUNET_a2s (sa, fromlen));
- GNUNET_break_op (0);
- return;
- }
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, total bytes received",
- size,
- GNUNET_NO);
- network_type = plugin->env->get_address_type (plugin->env->cls, sa, fromlen);
- switch (sa->sa_family)
- {
- case AF_INET:
- sa4 = (const struct sockaddr_in *) &addr;
- v4.options = 0;
- v4.ipv4_addr = sa4->sin_addr.s_addr;
- v4.u4_port = sa4->sin_port;
- int_addr = (union UdpAddress *) &v4;
- int_addr_len = sizeof(v4);
- break;
-
- case AF_INET6:
- sa6 = (const struct sockaddr_in6 *) &addr;
- v6.options = 0;
- v6.ipv6_addr = sa6->sin6_addr;
- v6.u6_port = sa6->sin6_port;
- int_addr = (union UdpAddress *) &v6;
- int_addr_len = sizeof(v6);
- break;
-
- default:
- GNUNET_break (0);
- return;
- }
-
- switch (ntohs (msg->type))
- {
- case GNUNET_MESSAGE_TYPE_TRANSPORT_BROADCAST_BEACON:
- if (GNUNET_YES == plugin->enable_broadcasting_receiving)
- udp_broadcast_receive (plugin,
- buf,
- size,
- int_addr,
- int_addr_len,
- network_type);
- return;
-
- case GNUNET_MESSAGE_TYPE_TRANSPORT_UDP_MESSAGE:
- if (ntohs (msg->size) < sizeof(struct UDPMessage))
- {
- GNUNET_break_op (0);
- return;
- }
- process_udp_message (plugin,
- (const struct UDPMessage *) msg,
- int_addr,
- int_addr_len,
- network_type);
- return;
-
- case GNUNET_MESSAGE_TYPE_TRANSPORT_UDP_ACK:
- read_process_ack (plugin, msg, int_addr, int_addr_len);
- return;
-
- case GNUNET_MESSAGE_TYPE_FRAGMENT:
- read_process_fragment (plugin, msg, int_addr, int_addr_len, network_type);
- return;
-
- default:
- GNUNET_break_op (0);
- return;
- }
-}
-
-
-/**
- * Removes messages from the transmission queue that have
- * timed out, and then selects a message that should be
- * transmitted next.
- *
- * @param plugin the UDP plugin
- * @param sock which socket should we process the queue for (v4 or v6)
- * @return message selected for transmission, or NULL for none
- */
-static struct UDP_MessageWrapper *
-remove_timeout_messages_and_select (struct Plugin *plugin,
- struct GNUNET_NETWORK_Handle *sock)
-{
- struct UDP_MessageWrapper *udpw;
- struct GNUNET_TIME_Relative remaining;
- struct GNUNET_ATS_Session *session;
- int removed;
-
- removed = GNUNET_NO;
- udpw = (sock == plugin->sockv4) ? plugin->ipv4_queue_head
- : plugin->ipv6_queue_head;
- while (NULL != udpw)
- {
- session = udpw->session;
- /* Find messages with timeout */
- remaining = GNUNET_TIME_absolute_get_remaining (udpw->timeout);
- if (GNUNET_TIME_UNIT_ZERO.rel_value_us == remaining.rel_value_us)
- {
- /* Message timed out */
- removed = GNUNET_YES;
- dequeue (plugin, udpw);
- udpw->qc (udpw->qc_cls, udpw, GNUNET_SYSERR);
- GNUNET_free (udpw);
-
- if (sock == plugin->sockv4)
- {
- udpw = plugin->ipv4_queue_head;
- }
- else if (sock == plugin->sockv6)
- {
- udpw = plugin->ipv6_queue_head;
- }
- else
- {
- GNUNET_break (0); /* should never happen */
- udpw = NULL;
- }
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# messages discarded due to timeout",
- 1,
- GNUNET_NO);
- }
- else
- {
- /* Message did not time out, check transmission time */
- remaining = GNUNET_TIME_absolute_get_remaining (udpw->transmission_time);
- if (0 == remaining.rel_value_us)
- {
- /* this message is not delayed */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Message for peer `%s' (%lu bytes) is not delayed \n",
- GNUNET_i2s (&udpw->session->target),
- (unsigned long) udpw->payload_size);
- break; /* Found message to send, break */
- }
- else
- {
- /* Message is delayed, try next */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Message for peer `%s' (%lu bytes) is delayed for %s\n",
- GNUNET_i2s (&udpw->session->target),
- (unsigned long) udpw->payload_size,
- GNUNET_STRINGS_relative_time_to_string (remaining, GNUNET_YES));
- udpw = udpw->next;
- }
- }
- }
- if (GNUNET_YES == removed)
- notify_session_monitor (session->plugin,
- session,
- GNUNET_TRANSPORT_SS_UPDATE);
- return udpw;
-}
-
-
-/**
- * We failed to transmit a message via UDP. Generate
- * a descriptive error message.
- *
- * @param plugin our plugin
- * @param sa target address we were trying to reach
- * @param slen number of bytes in @a sa
- * @param error the errno value returned from the sendto() call
- */
-static void
-analyze_send_error (struct Plugin *plugin,
- const struct sockaddr *sa,
- socklen_t slen,
- int error)
-{
- enum GNUNET_NetworkType type;
-
- type = plugin->env->get_address_type (plugin->env->cls, sa, slen);
- if (((GNUNET_NT_LAN == type) || (GNUNET_NT_WAN == type)) &&
- ((ENETUNREACH == errno) || (ENETDOWN == errno)))
- {
- if (slen == sizeof(struct sockaddr_in))
- {
- /* IPv4: "Network unreachable" or "Network down"
- *
- * This indicates we do not have connectivity
- */
- LOG (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
- _ ("UDP could not transmit message to `%s': "
- "Network seems down, please check your network configuration\n"),
- GNUNET_a2s (sa, slen));
- }
- if (slen == sizeof(struct sockaddr_in6))
- {
- /* IPv6: "Network unreachable" or "Network down"
- *
- * This indicates that this system is IPv6 enabled, but does not
- * have a valid global IPv6 address assigned or we do not have
- * connectivity
- */LOG (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
- _ (
- "UDP could not transmit IPv6 message! "
- "Please check your network configuration and disable IPv6 if your
"
- "connection does not have a global IPv6 address\n"));
- }
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "UDP could not transmit message to `%s': `%s'\n",
- GNUNET_a2s (sa, slen),
- strerror (error));
- }
-}
-
-
-/**
- * It is time to try to transmit a UDP message. Select one
- * and send.
- *
- * @param plugin the plugin
- * @param sock which socket (v4/v6) to send on
- */
-static void
-udp_select_send (struct Plugin *plugin, struct GNUNET_NETWORK_Handle *sock)
-{
- ssize_t sent;
- socklen_t slen;
- const struct sockaddr *a;
- const struct IPv4UdpAddress *u4;
- struct sockaddr_in a4;
- const struct IPv6UdpAddress *u6;
- struct sockaddr_in6 a6;
- struct UDP_MessageWrapper *udpw;
-
- /* Find message(s) to send */
- while (NULL != (udpw = remove_timeout_messages_and_select (plugin, sock)))
- {
- if (sizeof(struct IPv4UdpAddress) ==
- udpw->session->address->address_length)
- {
- u4 = udpw->session->address->address;
- memset (&a4, 0, sizeof(a4));
- a4.sin_family = AF_INET;
-#if HAVE_SOCKADDR_IN_SIN_LEN
- a4.sin_len = sizeof(a4);
-#endif
- a4.sin_port = u4->u4_port;
- a4.sin_addr.s_addr = u4->ipv4_addr;
- a = (const struct sockaddr *) &a4;
- slen = sizeof(a4);
- }
- else if (sizeof(struct IPv6UdpAddress) ==
- udpw->session->address->address_length)
- {
- u6 = udpw->session->address->address;
- memset (&a6, 0, sizeof(a6));
- a6.sin6_family = AF_INET6;
-#if HAVE_SOCKADDR_IN_SIN_LEN
- a6.sin6_len = sizeof(a6);
-#endif
- a6.sin6_port = u6->u6_port;
- a6.sin6_addr = u6->ipv6_addr;
- a = (const struct sockaddr *) &a6;
- slen = sizeof(a6);
- }
- else
- {
- GNUNET_break (0);
- dequeue (plugin, udpw);
- udpw->qc (udpw->qc_cls, udpw, GNUNET_SYSERR);
- notify_session_monitor (plugin,
- udpw->session,
- GNUNET_TRANSPORT_SS_UPDATE);
- GNUNET_free (udpw);
- continue;
- }
- sent = GNUNET_NETWORK_socket_sendto (sock,
- udpw->msg_buf,
- udpw->msg_size,
- a,
- slen);
- udpw->session->last_transmit_time =
- GNUNET_TIME_absolute_max (GNUNET_TIME_absolute_get (),
- udpw->session->last_transmit_time);
- dequeue (plugin, udpw);
- if (GNUNET_SYSERR == sent)
- {
- /* Failure */
- analyze_send_error (plugin, a, slen, errno);
- udpw->qc (udpw->qc_cls, udpw, GNUNET_SYSERR);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, total, bytes, sent, failure",
- sent,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, total, messages, sent, failure",
- 1,
- GNUNET_NO);
- }
- else
- {
- /* Success */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "UDP transmitted %u-byte message to `%s' `%s' (%d: %s)\n",
- (unsigned int) (udpw->msg_size),
- GNUNET_i2s (&udpw->session->target),
- GNUNET_a2s (a, slen),
- (int) sent,
- (sent < 0) ? strerror (errno) : "ok");
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, total, bytes, sent, success",
- sent,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UDP, total, messages, sent, success",
- 1,
- GNUNET_NO);
- if (NULL != udpw->frag_ctx)
- udpw->frag_ctx->on_wire_size += udpw->msg_size;
- udpw->qc (udpw->qc_cls, udpw, GNUNET_OK);
- }
- notify_session_monitor (plugin, udpw->session, GNUNET_TRANSPORT_SS_UPDATE);
- GNUNET_free (udpw);
- }
-}
-
-
-/* ***************** Event loop (part 2) *************** */
-
-
-/**
- * We have been notified that our readset has something to read. We don't
- * know which socket needs to be read, so we have to check each one
- * Then reschedule this function to be called again once more is available.
- *
- * @param cls the plugin handle
- */
-static void
-udp_plugin_select_v4 (void *cls)
-{
- struct Plugin *plugin = cls;
- const struct GNUNET_SCHEDULER_TaskContext *tc;
-
- plugin->select_task_v4 = NULL;
- if (NULL == plugin->sockv4)
- return;
- tc = GNUNET_SCHEDULER_get_task_context ();
- if ((0 != (tc->reason & GNUNET_SCHEDULER_REASON_READ_READY)) &&
- (GNUNET_NETWORK_fdset_isset (tc->read_ready, plugin->sockv4)))
- udp_select_read (plugin, plugin->sockv4);
- udp_select_send (plugin, plugin->sockv4);
- schedule_select_v4 (plugin);
-}
-
-
-/**
- * We have been notified that our readset has something to read. We don't
- * know which socket needs to be read, so we have to check each one
- * Then reschedule this function to be called again once more is available.
- *
- * @param cls the plugin handle
- */
-static void
-udp_plugin_select_v6 (void *cls)
-{
- struct Plugin *plugin = cls;
- const struct GNUNET_SCHEDULER_TaskContext *tc;
-
- plugin->select_task_v6 = NULL;
- if (NULL == plugin->sockv6)
- return;
- tc = GNUNET_SCHEDULER_get_task_context ();
- if ((0 != (tc->reason & GNUNET_SCHEDULER_REASON_READ_READY)) &&
- (GNUNET_NETWORK_fdset_isset (tc->read_ready, plugin->sockv6)))
- udp_select_read (plugin, plugin->sockv6);
-
- udp_select_send (plugin, plugin->sockv6);
- schedule_select_v6 (plugin);
-}
-
-
-/* ******************* Initialization *************** */
-
-
-/**
- * Setup the UDP sockets (for IPv4 and IPv6) for the plugin.
- *
- * @param plugin the plugin to initialize
- * @param bind_v6 IPv6 address to bind to (can be NULL, for 'any')
- * @param bind_v4 IPv4 address to bind to (can be NULL, for 'any')
- * @return number of sockets that were successfully bound
- */
-static unsigned int
-setup_sockets (struct Plugin *plugin,
- const struct sockaddr_in6 *bind_v6,
- const struct sockaddr_in *bind_v4)
-{
- int tries;
- unsigned int sockets_created = 0;
- struct sockaddr_in6 server_addrv6;
- struct sockaddr_in server_addrv4;
- const struct sockaddr *server_addr;
- const struct sockaddr *addrs[2];
- socklen_t addrlens[2];
- socklen_t addrlen;
- int eno;
-
- /* Create IPv6 socket */
- eno = EINVAL;
- if (GNUNET_YES == plugin->enable_ipv6)
- {
- plugin->sockv6 = GNUNET_NETWORK_socket_create (PF_INET6, SOCK_DGRAM, 0);
- if (NULL == plugin->sockv6)
- {
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ ("Disabling IPv6 since it is not supported on this system!\n"));
- plugin->enable_ipv6 = GNUNET_NO;
- }
- else
- {
- memset (&server_addrv6, 0, sizeof(struct sockaddr_in6));
-#if HAVE_SOCKADDR_IN_SIN_LEN
- server_addrv6.sin6_len = sizeof(struct sockaddr_in6);
-#endif
- server_addrv6.sin6_family = AF_INET6;
- if (NULL != bind_v6)
- server_addrv6.sin6_addr = bind_v6->sin6_addr;
- else
- server_addrv6.sin6_addr = in6addr_any;
-
- if (0 == plugin->port) /* autodetect */
- server_addrv6.sin6_port = htons (
- GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537)
- + 32000);
- else
- server_addrv6.sin6_port = htons (plugin->port);
- addrlen = sizeof(struct sockaddr_in6);
- server_addr = (const struct sockaddr *) &server_addrv6;
-
- tries = 0;
- while (tries < 10)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Binding to IPv6 `%s'\n",
- GNUNET_a2s (server_addr, addrlen));
- /* binding */
- if (GNUNET_OK ==
- GNUNET_NETWORK_socket_bind (plugin->sockv6, server_addr, addrlen))
- break;
- eno = errno;
- if (0 != plugin->port)
- {
- tries = 10; /* fail immediately */
- break; /* bind failed on specific port */
- }
- /* autodetect */
- server_addrv6.sin6_port = htons (
- GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537)
- + 32000);
- tries++;
- }
- if (tries >= 10)
- {
- GNUNET_NETWORK_socket_close (plugin->sockv6);
- plugin->enable_ipv6 = GNUNET_NO;
- plugin->sockv6 = NULL;
- }
- else
- {
- plugin->port = ntohs (server_addrv6.sin6_port);
- }
- if (NULL != plugin->sockv6)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "IPv6 UDP socket created listinging at %s\n",
- GNUNET_a2s (server_addr, addrlen));
- addrs[sockets_created] = server_addr;
- addrlens[sockets_created] = addrlen;
- sockets_created++;
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ ("Failed to bind UDP socket to %s: %s\n"),
- GNUNET_a2s (server_addr, addrlen),
- strerror (eno));
- }
- }
- }
-
- /* Create IPv4 socket */
- eno = EINVAL;
- plugin->sockv4 = GNUNET_NETWORK_socket_create (PF_INET, SOCK_DGRAM, 0);
- if (NULL == plugin->sockv4)
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "socket");
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ ("Disabling IPv4 since it is not supported on this system!\n"));
- plugin->enable_ipv4 = GNUNET_NO;
- }
- else
- {
- memset (&server_addrv4, 0, sizeof(struct sockaddr_in));
-#if HAVE_SOCKADDR_IN_SIN_LEN
- server_addrv4.sin_len = sizeof(struct sockaddr_in);
-#endif
- server_addrv4.sin_family = AF_INET;
- if (NULL != bind_v4)
- server_addrv4.sin_addr = bind_v4->sin_addr;
- else
- server_addrv4.sin_addr.s_addr = INADDR_ANY;
-
- if (0 == plugin->port)
- /* autodetect */
- server_addrv4.sin_port = htons (
- GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537) +
32000);
- else
- server_addrv4.sin_port = htons (plugin->port);
-
- addrlen = sizeof(struct sockaddr_in);
- server_addr = (const struct sockaddr *) &server_addrv4;
-
- tries = 0;
- while (tries < 10)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Binding to IPv4 `%s'\n",
- GNUNET_a2s (server_addr, addrlen));
-
- /* binding */
- if (GNUNET_OK ==
- GNUNET_NETWORK_socket_bind (plugin->sockv4, server_addr, addrlen))
- break;
- eno = errno;
- if (0 != plugin->port)
- {
- tries = 10; /* fail */
- break; /* bind failed on specific port */
- }
-
- /* autodetect */
- server_addrv4.sin_port = htons (
- GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_STRONG, 33537) +
32000);
- tries++;
- }
- if (tries >= 10)
- {
- GNUNET_NETWORK_socket_close (plugin->sockv4);
- plugin->enable_ipv4 = GNUNET_NO;
- plugin->sockv4 = NULL;
- }
- else
- {
- plugin->port = ntohs (server_addrv4.sin_port);
- }
-
- if (NULL != plugin->sockv4)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "IPv4 socket created on port %s\n",
- GNUNET_a2s (server_addr, addrlen));
- addrs[sockets_created] = server_addr;
- addrlens[sockets_created] = addrlen;
- sockets_created++;
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to bind UDP socket to %s: %s\n"),
- GNUNET_a2s (server_addr, addrlen),
- strerror (eno));
- }
- }
-
- if (0 == sockets_created)
- {
- LOG (GNUNET_ERROR_TYPE_WARNING, _ ("Failed to open UDP sockets\n"));
- return 0; /* No sockets created, return */
- }
- schedule_select_v4 (plugin);
- schedule_select_v6 (plugin);
- plugin->nat = GNUNET_NAT_register (plugin->env->cfg,
- "transport-udp",
- IPPROTO_UDP,
- sockets_created,
- addrs,
- addrlens,
- &udp_nat_port_map_callback,
- NULL,
- plugin);
- return sockets_created;
-}
-
-
-/**
- * The exported method. Makes the core api available via a global and
- * returns the udp transport API.
- *
- * @param cls our `struct GNUNET_TRANSPORT_PluginEnvironment`
- * @return our `struct GNUNET_TRANSPORT_PluginFunctions`
- */
-void *
-libgnunet_plugin_transport_udp_init (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginEnvironment *env = cls;
- struct GNUNET_TRANSPORT_PluginFunctions *api;
- struct Plugin *p;
- unsigned long long port;
- unsigned long long aport;
- unsigned long long udp_max_bps;
- int enable_v6;
- int enable_broadcasting;
- int enable_broadcasting_recv;
- char *bind4_address;
- char *bind6_address;
- struct GNUNET_TIME_Relative interval;
- struct sockaddr_in server_addrv4;
- struct sockaddr_in6 server_addrv6;
- unsigned int res;
- int have_bind4;
- int have_bind6;
-
- if (NULL == env->receive)
- {
- /* run in 'stub' mode (i.e. as part of gnunet-peerinfo), don't fully
- initialize the plugin or the API */
- api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
- api->cls = NULL;
- api->address_pretty_printer = &udp_plugin_address_pretty_printer;
- api->address_to_string = &udp_address_to_string;
- api->string_to_address = &udp_string_to_address;
- return api;
- }
-
- /* Get port number: port == 0 : autodetect a port,
- * > 0 : use this port, not given : 2086 default */
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (env->cfg,
- "transport-udp",
- "PORT",
- &port))
- port = 2086;
- if (port > 65535)
- {
- GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
- "transport-udp",
- "PORT",
- _ ("must be in [0,65535]"));
- return NULL;
- }
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (env->cfg,
- "transport-udp",
- "ADVERTISED_PORT",
- &aport))
- aport = port;
- if (aport > 65535)
- {
- GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
- "transport-udp",
- "ADVERTISED_PORT",
- _ ("must be in [0,65535]"));
- return NULL;
- }
-
- if (GNUNET_YES ==
- GNUNET_CONFIGURATION_get_value_yesno (env->cfg, "nat", "DISABLEV6"))
- enable_v6 = GNUNET_NO;
- else
- enable_v6 = GNUNET_YES;
-
- have_bind4 = GNUNET_NO;
- memset (&server_addrv4, 0, sizeof(server_addrv4));
- if (GNUNET_YES == GNUNET_CONFIGURATION_get_value_string (env->cfg,
- "transport-udp",
- "BINDTO",
- &bind4_address))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Binding UDP plugin to specific address: `%s'\n",
- bind4_address);
- if (1 != inet_pton (AF_INET, bind4_address, &server_addrv4.sin_addr))
- {
- GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
- "transport-udp",
- "BINDTO",
- _ ("must be valid IPv4 address"));
- GNUNET_free (bind4_address);
- return NULL;
- }
- have_bind4 = GNUNET_YES;
- }
- GNUNET_free (bind4_address);
- have_bind6 = GNUNET_NO;
- memset (&server_addrv6, 0, sizeof(server_addrv6));
- if (GNUNET_YES == GNUNET_CONFIGURATION_get_value_string (env->cfg,
- "transport-udp",
- "BINDTO6",
- &bind6_address))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Binding udp plugin to specific address: `%s'\n",
- bind6_address);
- if (1 != inet_pton (AF_INET6, bind6_address, &server_addrv6.sin6_addr))
- {
- GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
- "transport-udp",
- "BINDTO6",
- _ ("must be valid IPv6 address"));
- GNUNET_free (bind6_address);
- return NULL;
- }
- have_bind6 = GNUNET_YES;
- }
- GNUNET_free (bind6_address);
-
- enable_broadcasting = GNUNET_CONFIGURATION_get_value_yesno (env->cfg,
- "transport-udp",
- "BROADCAST");
- if (enable_broadcasting == GNUNET_SYSERR)
- enable_broadcasting = GNUNET_NO;
-
- enable_broadcasting_recv =
- GNUNET_CONFIGURATION_get_value_yesno (env->cfg,
- "transport-udp",
- "BROADCAST_RECEIVE");
- if (enable_broadcasting_recv == GNUNET_SYSERR)
- enable_broadcasting_recv = GNUNET_YES;
-
- if (GNUNET_SYSERR ==
- GNUNET_CONFIGURATION_get_value_time (env->cfg,
- "transport-udp",
- "BROADCAST_INTERVAL",
- &interval))
- {
- interval = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10);
- }
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (env->cfg,
- "transport-udp",
- "MAX_BPS",
- &udp_max_bps))
- {
- /* 50 MB/s == infinity for practical purposes */
- udp_max_bps = 1024 * 1024 * 50;
- }
-
- p = GNUNET_new (struct Plugin);
- p->port = port;
- p->aport = aport;
- p->broadcast_interval = interval;
- p->enable_ipv6 = enable_v6;
- p->enable_ipv4 = GNUNET_YES; /* default */
- p->enable_broadcasting = enable_broadcasting;
- p->enable_broadcasting_receiving = enable_broadcasting_recv;
- p->env = env;
- p->sessions = GNUNET_CONTAINER_multipeermap_create (16, GNUNET_NO);
- p->defrag_ctxs =
- GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
- GNUNET_BANDWIDTH_tracker_init (&p->tracker,
- NULL,
- NULL,
- GNUNET_BANDWIDTH_value_init (
- (uint32_t) udp_max_bps),
- 30);
- res = setup_sockets (p,
- (GNUNET_YES == have_bind6) ? &server_addrv6 : NULL,
- (GNUNET_YES == have_bind4) ? &server_addrv4 : NULL);
- if ((0 == res) || ((NULL == p->sockv4) && (NULL == p->sockv6)))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR, _ ("Failed to create UDP network
sockets\n"));
- GNUNET_CONTAINER_multipeermap_destroy (p->sessions);
- GNUNET_CONTAINER_heap_destroy (p->defrag_ctxs);
- if (NULL != p->nat)
- GNUNET_NAT_unregister (p->nat);
- GNUNET_free (p);
- return NULL;
- }
-
- /* Setup broadcasting and receiving beacons */
- setup_broadcast (p, &server_addrv6, &server_addrv4);
-
- api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
- api->cls = p;
- api->disconnect_session = &udp_disconnect_session;
- api->query_keepalive_factor = &udp_query_keepalive_factor;
- api->disconnect_peer = &udp_disconnect;
- api->address_pretty_printer = &udp_plugin_address_pretty_printer;
- api->address_to_string = &udp_address_to_string;
- api->string_to_address = &udp_string_to_address;
- api->check_address = &udp_plugin_check_address;
- api->get_session = &udp_plugin_get_session;
- api->send = &udp_plugin_send;
- api->get_network = &udp_plugin_get_network;
- api->get_network_for_address = &udp_plugin_get_network_for_address;
- api->update_session_timeout = &udp_plugin_update_session_timeout;
- api->setup_monitor = &udp_plugin_setup_monitor;
- return api;
-}
-
-
-/**
- * Function called on each entry in the defragmentation heap to
- * clean it up.
- *
- * @param cls NULL
- * @param node node in the heap (to be removed)
- * @param element a `struct DefragContext` to be cleaned up
- * @param cost unused
- * @return #GNUNET_YES
- */
-static int
-heap_cleanup_iterator (void *cls,
- struct GNUNET_CONTAINER_HeapNode *node,
- void *element,
- GNUNET_CONTAINER_HeapCostType cost)
-{
- struct DefragContext *d_ctx = element;
-
- GNUNET_CONTAINER_heap_remove_node (node);
- GNUNET_DEFRAGMENT_context_destroy (d_ctx->defrag);
- GNUNET_free (d_ctx);
- return GNUNET_YES;
-}
-
-
-/**
- * The exported method. Makes the core api available via a global and
- * returns the udp transport API.
- *
- * @param cls our `struct GNUNET_TRANSPORT_PluginEnvironment`
- * @return NULL
- */
-void *
-libgnunet_plugin_transport_udp_done (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
- struct Plugin *plugin = api->cls;
- struct PrettyPrinterContext *cur;
- struct UDP_MessageWrapper *udpw;
-
- if (NULL == plugin)
- {
- GNUNET_free (api);
- return NULL;
- }
- stop_broadcast (plugin);
- if (NULL != plugin->select_task_v4)
- {
- GNUNET_SCHEDULER_cancel (plugin->select_task_v4);
- plugin->select_task_v4 = NULL;
- }
- if (NULL != plugin->select_task_v6)
- {
- GNUNET_SCHEDULER_cancel (plugin->select_task_v6);
- plugin->select_task_v6 = NULL;
- }
- if (NULL != plugin->sockv4)
- {
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (plugin->sockv4));
- plugin->sockv4 = NULL;
- }
- if (NULL != plugin->sockv6)
- {
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (plugin->sockv6));
- plugin->sockv6 = NULL;
- }
- if (NULL != plugin->nat)
- {
- GNUNET_NAT_unregister (plugin->nat);
- plugin->nat = NULL;
- }
- if (NULL != plugin->defrag_ctxs)
- {
- GNUNET_CONTAINER_heap_iterate (plugin->defrag_ctxs,
- &heap_cleanup_iterator,
- NULL);
- GNUNET_CONTAINER_heap_destroy (plugin->defrag_ctxs);
- plugin->defrag_ctxs = NULL;
- }
- while (NULL != (udpw = plugin->ipv4_queue_head))
- {
- dequeue (plugin, udpw);
- udpw->qc (udpw->qc_cls, udpw, GNUNET_SYSERR);
- GNUNET_free (udpw);
- }
- while (NULL != (udpw = plugin->ipv6_queue_head))
- {
- dequeue (plugin, udpw);
- udpw->qc (udpw->qc_cls, udpw, GNUNET_SYSERR);
- GNUNET_free (udpw);
- }
- GNUNET_CONTAINER_multipeermap_iterate (plugin->sessions,
- &disconnect_and_free_it,
- plugin);
- GNUNET_CONTAINER_multipeermap_destroy (plugin->sessions);
-
- while (NULL != (cur = plugin->ppc_dll_head))
- {
- GNUNET_break (0);
- GNUNET_CONTAINER_DLL_remove (plugin->ppc_dll_head,
- plugin->ppc_dll_tail,
- cur);
- GNUNET_RESOLVER_request_cancel (cur->resolver_handle);
- if (NULL != cur->timeout_task)
- {
- GNUNET_SCHEDULER_cancel (cur->timeout_task);
- cur->timeout_task = NULL;
- }
- GNUNET_free (cur);
- }
- GNUNET_free (plugin);
- GNUNET_free (api);
- return NULL;
-}
-
-
-/* end of plugin_transport_udp.c */
diff --git a/src/transport/plugin_transport_udp.h
b/src/transport/plugin_transport_udp.h
deleted file mode 100644
index 7192da885..000000000
--- a/src/transport/plugin_transport_udp.h
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2010-2014 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/plugin_transport_udp.h
- * @brief Implementation of the UDP transport protocol
- * @author Christian Grothoff
- * @author Nathan Evans
- * @author Matthias Wachs
- */
-#ifndef PLUGIN_TRANSPORT_UDP_H
-#define PLUGIN_TRANSPORT_UDP_H
-
-#include "platform.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_fragmentation_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_resolver_service.h"
-#include "gnunet_signatures.h"
-#include "gnunet_constants.h"
-#include "gnunet_statistics_service.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_transport_plugin.h"
-#include "transport.h"
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "transport-udp", __VA_ARGS__)
-
-#define PLUGIN_NAME "udp"
-
-#define DEBUG_UDP GNUNET_NO
-
-#define DEBUG_UDP_BROADCASTING GNUNET_NO
-
-/**
- * MTU for fragmentation subsystem. Should be conservative since
- * all communicating peers MUST work with this MTU.
- */
-#define UDP_MTU 1400
-
-
-GNUNET_NETWORK_STRUCT_BEGIN
-/**
- * Network format for IPv4 addresses.
- */
-struct IPv4UdpAddress
-{
- /**
- * Optional options and flags for this address
- */
- uint32_t options GNUNET_PACKED;
-
- /**
- * IPv4 address, in network byte order.
- */
- uint32_t ipv4_addr GNUNET_PACKED;
-
- /**
- * Port number, in network byte order.
- */
- uint16_t u4_port GNUNET_PACKED;
-};
-
-
-/**
- * Network format for IPv6 addresses.
- */
-struct IPv6UdpAddress
-{
- /**
- * Optional options and flags for this address
- */
- uint32_t options GNUNET_PACKED;
-
- /**
- * IPv6 address.
- */
- struct in6_addr ipv6_addr GNUNET_PACKED;
-
- /**
- * Port number, in network byte order.
- */
- uint16_t u6_port GNUNET_PACKED;
-};
-GNUNET_NETWORK_STRUCT_END
-
-/**
- * Either an IPv4 or IPv6 UDP address. Note that without a "length",
- * one cannot tell which one of the two types this address represents.
- */
-union UdpAddress
-{
- /**
- * IPv4 case.
- */
- struct IPv4UdpAddress v4;
-
- /**
- * IPv6 case.
- */
- struct IPv6UdpAddress v6;
-};
-
-
-/**
- * Information we track for each message in the queue.
- */
-struct UDP_MessageWrapper;
-
-
-/**
- * Closure for #append_port().
- */
-struct PrettyPrinterContext;
-
-
-/**
- * Encapsulation of all of the state of the plugin.
- */
-struct Plugin
-{
- /**
- * Our environment.
- */
- struct GNUNET_TRANSPORT_PluginEnvironment *env;
-
- /**
- * Session of peers with whom we are currently connected,
- * map of peer identity to `struct GNUNET_ATS_Session *`.
- */
- struct GNUNET_CONTAINER_MultiPeerMap *sessions;
-
- /**
- * Heap with all of our defragmentation activities.
- */
- struct GNUNET_CONTAINER_Heap *defrag_ctxs;
-
- /**
- * ID of select task for IPv4
- */
- struct GNUNET_SCHEDULER_Task *select_task_v4;
-
- /**
- * ID of select task for IPv6
- */
- struct GNUNET_SCHEDULER_Task *select_task_v6;
-
- /**
- * Bandwidth tracker to limit global UDP traffic.
- */
- struct GNUNET_BANDWIDTH_Tracker tracker;
-
- /**
- * Address we were told to bind to exclusively (IPv4).
- */
- char *bind4_address;
-
- /**
- * Address we were told to bind to exclusively (IPv6).
- */
- char *bind6_address;
-
- /**
- * Handle to NAT traversal support.
- */
- struct GNUNET_NAT_Handle *nat;
-
- /**
- * Handle to NAT traversal support.
- */
- struct GNUNET_NAT_STUN_Handle *stun;
-
- /**
- * The read socket for IPv4
- */
- struct GNUNET_NETWORK_Handle *sockv4;
-
- /**
- * The read socket for IPv6
- */
- struct GNUNET_NETWORK_Handle *sockv6;
-
- /**
- * Head of DLL of broadcast addresses
- */
- struct BroadcastAddress *broadcast_tail;
-
- /**
- * Tail of DLL of broadcast addresses
- */
- struct BroadcastAddress *broadcast_head;
-
- /**
- * Head of messages in IPv4 queue.
- */
- struct UDP_MessageWrapper *ipv4_queue_head;
-
- /**
- * Tail of messages in IPv4 queue.
- */
- struct UDP_MessageWrapper *ipv4_queue_tail;
-
- /**
- * Head of messages in IPv6 queue.
- */
- struct UDP_MessageWrapper *ipv6_queue_head;
-
- /**
- * Tail of messages in IPv6 queue.
- */
- struct UDP_MessageWrapper *ipv6_queue_tail;
-
- /**
- * Running pretty printers: head
- */
- struct PrettyPrinterContext *ppc_dll_head;
-
- /**
- * Running pretty printers: tail
- */
- struct PrettyPrinterContext *ppc_dll_tail;
-
- /**
- * Function to call about session status changes.
- */
- GNUNET_TRANSPORT_SessionInfoCallback sic;
-
- /**
- * Closure for @e sic.
- */
- void *sic_cls;
-
- /**
- * IPv6 multicast address
- */
- struct sockaddr_in6 ipv6_multicast_address;
-
- /**
- * Broadcast interval
- */
- struct GNUNET_TIME_Relative broadcast_interval;
-
- /**
- * Bytes currently in buffer
- */
- int64_t bytes_in_buffer;
-
- /**
- * Address options
- */
- uint32_t myoptions;
-
- /**
- * Is IPv6 enabled: #GNUNET_YES or #GNUNET_NO
- */
- int enable_ipv6;
-
- /**
- * Is IPv4 enabled: #GNUNET_YES or #GNUNET_NO
- */
- int enable_ipv4;
-
- /**
- * Is broadcasting enabled: #GNUNET_YES or #GNUNET_NO
- */
- int enable_broadcasting;
-
- /**
- * Is receiving broadcasts enabled: #GNUNET_YES or #GNUNET_NO
- */
- int enable_broadcasting_receiving;
-
- /**
- * Port we broadcasting on.
- */
- uint16_t broadcast_port;
-
- /**
- * Port we listen on.
- */
- uint16_t port;
-
- /**
- * Port we advertise on.
- */
- uint16_t aport;
-};
-
-
-/**
- * Function called for a quick conversion of the binary address to
- * a numeric address. Note that the caller must not free the
- * address and that the next call to this function is allowed
- * to override the address again.
- *
- * @param cls closure
- * @param addr binary address (a `union UdpAddress`)
- * @param addrlen length of the @a addr
- * @return string representing the same address
- */
-const char *
-udp_address_to_string (void *cls,
- const void *addr,
- size_t addrlen);
-
-
-/**
- * We received a broadcast message. Process it and all subsequent
- * messages in the same packet.
- *
- * @param plugin the UDP plugin
- * @param buf the buffer with the message(s)
- * @param size number of bytes in @a buf
- * @param udp_addr address of the sender
- * @param udp_addr_len number of bytes in @a udp_addr
- * @param network_type network type of the sender's address
- */
-void
-udp_broadcast_receive (struct Plugin *plugin,
- const char *buf,
- ssize_t size,
- const union UdpAddress *udp_addr,
- size_t udp_addr_len,
- enum GNUNET_NetworkType network_type);
-
-
-void
-setup_broadcast (struct Plugin *plugin,
- struct sockaddr_in6 *server_addrv6,
- struct sockaddr_in *server_addrv4);
-
-
-void
-stop_broadcast (struct Plugin *plugin);
-
-/*#ifndef PLUGIN_TRANSPORT_UDP_H*/
-#endif
-/* end of plugin_transport_udp.h */
diff --git a/src/transport/plugin_transport_udp_broadcasting.c
b/src/transport/plugin_transport_udp_broadcasting.c
deleted file mode 100644
index a65f5bd2f..000000000
--- a/src/transport/plugin_transport_udp_broadcasting.c
+++ /dev/null
@@ -1,647 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2010, 2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/plugin_transport_udp_broadcasting.c
- * @brief Neighbour discovery with UDP
- * @author Christian Grothoff
- * @author Matthias Wachs
- */
-#include "platform.h"
-#include "plugin_transport_udp.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_fragmentation_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_resolver_service.h"
-#include "gnunet_signatures.h"
-#include "gnunet_constants.h"
-#include "gnunet_statistics_service.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_transport_plugin.h"
-#include "transport.h"
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "transport-udp", __VA_ARGS__)
-
-/* *********** Cryogenic ********** */
-#ifdef __linux__
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include <sys/ioctl.h>
-#include <sys/select.h>
-#include <sys/time.h>
-
-#define PM_MAGIC 'k'
-#define PM_SET_DELAY_AND_TIMEOUT _IOW (PM_MAGIC, 1, struct pm_times)
-
-struct pm_times
-{
- unsigned long delay_msecs;
- unsigned long timeout_msecs;
-};
-#endif
-/************************************/
-
-
-struct UDP_Beacon_Message
-{
- /**
- * Message header.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * What is the identity of the sender
- */
- struct GNUNET_PeerIdentity sender;
-};
-
-
-struct BroadcastAddress
-{
- struct BroadcastAddress *next;
-
- struct BroadcastAddress *prev;
-
- /**
- * ID of select broadcast task
- */
- struct GNUNET_SCHEDULER_Task *broadcast_task;
-
- struct Plugin *plugin;
-
- struct sockaddr *addr;
-
- socklen_t addrlen;
-
-#ifdef __linux__
- /**
- * Cryogenic handle.
- */
- struct GNUNET_DISK_FileHandle *cryogenic_fd;
-
- /**
- * Time out for cryogenic.
- */
- struct pm_times cryogenic_times;
-#endif
-};
-
-
-/**
- * Client-specific context for #broadcast_mst_cb().
- */
-struct MstContext
-{
- struct Plugin *plugin;
-
- const union UdpAddress *udp_addr;
-
- size_t udp_addr_len;
-
- /**
- * ATS network type.
- */
- enum GNUNET_NetworkType ats_address_network_type;
-};
-
-
-/**
- * Parse broadcast message received.
- *
- * @param cls the `struct Plugin`
- * @param client the `struct MstContext` with sender address
- * @param message the message we received
- * @return #GNUNET_OK (always)
- */
-static int
-broadcast_mst_cb (void *cls,
- const struct GNUNET_MessageHeader *message)
-{
- struct MstContext *mc = cls;
- struct Plugin *plugin = mc->plugin;
- struct GNUNET_HELLO_Address *address;
- const struct GNUNET_MessageHeader *hello;
- const struct UDP_Beacon_Message *msg;
-
- msg = (const struct UDP_Beacon_Message *) message;
-
- if (GNUNET_MESSAGE_TYPE_TRANSPORT_BROADCAST_BEACON !=
- ntohs (msg->header.type))
- return GNUNET_OK;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received beacon with %u bytes from peer `%s' via address `%s'\n",
- ntohs (msg->header.size),
- GNUNET_i2s (&msg->sender),
- udp_address_to_string (NULL,
- mc->udp_addr,
- mc->udp_addr_len));
- hello = (struct GNUNET_MessageHeader *) &msg[1];
- address = GNUNET_HELLO_address_allocate (&msg->sender,
- PLUGIN_NAME,
- mc->udp_addr,
- mc->udp_addr_len,
- GNUNET_HELLO_ADDRESS_INFO_NONE);
- plugin->env->receive (plugin->env->cls,
- address,
- NULL,
- hello);
- GNUNET_HELLO_address_free (address);
- GNUNET_STATISTICS_update (plugin->env->stats,
- _ ("# Multicast HELLO beacons received via UDP"),
- 1, GNUNET_NO);
- return GNUNET_OK;
-}
-
-
-/**
- * We received a broadcast message. Process it and all subsequent
- * messages in the same packet.
- *
- * @param plugin the UDP plugin
- * @param buf the buffer with the message(s)
- * @param size number of bytes in @a buf
- * @param udp_addr address of the sender
- * @param udp_addr_len number of bytes in @a udp_addr
- * @param network_type network type of the sender's address
- */
-void
-udp_broadcast_receive (struct Plugin *plugin,
- const char *buf,
- ssize_t size,
- const union UdpAddress *udp_addr,
- size_t udp_addr_len,
- enum GNUNET_NetworkType network_type)
-{
- struct GNUNET_MessageStreamTokenizer *broadcast_mst;
- struct MstContext mc;
-
- broadcast_mst = GNUNET_MST_create (&broadcast_mst_cb,
- &mc);
- mc.plugin = plugin;
- mc.udp_addr = udp_addr;
- mc.udp_addr_len = udp_addr_len;
- mc.ats_address_network_type = network_type;
- GNUNET_MST_from_buffer (broadcast_mst,
- buf, size,
- GNUNET_NO,
- GNUNET_NO);
- GNUNET_MST_destroy (broadcast_mst);
-}
-
-
-static unsigned int
-prepare_beacon (struct Plugin *plugin,
- struct UDP_Beacon_Message *msg)
-{
- uint16_t hello_size;
- uint16_t msg_size;
-
- const struct GNUNET_MessageHeader *hello;
-
- hello = plugin->env->get_our_hello ();
- if (NULL == hello)
- return 0;
- hello_size = GNUNET_HELLO_size ((struct GNUNET_HELLO_Message *) hello);
- msg_size = hello_size + sizeof(struct UDP_Beacon_Message);
-
- if ((hello_size < (sizeof(struct GNUNET_MessageHeader))) ||
- (msg_size > (UDP_MTU)))
- return 0;
-
- msg->sender = *(plugin->env->my_identity);
- msg->header.size = htons (msg_size);
- msg->header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_BROADCAST_BEACON);
- GNUNET_memcpy (&msg[1], hello, hello_size);
- return msg_size;
-}
-
-
-static void
-udp_ipv4_broadcast_send (void *cls)
-{
- struct BroadcastAddress *baddr = cls;
- struct Plugin *plugin = baddr->plugin;
- int sent;
- uint16_t msg_size;
- char buf[65536] GNUNET_ALIGN;
-
- baddr->broadcast_task = NULL;
-
- msg_size = prepare_beacon (plugin, (struct UDP_Beacon_Message *) &buf);
- if (0 != msg_size)
- {
- struct sockaddr_in *addr = (struct sockaddr_in *) baddr->addr;
-
- addr->sin_port = htons (plugin->port);
- sent = GNUNET_NETWORK_socket_sendto (plugin->sockv4, &buf, msg_size,
- (const struct sockaddr *) addr,
- baddr->addrlen);
- if (sent == GNUNET_SYSERR)
- {
- if ((ENETUNREACH == errno) || (ENETDOWN == errno))
- {
- /* "Network unreachable" or "Network down"
- *
- * This indicates that we just do not have network connectivity
- */
- GNUNET_log (GNUNET_ERROR_TYPE_BULK | GNUNET_ERROR_TYPE_WARNING,
- "Network connectivity is down, cannot send beacon!\n");
- }
- else
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "sendto");
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Sent HELLO beacon broadcast with %i bytes to address %s\n", sent,
- GNUNET_a2s (baddr->addr, baddr->addrlen));
- }
- }
-
-#ifdef __linux__
- /*
- * Cryogenic
- */
- if (NULL != baddr->cryogenic_fd)
- {
- baddr->cryogenic_times.delay_msecs =
- (plugin->broadcast_interval.rel_value_us / 1000.0) * 0.5;
- baddr->cryogenic_times.timeout_msecs =
- (plugin->broadcast_interval.rel_value_us / 1000.0) * 1.5;
-
- if (ioctl (baddr->cryogenic_fd->fd,
- PM_SET_DELAY_AND_TIMEOUT,
- &baddr->cryogenic_times) < 0)
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "ioctl");
- baddr->broadcast_task =
- GNUNET_SCHEDULER_add_delayed (plugin->broadcast_interval,
- &udp_ipv4_broadcast_send, baddr);
- }
- else
- GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
- baddr->cryogenic_fd,
- &udp_ipv4_broadcast_send,
- baddr);
- }
- else
-#endif
- baddr->broadcast_task =
- GNUNET_SCHEDULER_add_delayed (plugin->broadcast_interval,
- &udp_ipv4_broadcast_send, baddr);
-}
-
-
-static void
-udp_ipv6_broadcast_send (void *cls)
-{
- struct BroadcastAddress *baddr = cls;
- struct Plugin *plugin = baddr->plugin;
- ssize_t sent;
- uint16_t msg_size;
- char buf[65536] GNUNET_ALIGN;
- const struct sockaddr_in6 *s6 = (const struct sockaddr_in6 *) baddr->addr;
-
- baddr->broadcast_task = NULL;
-
- msg_size = prepare_beacon (plugin, (struct UDP_Beacon_Message *) &buf);
- /* Note: unclear if this actually works to limit the multicast to
- the specified interface as we're not (necessarily) using a
- link-local multicast group and the kernel suggests that the
- scope ID is only respected for link-local addresses; however,
- if the scope ID is ignored, the kernel should just multicast
- on ALL interfaces, which is merely slightly less efficient;
- in that case, we might want to revert to only doing this
- once, and not per interface (hard to test...)
*/plugin->ipv6_multicast_address.sin6_scope_id = s6->sin6_scope_id;
- sent = GNUNET_NETWORK_socket_sendto (plugin->sockv6, &buf, msg_size,
- (const struct sockaddr *)
- &plugin->ipv6_multicast_address,
- sizeof(struct sockaddr_in6));
- plugin->ipv6_multicast_address.sin6_scope_id = 0;
- if (sent == GNUNET_SYSERR)
- {
- if ((ENETUNREACH == errno) || (ENETDOWN == errno))
- {
- /* "Network unreachable" or "Network down"
- *
- * This indicates that this system is IPv6 enabled, but does not
- * have a valid global IPv6 address assigned
- */GNUNET_log (GNUNET_ERROR_TYPE_BULK | GNUNET_ERROR_TYPE_WARNING,
- "Network connectivity is down, cannot send beacon!\n");
- }
- else
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "sendto");
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Sending IPv6 HELLO beacon broadcast with %d bytes to address %s\n",
- (int) sent,
- GNUNET_a2s ((const struct sockaddr *) &plugin->ipv6_multicast_address,
- sizeof(struct sockaddr_in6)));
- }
-#ifdef __linux__
- /*
- * Cryogenic
- */
- if (NULL != baddr->cryogenic_fd)
- {
- baddr->cryogenic_times.delay_msecs =
- (plugin->broadcast_interval.rel_value_us / 1000.0) * 0.5;
- baddr->cryogenic_times.timeout_msecs =
- (plugin->broadcast_interval.rel_value_us / 1000.0) * 1.5;
-
- if (ioctl (baddr->cryogenic_fd->fd,
- PM_SET_DELAY_AND_TIMEOUT,
- &baddr->cryogenic_times) < 0)
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "ioctl");
- baddr->broadcast_task =
- GNUNET_SCHEDULER_add_delayed (plugin->broadcast_interval,
- &udp_ipv6_broadcast_send, baddr);
- }
- else
- GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
- baddr->cryogenic_fd,
- &udp_ipv6_broadcast_send,
- baddr);
- }
- else
-#endif
- baddr->broadcast_task =
- GNUNET_SCHEDULER_add_delayed (plugin->broadcast_interval,
- &udp_ipv6_broadcast_send, baddr);
-}
-
-
-/**
- * Callback function invoked for each interface found.
- *
- * @param cls closure with the `struct Plugin`
- * @param name name of the interface (can be NULL for unknown)
- * @param isDefault is this presumably the default interface
- * @param addr address of this interface (can be NULL for unknown or
unassigned)
- * @param broadcast_addr the broadcast address (can be NULL for unknown or
unassigned)
- * @param netmask the network mask (can be NULL for unknown or unassigned)
- * @param addrlen length of the address
- * @return #GNUNET_OK to continue iteration, #GNUNET_SYSERR to abort
- */
-static int
-iface_proc (void *cls,
- const char *name,
- int isDefault,
- const struct sockaddr *addr,
- const struct sockaddr *broadcast_addr,
- const struct sockaddr *netmask, socklen_t addrlen)
-{
- struct Plugin *plugin = cls;
- struct BroadcastAddress *ba;
- enum GNUNET_NetworkType network;
-
- if (NULL == addr)
- return GNUNET_OK;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "address %s for interface %s %p\n ",
- GNUNET_a2s (addr, addrlen), name, addr);
- if (NULL == broadcast_addr)
- return GNUNET_OK;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "broadcast address %s for interface %s %p\n ",
- GNUNET_a2s (broadcast_addr, addrlen), name, broadcast_addr);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "netmask %s for interface %s %p\n ",
- GNUNET_a2s (netmask, addrlen), name, netmask);
-
- network = plugin->env->get_address_type (plugin->env->cls, broadcast_addr,
- addrlen);
- if (GNUNET_NT_LOOPBACK == network)
- {
- /* Broadcasting on loopback does not make sense */
- return GNUNET_YES;
- }
-
- ba = GNUNET_new (struct BroadcastAddress);
- ba->plugin = plugin;
- ba->addr = GNUNET_malloc (addrlen);
- GNUNET_memcpy (ba->addr, broadcast_addr, addrlen);
- ba->addrlen = addrlen;
-
- if ((GNUNET_YES == plugin->enable_ipv4) &&
- (NULL != plugin->sockv4) &&
- (addrlen == sizeof(struct sockaddr_in)))
- {
-#ifdef __linux__
- /*
- * setup Cryogenic FD for ipv4 broadcasting
- */
- char *filename;
-
- GNUNET_asprintf (&filename,
- "/dev/cryogenic/%s",
- name);
- if (0 == access (name, R_OK))
- {
- ba->cryogenic_fd =
- GNUNET_DISK_file_open (filename,
- GNUNET_DISK_OPEN_WRITE,
- GNUNET_DISK_PERM_NONE);
- }
- GNUNET_free (filename);
-#endif
- ba->broadcast_task =
- GNUNET_SCHEDULER_add_now (&udp_ipv4_broadcast_send, ba);
- }
- if ((GNUNET_YES == plugin->enable_ipv6) &&
- (NULL != plugin->sockv6) &&
- (addrlen == sizeof(struct sockaddr_in6)))
- {
- /* Create IPv6 multicast request */
- struct ipv6_mreq multicastRequest;
- const struct sockaddr_in6 *s6 = (const struct
- sockaddr_in6 *) broadcast_addr;
-
- multicastRequest.ipv6mr_multiaddr =
- plugin->ipv6_multicast_address.sin6_addr;
- /* http://tools.ietf.org/html/rfc2553#section-5.2:
- *
- * IPV6_JOIN_GROUP
- *
- * Join a multicast group on a specified local interface. If the
- * interface index is specified as 0, the kernel chooses the local
- * interface. For example, some kernels look up the multicast
- * group in the normal IPv6 routing table and using the resulting
- * interface; we do this for each interface, so no need to use
- * zero (anymore...).
- */multicastRequest.ipv6mr_interface = s6->sin6_scope_id;
-
- /* Join the multicast group */
- if (GNUNET_OK !=
- GNUNET_NETWORK_socket_setsockopt
- (plugin->sockv6, IPPROTO_IPV6, IPV6_JOIN_GROUP,
- &multicastRequest, sizeof(multicastRequest)))
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "Failed to join IPv6 multicast group: IPv6 broadcasting not
running\n");
- }
- else
- {
-#ifdef __linux__
- /*
- * setup Cryogenic FD for ipv6 broadcasting
- */
- char *filename;
-
- GNUNET_asprintf (&filename,
- "/dev/cryogenic/%s",
- name);
- if (0 == access (name, R_OK))
- {
- ba->cryogenic_fd =
- GNUNET_DISK_file_open (filename,
- GNUNET_DISK_OPEN_WRITE,
- GNUNET_DISK_PERM_NONE);
- }
- GNUNET_free (filename);
-#endif
- ba->broadcast_task =
- GNUNET_SCHEDULER_add_now (&udp_ipv6_broadcast_send, ba);
- }
- }
- GNUNET_CONTAINER_DLL_insert (plugin->broadcast_head,
- plugin->broadcast_tail, ba);
- return GNUNET_OK;
-}
-
-
-/**
- * Setup broadcasting subsystem.
- *
- * @param plugin
- * @param server_addrv6
- * @param server_addrv4
- */
-void
-setup_broadcast (struct Plugin *plugin,
- struct sockaddr_in6 *server_addrv6,
- struct sockaddr_in *server_addrv4)
-{
- if (GNUNET_YES ==
- GNUNET_CONFIGURATION_get_value_yesno (plugin->env->cfg,
- "topology",
- "FRIENDS-ONLY"))
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ (
- "Disabling HELLO broadcasting due to friend-to-friend only
configuration!\n"));
- return;
- }
-
- if (GNUNET_YES != plugin->enable_broadcasting)
- return; /* We do not send, just receive */
-
- /* create IPv4 broadcast socket */
- if ((GNUNET_YES == plugin->enable_ipv4) && (NULL != plugin->sockv4))
- {
- static int yes = 1;
-
- if (GNUNET_NETWORK_socket_setsockopt
- (plugin->sockv4, SOL_SOCKET, SO_BROADCAST, &yes,
- sizeof(int)) != GNUNET_OK)
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ (
- "Failed to set IPv4 broadcast option for broadcast socket on port
%d\n"),
- ntohs (server_addrv4->sin_port));
- }
- }
- /* create IPv6 multicast socket */
- if ((GNUNET_YES == plugin->enable_ipv6) && (plugin->sockv6 != NULL))
- {
- memset (&plugin->ipv6_multicast_address, 0, sizeof(struct sockaddr_in6));
- GNUNET_assert (1 ==
- inet_pton (AF_INET6, "FF05::13B",
- &plugin->ipv6_multicast_address.sin6_addr));
- plugin->ipv6_multicast_address.sin6_family = AF_INET6;
- plugin->ipv6_multicast_address.sin6_port = htons (plugin->port);
- }
- GNUNET_OS_network_interfaces_list (&iface_proc, plugin);
-}
-
-
-/**
- * Stop broadcasting subsystem.
- *
- * @param plugin
- */
-void
-stop_broadcast (struct Plugin *plugin)
-{
- if (GNUNET_YES == plugin->enable_broadcasting)
- {
- /* Disable broadcasting */
- while (plugin->broadcast_head != NULL)
- {
- struct BroadcastAddress *p = plugin->broadcast_head;
-
- if (p->broadcast_task != NULL)
- {
- GNUNET_SCHEDULER_cancel (p->broadcast_task);
- p->broadcast_task = NULL;
- }
- if ((GNUNET_YES == plugin->enable_ipv6) &&
- (NULL != plugin->sockv6) &&
- (p->addrlen == sizeof(struct sockaddr_in6)))
- {
- /* Create IPv6 multicast request */
- struct ipv6_mreq multicastRequest;
- const struct sockaddr_in6 *s6 = (const struct sockaddr_in6 *) p->addr;
-
- multicastRequest.ipv6mr_multiaddr =
- plugin->ipv6_multicast_address.sin6_addr;
- multicastRequest.ipv6mr_interface = s6->sin6_scope_id;
-
- /* Leave the multicast group */
- if (GNUNET_OK ==
- GNUNET_NETWORK_socket_setsockopt
- (plugin->sockv6, IPPROTO_IPV6, IPV6_LEAVE_GROUP,
- &multicastRequest, sizeof(multicastRequest)))
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "setsockopt");
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG, "IPv6 multicasting stopped\n");
- }
- }
-
-#ifdef __linux__
- GNUNET_DISK_file_close (p->cryogenic_fd);
-#endif
- GNUNET_CONTAINER_DLL_remove (plugin->broadcast_head,
- plugin->broadcast_tail, p);
- GNUNET_free (p->addr);
- GNUNET_free (p);
- }
- }
-}
-
-
-/* end of plugin_transport_udp_broadcasting.c */
diff --git a/src/transport/plugin_transport_unix.c
b/src/transport/plugin_transport_unix.c
deleted file mode 100644
index 269949a99..000000000
--- a/src/transport/plugin_transport_unix.c
+++ /dev/null
@@ -1,1890 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2010-2014 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/plugin_transport_unix.c
- * @brief Transport plugin using unix domain sockets (!)
- * Clearly, can only be used locally on Unix/Linux hosts...
- * ONLY INTENDED FOR TESTING!!!
- * @author Christian Grothoff
- * @author Nathan Evans
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_statistics_service.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_transport_plugin.h"
-#include "transport.h"
-
-
-/**
- * Return code we give on 'send' if we failed to send right now
- * but it makes sense to retry later. (Note: we might want to
- * move this to the plugin API!?).
- */
-#define RETRY 0
-
-/**
- * Name of the plugin.
- */
-#define PLUGIN_NAME "unix"
-
-/**
- * Options for UNIX Domain addresses.
- */
-enum UNIX_ADDRESS_OPTIONS
-{
- /**
- * No special options.
- */
- UNIX_OPTIONS_NONE = 0,
-
- /**
- * Linux abstract domain sockets should be used.
- */
- UNIX_OPTIONS_USE_ABSTRACT_SOCKETS = 1
-};
-
-
-/**
- * How long until we give up on transmitting the welcome message?
- */
-#define HOSTNAME_RESOLVE_TIMEOUT \
- GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "transport-unix", __VA_ARGS__)
-
-
-GNUNET_NETWORK_STRUCT_BEGIN
-
-/**
- * Binary format for an UNIX Domain Socket address in GNUnet.
- */
-struct UnixAddress
-{
- /**
- * Options to use for the address, in NBO
- */
- uint32_t options GNUNET_PACKED;
-
- /**
- * Length of the address (path length), in NBO
- */
- uint32_t addrlen GNUNET_PACKED;
-
- /* followed by actual path */
-};
-
-
-/**
- * UNIX Message-Packet header.
- */
-struct UNIXMessage
-{
- /**
- * Message header.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * What is the identity of the sender (GNUNET_hash of public key)
- */
- struct GNUNET_PeerIdentity sender;
-};
-
-GNUNET_NETWORK_STRUCT_END
-
-
-/**
- * Information we track for a message awaiting transmission.
- */
-struct UNIXMessageWrapper
-{
- /**
- * We keep messages in a doubly linked list.
- */
- struct UNIXMessageWrapper *next;
-
- /**
- * We keep messages in a doubly linked list.
- */
- struct UNIXMessageWrapper *prev;
-
- /**
- * The actual payload (allocated separately right now).
- */
- struct UNIXMessage *msg;
-
- /**
- * Session this message belongs to.
- */
- struct GNUNET_ATS_Session *session;
-
- /**
- * Function to call upon transmission.
- */
- GNUNET_TRANSPORT_TransmitContinuation cont;
-
- /**
- * Closure for @e cont.
- */
- void *cont_cls;
-
- /**
- * Timeout for this message.
- */
- struct GNUNET_TIME_Absolute timeout;
-
- /**
- * Number of bytes in @e msg.
- */
- size_t msgsize;
-
- /**
- * Number of bytes of payload encapsulated in @e msg.
- */
- size_t payload;
-
- /**
- * Priority of the message (ignored, just dragged along in UNIX).
- */
- unsigned int priority;
-};
-
-
-/**
- * Handle for a session.
- */
-struct GNUNET_ATS_Session
-{
- /**
- * Sessions with pending messages (!) are kept in a DLL.
- */
- struct GNUNET_ATS_Session *next;
-
- /**
- * Sessions with pending messages (!) are kept in a DLL.
- */
- struct GNUNET_ATS_Session *prev;
-
- /**
- * To whom are we talking to (set to our identity
- * if we are still waiting for the welcome message).
- *
- * FIXME: information duplicated with 'peer' in address!
- */
- struct GNUNET_PeerIdentity target;
-
- /**
- * Pointer to the global plugin struct.
- */
- struct Plugin *plugin;
-
- /**
- * Address of the other peer.
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * Number of bytes we currently have in our write queue.
- */
- unsigned long long bytes_in_queue;
-
- /**
- * Timeout for this session.
- */
- struct GNUNET_TIME_Absolute timeout;
-
- /**
- * Session timeout task.
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * Number of messages we currently have in our write queue.
- */
- unsigned int msgs_in_queue;
-};
-
-
-/**
- * Encapsulation of all of the state of the plugin.
- */
-struct Plugin;
-
-
-/**
- * Information we keep for each of our listen sockets.
- */
-struct UNIX_Sock_Info
-{
- /**
- * The network handle
- */
- struct GNUNET_NETWORK_Handle *desc;
-};
-
-
-/**
- * Encapsulation of all of the state of the plugin.
- */
-struct Plugin
-{
- /**
- * ID of task used to update our addresses when one expires.
- */
- struct GNUNET_SCHEDULER_Task *address_update_task;
-
- /**
- * ID of read task
- */
- struct GNUNET_SCHEDULER_Task *read_task;
-
- /**
- * ID of write task
- */
- struct GNUNET_SCHEDULER_Task *write_task;
-
- /**
- * Number of bytes we currently have in our write queues.
- */
- unsigned long long bytes_in_queue;
-
- /**
- * Our environment.
- */
- struct GNUNET_TRANSPORT_PluginEnvironment *env;
-
- /**
- * Sessions (map from peer identity to `struct GNUNET_ATS_Session`)
- */
- struct GNUNET_CONTAINER_MultiPeerMap *session_map;
-
- /**
- * Head of queue of messages to transmit.
- */
- struct UNIXMessageWrapper *msg_head;
-
- /**
- * Tail of queue of messages to transmit.
- */
- struct UNIXMessageWrapper *msg_tail;
-
- /**
- * Path of our unix domain socket (/tmp/unix-plugin)
- */
- char *unix_socket_path;
-
- /**
- * Function to call about session status changes.
- */
- GNUNET_TRANSPORT_SessionInfoCallback sic;
-
- /**
- * Closure for @e sic.
- */
- void *sic_cls;
-
- /**
- * socket that we transmit all data with
- */
- struct UNIX_Sock_Info unix_sock;
-
- /**
- * Address options in HBO
- */
- uint32_t myoptions;
-
- /**
- * Are we using an abstract UNIX domain socket?
- */
- int is_abstract;
-};
-
-
-/**
- * If a session monitor is attached, notify it about the new
- * session state.
- *
- * @param plugin our plugin
- * @param session session that changed state
- * @param state new state of the session
- */
-static void
-notify_session_monitor (struct Plugin *plugin,
- struct GNUNET_ATS_Session *session,
- enum GNUNET_TRANSPORT_SessionState state)
-{
- struct GNUNET_TRANSPORT_SessionInfo info;
-
- if (NULL == plugin->sic)
- return;
- memset (&info, 0, sizeof(info));
- info.state = state;
- info.is_inbound = GNUNET_SYSERR; /* hard to say */
- info.num_msg_pending = session->msgs_in_queue;
- info.num_bytes_pending = session->bytes_in_queue;
- /* info.receive_delay remains zero as this is not supported by UNIX
- (cannot selectively not receive from 'some' peer while continuing
- to receive from others) */
- info.session_timeout = session->timeout;
- info.address = session->address;
- plugin->sic (plugin->sic_cls, session, &info);
-}
-
-
-/**
- * Function called for a quick conversion of the binary address to
- * a numeric address. Note that the caller must not free the
- * address and that the next call to this function is allowed
- * to override the address again.
- *
- * @param cls closure
- * @param addr binary address
- * @param addrlen length of the @a addr
- * @return string representing the same address
- */
-static const char *
-unix_plugin_address_to_string (void *cls, const void *addr, size_t addrlen)
-{
- static char rbuf[1024];
- struct UnixAddress *ua = (struct UnixAddress *) addr;
- char *addrstr;
- size_t addr_str_len;
- unsigned int off;
-
- if ((NULL == addr) || (sizeof(struct UnixAddress) > addrlen))
- {
- GNUNET_break (0);
- return NULL;
- }
- addrstr = (char *) &ua[1];
- addr_str_len = ntohl (ua->addrlen);
-
- if (addr_str_len != addrlen - sizeof(struct UnixAddress))
- {
- GNUNET_break (0);
- return NULL;
- }
- if ('\0' != addrstr[addr_str_len - 1])
- {
- GNUNET_break (0);
- return NULL;
- }
- if (strlen (addrstr) + 1 != addr_str_len)
- {
- GNUNET_break (0);
- return NULL;
- }
-
- off = 0;
- if ('\0' == addrstr[0])
- off++;
- memset (rbuf, 0, sizeof(rbuf));
- GNUNET_snprintf (rbuf,
- sizeof(rbuf) - 1,
- "%s.%u.%s%.*s",
- PLUGIN_NAME,
- ntohl (ua->options),
- (off == 1) ? "@" : "",
- (int) (addr_str_len - off),
- &addrstr[off]);
- return rbuf;
-}
-
-
-/**
- * Functions with this signature are called whenever we need
- * to close a session due to a disconnect or failure to
- * establish a connection.
- *
- * @param cls closure with the `struct Plugin *`
- * @param session session to close down
- * @return #GNUNET_OK on success
- */
-static int
-unix_plugin_session_disconnect (void *cls, struct GNUNET_ATS_Session *session)
-{
- struct Plugin *plugin = cls;
- struct UNIXMessageWrapper *msgw;
- struct UNIXMessageWrapper *next;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Disconnecting session for peer `%s' `%s'\n",
- GNUNET_i2s (&session->target),
- unix_plugin_address_to_string (NULL,
- session->address->address,
- session->address->address_length));
- plugin->env->session_end (plugin->env->cls, session->address, session);
- next = plugin->msg_head;
- while (NULL != next)
- {
- msgw = next;
- next = msgw->next;
- if (msgw->session != session)
- continue;
- GNUNET_CONTAINER_DLL_remove (plugin->msg_head, plugin->msg_tail, msgw);
- session->msgs_in_queue--;
- GNUNET_assert (session->bytes_in_queue >= msgw->msgsize);
- session->bytes_in_queue -= msgw->msgsize;
- GNUNET_assert (plugin->bytes_in_queue >= msgw->msgsize);
- plugin->bytes_in_queue -= msgw->msgsize;
- if (NULL != msgw->cont)
- msgw->cont (msgw->cont_cls,
- &msgw->session->target,
- GNUNET_SYSERR,
- msgw->payload,
- 0);
- GNUNET_free (msgw->msg);
- GNUNET_free (msgw);
- }
- GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove (plugin->session_map,
- &session->target,
- session));
- GNUNET_STATISTICS_set (plugin->env->stats,
- "# UNIX sessions active",
- GNUNET_CONTAINER_multipeermap_size (
- plugin->session_map),
- GNUNET_NO);
- if (NULL != session->timeout_task)
- {
- GNUNET_SCHEDULER_cancel (session->timeout_task);
- session->timeout_task = NULL;
- session->timeout = GNUNET_TIME_UNIT_ZERO_ABS;
- }
- notify_session_monitor (plugin, session, GNUNET_TRANSPORT_SS_DONE);
- GNUNET_HELLO_address_free (session->address);
- GNUNET_break (0 == session->bytes_in_queue);
- GNUNET_break (0 == session->msgs_in_queue);
- GNUNET_free (session);
- return GNUNET_OK;
-}
-
-
-/**
- * Session was idle for too long, so disconnect it
- *
- * @param cls the `struct GNUNET_ATS_Session *` to disconnect
- */
-static void
-session_timeout (void *cls)
-{
- struct GNUNET_ATS_Session *session = cls;
- struct GNUNET_TIME_Relative left;
-
- session->timeout_task = NULL;
- left = GNUNET_TIME_absolute_get_remaining (session->timeout);
- if (0 != left.rel_value_us)
- {
- /* not actually our turn yet, but let's at least update
- the monitor, it may think we're about to die ... */
- notify_session_monitor (session->plugin,
- session,
- GNUNET_TRANSPORT_SS_UPDATE);
- session->timeout_task =
- GNUNET_SCHEDULER_add_delayed (left, &session_timeout, session);
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Session %p was idle for %s, disconnecting\n",
- session,
- GNUNET_STRINGS_relative_time_to_string (
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
- GNUNET_YES));
- unix_plugin_session_disconnect (session->plugin, session);
-}
-
-
-/**
- * Increment session timeout due to activity. We do not immediately
- * notify the monitor here as that might generate excessive
- * signalling.
- *
- * @param session session for which the timeout should be rescheduled
- */
-static void
-reschedule_session_timeout (struct GNUNET_ATS_Session *session)
-{
- GNUNET_assert (NULL != session->timeout_task);
- session->timeout =
- GNUNET_TIME_relative_to_absolute
(GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
-}
-
-
-/**
- * Convert unix path to a `struct sockaddr_un *`
- *
- * @param unixpath path to convert
- * @param[out] sock_len set to the length of the address
- * @return converted unix path
- */
-static struct sockaddr_un *
-unix_address_to_sockaddr (const char *unixpath, socklen_t *sock_len)
-{
- struct sockaddr_un *un;
- size_t slen;
-
- GNUNET_assert (0 < strlen (unixpath)); /* sanity check */
- un = GNUNET_new (struct sockaddr_un);
- un->sun_family = AF_UNIX;
- slen = strlen (unixpath);
- if (slen >= sizeof(un->sun_path))
- slen = sizeof(un->sun_path) - 1;
- GNUNET_memcpy (un->sun_path, unixpath, slen);
- un->sun_path[slen] = '\0';
- slen = sizeof(struct sockaddr_un);
-#if HAVE_SOCKADDR_UN_SUN_LEN
- un->sun_len = (u_char) slen;
-#endif
- (*sock_len) = slen;
- return un;
-}
-
-
-/**
- * Closure to #lookup_session_it().
- */
-struct LookupCtx
-{
- /**
- * Location to store the session, if found.
- */
- struct GNUNET_ATS_Session *res;
-
- /**
- * Address we are looking for.
- */
- const struct GNUNET_HELLO_Address *address;
-};
-
-
-/**
- * Function called to find a session by address.
- *
- * @param cls the `struct LookupCtx *`
- * @param key peer we are looking for (unused)
- * @param value a session
- * @return #GNUNET_YES if not found (continue looking), #GNUNET_NO on success
- */
-static int
-lookup_session_it (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct LookupCtx *lctx = cls;
- struct GNUNET_ATS_Session *session = value;
-
- if (0 == GNUNET_HELLO_address_cmp (lctx->address, session->address))
- {
- lctx->res = session;
- return GNUNET_NO;
- }
- return GNUNET_YES;
-}
-
-
-/**
- * Find an existing session by address.
- *
- * @param plugin the plugin
- * @param address the address to find
- * @return NULL if session was not found
- */
-static struct GNUNET_ATS_Session *
-lookup_session (struct Plugin *plugin,
- const struct GNUNET_HELLO_Address *address)
-{
- struct LookupCtx lctx;
-
- lctx.address = address;
- lctx.res = NULL;
- GNUNET_CONTAINER_multipeermap_get_multiple (plugin->session_map,
- &address->peer,
- &lookup_session_it,
- &lctx);
- return lctx.res;
-}
-
-
-/**
- * Function that is called to get the keepalive factor.
- * #GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT is divided by this number to
- * calculate the interval between keepalive packets.
- *
- * @param cls closure with the `struct Plugin`
- * @return keepalive factor
- */
-static unsigned int
-unix_plugin_query_keepalive_factor (void *cls)
-{
- return 3;
-}
-
-
-/**
- * Actually send out the message, assume we've got the address and
- * send_handle squared away!
- *
- * @param cls closure
- * @param send_handle which handle to send message on
- * @param target who should receive this message (ignored by UNIX)
- * @param msgbuf one or more GNUNET_MessageHeader(s) strung together
- * @param msgbuf_size the size of the @a msgbuf to send
- * @param priority how important is the message (ignored by UNIX)
- * @param timeout when should we time out (give up) if we can not transmit?
- * @param addr the addr to send the message to, needs to be a sockaddr for us
- * @param addrlen the len of @a addr
- * @param payload bytes payload to send
- * @param cont continuation to call once the message has
- * been transmitted (or if the transport is ready
- * for the next transmission call; or if the
- * peer disconnected...)
- * @param cont_cls closure for @a cont
- * @return on success the number of bytes written, RETRY for retry, -1 on
errors
- */
-static ssize_t
-unix_real_send (void *cls,
- struct GNUNET_NETWORK_Handle *send_handle,
- const struct GNUNET_PeerIdentity *target,
- const char *msgbuf,
- size_t msgbuf_size,
- unsigned int priority,
- struct GNUNET_TIME_Absolute timeout,
- const struct UnixAddress *addr,
- size_t addrlen,
- size_t payload,
- GNUNET_TRANSPORT_TransmitContinuation cont,
- void *cont_cls)
-{
- struct Plugin *plugin = cls;
- ssize_t sent;
- struct sockaddr_un *un;
- socklen_t un_len;
- const char *unixpath;
-
- if (NULL == send_handle)
- {
- GNUNET_break (0); /* We do not have a send handle */
- return GNUNET_SYSERR;
- }
- if ((NULL == addr) || (0 == addrlen))
- {
- GNUNET_break (0); /* Can never send if we don't have an address */
- return GNUNET_SYSERR;
- }
-
- /* Prepare address */
- unixpath = (const char *) &addr[1];
- if (NULL == (un = unix_address_to_sockaddr (unixpath, &un_len)))
- {
- GNUNET_break (0);
- return -1;
- }
-
- if ((GNUNET_YES == plugin->is_abstract) &&
- (0 != (UNIX_OPTIONS_USE_ABSTRACT_SOCKETS & ntohl (addr->options))))
- {
- un->sun_path[0] = '\0';
- }
-resend:
- /* Send the data */
- sent = GNUNET_NETWORK_socket_sendto (send_handle,
- msgbuf,
- msgbuf_size,
- (const struct sockaddr *) un,
- un_len);
- if (GNUNET_SYSERR == sent)
- {
- if ((EAGAIN == errno) || (ENOBUFS == errno))
- {
- GNUNET_free (un);
- return RETRY; /* We have to retry later */
- }
- if (EMSGSIZE == errno)
- {
- socklen_t size = 0;
- socklen_t len = sizeof(size);
-
- GNUNET_NETWORK_socket_getsockopt ((struct GNUNET_NETWORK_Handle *)
- send_handle,
- SOL_SOCKET,
- SO_SNDBUF,
- &size,
- &len);
- if (size < msgbuf_size)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Trying to increase socket buffer size from %u to %u for message
size %u\n",
- (unsigned int) size,
- (unsigned int) ((msgbuf_size / 1000) + 2) * 1000,
- (unsigned int) msgbuf_size);
- size = ((msgbuf_size / 1000) + 2) * 1000;
- if (GNUNET_OK ==
- GNUNET_NETWORK_socket_setsockopt ((struct GNUNET_NETWORK_Handle *)
- send_handle,
- SOL_SOCKET,
- SO_SNDBUF,
- &size,
- sizeof(size)))
- goto resend; /* Increased buffer size, retry sending */
- else
- {
- /* Could not increase buffer size: error, no retry */
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "setsockopt");
- GNUNET_free (un);
- return GNUNET_SYSERR;
- }
- }
- else
- {
- /* Buffer is bigger than message: error, no retry
- * This should never happen!*/
- GNUNET_break (0);
- GNUNET_free (un);
- return GNUNET_SYSERR;
- }
- }
- }
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "UNIX transmitted %u-byte message to %s (%d: %s)\n",
- (unsigned int) msgbuf_size,
- GNUNET_a2s ((const struct sockaddr *) un, un_len),
- (int) sent,
- (sent < 0) ? strerror (errno) : "ok");
- GNUNET_free (un);
- return sent;
-}
-
-
-/**
- * Function obtain the network type for a session
- *
- * @param cls closure ('struct Plugin*')
- * @param session the session
- * @return the network type in HBO or #GNUNET_SYSERR
- */
-static enum GNUNET_NetworkType
-unix_plugin_get_network (void *cls, struct GNUNET_ATS_Session *session)
-{
- GNUNET_assert (NULL != session);
- return GNUNET_NT_LOOPBACK;
-}
-
-
-/**
- * Function obtain the network type for a session
- *
- * @param cls closure (`struct Plugin *`)
- * @param address the address
- * @return the network type
- */
-static enum GNUNET_NetworkType
-unix_plugin_get_network_for_address (void *cls,
- const struct GNUNET_HELLO_Address
*address)
-{
- return GNUNET_NT_LOOPBACK;
-}
-
-
-/**
- * Creates a new outbound session the transport service will use to send data
to the
- * peer
- *
- * @param cls the plugin
- * @param address the address
- * @return the session or NULL of max connections exceeded
- */
-static struct GNUNET_ATS_Session *
-unix_plugin_get_session (void *cls, const struct GNUNET_HELLO_Address *address)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_ATS_Session *session;
- struct UnixAddress *ua;
- char *addrstr;
- uint32_t addr_str_len;
- uint32_t addr_option;
-
- ua = (struct UnixAddress *) address->address;
- if ((NULL == address->address) || (0 == address->address_length) ||
- (sizeof(struct UnixAddress) > address->address_length))
- {
- GNUNET_break (0);
- return NULL;
- }
- addrstr = (char *) &ua[1];
- addr_str_len = ntohl (ua->addrlen);
- addr_option = ntohl (ua->options);
-
- if ((0 != (UNIX_OPTIONS_USE_ABSTRACT_SOCKETS & addr_option)) &&
- (GNUNET_NO == plugin->is_abstract))
- {
- return NULL;
- }
-
- if (addr_str_len != address->address_length - sizeof(struct UnixAddress))
- {
- return NULL; /* This can be a legacy address */
- }
-
- if ('\0' != addrstr[addr_str_len - 1])
- {
- GNUNET_break (0);
- return NULL;
- }
- if (strlen (addrstr) + 1 != addr_str_len)
- {
- GNUNET_break (0);
- return NULL;
- }
-
- /* Check if a session for this address already exists */
- if (NULL != (session = lookup_session (plugin, address)))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Found existing session %p for address `%s'\n",
- session,
- unix_plugin_address_to_string (NULL,
- address->address,
- address->address_length));
- return session;
- }
-
- /* create a new session */
- session = GNUNET_new (struct GNUNET_ATS_Session);
- session->target = address->peer;
- session->address = GNUNET_HELLO_address_copy (address);
- session->plugin = plugin;
- session->timeout =
- GNUNET_TIME_relative_to_absolute
(GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
- session->timeout_task =
- GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
- &session_timeout,
- session);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Creating a new session %p for address `%s'\n",
- session,
- unix_plugin_address_to_string (NULL,
- address->address,
- address->address_length));
- (void) GNUNET_CONTAINER_multipeermap_put (
- plugin->session_map,
- &address->peer,
- session,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
- GNUNET_STATISTICS_set (plugin->env->stats,
- "# UNIX sessions active",
- GNUNET_CONTAINER_multipeermap_size (
- plugin->session_map),
- GNUNET_NO);
- notify_session_monitor (plugin, session, GNUNET_TRANSPORT_SS_INIT);
- notify_session_monitor (plugin, session, GNUNET_TRANSPORT_SS_UP);
- return session;
-}
-
-
-/**
- * Function that will be called whenever the transport service wants
- * to notify the plugin that a session is still active and in use and
- * therefore the session timeout for this session has to be updated
- *
- * @param cls closure with the `struct Plugin *`
- * @param peer which peer was the session for
- * @param session which session is being updated
- */
-static void
-unix_plugin_update_session_timeout (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- struct GNUNET_ATS_Session *session)
-{
- struct Plugin *plugin = cls;
-
- if (GNUNET_OK !=
- GNUNET_CONTAINER_multipeermap_contains_value (plugin->session_map,
- &session->target,
- session))
- {
- GNUNET_break (0);
- return;
- }
- reschedule_session_timeout (session);
-}
-
-
-/**
- * Demultiplexer for UNIX messages
- *
- * @param plugin the main plugin for this transport
- * @param sender from which peer the message was received
- * @param currhdr pointer to the header of the message
- * @param ua address to look for
- * @param ua_len length of the address @a ua
- */
-static void
-unix_demultiplexer (struct Plugin *plugin,
- struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_MessageHeader *currhdr,
- const struct UnixAddress *ua,
- size_t ua_len)
-{
- struct GNUNET_ATS_Session *session;
- struct GNUNET_HELLO_Address *address;
-
- GNUNET_assert (ua_len >= sizeof(struct UnixAddress));
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received message from %s\n",
- unix_plugin_address_to_string (NULL, ua, ua_len));
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# bytes received via UNIX",
- ntohs (currhdr->size),
- GNUNET_NO);
-
- /* Look for existing session */
- address = GNUNET_HELLO_address_allocate (
- sender,
- PLUGIN_NAME,
- ua,
- ua_len,
- GNUNET_HELLO_ADDRESS_INFO_NONE); /* UNIX does not have "inbound" sessions
*/
- session = lookup_session (plugin, address);
- if (NULL == session)
- {
- session = unix_plugin_get_session (plugin, address);
- /* Notify transport and ATS about new inbound session */
- plugin->env->session_start (NULL,
- session->address,
- session,
- GNUNET_NT_LOOPBACK);
- }
- else
- {
- reschedule_session_timeout (session);
- }
- GNUNET_HELLO_address_free (address);
- plugin->env->receive (plugin->env->cls, session->address, session, currhdr);
-}
-
-
-/**
- * Read from UNIX domain socket (it is ready).
- *
- * @param plugin the plugin
- */
-static void
-unix_plugin_do_read (struct Plugin *plugin)
-{
- char buf[65536] GNUNET_ALIGN;
- struct UnixAddress *ua;
- struct UNIXMessage *msg;
- struct GNUNET_PeerIdentity sender;
- struct sockaddr_un un;
- socklen_t addrlen;
- ssize_t ret;
- int offset;
- int tsize;
- int is_abstract;
- char *msgbuf;
- const struct GNUNET_MessageHeader *currhdr;
- uint16_t csize;
- size_t ua_len;
-
- addrlen = sizeof(un);
- memset (&un, 0, sizeof(un));
- ret = GNUNET_NETWORK_socket_recvfrom (plugin->unix_sock.desc,
- buf,
- sizeof(buf),
- (struct sockaddr *) &un,
- &addrlen);
- if ((GNUNET_SYSERR == ret) && ((errno == EAGAIN) || (errno == ENOBUFS)))
- return;
- if (GNUNET_SYSERR == ret)
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "recvfrom");
- return;
- }
- else
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Read %d bytes from socket %s\n",
- (int) ret,
- un.sun_path);
- }
-
- GNUNET_assert (AF_UNIX == (un.sun_family));
- is_abstract = GNUNET_NO;
- if ('\0' == un.sun_path[0])
- {
- un.sun_path[0] = '@';
- is_abstract = GNUNET_YES;
- }
-
- ua_len = sizeof(struct UnixAddress) + strlen (un.sun_path) + 1;
- ua = GNUNET_malloc (ua_len);
- ua->addrlen = htonl (strlen (&un.sun_path[0]) + 1);
- GNUNET_memcpy (&ua[1], &un.sun_path[0], strlen (un.sun_path) + 1);
- if (is_abstract)
- ua->options = htonl (UNIX_OPTIONS_USE_ABSTRACT_SOCKETS);
- else
- ua->options = htonl (UNIX_OPTIONS_NONE);
-
- msg = (struct UNIXMessage *) buf;
- csize = ntohs (msg->header.size);
- if ((csize < sizeof(struct UNIXMessage)) || (csize > ret))
- {
- GNUNET_break_op (0);
- GNUNET_free (ua);
- return;
- }
- msgbuf = (char *) &msg[1];
- GNUNET_memcpy (&sender, &msg->sender, sizeof(struct GNUNET_PeerIdentity));
- offset = 0;
- tsize = csize - sizeof(struct UNIXMessage);
- while (offset + sizeof(struct GNUNET_MessageHeader) <= tsize)
- {
- currhdr = (struct GNUNET_MessageHeader *) &msgbuf[offset];
- csize = ntohs (currhdr->size);
- if ((csize < sizeof(struct GNUNET_MessageHeader)) ||
- (csize > tsize - offset))
- {
- GNUNET_break_op (0);
- break;
- }
- unix_demultiplexer (plugin, &sender, currhdr, ua, ua_len);
- offset += csize;
- }
- GNUNET_free (ua);
-}
-
-
-/**
- * Write to UNIX domain socket (it is ready).
- *
- * @param plugin handle to the plugin
- */
-static void
-unix_plugin_do_write (struct Plugin *plugin)
-{
- ssize_t sent = 0;
- struct UNIXMessageWrapper *msgw;
- struct GNUNET_ATS_Session *session;
- int did_delete;
-
- session = NULL;
- did_delete = GNUNET_NO;
- while (NULL != (msgw = plugin->msg_head))
- {
- if (GNUNET_TIME_absolute_get_remaining (msgw->timeout).rel_value_us > 0)
- break; /* Message is ready for sending */
- /* Message has a timeout */
- did_delete = GNUNET_YES;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Timeout for message with %u bytes \n",
- (unsigned int) msgw->msgsize);
- GNUNET_CONTAINER_DLL_remove (plugin->msg_head, plugin->msg_tail, msgw);
- session = msgw->session;
- session->msgs_in_queue--;
- GNUNET_assert (session->bytes_in_queue >= msgw->msgsize);
- session->bytes_in_queue -= msgw->msgsize;
- GNUNET_assert (plugin->bytes_in_queue >= msgw->msgsize);
- plugin->bytes_in_queue -= msgw->msgsize;
- GNUNET_STATISTICS_set (plugin->env->stats,
- "# bytes currently in UNIX buffers",
- plugin->bytes_in_queue,
- GNUNET_NO);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UNIX bytes discarded",
- msgw->msgsize,
- GNUNET_NO);
- if (NULL != msgw->cont)
- msgw->cont (msgw->cont_cls,
- &msgw->session->target,
- GNUNET_SYSERR,
- msgw->payload,
- 0);
- GNUNET_free (msgw->msg);
- GNUNET_free (msgw);
- }
- if (NULL == msgw)
- {
- if (GNUNET_YES == did_delete)
- notify_session_monitor (plugin, session, GNUNET_TRANSPORT_SS_UPDATE);
- return; /* Nothing to send at the moment */
- }
- session = msgw->session;
- sent = unix_real_send (plugin,
- plugin->unix_sock.desc,
- &session->target,
- (const char *) msgw->msg,
- msgw->msgsize,
- msgw->priority,
- msgw->timeout,
- msgw->session->address->address,
- msgw->session->address->address_length,
- msgw->payload,
- msgw->cont,
- msgw->cont_cls);
- if (RETRY == sent)
- {
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UNIX retry attempts",
- 1,
- GNUNET_NO);
- notify_session_monitor (plugin, session, GNUNET_TRANSPORT_SS_UPDATE);
- return;
- }
- GNUNET_CONTAINER_DLL_remove (plugin->msg_head, plugin->msg_tail, msgw);
- session->msgs_in_queue--;
- GNUNET_assert (session->bytes_in_queue >= msgw->msgsize);
- session->bytes_in_queue -= msgw->msgsize;
- GNUNET_assert (plugin->bytes_in_queue >= msgw->msgsize);
- plugin->bytes_in_queue -= msgw->msgsize;
- GNUNET_STATISTICS_set (plugin->env->stats,
- "# bytes currently in UNIX buffers",
- plugin->bytes_in_queue,
- GNUNET_NO);
- notify_session_monitor (plugin, session, GNUNET_TRANSPORT_SS_UPDATE);
- if (GNUNET_SYSERR == sent)
- {
- /* failed and no retry */
- if (NULL != msgw->cont)
- msgw->cont (msgw->cont_cls,
- &msgw->session->target,
- GNUNET_SYSERR,
- msgw->payload,
- 0);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# UNIX bytes discarded",
- msgw->msgsize,
- GNUNET_NO);
- GNUNET_free (msgw->msg);
- GNUNET_free (msgw);
- return;
- }
- /* successfully sent bytes */
- GNUNET_break (sent > 0);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# bytes transmitted via UNIX",
- msgw->msgsize,
- GNUNET_NO);
- if (NULL != msgw->cont)
- msgw->cont (msgw->cont_cls,
- &msgw->session->target,
- GNUNET_OK,
- msgw->payload,
- msgw->msgsize);
- GNUNET_free (msgw->msg);
- GNUNET_free (msgw);
-}
-
-
-/**
- * We have been notified that our socket has something to read.
- * Then reschedule this function to be called again once more is available.
- *
- * @param cls the plugin handle
- */
-static void
-unix_plugin_select_read (void *cls)
-{
- struct Plugin *plugin = cls;
- const struct GNUNET_SCHEDULER_TaskContext *tc;
-
- plugin->read_task = NULL;
- tc = GNUNET_SCHEDULER_get_task_context ();
- if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_READ_READY))
- unix_plugin_do_read (plugin);
- plugin->read_task =
- GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
- plugin->unix_sock.desc,
- &unix_plugin_select_read,
- plugin);
-}
-
-
-/**
- * We have been notified that our socket is ready to write.
- * Then reschedule this function to be called again once more is available.
- *
- * @param cls the plugin handle
- */
-static void
-unix_plugin_select_write (void *cls)
-{
- struct Plugin *plugin = cls;
- const struct GNUNET_SCHEDULER_TaskContext *tc;
-
- plugin->write_task = NULL;
- tc = GNUNET_SCHEDULER_get_task_context ();
- if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_WRITE_READY))
- unix_plugin_do_write (plugin);
- if (NULL == plugin->msg_head)
- return; /* write queue empty */
- plugin->write_task =
- GNUNET_SCHEDULER_add_write_net (GNUNET_TIME_UNIT_FOREVER_REL,
- plugin->unix_sock.desc,
- &unix_plugin_select_write,
- plugin);
-}
-
-
-/**
- * Function that can be used by the transport service to transmit
- * a message using the plugin. Note that in the case of a
- * peer disconnecting, the continuation MUST be called
- * prior to the disconnect notification itself. This function
- * will be called with this peer's HELLO message to initiate
- * a fresh connection to another peer.
- *
- * @param cls closure
- * @param session which session must be used
- * @param msgbuf the message to transmit
- * @param msgbuf_size number of bytes in @a msgbuf
- * @param priority how important is the message (most plugins will
- * ignore message priority and just FIFO)
- * @param to how long to wait at most for the transmission (does not
- * require plugins to discard the message after the timeout,
- * just advisory for the desired delay; most plugins will ignore
- * this as well)
- * @param cont continuation to call once the message has
- * been transmitted (or if the transport is ready
- * for the next transmission call; or if the
- * peer disconnected...); can be NULL
- * @param cont_cls closure for @a cont
- * @return number of bytes used (on the physical network, with overheads);
- * -1 on hard errors (i.e. address invalid); 0 is a legal value
- * and does NOT mean that the message was not transmitted (DV)
- */
-static ssize_t
-unix_plugin_send (void *cls,
- struct GNUNET_ATS_Session *session,
- const char *msgbuf,
- size_t msgbuf_size,
- unsigned int priority,
- struct GNUNET_TIME_Relative to,
- GNUNET_TRANSPORT_TransmitContinuation cont,
- void *cont_cls)
-{
- struct Plugin *plugin = cls;
- struct UNIXMessageWrapper *wrapper;
- struct UNIXMessage *message;
- int ssize;
-
- if (GNUNET_OK !=
- GNUNET_CONTAINER_multipeermap_contains_value (plugin->session_map,
- &session->target,
- session))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Invalid session for peer `%s' `%s'\n",
- GNUNET_i2s (&session->target),
- unix_plugin_address_to_string (NULL,
- session->address->address,
- session->address->address_length));
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Sending %lu bytes with session for peer `%s' `%s'\n",
- (unsigned long) msgbuf_size,
- GNUNET_i2s (&session->target),
- unix_plugin_address_to_string (NULL,
- session->address->address,
- session->address->address_length));
- ssize = sizeof(struct UNIXMessage) + msgbuf_size;
- message = GNUNET_malloc (sizeof(struct UNIXMessage) + msgbuf_size);
- message->header.size = htons (ssize);
- message->header.type = htons (0);
- GNUNET_memcpy (&message->sender,
- plugin->env->my_identity,
- sizeof(struct GNUNET_PeerIdentity));
- GNUNET_memcpy (&message[1], msgbuf, msgbuf_size);
- wrapper = GNUNET_new (struct UNIXMessageWrapper);
- wrapper->msg = message;
- wrapper->msgsize = ssize;
- wrapper->payload = msgbuf_size;
- wrapper->priority = priority;
- wrapper->timeout = GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get (),
to);
- wrapper->cont = cont;
- wrapper->cont_cls = cont_cls;
- wrapper->session = session;
- GNUNET_CONTAINER_DLL_insert_tail (plugin->msg_head,
- plugin->msg_tail,
- wrapper);
- plugin->bytes_in_queue += ssize;
- session->bytes_in_queue += ssize;
- session->msgs_in_queue++;
- GNUNET_STATISTICS_set (plugin->env->stats,
- "# bytes currently in UNIX buffers",
- plugin->bytes_in_queue,
- GNUNET_NO);
- notify_session_monitor (plugin, session, GNUNET_TRANSPORT_SS_UPDATE);
- if (NULL == plugin->write_task)
- plugin->write_task =
- GNUNET_SCHEDULER_add_write_net (GNUNET_TIME_UNIT_FOREVER_REL,
- plugin->unix_sock.desc,
- &unix_plugin_select_write,
- plugin);
- return ssize;
-}
-
-
-/**
- * Create a slew of UNIX sockets. If possible, use IPv6 and IPv4.
- *
- * @param cls closure for server start, should be a `struct Plugin *`
- * @return number of sockets created or #GNUNET_SYSERR on error
- */
-static int
-unix_transport_server_start (void *cls)
-{
- struct Plugin *plugin = cls;
- struct sockaddr_un *un;
- socklen_t un_len;
-
- un = unix_address_to_sockaddr (plugin->unix_socket_path, &un_len);
- if (GNUNET_YES == plugin->is_abstract)
- {
- plugin->unix_socket_path[0] = '@';
- un->sun_path[0] = '\0';
- }
- plugin->unix_sock.desc =
- GNUNET_NETWORK_socket_create (AF_UNIX, SOCK_DGRAM, 0);
- if (NULL == plugin->unix_sock.desc)
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket");
- GNUNET_free (un);
- return GNUNET_SYSERR;
- }
- if ('\0' != un->sun_path[0])
- {
- if (GNUNET_OK != GNUNET_DISK_directory_create_for_file (un->sun_path))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Cannot create path to `%s'\n"),
- un->sun_path);
- GNUNET_NETWORK_socket_close (plugin->unix_sock.desc);
- plugin->unix_sock.desc = NULL;
- GNUNET_free (un);
- return GNUNET_SYSERR;
- }
- }
- if (GNUNET_OK != GNUNET_NETWORK_socket_bind (plugin->unix_sock.desc,
- (const struct sockaddr *) un,
- un_len))
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "bind");
- LOG (GNUNET_ERROR_TYPE_ERROR, _ ("Cannot bind to `%s'\n"), un->sun_path);
- GNUNET_NETWORK_socket_close (plugin->unix_sock.desc);
- plugin->unix_sock.desc = NULL;
- GNUNET_free (un);
- return GNUNET_SYSERR;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Bound to `%s'\n", plugin->unix_socket_path);
- plugin->read_task =
- GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL,
- plugin->unix_sock.desc,
- &unix_plugin_select_read,
- plugin);
- GNUNET_free (un);
- return 1;
-}
-
-
-/**
- * Function that will be called to check if a binary address for this
- * plugin is well-formed and corresponds to an address for THIS peer
- * (as per our configuration). Naturally, if absolutely necessary,
- * plugins can be a bit conservative in their answer, but in general
- * plugins should make sure that the address does not redirect
- * traffic to a 3rd party that might try to man-in-the-middle our
- * traffic.
- *
- * @param cls closure, should be our handle to the Plugin
- * @param addr pointer to the address
- * @param addrlen length of @a addr
- * @return #GNUNET_OK if this is a plausible address for this peer
- * and transport, #GNUNET_SYSERR if not
- *
- */
-static int
-unix_plugin_check_address (void *cls, const void *addr, size_t addrlen)
-{
- struct Plugin *plugin = cls;
- const struct UnixAddress *ua = addr;
- char *addrstr;
- size_t addr_str_len;
-
- if ((NULL == addr) || (0 == addrlen) ||
- (sizeof(struct UnixAddress) > addrlen))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- addrstr = (char *) &ua[1];
- addr_str_len = ntohl (ua->addrlen);
- if ('\0' != addrstr[addr_str_len - 1])
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if (strlen (addrstr) + 1 != addr_str_len)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
-
- if (0 == strcmp (plugin->unix_socket_path, addrstr))
- return GNUNET_OK;
- return GNUNET_SYSERR;
-}
-
-
-/**
- * Convert the transports address to a nice, human-readable
- * format.
- *
- * @param cls closure
- * @param type name of the transport that generated the address
- * @param addr one of the addresses of the host, NULL for the last address
- * the specific address format depends on the transport
- * @param addrlen length of the @a addr
- * @param numeric should (IP) addresses be displayed in numeric form?
- * @param timeout after how long should we give up?
- * @param asc function to call on each string
- * @param asc_cls closure for @a asc
- */
-static void
-unix_plugin_address_pretty_printer (void *cls,
- const char *type,
- const void *addr,
- size_t addrlen,
- int numeric,
- struct GNUNET_TIME_Relative timeout,
- GNUNET_TRANSPORT_AddressStringCallback asc,
- void *asc_cls)
-{
- const char *ret;
-
- if ((NULL != addr) && (addrlen > 0))
- ret = unix_plugin_address_to_string (NULL, addr, addrlen);
- else
- ret = NULL;
- asc (asc_cls, ret, (NULL == ret) ? GNUNET_SYSERR : GNUNET_OK);
- asc (asc_cls, NULL, GNUNET_OK);
-}
-
-
-/**
- * Function called to convert a string address to
- * a binary address.
- *
- * @param cls closure (`struct Plugin *`)
- * @param addr string address
- * @param addrlen length of the @a addr (strlen(addr) + '\0')
- * @param buf location to store the buffer
- * If the function returns #GNUNET_SYSERR, its contents are undefined.
- * @param added length of created address
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
- */
-static int
-unix_plugin_string_to_address (void *cls,
- const char *addr,
- uint16_t addrlen,
- void **buf,
- size_t *added)
-{
- struct UnixAddress *ua;
- char *address;
- char *plugin;
- char *optionstr;
- uint32_t options;
- size_t ua_size;
-
- /* Format unix.options.address */
- address = NULL;
- plugin = NULL;
- optionstr = NULL;
-
- if ((NULL == addr) || (addrlen == 0))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if ('\0' != addr[addrlen - 1])
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if (strlen (addr) != addrlen - 1)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- plugin = GNUNET_strdup (addr);
- optionstr = strchr (plugin, '.');
- if (NULL == optionstr)
- {
- GNUNET_break (0);
- GNUNET_free (plugin);
- return GNUNET_SYSERR;
- }
- optionstr[0] = '\0';
- optionstr++;
- options = atol (optionstr);
- address = strchr (optionstr, '.');
- if (NULL == address)
- {
- GNUNET_break (0);
- GNUNET_free (plugin);
- return GNUNET_SYSERR;
- }
- address[0] = '\0';
- address++;
- if (0 != strcmp (plugin, PLUGIN_NAME))
- {
- GNUNET_break (0);
- GNUNET_free (plugin);
- return GNUNET_SYSERR;
- }
-
- ua_size = sizeof(struct UnixAddress) + strlen (address) + 1;
- ua = GNUNET_malloc (ua_size);
- ua->options = htonl (options);
- ua->addrlen = htonl (strlen (address) + 1);
- GNUNET_memcpy (&ua[1], address, strlen (address) + 1);
- GNUNET_free (plugin);
-
- (*buf) = ua;
- (*added) = ua_size;
- return GNUNET_OK;
-}
-
-
-/**
- * Notify transport service about address
- *
- * @param cls the plugin
- */
-static void
-address_notification (void *cls)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_HELLO_Address *address;
- size_t len;
- struct UnixAddress *ua;
- char *unix_path;
-
- len = sizeof(struct UnixAddress) + strlen (plugin->unix_socket_path) + 1;
- ua = GNUNET_malloc (len);
- ua->options = htonl (plugin->myoptions);
- ua->addrlen = htonl (strlen (plugin->unix_socket_path) + 1);
- unix_path = (char *) &ua[1];
- GNUNET_memcpy (unix_path,
- plugin->unix_socket_path,
- strlen (plugin->unix_socket_path) + 1);
-
- plugin->address_update_task = NULL;
- address = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
- PLUGIN_NAME,
- ua,
- len,
- GNUNET_HELLO_ADDRESS_INFO_NONE);
- plugin->env->notify_address (plugin->env->cls, GNUNET_YES, address);
- GNUNET_free (ua);
- GNUNET_free (address);
-}
-
-
-/**
- * Function called on sessions to disconnect
- *
- * @param cls the plugin
- * @param key peer identity (unused)
- * @param value the `struct GNUNET_ATS_Session *` to disconnect
- * @return #GNUNET_YES (always, continue to iterate)
- */
-static int
-get_session_delete_it (void *cls,
- const struct GNUNET_PeerIdentity *key,
- void *value)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_ATS_Session *session = value;
-
- unix_plugin_session_disconnect (plugin, session);
- return GNUNET_YES;
-}
-
-
-/**
- * Disconnect from a remote node. Clean up session if we have one for this
peer
- *
- * @param cls closure for this call (should be handle to Plugin)
- * @param target the peeridentity of the peer to disconnect
- * @return #GNUNET_OK on success, #GNUNET_SYSERR if the operation failed
- */
-static void
-unix_plugin_peer_disconnect (void *cls,
- const struct GNUNET_PeerIdentity *target)
-{
- struct Plugin *plugin = cls;
-
- GNUNET_CONTAINER_multipeermap_get_multiple (plugin->session_map,
- target,
- &get_session_delete_it,
- plugin);
-}
-
-
-/**
- * Return information about the given session to the
- * monitor callback.
- *
- * @param cls the `struct Plugin` with the monitor callback (`sic`)
- * @param peer peer we send information about
- * @param value our `struct GNUNET_ATS_Session` to send information about
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-send_session_info_iter (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *value)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_ATS_Session *session = value;
-
- notify_session_monitor (plugin, session, GNUNET_TRANSPORT_SS_INIT);
- notify_session_monitor (plugin, session, GNUNET_TRANSPORT_SS_UP);
- return GNUNET_OK;
-}
-
-
-/**
- * Begin monitoring sessions of a plugin. There can only
- * be one active monitor per plugin (i.e. if there are
- * multiple monitors, the transport service needs to
- * multiplex the generated events over all of them).
- *
- * @param cls closure of the plugin
- * @param sic callback to invoke, NULL to disable monitor;
- * plugin will being by iterating over all active
- * sessions immediately and then enter monitor mode
- * @param sic_cls closure for @a sic
- */
-static void
-unix_plugin_setup_monitor (void *cls,
- GNUNET_TRANSPORT_SessionInfoCallback sic,
- void *sic_cls)
-{
- struct Plugin *plugin = cls;
-
- plugin->sic = sic;
- plugin->sic_cls = sic_cls;
- if (NULL != sic)
- {
- GNUNET_CONTAINER_multipeermap_iterate (plugin->session_map,
- &send_session_info_iter,
- plugin);
- /* signal end of first iteration */
- sic (sic_cls, NULL, NULL);
- }
-}
-
-
-/**
- * The exported method. Initializes the plugin and returns a
- * struct with the callbacks.
- *
- * @param cls the plugin's execution environment
- * @return NULL on error, plugin functions otherwise
- */
-void *
-libgnunet_plugin_transport_unix_init (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginEnvironment *env = cls;
- struct GNUNET_TRANSPORT_PluginFunctions *api;
- struct Plugin *plugin;
- int sockets_created;
-
- if (NULL == env->receive)
- {
- /* run in 'stub' mode (i.e. as part of gnunet-peerinfo), don't fully
- initialize the plugin or the API */
- api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
- api->cls = NULL;
- api->address_pretty_printer = &unix_plugin_address_pretty_printer;
- api->address_to_string = &unix_plugin_address_to_string;
- api->string_to_address = &unix_plugin_string_to_address;
- return api;
- }
-
- plugin = GNUNET_new (struct Plugin);
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_filename (env->cfg,
- "transport-unix",
- "UNIXPATH",
- &plugin->unix_socket_path))
- {
- GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
- "transport-unix",
- "UNIXPATH");
- GNUNET_free (plugin);
- return NULL;
- }
-
- plugin->env = env;
-
- /* Initialize my flags */
-#ifdef __linux__
- plugin->is_abstract =
- GNUNET_CONFIGURATION_get_value_yesno (plugin->env->cfg,
- "testing",
- "USE_ABSTRACT_SOCKETS");
-#endif
- plugin->myoptions = UNIX_OPTIONS_NONE;
- if (GNUNET_YES == plugin->is_abstract)
- plugin->myoptions = UNIX_OPTIONS_USE_ABSTRACT_SOCKETS;
-
- api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
- api->cls = plugin;
- api->get_session = &unix_plugin_get_session;
- api->send = &unix_plugin_send;
- api->disconnect_peer = &unix_plugin_peer_disconnect;
- api->disconnect_session = &unix_plugin_session_disconnect;
- api->query_keepalive_factor = &unix_plugin_query_keepalive_factor;
- api->address_pretty_printer = &unix_plugin_address_pretty_printer;
- api->address_to_string = &unix_plugin_address_to_string;
- api->check_address = &unix_plugin_check_address;
- api->string_to_address = &unix_plugin_string_to_address;
- api->get_network = &unix_plugin_get_network;
- api->get_network_for_address = &unix_plugin_get_network_for_address;
- api->update_session_timeout = &unix_plugin_update_session_timeout;
- api->setup_monitor = &unix_plugin_setup_monitor;
- sockets_created = unix_transport_server_start (plugin);
- if ((0 == sockets_created) || (GNUNET_SYSERR == sockets_created))
- {
- LOG (GNUNET_ERROR_TYPE_WARNING, _ ("Failed to open UNIX listen socket\n"));
- GNUNET_free (api);
- GNUNET_free (plugin->unix_socket_path);
- GNUNET_free (plugin);
- return NULL;
- }
- plugin->session_map = GNUNET_CONTAINER_multipeermap_create (10, GNUNET_NO);
- plugin->address_update_task =
- GNUNET_SCHEDULER_add_now (&address_notification, plugin);
- return api;
-}
-
-
-/**
- * Shutdown the plugin.
- *
- * @param cls the plugin API returned from the initialization function
- * @return NULL (always)
- */
-void *
-libgnunet_plugin_transport_unix_done (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
- struct Plugin *plugin = api->cls;
- struct GNUNET_HELLO_Address *address;
- struct UNIXMessageWrapper *msgw;
- struct UnixAddress *ua;
- size_t len;
- struct GNUNET_ATS_Session *session;
-
- if (NULL == plugin)
- {
- GNUNET_free (api);
- return NULL;
- }
- len = sizeof(struct UnixAddress) + strlen (plugin->unix_socket_path) + 1;
- ua = GNUNET_malloc (len);
- ua->options = htonl (plugin->myoptions);
- ua->addrlen = htonl (strlen (plugin->unix_socket_path) + 1);
- GNUNET_memcpy (&ua[1],
- plugin->unix_socket_path,
- strlen (plugin->unix_socket_path) + 1);
- address = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
- PLUGIN_NAME,
- ua,
- len,
- GNUNET_HELLO_ADDRESS_INFO_NONE);
- plugin->env->notify_address (plugin->env->cls, GNUNET_NO, address);
-
- GNUNET_free (address);
- GNUNET_free (ua);
-
- while (NULL != (msgw = plugin->msg_head))
- {
- GNUNET_CONTAINER_DLL_remove (plugin->msg_head, plugin->msg_tail, msgw);
- session = msgw->session;
- session->msgs_in_queue--;
- GNUNET_assert (session->bytes_in_queue >= msgw->msgsize);
- session->bytes_in_queue -= msgw->msgsize;
- GNUNET_assert (plugin->bytes_in_queue >= msgw->msgsize);
- plugin->bytes_in_queue -= msgw->msgsize;
- if (NULL != msgw->cont)
- msgw->cont (msgw->cont_cls,
- &msgw->session->target,
- GNUNET_SYSERR,
- msgw->payload,
- 0);
- GNUNET_free (msgw->msg);
- GNUNET_free (msgw);
- }
-
- if (NULL != plugin->read_task)
- {
- GNUNET_SCHEDULER_cancel (plugin->read_task);
- plugin->read_task = NULL;
- }
- if (NULL != plugin->write_task)
- {
- GNUNET_SCHEDULER_cancel (plugin->write_task);
- plugin->write_task = NULL;
- }
- if (NULL != plugin->address_update_task)
- {
- GNUNET_SCHEDULER_cancel (plugin->address_update_task);
- plugin->address_update_task = NULL;
- }
- if (NULL != plugin->unix_sock.desc)
- {
- GNUNET_break (GNUNET_OK ==
- GNUNET_NETWORK_socket_close (plugin->unix_sock.desc));
- plugin->unix_sock.desc = NULL;
- }
- GNUNET_CONTAINER_multipeermap_iterate (plugin->session_map,
- &get_session_delete_it,
- plugin);
- GNUNET_CONTAINER_multipeermap_destroy (plugin->session_map);
- GNUNET_break (0 == plugin->bytes_in_queue);
- GNUNET_free (plugin->unix_socket_path);
- GNUNET_free (plugin);
- GNUNET_free (api);
- return NULL;
-}
-
-
-/* end of plugin_transport_unix.c */
diff --git a/src/transport/plugin_transport_wlan.c
b/src/transport/plugin_transport_wlan.c
deleted file mode 100644
index 3ac106859..000000000
--- a/src/transport/plugin_transport_wlan.c
+++ /dev/null
@@ -1,2405 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2010-2014 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/plugin_transport_wlan.c
- * @brief transport plugin for wlan and/or bluetooth
- * @author David Brodski
- * @author Christian Grothoff
- *
- * BUILD_WLAN or BUILD_BLUETOOTH must be defined such that the respective
- * variant of this code is compiled.
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_statistics_service.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_transport_plugin.h"
-#include "plugin_transport_wlan.h"
-#include "gnunet_fragmentation_lib.h"
-#include "gnunet_constants.h"
-
-
-#if BUILD_WLAN
-/* begin case wlan */
-#define PLUGIN_NAME "wlan"
-#define CONFIG_NAME "transport-wlan"
-#define HELPER_NAME "gnunet-helper-transport-wlan"
-#define DUMMY_HELPER_NAME "gnunet-helper-transport-wlan-dummy"
-#define LIBGNUNET_PLUGIN_TRANSPORT_INIT libgnunet_plugin_transport_wlan_init
-#define LIBGNUNET_PLUGIN_TRANSPORT_DONE libgnunet_plugin_transport_wlan_done
-#define LOG(kind, ...) GNUNET_log_from (kind, "transport-wlan", __VA_ARGS__)
-
-
-/**
- * time out of a mac endpoint
- */
-#define MACENDPOINT_TIMEOUT GNUNET_TIME_relative_multiply ( \
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT, 2)
-
-/**
- * We reduce the frequence of HELLO beacons in relation to
- * the number of MAC addresses currently visible to us.
- * This is the multiplication factor.
- */
-#define HELLO_BEACON_SCALING_FACTOR GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_SECONDS, 2)
-
-
-/* end case wlan */
-#elif BUILD_BLUETOOTH
-/* begin case bluetooth */
-
-#define PLUGIN_NAME "bluetooth"
-#define CONFIG_NAME "transport-bluetooth"
-#define HELPER_NAME "gnunet-helper-transport-bluetooth"
-/* yes, this is correct, we use the same dummy driver as 'wlan' */
-#define DUMMY_HELPER_NAME "gnunet-helper-transport-wlan-dummy"
-#define LIBGNUNET_PLUGIN_TRANSPORT_INIT \
- libgnunet_plugin_transport_bluetooth_init
-#define LIBGNUNET_PLUGIN_TRANSPORT_DONE \
- libgnunet_plugin_transport_bluetooth_done
-#define LOG(kind, ...) GNUNET_log_from (kind, "transport-bluetooth", \
- __VA_ARGS__)
-
-/**
- * time out of a mac endpoint
- */
-#define MACENDPOINT_TIMEOUT GNUNET_TIME_relative_multiply ( \
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT, 60)
-
-
-/**
- * We reduce the frequence of HELLO beacons in relation to
- * the number of MAC addresses currently visible to us.
- * This is the multiplication factor.
- */
-#define HELLO_BEACON_SCALING_FACTOR GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_SECONDS, 60)
-
-/* end case bluetooth */
-#else
-#error need to build wlan or bluetooth
-#endif
-
-
-/**
- * Functions with this signature are called whenever a
- * complete message is received by the tokenizer.
- *
- * Do not call #GNUNET_SERVER_mst_destroy from within
- * the scope of this callback.
- *
- * @param cls closure
- * @param client identification of the client
- * @param message the actual message
- * @return #GNUNET_OK on success, #GNUNET_SYSERR to stop further processing
- */
-typedef int
-(*GNUNET_SERVER_MessageTokenizerCallback) (void *cls,
- void *client,
- const struct
- GNUNET_MessageHeader *message);
-
-
-/* Include legacy message stream tokenizer that was removed from util (for
now) */
-#include "tcp_server_mst_legacy.c"
-
-
-/**
- * Max size of packet (that we give to the WLAN driver for transmission)
- */
-#define WLAN_MTU 1430
-
-
-/**
- * Which network scope do we belong to?
- */
-#if BUILD_WLAN
-static const enum GNUNET_NetworkType scope = GNUNET_NT_WLAN;
-#else
-static const enum GNUNET_NetworkType scope = GNUNET_NT_BT;
-#endif
-
-
-/**
- * Maximum number of messages in defragmentation queue per MAC
- */
-#define MESSAGES_IN_DEFRAG_QUEUE_PER_MAC 2
-
-/**
- * Link layer control fields for better compatibility
- * (i.e. GNUnet over WLAN is not IP-over-WLAN).
- */
-#define WLAN_LLC_DSAP_FIELD 0x1f
-#define WLAN_LLC_SSAP_FIELD 0x1f
-
-
-GNUNET_NETWORK_STRUCT_BEGIN
-/**
- * Header for messages which need fragmentation. This is the format of
- * a message we obtain AFTER defragmentation. We then need to check
- * the CRC and then tokenize the payload and pass it to the
- * 'receive' callback.
- */
-struct WlanHeader
-{
- /**
- * Message type is #GNUNET_MESSAGE_TYPE_WLAN_DATA.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * CRC32 checksum (only over the payload), in NBO.
- */
- uint32_t crc GNUNET_PACKED;
-
- /**
- * Sender of the message.
- */
- struct GNUNET_PeerIdentity sender;
-
- /**
- * Target of the message.
- */
- struct GNUNET_PeerIdentity target;
-
- /* followed by payload, possibly including
- multiple messages! */
-};
-
-
-/**
- * Address format for WLAN.
- */
-struct WlanAddress
-{
- /**
- * Options set for the WLAN, in NBO.
- */
- uint32_t options GNUNET_PACKED;
-
- /**
- * WLAN addresses using MACs.
- */
- struct GNUNET_TRANSPORT_WLAN_MacAddress mac;
-};
-
-
-GNUNET_NETWORK_STRUCT_END
-
-
-/**
- * Information kept for each message that is yet to be fragmented and
- * transmitted.
- */
-struct PendingMessage
-{
- /**
- * next entry in the DLL
- */
- struct PendingMessage *next;
-
- /**
- * previous entry in the DLL
- */
- struct PendingMessage *prev;
-
- /**
- * The pending message
- */
- struct WlanHeader *msg;
-
- /**
- * Continuation function to call once the message
- * has been sent. Can be NULL if there is no
- * continuation to call.
- */
- GNUNET_TRANSPORT_TransmitContinuation transmit_cont;
-
- /**
- * Cls for @e transmit_cont
- */
- void *transmit_cont_cls;
-
- /**
- * Timeout task (for this message).
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-};
-
-
-/**
- * Session handle for connections with other peers.
- */
-struct GNUNET_ATS_Session
-{
- /**
- * To whom are we talking to (set to our identity
- * if we are still waiting for the welcome message)
- */
- struct GNUNET_PeerIdentity target;
-
- /**
- * We keep all sessions in a DLL at their respective
- * `struct MACEndpoint *`.
- */
- struct GNUNET_ATS_Session *next;
-
- /**
- * We keep all sessions in a DLL at their respective
- * `struct MACEndpoint *`.
- */
- struct GNUNET_ATS_Session *prev;
-
- /**
- * MAC endpoint with the address of this peer.
- */
- struct MacEndpoint *mac;
-
- /**
- * Address associated with this session and MAC endpoint
- */
- struct GNUNET_HELLO_Address *address;
-
- /**
- * When should this session time out?
- */
- struct GNUNET_TIME_Absolute timeout;
-
- /**
- * Timeout task (for the session).
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-};
-
-
-/**
- * Struct for messages that are being fragmented in a MAC's transmission queue.
- */
-struct FragmentMessage
-{
- /**
- * This is a doubly-linked list.
- */
- struct FragmentMessage *next;
-
- /**
- * This is a doubly-linked list.
- */
- struct FragmentMessage *prev;
-
- /**
- * MAC endpoint this message belongs to
- */
- struct MacEndpoint *macendpoint;
-
- /**
- * Fragmentation context
- */
- struct GNUNET_FRAGMENT_Context *fragcontext;
-
- /**
- * Transmission handle to helper (to cancel if the frag context
- * is destroyed early for some reason).
- */
- struct GNUNET_HELPER_SendHandle *sh;
-
- /**
- * Intended recipient.
- */
- struct GNUNET_PeerIdentity target;
-
- /**
- * Timeout value for the message.
- */
- struct GNUNET_TIME_Absolute timeout;
-
- /**
- * Timeout task.
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * Continuation to call when we're done with this message.
- */
- GNUNET_TRANSPORT_TransmitContinuation cont;
-
- /**
- * Message we need to fragment and transmit, NULL after the
- * @e fragmentcontext has been created.
- */
- struct GNUNET_MessageHeader *msg;
-
- /**
- * Closure for @e cont
- */
- void *cont_cls;
-
- /**
- * Size of original message
- */
- size_t size_payload;
-
- /**
- * Number of bytes used to transmit message
- */
- size_t size_on_wire;
-};
-
-
-/**
- * Struct to represent one network card connection
- */
-struct MacEndpoint
-{
- /**
- * We keep all MACs in a DLL in the plugin.
- */
- struct MacEndpoint *next;
-
- /**
- * We keep all MACs in a DLL in the plugin.
- */
- struct MacEndpoint *prev;
-
- /**
- * Pointer to the global plugin struct.
- */
- struct Plugin *plugin;
-
- /**
- * Head of sessions that use this MAC.
- */
- struct GNUNET_ATS_Session *sessions_head;
-
- /**
- * Tail of sessions that use this MAC.
- */
- struct GNUNET_ATS_Session *sessions_tail;
-
- /**
- * Head of messages we are currently sending to this MAC.
- */
- struct FragmentMessage *sending_messages_head;
-
- /**
- * Tail of messages we are currently sending to this MAC.
- */
- struct FragmentMessage *sending_messages_tail;
-
- /**
- * Defrag context for this MAC
- */
- struct GNUNET_DEFRAGMENT_Context *defrag;
-
- /**
- * When should this endpoint time out?
- */
- struct GNUNET_TIME_Absolute timeout;
-
- /**
- * Timeout task.
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * count of messages in the fragment out queue for this mac endpoint
- */
- unsigned int fragment_messages_out_count;
-
- /**
- * peer MAC address
- */
- struct WlanAddress wlan_addr;
-
- /**
- * Message delay for fragmentation context
- */
- struct GNUNET_TIME_Relative msg_delay;
-
- /**
- * ACK delay for fragmentation context
- */
- struct GNUNET_TIME_Relative ack_delay;
-
- /**
- * Desired transmission power for this MAC
- */
- uint16_t tx_power;
-
- /**
- * Desired transmission rate for this MAC
- */
- uint8_t rate;
-
- /**
- * Antenna we should use for this MAC
- */
- uint8_t antenna;
-};
-
-
-/**
- * Encapsulation of all of the state of the plugin.
- */
-struct Plugin
-{
- /**
- * Our environment.
- */
- struct GNUNET_TRANSPORT_PluginEnvironment *env;
-
- /**
- * Handle to helper process for privileged operations.
- */
- struct GNUNET_HELPER_Handle *suid_helper;
-
- /**
- * Function to call about session status changes.
- */
- GNUNET_TRANSPORT_SessionInfoCallback sic;
-
- /**
- * Closure for @e sic.
- */
- void *sic_cls;
-
- /**
- * ARGV-vector for the helper (all helpers take only the binary
- * name, one actual argument, plus the NULL terminator for 'argv').
- */
- char *helper_argv[3];
-
- /**
- * The interface of the wlan card given to us by the user.
- */
- char *wlan_interface;
-
- /**
- * Tokenizer for demultiplexing of data packets resulting from
- * defragmentation.
- */
- struct GNUNET_SERVER_MessageStreamTokenizer *fragment_data_tokenizer;
-
- /**
- * Tokenizer for demultiplexing of data packets received from the suid helper
- */
- struct GNUNET_SERVER_MessageStreamTokenizer *helper_payload_tokenizer;
-
- /**
- * Tokenizer for demultiplexing of data packets that follow the WLAN Header
- */
- struct GNUNET_SERVER_MessageStreamTokenizer *wlan_header_payload_tokenizer;
-
- /**
- * Head of list of open connections.
- */
- struct MacEndpoint *mac_head;
-
- /**
- * Tail of list of open connections.
- */
- struct MacEndpoint *mac_tail;
-
- /**
- * Task that periodically sends a HELLO beacon via the helper.
- */
- struct GNUNET_SCHEDULER_Task *beacon_task;
-
- /**
- * Tracker for bandwidth limit
- */
- struct GNUNET_BANDWIDTH_Tracker tracker;
-
- /**
- * The mac_address of the wlan card given to us by the helper.
- */
- struct GNUNET_TRANSPORT_WLAN_MacAddress mac_address;
-
- /**
- * Have we received a control message with our MAC address yet?
- */
- int have_mac;
-
- /**
- * Number of connections
- */
- unsigned int mac_count;
-
- /**
- * Options for addresses
- */
- uint32_t options;
-};
-
-
-/**
- * Information associated with a message. Can contain
- * the session or the MAC endpoint associated with the
- * message (or both).
- */
-struct MacAndSession
-{
- /**
- * NULL if the identity of the other peer is not known.
- */
- struct GNUNET_ATS_Session *session;
-
- /**
- * MAC address of the other peer, NULL if not known.
- */
- struct MacEndpoint *endpoint;
-};
-
-
-/**
- * Print MAC addresses nicely.
- *
- * @param mac the mac address
- * @return string to a static buffer with
- * the human-readable mac, will be overwritten during the next call to
- * this function
- */
-static const char *
-mac_to_string (const struct GNUNET_TRANSPORT_WLAN_MacAddress *mac)
-{
- static char macstr[20];
-
- GNUNET_snprintf (macstr,
- sizeof(macstr),
- "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
- mac->mac[0], mac->mac[1],
- mac->mac[2], mac->mac[3],
- mac->mac[4], mac->mac[5]);
- return macstr;
-}
-
-
-/**
- * Function called for a quick conversion of the binary address to
- * a numeric address. Note that the caller must not free the
- * address and that the next call to this function is allowed
- * to override the address again.
- *
- * @param cls closure
- * @param addr binary address
- * @param addrlen length of the address
- * @return string representing the same address
- */
-static const char *
-wlan_plugin_address_to_string (void *cls,
- const void *addr,
- size_t addrlen)
-{
- const struct GNUNET_TRANSPORT_WLAN_MacAddress *mac;
- static char macstr[36];
-
- if (sizeof(struct WlanAddress) != addrlen)
- {
- GNUNET_break (0);
- return NULL;
- }
- mac = &((struct WlanAddress *) addr)->mac;
- GNUNET_snprintf (macstr,
- sizeof(macstr),
- "%s.%u.%s",
- PLUGIN_NAME,
- ntohl (((struct WlanAddress *) addr)->options),
- mac_to_string (mac));
- return macstr;
-}
-
-
-/**
- * If a session monitor is attached, notify it about the new
- * session state.
- *
- * @param plugin our plugin
- * @param session session that changed state
- * @param state new state of the session
- */
-static void
-notify_session_monitor (struct Plugin *plugin,
- struct GNUNET_ATS_Session *session,
- enum GNUNET_TRANSPORT_SessionState state)
-{
- struct GNUNET_TRANSPORT_SessionInfo info;
-
- if (NULL == plugin->sic)
- return;
- memset (&info, 0, sizeof(info));
- info.state = state;
- info.is_inbound = GNUNET_SYSERR; /* hard to say */
- info.num_msg_pending = 0; /* we queue per MAC, not per peer */
- info.num_bytes_pending = 0; /* we queue per MAC, not per peer */
- info.receive_delay = GNUNET_TIME_UNIT_ZERO_ABS; /* not supported by WLAN */
- info.session_timeout = session->timeout;
- info.address = session->address;
- plugin->sic (plugin->sic_cls,
- session,
- &info);
-}
-
-
-/**
- * Fill the radiotap header
- *
- * @param endpoint pointer to the endpoint, can be NULL
- * @param header pointer to the radiotap header
- * @param size total message size
- */
-static void
-get_radiotap_header (struct MacEndpoint *endpoint,
- struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *header,
- uint16_t size)
-{
- header->header.type = ntohs (GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER);
- header->header.size = ntohs (size);
- if (NULL != endpoint)
- {
- header->rate = endpoint->rate;
- header->tx_power = endpoint->tx_power;
- header->antenna = endpoint->antenna;
- }
- else
- {
- header->rate = 255;
- header->tx_power = 0;
- header->antenna = 0;
- }
-}
-
-
-/**
- * Generate the WLAN hardware header for one packet
- *
- * @param plugin the plugin handle
- * @param header address to write the header to
- * @param to_mac_addr address of the recipient
- * @param size size of the whole packet, needed to calculate the time to send
the packet
- */
-static void
-get_wlan_header (struct Plugin *plugin,
- struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *header,
- const struct GNUNET_TRANSPORT_WLAN_MacAddress *to_mac_addr,
- unsigned int size)
-{
- const int rate = 11000000;
-
- header->frame_control = htons (IEEE80211_FC0_TYPE_DATA);
- header->addr1 = *to_mac_addr;
- header->addr2 = plugin->mac_address;
- header->addr3 = mac_bssid_gnunet;
- header->duration = GNUNET_htole16 ((size * 1000000) / rate + 290);
- header->sequence_control = 0; // FIXME?
- header->llc[0] = WLAN_LLC_DSAP_FIELD;
- header->llc[1] = WLAN_LLC_SSAP_FIELD;
- header->llc[2] = 0; // FIXME?
- header->llc[3] = 0; // FIXME?
-}
-
-
-/**
- * Send an ACK for a fragment we received.
- *
- * @param cls the `struct MacEndpoint *` the ACK must be sent to
- * @param msg_id id of the message
- * @param hdr pointer to the hdr where the ack is stored
- */
-static void
-send_ack (void *cls,
- uint32_t msg_id,
- const struct GNUNET_MessageHeader *hdr)
-{
- struct MacEndpoint *endpoint = cls;
- struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage*radio_header;
- uint16_t msize = ntohs (hdr->size);
- size_t size = sizeof(struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage)
- + msize;
- char buf[size];
-
- if (NULL == endpoint)
- {
- GNUNET_break (0);
- return;
- }
- if (size >= GNUNET_MAX_MESSAGE_SIZE)
- {
- GNUNET_break (0);
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Sending ACK to %s\n",
- mac_to_string (&endpoint->wlan_addr.mac));
- radio_header = (struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *) buf;
- get_radiotap_header (endpoint, radio_header, size);
- get_wlan_header (endpoint->plugin,
- &radio_header->frame,
- &endpoint->wlan_addr.mac,
- sizeof(endpoint->wlan_addr.mac));
- GNUNET_memcpy (&radio_header[1], hdr, msize);
- if (NULL !=
- GNUNET_HELPER_send (endpoint->plugin->suid_helper,
- &radio_header->header,
- GNUNET_NO /* dropping ACKs is bad */,
- NULL, NULL))
- GNUNET_STATISTICS_update (endpoint->plugin->env->stats,
- _ ("# ACKs sent"),
- 1, GNUNET_NO);
-}
-
-
-/**
- * Handles the data after all fragments are put together
- *
- * @param cls macendpoint this messages belongs to
- * @param hdr pointer to the data
- */
-static void
-wlan_data_message_handler (void *cls,
- const struct GNUNET_MessageHeader *hdr)
-{
- struct MacEndpoint *endpoint = cls;
- struct Plugin *plugin = endpoint->plugin;
- struct MacAndSession mas;
-
- GNUNET_STATISTICS_update (plugin->env->stats,
- _ ("# Messages defragmented"),
- 1,
- GNUNET_NO);
- mas.session = NULL;
- mas.endpoint = endpoint;
- (void) GNUNET_SERVER_mst_receive (plugin->fragment_data_tokenizer,
- &mas,
- (const char *) hdr,
- ntohs (hdr->size),
- GNUNET_YES, GNUNET_NO);
-}
-
-
-/**
- * Free a session
- *
- * @param cls our `struct Plugin`.
- * @param session the session free
- */
-static int
-wlan_plugin_disconnect_session (void *cls,
- struct GNUNET_ATS_Session *session)
-{
- struct MacEndpoint *endpoint = session->mac;
- struct Plugin *plugin = endpoint->plugin;
-
- plugin->env->session_end (plugin->env->cls,
- session->address,
- session);
- notify_session_monitor (plugin,
- session,
- GNUNET_TRANSPORT_SS_DONE);
- GNUNET_CONTAINER_DLL_remove (endpoint->sessions_head,
- endpoint->sessions_tail,
- session);
- if (session->timeout_task != NULL)
- {
- GNUNET_SCHEDULER_cancel (session->timeout_task);
- session->timeout_task = NULL;
- }
- GNUNET_STATISTICS_update (plugin->env->stats,
- _ ("# Sessions allocated"),
- -1,
- GNUNET_NO);
- GNUNET_HELLO_address_free (session->address);
- GNUNET_free (session);
- return GNUNET_OK;
-}
-
-
-/**
- * Function that is called to get the keepalive factor.
- * #GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT is divided by this number to
- * calculate the interval between keepalive packets.
- *
- * @param cls closure with the `struct Plugin`
- * @return keepalive factor
- */
-static unsigned int
-wlan_plugin_query_keepalive_factor (void *cls)
-{
- return 3;
-}
-
-
-/**
- * A session is timing out. Clean up.
- *
- * @param cls pointer to the Session
- */
-static void
-session_timeout (void *cls)
-{
- struct GNUNET_ATS_Session *session = cls;
- struct GNUNET_TIME_Relative left;
-
- session->timeout_task = NULL;
- left = GNUNET_TIME_absolute_get_remaining (session->timeout);
- if (0 != left.rel_value_us)
- {
- session->timeout_task =
- GNUNET_SCHEDULER_add_delayed (left,
- &session_timeout,
- session);
- return;
- }
- wlan_plugin_disconnect_session (session->mac->plugin,
- session);
-}
-
-
-/**
- * Lookup a new session
- *
- * @param endpoint pointer to the mac endpoint of the peer
- * @param peer peer identity to use for this session
- * @return returns the session or NULL
- */
-static struct GNUNET_ATS_Session *
-lookup_session (struct MacEndpoint *endpoint,
- const struct GNUNET_PeerIdentity *peer)
-{
- struct GNUNET_ATS_Session *session;
-
- for (session = endpoint->sessions_head; NULL != session; session =
- session->next)
- if (0 == memcmp (peer, &session->target, sizeof(struct
- GNUNET_PeerIdentity)))
- return session;
- return NULL;
-}
-
-
-/**
- * Create a new session
- *
- * @param endpoint pointer to the mac endpoint of the peer
- * @param peer peer identity to use for this session
- * @return returns the session or NULL
- */
-static struct GNUNET_ATS_Session *
-create_session (struct MacEndpoint *endpoint,
- const struct GNUNET_PeerIdentity *peer)
-{
- struct GNUNET_ATS_Session *session;
-
- GNUNET_STATISTICS_update (endpoint->plugin->env->stats,
- _ ("# Sessions allocated"),
- 1,
- GNUNET_NO);
- session = GNUNET_new (struct GNUNET_ATS_Session);
- GNUNET_CONTAINER_DLL_insert_tail (endpoint->sessions_head,
- endpoint->sessions_tail,
- session);
- session->address = GNUNET_HELLO_address_allocate (peer,
- PLUGIN_NAME,
- &endpoint->wlan_addr,
-
sizeof(endpoint->wlan_addr),
-
GNUNET_HELLO_ADDRESS_INFO_NONE);
- session->mac = endpoint;
- session->target = *peer;
- session->timeout = GNUNET_TIME_relative_to_absolute (
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
- session->timeout_task =
- GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
- &session_timeout,
- session);
- notify_session_monitor (endpoint->plugin,
- session,
- GNUNET_TRANSPORT_SS_INIT);
- notify_session_monitor (endpoint->plugin,
- session,
- GNUNET_TRANSPORT_SS_UP);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Created new session %p for peer `%s' with endpoint %s\n",
- session,
- GNUNET_i2s (peer),
- mac_to_string (&endpoint->wlan_addr.mac));
-
- return session;
-}
-
-
-/**
- * Look up a session for a peer and create a new session if none is found
- *
- * @param endpoint pointer to the mac endpoint of the peer
- * @param peer peer identity to use for this session
- * @return returns the session
- */
-static struct GNUNET_ATS_Session *
-get_session (struct MacEndpoint *endpoint,
- const struct GNUNET_PeerIdentity *peer)
-{
- struct GNUNET_ATS_Session *session;
-
- if (NULL != (session = lookup_session (endpoint, peer)))
- return session;
- return create_session (endpoint, peer);
-}
-
-
-/**
- * Function called once we have successfully given the fragment
- * message to the SUID helper process and we are thus ready for
- * the next fragment.
- *
- * @param cls the `struct FragmentMessage *`
- * @param result result of the operation (#GNUNET_OK on success,
- * #GNUNET_NO if the helper died, #GNUNET_SYSERR
- * if the helper was stopped)
- */
-static void
-fragment_transmission_done (void *cls,
- int result)
-{
- struct FragmentMessage *fm = cls;
-
- fm->sh = NULL;
- GNUNET_FRAGMENT_context_transmission_done (fm->fragcontext);
-}
-
-
-/**
- * Transmit a fragment of a message.
- *
- * @param cls `struct FragmentMessage *` this fragment message belongs to
- * @param hdr pointer to the start of the fragment message
- */
-static void
-transmit_fragment (void *cls,
- const struct GNUNET_MessageHeader *hdr)
-{
- struct FragmentMessage *fm = cls;
- struct MacEndpoint *endpoint = fm->macendpoint;
- size_t size;
- uint16_t msize;
-
- if (NULL == endpoint)
- {
- GNUNET_break (0);
- return;
- }
- msize = ntohs (hdr->size);
- size = sizeof(struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage) + msize;
- {
- char buf[size];
- struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *radio_header;
-
- radio_header = (struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *) buf;
- get_radiotap_header (endpoint, radio_header, size);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Sending %u bytes of data to MAC `%s'\n",
- (unsigned int) msize,
- mac_to_string (&endpoint->wlan_addr.mac));
-
- get_wlan_header (endpoint->plugin,
- &radio_header->frame,
- &endpoint->wlan_addr.mac,
- sizeof(endpoint->wlan_addr.mac));
- GNUNET_memcpy (&radio_header[1], hdr, msize);
- GNUNET_assert (NULL == fm->sh);
- fm->sh = GNUNET_HELPER_send (endpoint->plugin->suid_helper,
- &radio_header->header,
- GNUNET_NO,
- &fragment_transmission_done, fm);
- fm->size_on_wire += size;
- if (NULL != fm->sh)
- {
- GNUNET_STATISTICS_update (endpoint->plugin->env->stats,
- _ ("# message fragments sent"),
- 1,
- GNUNET_NO);
- }
- else
- {
- GNUNET_FRAGMENT_context_transmission_done (fm->fragcontext);
- }
- GNUNET_STATISTICS_update (endpoint->plugin->env->stats,
- "# bytes currently in buffers",
- -msize, GNUNET_NO);
- GNUNET_STATISTICS_update (endpoint->plugin->env->stats,
- "# bytes transmitted",
- msize, GNUNET_NO);
- }
-}
-
-
-/**
- * Frees the space of a message in the fragment queue (send queue)
- *
- * @param fm message to free
- */
-static void
-free_fragment_message (struct FragmentMessage *fm)
-{
- struct MacEndpoint *endpoint = fm->macendpoint;
-
- GNUNET_STATISTICS_update (endpoint->plugin->env->stats,
- _ ("# messages pending (with fragmentation)"),
- -1, GNUNET_NO);
- GNUNET_CONTAINER_DLL_remove (endpoint->sending_messages_head,
- endpoint->sending_messages_tail,
- fm);
- if (NULL != fm->sh)
- {
- GNUNET_HELPER_send_cancel (fm->sh);
- fm->sh = NULL;
- }
- if (NULL != fm->msg)
- {
- GNUNET_free (fm->msg);
- fm->msg = NULL;
- }
- if (NULL != fm->fragcontext)
- {
- GNUNET_FRAGMENT_context_destroy (fm->fragcontext,
- &endpoint->msg_delay,
- &endpoint->ack_delay);
- fm->fragcontext = NULL;
- }
- if (NULL != fm->timeout_task)
- {
- GNUNET_SCHEDULER_cancel (fm->timeout_task);
- fm->timeout_task = NULL;
- }
- GNUNET_free (fm);
-}
-
-
-/**
- * A FragmentMessage has timed out. Remove it.
- *
- * @param cls pointer to the 'struct FragmentMessage'
- */
-static void
-fragmentmessage_timeout (void *cls)
-{
- struct FragmentMessage *fm = cls;
-
- fm->timeout_task = NULL;
- if (NULL != fm->cont)
- {
- fm->cont (fm->cont_cls,
- &fm->target,
- GNUNET_SYSERR,
- fm->size_payload,
- fm->size_on_wire);
- fm->cont = NULL;
- }
- free_fragment_message (fm);
-}
-
-
-/**
- * Transmit a message to the given destination with fragmentation.
- *
- * @param endpoint desired destination
- * @param timeout how long can the message wait?
- * @param target peer that should receive the message
- * @param msg message to transmit
- * @param payload_size bytes of payload
- * @param cont continuation to call once the message has
- * been transmitted (or if the transport is ready
- * for the next transmission call; or if the
- * peer disconnected...); can be NULL
- * @param cont_cls closure for @a cont
- */
-static void
-send_with_fragmentation (struct MacEndpoint *endpoint,
- struct GNUNET_TIME_Relative timeout,
- const struct GNUNET_PeerIdentity *target,
- const struct GNUNET_MessageHeader *msg,
- size_t payload_size,
- GNUNET_TRANSPORT_TransmitContinuation cont,
- void *cont_cls)
-
-{
- struct FragmentMessage *fm;
- struct Plugin *plugin;
-
- plugin = endpoint->plugin;
- fm = GNUNET_new (struct FragmentMessage);
- fm->macendpoint = endpoint;
- fm->target = *target;
- fm->size_payload = payload_size;
- fm->timeout = GNUNET_TIME_relative_to_absolute (timeout);
- fm->cont = cont;
- fm->cont_cls = cont_cls;
- /* 1 MBit/s typical data rate, 1430 byte fragments => ~100 ms per message */
- fm->timeout_task =
- GNUNET_SCHEDULER_add_delayed (timeout,
- &fragmentmessage_timeout,
- fm);
- if (GNUNET_YES == plugin->have_mac)
- {
- fm->fragcontext =
- GNUNET_FRAGMENT_context_create (plugin->env->stats,
- WLAN_MTU,
- &plugin->tracker,
- fm->macendpoint->msg_delay,
- fm->macendpoint->ack_delay,
- msg,
- &transmit_fragment, fm);
- }
- else
- {
- fm->msg = GNUNET_copy_message (msg);
- }
- GNUNET_CONTAINER_DLL_insert_tail (endpoint->sending_messages_head,
- endpoint->sending_messages_tail,
- fm);
-}
-
-
-/**
- * Free a MAC endpoint.
- *
- * @param endpoint pointer to the MacEndpoint to free
- */
-static void
-free_macendpoint (struct MacEndpoint *endpoint)
-{
- struct Plugin *plugin = endpoint->plugin;
- struct FragmentMessage *fm;
- struct GNUNET_ATS_Session *session;
-
- GNUNET_STATISTICS_update (plugin->env->stats,
- _ ("# MAC endpoints allocated"),
- -1,
- GNUNET_NO);
- while (NULL != (session = endpoint->sessions_head))
- wlan_plugin_disconnect_session (plugin,
- session);
- while (NULL != (fm = endpoint->sending_messages_head))
- free_fragment_message (fm);
- GNUNET_CONTAINER_DLL_remove (plugin->mac_head,
- plugin->mac_tail,
- endpoint);
-
- if (NULL != endpoint->defrag)
- {
- GNUNET_DEFRAGMENT_context_destroy (endpoint->defrag);
- endpoint->defrag = NULL;
- }
-
- plugin->mac_count--;
- if (NULL != endpoint->timeout_task)
- {
- GNUNET_SCHEDULER_cancel (endpoint->timeout_task);
- endpoint->timeout_task = NULL;
- }
- GNUNET_free (endpoint);
-}
-
-
-/**
- * A MAC endpoint is timing out. Clean up.
- *
- * @param cls pointer to the `struct MacEndpoint *`
- */
-static void
-macendpoint_timeout (void *cls)
-{
- struct MacEndpoint *endpoint = cls;
- struct GNUNET_TIME_Relative timeout;
-
- endpoint->timeout_task = NULL;
- timeout = GNUNET_TIME_absolute_get_remaining (endpoint->timeout);
- if (0 == timeout.rel_value_us)
- {
- free_macendpoint (endpoint);
- return;
- }
- endpoint->timeout_task =
- GNUNET_SCHEDULER_add_delayed (timeout,
- &macendpoint_timeout,
- endpoint);
-}
-
-
-/**
- * Find (or create) a MacEndpoint with a specific MAC address
- *
- * @param plugin pointer to the plugin struct
- * @param mac the MAC address of the endpoint
- * @return handle to our data structure for this MAC
- */
-static struct MacEndpoint *
-create_macendpoint (struct Plugin *plugin,
- struct WlanAddress *mac)
-{
- struct MacEndpoint *pos;
-
- for (pos = plugin->mac_head; NULL != pos; pos = pos->next)
- if (0 == memcmp (mac, &pos->wlan_addr, sizeof(pos->wlan_addr)))
- return pos;
- pos = GNUNET_new (struct MacEndpoint);
- pos->wlan_addr = (*mac);
- pos->plugin = plugin;
- pos->defrag =
- GNUNET_DEFRAGMENT_context_create (plugin->env->stats,
- WLAN_MTU,
- MESSAGES_IN_DEFRAG_QUEUE_PER_MAC,
- pos,
- &wlan_data_message_handler,
- &send_ack);
-
- pos->msg_delay = GNUNET_TIME_UNIT_MILLISECONDS;
- pos->ack_delay = GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_MILLISECONDS,
- 100);
- pos->timeout = GNUNET_TIME_relative_to_absolute (MACENDPOINT_TIMEOUT);
- pos->timeout_task =
- GNUNET_SCHEDULER_add_delayed (MACENDPOINT_TIMEOUT, &macendpoint_timeout,
- pos);
- GNUNET_CONTAINER_DLL_insert (plugin->mac_head,
- plugin->mac_tail,
- pos);
- plugin->mac_count++;
- GNUNET_STATISTICS_update (plugin->env->stats,
- _ ("# MAC endpoints allocated"),
- 1, GNUNET_NO);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "New MAC endpoint `%s'\n",
- wlan_plugin_address_to_string (NULL,
- &pos->wlan_addr,
- sizeof(struct WlanAddress)));
- return pos;
-}
-
-
-/**
- * Function obtain the network type for a session
- *
- * @param cls closure (`struct Plugin*`)
- * @param session the session
- * @return the network type in HBO or #GNUNET_SYSERR
- */
-static enum GNUNET_NetworkType
-wlan_plugin_get_network (void *cls,
- struct GNUNET_ATS_Session *session)
-{
-#if BUILD_WLAN
- return GNUNET_NT_WLAN;
-#else
- return GNUNET_NT_BT;
-#endif
-}
-
-
-/**
- * Function obtain the network type for an address.
- *
- * @param cls closure (`struct Plugin *`)
- * @param address the address
- * @return the network type
- */
-static enum GNUNET_NetworkType
-wlan_plugin_get_network_for_address (void *cls,
- const struct GNUNET_HELLO_Address
*address)
-{
-#if BUILD_WLAN
- return GNUNET_NT_WLAN;
-#else
- return GNUNET_NT_BT;
-#endif
-}
-
-
-/**
- * Creates a new outbound session the transport service will use to
- * send data to the peer
- *
- * @param cls the `struct Plugin *`
- * @param address the address
- * @return the session or NULL of max connections exceeded
- */
-static struct GNUNET_ATS_Session *
-wlan_plugin_get_session (void *cls,
- const struct GNUNET_HELLO_Address *address)
-{
- struct Plugin *plugin = cls;
- struct MacEndpoint *endpoint;
-
- if (NULL == address)
- return NULL;
- if (sizeof(struct WlanAddress) != address->address_length)
- {
- GNUNET_break (0);
- return NULL;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Service asked to create session for peer `%s' with MAC `%s'\n",
- GNUNET_i2s (&address->peer),
- wlan_plugin_address_to_string (NULL,
- address->address,
- address->address_length));
- endpoint = create_macendpoint (plugin,
- (struct WlanAddress *) address->address);
- return get_session (endpoint, &address->peer);
-}
-
-
-/**
- * Function that can be used to force the plugin to disconnect
- * from the given peer and cancel all previous transmissions
- * (and their continuation).
- *
- * @param cls closure
- * @param target peer from which to disconnect
- */
-static void
-wlan_plugin_disconnect_peer (void *cls,
- const struct GNUNET_PeerIdentity *target)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_ATS_Session *session;
- struct MacEndpoint *endpoint;
-
- for (endpoint = plugin->mac_head; NULL != endpoint; endpoint =
endpoint->next)
- for (session = endpoint->sessions_head; NULL != session; session =
- session->next)
- if (0 == memcmp (target, &session->target,
- sizeof(struct GNUNET_PeerIdentity)))
- {
- wlan_plugin_disconnect_session (plugin, session);
- break; /* inner-loop only (in case peer has another MAC as well!) */
- }
-}
-
-
-/**
- * Function that can be used by the transport service to transmit
- * a message using the plugin. Note that in the case of a
- * peer disconnecting, the continuation MUST be called
- * prior to the disconnect notification itself. This function
- * will be called with this peer's HELLO message to initiate
- * a fresh connection to another peer.
- *
- * @param cls closure
- * @param session which session must be used
- * @param msgbuf the message to transmit
- * @param msgbuf_size number of bytes in @a msgbuf
- * @param priority how important is the message (most plugins will
- * ignore message priority and just FIFO)
- * @param to how long to wait at most for the transmission (does not
- * require plugins to discard the message after the timeout,
- * just advisory for the desired delay; most plugins will ignore
- * this as well)
- * @param cont continuation to call once the message has
- * been transmitted (or if the transport is ready
- * for the next transmission call; or if the
- * peer disconnected...); can be NULL
- * @param cont_cls closure for @a cont
- * @return number of bytes used (on the physical network, with overheads);
- * -1 on hard errors (i.e. address invalid); 0 is a legal value
- * and does NOT mean that the message was not transmitted (DV)
- */
-static ssize_t
-wlan_plugin_send (void *cls,
- struct GNUNET_ATS_Session *session,
- const char *msgbuf, size_t msgbuf_size,
- unsigned int priority,
- struct GNUNET_TIME_Relative to,
- GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls)
-{
- struct Plugin *plugin = cls;
- struct WlanHeader *wlanheader;
- size_t size = msgbuf_size + sizeof(struct WlanHeader);
- char buf[size] GNUNET_ALIGN;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Transmitting %llu bytes of payload to peer `%s' (starting with %u byte
message of type %u)\n",
- (unsigned long long) msgbuf_size,
- GNUNET_i2s (&session->target),
- (unsigned int) ntohs (((struct GNUNET_MessageHeader*) msgbuf)->size),
- (unsigned int) ntohs (((struct GNUNET_MessageHeader*) msgbuf)->type));
- wlanheader = (struct WlanHeader *) buf;
- wlanheader->header.size = htons (msgbuf_size + sizeof(struct WlanHeader));
- wlanheader->header.type = htons (GNUNET_MESSAGE_TYPE_WLAN_DATA);
- wlanheader->sender = *plugin->env->my_identity;
- wlanheader->target = session->target;
- wlanheader->crc = htonl (GNUNET_CRYPTO_crc32_n (msgbuf, msgbuf_size));
- GNUNET_memcpy (&wlanheader[1],
- msgbuf,
- msgbuf_size);
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# bytes currently in buffers",
- msgbuf_size,
- GNUNET_NO);
- send_with_fragmentation (session->mac,
- to,
- &session->target,
- &wlanheader->header,
- msgbuf_size,
- cont, cont_cls);
- return size;
-}
-
-
-/**
- * We have received data from the WLAN via some session. Process depending
- * on the message type (HELLO, DATA, FRAGMENTATION or FRAGMENTATION-ACK).
- *
- * @param cls pointer to the plugin
- * @param client pointer to the session this message belongs to
- * @param hdr start of the message
- */
-static int
-process_data (void *cls,
- void *client,
- const struct GNUNET_MessageHeader *hdr)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_HELLO_Address *address;
- struct MacAndSession *mas = client;
- struct FragmentMessage *fm;
- struct GNUNET_PeerIdentity tmpsource;
- const struct WlanHeader *wlanheader;
- int ret;
- uint16_t msize;
-
- msize = ntohs (hdr->size);
-
- GNUNET_STATISTICS_update (plugin->env->stats,
- "# bytes received",
- msize, GNUNET_NO);
-
- switch (ntohs (hdr->type))
- {
- case GNUNET_MESSAGE_TYPE_HELLO:
-
- if (GNUNET_OK !=
- GNUNET_HELLO_get_id ((const struct GNUNET_HELLO_Message *) hdr,
- &tmpsource))
- {
- GNUNET_break_op (0);
- break;
- }
- if (NULL == mas->endpoint)
- {
- GNUNET_break (0);
- break;
- }
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Processing %u bytes of HELLO from peer `%s' at MAC %s\n",
- (unsigned int) msize,
- GNUNET_i2s (&tmpsource),
- wlan_plugin_address_to_string (NULL,
- &mas->endpoint->wlan_addr,
- sizeof(mas->endpoint->wlan_addr)));
-
- GNUNET_STATISTICS_update (plugin->env->stats,
- _ ("# HELLO messages received"), 1,
- GNUNET_NO);
- address = GNUNET_HELLO_address_allocate (&tmpsource,
- PLUGIN_NAME,
- &mas->endpoint->wlan_addr,
- sizeof(mas->endpoint->wlan_addr),
- GNUNET_HELLO_ADDRESS_INFO_NONE);
- mas->session = lookup_session (mas->endpoint,
- &tmpsource);
- if (NULL == mas->session)
- {
- mas->session = create_session (mas->endpoint,
- &tmpsource);
- plugin->env->session_start (plugin->env->cls,
- address,
- mas->session,
- scope);
- }
- plugin->env->receive (plugin->env->cls,
- address,
- mas->session,
- hdr);
- GNUNET_HELLO_address_free (address);
- break;
-
- case GNUNET_MESSAGE_TYPE_FRAGMENT:
- if (NULL == mas->endpoint)
- {
- GNUNET_break (0);
- break;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Processing %u bytes of FRAGMENT from MAC %s\n",
- (unsigned int) msize,
- wlan_plugin_address_to_string (NULL,
- &mas->endpoint->wlan_addr,
- sizeof(mas->endpoint->wlan_addr)));
- GNUNET_STATISTICS_update (plugin->env->stats,
- _ ("# fragments received"),
- 1,
- GNUNET_NO);
- (void) GNUNET_DEFRAGMENT_process_fragment (mas->endpoint->defrag,
- hdr);
- break;
-
- case GNUNET_MESSAGE_TYPE_FRAGMENT_ACK:
- if (NULL == mas->endpoint)
- {
- GNUNET_break (0);
- break;
- }
- GNUNET_STATISTICS_update (plugin->env->stats,
- _ ("# ACKs received"),
- 1, GNUNET_NO);
- for (fm = mas->endpoint->sending_messages_head; NULL != fm; fm = fm->next)
- {
- ret = GNUNET_FRAGMENT_process_ack (fm->fragcontext, hdr);
- if (GNUNET_OK == ret)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Got last ACK, finished message transmission to `%s' (%p)\n",
- wlan_plugin_address_to_string (NULL,
- &mas->endpoint->wlan_addr,
- sizeof(mas->endpoint->wlan_addr)),
- fm);
- mas->endpoint->timeout = GNUNET_TIME_relative_to_absolute (
- MACENDPOINT_TIMEOUT);
- if (NULL != fm->cont)
- {
- fm->cont (fm->cont_cls,
- &fm->target,
- GNUNET_OK,
- fm->size_payload,
- fm->size_on_wire);
- fm->cont = NULL;
- }
- free_fragment_message (fm);
- break;
- }
- if (GNUNET_NO == ret)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Got an ACK, message transmission to `%s' not yet finished\n",
- wlan_plugin_address_to_string (NULL,
- &mas->endpoint->wlan_addr,
- sizeof(mas->endpoint->wlan_addr)));
- break;
- }
- }
- if (NULL == fm)
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "ACK not matched against any active fragmentation with MAC `%s'\n",
- wlan_plugin_address_to_string (NULL,
- &mas->endpoint->wlan_addr,
- sizeof(mas->endpoint->wlan_addr)));
- break;
-
- case GNUNET_MESSAGE_TYPE_WLAN_DATA:
- if (NULL == mas->endpoint)
- {
- GNUNET_break (0);
- break;
- }
- if (msize < sizeof(struct WlanHeader))
- {
- GNUNET_break (0);
- break;
- }
- wlanheader = (const struct WlanHeader *) hdr;
- if (0 != memcmp (&wlanheader->target,
- plugin->env->my_identity,
- sizeof(struct GNUNET_PeerIdentity)))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Data for `%s', not for me, ignoring\n",
- GNUNET_i2s (&wlanheader->target));
- break;
- }
- if (ntohl (wlanheader->crc) !=
- GNUNET_CRYPTO_crc32_n (&wlanheader[1],
- msize - sizeof(struct WlanHeader)))
- {
- GNUNET_STATISTICS_update (plugin->env->stats,
- _ (
- "# DATA messages discarded due to CRC32
error"),
- 1,
- GNUNET_NO);
- break;
- }
- mas->session = lookup_session (mas->endpoint,
- &wlanheader->sender);
- if (NULL == mas->session)
- {
- mas->session = create_session (mas->endpoint,
- &wlanheader->sender);
- address = GNUNET_HELLO_address_allocate (&wlanheader->sender,
- PLUGIN_NAME,
- &mas->endpoint->wlan_addr,
- sizeof(struct WlanAddress),
- GNUNET_HELLO_ADDRESS_INFO_NONE);
- plugin->env->session_start (plugin->env->cls,
- address,
- mas->session,
- scope);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Notifying transport about peer `%s''s new session %p \n",
- GNUNET_i2s (&wlanheader->sender),
- mas->session);
- GNUNET_HELLO_address_free (address);
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Processing %u bytes of DATA from peer `%s'\n",
- (unsigned int) msize,
- GNUNET_i2s (&wlanheader->sender));
- mas->session->timeout = GNUNET_TIME_relative_to_absolute (
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
- (void) GNUNET_SERVER_mst_receive (plugin->wlan_header_payload_tokenizer,
- mas,
- (const char *) &wlanheader[1],
- msize - sizeof(struct WlanHeader),
- GNUNET_YES,
- GNUNET_NO);
- break;
-
- default:
- if (NULL == mas->endpoint)
- {
- GNUNET_break (0);
- break;
- }
- if (NULL == mas->session)
- {
- GNUNET_break (0);
- break;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received packet with %u bytes of type %u from peer %s\n",
- (unsigned int) msize,
- (unsigned int) ntohs (hdr->type),
- GNUNET_i2s (&mas->session->target));
- plugin->env->receive (plugin->env->cls,
- mas->session->address,
- mas->session,
- hdr);
- break;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Task to (periodically) send a HELLO beacon
- *
- * @param cls pointer to the plugin struct
- */
-static void
-send_hello_beacon (void *cls)
-{
- struct Plugin *plugin = cls;
- uint16_t size;
- uint16_t hello_size;
- struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage *radioHeader;
- const struct GNUNET_MessageHeader *hello;
-
- hello = plugin->env->get_our_hello ();
- if (NULL != hello)
- {
- hello_size = GNUNET_HELLO_size ((struct GNUNET_HELLO_Message *) hello);
- GNUNET_assert (sizeof(struct WlanHeader) + hello_size <= WLAN_MTU);
- size = sizeof(struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage)
- + hello_size;
- {
- char buf[size] GNUNET_ALIGN;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Sending %u byte HELLO beacon\n",
- (unsigned int) size);
- radioHeader = (struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage*) buf;
- get_radiotap_header (NULL, radioHeader, size);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Broadcasting %u bytes of data to MAC `%s'\n",
- (unsigned int) size,
- mac_to_string (&bc_all_mac));
- get_wlan_header (plugin, &radioHeader->frame, &bc_all_mac, size);
- GNUNET_memcpy (&radioHeader[1], hello, hello_size);
- if (NULL !=
- GNUNET_HELPER_send (plugin->suid_helper,
- &radioHeader->header,
- GNUNET_YES /* can drop */,
- NULL, NULL))
- GNUNET_STATISTICS_update (plugin->env->stats,
- _ ("# HELLO beacons sent"),
- 1, GNUNET_NO);
- }
- }
- plugin->beacon_task =
- GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
- (HELLO_BEACON_SCALING_FACTOR,
- plugin->mac_count + 1),
- &send_hello_beacon,
- plugin);
-}
-
-
-/**
- * Function used for to process the data from the suid process
- *
- * @param cls the plugin handle
- * @param hdr header of the GNUNET_MessageHeader
- */
-static int
-handle_helper_message (void *cls,
- const struct GNUNET_MessageHeader *hdr)
-{
- struct Plugin *plugin = cls;
- struct GNUNET_HELLO_Address *my_address;
- const struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *rxinfo;
- const struct GNUNET_TRANSPORT_WLAN_HelperControlMessage *cm;
- struct WlanAddress wa;
- struct MacAndSession mas;
- uint16_t msize;
- struct FragmentMessage *fm;
- struct MacEndpoint *endpoint;
-
- msize = ntohs (hdr->size);
- switch (ntohs (hdr->type))
- {
- case GNUNET_MESSAGE_TYPE_WLAN_HELPER_CONTROL:
- if (msize != sizeof(struct GNUNET_TRANSPORT_WLAN_HelperControlMessage))
- {
- GNUNET_break (0);
- break;
- }
- cm = (const struct GNUNET_TRANSPORT_WLAN_HelperControlMessage *) hdr;
- if (GNUNET_YES == plugin->have_mac)
- {
- if (0 == memcmp (&plugin->mac_address,
- &cm->mac,
- sizeof(struct GNUNET_TRANSPORT_WLAN_MacAddress)))
- break; /* no change */
- /* remove old address */
- memset (&wa, 0, sizeof(struct WlanAddress));
- wa.mac = plugin->mac_address;
- wa.options = htonl (plugin->options);
- my_address = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
- PLUGIN_NAME,
- &wa, sizeof(wa),
-
GNUNET_HELLO_ADDRESS_INFO_NONE);
- plugin->env->notify_address (plugin->env->cls,
- GNUNET_NO,
- my_address);
- GNUNET_HELLO_address_free (my_address);
- plugin->mac_address = cm->mac;
- }
- else
- {
- plugin->mac_address = cm->mac;
- plugin->have_mac = GNUNET_YES;
- for (endpoint = plugin->mac_head; NULL != endpoint; endpoint =
- endpoint->next)
- {
- for (fm = endpoint->sending_messages_head; NULL != fm; fm = fm->next)
- {
- if (NULL != fm->fragcontext)
- {
- GNUNET_break (0); /* should not happen */
- continue;
- }
- fm->fragcontext =
- GNUNET_FRAGMENT_context_create (plugin->env->stats,
- WLAN_MTU,
- &plugin->tracker,
- fm->macendpoint->msg_delay,
- fm->macendpoint->ack_delay,
- fm->msg,
- &transmit_fragment, fm);
- GNUNET_free (fm->msg);
- fm->msg = NULL;
- }
- }
- GNUNET_break (NULL == plugin->beacon_task);
- plugin->beacon_task = GNUNET_SCHEDULER_add_now (&send_hello_beacon,
- plugin);
- }
-
- memset (&wa, 0, sizeof(struct WlanAddress));
- wa.mac = plugin->mac_address;
- wa.options = htonl (plugin->options);
- my_address = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
- PLUGIN_NAME,
- &wa, sizeof(wa),
-
GNUNET_HELLO_ADDRESS_INFO_NONE);
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received WLAN_HELPER_CONTROL message with MAC address `%s' for peer
`%s'\n",
- mac_to_string (&cm->mac),
- GNUNET_i2s (plugin->env->my_identity));
- plugin->env->notify_address (plugin->env->cls,
- GNUNET_YES,
- my_address);
- GNUNET_HELLO_address_free (my_address);
- break;
-
- case GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER:
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Got data message from helper with %u bytes\n",
- msize);
- GNUNET_STATISTICS_update (plugin->env->stats,
- _ ("# DATA messages received"), 1,
- GNUNET_NO);
- if (msize < sizeof(struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Size of packet is too small (%llu bytes < %llu)\n",
- (unsigned long long) msize,
- (unsigned long long) sizeof(struct
-
GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage));
- break;
- }
- rxinfo = (const struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *) hdr;
-
- /* check if message is actually for us */
- if (0 != memcmp (&rxinfo->frame.addr3, &mac_bssid_gnunet,
- sizeof(struct GNUNET_TRANSPORT_WLAN_MacAddress)))
- {
- /* Not the GNUnet BSSID */
- break;
- }
- if ((0 != memcmp (&rxinfo->frame.addr1, &bc_all_mac,
- sizeof(struct GNUNET_TRANSPORT_WLAN_MacAddress))) &&
- (0 != memcmp (&rxinfo->frame.addr1, &plugin->mac_address,
- sizeof(struct GNUNET_TRANSPORT_WLAN_MacAddress))))
- {
- /* Neither broadcast nor specifically for us */
- break;
- }
- if (0 == memcmp (&rxinfo->frame.addr2, &plugin->mac_address,
- sizeof(struct GNUNET_TRANSPORT_WLAN_MacAddress)))
- {
- /* packet is FROM us, thus not FOR us */
- break;
- }
-
- GNUNET_STATISTICS_update (plugin->env->stats,
- _ ("# DATA messages processed"),
- 1, GNUNET_NO);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Receiving %u bytes of data from MAC `%s'\n",
- (unsigned int) (msize - sizeof(struct
-
GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage)),
- mac_to_string (&rxinfo->frame.addr2));
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Receiving %u bytes of data to MAC `%s'\n",
- (unsigned int) (msize - sizeof(struct
-
GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage)),
- mac_to_string (&rxinfo->frame.addr1));
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Receiving %u bytes of data with BSSID MAC `%s'\n",
- (unsigned int) (msize - sizeof(struct
-
GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage)),
- mac_to_string (&rxinfo->frame.addr3));
- wa.mac = rxinfo->frame.addr2;
- wa.options = htonl (0);
- mas.endpoint = create_macendpoint (plugin, &wa);
- mas.session = NULL;
- (void) GNUNET_SERVER_mst_receive (plugin->helper_payload_tokenizer,
- &mas,
- (const char *) &rxinfo[1],
- msize - sizeof(struct
-
GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage),
- GNUNET_YES, GNUNET_NO);
- break;
-
- default:
- GNUNET_break (0);
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Unexpected message of type %u (%u bytes)",
- ntohs (hdr->type),
- ntohs (hdr->size));
- break;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Another peer has suggested an address for this
- * peer and transport plugin. Check that this could be a valid
- * address. If so, consider adding it to the list
- * of addresses.
- *
- * @param cls closure
- * @param addr pointer to the address
- * @param addrlen length of @a addr
- * @return #GNUNET_OK if this is a plausible address for this peer
- * and transport
- */
-static int
-wlan_plugin_address_suggested (void *cls,
- const void *addr,
- size_t addrlen)
-{
- struct Plugin *plugin = cls;
- struct WlanAddress *wa = (struct WlanAddress *) addr;
-
- if (addrlen != sizeof(struct WlanAddress))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- if (GNUNET_YES != plugin->have_mac)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Rejecting MAC `%s': I don't know my MAC!\n",
- mac_to_string (addr));
- return GNUNET_NO; /* don't know my MAC */
- }
- if (0 != memcmp (&wa->mac,
- &plugin->mac_address,
- sizeof(wa->mac)))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Rejecting MAC `%s': not my MAC!\n",
- mac_to_string (addr));
- return GNUNET_NO; /* not my MAC */
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Convert the transports address to a nice, human-readable format.
- *
- * @param cls closure
- * @param type name of the transport that generated the address
- * @param addr one of the addresses of the host, NULL for the last address
- * the specific address format depends on the transport
- * @param addrlen length of the address
- * @param numeric should (IP) addresses be displayed in numeric form?
- * @param timeout after how long should we give up?
- * @param asc function to call on each string
- * @param asc_cls closure for @a asc
- */
-static void
-wlan_plugin_address_pretty_printer (void *cls,
- const char *type,
- const void *addr,
- size_t addrlen,
- int numeric,
- struct GNUNET_TIME_Relative timeout,
- GNUNET_TRANSPORT_AddressStringCallback asc,
- void *asc_cls)
-{
- const char *ret;
-
- if (sizeof(struct WlanAddress) == addrlen)
- ret = wlan_plugin_address_to_string (NULL,
- addr,
- addrlen);
- else
- ret = NULL;
- asc (asc_cls,
- ret,
- (NULL == ret) ? GNUNET_SYSERR : GNUNET_OK);
- asc (asc_cls, NULL, GNUNET_OK);
-}
-
-
-/**
- * Exit point from the plugin.
- *
- * @param cls pointer to the api struct
- */
-void *
-LIBGNUNET_PLUGIN_TRANSPORT_DONE (void *cls)
-{
- struct WlanAddress wa;
- struct GNUNET_HELLO_Address *address;
- struct GNUNET_TRANSPORT_PluginFunctions *api = cls;
- struct Plugin *plugin = api->cls;
- struct MacEndpoint *endpoint;
- struct MacEndpoint *endpoint_next;
-
- if (NULL == plugin)
- {
- GNUNET_free (api);
- return NULL;
- }
- if (GNUNET_YES == plugin->have_mac)
- {
- memset (&wa, 0, sizeof(wa));
- wa.options = htonl (plugin->options);
- wa.mac = plugin->mac_address;
- address = GNUNET_HELLO_address_allocate (plugin->env->my_identity,
- PLUGIN_NAME,
- &wa, sizeof(struct WlanAddress),
- GNUNET_HELLO_ADDRESS_INFO_NONE);
-
- plugin->env->notify_address (plugin->env->cls,
- GNUNET_NO,
- address);
- plugin->have_mac = GNUNET_NO;
- GNUNET_HELLO_address_free (address);
- }
-
- if (NULL != plugin->beacon_task)
- {
- GNUNET_SCHEDULER_cancel (plugin->beacon_task);
- plugin->beacon_task = NULL;
- }
- if (NULL != plugin->suid_helper)
- {
- GNUNET_HELPER_stop (plugin->suid_helper,
- GNUNET_NO);
- plugin->suid_helper = NULL;
- }
- endpoint_next = plugin->mac_head;
- while (NULL != (endpoint = endpoint_next))
- {
- endpoint_next = endpoint->next;
- free_macendpoint (endpoint);
- }
- if (NULL != plugin->fragment_data_tokenizer)
- {
- GNUNET_SERVER_mst_destroy (plugin->fragment_data_tokenizer);
- plugin->fragment_data_tokenizer = NULL;
- }
- if (NULL != plugin->wlan_header_payload_tokenizer)
- {
- GNUNET_SERVER_mst_destroy (plugin->wlan_header_payload_tokenizer);
- plugin->wlan_header_payload_tokenizer = NULL;
- }
- if (NULL != plugin->helper_payload_tokenizer)
- {
- GNUNET_SERVER_mst_destroy (plugin->helper_payload_tokenizer);
- plugin->helper_payload_tokenizer = NULL;
- }
- GNUNET_free (plugin->wlan_interface);
- GNUNET_free (plugin);
- GNUNET_free (api);
- return NULL;
-}
-
-
-/**
- * Function called to convert a string address to
- * a binary address.
- *
- * @param cls closure (`struct Plugin *`)
- * @param addr string address
- * @param addrlen length of the address
- * @param buf location to store the buffer
- * @param added location to store the number of bytes in the buffer.
- * If the function returns #GNUNET_SYSERR, its contents are undefined.
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
- */
-static int
-wlan_plugin_string_to_address (void *cls,
- const char *addr,
- uint16_t addrlen,
- void **buf,
- size_t *added)
-{
- struct WlanAddress *wa;
- unsigned int a[6];
- unsigned int i;
- char plugin[5];
- uint32_t options;
-
- if ((NULL == addr) || (0 == addrlen))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if ('\0' != addr[addrlen - 1])
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if (strlen (addr) != addrlen - 1)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
-
- if (8 != sscanf (addr,
- "%4s.%u.%X:%X:%X:%X:%X:%X",
- plugin, &options,
- &a[0], &a[1], &a[2],
- &a[3], &a[4], &a[5]))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- wa = GNUNET_new (struct WlanAddress);
- for (i = 0; i < 6; i++)
- wa->mac.mac[i] = a[i];
- wa->options = htonl (0);
- *buf = wa;
- *added = sizeof(struct WlanAddress);
- return GNUNET_OK;
-}
-
-
-/**
- * Begin monitoring sessions of a plugin. There can only
- * be one active monitor per plugin (i.e. if there are
- * multiple monitors, the transport service needs to
- * multiplex the generated events over all of them).
- *
- * @param cls closure of the plugin
- * @param sic callback to invoke, NULL to disable monitor;
- * plugin will being by iterating over all active
- * sessions immediately and then enter monitor mode
- * @param sic_cls closure for @a sic
- */
-static void
-wlan_plugin_setup_monitor (void *cls,
- GNUNET_TRANSPORT_SessionInfoCallback sic,
- void *sic_cls)
-{
- struct Plugin *plugin = cls;
- struct MacEndpoint *mac;
- struct GNUNET_ATS_Session *session;
-
- plugin->sic = sic;
- plugin->sic_cls = sic_cls;
- if (NULL != sic)
- {
- for (mac = plugin->mac_head; NULL != mac; mac = mac->next)
- for (session = mac->sessions_head; NULL != session; session =
- session->next)
- {
- notify_session_monitor (plugin,
- session,
- GNUNET_TRANSPORT_SS_INIT);
- notify_session_monitor (plugin,
- session,
- GNUNET_TRANSPORT_SS_UP);
- }
- sic (sic_cls, NULL, NULL);
- }
-}
-
-
-/**
- * Function that will be called whenever the transport service wants to
- * notify the plugin that a session is still active and in use and
- * therefore the session timeout for this session has to be updated
- *
- * @param cls closure
- * @param peer which peer was the session for
- * @param session which session is being updated
- */
-static void
-wlan_plugin_update_session_timeout (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- struct GNUNET_ATS_Session *session)
-{
- GNUNET_assert (NULL != session->timeout_task);
- session->timeout = GNUNET_TIME_relative_to_absolute (
- GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
-}
-
-
-/**
- * Function that will be called whenever the transport service wants to
- * notify the plugin that the inbound quota changed and that the plugin
- * should update it's delay for the next receive value
- *
- * @param cls closure
- * @param peer which peer was the session for
- * @param session which session is being updated
- * @param delay new delay to use for receiving
- */
-static void
-wlan_plugin_update_inbound_delay (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- struct GNUNET_ATS_Session *session,
- struct GNUNET_TIME_Relative delay)
-{
- /* does nothing, as inbound delay is not supported by WLAN */
-}
-
-
-/**
- * Entry point for the plugin.
- *
- * @param cls closure, the `struct GNUNET_TRANSPORT_PluginEnvironment *`
- * @return the `struct GNUNET_TRANSPORT_PluginFunctions *` or NULL on error
- */
-void *
-LIBGNUNET_PLUGIN_TRANSPORT_INIT (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginEnvironment *env = cls;
- struct GNUNET_TRANSPORT_PluginFunctions *api;
- struct Plugin *plugin;
- char *wlan_interface;
- unsigned long long testmode;
- char *binary;
-
- /* check for 'special' mode */
- if (NULL == env->receive)
- {
- /* run in 'stub' mode (i.e. as part of gnunet-peerinfo), don't fully
- initialize the plugin or the API */
- api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
- api->cls = NULL;
- api->address_pretty_printer = &wlan_plugin_address_pretty_printer;
- api->address_to_string = &wlan_plugin_address_to_string;
- api->string_to_address = &wlan_plugin_string_to_address;
- return api;
- }
-
- testmode = 0;
- /* check configuration */
- if ((GNUNET_YES ==
- GNUNET_CONFIGURATION_have_value (env->cfg,
- CONFIG_NAME,
- "TESTMODE")) &&
- ((GNUNET_SYSERR ==
- GNUNET_CONFIGURATION_get_value_number (env->cfg,
- CONFIG_NAME,
- "TESTMODE",
- &testmode)) ||
- (testmode > 2)))
- {
- GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
- CONFIG_NAME,
- "TESTMODE");
- return NULL;
- }
- binary = GNUNET_OS_get_libexec_binary_path (HELPER_NAME);
- if ((0 == testmode) &&
- (GNUNET_YES !=
- GNUNET_OS_check_helper_binary (binary,
- GNUNET_YES,
- NULL)))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Helper binary `%s' not SUID, cannot run WLAN transport\n"),
- HELPER_NAME);
- GNUNET_free (binary);
- return NULL;
- }
- GNUNET_free (binary);
- if (GNUNET_YES !=
- GNUNET_CONFIGURATION_get_value_string (env->cfg,
- CONFIG_NAME,
- "INTERFACE",
- &wlan_interface))
- {
- GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
- CONFIG_NAME,
- "INTERFACE");
- return NULL;
- }
-
- plugin = GNUNET_new (struct Plugin);
- plugin->wlan_interface = wlan_interface;
- plugin->env = env;
- GNUNET_STATISTICS_set (plugin->env->stats,
- _ ("# sessions allocated"),
- 0, GNUNET_NO);
- GNUNET_STATISTICS_set (plugin->env->stats,
- _ ("# MAC endpoints allocated"),
- 0, 0);
- GNUNET_BANDWIDTH_tracker_init (&plugin->tracker, NULL, NULL,
- GNUNET_BANDWIDTH_value_init (100 * 1024
- * 1024 / 8),
- 100);
- plugin->fragment_data_tokenizer = GNUNET_SERVER_mst_create (&process_data,
- plugin);
- plugin->wlan_header_payload_tokenizer = GNUNET_SERVER_mst_create (
- &process_data,
- plugin);
- plugin->helper_payload_tokenizer = GNUNET_SERVER_mst_create (&process_data,
- plugin);
-
- plugin->options = 0;
-
- /* some compilers do not like switch on 'long long'... */
- switch ((unsigned int) testmode)
- {
- case 0: /* normal */
- plugin->helper_argv[0] = (char *) HELPER_NAME;
- plugin->helper_argv[1] = wlan_interface;
- plugin->helper_argv[2] = NULL;
- plugin->suid_helper = GNUNET_HELPER_start (GNUNET_NO,
- HELPER_NAME,
- plugin->helper_argv,
- &handle_helper_message,
- NULL,
- plugin);
- break;
-
- case 1: /* testmode, peer 1 */
- plugin->helper_argv[0] = (char *) DUMMY_HELPER_NAME;
- plugin->helper_argv[1] = (char *) "1";
- plugin->helper_argv[2] = NULL;
- plugin->suid_helper = GNUNET_HELPER_start (GNUNET_NO,
- DUMMY_HELPER_NAME,
- plugin->helper_argv,
- &handle_helper_message,
- NULL,
- plugin);
- break;
-
- case 2: /* testmode, peer 2 */
- plugin->helper_argv[0] = (char *) DUMMY_HELPER_NAME;
- plugin->helper_argv[1] = (char *) "2";
- plugin->helper_argv[2] = NULL;
- plugin->suid_helper = GNUNET_HELPER_start (GNUNET_NO,
- DUMMY_HELPER_NAME,
- plugin->helper_argv,
- &handle_helper_message,
- NULL,
- plugin);
- break;
-
- default:
- GNUNET_assert (0);
- }
-
- api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
- api->cls = plugin;
- api->send = &wlan_plugin_send;
- api->get_session = &wlan_plugin_get_session;
- api->disconnect_peer = &wlan_plugin_disconnect_peer;
- api->disconnect_session = &wlan_plugin_disconnect_session;
- api->query_keepalive_factor = &wlan_plugin_query_keepalive_factor;
- api->address_pretty_printer = &wlan_plugin_address_pretty_printer;
- api->check_address = &wlan_plugin_address_suggested;
- api->address_to_string = &wlan_plugin_address_to_string;
- api->string_to_address = &wlan_plugin_string_to_address;
- api->get_network = &wlan_plugin_get_network;
- api->get_network_for_address = &wlan_plugin_get_network_for_address;
- api->update_session_timeout = &wlan_plugin_update_session_timeout;
- api->update_inbound_delay = &wlan_plugin_update_inbound_delay;
- api->setup_monitor = &wlan_plugin_setup_monitor;
- return api;
-}
-
-
-/* end of plugin_transport_wlan.c */
diff --git a/src/transport/plugin_transport_wlan.h
b/src/transport/plugin_transport_wlan.h
deleted file mode 100644
index 6cb11f648..000000000
--- a/src/transport/plugin_transport_wlan.h
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- This file is part of GNUnet
- Copyright (C) 2010, 2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/plugin_transport_wlan.h
- * @brief header for transport plugin and the helper for wlan
- * @author David Brodski
- */
-#ifndef PLUGIN_TRANSPORT_WLAN
-#define PLUGIN_TRANSPORT_WLAN
-
-#include "gnunet_util_lib.h"
-#include "gnunet_common.h"
-
-/**
- * Number fo bytes in a mac address.
- */
-#define MAC_ADDR_SIZE 6
-
-/**
- * Value for "Management" in the 'frame_control' field of the
- * struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame.
- */
-#define IEEE80211_FC0_TYPE_MGT 0x00
-
-/**
- * Value for "Control" in the 'frame_control' field of the
- * struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame.
- */
-#define IEEE80211_FC0_TYPE_CTL 0x04
-
-/**
- * Value for DATA in the 'frame_control' field of the
- * struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame.
- */
-#define IEEE80211_FC0_TYPE_DATA 0x08
-
-
-GNUNET_NETWORK_STRUCT_BEGIN
-
-/**
- * A MAC Address.
- */
-struct GNUNET_TRANSPORT_WLAN_MacAddress
-{
- uint8_t mac[MAC_ADDR_SIZE];
-};
-
-/**
- * Format of a WLAN Control Message.
- */
-struct GNUNET_TRANSPORT_WLAN_HelperControlMessage
-{
- /**
- * Message header. Type is
- * GNUNET_MESSAGE_TYPE_WLAN_HELPER_CONTROL
- */
- struct GNUNET_MessageHeader hdr;
-
- /**
- * MAC Address of the local WLAN interface.
- */
- struct GNUNET_TRANSPORT_WLAN_MacAddress mac;
-};
-
-/**
- * generic definitions for IEEE 802.3 frames
- */
-struct GNUNET_TRANSPORT_WLAN_Ieee8023Frame
-{
- /**
- * Address 1: destination address in ad-hoc mode or AP, BSSID if station,
- */
- struct GNUNET_TRANSPORT_WLAN_MacAddress dst;
-
- /**
- * Address 2: source address if in ad-hoc-mode or station, BSSID if AP
- */
- struct GNUNET_TRANSPORT_WLAN_MacAddress src;
-
- /**
- * Packet type ID.
- */
- uint16_t type;
-};
-
-
-/**
- * generic definitions for IEEE 802.11 frames
- */
-struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame
-{
- /**
- * 802.11 Frame Control field. A bitmask. The overall field is a
- * 16-bit mask of the respective fields. The lowest two bits should
- * be 0, then comes the "type" (2 bits, see IEEE80211_FC0_TYPE_*
- * constants), followed by 4-bit subtype (all zeros for ad-hoc),
- * followed by various flags (to DS, from DS, more frag, retry,
- * power management, more data, WEP, strict), all of which we also
- * keep at zero.
- */
- uint16_t frame_control GNUNET_PACKED;
-
- /**
- * Microseconds to reserve link (duration), 0 by default
- */
- uint16_t duration GNUNET_PACKED;
-
- /**
- * Address 1: destination address in ad-hoc mode or AP, BSSID if station,
- */
- struct GNUNET_TRANSPORT_WLAN_MacAddress addr1;
-
- /**
- * Address 2: source address if in ad-hoc-mode or station, BSSID if AP
- */
- struct GNUNET_TRANSPORT_WLAN_MacAddress addr2;
-
- /**
- * Address 3: BSSID in ad-hoc mode, Destination if station, source if AP
- */
- struct GNUNET_TRANSPORT_WLAN_MacAddress addr3;
-
- /**
- * 802.11 sequence control field; contains fragment number an sequence
- * number (we set this to all zeros).
- */
- uint16_t sequence_control GNUNET_PACKED;
-
- /**
- * Link layer control (LLC). Set to a GNUnet-specific value.
- */
- u_int8_t llc[4];
-
- /* payload */
-} GNUNET_PACKED;
-
-
-/**
- * Message from the plugin to the WLAN helper: send the given message with the
- * given connection parameters.
- */
-struct GNUNET_TRANSPORT_WLAN_RadiotapSendMessage
-{
- /**
- * Type is 'GNUNET_MESSAGE_TYPE_WLAN_DATA_TO_HELPER'.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * wlan send rate
- */
- uint8_t rate;
-
- /**
- * Antenna; the first antenna is 0.
- */
- uint8_t antenna;
-
- /**
- * Transmit power expressed as unitless distance from max power set at
factory calibration.
- * 0 is max power. Monotonically nondecreasing with lower power levels.
- */
- uint16_t tx_power GNUNET_PACKED;
-
- /**
- * IEEE Frame to transmit (the sender MAC address will be overwritten by the
helper as it does not
- * trust the plugin to set it correctly).
- */
- struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame frame;
-
- /* actual payload follows */
-};
-
-
-/**
- * Message from the WLAN helper to the plugin: we have received the given
message with the
- * given performance characteristics.
- */
-/**
- * struct to represent infos gathered form the radiotap fields, see
RadiotapHeader for more Infos
- */
-struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage
-{
- /**
- * Type is 'GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER'.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Information about which of the fields below are actually valid.
- * 0 for none. FIXME: not properly initialized so far (always zero).
- */
- uint32_t ri_present GNUNET_PACKED;
-
- /**
- * IEEE80211_RADIOTAP_TSFT, 0 if unknown.
- */
- uint64_t ri_mactime GNUNET_PACKED;
-
- /**
- * from radiotap
- * either IEEE80211_RADIOTAP_DBM_ANTSIGNAL
- * or IEEE80211_RADIOTAP_DB_ANTSIGNAL, 0 if unknown.
- */
- int32_t ri_power GNUNET_PACKED;
-
- /**
- * either IEEE80211_RADIOTAP_DBM_ANTNOISE
- * or IEEE80211_RADIOTAP_DB_ANTNOISE, 0 if unknown.
- */
- int32_t ri_noise GNUNET_PACKED;
-
- /**
- * IEEE80211_RADIOTAP_CHANNEL, 0 if unknown.
- */
- uint32_t ri_channel GNUNET_PACKED;
-
- /**
- * Frequency we use. 0 if unknown.
- */
- uint32_t ri_freq GNUNET_PACKED;
-
- /**
- * IEEE80211_RADIOTAP_RATE * 50000, 0 if unknown.
- */
- uint32_t ri_rate GNUNET_PACKED;
-
- /**
- * IEEE80211_RADIOTAP_ANTENNA, 0 if unknown.
- */
- uint32_t ri_antenna GNUNET_PACKED;
-
- /**
- * IEEE Frame.
- */
- struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame frame;
-
- /* followed by payload */
-};
-
-GNUNET_NETWORK_STRUCT_END
-
-/**
- * GNUnet bssid
- */
-static const struct GNUNET_TRANSPORT_WLAN_MacAddress mac_bssid_gnunet = {
- { 0x13, 0x22, 0x33, 0x44, 0x55, 0x66 }
-};
-
-
-/**
- * Broadcast MAC
- */
-static const struct GNUNET_TRANSPORT_WLAN_MacAddress bc_all_mac = {
- { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }
-};
-
-#endif
diff --git a/src/transport/tcp_connection_legacy.c
b/src/transport/tcp_connection_legacy.c
deleted file mode 100644
index 551e79055..000000000
--- a/src/transport/tcp_connection_legacy.c
+++ /dev/null
@@ -1,1597 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009-2013 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file util/connection.c
- * @brief TCP connection management
- * @author Christian Grothoff
- *
- * This code is rather complex. Only modify it if you
- * 1) Have a NEW testcase showing that the new code
- * is needed and correct
- * 2) All EXISTING testcases pass with the new code
- * These rules should apply in general, but for this
- * module they are VERY, VERY important.
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_resolver_service.h"
-
-
-/**
- * Timeout we use on TCP connect before trying another
- * result from the DNS resolver. Actual value used
- * is this value divided by the number of address families.
- * Default is 5s.
- */
-#define CONNECT_RETRY_TIMEOUT \
- GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
-
-
-#define LOG_STRERROR(kind, syscall) \
- GNUNET_log_from_strerror (kind, "util-connection", syscall)
-
-
-/**
- * Transmission handle. There can only be one for each connection.
- */
-struct GNUNET_CONNECTION_TransmitHandle
-{
- /**
- * Function to call if the send buffer has notify_size
- * bytes available.
- */
- GNUNET_CONNECTION_TransmitReadyNotify notify_ready;
-
- /**
- * Closure for notify_ready.
- */
- void *notify_ready_cls;
-
- /**
- * Our connection handle.
- */
- struct GNUNET_CONNECTION_Handle *connection;
-
- /**
- * Timeout for receiving (in absolute time).
- */
- struct GNUNET_TIME_Absolute transmit_timeout;
-
- /**
- * Task called on timeout.
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * At what number of bytes available in the
- * write buffer should the notify method be called?
- */
- size_t notify_size;
-};
-
-
-/**
- * During connect, we try multiple possible IP addresses
- * to find out which one might work.
- */
-struct AddressProbe
-{
- /**
- * This is a linked list.
- */
- struct AddressProbe *next;
-
- /**
- * This is a doubly-linked list.
- */
- struct AddressProbe *prev;
-
- /**
- * The address; do not free (allocated at the end of this struct).
- */
- const struct sockaddr *addr;
-
- /**
- * Underlying OS's socket.
- */
- struct GNUNET_NETWORK_Handle *sock;
-
- /**
- * Connection for which we are probing.
- */
- struct GNUNET_CONNECTION_Handle *connection;
-
- /**
- * Length of addr.
- */
- socklen_t addrlen;
-
- /**
- * Task waiting for the connection to finish connecting.
- */
- struct GNUNET_SCHEDULER_Task *task;
-};
-
-
-/**
- * @brief handle for a network connection
- */
-struct GNUNET_CONNECTION_Handle
-{
- /**
- * Configuration to use.
- */
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * Linked list of sockets we are currently trying out
- * (during connect).
- */
- struct AddressProbe *ap_head;
-
- /**
- * Linked list of sockets we are currently trying out
- * (during connect).
- */
- struct AddressProbe *ap_tail;
-
- /**
- * Network address of the other end-point, may be NULL.
- */
- struct sockaddr *addr;
-
- /**
- * Pointer to the hostname if connection was
- * created using DNS lookup, otherwise NULL.
- */
- char *hostname;
-
- /**
- * Underlying OS's socket, set to NULL after fatal errors.
- */
- struct GNUNET_NETWORK_Handle *sock;
-
- /**
- * Function to call on data received, NULL if no receive is pending.
- */
- GNUNET_CONNECTION_Receiver receiver;
-
- /**
- * Closure for @e receiver.
- */
- void *receiver_cls;
-
- /**
- * Pointer to our write buffer.
- */
- char *write_buffer;
-
- /**
- * Current size of our @e write_buffer.
- */
- size_t write_buffer_size;
-
- /**
- * Current write-offset in @e write_buffer (where
- * would we write next).
- */
- size_t write_buffer_off;
-
- /**
- * Current read-offset in @e write_buffer (how many
- * bytes have already been sent).
- */
- size_t write_buffer_pos;
-
- /**
- * Length of @e addr.
- */
- socklen_t addrlen;
-
- /**
- * Read task that we may need to wait for.
- */
- struct GNUNET_SCHEDULER_Task *read_task;
-
- /**
- * Write task that we may need to wait for.
- */
- struct GNUNET_SCHEDULER_Task *write_task;
-
- /**
- * Handle to a pending DNS lookup request.
- */
- struct GNUNET_RESOLVER_RequestHandle *dns_active;
-
- /**
- * The handle we return for #GNUNET_CONNECTION_notify_transmit_ready().
- */
- struct GNUNET_CONNECTION_TransmitHandle nth;
-
- /**
- * Timeout for receiving (in absolute time).
- */
- struct GNUNET_TIME_Absolute receive_timeout;
-
- /**
- * Maximum number of bytes to read (for receiving).
- */
- size_t max;
-
- /**
- * Port to connect to.
- */
- uint16_t port;
-
- /**
- * When shutdown, do not ever actually close the socket, but
- * free resources. Only should ever be set if using program
- * termination as a signal (because only then will the leaked
- * socket be freed!)
- */
- int8_t persist;
-
- /**
- * Usually 0. Set to 1 if this handle is in use, and should
- * #GNUNET_CONNECTION_destroy() be called right now, the action needs
- * to be deferred by setting it to -1.
- */
- int8_t destroy_later;
-
- /**
- * Handle to subsequent connection after proxy handshake completes,
- */
- struct GNUNET_CONNECTION_Handle *proxy_handshake;
-};
-
-
-/**
- * Set the persist option on this connection handle. Indicates
- * that the underlying socket or fd should never really be closed.
- * Used for indicating process death.
- *
- * @param connection the connection to set persistent
- */
-void
-GNUNET_CONNECTION_persist_ (struct GNUNET_CONNECTION_Handle *connection)
-{
- connection->persist = GNUNET_YES;
-}
-
-
-/**
- * Disable the "CORK" feature for communication with the given connection,
- * forcing the OS to immediately flush the buffer on transmission
- * instead of potentially buffering multiple messages. Essentially
- * reduces the OS send buffers to zero.
- * Used to make sure that the last messages sent through the connection
- * reach the other side before the process is terminated.
- *
- * @param connection the connection to make flushing and blocking
- * @return #GNUNET_OK on success
- */
-int
-GNUNET_CONNECTION_disable_corking (struct GNUNET_CONNECTION_Handle *connection)
-{
- return GNUNET_NETWORK_socket_disable_corking (connection->sock);
-}
-
-
-/**
- * Create a connection handle by boxing an existing OS socket. The OS
- * socket should henceforth be no longer used directly.
- * #GNUNET_connection_destroy() will close it.
- *
- * @param osSocket existing socket to box
- * @return the boxed connection handle
- */
-struct GNUNET_CONNECTION_Handle *
-GNUNET_CONNECTION_create_from_existing (struct GNUNET_NETWORK_Handle *osSocket)
-{
- struct GNUNET_CONNECTION_Handle *connection;
-
- connection = GNUNET_new (struct GNUNET_CONNECTION_Handle);
- connection->write_buffer_size = GNUNET_MIN_MESSAGE_SIZE;
- connection->write_buffer = GNUNET_malloc (connection->write_buffer_size);
- connection->sock = osSocket;
- return connection;
-}
-
-
-/**
- * Create a connection handle by accepting on a listen socket. This
- * function may block if the listen socket has no connection ready.
- *
- * @param access_cb function to use to check if access is allowed
- * @param access_cb_cls closure for @a access_cb
- * @param lsock listen socket
- * @return the connection handle, NULL on error
- */
-struct GNUNET_CONNECTION_Handle *
-GNUNET_CONNECTION_create_from_accept (GNUNET_CONNECTION_AccessCheck access_cb,
- void *access_cb_cls,
- struct GNUNET_NETWORK_Handle *lsock)
-{
- struct GNUNET_CONNECTION_Handle *connection;
- char addr[128];
- socklen_t addrlen;
- struct GNUNET_NETWORK_Handle *sock;
- int aret;
- struct sockaddr_in *v4;
- struct sockaddr_in6 *v6;
- struct sockaddr *sa;
- void *uaddr;
-
-#ifdef SO_PEERCRED
- struct ucred uc;
- socklen_t olen;
-#endif
- struct GNUNET_CONNECTION_Credentials *gcp;
-#if HAVE_GETPEEREID || defined(SO_PEERCRED) || HAVE_GETPEERUCRED
- struct GNUNET_CONNECTION_Credentials gc;
-
- gc.uid = 0;
- gc.gid = 0;
-#endif
-
- addrlen = sizeof(addr);
- sock =
- GNUNET_NETWORK_socket_accept (lsock, (struct sockaddr *) &addr, &addrlen);
- if (NULL == sock)
- {
- if (EAGAIN != errno)
- LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "accept");
- return NULL;
- }
- if ((addrlen > sizeof(addr)) || (addrlen < sizeof(sa_family_t)))
- {
- GNUNET_break (0);
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (sock));
- return NULL;
- }
-
- sa = (struct sockaddr *) addr;
- v6 = (struct sockaddr_in6 *) addr;
- if ((AF_INET6 == sa->sa_family) && (IN6_IS_ADDR_V4MAPPED (&v6->sin6_addr)))
- {
- /* convert to V4 address */
- v4 = GNUNET_new (struct sockaddr_in);
- memset (v4, 0, sizeof(struct sockaddr_in));
- v4->sin_family = AF_INET;
-#if HAVE_SOCKADDR_IN_SIN_LEN
- v4->sin_len = (u_char) sizeof(struct sockaddr_in);
-#endif
- GNUNET_memcpy (&v4->sin_addr,
- &((char *) &v6->sin6_addr)[sizeof(struct in6_addr)
- - sizeof(struct in_addr)],
- sizeof(struct in_addr));
- v4->sin_port = v6->sin6_port;
- uaddr = v4;
- addrlen = sizeof(struct sockaddr_in);
- }
- else
- {
- uaddr = GNUNET_malloc (addrlen);
- GNUNET_memcpy (uaddr, addr, addrlen);
- }
- gcp = NULL;
- if (AF_UNIX == sa->sa_family)
- {
-#if HAVE_GETPEEREID
- /* most BSDs */
- if (0 == getpeereid (GNUNET_NETWORK_get_fd (sock), &gc.uid, &gc.gid))
- gcp = &gc;
-#else
-#ifdef SO_PEERCRED
- /* largely traditional GNU/Linux */
- olen = sizeof(uc);
- if ((0 == getsockopt (GNUNET_NETWORK_get_fd (sock),
- SOL_SOCKET,
- SO_PEERCRED,
- &uc,
- &olen)) &&
- (olen == sizeof(uc)))
- {
- gc.uid = uc.uid;
- gc.gid = uc.gid;
- gcp = &gc;
- }
-#else
-#if HAVE_GETPEERUCRED
- /* this is for Solaris 10 */
- ucred_t *uc;
-
- uc = NULL;
- if (0 == getpeerucred (GNUNET_NETWORK_get_fd (sock), &uc))
- {
- gc.uid = ucred_geteuid (uc);
- gc.gid = ucred_getegid (uc);
- gcp = &gc;
- }
- ucred_free (uc);
-#endif
-#endif
-#endif
- }
-
- if ((NULL != access_cb) &&
- (GNUNET_YES != (aret = access_cb (access_cb_cls, gcp, uaddr, addrlen))))
- {
- if (GNUNET_NO == aret)
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ ("Access denied to `%s'\n"),
- GNUNET_a2s (uaddr, addrlen));
- GNUNET_break (GNUNET_OK ==
- GNUNET_NETWORK_socket_shutdown (sock, SHUT_RDWR));
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (sock));
- GNUNET_free (uaddr);
- return NULL;
- }
- connection = GNUNET_new (struct GNUNET_CONNECTION_Handle);
- connection->write_buffer_size = GNUNET_MIN_MESSAGE_SIZE;
- connection->write_buffer = GNUNET_malloc (connection->write_buffer_size);
- connection->addr = uaddr;
- connection->addrlen = addrlen;
- connection->sock = sock;
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ ("Accepting connection from `%s': %p\n"),
- GNUNET_a2s (uaddr, addrlen),
- connection);
- return connection;
-}
-
-
-/**
- * Obtain the network address of the other party.
- *
- * @param connection the client to get the address for
- * @param addr where to store the address
- * @param addrlen where to store the length of the @a addr
- * @return #GNUNET_OK on success
- */
-int
-GNUNET_CONNECTION_get_address (struct GNUNET_CONNECTION_Handle *connection,
- void **addr,
- size_t *addrlen)
-{
- if ((NULL == connection->addr) || (0 == connection->addrlen))
- return GNUNET_NO;
- *addr = GNUNET_malloc (connection->addrlen);
- GNUNET_memcpy (*addr, connection->addr, connection->addrlen);
- *addrlen = connection->addrlen;
- return GNUNET_OK;
-}
-
-
-/**
- * Tell the receiver callback that we had an IO error.
- *
- * @param connection connection to signal error
- * @param errcode error code to send
- */
-static void
-signal_receive_error (struct GNUNET_CONNECTION_Handle *connection, int errcode)
-{
- GNUNET_CONNECTION_Receiver receiver;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Receive encounters error (%s), connection closed (%p)\n",
- strerror (errcode),
- connection);
- GNUNET_assert (NULL != (receiver = connection->receiver));
- connection->receiver = NULL;
- receiver (connection->receiver_cls,
- NULL,
- 0,
- connection->addr,
- connection->addrlen,
- errcode);
-}
-
-
-/**
- * Tell the receiver callback that a timeout was reached.
- *
- * @param connection connection to signal for
- */
-static void
-signal_receive_timeout (struct GNUNET_CONNECTION_Handle *connection)
-{
- GNUNET_CONNECTION_Receiver receiver;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Connection signals timeout to receiver (%p)!\n",
- connection);
- GNUNET_assert (NULL != (receiver = connection->receiver));
- connection->receiver = NULL;
- receiver (connection->receiver_cls, NULL, 0, NULL, 0, 0);
-}
-
-
-/**
- * We failed to transmit data to the service, signal the error.
- *
- * @param connection handle that had trouble
- * @param ecode error code (errno)
- */
-static void
-signal_transmit_error (struct GNUNET_CONNECTION_Handle *connection, int ecode)
-{
- GNUNET_CONNECTION_TransmitReadyNotify notify;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Transmission encountered error (%s), connection closed (%p)\n",
- strerror (ecode),
- connection);
- if (NULL != connection->sock)
- {
- (void) GNUNET_NETWORK_socket_shutdown (connection->sock, SHUT_RDWR);
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (connection->sock));
- connection->sock = NULL;
- GNUNET_assert (NULL == connection->write_task);
- }
- if (NULL != connection->read_task)
- {
- /* send errors trigger read errors... */
- GNUNET_SCHEDULER_cancel (connection->read_task);
- connection->read_task = NULL;
- signal_receive_timeout (connection);
- return;
- }
- if (NULL == connection->nth.notify_ready)
- return; /* nobody to tell about it */
- notify = connection->nth.notify_ready;
- connection->nth.notify_ready = NULL;
- notify (connection->nth.notify_ready_cls, 0, NULL);
-}
-
-
-/**
- * We've failed for good to establish a connection (timeout or
- * no more addresses to try).
- *
- * @param connection the connection we tried to establish
- */
-static void
-connect_fail_continuation (struct GNUNET_CONNECTION_Handle *connection)
-{
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Failed to establish TCP connection to `%s:%u', no further addresses to
try.\n",
- connection->hostname,
- connection->port);
- GNUNET_break (NULL == connection->ap_head);
- GNUNET_break (NULL == connection->ap_tail);
- GNUNET_break (GNUNET_NO == connection->dns_active);
- GNUNET_break (NULL == connection->sock);
- GNUNET_assert (NULL == connection->write_task);
- GNUNET_assert (NULL == connection->proxy_handshake);
-
- /* signal errors for jobs that used to wait on the connection */
- connection->destroy_later = 1;
- if (NULL != connection->receiver)
- signal_receive_error (connection, ECONNREFUSED);
- if (NULL != connection->nth.notify_ready)
- {
- GNUNET_assert (NULL != connection->nth.timeout_task);
- GNUNET_SCHEDULER_cancel (connection->nth.timeout_task);
- connection->nth.timeout_task = NULL;
- signal_transmit_error (connection, ECONNREFUSED);
- }
- if (-1 == connection->destroy_later)
- {
- /* do it now */
- connection->destroy_later = 0;
- GNUNET_CONNECTION_destroy (connection);
- return;
- }
- connection->destroy_later = 0;
-}
-
-
-/**
- * We are ready to transmit (or got a timeout).
- *
- * @param cls our connection handle
- */
-static void
-transmit_ready (void *cls);
-
-
-/**
- * This function is called once we either timeout or have data ready
- * to read.
- *
- * @param cls connection to read from
- */
-static void
-receive_ready (void *cls);
-
-
-/**
- * We've succeeded in establishing a connection.
- *
- * @param connection the connection we tried to establish
- */
-static void
-connect_success_continuation (struct GNUNET_CONNECTION_Handle *connection)
-{
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Connection to `%s' succeeded! (%p)\n",
- GNUNET_a2s (connection->addr, connection->addrlen),
- connection);
- /* trigger jobs that waited for the connection */
- if (NULL != connection->receiver)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Connection succeeded, starting with receiving data (%p)\n",
- connection);
- GNUNET_assert (NULL == connection->read_task);
- connection->read_task =
- GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_absolute_get_remaining (
- connection->receive_timeout),
- connection->sock,
- &receive_ready,
- connection);
- }
- if (NULL != connection->nth.notify_ready)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Connection succeeded, starting with sending data (%p)\n",
- connection);
- GNUNET_assert (connection->nth.timeout_task != NULL);
- GNUNET_SCHEDULER_cancel (connection->nth.timeout_task);
- connection->nth.timeout_task = NULL;
- GNUNET_assert (connection->write_task == NULL);
- connection->write_task =
- GNUNET_SCHEDULER_add_write_net (GNUNET_TIME_absolute_get_remaining (
- connection->nth.transmit_timeout),
- connection->sock,
- &transmit_ready,
- connection);
- }
-}
-
-
-/**
- * Scheduler let us know that we're either ready to write on the
- * socket OR connect timed out. Do the right thing.
- *
- * @param cls the `struct AddressProbe *` with the address that we are probing
- */
-static void
-connect_probe_continuation (void *cls)
-{
- struct AddressProbe *ap = cls;
- struct GNUNET_CONNECTION_Handle *connection = ap->connection;
- const struct GNUNET_SCHEDULER_TaskContext *tc;
- struct AddressProbe *pos;
- int error;
- socklen_t len;
-
- GNUNET_assert (NULL != ap->sock);
- GNUNET_CONTAINER_DLL_remove (connection->ap_head, connection->ap_tail, ap);
- len = sizeof(error);
- errno = 0;
- error = 0;
- tc = GNUNET_SCHEDULER_get_task_context ();
- if ((0 == (tc->reason & GNUNET_SCHEDULER_REASON_WRITE_READY)) ||
- (GNUNET_OK != GNUNET_NETWORK_socket_getsockopt (ap->sock,
- SOL_SOCKET,
- SO_ERROR,
- &error,
- &len)) ||
- (0 != error))
- {
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (ap->sock));
- GNUNET_free (ap);
- if ((NULL == connection->ap_head) &&
- (GNUNET_NO == connection->dns_active) &&
- (NULL == connection->proxy_handshake))
- connect_fail_continuation (connection);
- return;
- }
- GNUNET_assert (NULL == connection->sock);
- connection->sock = ap->sock;
- GNUNET_assert (NULL == connection->addr);
- connection->addr = GNUNET_malloc (ap->addrlen);
- GNUNET_memcpy (connection->addr, ap->addr, ap->addrlen);
- connection->addrlen = ap->addrlen;
- GNUNET_free (ap);
- /* cancel all other attempts */
- while (NULL != (pos = connection->ap_head))
- {
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (pos->sock));
- GNUNET_SCHEDULER_cancel (pos->task);
- GNUNET_CONTAINER_DLL_remove (connection->ap_head, connection->ap_tail,
pos);
- GNUNET_free (pos);
- }
- connect_success_continuation (connection);
-}
-
-
-/**
- * Try to establish a connection given the specified address.
- * This function is called by the resolver once we have a DNS reply.
- *
- * @param cls our `struct GNUNET_CONNECTION_Handle *`
- * @param addr address to try, NULL for "last call"
- * @param addrlen length of @a addr
- */
-static void
-try_connect_using_address (void *cls,
- const struct sockaddr *addr,
- socklen_t addrlen)
-{
- struct GNUNET_CONNECTION_Handle *connection = cls;
- struct AddressProbe *ap;
- struct GNUNET_TIME_Relative delay;
-
- if (NULL == addr)
- {
- connection->dns_active = NULL;
- if ((NULL == connection->ap_head) && (NULL == connection->sock) &&
- (NULL == connection->proxy_handshake))
- connect_fail_continuation (connection);
- return;
- }
- if (NULL != connection->sock)
- return; /* already connected */
- GNUNET_assert (NULL == connection->addr);
- /* try to connect */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Trying to connect using address `%s:%u/%s:%u'\n",
- connection->hostname,
- connection->port,
- GNUNET_a2s (addr, addrlen),
- connection->port);
- ap = GNUNET_malloc (sizeof(struct AddressProbe) + addrlen);
- ap->addr = (const struct sockaddr *) &ap[1];
- GNUNET_memcpy (&ap[1], addr, addrlen);
- ap->addrlen = addrlen;
- ap->connection = connection;
-
- switch (ap->addr->sa_family)
- {
- case AF_INET:
- ((struct sockaddr_in *) ap->addr)->sin_port = htons (connection->port);
- break;
-
- case AF_INET6:
- ((struct sockaddr_in6 *) ap->addr)->sin6_port = htons (connection->port);
- break;
-
- default:
- GNUNET_break (0);
- GNUNET_free (ap);
- return; /* not supported by us */
- }
- ap->sock = GNUNET_NETWORK_socket_create (ap->addr->sa_family, SOCK_STREAM,
0);
- if (NULL == ap->sock)
- {
- GNUNET_free (ap);
- return; /* not supported by OS */
- }
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Trying to connect to `%s' (%p)\n",
- GNUNET_a2s (ap->addr, ap->addrlen),
- connection);
- if ((GNUNET_OK !=
- GNUNET_NETWORK_socket_connect (ap->sock, ap->addr, ap->addrlen)) &&
- (EINPROGRESS != errno))
- {
- /* maybe refused / unsupported address, try next */
- LOG_STRERROR (GNUNET_ERROR_TYPE_INFO, "connect");
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (ap->sock));
- GNUNET_free (ap);
- return;
- }
- GNUNET_CONTAINER_DLL_insert (connection->ap_head, connection->ap_tail, ap);
- delay = CONNECT_RETRY_TIMEOUT;
- if (NULL != connection->nth.notify_ready)
- delay = GNUNET_TIME_relative_min (delay,
- GNUNET_TIME_absolute_get_remaining (
- connection->nth.transmit_timeout));
- if (NULL != connection->receiver)
- delay = GNUNET_TIME_relative_min (delay,
- GNUNET_TIME_absolute_get_remaining (
- connection->receive_timeout));
- ap->task = GNUNET_SCHEDULER_add_write_net (delay,
- ap->sock,
- &connect_probe_continuation,
- ap);
-}
-
-
-/**
- * Create a connection handle by (asynchronously) connecting to a host.
- * This function returns immediately, even if the connection has not
- * yet been established. This function only creates TCP connections.
- *
- * @param cfg configuration to use
- * @param hostname name of the host to connect to
- * @param port port to connect to
- * @return the connection handle
- */
-struct GNUNET_CONNECTION_Handle *
-GNUNET_CONNECTION_create_from_connect (
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- const char *hostname,
- uint16_t port)
-{
- struct GNUNET_CONNECTION_Handle *connection;
-
- GNUNET_assert (0 < strlen (hostname)); /* sanity check */
- connection = GNUNET_new (struct GNUNET_CONNECTION_Handle);
- connection->cfg = cfg;
- connection->write_buffer_size = GNUNET_MIN_MESSAGE_SIZE;
- connection->write_buffer = GNUNET_malloc (connection->write_buffer_size);
- connection->port = port;
- connection->hostname = GNUNET_strdup (hostname);
- connection->dns_active = GNUNET_RESOLVER_ip_get (connection->hostname,
- AF_UNSPEC,
- CONNECT_RETRY_TIMEOUT,
- &try_connect_using_address,
- connection);
- return connection;
-}
-
-
-/**
- * Create a connection handle by connecting to a UNIX domain service.
- * This function returns immediately, even if the connection has not
- * yet been established. This function only creates UNIX connections.
- *
- * @param cfg configuration to use
- * @param unixpath path to connect to
- * @return the connection handle, NULL on systems without UNIX support
- */
-struct GNUNET_CONNECTION_Handle *
-GNUNET_CONNECTION_create_from_connect_to_unixpath (
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- const char *unixpath)
-{
-#ifdef AF_UNIX
- struct GNUNET_CONNECTION_Handle *connection;
- struct sockaddr_un *un;
-
- GNUNET_assert (0 < strlen (unixpath)); /* sanity check */
- un = GNUNET_new (struct sockaddr_un);
- un->sun_family = AF_UNIX;
- GNUNET_strlcpy (un->sun_path, unixpath, sizeof(un->sun_path));
-#ifdef __linux__
- {
- int abstract;
-
- abstract = GNUNET_CONFIGURATION_get_value_yesno (cfg,
- "TESTING",
- "USE_ABSTRACT_SOCKETS");
- if (GNUNET_YES == abstract)
- un->sun_path[0] = '\0';
- }
-#endif
-#if HAVE_SOCKADDR_UN_SUN_LEN
- un->sun_len = (u_char) sizeof(struct sockaddr_un);
-#endif
- connection = GNUNET_new (struct GNUNET_CONNECTION_Handle);
- connection->cfg = cfg;
- connection->write_buffer_size = GNUNET_MIN_MESSAGE_SIZE;
- connection->write_buffer = GNUNET_malloc (connection->write_buffer_size);
- connection->port = 0;
- connection->hostname = NULL;
- connection->addr = (struct sockaddr *) un;
- connection->addrlen = sizeof(struct sockaddr_un);
- connection->sock = GNUNET_NETWORK_socket_create (AF_UNIX, SOCK_STREAM, 0);
- if (NULL == connection->sock)
- {
- GNUNET_free (connection->addr);
- GNUNET_free (connection->write_buffer);
- GNUNET_free (connection);
- return NULL;
- }
- if ((GNUNET_OK != GNUNET_NETWORK_socket_connect (connection->sock,
- connection->addr,
- connection->addrlen)) &&
- (EINPROGRESS != errno))
- {
- /* Just return; we expect everything to work eventually so don't fail HARD
*/
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (connection->sock));
- connection->sock = NULL;
- return connection;
- }
- connect_success_continuation (connection);
- return connection;
-#else
- return NULL;
-#endif
-}
-
-
-/**
- * Create a connection handle by (asynchronously) connecting to a host.
- * This function returns immediately, even if the connection has not
- * yet been established. This function only creates TCP connections.
- *
- * @param s socket to connect
- * @param serv_addr server address
- * @param addrlen length of @a serv_addr
- * @return the connection handle
- */
-struct GNUNET_CONNECTION_Handle *
-GNUNET_CONNECTION_connect_socket (struct GNUNET_NETWORK_Handle *s,
- const struct sockaddr *serv_addr,
- socklen_t addrlen)
-{
- struct GNUNET_CONNECTION_Handle *connection;
-
- if ((GNUNET_OK != GNUNET_NETWORK_socket_connect (s, serv_addr, addrlen)) &&
- (EINPROGRESS != errno))
- {
- /* maybe refused / unsupported address, try next */
- LOG_STRERROR (GNUNET_ERROR_TYPE_DEBUG, "connect");
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Attempt to connect to `%s' failed\n",
- GNUNET_a2s (serv_addr, addrlen));
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (s));
- return NULL;
- }
- connection = GNUNET_CONNECTION_create_from_existing (s);
- connection->addr = GNUNET_malloc (addrlen);
- GNUNET_memcpy (connection->addr, serv_addr, addrlen);
- connection->addrlen = addrlen;
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Trying to connect to `%s' (%p)\n",
- GNUNET_a2s (serv_addr, addrlen),
- connection);
- return connection;
-}
-
-
-/**
- * Create a connection handle by creating a socket and
- * (asynchronously) connecting to a host. This function returns
- * immediately, even if the connection has not yet been established.
- * This function only creates TCP connections.
- *
- * @param af_family address family to use
- * @param serv_addr server address
- * @param addrlen length of @a serv_addr
- * @return the connection handle
- */
-struct GNUNET_CONNECTION_Handle *
-GNUNET_CONNECTION_create_from_sockaddr (int af_family,
- const struct sockaddr *serv_addr,
- socklen_t addrlen)
-{
- struct GNUNET_NETWORK_Handle *s;
-
- s = GNUNET_NETWORK_socket_create (af_family, SOCK_STREAM, 0);
- if (NULL == s)
- {
- LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING | GNUNET_ERROR_TYPE_BULK,
"socket");
- return NULL;
- }
- return GNUNET_CONNECTION_connect_socket (s, serv_addr, addrlen);
-}
-
-
-/**
- * Check if connection is valid (no fatal errors have happened so far).
- * Note that a connection that is still trying to connect is considered
- * valid.
- *
- * @param connection connection to check
- * @return #GNUNET_YES if valid, #GNUNET_NO otherwise
- */
-int
-GNUNET_CONNECTION_check (struct GNUNET_CONNECTION_Handle *connection)
-{
- if ((NULL != connection->ap_head) || (NULL != connection->dns_active) ||
- (NULL != connection->proxy_handshake))
- return GNUNET_YES; /* still trying to connect */
- if ((0 != connection->destroy_later) || (NULL == connection->sock))
- return GNUNET_NO;
- return GNUNET_YES;
-}
-
-
-/**
- * Close the connection and free associated resources. There must
- * not be any pending requests for reading or writing to the
- * connection at this time.
- *
- * @param connection connection to destroy
- */
-void
-GNUNET_CONNECTION_destroy (struct GNUNET_CONNECTION_Handle *connection)
-{
- struct AddressProbe *pos;
-
- if (0 != connection->destroy_later)
- {
- connection->destroy_later = -1;
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Shutting down connection (%p)\n", connection);
- GNUNET_assert (NULL == connection->nth.notify_ready);
- GNUNET_assert (NULL == connection->receiver);
- if (NULL != connection->write_task)
- {
- GNUNET_SCHEDULER_cancel (connection->write_task);
- connection->write_task = NULL;
- connection->write_buffer_off = 0;
- }
- if (NULL != connection->read_task)
- {
- GNUNET_SCHEDULER_cancel (connection->read_task);
- connection->read_task = NULL;
- }
- if (NULL != connection->nth.timeout_task)
- {
- GNUNET_SCHEDULER_cancel (connection->nth.timeout_task);
- connection->nth.timeout_task = NULL;
- }
- connection->nth.notify_ready = NULL;
- if (NULL != connection->dns_active)
- {
- GNUNET_RESOLVER_request_cancel (connection->dns_active);
- connection->dns_active = NULL;
- }
- if (NULL != connection->proxy_handshake)
- {
- /* GNUNET_CONNECTION_destroy (connection->proxy_handshake); */
- connection->proxy_handshake->destroy_later = -1;
- connection->proxy_handshake = NULL; /* Not leaked ??? */
- }
- while (NULL != (pos = connection->ap_head))
- {
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (pos->sock));
- GNUNET_SCHEDULER_cancel (pos->task);
- GNUNET_CONTAINER_DLL_remove (connection->ap_head, connection->ap_tail,
pos);
- GNUNET_free (pos);
- }
- if ((NULL != connection->sock) && (GNUNET_YES != connection->persist))
- {
- if ((GNUNET_OK !=
- GNUNET_NETWORK_socket_shutdown (connection->sock, SHUT_RDWR)) &&
- (ENOTCONN != errno) && (ECONNRESET != errno))
- LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "shutdown");
- }
- if (NULL != connection->sock)
- {
- if (GNUNET_YES != connection->persist)
- {
- GNUNET_break (GNUNET_OK ==
- GNUNET_NETWORK_socket_close (connection->sock));
- }
- else
- {
- GNUNET_NETWORK_socket_free_memory_only_ (
- connection->sock); /* at least no memory leak (we deliberately
- * leak the socket in this special case) ... */
- }
- }
- GNUNET_free (connection->addr);
- GNUNET_free (connection->hostname);
- GNUNET_free (connection->write_buffer);
- GNUNET_free (connection);
-}
-
-
-/**
- * This function is called once we either timeout
- * or have data ready to read.
- *
- * @param cls connection to read from
- */
-static void
-receive_ready (void *cls)
-{
- struct GNUNET_CONNECTION_Handle *connection = cls;
- const struct GNUNET_SCHEDULER_TaskContext *tc;
- char buffer[connection->max];
- ssize_t ret;
- GNUNET_CONNECTION_Receiver receiver;
-
- connection->read_task = NULL;
- tc = GNUNET_SCHEDULER_get_task_context ();
- if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_TIMEOUT))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Receive from `%s' encounters error: timeout (%s, %p)\n",
- GNUNET_a2s (connection->addr, connection->addrlen),
- GNUNET_STRINGS_relative_time_to_string (
- GNUNET_TIME_absolute_get_duration (
- connection->receive_timeout),
- GNUNET_YES),
- connection);
- signal_receive_timeout (connection);
- return;
- }
- if (NULL == connection->sock)
- {
- /* connect failed for good */
- signal_receive_error (connection, ECONNREFUSED);
- return;
- }
- GNUNET_assert (GNUNET_NETWORK_fdset_isset (tc->read_ready,
connection->sock));
-RETRY:
- ret = GNUNET_NETWORK_socket_recv (connection->sock, buffer, connection->max);
- if (-1 == ret)
- {
- if (EINTR == errno)
- goto RETRY;
- signal_receive_error (connection, errno);
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "receive_ready read %lu/%lu bytes from `%s' (%p)!\n",
- (unsigned long) ret,
- (unsigned long) connection->max,
- GNUNET_a2s (connection->addr, connection->addrlen),
- connection);
- GNUNET_assert (NULL != (receiver = connection->receiver));
- connection->receiver = NULL;
- receiver (connection->receiver_cls,
- buffer,
- ret,
- connection->addr,
- connection->addrlen,
- 0);
-}
-
-
-/**
- * Receive data from the given connection. Note that this function
- * will call @a receiver asynchronously using the scheduler. It will
- * "immediately" return. Note that there MUST only be one active
- * receive call per connection at any given point in time (so do not
- * call receive again until the receiver callback has been invoked).
- *
- * @param connection connection handle
- * @param max maximum number of bytes to read
- * @param timeout maximum amount of time to wait
- * @param receiver function to call with received data
- * @param receiver_cls closure for @a receiver
- * @return #GNUNET_SYSERR if @a connection died (receiver was
- * called with error)
- */
-int
-GNUNET_CONNECTION_receive (struct GNUNET_CONNECTION_Handle *connection,
- size_t max,
- struct GNUNET_TIME_Relative timeout,
- GNUNET_CONNECTION_Receiver receiver,
- void *receiver_cls)
-{
- GNUNET_assert ((NULL == connection->read_task) &&
- (NULL == connection->receiver));
- GNUNET_assert (NULL != receiver);
- connection->receiver = receiver;
- connection->receiver_cls = receiver_cls;
- connection->receive_timeout = GNUNET_TIME_relative_to_absolute (timeout);
- connection->max = max;
- if (NULL != connection->sock)
- {
- connection->read_task =
- GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_absolute_get_remaining (
- connection->receive_timeout),
- connection->sock,
- &receive_ready,
- connection);
- return GNUNET_OK;
- }
- if ((NULL == connection->dns_active) && (NULL == connection->ap_head) &&
- (NULL == connection->proxy_handshake))
- {
- connection->receiver = NULL;
- receiver (receiver_cls, NULL, 0, NULL, 0, ETIMEDOUT);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Cancel receive job on the given connection. Note that the
- * receiver callback must not have been called yet in order
- * for the cancellation to be valid.
- *
- * @param connection connection handle
- * @return closure of the original receiver callback closure
- */
-void *
-GNUNET_CONNECTION_receive_cancel (struct GNUNET_CONNECTION_Handle *connection)
-{
- if (NULL != connection->read_task)
- {
- GNUNET_assert (connection ==
- GNUNET_SCHEDULER_cancel (connection->read_task));
- connection->read_task = NULL;
- }
- connection->receiver = NULL;
- return connection->receiver_cls;
-}
-
-
-/**
- * Try to call the transmit notify method (check if we do
- * have enough space available first)!
- *
- * @param connection connection for which we should do this processing
- * @return #GNUNET_YES if we were able to call notify
- */
-static int
-process_notify (struct GNUNET_CONNECTION_Handle *connection)
-{
- size_t used;
- size_t avail;
- size_t size;
- GNUNET_CONNECTION_TransmitReadyNotify notify;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG, "process_notify is running\n");
- GNUNET_assert (NULL == connection->write_task);
- if (NULL == (notify = connection->nth.notify_ready))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG, "No one to notify\n");
- return GNUNET_NO;
- }
- used = connection->write_buffer_off - connection->write_buffer_pos;
- avail = connection->write_buffer_size - used;
- size = connection->nth.notify_size;
- if (size > avail)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Not enough buffer\n");
- return GNUNET_NO;
- }
- connection->nth.notify_ready = NULL;
- if (connection->write_buffer_size - connection->write_buffer_off < size)
- {
- /* need to compact */
- memmove (connection->write_buffer,
- &connection->write_buffer[connection->write_buffer_pos],
- used);
- connection->write_buffer_off -= connection->write_buffer_pos;
- connection->write_buffer_pos = 0;
- }
- avail = connection->write_buffer_size - connection->write_buffer_off;
- GNUNET_assert (avail >= size);
- size = notify (connection->nth.notify_ready_cls,
- avail,
- &connection->write_buffer[connection->write_buffer_off]);
- GNUNET_assert (size <= avail);
- if (0 != size)
- connection->write_buffer_off += size;
- return GNUNET_YES;
-}
-
-
-/**
- * Task invoked by the scheduler when a call to transmit
- * is timing out (we never got enough buffer space to call
- * the callback function before the specified timeout
- * expired).
- *
- * This task notifies the client about the timeout.
- *
- * @param cls the `struct GNUNET_CONNECTION_Handle`
- */
-static void
-transmit_timeout (void *cls)
-{
- struct GNUNET_CONNECTION_Handle *connection = cls;
- GNUNET_CONNECTION_TransmitReadyNotify notify;
-
- connection->nth.timeout_task = NULL;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Transmit to `%s:%u/%s' fails, time out reached (%p).\n",
- connection->hostname,
- connection->port,
- GNUNET_a2s (connection->addr, connection->addrlen),
- connection);
- notify = connection->nth.notify_ready;
- GNUNET_assert (NULL != notify);
- connection->nth.notify_ready = NULL;
- notify (connection->nth.notify_ready_cls, 0, NULL);
-}
-
-
-/**
- * Task invoked by the scheduler when we failed to connect
- * at the time of being asked to transmit.
- *
- * This task notifies the client about the error.
- *
- * @param cls the `struct GNUNET_CONNECTION_Handle`
- */
-static void
-connect_error (void *cls)
-{
- struct GNUNET_CONNECTION_Handle *connection = cls;
- GNUNET_CONNECTION_TransmitReadyNotify notify;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Transmission request of size %lu fails (%s/%u), connection failed
(%p).\n",
- (unsigned long) connection->nth.notify_size,
- connection->hostname,
- connection->port,
- connection);
- connection->write_task = NULL;
- notify = connection->nth.notify_ready;
- connection->nth.notify_ready = NULL;
- notify (connection->nth.notify_ready_cls, 0, NULL);
-}
-
-
-/**
- * We are ready to transmit (or got a timeout).
- *
- * @param cls our connection handle
- */
-static void
-transmit_ready (void *cls)
-{
- struct GNUNET_CONNECTION_Handle *connection = cls;
- GNUNET_CONNECTION_TransmitReadyNotify notify;
- const struct GNUNET_SCHEDULER_TaskContext *tc;
- ssize_t ret;
- size_t have;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG, "transmit_ready running (%p).\n", connection);
- GNUNET_assert (NULL != connection->write_task);
- connection->write_task = NULL;
- GNUNET_assert (NULL == connection->nth.timeout_task);
- tc = GNUNET_SCHEDULER_get_task_context ();
- if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_TIMEOUT))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Transmit to `%s' fails, time out reached (%p).\n",
- GNUNET_a2s (connection->addr, connection->addrlen),
- connection);
- notify = connection->nth.notify_ready;
- GNUNET_assert (NULL != notify);
- connection->nth.notify_ready = NULL;
- notify (connection->nth.notify_ready_cls, 0, NULL);
- return;
- }
- GNUNET_assert (NULL != connection->sock);
- if (NULL == tc->write_ready)
- {
- /* special circumstances (in particular, PREREQ_DONE after
- * connect): not yet ready to write, but no "fatal" error either.
- * Hence retry. */
- goto SCHEDULE_WRITE;
- }
- if (! GNUNET_NETWORK_fdset_isset (tc->write_ready, connection->sock))
- {
- GNUNET_assert (NULL == connection->write_task);
- /* special circumstances (in particular, shutdown): not yet ready
- * to write, but no "fatal" error either. Hence retry. */
- goto SCHEDULE_WRITE;
- }
- GNUNET_assert (connection->write_buffer_off >= connection->write_buffer_pos);
- if ((NULL != connection->nth.notify_ready) &&
- (connection->write_buffer_size < connection->nth.notify_size))
- {
- connection->write_buffer =
- GNUNET_realloc (connection->write_buffer, connection->nth.notify_size);
- connection->write_buffer_size = connection->nth.notify_size;
- }
- process_notify (connection);
- have = connection->write_buffer_off - connection->write_buffer_pos;
- if (0 == have)
- {
- /* no data ready for writing, terminate write loop */
- return;
- }
- GNUNET_assert (have <= connection->write_buffer_size);
- GNUNET_assert (have + connection->write_buffer_pos <=
- connection->write_buffer_size);
- GNUNET_assert (connection->write_buffer_pos <=
connection->write_buffer_size);
-RETRY:
- ret =
- GNUNET_NETWORK_socket_send (connection->sock,
- &connection
- ->write_buffer[connection->write_buffer_pos],
- have);
- if (-1 == ret)
- {
- if (EINTR == errno)
- goto RETRY;
- if (NULL != connection->write_task)
- {
- GNUNET_SCHEDULER_cancel (connection->write_task);
- connection->write_task = NULL;
- }
- signal_transmit_error (connection, errno);
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Connection transmitted %lu/%lu bytes to `%s' (%p)\n",
- (unsigned long) ret,
- (unsigned long) have,
- GNUNET_a2s (connection->addr, connection->addrlen),
- connection);
- connection->write_buffer_pos += ret;
- if (connection->write_buffer_pos == connection->write_buffer_off)
- {
- /* transmitted all pending data */
- connection->write_buffer_pos = 0;
- connection->write_buffer_off = 0;
- }
- if ((0 == connection->write_buffer_off) &&
- (NULL == connection->nth.notify_ready))
- return; /* all data sent! */
- /* not done writing, schedule more */
-SCHEDULE_WRITE:
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Re-scheduling transmit_ready (more to do) (%p).\n",
- connection);
- have = connection->write_buffer_off - connection->write_buffer_pos;
- GNUNET_assert ((NULL != connection->nth.notify_ready) || (have > 0));
- if (NULL == connection->write_task)
- connection->write_task =
- GNUNET_SCHEDULER_add_write_net ((connection->nth.notify_ready == NULL)
- ? GNUNET_TIME_UNIT_FOREVER_REL
- : GNUNET_TIME_absolute_get_remaining (
- connection->nth.transmit_timeout),
- connection->sock,
- &transmit_ready,
- connection);
-}
-
-
-/**
- * Ask the connection to call us once the specified number of bytes
- * are free in the transmission buffer. Will never call the @a notify
- * callback in this task, but always first go into the scheduler.
- *
- * @param connection connection
- * @param size number of bytes to send
- * @param timeout after how long should we give up (and call
- * @a notify with buf NULL and size 0)?
- * @param notify function to call
- * @param notify_cls closure for @a notify
- * @return non-NULL if the notify callback was queued,
- * NULL if we are already going to notify someone else (busy)
- */
-struct GNUNET_CONNECTION_TransmitHandle *
-GNUNET_CONNECTION_notify_transmit_ready (
- struct GNUNET_CONNECTION_Handle *connection,
- size_t size,
- struct GNUNET_TIME_Relative timeout,
- GNUNET_CONNECTION_TransmitReadyNotify notify,
- void *notify_cls)
-{
- if (NULL != connection->nth.notify_ready)
- {
- GNUNET_assert (0);
- return NULL;
- }
- GNUNET_assert (NULL != notify);
- GNUNET_assert (size < GNUNET_MAX_MESSAGE_SIZE);
- GNUNET_assert (connection->write_buffer_off <=
connection->write_buffer_size);
- GNUNET_assert (connection->write_buffer_pos <=
connection->write_buffer_size);
- GNUNET_assert (connection->write_buffer_pos <= connection->write_buffer_off);
- connection->nth.notify_ready = notify;
- connection->nth.notify_ready_cls = notify_cls;
- connection->nth.connection = connection;
- connection->nth.notify_size = size;
- connection->nth.transmit_timeout = GNUNET_TIME_relative_to_absolute
(timeout);
- GNUNET_assert (NULL == connection->nth.timeout_task);
- if ((NULL == connection->sock) && (NULL == connection->ap_head) &&
- (NULL == connection->dns_active) && (NULL ==
connection->proxy_handshake))
- {
- if (NULL != connection->write_task)
- GNUNET_SCHEDULER_cancel (connection->write_task);
- connection->write_task =
- GNUNET_SCHEDULER_add_now (&connect_error, connection);
- return &connection->nth;
- }
- if (NULL != connection->write_task)
- return &connection->nth; /* previous transmission still in progress */
- if (NULL != connection->sock)
- {
- /* connected, try to transmit now */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Scheduling transmission (%p).\n",
- connection);
- connection->write_task =
- GNUNET_SCHEDULER_add_write_net (GNUNET_TIME_absolute_get_remaining (
- connection->nth.transmit_timeout),
- connection->sock,
- &transmit_ready,
- connection);
- return &connection->nth;
- }
- /* not yet connected, wait for connection */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Need to wait to schedule transmission for connection, adding timeout
task (%p).\n",
- connection);
- connection->nth.timeout_task =
- GNUNET_SCHEDULER_add_delayed (timeout, &transmit_timeout, connection);
- return &connection->nth;
-}
-
-
-/**
- * Cancel the specified transmission-ready notification.
- *
- * @param th notification to cancel
- */
-void
-GNUNET_CONNECTION_notify_transmit_ready_cancel (
- struct GNUNET_CONNECTION_TransmitHandle *th)
-{
- GNUNET_assert (NULL != th->notify_ready);
- th->notify_ready = NULL;
- if (NULL != th->timeout_task)
- {
- GNUNET_SCHEDULER_cancel (th->timeout_task);
- th->timeout_task = NULL;
- }
- if (NULL != th->connection->write_task)
- {
- GNUNET_SCHEDULER_cancel (th->connection->write_task);
- th->connection->write_task = NULL;
- }
-}
-
-
-/**
- * Create a connection to be proxied using a given connection.
- *
- * @param cph connection to proxy server
- * @return connection to be proxied
- */
-struct GNUNET_CONNECTION_Handle *
-GNUNET_CONNECTION_create_proxied_from_handshake (
- struct GNUNET_CONNECTION_Handle *cph)
-{
- struct GNUNET_CONNECTION_Handle *proxied =
- GNUNET_CONNECTION_create_from_existing (NULL);
-
- proxied->proxy_handshake = cph;
- return proxied;
-}
-
-
-/**
- * Activate proxied connection and destroy initial proxy handshake connection.
- * There must not be any pending requests for reading or writing to the
- * proxy hadshake connection at this time.
- *
- * @param proxied connection connection to proxy server
- */
-void
-GNUNET_CONNECTION_acivate_proxied (struct GNUNET_CONNECTION_Handle *proxied)
-{
- struct GNUNET_CONNECTION_Handle *cph = proxied->proxy_handshake;
-
- GNUNET_assert (NULL != cph);
- GNUNET_assert (NULL == proxied->sock);
- GNUNET_assert (NULL != cph->sock);
- proxied->sock = cph->sock;
- cph->sock = NULL;
- GNUNET_CONNECTION_destroy (cph);
- connect_success_continuation (proxied);
-}
-
-
-/* end of connection.c */
diff --git a/src/transport/tcp_server_legacy.c
b/src/transport/tcp_server_legacy.c
deleted file mode 100644
index bb572c843..000000000
--- a/src/transport/tcp_server_legacy.c
+++ /dev/null
@@ -1,1728 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009-2013 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file util/server.c
- * @brief library for building GNUnet network servers
- * @author Christian Grothoff
- */
-
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_protocols.h"
-
-#define LOG_STRERROR_FILE(kind, syscall, \
- filename) GNUNET_log_from_strerror_file (kind, \
-
"util-server", \
- syscall, \
- filename)
-
-
-/**
- * List of arrays of message handlers.
- */
-struct HandlerList
-{
- /**
- * This is a linked list.
- */
- struct HandlerList *next;
-
- /**
- * NULL-terminated array of handlers.
- */
- const struct GNUNET_SERVER_MessageHandler *handlers;
-};
-
-
-/**
- * List of arrays of message handlers.
- */
-struct NotifyList
-{
- /**
- * This is a doubly linked list.
- */
- struct NotifyList *next;
-
- /**
- * This is a doubly linked list.
- */
- struct NotifyList *prev;
-
- /**
- * Function to call.
- */
- GNUNET_SERVER_DisconnectCallback callback;
-
- /**
- * Closure for callback.
- */
- void *callback_cls;
-};
-
-
-/**
- * @brief handle for a server
- */
-struct GNUNET_SERVER_Handle
-{
- /**
- * List of handlers for incoming messages.
- */
- struct HandlerList *handlers;
-
- /**
- * Head of list of our current clients.
- */
- struct GNUNET_SERVER_Client *clients_head;
-
- /**
- * Head of list of our current clients.
- */
- struct GNUNET_SERVER_Client *clients_tail;
-
- /**
- * Head of linked list of functions to call on disconnects by clients.
- */
- struct NotifyList *disconnect_notify_list_head;
-
- /**
- * Tail of linked list of functions to call on disconnects by clients.
- */
- struct NotifyList *disconnect_notify_list_tail;
-
- /**
- * Head of linked list of functions to call on connects by clients.
- */
- struct NotifyList *connect_notify_list_head;
-
- /**
- * Tail of linked list of functions to call on connects by clients.
- */
- struct NotifyList *connect_notify_list_tail;
-
- /**
- * Function to call for access control.
- */
- GNUNET_CONNECTION_AccessCheck access_cb;
-
- /**
- * Closure for @e access_cb.
- */
- void *access_cb_cls;
-
- /**
- * NULL-terminated array of sockets used to listen for new
- * connections.
- */
- struct GNUNET_NETWORK_Handle **listen_sockets;
-
- /**
- * After how long should an idle connection time
- * out (on write).
- */
- struct GNUNET_TIME_Relative idle_timeout;
-
- /**
- * Task scheduled to do the listening.
- */
- struct GNUNET_SCHEDULER_Task *listen_task;
-
- /**
- * Alternative function to create a MST instance.
- */
- GNUNET_SERVER_MstCreateCallback mst_create;
-
- /**
- * Alternative function to destroy a MST instance.
- */
- GNUNET_SERVER_MstDestroyCallback mst_destroy;
-
- /**
- * Alternative function to give data to a MST instance.
- */
- GNUNET_SERVER_MstReceiveCallback mst_receive;
-
- /**
- * Closure for 'mst_'-callbacks.
- */
- void *mst_cls;
-
- /**
- * Do we ignore messages of types that we do not understand or do we
- * require that a handler is found (and if not kill the connection)?
- */
- int require_found;
-
- /**
- * Set to #GNUNET_YES once we are in 'soft' shutdown where we wait for
- * all non-monitor clients to disconnect before we call
- * #GNUNET_SERVER_destroy. See test_monitor_clients(). Set to
- * #GNUNET_SYSERR once the final destroy task has been scheduled
- * (we cannot run it in the same task).
- */
- int in_soft_shutdown;
-};
-
-
-/**
- * Handle server returns for aborting transmission to a client.
- */
-struct GNUNET_SERVER_TransmitHandle
-{
- /**
- * Function to call to get the message.
- */
- GNUNET_CONNECTION_TransmitReadyNotify callback;
-
- /**
- * Closure for @e callback
- */
- void *callback_cls;
-
- /**
- * Active connection transmission handle.
- */
- struct GNUNET_CONNECTION_TransmitHandle *cth;
-};
-
-
-/**
- * @brief handle for a client of the server
- */
-struct GNUNET_SERVER_Client
-{
- /**
- * This is a doubly linked list.
- */
- struct GNUNET_SERVER_Client *next;
-
- /**
- * This is a doubly linked list.
- */
- struct GNUNET_SERVER_Client *prev;
-
- /**
- * Processing of incoming data.
- */
- void *mst;
-
- /**
- * Server that this client belongs to.
- */
- struct GNUNET_SERVER_Handle *server;
-
- /**
- * Client closure for callbacks.
- */
- struct GNUNET_CONNECTION_Handle *connection;
-
- /**
- * User context value, manipulated using
- * 'GNUNET_SERVER_client_{get/set}_user_context' functions.
- */
- void *user_context;
-
- /**
- * ID of task used to restart processing.
- */
- struct GNUNET_SCHEDULER_Task *restart_task;
-
- /**
- * Task that warns about missing calls to #GNUNET_SERVER_receive_done.
- */
- struct GNUNET_SCHEDULER_Task *warn_task;
-
- /**
- * Time when the warn task was started.
- */
- struct GNUNET_TIME_Absolute warn_start;
-
- /**
- * Last activity on this socket (used to time it out
- * if reference_count == 0).
- */
- struct GNUNET_TIME_Absolute last_activity;
-
- /**
- * Transmission handle we return for this client from
- * #GNUNET_SERVER_notify_transmit_ready.
- */
- struct GNUNET_SERVER_TransmitHandle th;
-
- /**
- * After how long should an idle connection time
- * out (on write).
- */
- struct GNUNET_TIME_Relative idle_timeout;
-
- /**
- * Number of external entities with a reference to
- * this client object.
- */
- unsigned int reference_count;
-
- /**
- * Was processing if incoming messages suspended while
- * we were still processing data already received?
- * This is a counter saying how often processing was
- * suspended (once per handler invoked).
- */
- unsigned int suspended;
-
- /**
- * Last size given when user context was initialized; used for
- * sanity check.
- */
- size_t user_context_size;
-
- /**
- * Are we currently in the "process_client_buffer" function (and
- * will hence restart the receive job on exit if suspended == 0 once
- * we are done?). If this is set, then "receive_done" will
- * essentially only decrement suspended; if this is not set, then
- * "receive_done" may need to restart the receive process (either
- * from the side-buffer or via select/recv).
- */
- int in_process_client_buffer;
-
- /**
- * We're about to close down this client.
- */
- int shutdown_now;
-
- /**
- * Are we currently trying to receive? (#GNUNET_YES if we are,
- * #GNUNET_NO if we are not, #GNUNET_SYSERR if data is already
- * available in MST).
- */
- int receive_pending;
-
- /**
- * Persist the file handle for this client no matter what happens,
- * force the OS to close once the process actually dies. Should only
- * be used in special cases!
- */
- int persist;
-
- /**
- * Is this client a 'monitor' client that should not be counted
- * when deciding on destroying the server during soft shutdown?
- * (see also #GNUNET_SERVICE_start)
- */
- int is_monitor;
-
- /**
- * Type of last message processed (for warn_no_receive_done).
- */
- uint16_t warn_type;
-};
-
-
-/**
- * Return user context associated with the given client.
- * Note: you should probably use the macro (call without the underscore).
- *
- * @param client client to query
- * @param size number of bytes in user context struct (for verification only)
- * @return pointer to user context
- */
-void *
-GNUNET_SERVER_client_get_user_context_ (struct GNUNET_SERVER_Client *client,
- size_t size)
-{
- if ((0 == client->user_context_size) &&
- (NULL == client->user_context))
- return NULL; /* never set */
- GNUNET_assert (size == client->user_context_size);
- return client->user_context;
-}
-
-
-/**
- * Set user context to be associated with the given client.
- * Note: you should probably use the macro (call without the underscore).
- *
- * @param client client to query
- * @param ptr pointer to user context
- * @param size number of bytes in user context struct (for verification only)
- */
-void
-GNUNET_SERVER_client_set_user_context_ (struct GNUNET_SERVER_Client *client,
- void *ptr,
- size_t size)
-{
- if (NULL == ptr)
- {
- client->user_context_size = 0;
- client->user_context = ptr;
- return;
- }
- client->user_context_size = size;
- client->user_context = ptr;
-}
-
-
-/**
- * Scheduler says our listen socket is ready. Process it!
- *
- * @param cls handle to our server for which we are processing the listen
- * socket
- */
-static void
-process_listen_socket (void *cls)
-{
- struct GNUNET_SERVER_Handle *server = cls;
- const struct GNUNET_SCHEDULER_TaskContext *tc;
- struct GNUNET_CONNECTION_Handle *sock;
- unsigned int i;
-
- server->listen_task = NULL;
- tc = GNUNET_SCHEDULER_get_task_context ();
- for (i = 0; NULL != server->listen_sockets[i]; i++)
- {
- if (GNUNET_NETWORK_fdset_isset (tc->read_ready,
- server->listen_sockets[i]))
- {
- sock =
- GNUNET_CONNECTION_create_from_accept (server->access_cb,
- server->access_cb_cls,
- server->listen_sockets[i]);
- if (NULL != sock)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Server accepted incoming connection.\n");
- (void) GNUNET_SERVER_connect_socket (server,
- sock);
- }
- }
- }
- /* listen for more! */
- GNUNET_SERVER_resume (server);
-}
-
-
-/**
- * Create and initialize a listen socket for the server.
- *
- * @param server_addr address to listen on
- * @param socklen length of @a server_addr
- * @return NULL on error, otherwise the listen socket
- */
-static struct GNUNET_NETWORK_Handle *
-open_listen_socket (const struct sockaddr *server_addr,
- socklen_t socklen)
-{
- struct GNUNET_NETWORK_Handle *sock;
- uint16_t port;
- int eno;
-
- switch (server_addr->sa_family)
- {
- case AF_INET:
- port = ntohs (((const struct sockaddr_in *) server_addr)->sin_port);
- break;
-
- case AF_INET6:
- port = ntohs (((const struct sockaddr_in6 *) server_addr)->sin6_port);
- break;
-
- case AF_UNIX:
- port = 0;
- break;
-
- default:
- GNUNET_break (0);
- port = 0;
- break;
- }
- sock = GNUNET_NETWORK_socket_create (server_addr->sa_family, SOCK_STREAM, 0);
- if (NULL == sock)
- {
- LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "socket");
- errno = 0;
- return NULL;
- }
- /* bind the socket */
- if (GNUNET_OK != GNUNET_NETWORK_socket_bind (sock, server_addr, socklen))
- {
- eno = errno;
- if (EADDRINUSE != errno)
- {
- /* we don't log 'EADDRINUSE' here since an IPv4 bind may
- * fail if we already took the port on IPv6; if both IPv4 and
- * IPv6 binds fail, then our caller will log using the
- * errno preserved in 'eno' */
- LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR,
- "bind");
- if (0 != port)
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("`%s' failed for port %d (%s).\n"),
- "bind",
- port,
- (AF_INET == server_addr->sa_family) ? "IPv4" : "IPv6");
- eno = 0;
- }
- else
- {
- if (0 != port)
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ ("`%s' failed for port %d (%s): address already in use\n"),
- "bind", port,
- (AF_INET == server_addr->sa_family) ? "IPv4" : "IPv6");
- else if (AF_UNIX == server_addr->sa_family)
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ ("`%s' failed for `%s': address already in use\n"),
- "bind",
- GNUNET_a2s (server_addr, socklen));
- }
- }
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (sock));
- errno = eno;
- return NULL;
- }
- if (GNUNET_OK != GNUNET_NETWORK_socket_listen (sock, 5))
- {
- LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR,
- "listen");
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (sock));
- errno = 0;
- return NULL;
- }
- if (0 != port)
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Server starts to listen on port %u.\n",
- port);
- return sock;
-}
-
-
-/**
- * Create a new server.
- *
- * @param access_cb function for access control
- * @param access_cb_cls closure for @a access_cb
- * @param lsocks NULL-terminated array of listen sockets
- * @param idle_timeout after how long should we timeout idle connections?
- * @param require_found if #GNUNET_YES, connections sending messages of
unknown type
- * will be closed
- * @return handle for the new server, NULL on error
- * (typically, "port" already in use)
- */
-struct GNUNET_SERVER_Handle *
-GNUNET_SERVER_create_with_sockets (GNUNET_CONNECTION_AccessCheck access_cb,
- void *access_cb_cls,
- struct GNUNET_NETWORK_Handle **lsocks,
- struct GNUNET_TIME_Relative idle_timeout,
- int require_found)
-{
- struct GNUNET_SERVER_Handle *server;
-
- server = GNUNET_new (struct GNUNET_SERVER_Handle);
- server->idle_timeout = idle_timeout;
- server->listen_sockets = lsocks;
- server->access_cb = access_cb;
- server->access_cb_cls = access_cb_cls;
- server->require_found = require_found;
- if (NULL != lsocks)
- GNUNET_SERVER_resume (server);
- return server;
-}
-
-
-/**
- * Create a new server.
- *
- * @param access_cb function for access control
- * @param access_cb_cls closure for @a access_cb
- * @param server_addr address to listen on (including port), NULL terminated
array
- * @param socklen length of server_addr
- * @param idle_timeout after how long should we timeout idle connections?
- * @param require_found if YES, connections sending messages of unknown type
- * will be closed
- * @return handle for the new server, NULL on error
- * (typically, "port" already in use)
- */
-struct GNUNET_SERVER_Handle *
-GNUNET_SERVER_create (GNUNET_CONNECTION_AccessCheck access_cb,
- void *access_cb_cls,
- struct sockaddr *const *server_addr,
- const socklen_t *socklen,
- struct GNUNET_TIME_Relative idle_timeout,
- int require_found)
-{
- struct GNUNET_NETWORK_Handle **lsocks;
- unsigned int i;
- unsigned int j;
- unsigned int k;
- int seen;
-
- i = 0;
- while (NULL != server_addr[i])
- i++;
- if (i > 0)
- {
- lsocks = GNUNET_malloc (sizeof(struct GNUNET_NETWORK_Handle *) * (i + 1));
- i = 0;
- j = 0;
- while (NULL != server_addr[i])
- {
- seen = 0;
- for (k = 0; k < i; k++)
- if ((socklen[k] == socklen[i]) &&
- (0 == memcmp (server_addr[k], server_addr[i], socklen[i])))
- {
- seen = 1;
- break;
- }
- if (0 != seen)
- {
- /* duplicate address, skip */
- i++;
- continue;
- }
- lsocks[j] = open_listen_socket (server_addr[i], socklen[i]);
- if (NULL != lsocks[j])
- j++;
- i++;
- }
- if (0 == j)
- {
- if (0 != errno)
- LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "bind");
- GNUNET_free (lsocks);
- lsocks = NULL;
- }
- }
- else
- {
- lsocks = NULL;
- }
- return GNUNET_SERVER_create_with_sockets (access_cb,
- access_cb_cls,
- lsocks,
- idle_timeout,
- require_found);
-}
-
-
-/**
- * Set the 'monitor' flag on this client. Clients which have been
- * marked as 'monitors' won't prevent the server from shutting down
- * once '#GNUNET_SERVER_stop_listening()' has been invoked. The idea is
- * that for "normal" clients we likely want to allow them to process
- * their requests; however, monitor-clients are likely to 'never'
- * disconnect during shutdown and thus will not be considered when
- * determining if the server should continue to exist after
- * #GNUNET_SERVER_destroy() has been called.
- *
- * @param client the client to set the 'monitor' flag on
- */
-void
-GNUNET_SERVER_client_mark_monitor (struct GNUNET_SERVER_Client *client)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Marking client as monitor!\n");
- client->is_monitor = GNUNET_YES;
-}
-
-
-/**
- * Helper function for #test_monitor_clients() to trigger
- * #GNUNET_SERVER_destroy() after the stack has unwound.
- *
- * @param cls the `struct GNUNET_SERVER_Handle *` to destroy
- */
-static void
-do_destroy (void *cls)
-{
- struct GNUNET_SERVER_Handle *server = cls;
-
- GNUNET_SERVER_destroy (server);
-}
-
-
-/**
- * Check if only 'monitor' clients are left. If so, destroy the
- * server completely.
- *
- * @param server server to test for full shutdown
- */
-static void
-test_monitor_clients (struct GNUNET_SERVER_Handle *server)
-{
- struct GNUNET_SERVER_Client *client;
-
- if (GNUNET_YES != server->in_soft_shutdown)
- return;
- for (client = server->clients_head; NULL != client; client = client->next)
- if (GNUNET_NO == client->is_monitor)
- return;
- /* not done yet */
- server->in_soft_shutdown = GNUNET_SYSERR;
- (void) GNUNET_SCHEDULER_add_now (&do_destroy, server);
-}
-
-
-/**
- * Suspend accepting connections from the listen socket temporarily.
- *
- * @param server server to stop accepting connections.
- */
-void
-GNUNET_SERVER_suspend (struct GNUNET_SERVER_Handle *server)
-{
- if (NULL != server->listen_task)
- {
- GNUNET_SCHEDULER_cancel (server->listen_task);
- server->listen_task = NULL;
- }
-}
-
-
-void
-GNUNET_SERVER_resume (struct GNUNET_SERVER_Handle *server)
-{
- struct GNUNET_NETWORK_FDSet *r;
- unsigned int i;
-
- if (NULL == server->listen_sockets)
- return;
- if (NULL == server->listen_sockets[0])
- return; /* nothing to do, no listen sockets! */
- if (NULL == server->listen_sockets[1])
- {
- /* simplified method: no fd set needed; this is then much simpler
- and much more efficient */
- server->listen_task =
- GNUNET_SCHEDULER_add_read_net_with_priority
(GNUNET_TIME_UNIT_FOREVER_REL,
-
GNUNET_SCHEDULER_PRIORITY_HIGH,
- server->listen_sockets[0],
- &process_listen_socket,
- server);
- return;
- }
- r = GNUNET_NETWORK_fdset_create ();
- i = 0;
- while (NULL != server->listen_sockets[i])
- GNUNET_NETWORK_fdset_set (r, server->listen_sockets[i++]);
- server->listen_task =
- GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_HIGH,
- GNUNET_TIME_UNIT_FOREVER_REL, r, NULL,
- &process_listen_socket, server);
- GNUNET_NETWORK_fdset_destroy (r);
-}
-
-
-/**
- * Stop the listen socket and get ready to shutdown the server
- * once only 'monitor' clients are left.
- *
- * @param server server to stop listening on
- */
-void
-GNUNET_SERVER_stop_listening (struct GNUNET_SERVER_Handle *server)
-{
- unsigned int i;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Server in soft shutdown\n");
- if (NULL != server->listen_task)
- {
- GNUNET_SCHEDULER_cancel (server->listen_task);
- server->listen_task = NULL;
- }
- if (NULL != server->listen_sockets)
- {
- i = 0;
- while (NULL != server->listen_sockets[i])
- GNUNET_break (GNUNET_OK ==
- GNUNET_NETWORK_socket_close (server->listen_sockets[i++]));
- GNUNET_free (server->listen_sockets);
- server->listen_sockets = NULL;
- }
- if (GNUNET_NO == server->in_soft_shutdown)
- server->in_soft_shutdown = GNUNET_YES;
- test_monitor_clients (server);
-}
-
-
-/**
- * Free resources held by this server.
- *
- * @param server server to destroy
- */
-void
-GNUNET_SERVER_destroy (struct GNUNET_SERVER_Handle *server)
-{
- struct HandlerList *hpos;
- struct NotifyList *npos;
- unsigned int i;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Server shutting down.\n");
- if (NULL != server->listen_task)
- {
- GNUNET_SCHEDULER_cancel (server->listen_task);
- server->listen_task = NULL;
- }
- if (NULL != server->listen_sockets)
- {
- i = 0;
- while (NULL != server->listen_sockets[i])
- GNUNET_break (GNUNET_OK ==
- GNUNET_NETWORK_socket_close (server->listen_sockets[i++]));
- GNUNET_free (server->listen_sockets);
- server->listen_sockets = NULL;
- }
- while (NULL != server->clients_head)
- GNUNET_SERVER_client_disconnect (server->clients_head);
- while (NULL != (hpos = server->handlers))
- {
- server->handlers = hpos->next;
- GNUNET_free (hpos);
- }
- while (NULL != (npos = server->disconnect_notify_list_head))
- {
- npos->callback (npos->callback_cls,
- NULL);
- GNUNET_CONTAINER_DLL_remove (server->disconnect_notify_list_head,
- server->disconnect_notify_list_tail,
- npos);
- GNUNET_free (npos);
- }
- while (NULL != (npos = server->connect_notify_list_head))
- {
- npos->callback (npos->callback_cls,
- NULL);
- GNUNET_CONTAINER_DLL_remove (server->connect_notify_list_head,
- server->connect_notify_list_tail,
- npos);
- GNUNET_free (npos);
- }
- GNUNET_free (server);
-}
-
-
-/**
- * Add additional handlers to an existing server.
- *
- * @param server the server to add handlers to
- * @param handlers array of message handlers for
- * incoming messages; the last entry must
- * have "NULL" for the "callback"; multiple
- * entries for the same type are allowed,
- * they will be called in order of occurrence.
- * These handlers can be removed later;
- * the handlers array must exist until removed
- * (or server is destroyed).
- */
-void
-GNUNET_SERVER_add_handlers (struct GNUNET_SERVER_Handle *server,
- const struct GNUNET_SERVER_MessageHandler
*handlers)
-{
- struct HandlerList *p;
-
- p = GNUNET_new (struct HandlerList);
- p->handlers = handlers;
- p->next = server->handlers;
- server->handlers = p;
-}
-
-
-/**
- * Change functions used by the server to tokenize the message stream.
- * (very rarely used).
- *
- * @param server server to modify
- * @param create new tokenizer initialization function
- * @param destroy new tokenizer destruction function
- * @param receive new tokenizer receive function
- * @param cls closure for @a create, @a receive, @a destroy
- */
-void
-GNUNET_SERVER_set_callbacks (struct GNUNET_SERVER_Handle *server,
- GNUNET_SERVER_MstCreateCallback create,
- GNUNET_SERVER_MstDestroyCallback destroy,
- GNUNET_SERVER_MstReceiveCallback receive,
- void *cls)
-{
- server->mst_create = create;
- server->mst_destroy = destroy;
- server->mst_receive = receive;
- server->mst_cls = cls;
-}
-
-
-/**
- * Task run to warn about missing calls to #GNUNET_SERVER_receive_done.
- *
- * @param cls our `struct GNUNET_SERVER_Client *` to process more requests from
- */
-static void
-warn_no_receive_done (void *cls)
-{
- struct GNUNET_SERVER_Client *client = cls;
-
- GNUNET_break (0 != client->warn_type); /* type should never be 0 here, as
we don't use 0 */
- client->warn_task =
- GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
- &warn_no_receive_done, client);
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ (
- "Processing code for message of type %u did not call
`GNUNET_SERVER_receive_done' after %s\n"),
- (unsigned int) client->warn_type,
- GNUNET_STRINGS_relative_time_to_string (
- GNUNET_TIME_absolute_get_duration (client->warn_start),
- GNUNET_YES));
-}
-
-
-/**
- * Disable the warning the server issues if a message is not acknowledged
- * in a timely fashion. Use this call if a client is intentionally delayed
- * for a while. Only applies to the current message.
- *
- * @param client client for which to disable the warning
- */
-void
-GNUNET_SERVER_disable_receive_done_warning (struct GNUNET_SERVER_Client
*client)
-{
- if (NULL != client->warn_task)
- {
- GNUNET_SCHEDULER_cancel (client->warn_task);
- client->warn_task = NULL;
- }
-}
-
-
-/**
- * Inject a message into the server, pretend it came
- * from the specified client. Delivery of the message
- * will happen instantly (if a handler is installed;
- * otherwise the call does nothing).
- *
- * @param server the server receiving the message
- * @param sender the "pretended" sender of the message
- * can be NULL!
- * @param message message to transmit
- * @return #GNUNET_OK if the message was OK and the
- * connection can stay open
- * #GNUNET_SYSERR if the connection to the
- * client should be shut down
- */
-int
-GNUNET_SERVER_inject (struct GNUNET_SERVER_Handle *server,
- struct GNUNET_SERVER_Client *sender,
- const struct GNUNET_MessageHeader *message)
-{
- struct HandlerList *pos;
- const struct GNUNET_SERVER_MessageHandler *mh;
- unsigned int i;
- uint16_t type;
- uint16_t size;
- int found;
-
- type = ntohs (message->type);
- size = ntohs (message->size);
- LOG (GNUNET_ERROR_TYPE_INFO,
- "Received message of type %u and size %u from client\n",
- type, size);
- found = GNUNET_NO;
- for (pos = server->handlers; NULL != pos; pos = pos->next)
- {
- i = 0;
- while (pos->handlers[i].callback != NULL)
- {
- mh = &pos->handlers[i];
- if ((mh->type == type) || (mh->type == GNUNET_MESSAGE_TYPE_ALL))
- {
- if ((0 != mh->expected_size) && (mh->expected_size != size))
- {
-#if GNUNET8_NETWORK_IS_DEAD
- LOG (GNUNET_ERROR_TYPE_WARNING,
- "Expected %u bytes for message of type %u, got %u\n",
- mh->expected_size, mh->type, size);
- GNUNET_break_op (0);
-#else
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Expected %u bytes for message of type %u, got %u\n",
- mh->expected_size, mh->type, size);
-#endif
- return GNUNET_SYSERR;
- }
- if (NULL != sender)
- {
- if ((0 == sender->suspended) &&
- (NULL == sender->warn_task))
- {
- GNUNET_break (0 != type); /* type should never be 0 here,
as we don't use 0 */
- sender->warn_start = GNUNET_TIME_absolute_get ();
- sender->warn_task =
- GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
- &warn_no_receive_done,
- sender);
- sender->warn_type = type;
- }
- sender->suspended++;
- }
- mh->callback (mh->callback_cls, sender, message);
- found = GNUNET_YES;
- }
- i++;
- }
- }
- if (GNUNET_NO == found)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG | GNUNET_ERROR_TYPE_BULK,
- "Received message of unknown type %d\n", type);
- if (GNUNET_YES == server->require_found)
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * We are receiving an incoming message. Process it.
- *
- * @param cls our closure (handle for the client)
- * @param buf buffer with data received from network
- * @param available number of bytes available in buf
- * @param addr address of the sender
- * @param addrlen length of @a addr
- * @param errCode code indicating errors receiving, 0 for success
- */
-static void
-process_incoming (void *cls,
- const void *buf,
- size_t available,
- const struct sockaddr *addr,
- socklen_t addrlen,
- int errCode);
-
-
-/**
- * Process messages from the client's message tokenizer until either
- * the tokenizer is empty (and then schedule receiving more), or
- * until some handler is not immediately done (then wait for
restart_processing)
- * or shutdown.
- *
- * @param client the client to process, RC must have already been increased
- * using #GNUNET_SERVER_client_keep and will be decreased by one in this
- * function
- * @param ret #GNUNET_NO to start processing from the buffer,
- * #GNUNET_OK if the mst buffer is drained and we should instantly
go back to receiving
- * #GNUNET_SYSERR if we should instantly abort due to error in a
previous step
- */
-static void
-process_mst (struct GNUNET_SERVER_Client *client,
- int ret)
-{
- while ((GNUNET_SYSERR != ret) && (NULL != client->server) &&
- (GNUNET_YES != client->shutdown_now) && (0 == client->suspended))
- {
- if (GNUNET_OK == ret)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Server re-enters receive loop, timeout: %s.\n",
- GNUNET_STRINGS_relative_time_to_string (client->idle_timeout,
- GNUNET_YES));
- client->receive_pending = GNUNET_YES;
- if (GNUNET_OK !=
- GNUNET_CONNECTION_receive (client->connection,
- GNUNET_MAX_MESSAGE_SIZE - 1,
- client->idle_timeout,
- &process_incoming,
- client))
- return;
- break;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Server processes additional messages instantly.\n");
- if (NULL != client->server->mst_receive)
- ret =
- client->server->mst_receive (client->server->mst_cls, client->mst,
- client, NULL, 0, GNUNET_NO, GNUNET_YES);
- else
- ret =
- GNUNET_SERVER_mst_receive (client->mst, client, NULL, 0, GNUNET_NO,
- GNUNET_YES);
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Server leaves instant processing loop: ret = %d, server = %p, shutdown
= %d, suspended = %u\n",
- ret, client->server,
- client->shutdown_now,
- client->suspended);
- if (GNUNET_NO == ret)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Server has more data pending but is suspended.\n");
- client->receive_pending = GNUNET_SYSERR; /* data pending */
- }
- if ((GNUNET_SYSERR == ret) ||
- (GNUNET_YES == client->shutdown_now))
- GNUNET_SERVER_client_disconnect (client);
-}
-
-
-/**
- * We are receiving an incoming message. Process it.
- *
- * @param cls our closure (handle for the client)
- * @param buf buffer with data received from network
- * @param available number of bytes available in buf
- * @param addr address of the sender
- * @param addrlen length of @a addr
- * @param errCode code indicating errors receiving, 0 for success
- */
-static void
-process_incoming (void *cls,
- const void *buf,
- size_t available,
- const struct sockaddr *addr,
- socklen_t addrlen,
- int errCode)
-{
- struct GNUNET_SERVER_Client *client = cls;
- struct GNUNET_SERVER_Handle *server = client->server;
- struct GNUNET_TIME_Absolute end;
- struct GNUNET_TIME_Absolute now;
- int ret;
-
- GNUNET_assert (GNUNET_YES == client->receive_pending);
- client->receive_pending = GNUNET_NO;
- now = GNUNET_TIME_absolute_get ();
- end = GNUNET_TIME_absolute_add (client->last_activity,
- client->idle_timeout);
-
- if ((NULL == buf) &&
- (0 == available) &&
- (NULL == addr) &&
- (0 == errCode) &&
- (GNUNET_YES != client->shutdown_now) &&
- (NULL != server) &&
- (GNUNET_YES == GNUNET_CONNECTION_check (client->connection)) &&
- (end.abs_value_us > now.abs_value_us))
- {
- /* wait longer, timeout changed (i.e. due to us sending) */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Receive time out, but no disconnect due to sending (%p)\n",
- client);
- client->receive_pending = GNUNET_YES;
- GNUNET_CONNECTION_receive (client->connection,
- GNUNET_MAX_MESSAGE_SIZE - 1,
- GNUNET_TIME_absolute_get_remaining (end),
- &process_incoming,
- client);
- return;
- }
- if ((NULL == buf) ||
- (0 == available) ||
- (0 != errCode) ||
- (NULL == server) ||
- (GNUNET_YES == client->shutdown_now) ||
- (GNUNET_YES != GNUNET_CONNECTION_check (client->connection)))
- {
- /* other side closed connection, error connecting, etc. */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Failed to connect or other side closed connection (%p)\n",
- client);
- GNUNET_SERVER_client_disconnect (client);
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Server receives %u bytes from `%s'.\n",
- (unsigned int) available,
- GNUNET_a2s (addr, addrlen));
- GNUNET_SERVER_client_keep (client);
- client->last_activity = now;
-
- if (NULL != server->mst_receive)
- {
- ret = client->server->mst_receive (client->server->mst_cls,
- client->mst,
- client,
- buf,
- available,
- GNUNET_NO,
- GNUNET_YES);
- }
- else if (NULL != client->mst)
- {
- ret =
- GNUNET_SERVER_mst_receive (client->mst,
- client,
- buf,
- available,
- GNUNET_NO,
- GNUNET_YES);
- }
- else
- {
- GNUNET_break (0);
- return;
- }
- process_mst (client,
- ret);
- GNUNET_SERVER_client_drop (client);
-}
-
-
-/**
- * Task run to start again receiving from the network
- * and process requests.
- *
- * @param cls our `struct GNUNET_SERVER_Client *` to process more requests from
- */
-static void
-restart_processing (void *cls)
-{
- struct GNUNET_SERVER_Client *client = cls;
-
- GNUNET_assert (GNUNET_YES != client->shutdown_now);
- client->restart_task = NULL;
- if (GNUNET_NO == client->receive_pending)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Server begins to read again from
client.\n");
- client->receive_pending = GNUNET_YES;
- GNUNET_CONNECTION_receive (client->connection,
- GNUNET_MAX_MESSAGE_SIZE - 1,
- client->idle_timeout,
- &process_incoming,
- client);
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Server continues processing messages still in the buffer.\n");
- GNUNET_SERVER_client_keep (client);
- client->receive_pending = GNUNET_NO;
- process_mst (client,
- GNUNET_NO);
- GNUNET_SERVER_client_drop (client);
-}
-
-
-/**
- * This function is called whenever our inbound message tokenizer has
- * received a complete message.
- *
- * @param cls closure (struct GNUNET_SERVER_Handle)
- * @param client identification of the client (`struct GNUNET_SERVER_Client *`)
- * @param message the actual message
- *
- * @return #GNUNET_OK on success, #GNUNET_SYSERR to stop further processing
- */
-static int
-client_message_tokenizer_callback (void *cls,
- void *client,
- const struct GNUNET_MessageHeader *message)
-{
- struct GNUNET_SERVER_Handle *server = cls;
- struct GNUNET_SERVER_Client *sender = client;
- int ret;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Tokenizer gives server message of type %u and size %u from client\n",
- ntohs (message->type), ntohs (message->size));
- sender->in_process_client_buffer = GNUNET_YES;
- ret = GNUNET_SERVER_inject (server, sender, message);
- sender->in_process_client_buffer = GNUNET_NO;
- if ((GNUNET_OK != ret) || (GNUNET_YES == sender->shutdown_now))
- {
- GNUNET_SERVER_client_disconnect (sender);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Add a TCP socket-based connection to the set of handles managed by
- * this server. Use this function for outgoing (P2P) connections that
- * we initiated (and where this server should process incoming
- * messages).
- *
- * @param server the server to use
- * @param connection the connection to manage (client must
- * stop using this connection from now on)
- * @return the client handle
- */
-struct GNUNET_SERVER_Client *
-GNUNET_SERVER_connect_socket (struct GNUNET_SERVER_Handle *server,
- struct GNUNET_CONNECTION_Handle *connection)
-{
- struct GNUNET_SERVER_Client *client;
- struct NotifyList *n;
-
- client = GNUNET_new (struct GNUNET_SERVER_Client);
- client->connection = connection;
- client->server = server;
- client->last_activity = GNUNET_TIME_absolute_get ();
- client->idle_timeout = server->idle_timeout;
- GNUNET_CONTAINER_DLL_insert (server->clients_head,
- server->clients_tail,
- client);
- if (NULL != server->mst_create)
- client->mst =
- server->mst_create (server->mst_cls, client);
- else
- client->mst =
- GNUNET_SERVER_mst_create (&client_message_tokenizer_callback,
- server);
- GNUNET_assert (NULL != client->mst);
- for (n = server->connect_notify_list_head; NULL != n; n = n->next)
- n->callback (n->callback_cls, client);
- client->receive_pending = GNUNET_YES;
- if (GNUNET_SYSERR ==
- GNUNET_CONNECTION_receive (client->connection,
- GNUNET_MAX_MESSAGE_SIZE - 1,
- client->idle_timeout,
- &process_incoming,
- client))
- return NULL;
- return client;
-}
-
-
-/**
- * Change the timeout for a particular client. Decreasing the timeout
- * may not go into effect immediately (only after the previous timeout
- * times out or activity happens on the socket).
- *
- * @param client the client to update
- * @param timeout new timeout for activities on the socket
- */
-void
-GNUNET_SERVER_client_set_timeout (struct GNUNET_SERVER_Client *client,
- struct GNUNET_TIME_Relative timeout)
-{
- client->idle_timeout = timeout;
-}
-
-
-/**
- * Notify the server that the given client handle should
- * be kept (keeps the connection up if possible, increments
- * the internal reference counter).
- *
- * @param client the client to keep
- */
-void
-GNUNET_SERVER_client_keep (struct GNUNET_SERVER_Client *client)
-{
- client->reference_count++;
-}
-
-
-/**
- * Notify the server that the given client handle is no
- * longer required. Decrements the reference counter. If
- * that counter reaches zero an inactive connection maybe
- * closed.
- *
- * @param client the client to drop
- */
-void
-GNUNET_SERVER_client_drop (struct GNUNET_SERVER_Client *client)
-{
- GNUNET_assert (client->reference_count > 0);
- client->reference_count--;
- if ((GNUNET_YES == client->shutdown_now) && (0 == client->reference_count))
- GNUNET_SERVER_client_disconnect (client);
-}
-
-
-/**
- * Obtain the network address of the other party.
- *
- * @param client the client to get the address for
- * @param addr where to store the address
- * @param addrlen where to store the length of the @a addr
- * @return #GNUNET_OK on success
- */
-int
-GNUNET_SERVER_client_get_address (struct GNUNET_SERVER_Client *client,
- void **addr, size_t *addrlen)
-{
- return GNUNET_CONNECTION_get_address (client->connection, addr, addrlen);
-}
-
-
-/**
- * Ask the server to notify us whenever a client disconnects.
- * This function is called whenever the actual network connection
- * is closed; the reference count may be zero or larger than zero
- * at this point.
- *
- * @param server the server manageing the clients
- * @param callback function to call on disconnect
- * @param callback_cls closure for @a callback
- */
-void
-GNUNET_SERVER_disconnect_notify (struct GNUNET_SERVER_Handle *server,
- GNUNET_SERVER_DisconnectCallback callback,
- void *callback_cls)
-{
- struct NotifyList *n;
-
- n = GNUNET_new (struct NotifyList);
- n->callback = callback;
- n->callback_cls = callback_cls;
- GNUNET_CONTAINER_DLL_insert (server->disconnect_notify_list_head,
- server->disconnect_notify_list_tail,
- n);
-}
-
-
-/**
- * Ask the server to notify us whenever a client connects.
- * This function is called whenever the actual network connection
- * is opened. If the server is destroyed before this
- * notification is explicitly cancelled, the 'callback' will
- * once be called with a 'client' argument of NULL to indicate
- * that the server itself is now gone (and that the callback
- * won't be called anymore and also can no longer be cancelled).
- *
- * @param server the server manageing the clients
- * @param callback function to call on sconnect
- * @param callback_cls closure for @a callback
- */
-void
-GNUNET_SERVER_connect_notify (struct GNUNET_SERVER_Handle *server,
- GNUNET_SERVER_ConnectCallback callback,
- void *callback_cls)
-{
- struct NotifyList *n;
- struct GNUNET_SERVER_Client *client;
-
- n = GNUNET_new (struct NotifyList);
- n->callback = callback;
- n->callback_cls = callback_cls;
- GNUNET_CONTAINER_DLL_insert (server->connect_notify_list_head,
- server->connect_notify_list_tail,
- n);
- for (client = server->clients_head; NULL != client; client = client->next)
- callback (callback_cls, client);
-}
-
-
-/**
- * Ask the server to stop notifying us whenever a client connects.
- *
- * @param server the server manageing the clients
- * @param callback function to call on connect
- * @param callback_cls closure for @a callback
- */
-void
-GNUNET_SERVER_disconnect_notify_cancel (struct GNUNET_SERVER_Handle *server,
- GNUNET_SERVER_DisconnectCallback
- callback,
- void *callback_cls)
-{
- struct NotifyList *pos;
-
- for (pos = server->disconnect_notify_list_head; NULL != pos; pos = pos->next)
- if ((pos->callback == callback) && (pos->callback_cls == callback_cls))
- break;
- if (NULL == pos)
- {
- GNUNET_break (0);
- return;
- }
- GNUNET_CONTAINER_DLL_remove (server->disconnect_notify_list_head,
- server->disconnect_notify_list_tail,
- pos);
- GNUNET_free (pos);
-}
-
-
-/**
- * Ask the server to stop notifying us whenever a client disconnects.
- *
- * @param server the server manageing the clients
- * @param callback function to call on disconnect
- * @param callback_cls closure for @a callback
- */
-void
-GNUNET_SERVER_connect_notify_cancel (struct GNUNET_SERVER_Handle *server,
- GNUNET_SERVER_ConnectCallback callback,
- void *callback_cls)
-{
- struct NotifyList *pos;
-
- for (pos = server->connect_notify_list_head; NULL != pos; pos = pos->next)
- if ((pos->callback == callback) && (pos->callback_cls == callback_cls))
- break;
- if (NULL == pos)
- {
- GNUNET_break (0);
- return;
- }
- GNUNET_CONTAINER_DLL_remove (server->connect_notify_list_head,
- server->connect_notify_list_tail,
- pos);
- GNUNET_free (pos);
-}
-
-
-/**
- * Ask the server to disconnect from the given client.
- * This is the same as returning #GNUNET_SYSERR from a message
- * handler, except that it allows dropping of a client even
- * when not handling a message from that client.
- *
- * @param client the client to disconnect from
- */
-void
-GNUNET_SERVER_client_disconnect (struct GNUNET_SERVER_Client *client)
-{
- struct GNUNET_SERVER_Handle *server = client->server;
- struct NotifyList *n;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Client is being disconnected from the server.\n");
- if (NULL != client->restart_task)
- {
- GNUNET_SCHEDULER_cancel (client->restart_task);
- client->restart_task = NULL;
- }
- if (NULL != client->warn_task)
- {
- GNUNET_SCHEDULER_cancel (client->warn_task);
- client->warn_task = NULL;
- }
- if (GNUNET_YES == client->receive_pending)
- {
- GNUNET_CONNECTION_receive_cancel (client->connection);
- client->receive_pending = GNUNET_NO;
- }
- client->shutdown_now = GNUNET_YES;
- client->reference_count++; /* make sure nobody else clean up client... */
- if ((NULL != client->mst) &&
- (NULL != server))
- {
- GNUNET_CONTAINER_DLL_remove (server->clients_head,
- server->clients_tail,
- client);
- if (NULL != server->mst_destroy)
- server->mst_destroy (server->mst_cls,
- client->mst);
- else
- GNUNET_SERVER_mst_destroy (client->mst);
- client->mst = NULL;
- for (n = server->disconnect_notify_list_head; NULL != n; n = n->next)
- n->callback (n->callback_cls,
- client);
- }
- client->reference_count--;
- if (client->reference_count > 0)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "RC of %p still positive, not destroying everything.\n",
- client);
- client->server = NULL;
- return;
- }
- if (GNUNET_YES == client->in_process_client_buffer)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Still processing inputs of %p, not destroying everything.\n",
- client);
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "RC of %p now zero, destroying everything.\n",
- client);
- if (GNUNET_YES == client->persist)
- GNUNET_CONNECTION_persist_ (client->connection);
- if (NULL != client->th.cth)
- GNUNET_SERVER_notify_transmit_ready_cancel (&client->th);
- GNUNET_CONNECTION_destroy (client->connection);
- /* need to cancel again, as it might have been re-added
- in the meantime (i.e. during callbacks) */
- if (NULL != client->warn_task)
- {
- GNUNET_SCHEDULER_cancel (client->warn_task);
- client->warn_task = NULL;
- }
- if (GNUNET_YES == client->receive_pending)
- {
- GNUNET_CONNECTION_receive_cancel (client->connection);
- client->receive_pending = GNUNET_NO;
- }
- GNUNET_free (client);
- /* we might be in soft-shutdown, test if we're done */
- if (NULL != server)
- test_monitor_clients (server);
-}
-
-
-/**
- * Disable the "CORK" feature for communication with the given client,
- * forcing the OS to immediately flush the buffer on transmission
- * instead of potentially buffering multiple messages.
- *
- * @param client handle to the client
- * @return #GNUNET_OK on success
- */
-int
-GNUNET_SERVER_client_disable_corking (struct GNUNET_SERVER_Client *client)
-{
- return GNUNET_CONNECTION_disable_corking (client->connection);
-}
-
-
-/**
- * Wrapper for transmission notification that calls the original
- * callback and update the last activity time for our connection.
- *
- * @param cls the `struct GNUNET_SERVER_Client *`
- * @param size number of bytes we can transmit
- * @param buf where to copy the message
- * @return number of bytes actually transmitted
- */
-static size_t
-transmit_ready_callback_wrapper (void *cls, size_t size, void *buf)
-{
- struct GNUNET_SERVER_Client *client = cls;
- GNUNET_CONNECTION_TransmitReadyNotify callback;
-
- client->th.cth = NULL;
- callback = client->th.callback;
- client->th.callback = NULL;
- client->last_activity = GNUNET_TIME_absolute_get ();
- return callback (client->th.callback_cls, size, buf);
-}
-
-
-struct GNUNET_SERVER_TransmitHandle *
-GNUNET_SERVER_notify_transmit_ready (struct GNUNET_SERVER_Client *client,
- size_t size,
- struct GNUNET_TIME_Relative timeout,
- GNUNET_CONNECTION_TransmitReadyNotify
- callback,
- void *callback_cls)
-{
- if (NULL != client->th.callback)
- return NULL;
- client->th.callback_cls = callback_cls;
- client->th.callback = callback;
- client->th.cth = GNUNET_CONNECTION_notify_transmit_ready (client->connection,
- size,
- timeout,
- &
-
transmit_ready_callback_wrapper,
- client);
- return &client->th;
-}
-
-
-/**
- * Abort transmission request.
- *
- * @param th request to abort
- */
-void
-GNUNET_SERVER_notify_transmit_ready_cancel (struct
- GNUNET_SERVER_TransmitHandle *th)
-{
- GNUNET_CONNECTION_notify_transmit_ready_cancel (th->cth);
- th->cth = NULL;
- th->callback = NULL;
-}
-
-
-/**
- * Set the persistent flag on this client, used to setup client connection
- * to only be killed when the service it's connected to is actually dead.
- *
- * @param client the client to set the persistent flag on
- */
-void
-GNUNET_SERVER_client_persist_ (struct GNUNET_SERVER_Client *client)
-{
- client->persist = GNUNET_YES;
-}
-
-
-/**
- * Resume receiving from this client, we are done processing the
- * current request. This function must be called from within each
- * GNUNET_SERVER_MessageCallback (or its respective continuations).
- *
- * @param client client we were processing a message of
- * @param success #GNUNET_OK to keep the connection open and
- * continue to receive
- * #GNUNET_NO to close the connection (normal behavior)
- * #GNUNET_SYSERR to close the connection (signal
- * serious error)
- */
-void
-GNUNET_SERVER_receive_done (struct GNUNET_SERVER_Client *client,
- int success)
-{
- if (NULL == client)
- return;
- GNUNET_assert (client->suspended > 0);
- client->suspended--;
- if (GNUNET_OK != success)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "GNUNET_SERVER_receive_done called with failure indication\n");
- if ((client->reference_count > 0) || (client->suspended > 0))
- client->shutdown_now = GNUNET_YES;
- else
- GNUNET_SERVER_client_disconnect (client);
- return;
- }
- if (client->suspended > 0)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "GNUNET_SERVER_receive_done called, but more clients pending\n");
- return;
- }
- if (NULL != client->warn_task)
- {
- GNUNET_SCHEDULER_cancel (client->warn_task);
- client->warn_task = NULL;
- }
- if (GNUNET_YES == client->in_process_client_buffer)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "GNUNET_SERVER_receive_done called while still in processing loop\n");
- return;
- }
- if ((NULL == client->server) || (GNUNET_YES == client->shutdown_now))
- {
- GNUNET_SERVER_client_disconnect (client);
- return;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "GNUNET_SERVER_receive_done causes restart in reading from the
socket\n");
- GNUNET_assert (NULL == client->restart_task);
- client->restart_task = GNUNET_SCHEDULER_add_now (&restart_processing,
- client);
-}
-
-
-/* end of server.c */
diff --git a/src/transport/tcp_server_mst_legacy.c
b/src/transport/tcp_server_mst_legacy.c
deleted file mode 100644
index bed6874c9..000000000
--- a/src/transport/tcp_server_mst_legacy.c
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file util/server_mst.c
- * @brief convenience functions for handling inbound message buffers
- * @author Christian Grothoff
- */
-
-#include "platform.h"
-#include "gnunet_util_lib.h"
-
-
-#if HAVE_UNALIGNED_64_ACCESS
-#define ALIGN_FACTOR 4
-#else
-#define ALIGN_FACTOR 8
-#endif
-
-
-/**
- * Handle to a message stream tokenizer.
- */
-struct GNUNET_SERVER_MessageStreamTokenizer
-{
- /**
- * Function to call on completed messages.
- */
- GNUNET_SERVER_MessageTokenizerCallback cb;
-
- /**
- * Closure for @e cb.
- */
- void *cb_cls;
-
- /**
- * Size of the buffer (starting at @e hdr).
- */
- size_t curr_buf;
-
- /**
- * How many bytes in buffer have we already processed?
- */
- size_t off;
-
- /**
- * How many bytes in buffer are valid right now?
- */
- size_t pos;
-
- /**
- * Beginning of the buffer. Typed like this to force alignment.
- */
- struct GNUNET_MessageHeader *hdr;
-};
-
-
-/**
- * Create a message stream tokenizer.
- *
- * @param cb function to call on completed messages
- * @param cb_cls closure for @a cb
- * @return handle to tokenizer
- */
-struct GNUNET_SERVER_MessageStreamTokenizer *
-GNUNET_SERVER_mst_create (GNUNET_SERVER_MessageTokenizerCallback cb,
- void *cb_cls)
-{
- struct GNUNET_SERVER_MessageStreamTokenizer *ret;
-
- ret = GNUNET_new (struct GNUNET_SERVER_MessageStreamTokenizer);
- ret->hdr = GNUNET_malloc (GNUNET_MIN_MESSAGE_SIZE);
- ret->curr_buf = GNUNET_MIN_MESSAGE_SIZE;
- ret->cb = cb;
- ret->cb_cls = cb_cls;
- return ret;
-}
-
-
-/**
- * Add incoming data to the receive buffer and call the
- * callback for all complete messages.
- *
- * @param mst tokenizer to use
- * @param client_identity ID of client for which this is a buffer
- * @param buf input data to add
- * @param size number of bytes in @a buf
- * @param purge should any excess bytes in the buffer be discarded
- * (i.e. for packet-based services like UDP)
- * @param one_shot only call callback once, keep rest of message in buffer
- * @return #GNUNET_OK if we are done processing (need more data)
- * #GNUNET_NO if @a one_shot was set and we have another message ready
- * #GNUNET_SYSERR if the data stream is corrupt
- */
-int
-GNUNET_SERVER_mst_receive (struct GNUNET_SERVER_MessageStreamTokenizer *mst,
- void *client_identity,
- const char *buf, size_t size,
- int purge, int one_shot)
-{
- const struct GNUNET_MessageHeader *hdr;
- size_t delta;
- uint16_t want;
- char *ibuf;
- int need_align;
- unsigned long offset;
- int ret;
-
- GNUNET_assert (mst->off <= mst->pos);
- GNUNET_assert (mst->pos <= mst->curr_buf);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Server-mst receives %u bytes with %u bytes already in private
buffer\n",
- (unsigned int) size, (unsigned int) (mst->pos - mst->off));
- ret = GNUNET_OK;
- ibuf = (char *) mst->hdr;
- while (mst->pos > 0)
- {
-do_align:
- GNUNET_assert (mst->pos >= mst->off);
- if ((mst->curr_buf - mst->off < sizeof(struct GNUNET_MessageHeader)) ||
- (0 != (mst->off % ALIGN_FACTOR)))
- {
- /* need to align or need more space */
- mst->pos -= mst->off;
- memmove (ibuf, &ibuf[mst->off], mst->pos);
- mst->off = 0;
- }
- if (mst->pos - mst->off < sizeof(struct GNUNET_MessageHeader))
- {
- delta =
- GNUNET_MIN (sizeof(struct GNUNET_MessageHeader)
- - (mst->pos - mst->off), size);
- GNUNET_memcpy (&ibuf[mst->pos], buf, delta);
- mst->pos += delta;
- buf += delta;
- size -= delta;
- }
- if (mst->pos - mst->off < sizeof(struct GNUNET_MessageHeader))
- {
- if (purge)
- {
- mst->off = 0;
- mst->pos = 0;
- }
- return GNUNET_OK;
- }
- hdr = (const struct GNUNET_MessageHeader *) &ibuf[mst->off];
- want = ntohs (hdr->size);
- if (want < sizeof(struct GNUNET_MessageHeader))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- if ((mst->curr_buf - mst->off < want) &&
- (mst->off > 0))
- {
- /* can get more space by moving */
- mst->pos -= mst->off;
- memmove (ibuf, &ibuf[mst->off], mst->pos);
- mst->off = 0;
- }
- if (mst->curr_buf < want)
- {
- /* need to get more space by growing buffer */
- GNUNET_assert (0 == mst->off);
- mst->hdr = GNUNET_realloc (mst->hdr, want);
- ibuf = (char *) mst->hdr;
- mst->curr_buf = want;
- }
- hdr = (const struct GNUNET_MessageHeader *) &ibuf[mst->off];
- if (mst->pos - mst->off < want)
- {
- delta = GNUNET_MIN (want - (mst->pos - mst->off), size);
- GNUNET_assert (mst->pos + delta <= mst->curr_buf);
- GNUNET_memcpy (&ibuf[mst->pos], buf, delta);
- mst->pos += delta;
- buf += delta;
- size -= delta;
- }
- if (mst->pos - mst->off < want)
- {
- if (purge)
- {
- mst->off = 0;
- mst->pos = 0;
- }
- return GNUNET_OK;
- }
- if (one_shot == GNUNET_SYSERR)
- {
- /* cannot call callback again, but return value saying that
- * we have another full message in the buffer */
- ret = GNUNET_NO;
- goto copy;
- }
- if (one_shot == GNUNET_YES)
- one_shot = GNUNET_SYSERR;
- mst->off += want;
- if (GNUNET_SYSERR == mst->cb (mst->cb_cls, client_identity, hdr))
- return GNUNET_SYSERR;
- if (mst->off == mst->pos)
- {
- /* reset to beginning of buffer, it's free right now! */
- mst->off = 0;
- mst->pos = 0;
- }
- }
- GNUNET_assert (0 == mst->pos);
- while (size > 0)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Server-mst has %u bytes left in inbound buffer\n",
- (unsigned int) size);
- if (size < sizeof(struct GNUNET_MessageHeader))
- break;
- offset = (unsigned long) buf;
- need_align = (0 != (offset % ALIGN_FACTOR)) ? GNUNET_YES : GNUNET_NO;
- if (GNUNET_NO == need_align)
- {
- /* can try to do zero-copy and process directly from original buffer */
- hdr = (const struct GNUNET_MessageHeader *) buf;
- want = ntohs (hdr->size);
- if (want < sizeof(struct GNUNET_MessageHeader))
- {
- GNUNET_break_op (0);
- mst->off = 0;
- return GNUNET_SYSERR;
- }
- if (size < want)
- break; /* or not: buffer incomplete, so copy to
private buffer... */
- if (one_shot == GNUNET_SYSERR)
- {
- /* cannot call callback again, but return value saying that
- * we have another full message in the buffer */
- ret = GNUNET_NO;
- goto copy;
- }
- if (one_shot == GNUNET_YES)
- one_shot = GNUNET_SYSERR;
- if (GNUNET_SYSERR == mst->cb (mst->cb_cls, client_identity, hdr))
- return GNUNET_SYSERR;
- buf += want;
- size -= want;
- }
- else
- {
- /* need to copy to private buffer to align;
- * yes, we go a bit more spaghetti than usual here */
- goto do_align;
- }
- }
-copy:
- if ((size > 0) && (! purge))
- {
- if (size + mst->pos > mst->curr_buf)
- {
- mst->hdr = GNUNET_realloc (mst->hdr, size + mst->pos);
- ibuf = (char *) mst->hdr;
- mst->curr_buf = size + mst->pos;
- }
- GNUNET_assert (size + mst->pos <= mst->curr_buf);
- GNUNET_memcpy (&ibuf[mst->pos], buf, size);
- mst->pos += size;
- }
- if (purge)
- {
- mst->off = 0;
- mst->pos = 0;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Server-mst leaves %u bytes in private buffer\n",
- (unsigned int) (mst->pos - mst->off));
- return ret;
-}
-
-
-/**
- * Destroys a tokenizer.
- *
- * @param mst tokenizer to destroy
- */
-void
-GNUNET_SERVER_mst_destroy (struct GNUNET_SERVER_MessageStreamTokenizer *mst)
-{
- GNUNET_free (mst->hdr);
- GNUNET_free (mst);
-}
-
-
-/* end of server_mst.c */
diff --git a/src/transport/tcp_service_legacy.c
b/src/transport/tcp_service_legacy.c
deleted file mode 100644
index 65b090187..000000000
--- a/src/transport/tcp_service_legacy.c
+++ /dev/null
@@ -1,1646 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009, 2012 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file util/service.c
- * @brief functions related to starting services
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_constants.h"
-#include "gnunet_resolver_service.h"
-
-#if HAVE_MALLINFO2
-#include <malloc.h>
-#include "gauger.h"
-#endif
-
-
-/* ******************* access control ******************** */
-
-/**
- * Check if the given IP address is in the list of IP addresses.
- *
- * @param list a list of networks
- * @param add the IP to check (in network byte order)
- * @return #GNUNET_NO if the IP is not in the list, #GNUNET_YES if it it is
- */
-static int
-check_ipv4_listed (const struct GNUNET_STRINGS_IPv4NetworkPolicy *list,
- const struct in_addr *add)
-{
- unsigned int i;
-
- if (NULL == list)
- return GNUNET_NO;
- i = 0;
- while ((list[i].network.s_addr != 0) || (list[i].netmask.s_addr != 0))
- {
- if ((add->s_addr & list[i].netmask.s_addr) ==
- (list[i].network.s_addr & list[i].netmask.s_addr))
- return GNUNET_YES;
- i++;
- }
- return GNUNET_NO;
-}
-
-
-/**
- * Check if the given IP address is in the list of IP addresses.
- *
- * @param list a list of networks
- * @param ip the IP to check (in network byte order)
- * @return #GNUNET_NO if the IP is not in the list, #GNUNET_YES if it it is
- */
-static int
-check_ipv6_listed (const struct GNUNET_STRINGS_IPv6NetworkPolicy *list,
- const struct in6_addr *ip)
-{
- unsigned int i;
- unsigned int j;
- struct in6_addr zero;
-
- if (NULL == list)
- return GNUNET_NO;
- memset (&zero, 0, sizeof(struct in6_addr));
- i = 0;
-NEXT:
- while (0 != memcmp (&zero, &list[i].network, sizeof(struct in6_addr)))
- {
- for (j = 0; j < sizeof(struct in6_addr) / sizeof(int); j++)
- if (((((int *) ip)[j] & ((int *) &list[i].netmask)[j])) !=
- (((int *) &list[i].network)[j] & ((int *) &list[i].netmask)[j]))
- {
- i++;
- goto NEXT;
- }
- return GNUNET_YES;
- }
- return GNUNET_NO;
-}
-
-
-/* ****************** service struct ****************** */
-
-
-/**
- * Context for "service_task".
- */
-struct LEGACY_SERVICE_Context
-{
- /**
- * Our configuration.
- */
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * Handle for the server.
- */
- struct GNUNET_SERVER_Handle *server;
-
- /**
- * NULL-terminated array of addresses to bind to, NULL if we got pre-bound
- * listen sockets.
- */
- struct sockaddr **addrs;
-
- /**
- * Name of our service.
- */
- const char *service_name;
-
- /**
- * Main service-specific task to run.
- */
- LEGACY_SERVICE_Main task;
-
- /**
- * Closure for @e task.
- */
- void *task_cls;
-
- /**
- * IPv4 addresses that are not allowed to connect.
- */
- struct GNUNET_STRINGS_IPv4NetworkPolicy *v4_denied;
-
- /**
- * IPv6 addresses that are not allowed to connect.
- */
- struct GNUNET_STRINGS_IPv6NetworkPolicy *v6_denied;
-
- /**
- * IPv4 addresses that are allowed to connect (if not
- * set, all are allowed).
- */
- struct GNUNET_STRINGS_IPv4NetworkPolicy *v4_allowed;
-
- /**
- * IPv6 addresses that are allowed to connect (if not
- * set, all are allowed).
- */
- struct GNUNET_STRINGS_IPv6NetworkPolicy *v6_allowed;
-
- /**
- * My (default) message handlers. Adjusted copy
- * of "defhandlers".
- */
- struct GNUNET_SERVER_MessageHandler *my_handlers;
-
- /**
- * Array of the lengths of the entries in addrs.
- */
- socklen_t *addrlens;
-
- /**
- * NULL-terminated array of listen sockets we should take over.
- */
- struct GNUNET_NETWORK_Handle **lsocks;
-
- /**
- * Task ID of the shutdown task.
- */
- struct GNUNET_SCHEDULER_Task *shutdown_task;
-
- /**
- * Idle timeout for server.
- */
- struct GNUNET_TIME_Relative timeout;
-
- /**
- * Overall success/failure of the service start.
- */
- int ret;
-
- /**
- * If we are daemonizing, this FD is set to the
- * pipe to the parent. Send '.' if we started
- * ok, '!' if not. -1 if we are not daemonizing.
- */
- int ready_confirm_fd;
-
- /**
- * Do we close connections if we receive messages
- * for which we have no handler?
- */
- int require_found;
-
- /**
- * Do we require a matching UID for UNIX domain socket connections?
- * #GNUNET_NO means that the UID does not have to match (however,
- * @e match_gid may still impose other access control checks).
- */
- int match_uid;
-
- /**
- * Do we require a matching GID for UNIX domain socket connections?
- * Ignored if @e match_uid is #GNUNET_YES. Note that this is about
- * checking that the client's UID is in our group OR that the
- * client's GID is our GID. If both "match_gid" and @e match_uid are
- * #GNUNET_NO, all users on the local system have access.
- */
- int match_gid;
-
- /**
- * Our options.
- */
- enum LEGACY_SERVICE_Options options;
-};
-
-
-/* ****************** message handlers ****************** */
-
-/**
- * Send a 'TEST' message back to the client.
- *
- * @param cls the 'struct GNUNET_SERVER_Client' to send TEST to
- * @param size number of bytes available in 'buf'
- * @param buf where to copy the message
- * @return number of bytes written to 'buf'
- */
-static size_t
-write_test (void *cls, size_t size, void *buf)
-{
- struct GNUNET_SERVER_Client *client = cls;
- struct GNUNET_MessageHeader *msg;
-
- if (size < sizeof(struct GNUNET_MessageHeader))
- {
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return 0; /* client disconnected */
- }
- msg = (struct GNUNET_MessageHeader *) buf;
- msg->type = htons (GNUNET_MESSAGE_TYPE_TEST);
- msg->size = htons (sizeof(struct GNUNET_MessageHeader));
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
- return sizeof(struct GNUNET_MessageHeader);
-}
-
-
-/**
- * Handler for TEST message.
- *
- * @param cls closure (refers to service)
- * @param client identification of the client
- * @param message the actual message
- */
-static void
-handle_test (void *cls,
- struct GNUNET_SERVER_Client *client,
- const struct GNUNET_MessageHeader *message)
-{
- /* simply bounce message back to acknowledge */
- if (NULL ==
- GNUNET_SERVER_notify_transmit_ready (client,
- sizeof(struct GNUNET_MessageHeader),
- GNUNET_TIME_UNIT_FOREVER_REL,
- &write_test,
- client))
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
-}
-
-
-/**
- * Default handlers for all services. Will be copied and the
- * "callback_cls" fields will be replaced with the specific service
- * struct.
- */
-static const struct GNUNET_SERVER_MessageHandler defhandlers[] =
-{ { &handle_test,
- NULL,
- GNUNET_MESSAGE_TYPE_TEST,
- sizeof(struct GNUNET_MessageHeader) },
- { NULL, NULL, 0, 0 } };
-
-
-/* ****************** service core routines ************** */
-
-
-/**
- * Check if access to the service is allowed from the given address.
- *
- * @param cls closure
- * @param uc credentials, if available, otherwise NULL
- * @param addr address
- * @param addrlen length of address
- * @return #GNUNET_YES to allow, #GNUNET_NO to deny, #GNUNET_SYSERR
- * for unknown address family (will be denied).
- */
-static int
-check_access (void *cls,
- const struct GNUNET_CONNECTION_Credentials *uc,
- const struct sockaddr *addr,
- socklen_t addrlen)
-{
- struct LEGACY_SERVICE_Context *sctx = cls;
- const struct sockaddr_in *i4;
- const struct sockaddr_in6 *i6;
- int ret;
-
- switch (addr->sa_family)
- {
- case AF_INET:
- GNUNET_assert (addrlen == sizeof(struct sockaddr_in));
- i4 = (const struct sockaddr_in *) addr;
- ret = ((NULL == sctx->v4_allowed) ||
- (check_ipv4_listed (sctx->v4_allowed, &i4->sin_addr))) &&
- ((NULL == sctx->v4_denied) ||
- (! check_ipv4_listed (sctx->v4_denied, &i4->sin_addr)));
- break;
-
- case AF_INET6:
- GNUNET_assert (addrlen == sizeof(struct sockaddr_in6));
- i6 = (const struct sockaddr_in6 *) addr;
- ret = ((NULL == sctx->v6_allowed) ||
- (check_ipv6_listed (sctx->v6_allowed, &i6->sin6_addr))) &&
- ((NULL == sctx->v6_denied) ||
- (! check_ipv6_listed (sctx->v6_denied, &i6->sin6_addr)));
- break;
-
- case AF_UNIX:
- ret = GNUNET_OK; /* controlled using file-system ACL now */
- break;
-
- default:
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ ("Unknown address family %d\n"),
- addr->sa_family);
- return GNUNET_SYSERR;
- }
- if (GNUNET_OK != ret)
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ ("Access from `%s' denied to service `%s'\n"),
- GNUNET_a2s (addr, addrlen),
- sctx->service_name);
- }
- return ret;
-}
-
-
-/**
- * Get the name of the file where we will
- * write the PID of the service.
- *
- * @param sctx service context
- * @return name of the file for the process ID
- */
-static char *
-get_pid_file_name (struct LEGACY_SERVICE_Context *sctx)
-{
- char *pif;
-
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (sctx->cfg,
- sctx->service_name,
- "PIDFILE",
- &pif))
- return NULL;
- return pif;
-}
-
-
-/**
- * Parse an IPv4 access control list.
- *
- * @param ret location where to write the ACL (set)
- * @param sctx service context to use to get the configuration
- * @param option name of the ACL option to parse
- * @return #GNUNET_SYSERR on parse error, #GNUNET_OK on success (including
- * no ACL configured)
- */
-static int
-process_acl4 (struct GNUNET_STRINGS_IPv4NetworkPolicy **ret,
- struct LEGACY_SERVICE_Context *sctx,
- const char *option)
-{
- char *opt;
-
- if (! GNUNET_CONFIGURATION_have_value (sctx->cfg, sctx->service_name,
option))
- {
- *ret = NULL;
- return GNUNET_OK;
- }
- GNUNET_break (GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_string (sctx->cfg,
- sctx->service_name,
- option,
- &opt));
- if (NULL == (*ret = GNUNET_STRINGS_parse_ipv4_policy (opt)))
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ ("Could not parse IPv4 network specification `%s' for `%s:%s'\n"),
- opt,
- sctx->service_name,
- option);
- GNUNET_free (opt);
- return GNUNET_SYSERR;
- }
- GNUNET_free (opt);
- return GNUNET_OK;
-}
-
-
-/**
- * Parse an IPv6 access control list.
- *
- * @param ret location where to write the ACL (set)
- * @param sctx service context to use to get the configuration
- * @param option name of the ACL option to parse
- * @return #GNUNET_SYSERR on parse error, #GNUNET_OK on success (including
- * no ACL configured)
- */
-static int
-process_acl6 (struct GNUNET_STRINGS_IPv6NetworkPolicy **ret,
- struct LEGACY_SERVICE_Context *sctx,
- const char *option)
-{
- char *opt;
-
- if (! GNUNET_CONFIGURATION_have_value (sctx->cfg, sctx->service_name,
option))
- {
- *ret = NULL;
- return GNUNET_OK;
- }
- GNUNET_break (GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_string (sctx->cfg,
- sctx->service_name,
- option,
- &opt));
- if (NULL == (*ret = GNUNET_STRINGS_parse_ipv6_policy (opt)))
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ ("Could not parse IPv6 network specification `%s' for `%s:%s'\n"),
- opt,
- sctx->service_name,
- option);
- GNUNET_free (opt);
- return GNUNET_SYSERR;
- }
- GNUNET_free (opt);
- return GNUNET_OK;
-}
-
-
-/**
- * Add the given UNIX domain path as an address to the
- * list (as the first entry).
- *
- * @param saddrs array to update
- * @param saddrlens where to store the address length
- * @param unixpath path to add
- * @param abstract #GNUNET_YES to add an abstract UNIX domain socket. This
- * parameter is ignore on systems other than LINUX
- */
-static void
-add_unixpath (struct sockaddr **saddrs,
- socklen_t *saddrlens,
- const char *unixpath,
- int abstract)
-{
-#ifdef AF_UNIX
- struct sockaddr_un *un;
-
- un = GNUNET_new (struct sockaddr_un);
- un->sun_family = AF_UNIX;
- GNUNET_strlcpy (un->sun_path, unixpath, sizeof(un->sun_path));
-#ifdef __linux__
- if (GNUNET_YES == abstract)
- un->sun_path[0] = '\0';
-#endif
-#if HAVE_SOCKADDR_UN_SUN_LEN
- un->sun_len = (u_char) sizeof(struct sockaddr_un);
-#endif
- *saddrs = (struct sockaddr *) un;
- *saddrlens = sizeof(struct sockaddr_un);
-#else
- /* this function should never be called
- * unless AF_UNIX is defined! */
- GNUNET_assert (0);
-#endif
-}
-
-
-/**
- * Get the list of addresses that a server for the given service
- * should bind to.
- *
- * @param service_name name of the service
- * @param cfg configuration (which specifies the addresses)
- * @param addrs set (call by reference) to an array of pointers to the
- * addresses the server should bind to and listen on; the
- * array will be NULL-terminated (on success)
- * @param addr_lens set (call by reference) to an array of the lengths
- * of the respective `struct sockaddr` struct in the @a addrs
- * array (on success)
- * @return number of addresses found on success,
- * #GNUNET_SYSERR if the configuration
- * did not specify reasonable finding information or
- * if it specified a hostname that could not be resolved;
- * #GNUNET_NO if the number of addresses configured is
- * zero (in this case, `*addrs` and `*addr_lens` will be
- * set to NULL).
- */
-int
-LEGACY_SERVICE_get_server_addresses (
- const char *service_name,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- struct sockaddr ***addrs,
- socklen_t **addr_lens)
-{
- int disablev6;
- struct GNUNET_NETWORK_Handle *desc;
- unsigned long long port;
- char *unixpath;
- struct addrinfo hints;
- struct addrinfo *res;
- struct addrinfo *pos;
- struct addrinfo *next;
- unsigned int i;
- int resi;
- int ret;
- int abstract;
- struct sockaddr **saddrs;
- socklen_t *saddrlens;
- char *hostname;
-
- *addrs = NULL;
- *addr_lens = NULL;
- desc = NULL;
- if (GNUNET_CONFIGURATION_have_value (cfg, service_name, "DISABLEV6"))
- {
- if (GNUNET_SYSERR ==
- (disablev6 = GNUNET_CONFIGURATION_get_value_yesno (cfg,
- service_name,
- "DISABLEV6")))
- return GNUNET_SYSERR;
- }
- else
- disablev6 = GNUNET_NO;
-
- if (! disablev6)
- {
- /* probe IPv6 support */
- desc = GNUNET_NETWORK_socket_create (PF_INET6, SOCK_STREAM, 0);
- if (NULL == desc)
- {
- if ((ENOBUFS == errno) || (ENOMEM == errno) || (ENFILE == errno) ||
- (EACCES == errno))
- {
- LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "socket");
- return GNUNET_SYSERR;
- }
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ (
- "Disabling IPv6 support for service `%s', failed to create IPv6
socket: %s\n"),
- service_name,
- strerror (errno));
- disablev6 = GNUNET_YES;
- }
- else
- {
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (desc));
- desc = NULL;
- }
- }
-
- port = 0;
- if (GNUNET_CONFIGURATION_have_value (cfg, service_name, "PORT"))
- {
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (cfg,
- service_name,
- "PORT",
- &port))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Require valid port number for service `%s' in
configuration!\n"),
- service_name);
- }
- if (port > 65535)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Require valid port number for service `%s' in
configuration!\n"),
- service_name);
- return GNUNET_SYSERR;
- }
- }
-
- if (GNUNET_CONFIGURATION_have_value (cfg, service_name, "BINDTO"))
- {
- GNUNET_break (GNUNET_OK ==
- GNUNET_CONFIGURATION_get_value_string (cfg,
- service_name,
- "BINDTO",
- &hostname));
- }
- else
- hostname = NULL;
-
- unixpath = NULL;
- abstract = GNUNET_NO;
-#ifdef AF_UNIX
- if ((GNUNET_YES ==
- GNUNET_CONFIGURATION_have_value (cfg, service_name, "UNIXPATH")) &&
- (GNUNET_OK == GNUNET_CONFIGURATION_get_value_filename (cfg,
- service_name,
- "UNIXPATH",
- &unixpath)) &&
- (0 < strlen (unixpath)))
- {
- /* probe UNIX support */
- struct sockaddr_un s_un;
-
- if (strlen (unixpath) >= sizeof(s_un.sun_path))
- {
- LOG (GNUNET_ERROR_TYPE_WARNING,
- _ ("UNIXPATH `%s' too long, maximum length is %llu\n"),
- unixpath,
- (unsigned long long) sizeof(s_un.sun_path));
- unixpath = GNUNET_NETWORK_shorten_unixpath (unixpath);
- LOG (GNUNET_ERROR_TYPE_INFO, _ ("Using `%s' instead\n"), unixpath);
- }
-#ifdef __linux__
- abstract = GNUNET_CONFIGURATION_get_value_yesno (cfg,
- "TESTING",
- "USE_ABSTRACT_SOCKETS");
- if (GNUNET_SYSERR == abstract)
- abstract = GNUNET_NO;
-#endif
- if ((GNUNET_YES != abstract) &&
- (GNUNET_OK != GNUNET_DISK_directory_create_for_file (unixpath)))
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "mkdir", unixpath);
- }
- if (NULL != unixpath)
- {
- desc = GNUNET_NETWORK_socket_create (AF_UNIX, SOCK_STREAM, 0);
- if (NULL == desc)
- {
- if ((ENOBUFS == errno) || (ENOMEM == errno) || (ENFILE == errno) ||
- (EACCES == errno))
- {
- LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "socket");
- GNUNET_free (hostname);
- GNUNET_free (unixpath);
- return GNUNET_SYSERR;
- }
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ (
- "Disabling UNIX domain socket support for service `%s', failed to
create UNIX domain socket: %s\n"),
- service_name,
- strerror (errno));
- GNUNET_free (unixpath);
- unixpath = NULL;
- }
- else
- {
- GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (desc));
- desc = NULL;
- }
- }
-#endif
-
- if ((0 == port) && (NULL == unixpath))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ (
- "Have neither PORT nor UNIXPATH for service `%s', but one is
required\n"),
- service_name);
- GNUNET_free (hostname);
- return GNUNET_SYSERR;
- }
- if (0 == port)
- {
- saddrs = GNUNET_malloc (2 * sizeof(struct sockaddr *));
- saddrlens = GNUNET_malloc (2 * sizeof(socklen_t));
- add_unixpath (saddrs, saddrlens, unixpath, abstract);
- GNUNET_free (unixpath);
- GNUNET_free (hostname);
- *addrs = saddrs;
- *addr_lens = saddrlens;
- return 1;
- }
-
- if (NULL != hostname)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Resolving `%s' since that is where `%s' will bind to.\n",
- hostname,
- service_name);
- memset (&hints, 0, sizeof(struct addrinfo));
- if (disablev6)
- hints.ai_family = AF_INET;
- hints.ai_protocol = IPPROTO_TCP;
- if ((0 != (ret = getaddrinfo (hostname, NULL, &hints, &res))) ||
- (NULL == res))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to resolve `%s': %s\n"),
- hostname,
- gai_strerror (ret));
- GNUNET_free (hostname);
- GNUNET_free (unixpath);
- return GNUNET_SYSERR;
- }
- next = res;
- i = 0;
- while (NULL != (pos = next))
- {
- next = pos->ai_next;
- if ((disablev6) && (pos->ai_family == AF_INET6))
- continue;
- i++;
- }
- if (0 == i)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to find %saddress for `%s'.\n"),
- disablev6 ? "IPv4 " : "",
- hostname);
- freeaddrinfo (res);
- GNUNET_free (hostname);
- GNUNET_free (unixpath);
- return GNUNET_SYSERR;
- }
- resi = i;
- if (NULL != unixpath)
- resi++;
- saddrs = GNUNET_malloc ((resi + 1) * sizeof(struct sockaddr *));
- saddrlens = GNUNET_malloc ((resi + 1) * sizeof(socklen_t));
- i = 0;
- if (NULL != unixpath)
- {
- add_unixpath (saddrs, saddrlens, unixpath, abstract);
- i++;
- }
- next = res;
- while (NULL != (pos = next))
- {
- next = pos->ai_next;
- if ((disablev6) && (AF_INET6 == pos->ai_family))
- continue;
- if ((IPPROTO_TCP != pos->ai_protocol) && (0 != pos->ai_protocol))
- continue; /* not TCP */
- if ((SOCK_STREAM != pos->ai_socktype) && (0 != pos->ai_socktype))
- continue; /* huh? */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Service `%s' will bind to `%s'\n",
- service_name,
- GNUNET_a2s (pos->ai_addr, pos->ai_addrlen));
- if (AF_INET == pos->ai_family)
- {
- GNUNET_assert (sizeof(struct sockaddr_in) == pos->ai_addrlen);
- saddrlens[i] = pos->ai_addrlen;
- saddrs[i] = GNUNET_malloc (saddrlens[i]);
- GNUNET_memcpy (saddrs[i], pos->ai_addr, saddrlens[i]);
- ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
- }
- else
- {
- GNUNET_assert (AF_INET6 == pos->ai_family);
- GNUNET_assert (sizeof(struct sockaddr_in6) == pos->ai_addrlen);
- saddrlens[i] = pos->ai_addrlen;
- saddrs[i] = GNUNET_malloc (saddrlens[i]);
- GNUNET_memcpy (saddrs[i], pos->ai_addr, saddrlens[i]);
- ((struct sockaddr_in6 *) saddrs[i])->sin6_port = htons (port);
- }
- i++;
- }
- GNUNET_free (hostname);
- freeaddrinfo (res);
- resi = i;
- }
- else
- {
- /* will bind against everything, just set port */
- if (disablev6)
- {
- /* V4-only */
- resi = 1;
- if (NULL != unixpath)
- resi++;
- i = 0;
- saddrs = GNUNET_malloc ((resi + 1) * sizeof(struct sockaddr *));
- saddrlens = GNUNET_malloc ((resi + 1) * sizeof(socklen_t));
- if (NULL != unixpath)
- {
- add_unixpath (saddrs, saddrlens, unixpath, abstract);
- i++;
- }
- saddrlens[i] = sizeof(struct sockaddr_in);
- saddrs[i] = GNUNET_malloc (saddrlens[i]);
-#if HAVE_SOCKADDR_IN_SIN_LEN
- ((struct sockaddr_in *) saddrs[i])->sin_len = saddrlens[i];
-#endif
- ((struct sockaddr_in *) saddrs[i])->sin_family = AF_INET;
- ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
- }
- else
- {
- /* dual stack */
- resi = 2;
- if (NULL != unixpath)
- resi++;
- saddrs = GNUNET_malloc ((resi + 1) * sizeof(struct sockaddr *));
- saddrlens = GNUNET_malloc ((resi + 1) * sizeof(socklen_t));
- i = 0;
- if (NULL != unixpath)
- {
- add_unixpath (saddrs, saddrlens, unixpath, abstract);
- i++;
- }
- saddrlens[i] = sizeof(struct sockaddr_in6);
- saddrs[i] = GNUNET_malloc (saddrlens[i]);
-#if HAVE_SOCKADDR_IN_SIN_LEN
- ((struct sockaddr_in6 *) saddrs[i])->sin6_len = saddrlens[0];
-#endif
- ((struct sockaddr_in6 *) saddrs[i])->sin6_family = AF_INET6;
- ((struct sockaddr_in6 *) saddrs[i])->sin6_port = htons (port);
- i++;
- saddrlens[i] = sizeof(struct sockaddr_in);
- saddrs[i] = GNUNET_malloc (saddrlens[i]);
-#if HAVE_SOCKADDR_IN_SIN_LEN
- ((struct sockaddr_in *) saddrs[i])->sin_len = saddrlens[1];
-#endif
- ((struct sockaddr_in *) saddrs[i])->sin_family = AF_INET;
- ((struct sockaddr_in *) saddrs[i])->sin_port = htons (port);
- }
- }
- GNUNET_free (unixpath);
- *addrs = saddrs;
- *addr_lens = saddrlens;
- return resi;
-}
-
-
-/**
- * Setup addr, addrlen, idle_timeout
- * based on configuration!
- *
- * Configuration may specify:
- * - PORT (where to bind to for TCP)
- * - UNIXPATH (where to bind to for UNIX domain sockets)
- * - TIMEOUT (after how many ms does an inactive service timeout);
- * - DISABLEV6 (disable support for IPv6, otherwise we use dual-stack)
- * - BINDTO (hostname or IP address to bind to, otherwise we take everything)
- * - ACCEPT_FROM (only allow connections from specified IPv4 subnets)
- * - ACCEPT_FROM6 (only allow connections from specified IPv6 subnets)
- * - REJECT_FROM (disallow allow connections from specified IPv4 subnets)
- * - REJECT_FROM6 (disallow allow connections from specified IPv6 subnets)
- *
- * @param sctx service context to initialize
- * @return #GNUNET_OK if configuration succeeded
- */
-static int
-setup_service (struct LEGACY_SERVICE_Context *sctx)
-{
- struct GNUNET_TIME_Relative idleout;
- int tolerant;
- const char *nfds;
- unsigned int cnt;
- int flags;
-
- if (GNUNET_CONFIGURATION_have_value (sctx->cfg,
- sctx->service_name,
- "TIMEOUT"))
- {
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_time (sctx->cfg,
- sctx->service_name,
- "TIMEOUT",
- &idleout))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Specified value for `%s' of service `%s' is invalid\n"),
- "TIMEOUT",
- sctx->service_name);
- return GNUNET_SYSERR;
- }
- sctx->timeout = idleout;
- }
- else
- sctx->timeout = GNUNET_TIME_UNIT_FOREVER_REL;
-
- if (GNUNET_CONFIGURATION_have_value (sctx->cfg,
- sctx->service_name,
- "TOLERANT"))
- {
- if (GNUNET_SYSERR ==
- (tolerant = GNUNET_CONFIGURATION_get_value_yesno (sctx->cfg,
- sctx->service_name,
- "TOLERANT")))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Specified value for `%s' of service `%s' is invalid\n"),
- "TOLERANT",
- sctx->service_name);
- return GNUNET_SYSERR;
- }
- }
- else
- tolerant = GNUNET_NO;
-
- errno = 0;
- if ((NULL != (nfds = getenv ("LISTEN_FDS"))) &&
- (1 == sscanf (nfds, "%u", &cnt)) && (cnt > 0) && (cnt < FD_SETSIZE) &&
- (cnt + 4 < FD_SETSIZE))
- {
- sctx->lsocks =
- GNUNET_malloc (sizeof(struct GNUNET_NETWORK_Handle *) * (cnt + 1));
- while (0 < cnt--)
- {
- flags = fcntl (3 + cnt, F_GETFD);
- if ((flags < 0) || (0 != (flags & FD_CLOEXEC)) ||
- (NULL ==
- (sctx->lsocks[cnt] = GNUNET_NETWORK_socket_box_native (3 + cnt))))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ (
- "Could not access pre-bound socket %u, will try to bind
myself\n"),
- (unsigned int) 3 + cnt);
- cnt++;
- while (sctx->lsocks[cnt] != NULL)
- GNUNET_break (0 == GNUNET_NETWORK_socket_close
(sctx->lsocks[cnt++]));
- GNUNET_free (sctx->lsocks);
- sctx->lsocks = NULL;
- break;
- }
- }
- unsetenv ("LISTEN_FDS");
- }
-
- if ((NULL == sctx->lsocks) &&
- (GNUNET_SYSERR == LEGACY_SERVICE_get_server_addresses
(sctx->service_name,
- sctx->cfg,
- &sctx->addrs,
- &sctx->addrlens)))
- return GNUNET_SYSERR;
- sctx->require_found = tolerant ? GNUNET_NO : GNUNET_YES;
- sctx->match_uid = GNUNET_CONFIGURATION_get_value_yesno (sctx->cfg,
- sctx->service_name,
- "UNIX_MATCH_UID");
- sctx->match_gid = GNUNET_CONFIGURATION_get_value_yesno (sctx->cfg,
- sctx->service_name,
- "UNIX_MATCH_GID");
- process_acl4 (&sctx->v4_denied, sctx, "REJECT_FROM");
- process_acl4 (&sctx->v4_allowed, sctx, "ACCEPT_FROM");
- process_acl6 (&sctx->v6_denied, sctx, "REJECT_FROM6");
- process_acl6 (&sctx->v6_allowed, sctx, "ACCEPT_FROM6");
-
- return GNUNET_OK;
-}
-
-
-/**
- * Get the name of the user that'll be used
- * to provide the service.
- *
- * @param sctx service context
- * @return value of the 'USERNAME' option
- */
-static char *
-get_user_name (struct LEGACY_SERVICE_Context *sctx)
-{
- char *un;
-
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (sctx->cfg,
- sctx->service_name,
- "USERNAME",
- &un))
- return NULL;
- return un;
-}
-
-
-/**
- * Write PID file.
- *
- * @param sctx service context
- * @param pid PID to write (should be equal to 'getpid()'
- * @return #GNUNET_OK on success (including no work to be done)
- */
-static int
-write_pid_file (struct LEGACY_SERVICE_Context *sctx, pid_t pid)
-{
- FILE *pidfd;
- char *pif;
- char *user;
- char *rdir;
- int len;
-
- if (NULL == (pif = get_pid_file_name (sctx)))
- return GNUNET_OK; /* no file desired */
- user = get_user_name (sctx);
- rdir = GNUNET_strdup (pif);
- len = strlen (rdir);
- while ((len > 0) && (rdir[len] != DIR_SEPARATOR))
- len--;
- rdir[len] = '\0';
- if (0 != access (rdir, F_OK))
- {
- /* we get to create a directory -- and claim it
- * as ours! */
- (void) GNUNET_DISK_directory_create (rdir);
- if ((NULL != user) && (0 < strlen (user)))
- GNUNET_DISK_file_change_owner (rdir, user);
- }
- if (0 != access (rdir, W_OK | X_OK))
- {
- LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_ERROR, "access", rdir);
- GNUNET_free (rdir);
- GNUNET_free (user);
- GNUNET_free (pif);
- return GNUNET_SYSERR;
- }
- GNUNET_free (rdir);
- pidfd = fopen (pif, "w");
- if (NULL == pidfd)
- {
- LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_ERROR, "fopen", pif);
- GNUNET_free (pif);
- GNUNET_free (user);
- return GNUNET_SYSERR;
- }
- if (0 > fprintf (pidfd, "%u", pid))
- LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "fprintf", pif);
- GNUNET_break (0 == fclose (pidfd));
- if ((NULL != user) && (0 < strlen (user)))
- GNUNET_DISK_file_change_owner (pif, user);
- GNUNET_free (user);
- GNUNET_free (pif);
- return GNUNET_OK;
-}
-
-
-/**
- * Task run during shutdown. Stops the server/service.
- *
- * @param cls the `struct LEGACY_SERVICE_Context`
- */
-static void
-shutdown_task (void *cls)
-{
- struct LEGACY_SERVICE_Context *service = cls;
- struct GNUNET_SERVER_Handle *server = service->server;
-
- service->shutdown_task = NULL;
- if (0 != (service->options & LEGACY_SERVICE_OPTION_SOFT_SHUTDOWN))
- GNUNET_SERVER_stop_listening (server);
- else
- GNUNET_SERVER_destroy (server);
-}
-
-
-/**
- * Initial task for the service.
- *
- * @param cls service context
- */
-static void
-service_task (void *cls)
-{
- struct LEGACY_SERVICE_Context *sctx = cls;
- unsigned int i;
-
- GNUNET_RESOLVER_connect (sctx->cfg);
- if (NULL != sctx->lsocks)
- sctx->server = GNUNET_SERVER_create_with_sockets (&check_access,
- sctx,
- sctx->lsocks,
- sctx->timeout,
- sctx->require_found);
- else
- sctx->server = GNUNET_SERVER_create (&check_access,
- sctx,
- sctx->addrs,
- sctx->addrlens,
- sctx->timeout,
- sctx->require_found);
- if (NULL == sctx->server)
- {
- if (NULL != sctx->addrs)
- for (i = 0; NULL != sctx->addrs[i]; i++)
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ ("Failed to start `%s' at `%s'\n"),
- sctx->service_name,
- GNUNET_a2s (sctx->addrs[i], sctx->addrlens[i]));
- sctx->ret = GNUNET_SYSERR;
- return;
- }
-
- if (NULL != sctx->addrs)
- for (i = 0; NULL != sctx->addrs[i]; i++)
- if ((AF_UNIX == sctx->addrs[i]->sa_family) &&
- ('\0' != ((const struct sockaddr_un *) sctx->addrs[i])->sun_path[0]))
- GNUNET_DISK_fix_permissions (((const struct sockaddr_un *)
- sctx->addrs[i])
- ->sun_path,
- sctx->match_uid,
- sctx->match_gid);
-
- if (0 == (sctx->options & LEGACY_SERVICE_OPTION_MANUAL_SHUTDOWN))
- {
- /* install a task that will kill the server
- * process if the scheduler ever gets a shutdown signal */
- sctx->shutdown_task = GNUNET_SCHEDULER_add_shutdown (&shutdown_task, sctx);
- }
- sctx->my_handlers = GNUNET_malloc (sizeof(defhandlers));
- GNUNET_memcpy (sctx->my_handlers, defhandlers, sizeof(defhandlers));
- i = 0;
- while (NULL != sctx->my_handlers[i].callback)
- sctx->my_handlers[i++].callback_cls = sctx;
- GNUNET_SERVER_add_handlers (sctx->server, sctx->my_handlers);
- if (-1 != sctx->ready_confirm_fd)
- {
- GNUNET_break (1 == write (sctx->ready_confirm_fd, ".", 1));
- GNUNET_break (0 == close (sctx->ready_confirm_fd));
- sctx->ready_confirm_fd = -1;
- write_pid_file (sctx, getpid ());
- }
- if (NULL != sctx->addrs)
- {
- i = 0;
- while (NULL != sctx->addrs[i])
- {
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ ("Service `%s' runs at %s\n"),
- sctx->service_name,
- GNUNET_a2s (sctx->addrs[i], sctx->addrlens[i]));
- i++;
- }
- }
- sctx->task (sctx->task_cls, sctx->server, sctx->cfg);
-}
-
-
-/**
- * Detach from terminal.
- *
- * @param sctx service context
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
- */
-static int
-detach_terminal (struct LEGACY_SERVICE_Context *sctx)
-{
- pid_t pid;
- int nullfd;
- int filedes[2];
-
- if (0 != pipe (filedes))
- {
- LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "pipe");
- return GNUNET_SYSERR;
- }
- pid = fork ();
- if (pid < 0)
- {
- LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "fork");
- return GNUNET_SYSERR;
- }
- if (0 != pid)
- {
- /* Parent */
- char c;
-
- GNUNET_break (0 == close (filedes[1]));
- c = 'X';
- if (1 != read (filedes[0], &c, sizeof(char)))
- LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "read");
- fflush (stdout);
- switch (c)
- {
- case '.':
- exit (0);
-
- case 'I':
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ ("Service process failed to initialize\n"));
- break;
-
- case 'S':
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ ("Service process could not initialize server function\n"));
- break;
-
- case 'X':
- LOG (GNUNET_ERROR_TYPE_INFO,
- _ ("Service process failed to report status\n"));
- break;
- }
- exit (1); /* child reported error */
- }
- GNUNET_break (0 == close (0));
- GNUNET_break (0 == close (1));
- GNUNET_break (0 == close (filedes[0]));
- nullfd = open ("/dev/null", O_RDWR | O_APPEND);
- if (nullfd < 0)
- return GNUNET_SYSERR;
- /* set stdin/stdout to /dev/null */
- if ((dup2 (nullfd, 0) < 0) || (dup2 (nullfd, 1) < 0))
- {
- LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "dup2");
- (void) close (nullfd);
- return GNUNET_SYSERR;
- }
- (void) close (nullfd);
- /* Detach from controlling terminal */
- pid = setsid ();
- if (-1 == pid)
- LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR, "setsid");
- sctx->ready_confirm_fd = filedes[1];
-
- return GNUNET_OK;
-}
-
-
-/**
- * Set user ID.
- *
- * @param sctx service context
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
- */
-static int
-set_user_id (struct LEGACY_SERVICE_Context *sctx)
-{
- char *user;
-
- if (NULL == (user = get_user_name (sctx)))
- return GNUNET_OK; /* keep */
-
- struct passwd *pws;
-
- errno = 0;
- pws = getpwnam (user);
- if (NULL == pws)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Cannot obtain information about user `%s': %s\n"),
- user,
- errno == 0 ? _ ("No such user") : strerror (errno));
- GNUNET_free (user);
- return GNUNET_SYSERR;
- }
- if ((0 != setgid (pws->pw_gid)) || (0 != setegid (pws->pw_gid)) ||
-#if HAVE_INITGROUPS
- (0 != initgroups (user, pws->pw_gid)) ||
-#endif
- (0 != setuid (pws->pw_uid)) || (0 != seteuid (pws->pw_uid)))
- {
- if ((0 != setregid (pws->pw_gid, pws->pw_gid)) ||
- (0 != setreuid (pws->pw_uid, pws->pw_uid)))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- _ ("Cannot change user/group to `%s': %s\n"),
- user,
- strerror (errno));
- GNUNET_free (user);
- return GNUNET_SYSERR;
- }
- }
-
- GNUNET_free (user);
- return GNUNET_OK;
-}
-
-
-/**
- * Delete the PID file that was created by our parent.
- *
- * @param sctx service context
- */
-static void
-pid_file_delete (struct LEGACY_SERVICE_Context *sctx)
-{
- char *pif = get_pid_file_name (sctx);
-
- if (NULL == pif)
- return; /* no PID file */
- if (0 != unlink (pif))
- LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING, "unlink", pif);
- GNUNET_free (pif);
-}
-
-
-/**
- * Run a standard GNUnet service startup sequence (initialize loggers
- * and configuration, parse options).
- *
- * @param argc number of command line arguments
- * @param argv command line arguments
- * @param service_name our service name
- * @param options service options
- * @param task main task of the service
- * @param task_cls closure for @a task
- * @return #GNUNET_SYSERR on error, #GNUNET_OK
- * if we shutdown nicely
- */
-int
-LEGACY_SERVICE_run (int argc,
- char *const *argv,
- const char *service_name,
- enum LEGACY_SERVICE_Options options,
- LEGACY_SERVICE_Main task,
- void *task_cls)
-{
-#define HANDLE_ERROR \
- do \
- { \
- GNUNET_break (0); \
- goto shutdown; \
- } while (0)
-
- int err;
- int ret;
- char *cfg_fn;
- char *opt_cfg_fn;
- char *loglev;
- char *logfile;
- int do_daemonize;
- unsigned int i;
- unsigned long long skew_offset;
- unsigned long long skew_variance;
- long long clock_offset;
- struct LEGACY_SERVICE_Context sctx;
- struct GNUNET_CONFIGURATION_Handle *cfg;
- const char *xdg;
-
- struct GNUNET_GETOPT_CommandLineOption service_options[] =
- { GNUNET_GETOPT_option_cfgfile (&opt_cfg_fn),
- GNUNET_GETOPT_option_flag ('d',
- "daemonize",
- gettext_noop (
- "do daemonize (detach from terminal)"),
- &do_daemonize),
- GNUNET_GETOPT_option_help (NULL),
- GNUNET_GETOPT_option_loglevel (&loglev),
- GNUNET_GETOPT_option_logfile (&logfile),
- GNUNET_GETOPT_option_version (PACKAGE_VERSION " " VCS_VERSION),
- GNUNET_GETOPT_OPTION_END };
- err = 1;
- do_daemonize = 0;
- logfile = NULL;
- loglev = NULL;
- opt_cfg_fn = NULL;
- xdg = getenv ("XDG_CONFIG_HOME");
- if (NULL != xdg)
- GNUNET_asprintf (&cfg_fn,
- "%s%s%s",
- xdg,
- DIR_SEPARATOR_STR,
- GNUNET_OS_project_data_get ()->config_file);
- else
- cfg_fn = GNUNET_strdup (GNUNET_OS_project_data_get ()->user_config_file);
- memset (&sctx, 0, sizeof(sctx));
- sctx.options = options;
- sctx.ready_confirm_fd = -1;
- sctx.ret = GNUNET_OK;
- sctx.timeout = GNUNET_TIME_UNIT_FOREVER_REL;
- sctx.task = task;
- sctx.task_cls = task_cls;
- sctx.service_name = service_name;
- sctx.cfg = cfg = GNUNET_CONFIGURATION_create ();
-
- /* setup subsystems */
- ret = GNUNET_GETOPT_run (service_name, service_options, argc, argv);
- if (GNUNET_SYSERR == ret)
- goto shutdown;
- if (GNUNET_NO == ret)
- {
- err = 0;
- goto shutdown;
- }
- if (GNUNET_OK != GNUNET_log_setup (service_name, loglev, logfile))
- HANDLE_ERROR;
- if (NULL == opt_cfg_fn)
- opt_cfg_fn = GNUNET_strdup (cfg_fn);
- if (GNUNET_YES == GNUNET_DISK_file_test (opt_cfg_fn))
- {
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, opt_cfg_fn))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Malformed configuration file `%s', exit ...\n"),
- opt_cfg_fn);
- goto shutdown;
- }
- }
- else
- {
- if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, NULL))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Malformed configuration, exit ...\n"));
- goto shutdown;
- }
- if (0 != strcmp (opt_cfg_fn, cfg_fn))
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Could not access configuration file `%s'\n"),
- opt_cfg_fn);
- }
- if (GNUNET_OK != setup_service (&sctx))
- goto shutdown;
- if ((1 == do_daemonize) && (GNUNET_OK != detach_terminal (&sctx)))
- HANDLE_ERROR;
- if (GNUNET_OK != set_user_id (&sctx))
- goto shutdown;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Service `%s' runs with configuration from `%s'\n",
- service_name,
- opt_cfg_fn);
- if ((GNUNET_OK == GNUNET_CONFIGURATION_get_value_number (sctx.cfg,
- "TESTING",
- "SKEW_OFFSET",
- &skew_offset)) &&
- (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number (sctx.cfg,
- "TESTING",
- "SKEW_VARIANCE",
- &skew_variance)))
- {
- clock_offset = skew_offset - skew_variance;
- GNUNET_TIME_set_offset (clock_offset);
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Skewing clock by %lld ms\n", clock_offset);
- }
- /* actually run service */
- err = 0;
- GNUNET_SCHEDULER_run (&service_task, &sctx);
- /* shutdown */
- if ((1 == do_daemonize) && (NULL != sctx.server))
- pid_file_delete (&sctx);
- GNUNET_free (sctx.my_handlers);
-
-shutdown:
- if (-1 != sctx.ready_confirm_fd)
- {
- if (1 != write (sctx.ready_confirm_fd, err ? "I" : "S", 1))
- LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "write");
- GNUNET_break (0 == close (sctx.ready_confirm_fd));
- }
-#if HAVE_MALLINFO2
- {
- char *counter;
-
- if ((GNUNET_YES == GNUNET_CONFIGURATION_have_value (sctx.cfg,
- service_name,
- "GAUGER_HEAP")) &&
- (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (sctx.cfg,
- service_name,
- "GAUGER_HEAP",
- &counter)))
- {
- struct mallinfo2 mi;
-
- mi = mallinfo2 ();
- GAUGER (service_name, counter, mi.usmblks, "blocks");
- GNUNET_free (counter);
- }
- }
-#endif
- GNUNET_CONFIGURATION_destroy (cfg);
- i = 0;
- if (NULL != sctx.addrs)
- while (NULL != sctx.addrs[i])
- GNUNET_free_nz (sctx.addrs[i++]);
- GNUNET_free (sctx.addrs);
- GNUNET_free (sctx.addrlens);
- GNUNET_free (logfile);
- GNUNET_free (loglev);
- GNUNET_free (cfg_fn);
- GNUNET_free (opt_cfg_fn);
- GNUNET_free (sctx.v4_denied);
- GNUNET_free (sctx.v6_denied);
- GNUNET_free (sctx.v4_allowed);
- GNUNET_free (sctx.v6_allowed);
-
- return err ? GNUNET_SYSERR : sctx.ret;
-}
-
-
-/**
- * Run a service startup sequence within an existing
- * initialized system.
- *
- * @param service_name our service name
- * @param cfg configuration to use
- * @param options service options
- * @return NULL on error, service handle
- */
-struct LEGACY_SERVICE_Context *
-LEGACY_SERVICE_start (const char *service_name,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- enum LEGACY_SERVICE_Options options)
-{
- int i;
- struct LEGACY_SERVICE_Context *sctx;
-
- sctx = GNUNET_new (struct LEGACY_SERVICE_Context);
- sctx->ready_confirm_fd = -1; /* no daemonizing */
- sctx->ret = GNUNET_OK;
- sctx->timeout = GNUNET_TIME_UNIT_FOREVER_REL;
- sctx->service_name = service_name;
- sctx->cfg = cfg;
- sctx->options = options;
-
- /* setup subsystems */
- if (GNUNET_OK != setup_service (sctx))
- {
- LEGACY_SERVICE_stop (sctx);
- return NULL;
- }
- if (NULL != sctx->lsocks)
- sctx->server = GNUNET_SERVER_create_with_sockets (&check_access,
- sctx,
- sctx->lsocks,
- sctx->timeout,
- sctx->require_found);
- else
- sctx->server = GNUNET_SERVER_create (&check_access,
- sctx,
- sctx->addrs,
- sctx->addrlens,
- sctx->timeout,
- sctx->require_found);
-
- if (NULL == sctx->server)
- {
- LEGACY_SERVICE_stop (sctx);
- return NULL;
- }
-
- if (NULL != sctx->addrs)
- for (i = 0; NULL != sctx->addrs[i]; i++)
- if ((AF_UNIX == sctx->addrs[i]->sa_family) &&
- ('\0' != ((const struct sockaddr_un *) sctx->addrs[i])->sun_path[0]))
- GNUNET_DISK_fix_permissions (((const struct sockaddr_un *)
- sctx->addrs[i])
- ->sun_path,
- sctx->match_uid,
- sctx->match_gid);
-
- sctx->my_handlers = GNUNET_malloc (sizeof(defhandlers));
- GNUNET_memcpy (sctx->my_handlers, defhandlers, sizeof(defhandlers));
- i = 0;
- while ((sctx->my_handlers[i].callback != NULL))
- sctx->my_handlers[i++].callback_cls = sctx;
- GNUNET_SERVER_add_handlers (sctx->server, sctx->my_handlers);
- return sctx;
-}
-
-
-/**
- * Obtain the server used by a service. Note that the server must NOT
- * be destroyed by the caller.
- *
- * @param ctx the service context returned from the start function
- * @return handle to the server for this service, NULL if there is none
- */
-struct GNUNET_SERVER_Handle *
-LEGACY_SERVICE_get_server (struct LEGACY_SERVICE_Context *ctx)
-{
- return ctx->server;
-}
-
-
-/**
- * Get the NULL-terminated array of listen sockets for this service.
- *
- * @param ctx service context to query
- * @return NULL if there are no listen sockets, otherwise NULL-terminated
- * array of listen sockets.
- */
-struct GNUNET_NETWORK_Handle *const *
-LEGACY_SERVICE_get_listen_sockets (struct LEGACY_SERVICE_Context *ctx)
-{
- return ctx->lsocks;
-}
-
-
-/**
- * Stop a service that was started with "LEGACY_SERVICE_start".
- *
- * @param sctx the service context returned from the start function
- */
-void
-LEGACY_SERVICE_stop (struct LEGACY_SERVICE_Context *sctx)
-{
- unsigned int i;
-
-#if HAVE_MALLINFO2
- {
- char *counter;
-
- if ((GNUNET_YES == GNUNET_CONFIGURATION_have_value (sctx->cfg,
- sctx->service_name,
- "GAUGER_HEAP")) &&
- (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (sctx->cfg,
-
sctx->service_name,
- "GAUGER_HEAP",
- &counter)))
- {
- struct mallinfo2 mi;
-
- mi = mallinfo2 ();
- GAUGER (sctx->service_name, counter, mi.usmblks, "blocks");
- GNUNET_free (counter);
- }
- }
-#endif
- if (NULL != sctx->shutdown_task)
- {
- GNUNET_SCHEDULER_cancel (sctx->shutdown_task);
- sctx->shutdown_task = NULL;
- }
- if (NULL != sctx->server)
- GNUNET_SERVER_destroy (sctx->server);
- GNUNET_free (sctx->my_handlers);
- if (NULL != sctx->addrs)
- {
- i = 0;
- while (NULL != sctx->addrs[i])
- GNUNET_free_nz (sctx->addrs[i++]);
- GNUNET_free (sctx->addrs);
- }
- GNUNET_free (sctx->addrlens);
- GNUNET_free (sctx->v4_denied);
- GNUNET_free (sctx->v6_denied);
- GNUNET_free (sctx->v4_allowed);
- GNUNET_free (sctx->v6_allowed);
- GNUNET_free (sctx);
-}
-
-
-/* end of service.c */
diff --git a/src/transport/test_http_common.c b/src/transport/test_http_common.c
deleted file mode 100644
index fe6e4faa3..000000000
--- a/src/transport/test_http_common.c
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009, 2010 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/test_http_common.c
- * @brief base test case for common http functionality
- */
-#include "platform.h"
-#include "gnunet_transport_service.h"
-#include "transport-testing.h"
-#include "plugin_transport_http_common.h"
-
-
-static void
-clean (struct SplittedHTTPAddress *addr)
-{
- if (NULL == addr)
- return;
- GNUNET_free (addr->host);
- GNUNET_free (addr->path);
- GNUNET_free (addr->protocol);
- GNUNET_free (addr);
-}
-
-
-static int
-check (struct SplittedHTTPAddress *addr,
- const char *protocol,
- const char *host,
- int port,
- const char *path)
-{
- if (NULL == addr)
- return GNUNET_NO;
- if (((NULL == addr->protocol) && (NULL != protocol)) ||
- ((NULL != addr->protocol) && (NULL == protocol)))
- {
- GNUNET_break (0);
- return GNUNET_NO;
- }
- else if ((NULL != addr->protocol) && (NULL != protocol))
- {
- if (0 != strcmp (addr->protocol, protocol))
- {
- GNUNET_break (0);
- return GNUNET_NO;
- }
- }
-
- if (((NULL == addr->host) && (NULL != host)) ||
- ((NULL != addr->host) && (NULL == host)))
- {
- GNUNET_break (0);
- return GNUNET_NO;
- }
- else if ((NULL != addr->host) && (NULL != host))
- {
- if (0 != strcmp (addr->host, host))
- {
- GNUNET_break (0);
- return GNUNET_NO;
- }
- }
-
- if (((NULL == addr->path) && (NULL != path)) ||
- ((NULL != addr->path) && (NULL == path)))
- {
- GNUNET_break (0);
- return GNUNET_NO;
- }
- else if ((NULL != addr->path) && (NULL != path))
- {
- if (0 != strcmp (addr->path, path))
- {
- GNUNET_break (0);
- return GNUNET_NO;
- }
- }
-
- if ((addr->port != port))
- {
- GNUNET_break (0);
- return GNUNET_NO;
- }
- return GNUNET_OK;
-}
-
-
-static int
-check_pass (const char *src,
- const char *protocol,
- const char *host,
- int port,
- const char *path)
-{
- struct SplittedHTTPAddress *spa;
-
- spa = http_split_address (src);
- if (NULL == spa)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if (GNUNET_OK != check (spa, protocol, host, port, path))
- {
- clean (spa);
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- clean (spa);
- return GNUNET_OK;
-}
-
-
-static int
-check_fail (const char *src)
-{
- struct SplittedHTTPAddress *spa;
-
- spa = http_split_address (src);
- if (NULL != spa)
- {
- GNUNET_break (0);
- clean (spa);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-static void
-test_pass_hostname ()
-{
- check_pass ("http://test.local", "http", "test.local", HTTP_DEFAULT_PORT,
"");
- check_pass ("http://test.local/", "http", "test.local", HTTP_DEFAULT_PORT,
- "/");
- check_pass ("http://test.local/path", "http", "test.local",
HTTP_DEFAULT_PORT,
- "/path");
- check_pass ("http://test.local/path/", "http", "test.local",
- HTTP_DEFAULT_PORT, "/path/");
- check_pass ("http://test.local/path/more", "http", "test.local",
- HTTP_DEFAULT_PORT, "/path/more");
- check_pass ("http://test.local:81", "http", "test.local", 81, "");
- check_pass ("http://test.local:81/", "http", "test.local", 81, "/");
- check_pass ("http://test.local:81/path", "http", "test.local", 81, "/path");
- check_pass ("http://test.local:81/path/", "http", "test.local", 81,
"/path/");
- check_pass ("http://test.local:81/path/more", "http", "test.local", 81,
- "/path/more");
-}
-
-
-static void
-test_pass_ipv4 ()
-{
- check_pass ("http://127.0.0.1", "http", "127.0.0.1", HTTP_DEFAULT_PORT, "");
- check_pass ("http://127.0.0.1/", "http", "127.0.0.1", HTTP_DEFAULT_PORT,
"/");
- check_pass ("http://127.0.0.1/path", "http", "127.0.0.1", HTTP_DEFAULT_PORT,
- "/path");
- check_pass ("http://127.0.0.1/path/", "http", "127.0.0.1", HTTP_DEFAULT_PORT,
- "/path/");
- check_pass ("http://127.0.0.1:81", "http", "127.0.0.1", 81, "");
- check_pass ("http://127.0.0.1:81/", "http", "127.0.0.1", 81, "/");
- check_pass ("http://127.0.0.1:81/path", "http", "127.0.0.1", 81, "/path");
- check_pass ("http://127.0.0.1:81/path/", "http", "127.0.0.1", 81, "/path/");
- check_pass ("http://127.0.0.1:81/path/more", "http", "127.0.0.1", 81,
- "/path/more");
-}
-
-
-static void
-test_fail_ipv6 ()
-{
- check_pass ("http://[::1]", "http", "[::1]", HTTP_DEFAULT_PORT, "");
- check_pass ("http://[::1]/", "http", "[::1]", HTTP_DEFAULT_PORT, "/");
- check_pass ("http://[::1]/path", "http", "[::1]", HTTP_DEFAULT_PORT,
"/path");
- check_pass ("http://[::1]/path/", "http", "[::1]", HTTP_DEFAULT_PORT,
- "/path/");
- check_pass ("http://[::1]:81", "http", "[::1]", 81, "");
- check_pass ("http://[::1]:81/", "http", "[::1]", 81, "/");
- check_pass ("http://[::1]:81/path", "http", "[::1]", 81, "/path");
- check_pass ("http://[::1]:81/path/", "http", "[::1]", 81, "/path/");
- check_pass ("http://[::1]:81/path/more", "http", "[::1]", 81, "/path/more");
-}
-
-
-static void
-test_fail ()
-{
- if (GNUNET_SYSERR == check_fail (""))
- GNUNET_break (0);
- if (GNUNET_SYSERR == check_fail ("http"))
- GNUNET_break (0);
- if (GNUNET_SYSERR == check_fail ("://"))
- GNUNET_break (0);
- if (GNUNET_SYSERR == check_fail ("http://"))
- GNUNET_break (0);
- if (GNUNET_SYSERR == check_fail ("//localhost"))
- GNUNET_break (0);
- if (GNUNET_SYSERR == check_fail ("//:80"))
- GNUNET_break (0);
- if (GNUNET_SYSERR == check_fail ("//:80/"))
- GNUNET_break (0);
- if (GNUNET_SYSERR == check_fail ("//:80:"))
- GNUNET_break (0);
- if (GNUNET_SYSERR == check_fail ("http://localhost:a/"))
- GNUNET_break (0);
- if (GNUNET_SYSERR == check_fail ("http://127.0.0.1:a/"))
- GNUNET_break (0);
-}
-
-
-int
-main (int argc, char *argv[])
-{
- int ret = 0;
- struct SplittedHTTPAddress *spa;
-
- GNUNET_log_setup ("test", "DEBUG", NULL);
- spa = http_split_address ("");
- if (NULL != spa)
- {
- clean (spa);
- spa = NULL;
- GNUNET_break (0);
- }
-
- spa = http_split_address ("http://");
- if (NULL != spa)
- {
- clean (spa);
- GNUNET_break (0);
- }
-
- spa = http_split_address ("://");
- if (NULL != spa)
- {
- clean (spa);
- GNUNET_break (0);
- }
-
- test_pass_hostname ();
- test_pass_ipv4 ();
- test_fail_ipv6 ();
- test_fail ();
-
- return ret;
-}
-
-
-/* end of test_http_common.c */
diff --git a/src/transport/test_plugin_transport.c
b/src/transport/test_plugin_transport.c
deleted file mode 100644
index 04687d845..000000000
--- a/src/transport/test_plugin_transport.c
+++ /dev/null
@@ -1,797 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009, 2018 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/test_plugin_transport.c
- * @brief testcase for transport_api.c
- * @author Sailor Siraj
- * @author Christian Grothoff
- */
-
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_peerinfo_service.h"
-#include "gnunet_statistics_service.h"
-#include "gnunet_protocols.h"
-#include "gnunet_transport_plugin.h"
-#include "transport.h"
-
-/**
- * How long until we give up on transmitting the message?
- */
-#define WAIT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
-
-#define HOSTKEY_FILE "test_plugin_hostkey.ecc"
-
-/**
- * Our public key.
- */
-static struct GNUNET_PeerIdentity my_identity;
-
-/**
- * Our private key.
- */
-static struct GNUNET_CRYPTO_EddsaPrivateKey my_private_key;
-
-/**
- * Our configuration.
- */
-const struct GNUNET_CONFIGURATION_Handle *cfg;
-
-/**
- * Our configuration.
- */
-struct GNUNET_STATISTICS_Handle *stats;
-
-/**
- * Our HELLO
- */
-struct GNUNET_HELLO_Message *hello;
-
-/**
- * Number of neighbours we'd like to have.
- */
-static uint32_t max_connect_per_transport;
-
-/**
- * Environment for this plugin.
- */
-struct GNUNET_TRANSPORT_PluginEnvironment env;
-
-/**
- * handle for the api provided by this plugin
- */
-struct GNUNET_TRANSPORT_PluginFunctions *api;
-
-/**
- * Helper handler
- */
-struct GNUNET_HELPER_Handle *suid_helper;
-
-/**
- * Timeout task
- */
-static struct GNUNET_SCHEDULER_Task *timeout_endbadly;
-
-/**
- * Timeout task
- */
-static struct GNUNET_SCHEDULER_Task *timeout_wait;
-
-/**
- * Library name
- */
-static char *libname;
-
-/**
- * Plugin addresses head
- */
-struct AddressWrapper *head;
-
-/**
- * Plugin addresses tail
- */
-struct AddressWrapper *tail;
-
-unsigned int addresses_reported;
-
-unsigned int pretty_printers_running;
-
-/**
- * Did the test pass or fail?
- */
-static int ok;
-
-struct AddressWrapper
-{
- struct AddressWrapper *next;
-
- struct AddressWrapper *prev;
-
- struct GNUNET_HELLO_Address *address;
-
- char *addrstring;
-
- struct GNUNET_SCHEDULER_Task *test_task;
-};
-
-
-static void
-end ()
-{
- struct AddressWrapper *w;
- int c = 0;
-
- ok = 0;
-
- if (NULL != timeout_endbadly)
- {
- GNUNET_SCHEDULER_cancel (timeout_endbadly);
- timeout_endbadly = NULL;
- }
- if (NULL != api)
- GNUNET_PLUGIN_unload (libname, api);
-
- while (NULL != head)
- {
- w = head;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Plugin did not remove address `%s'\n",
- w->addrstring);
- GNUNET_CONTAINER_DLL_remove (head, tail, w);
- c++;
- GNUNET_HELLO_address_free (w->address);
- GNUNET_free (w->addrstring);
- GNUNET_free (w);
- }
- if (c > 0)
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Plugin did not remove %u addresses \n",
- c);
- ok = 1;
- }
-
- GNUNET_free (libname);
- libname = NULL;
- GNUNET_STATISTICS_destroy (stats, GNUNET_NO);
- stats = NULL;
-
- if (NULL != suid_helper)
- {
- GNUNET_HELPER_stop (suid_helper, GNUNET_NO);
- suid_helper = NULL;
- }
-}
-
-
-static void
-end_badly (void *cls)
-{
- struct AddressWrapper *w;
- int c = 0;
-
- timeout_endbadly = NULL;
- if (NULL != timeout_wait)
- {
- GNUNET_SCHEDULER_cancel (timeout_wait);
- timeout_wait = NULL;
- }
-
- if (pretty_printers_running > 0)
- {
- timeout_endbadly = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
- &end_badly, &ok);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Have pending calls to pretty_printer ... deferring
shutdown\n");
- return;
- }
-
- if (NULL != cls)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Test took too long to execute, timeout .... \n");
- }
-
- if (NULL != libname)
- {
- if (NULL != api)
- GNUNET_PLUGIN_unload (libname, api);
- GNUNET_free (libname);
- libname = NULL;
- }
-
- while (NULL != head)
- {
- w = head;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Plugin did not remove address
`%s'\n",
- w->addrstring);
- GNUNET_CONTAINER_DLL_remove (head, tail, w);
- c++;
- GNUNET_HELLO_address_free (w->address);
- if (NULL != w->test_task)
- GNUNET_SCHEDULER_cancel (w->test_task);
- GNUNET_free (w->addrstring);
- GNUNET_free (w);
- }
- if (c > 0)
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Plugin did not remove %u
addresses\n",
- c);
- }
-
- if (NULL != stats)
- {
- GNUNET_STATISTICS_destroy (stats, GNUNET_NO);
- stats = NULL;
- }
-
- if (NULL != suid_helper)
- {
- GNUNET_HELPER_stop (suid_helper, GNUNET_NO);
- suid_helper = NULL;
- }
-
- ok = 1;
-}
-
-
-static void
-wait_end (void *cls)
-{
- timeout_wait = NULL;
- if (0 == addresses_reported)
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Plugin did not report any addresses, could not check address
conversion functions\n");
- end ();
-}
-
-
-static void
-end_badly_now ()
-{
- if (NULL != timeout_wait)
- {
- GNUNET_SCHEDULER_cancel (timeout_wait);
- timeout_wait = NULL;
- }
- if (NULL != timeout_endbadly)
- {
- GNUNET_SCHEDULER_cancel (timeout_endbadly);
- timeout_endbadly = NULL;
- }
- timeout_endbadly = GNUNET_SCHEDULER_add_now (&end_badly, NULL);
-}
-
-
-static struct GNUNET_TIME_Relative
-env_receive (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session,
- const struct GNUNET_MessageHeader *message)
-{
- /* do nothing */
- return GNUNET_TIME_relative_get_zero_ ();
-}
-
-
-static int got_reply;
-
-
-/**
- * Take the given address and append it to the set of results sent back to
- * the client.
- *
- * @param cls closure
- * @param address the address to print
- * @param res result code
- */
-static void
-address_pretty_printer_cb (void *cls, const char *address, int res)
-{
- if (NULL != address)
- {
- got_reply = GNUNET_YES;
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Pretty address : `%s'\n", address);
- pretty_printers_running--;
- }
- else
- {
- if (GNUNET_NO == got_reply)
- {
- pretty_printers_running--;
- GNUNET_break (0);
- end_badly_now ();
- }
- }
-}
-
-
-static void
-test_addr_string (void *cls)
-{
- struct AddressWrapper *w = cls;
- void *s2a;
- size_t s2a_len;
-
- w->test_task = NULL;
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Testing: address_to_string \n");
- w->addrstring = GNUNET_strdup (api->address_to_string (api,
- w->address->address,
- w->address->
- address_length));
- if (NULL == w->addrstring)
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Plugin cannot convert address to string!\n");
- end_badly_now ();
- return;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Plugin added address `%s'\n",
- w->addrstring);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Testing address_to_string: OK\n");
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Testing: string_to_address \n");
- s2a = NULL;
- s2a_len = 0;
- if ((GNUNET_OK !=
- api->string_to_address (api, w->addrstring,
- strlen (w->addrstring) + 1,
- &s2a, &s2a_len)) ||
- (NULL == s2a))
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Plugin cannot convert string to address!\n");
- end_badly_now ();
- return;
- }
-
- /*
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Plugin creates `%s' %u\n",api->address_to_string (api, s2a, s2a_len),
s2a_len);
-
- int c1;
- for (c1 = 0; c1 < s2a_len; c1++ )
- fprintf (stderr, "%u == %u\n", ((char *) s2a)[c1], ((char *)
w->addr)[c1]);
- */if (s2a_len != w->address->address_length)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Plugin creates different address length when converting
address->string->address: %u != %u\n",
- (unsigned int) w->address->address_length,
- (unsigned int) s2a_len);
- }
- else if (0 != memcmp (s2a, w->address->address, s2a_len))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Plugin creates different address length when converting back
and forth %i!\n",
- memcmp (s2a,
- w->address->address,
- s2a_len));
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Testing string_to_address: OK\n");
- }
- GNUNET_free (s2a);
-
- pretty_printers_running++;
- api->address_pretty_printer (api->cls,
- w->address->transport_name,
- w->address->address,
- w->address->address_length,
- GNUNET_YES,
- GNUNET_TIME_UNIT_MINUTES,
- &address_pretty_printer_cb, w);
-
- if (GNUNET_OK !=
- api->check_address (api->cls,
- w->address->address,
- w->address->address_length))
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Plugin refuses added address!\n");
- end_badly_now ();
- return;
- }
- if (NULL != timeout_wait)
- {
- GNUNET_SCHEDULER_cancel (timeout_wait);
- timeout_wait = NULL;
- }
- timeout_wait = GNUNET_SCHEDULER_add_delayed (WAIT, &wait_end, NULL);
-}
-
-
-static void
-env_notify_address (void *cls,
- int add_remove,
- const struct GNUNET_HELLO_Address *address)
-{
- struct AddressWrapper *w;
- struct AddressWrapper *wtmp;
-
- if (GNUNET_YES == add_remove)
- {
- addresses_reported++;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Adding address of length %u\n",
- (unsigned int) address->address_length);
-
- for (wtmp = head; NULL != wtmp; wtmp = wtmp->next)
- {
- if ((address->address_length == wtmp->address->address_length) &&
- (0 == memcmp (address->address, wtmp->address->address,
- address->address_length)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Duplicate address notification .... \n");
- return;
- }
- }
-
- w = GNUNET_new (struct AddressWrapper);
- w->address = GNUNET_HELLO_address_copy (address);
- GNUNET_CONTAINER_DLL_insert (head, tail, w);
- got_reply = GNUNET_NO;
- w->test_task = GNUNET_SCHEDULER_add_now (&test_addr_string,
- w);
- return;
- }
-
- if (GNUNET_NO == add_remove)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Removing address of length %u\n",
- (unsigned int) address->address_length);
- w = head;
- while (NULL != w)
- {
- if ((address->address_length == w->address->address_length) &&
- (0 == memcmp (w->address->address, address->address,
- address->address_length)))
- {
- break;
- }
- w = w->next;
- }
-
- if (w == NULL)
- {
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Plugin removes address never added!\n");
- end_badly_now ();
- return;
- }
-
- GNUNET_CONTAINER_DLL_remove (head, tail, w);
- GNUNET_HELLO_address_free (w->address);
- GNUNET_free (w->addrstring);
- GNUNET_free (w);
- return;
- }
- GNUNET_break (0);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Invalid operation: %u\n",
- add_remove);
- end_badly_now ();
-}
-
-
-static enum GNUNET_NetworkType
-env_get_address_type (void *cls,
- const struct sockaddr *addr,
- size_t addrlen)
-{
- return GNUNET_NT_LOOPBACK;
-}
-
-
-static const struct GNUNET_MessageHeader *
-env_get_our_hello ()
-{
- return (const struct GNUNET_MessageHeader *) hello;
-}
-
-
-static void
-env_session_end (void *cls,
- const struct GNUNET_HELLO_Address *address,
- struct GNUNET_ATS_Session *session)
-{
-}
-
-
-static void
-env_update_distance (void *cls,
- const struct GNUNET_HELLO_Address *address,
- uint32_t distance)
-{
-}
-
-
-static void
-setup_plugin_environment ()
-{
- env.cfg = cfg;
- env.cls = &env;
- env.my_identity = &my_identity;
- env.max_connections = max_connect_per_transport;
- env.stats = stats;
- env.receive = &env_receive;
- env.notify_address = &env_notify_address;
- env.get_address_type = &env_get_address_type;
- env.update_address_distance = &env_update_distance;
- env.get_our_hello = &env_get_our_hello;
- env.session_end = &env_session_end;
-}
-
-
-static int
-handle_helper_message (void *cls,
- const struct GNUNET_MessageHeader *hdr)
-{
- return GNUNET_OK;
-}
-
-
-/**
- * Runs the test.
- *
- * @param cls closure
- * @param c configuration to use
- */
-static void
-run (void *cls,
- char *const *args,
- const char *cfgfile,
- const struct GNUNET_CONFIGURATION_Handle *c)
-{
- char *const *argv = cls;
- unsigned long long tneigh;
- char *keyfile;
- char *plugin;
- char *sep;
-
- timeout_endbadly = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
- &end_badly,
- &ok);
- cfg = c;
- /* parse configuration */
- if ((GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_number (c,
- "TRANSPORT",
- "NEIGHBOUR_LIMIT",
- &tneigh)) ||
- (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_filename (c,
- "PEER",
- "PRIVATE_KEY",
- &keyfile)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Transport service is lacking key configuration settings.
Exiting.\n");
- return;
- }
-
- if (NULL == (stats = GNUNET_STATISTICS_create ("transport",
- cfg)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Could not create statistics. Exiting.\n");
- GNUNET_free (keyfile);
- end_badly_now ();
- return;
- }
-
- if (GNUNET_OK != GNUNET_DISK_file_test (HOSTKEY_FILE))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Hostkey `%s' missing. Exiting.\n",
- HOSTKEY_FILE);
- GNUNET_free (keyfile);
- end_badly_now ();
- return;
- }
-
- if (GNUNET_OK !=
- GNUNET_DISK_directory_create_for_file (keyfile))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Could not create a directory for hostkey `%s'. Exiting.\n",
- keyfile);
- GNUNET_free (keyfile);
- end_badly_now ();
- return;
- }
-
- if (GNUNET_OK !=
- GNUNET_DISK_file_copy (HOSTKEY_FILE,
- keyfile))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Could not copy hostkey `%s' to destination `%s'. Exiting.\n",
- HOSTKEY_FILE,
- keyfile);
- GNUNET_free (keyfile);
- end_badly_now ();
- return;
- }
-
- max_connect_per_transport = (uint32_t) tneigh;
- if (GNUNET_SYSERR ==
- GNUNET_CRYPTO_eddsa_key_from_file (keyfile,
- GNUNET_YES,
- &my_private_key))
- {
- GNUNET_free (keyfile);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Could not access hostkey. Exiting.\n");
- end_badly_now ();
- return;
- }
- GNUNET_free (keyfile);
- GNUNET_CRYPTO_eddsa_key_get_public (&my_private_key,
- &my_identity.public_key);
-
- hello = GNUNET_HELLO_create (&my_identity.public_key, NULL, NULL, GNUNET_NO);
-
- /* load plugins... */
- setup_plugin_environment ();
-
- GNUNET_assert (strlen (argv[0]) > strlen ("test_plugin_"));
- plugin = strstr (argv[0], "test_plugin_");
- sep = strrchr (argv[0], '.');
- if (NULL == plugin)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Not a valid test name\n");
- end_badly_now ();
- return;
- }
- plugin += strlen ("test_plugin_");
- if (NULL != sep)
- sep[0] = '\0';
-
- /* Hack for WLAN: start a second helper */
- if (0 == strcmp (plugin, "wlan"))
- {
- char *helper_argv[3];
- helper_argv[0] = (char *) "gnunet-helper-transport-wlan-dummy";
- helper_argv[1] = (char *) "2";
- helper_argv[2] = NULL;
- suid_helper = GNUNET_HELPER_start (GNUNET_NO,
- "gnunet-helper-transport-wlan-dummy",
- helper_argv,
- &handle_helper_message, NULL, NULL);
- }
-
- /* Loading plugin */
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Loading transport plugin %s\n", plugin);
- GNUNET_asprintf (&libname, "libgnunet_plugin_transport_%s", plugin);
- api = GNUNET_PLUGIN_load (libname, &env);
- if (NULL == api)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to load transport plugin for %s\n", plugin);
- end_badly_now ();
- return;
- }
-
- timeout_wait = GNUNET_SCHEDULER_add_delayed (WAIT, &wait_end, NULL);
-
- /* Check if all functions are implemented */
- if (NULL == api->address_pretty_printer)
- {
- GNUNET_break (0);
- end_badly_now ();
- return;
- }
- if (NULL == api->address_to_string)
- {
- GNUNET_break (0);
- end_badly_now ();
- return;
- }
- GNUNET_assert (NULL != api->check_address);
- if (NULL == api->check_address)
- {
- GNUNET_break (0);
- end_badly_now ();
- return;
- }
- GNUNET_assert (NULL != api->disconnect_peer);
- if (NULL == api->disconnect_peer)
- {
- GNUNET_break (0);
- end_badly_now ();
- return;
- }
- GNUNET_assert (NULL != api->get_session);
- if (NULL == api->get_session)
- {
- GNUNET_break (0);
- end_badly_now ();
- return;
- }
- if (NULL == api->address_pretty_printer)
- {
- GNUNET_break (0);
- end_badly_now ();
- return;
- }
- if (NULL == api->string_to_address)
- {
- GNUNET_break (0);
- end_badly_now ();
- return;
- }
-}
-
-
-/**
- * The main function for the test
- *
- * @param argc number of arguments from the command line
- * @param argv command line arguments
- * @return 0 ok, 1 on error
- */
-int
-main (int argc,
- char *const *argv)
-{
- static struct GNUNET_GETOPT_CommandLineOption options[] = {
- GNUNET_GETOPT_OPTION_END
- };
- int ret;
- char *const argv_prog[] = {
- "test_plugin_transport",
- "-c",
- "test_plugin_transport_data.conf",
- NULL
- };
-
- GNUNET_log_setup ("test-plugin-transport",
- "WARNING",
- NULL);
- GNUNET_DISK_purge_cfg_dir ("test_plugin_transport_data.conf",
- "GNUNET_TEST_HOME");
- ok = 1; /* set to fail */
- ret =
- (GNUNET_OK
- == GNUNET_PROGRAM_run (3, argv_prog, "test-plugin-transport",
- "testcase", options, &run, (void *) argv)) ? ok :
1;
- GNUNET_DISK_purge_cfg_dir ("test_plugin_transport_data.conf",
- "GNUNET_TEST_HOME");
- return ret;
-}
-
-
-/* end of test_plugin_transport.c */
diff --git a/src/transport/test_plugin_transport_data.conf
b/src/transport/test_plugin_transport_data.conf
deleted file mode 100644
index b667a4854..000000000
--- a/src/transport/test_plugin_transport_data.conf
+++ /dev/null
@@ -1,47 +0,0 @@
-@INLINE@ test_transport_defaults.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunetd-plugin-transport/
-
-[transport-tcp]
-PORT = 52400
-
-[transport-udp]
-PORT = 52401
-
-[transport-wlan]
-INTERFACE = mon0
-TESTMODE = 1
-
-[transport-bluetooth]
-INTERFACE = hci0
-TESTMODE = 1
-
-[transport-http_server]
-PORT = 52402
-
-[transport-https_server]
-PORT = 52403
-
-[arm]
-PORT = 52360
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-service-arm.sock
-
-[statistics]
-PORT = 52361
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-service-statistics.sock
-
-[resolver]
-PORT = 52362
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-service-resolver.sock
-
-[peerinfo]
-PORT = 52363
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-service-peerinfo.sock
-
-[transport]
-PORT = 52364
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-service-transport.sock
-
-[nat]
-RETURN_LOCAL_ADDRESSES = YES
-DISABLEV6 = NO
diff --git a/src/transport/test_plugin_transport_data_udp.conf
b/src/transport/test_plugin_transport_data_udp.conf
deleted file mode 100644
index 8b1378917..000000000
--- a/src/transport/test_plugin_transport_data_udp.conf
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/transport/test_quota_compliance.c
b/src/transport/test_quota_compliance.c
deleted file mode 100644
index c3c46db37..000000000
--- a/src/transport/test_quota_compliance.c
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009, 2010, 2011, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/test_quota_compliance.c
- * @brief base test case for transport implementations
- *
- * This test case tests quota compliance both on transport level
- */
-#include "platform.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_ats_service.h"
-#include "gauger.h"
-#include "transport-testing.h"
-
-/**
- * Testcase timeout
- */
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 480)
-
-#define DURATION GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 80)
-
-
-static struct GNUNET_SCHEDULER_Task *measure_task;
-
-static char *gen_cfgs[2];
-
-static unsigned long long quota_in[] = { 10000, 10000 };
-
-static unsigned long long quota_out[] = { 10000, 10000 };
-
-static struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc;
-
-
-/**
- * Note that this value must not significantly exceed
- * 'MAX_PENDING' in 'gnunet-service-transport.c', otherwise
- * messages may be dropped even for a reliable transport.
- */
-#define TOTAL_MSGS (1024 * 32)
-
-static unsigned long long total_bytes_recv;
-
-static struct GNUNET_TIME_Absolute start_time;
-
-
-static void
-report ()
-{
- unsigned long long delta;
- unsigned long long datarate;
-
- delta = GNUNET_TIME_absolute_get_duration (start_time).rel_value_us;
- if (0 == delta)
- delta = 1;
- datarate = (total_bytes_recv * 1000 * 1000) / delta;
-
- fprintf (stderr,
- "Throughput was %llu b/s\n",
- datarate);
- ccc->global_ret = GNUNET_OK;
- if (datarate > 1.5 * quota_in[1])
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Datarate of %llu b/s significantly higher than allowed
inbound quota of %llu b/s\n",
- datarate,
- quota_in[1]);
- ccc->global_ret = GNUNET_SYSERR;
- }
- if (datarate > 1.5 * quota_out[0])
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Datarate of %llu b/s significantly higher than allowed
outbound quota of %llu b/s\n",
- datarate,
- quota_out[0]);
- ccc->global_ret = GNUNET_SYSERR;
- }
- if (GNUNET_OK == ccc->global_ret)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Datarate of %llu b/s complied to allowed outbound quota of
%llu b/s and inbound quota of %llu b/s\n",
- datarate,
- quota_out[0],
- quota_in[1]);
- }
-}
-
-
-static void
-custom_shutdown (void *cls)
-{
- if (NULL != measure_task)
- {
- GNUNET_SCHEDULER_cancel (measure_task);
- measure_task = NULL;
- }
- report ();
-}
-
-
-static size_t
-get_size (unsigned int iter)
-{
- size_t ret;
-
- ret = (iter * iter * iter) % 60000;
- ret += sizeof(struct GNUNET_TRANSPORT_TESTING_TestMessage);
- return ret;
-}
-
-
-static void
-notify_receive (void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *receiver,
- const struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *hdr)
-{
- if (GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE != ntohs (hdr->header.type))
- return;
- total_bytes_recv += ntohs (hdr->header.size);
-
- {
- char *ps = GNUNET_strdup (GNUNET_i2s (&receiver->id));
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Peer %u (`%s') got message %u of size %u from peer (`%s')\n",
- receiver->no,
- ps,
- ntohl (hdr->num),
- ntohs (hdr->header.size),
- GNUNET_i2s (sender));
- GNUNET_free (ps);
- }
-}
-
-
-static void
-measure (void *cls)
-{
- static int counter;
-
- measure_task = NULL;
- counter++;
- if ((DURATION.rel_value_us / 1000 / 1000LL) < counter)
- {
- fprintf (stderr, "%s", ".\n");
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
- fprintf (stderr, "%s", ".");
- measure_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
- &measure,
- NULL);
-}
-
-
-static void
-start_task (void *cls)
-{
- static struct GNUNET_TRANSPORT_TESTING_SendClosure sc = {
- .num_messages = TOTAL_MSGS,
- .get_size_cb = &get_size
- };
-
- sc.ccc = ccc;
- measure_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
- &measure,
- NULL);
- start_time = GNUNET_TIME_absolute_get ();
- GNUNET_SCHEDULER_add_now (&GNUNET_TRANSPORT_TESTING_simple_send,
- &sc);
-}
-
-
-static char *
-generate_config (const char *cfg_file,
- unsigned long long quota_in,
- unsigned long long quota_out)
-{
- char *in_name;
- char *out_name;
- char *fname = NULL;
- struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
-
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONFIGURATION_load (cfg,
- cfg_file));
- GNUNET_asprintf (&fname,
- "q_in_%llu_q_out_%llu_%s",
- quota_in,
- quota_out,
- cfg_file);
- GNUNET_CONFIGURATION_set_value_string (cfg,
- "PATHS",
- "DEFAULTCONFIG",
- fname);
- for (int c = 0; c < GNUNET_NT_COUNT; c++)
- {
- GNUNET_asprintf (&in_name,
- "%s_QUOTA_IN",
- GNUNET_NT_to_string (c));
- GNUNET_asprintf (&out_name,
- "%s_QUOTA_OUT",
- GNUNET_NT_to_string (c));
- GNUNET_CONFIGURATION_set_value_number (cfg,
- "ats",
- in_name,
- quota_in);
- GNUNET_CONFIGURATION_set_value_number (cfg,
- "ats",
- out_name,
- quota_out);
- GNUNET_free (in_name);
- GNUNET_free (out_name);
- }
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONFIGURATION_write (cfg,
- fname));
- GNUNET_CONFIGURATION_destroy (cfg);
- return fname;
-}
-
-
-static int
-check (void *cls,
- struct GNUNET_TRANSPORT_TESTING_Handle *tth_,
- const char *test_plugin_,
- const char *test_name_,
- unsigned int num_peers,
- char *cfg_files[])
-{
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext my_ccc = {
- .connect_continuation = &start_task,
- .config_file = "test_quota_compliance_data.conf",
- .rec = ¬ify_receive,
- .nc = &GNUNET_TRANSPORT_TESTING_log_connect,
- .nd = &GNUNET_TRANSPORT_TESTING_log_disconnect,
- .shutdown_task = &custom_shutdown,
- .timeout = TIMEOUT
- };
-
- ccc = &my_ccc;
-
- if (NULL != strstr (test_name_,
- "asymmetric"))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Running asymmetric test with sending peer unlimited,
receiving peer (in/out): %llu/%llu b/s \n",
- quota_in[1],
- quota_out[1]);
- quota_out[0] = 1024 * 1024 * 1024;
- quota_in[0] = 1024 * 1024 * 1024;
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Running symmetric test with (in/out) %llu/%llu b/s \n",
- quota_in[1],
- quota_out[1]);
- }
- for (unsigned int i = 0; i < 2; i++)
- {
- gen_cfgs[i] = generate_config (cfg_files[i],
- quota_in[i],
- quota_out[i]);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Generated config file `%s'\n",
- gen_cfgs[i]);
- }
-
- return GNUNET_TRANSPORT_TESTING_connect_check (&my_ccc,
- tth_,
- test_plugin_,
- test_name_,
- num_peers,
- gen_cfgs);
-}
-
-
-int
-main (int argc,
- char *argv[])
-{
- if (GNUNET_OK !=
- GNUNET_TRANSPORT_TESTING_main (2,
- &check,
- NULL))
- {
- GNUNET_break (0);
- return 1;
- }
- for (unsigned int i = 0; i < 2; i++)
- {
- if ((NULL != gen_cfgs[i]) &&
- (GNUNET_YES == GNUNET_DISK_file_test (gen_cfgs[i])))
- {
- GNUNET_DISK_directory_remove (gen_cfgs[i]);
- GNUNET_free (gen_cfgs[i]);
- }
- }
- return 0;
-}
-
-
-/* end of test_quota_compliance.c */
diff --git
a/src/transport/test_quota_compliance_bluetooth_asymmetric_peer1.conf
b/src/transport/test_quota_compliance_bluetooth_asymmetric_peer1.conf
deleted file mode 100644
index 86bdf6db4..000000000
--- a/src/transport/test_quota_compliance_bluetooth_asymmetric_peer1.conf
+++ /dev/null
@@ -1,12 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-bluetooth-p1/
-
-[transport-bluetooth]
-INTERFACE = hci0
-TESTMODE = 1
-
-[transport]
-PLUGINS = bluetooth
-
-
diff --git
a/src/transport/test_quota_compliance_bluetooth_asymmetric_peer2.conf
b/src/transport/test_quota_compliance_bluetooth_asymmetric_peer2.conf
deleted file mode 100644
index 086688e73..000000000
--- a/src/transport/test_quota_compliance_bluetooth_asymmetric_peer2.conf
+++ /dev/null
@@ -1,11 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-bluetooth-p2/
-
-[transport-bluetooth]
-INTERFACE = hci1
-TESTMODE = 2
-
-[transport]
-PLUGINS = bluetooth
-
diff --git a/src/transport/test_quota_compliance_bluetooth_peer1.conf
b/src/transport/test_quota_compliance_bluetooth_peer1.conf
deleted file mode 100644
index 3f86ee940..000000000
--- a/src/transport/test_quota_compliance_bluetooth_peer1.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-bluetooth-p1/
-
-[transport-bluetooth]
-INTERFACE = hci0
-TESTMODE = 1
-
-[arm]
-PORT = 12164
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12163
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12162
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12161
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12160
-PLUGINS = bluetooth
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
-
diff --git a/src/transport/test_quota_compliance_bluetooth_peer2.conf
b/src/transport/test_quota_compliance_bluetooth_peer2.conf
deleted file mode 100644
index 5fc178395..000000000
--- a/src/transport/test_quota_compliance_bluetooth_peer2.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-bluetooth-p2/
-
-[transport-bluetooth]
-INTERFACE = hci1
-TESTMODE = 2
-
-[arm]
-PORT = 12174
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12173
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12172
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12171
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12170
-PLUGINS = bluetooth
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
diff --git a/src/transport/test_quota_compliance_data.conf
b/src/transport/test_quota_compliance_data.conf
deleted file mode 100644
index 1bc607770..000000000
--- a/src/transport/test_quota_compliance_data.conf
+++ /dev/null
@@ -1,24 +0,0 @@
-@INLINE@ test_transport_defaults.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunetd-plugin-transport/
-
-[transport-tcp]
-PORT = 52368
-TIMEOUT = 5 s
-
-[arm]
-PORT = 52366
-
-[statistics]
-PORT = 52367
-
-[resolver]
-PORT = 52364
-
-[peerinfo]
-PORT = 52369
-
-[transport]
-PORT = 52365
-
-
diff --git a/src/transport/test_quota_compliance_http_asymmetric_peer1.conf
b/src/transport/test_quota_compliance_http_asymmetric_peer1.conf
deleted file mode 100644
index b2ff1913f..000000000
--- a/src/transport/test_quota_compliance_http_asymmetric_peer1.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test_quota_compliance_peer1
-
-[transport-http_client]
-
-[arm]
-PORT = 54015
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_arm_peer1.sock
-
-[statistics]
-PORT = 54014
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_statistics_peer1.sock
-
-[resolver]
-PORT = 54013
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_resolver_peer1.sock
-
-[peerinfo]
-PORT = 54012
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_peerinfo_peer1.sock
-
-[transport]
-PORT = 54011
-PLUGINS = http_client
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_transport_peer1.sock
-
-
diff --git a/src/transport/test_quota_compliance_http_asymmetric_peer2.conf
b/src/transport/test_quota_compliance_http_asymmetric_peer2.conf
deleted file mode 100644
index 3408d9f2e..000000000
--- a/src/transport/test_quota_compliance_http_asymmetric_peer2.conf
+++ /dev/null
@@ -1,32 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test_quota_compliance_peer2
-
-[transport-http_server]
-PORT = 53010
-USE_IPv6 = NO
-BINDTO = 127.0.0.1
-
-
-[arm]
-PORT = 53015
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_arm_peer2.sock
-
-[statistics]
-PORT = 53014
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_statistics_peer2.sock
-
-[resolver]
-PORT = 53013
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_resolver_peer2.sock
-
-[peerinfo]
-PORT = 53012
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_peerinfo_peer2.sock
-
-[transport]
-PORT = 53011
-PLUGINS = http_server
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_transport_peer2.sock
-
-
diff --git a/src/transport/test_quota_compliance_http_peer1.conf
b/src/transport/test_quota_compliance_http_peer1.conf
deleted file mode 100644
index b2ff1913f..000000000
--- a/src/transport/test_quota_compliance_http_peer1.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test_quota_compliance_peer1
-
-[transport-http_client]
-
-[arm]
-PORT = 54015
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_arm_peer1.sock
-
-[statistics]
-PORT = 54014
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_statistics_peer1.sock
-
-[resolver]
-PORT = 54013
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_resolver_peer1.sock
-
-[peerinfo]
-PORT = 54012
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_peerinfo_peer1.sock
-
-[transport]
-PORT = 54011
-PLUGINS = http_client
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_transport_peer1.sock
-
-
diff --git a/src/transport/test_quota_compliance_http_peer2.conf
b/src/transport/test_quota_compliance_http_peer2.conf
deleted file mode 100644
index 3408d9f2e..000000000
--- a/src/transport/test_quota_compliance_http_peer2.conf
+++ /dev/null
@@ -1,32 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test_quota_compliance_peer2
-
-[transport-http_server]
-PORT = 53010
-USE_IPv6 = NO
-BINDTO = 127.0.0.1
-
-
-[arm]
-PORT = 53015
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_arm_peer2.sock
-
-[statistics]
-PORT = 53014
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_statistics_peer2.sock
-
-[resolver]
-PORT = 53013
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_resolver_peer2.sock
-
-[peerinfo]
-PORT = 53012
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_peerinfo_peer2.sock
-
-[transport]
-PORT = 53011
-PLUGINS = http_server
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_http_transport_peer2.sock
-
-
diff --git a/src/transport/test_quota_compliance_https_asymmetric_peer1.conf
b/src/transport/test_quota_compliance_https_asymmetric_peer1.conf
deleted file mode 100644
index 94aa534ef..000000000
--- a/src/transport/test_quota_compliance_https_asymmetric_peer1.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test_quota_compliance_peer1/
-
-[transport-https_client]
-
-[arm]
-PORT = 54006
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_https_arm_peer1.sock
-
-[statistics]
-PORT = 54005
-UNIXPATH =
$GNUNET_RUNTIME_DIR/test_quota_compliance_https_statistics_peer1.sock
-
-[resolver]
-PORT = 54004
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_https_resolver_peer1.sock
-
-[peerinfo]
-PORT = 54003
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_https_peerinfo_peer1.sock
-
-[transport]
-PORT = 54002
-PLUGINS = https_client
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_https_transport_peer1.sock
-
-
diff --git a/src/transport/test_quota_compliance_https_asymmetric_peer2.conf
b/src/transport/test_quota_compliance_https_asymmetric_peer2.conf
deleted file mode 100644
index 8fb8861cd..000000000
--- a/src/transport/test_quota_compliance_https_asymmetric_peer2.conf
+++ /dev/null
@@ -1,31 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test_quota_compliance_peer2
-
-[transport-https_server]
-PORT = 53001
-KEY_FILE = https_key_quota_p2.key
-CERT_FILE = https_cert_qutoa_p2.crt
-
-[arm]
-PORT = 53006
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_https_arm_peer2.sock
-
-[statistics]
-PORT = 53005
-UNIXPATH =
$GNUNET_RUNTIME_DIR/test_quota_compliance_https_statistics_peer2.sock
-
-[resolver]
-PORT = 53004
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_https_resolver_peer2.sock
-
-[peerinfo]
-PORT = 53003
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_https_peerinfo_peer2.sock
-
-[transport]
-PORT = 53002
-PLUGINS = https_server
-UNIXPATH = $GNUNET_RUNTIME_DIR/https_transport_peer2.sock
-
-
diff --git a/src/transport/test_quota_compliance_https_peer1.conf
b/src/transport/test_quota_compliance_https_peer1.conf
deleted file mode 100644
index 94aa534ef..000000000
--- a/src/transport/test_quota_compliance_https_peer1.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test_quota_compliance_peer1/
-
-[transport-https_client]
-
-[arm]
-PORT = 54006
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_https_arm_peer1.sock
-
-[statistics]
-PORT = 54005
-UNIXPATH =
$GNUNET_RUNTIME_DIR/test_quota_compliance_https_statistics_peer1.sock
-
-[resolver]
-PORT = 54004
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_https_resolver_peer1.sock
-
-[peerinfo]
-PORT = 54003
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_https_peerinfo_peer1.sock
-
-[transport]
-PORT = 54002
-PLUGINS = https_client
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_https_transport_peer1.sock
-
-
diff --git a/src/transport/test_quota_compliance_https_peer2.conf
b/src/transport/test_quota_compliance_https_peer2.conf
deleted file mode 100644
index 8fb8861cd..000000000
--- a/src/transport/test_quota_compliance_https_peer2.conf
+++ /dev/null
@@ -1,31 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test_quota_compliance_peer2
-
-[transport-https_server]
-PORT = 53001
-KEY_FILE = https_key_quota_p2.key
-CERT_FILE = https_cert_qutoa_p2.crt
-
-[arm]
-PORT = 53006
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_https_arm_peer2.sock
-
-[statistics]
-PORT = 53005
-UNIXPATH =
$GNUNET_RUNTIME_DIR/test_quota_compliance_https_statistics_peer2.sock
-
-[resolver]
-PORT = 53004
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_https_resolver_peer2.sock
-
-[peerinfo]
-PORT = 53003
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_https_peerinfo_peer2.sock
-
-[transport]
-PORT = 53002
-PLUGINS = https_server
-UNIXPATH = $GNUNET_RUNTIME_DIR/https_transport_peer2.sock
-
-
diff --git a/src/transport/test_quota_compliance_tcp_asymmetric_peer1.conf
b/src/transport/test_quota_compliance_tcp_asymmetric_peer1.conf
deleted file mode 100644
index 0e0cbff24..000000000
--- a/src/transport/test_quota_compliance_tcp_asymmetric_peer1.conf
+++ /dev/null
@@ -1,32 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/quota-tcp-p1/
-
-[transport-tcp]
-PORT = 54094
-
-[transport-udp]
-PORT = 54094
-
-[arm]
-PORT = 54087
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_tcp_arm_peer1.sock
-
-[statistics]
-PORT = 54088
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_tcp_statistics_peer1.sock
-
-[resolver]
-PORT = 54089
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_tcp_resolver_peer1.sock
-
-[peerinfo]
-PORT = 54090
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_tcp_peerinfo_peer1.sock
-
-[transport]
-PORT = 54091
-PLUGINS = tcp
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_tcp_transport_peer1.sock
-
-
diff --git a/src/transport/test_quota_compliance_tcp_asymmetric_peer2.conf
b/src/transport/test_quota_compliance_tcp_asymmetric_peer2.conf
deleted file mode 100644
index e9757b080..000000000
--- a/src/transport/test_quota_compliance_tcp_asymmetric_peer2.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/quota-tcp-p2/
-
-[transport-tcp]
-PORT = 12015
-TIMEOUT = 5 s
-
-[arm]
-PORT = 12014
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12013
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12012
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12011
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12010
-PLUGINS = tcp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
diff --git a/src/transport/test_quota_compliance_tcp_peer1.conf
b/src/transport/test_quota_compliance_tcp_peer1.conf
deleted file mode 100644
index 0e0cbff24..000000000
--- a/src/transport/test_quota_compliance_tcp_peer1.conf
+++ /dev/null
@@ -1,32 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/quota-tcp-p1/
-
-[transport-tcp]
-PORT = 54094
-
-[transport-udp]
-PORT = 54094
-
-[arm]
-PORT = 54087
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_tcp_arm_peer1.sock
-
-[statistics]
-PORT = 54088
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_tcp_statistics_peer1.sock
-
-[resolver]
-PORT = 54089
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_tcp_resolver_peer1.sock
-
-[peerinfo]
-PORT = 54090
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_tcp_peerinfo_peer1.sock
-
-[transport]
-PORT = 54091
-PLUGINS = tcp
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_tcp_transport_peer1.sock
-
-
diff --git a/src/transport/test_quota_compliance_tcp_peer2.conf
b/src/transport/test_quota_compliance_tcp_peer2.conf
deleted file mode 100644
index a7b2cf90b..000000000
--- a/src/transport/test_quota_compliance_tcp_peer2.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport-tcp]
-PORT = 12015
-TIMEOUT = 5 s
-
-[arm]
-PORT = 12014
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12013
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12012
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12011
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12010
-PLUGINS = tcp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
diff --git a/src/transport/test_quota_compliance_udp_peer1.conf
b/src/transport/test_quota_compliance_udp_peer1.conf
deleted file mode 100644
index bba75c168..000000000
--- a/src/transport/test_quota_compliance_udp_peer1.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test_quota_compliance_peer1/
-
-[transport-udp]
-PORT = 54368
-MAX_BPS = 50000000
-
-[arm]
-PORT = 54087
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_udp_arm_peer1.sock
-
-[statistics]
-PORT = 54088
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_udp_statistics_peer1.sock
-
-[resolver]
-PORT = 54089
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_udp_resolver_peer1.sock
-
-[peerinfo]
-PORT = 54090
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_udp_peerinfo_peer1.sock
-
-[transport]
-PORT = 54091
-PLUGINS = udp
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_udp_transport_peer1.sock
-
diff --git a/src/transport/test_quota_compliance_udp_peer2.conf
b/src/transport/test_quota_compliance_udp_peer2.conf
deleted file mode 100644
index 1cb04038c..000000000
--- a/src/transport/test_quota_compliance_udp_peer2.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test_quota_compliance_peer2
-
-[transport-udp]
-PORT = 53368
-MAX_BPS = 50000000
-
-[arm]
-PORT = 53087
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_udp_arm_peer2.sock
-
-[statistics]
-PORT = 53088
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_udp_statistics_peer2.sock
-
-[resolver]
-PORT = 53089
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_udp_resolver_peer2.sock
-
-[peerinfo]
-PORT = 53090
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_udp_peerinfo_peer2.sock
-
-[transport]
-PORT = 53091
-PLUGINS = udp
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_udp_transport_peer2.sock
-
-
diff --git a/src/transport/test_quota_compliance_unix_asymmetric_peer1.conf
b/src/transport/test_quota_compliance_unix_asymmetric_peer1.conf
deleted file mode 100644
index a8ee6d77a..000000000
--- a/src/transport/test_quota_compliance_unix_asymmetric_peer1.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test_quota_compliance_peer1/
-
-[arm]
-PORT = 54087
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_arm_peer1.sock
-
-[statistics]
-PORT = 54088
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_statistics_peer1.sock
-
-[resolver]
-PORT = 54089
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_resolver_peer1.sock
-
-[peerinfo]
-PORT = 54090
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_peerinfo_peer1.sock
-
-[transport]
-PORT = 54091
-PLUGINS = unix
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_transport_peer1.sock
-
-[transport-unix]
-PORT = 54092
-
diff --git a/src/transport/test_quota_compliance_unix_asymmetric_peer2.conf
b/src/transport/test_quota_compliance_unix_asymmetric_peer2.conf
deleted file mode 100644
index 6edbcac9f..000000000
--- a/src/transport/test_quota_compliance_unix_asymmetric_peer2.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test_quota_compliance_peer2
-
-[arm]
-PORT = 53087
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_arm_peer2.sock
-
-[statistics]
-PORT = 53088
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_statistics_peer2.sock
-
-[resolver]
-PORT = 53089
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_resolver_peer2.sock
-
-[peerinfo]
-PORT = 53090
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_peerinfo_peer2.sock
-
-[transport]
-PORT = 53091
-PLUGINS = unix
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_transport_peer2.sock
-
-[transport-unix]
-PORT = 53368
-
diff --git a/src/transport/test_quota_compliance_unix_peer1.conf
b/src/transport/test_quota_compliance_unix_peer1.conf
deleted file mode 100644
index 59c8d6d9e..000000000
--- a/src/transport/test_quota_compliance_unix_peer1.conf
+++ /dev/null
@@ -1,27 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test_quota_compliance_peer1/
-
-[transport-unix]
-PORT = 12120
-
-[arm]
-PORT = 54087
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_arm_peer1.sock
-
-[statistics]
-PORT = 54088
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_statistics_peer1.sock
-
-[resolver]
-PORT = 54089
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_resolver_peer1.sock
-
-[peerinfo]
-PORT = 54090
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_peerinfo_peer1.sock
-
-[transport]
-PORT = 54091
-PLUGINS = unix
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_transport_peer1.sock
diff --git a/src/transport/test_quota_compliance_unix_peer2.conf
b/src/transport/test_quota_compliance_unix_peer2.conf
deleted file mode 100644
index 8c2f9989e..000000000
--- a/src/transport/test_quota_compliance_unix_peer2.conf
+++ /dev/null
@@ -1,31 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test_quota_compliance_peer2
-
-[transport-unix]
-PORT = 12136
-
-[arm]
-PORT = 53087
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_arm_peer2.sock
-
-[statistics]
-PORT = 53088
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_statistics_peer2.sock
-
-[resolver]
-PORT = 53089
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_resolver_peer2.sock
-
-[peerinfo]
-PORT = 53090
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_peerinfo_peer2.sock
-
-[transport]
-PORT = 53091
-PLUGINS = unix
-UNIXPATH = $GNUNET_RUNTIME_DIR/test_quota_compliance_unix_transport_peer2.sock
-
-[transport-unix]
-PORT = 53368
-
diff --git a/src/transport/test_quota_compliance_wlan_asymmetric_peer1.conf
b/src/transport/test_quota_compliance_wlan_asymmetric_peer1.conf
deleted file mode 100644
index 78e280b68..000000000
--- a/src/transport/test_quota_compliance_wlan_asymmetric_peer1.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-wlan-p1/
-
-[transport-wlan]
-TESTMODE = 1
-
-[arm]
-PORT = 12164
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12163
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12162
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12161
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12160
-PLUGINS = wlan
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
-
diff --git a/src/transport/test_quota_compliance_wlan_asymmetric_peer2.conf
b/src/transport/test_quota_compliance_wlan_asymmetric_peer2.conf
deleted file mode 100644
index e97ab3f38..000000000
--- a/src/transport/test_quota_compliance_wlan_asymmetric_peer2.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-wlan-p2/
-
-[transport-wlan]
-INTERFACE = mon1
-TESTMODE = 2
-
-[arm]
-PORT = 12174
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12173
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12172
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12171
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12170
-PLUGINS = wlan
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
diff --git a/src/transport/test_quota_compliance_wlan_peer1.conf
b/src/transport/test_quota_compliance_wlan_peer1.conf
deleted file mode 100644
index 78e280b68..000000000
--- a/src/transport/test_quota_compliance_wlan_peer1.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-wlan-p1/
-
-[transport-wlan]
-TESTMODE = 1
-
-[arm]
-PORT = 12164
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12163
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12162
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12161
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12160
-PLUGINS = wlan
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
-
diff --git a/src/transport/test_quota_compliance_wlan_peer2.conf
b/src/transport/test_quota_compliance_wlan_peer2.conf
deleted file mode 100644
index e97ab3f38..000000000
--- a/src/transport/test_quota_compliance_wlan_peer2.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-wlan-p2/
-
-[transport-wlan]
-INTERFACE = mon1
-TESTMODE = 2
-
-[arm]
-PORT = 12174
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12173
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12172
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12171
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12170
-PLUGINS = wlan
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
diff --git a/src/transport/test_transport_address_switch_http_peer1.conf
b/src/transport/test_transport_address_switch_http_peer1.conf
deleted file mode 100644
index b48c5f47f..000000000
--- a/src/transport/test_transport_address_switch_http_peer1.conf
+++ /dev/null
@@ -1,26 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[ats]
-UNSPECIFIED_QUOTA_IN = 8 KiB
-UNSPECIFIED_QUOTA_OUT = 8 KiB
-# LOOPBACK
-LOOPBACK_QUOTA_IN = 8 KiB
-LOOPBACK_QUOTA_OUT = 8 KiB
-# LAN
-LAN_QUOTA_IN = 8 KiB
-LAN_QUOTA_OUT = 8 KiB
-# WAN
-WAN_QUOTA_IN = 8 KiB
-WAN_QUOTA_OUT = 8 KiB
-# WLAN
-WLAN_QUOTA_IN = 8 KiB
-WLAN_QUOTA_OUT = 8 KiB
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = 8 KiB
-BLUETOOTH_QUOTA_OUT = 8 KiB
-
-[transport]
-PLUGINS = http_server http_client
-
diff --git a/src/transport/test_transport_address_switch_http_peer2.conf
b/src/transport/test_transport_address_switch_http_peer2.conf
deleted file mode 100644
index be8fb506c..000000000
--- a/src/transport/test_transport_address_switch_http_peer2.conf
+++ /dev/null
@@ -1,26 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[ats]
-UNSPECIFIED_QUOTA_IN = 8 KiB
-UNSPECIFIED_QUOTA_OUT = 8 KiB
-# LOOPBACK
-LOOPBACK_QUOTA_IN = 8 KiB
-LOOPBACK_QUOTA_OUT = 8 KiB
-# LAN
-LAN_QUOTA_IN = 8 KiB
-LAN_QUOTA_OUT = 8 KiB
-# WAN
-WAN_QUOTA_IN = 8 KiB
-WAN_QUOTA_OUT = 8 KiB
-# WLAN
-WLAN_QUOTA_IN = 8 KiB
-WLAN_QUOTA_OUT = 8 KiB
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = 8 KiB
-BLUETOOTH_QUOTA_OUT = 8 KiB
-
-[transport]
-PLUGINS = http_client http_server
-
diff --git a/src/transport/test_transport_address_switch_https_peer1.conf
b/src/transport/test_transport_address_switch_https_peer1.conf
deleted file mode 100644
index 1f9210130..000000000
--- a/src/transport/test_transport_address_switch_https_peer1.conf
+++ /dev/null
@@ -1,44 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[ats]
-UNSPECIFIED_QUOTA_IN = 8 KiB
-UNSPECIFIED_QUOTA_OUT = 8 KiB
-# LOOPBACK
-LOOPBACK_QUOTA_IN = 8 KiB
-LOOPBACK_QUOTA_OUT = 8 KiB
-# LAN
-LAN_QUOTA_IN = 8 KiB
-LAN_QUOTA_OUT = 8 KiB
-# WAN
-WAN_QUOTA_IN = 8 KiB
-WAN_QUOTA_OUT = 8 KiB
-# WLAN
-WLAN_QUOTA_IN = 8 KiB
-WLAN_QUOTA_OUT = 8 KiB
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = 8 KiB
-BLUETOOTH_QUOTA_OUT = 8 KiB
-
-[arm]
-PORT = 12005
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12004
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12003
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12002
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12001
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-PLUGINS = https_client https_server
-
diff --git a/src/transport/test_transport_address_switch_https_peer2.conf
b/src/transport/test_transport_address_switch_https_peer2.conf
deleted file mode 100644
index c58839868..000000000
--- a/src/transport/test_transport_address_switch_https_peer2.conf
+++ /dev/null
@@ -1,44 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[ats]
-UNSPECIFIED_QUOTA_IN = 8 KiB
-UNSPECIFIED_QUOTA_OUT = 8 KiB
-# LOOPBACK
-LOOPBACK_QUOTA_IN = 8 KiB
-LOOPBACK_QUOTA_OUT = 8 KiB
-# LAN
-LAN_QUOTA_IN = 8 KiB
-LAN_QUOTA_OUT = 8 KiB
-# WAN
-WAN_QUOTA_IN = 8 KiB
-WAN_QUOTA_OUT = 8 KiB
-# WLAN
-WLAN_QUOTA_IN = 8 KiB
-WLAN_QUOTA_OUT = 8 KiB
-# BLUETOOTH
-BLUETOOTH_QUOTA_IN = 8 KiB
-BLUETOOTH_QUOTA_OUT = 8 KiB
-
-[arm]
-PORT = 12014
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12013
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12012
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12011
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12010
-PLUGINS = https_client https_server
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
diff --git a/src/transport/test_transport_api_blacklisting.c
b/src/transport/test_transport_api_blacklisting.c
deleted file mode 100644
index 2ba88a863..000000000
--- a/src/transport/test_transport_api_blacklisting.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009, 2010, 2011, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/test_transport_api_blacklisting.c
- * @brief test for the blacklisting API
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_transport_service.h"
-#include "transport-testing.h"
-
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
-
-static struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc;
-
-static int connected;
-
-static int blacklist_request_p1;
-
-static int blacklist_request_p2;
-
-static struct GNUNET_TRANSPORT_Blacklist *blacklist_p1;
-
-static struct GNUNET_TRANSPORT_Blacklist *blacklist_p2;
-
-static struct GNUNET_SCHEDULER_Task *shutdown_task;
-
-
-static void
-end (void *cls)
-{
- shutdown_task = NULL;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Stopping\n");
- if ((GNUNET_YES == blacklist_request_p1) &&
- (GNUNET_YES == blacklist_request_p2) &&
- (GNUNET_NO == connected))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Peers were never connected, success\n");
- ccc->global_ret = GNUNET_OK;
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Peers were not connected, fail\n");
- ccc->global_ret = GNUNET_SYSERR;
- }
- GNUNET_SCHEDULER_shutdown ();
-}
-
-
-static void
-custom_shutdown (void *cls)
-{
- if (NULL != shutdown_task)
- {
- GNUNET_SCHEDULER_cancel (shutdown_task);
- shutdown_task = NULL;
- }
- if (NULL != blacklist_p1)
- {
- GNUNET_TRANSPORT_blacklist_cancel (blacklist_p1);
- blacklist_p1 = NULL;
- }
- if (NULL != blacklist_p2)
- {
- GNUNET_TRANSPORT_blacklist_cancel (blacklist_p2);
- blacklist_p2 = NULL;
- }
-}
-
-
-static void
-notify_receive (void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *receiver,
- const struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unexpectedly even received the message despite blacklist\n");
- connected = GNUNET_YES;
- GNUNET_SCHEDULER_cancel (shutdown_task);
- end (NULL);
-}
-
-
-static void
-notify_connect (void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *me,
- const struct GNUNET_PeerIdentity *other)
-{
- GNUNET_TRANSPORT_TESTING_log_connect (cls,
- me,
- other);
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Peers connected despite blacklist!\n");
- connected = GNUNET_YES; /* this test now failed */
- GNUNET_SCHEDULER_cancel (shutdown_task);
- end (NULL);
-}
-
-
-static int
-blacklist_cb (void *cls,
- const struct GNUNET_PeerIdentity *pid)
-{
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p = cls;
- int res = GNUNET_SYSERR;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Peer %u: Blacklist request for peer `%s'\n",
- p->no,
- GNUNET_i2s (pid));
-
- if (p == ccc->p[0])
- {
- blacklist_request_p1 = GNUNET_YES;
- res = GNUNET_OK;
- }
- if (p == ccc->p[1])
- {
- blacklist_request_p2 = GNUNET_YES;
- res = GNUNET_SYSERR;
- }
-
- if ((GNUNET_YES == blacklist_request_p2) &&
- (GNUNET_YES == blacklist_request_p1) &&
- (NULL == shutdown_task))
- {
- shutdown_task
- = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (
- GNUNET_TIME_UNIT_SECONDS, 3),
- &end,
- NULL);
- }
- return res;
-}
-
-
-static void
-start_blacklist (void *cls)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Starting blacklists\n");
- blacklist_p1 = GNUNET_TRANSPORT_blacklist (ccc->p[0]->cfg,
- &blacklist_cb,
- ccc->p[0]);
- GNUNET_assert (NULL != blacklist_p1);
- blacklist_p2 = GNUNET_TRANSPORT_blacklist (ccc->p[1]->cfg,
- &blacklist_cb,
- ccc->p[1]);
- GNUNET_assert (NULL != blacklist_p2);
-}
-
-
-int
-main (int argc,
- char *argv[])
-{
- struct GNUNET_TRANSPORT_TESTING_SendClosure sc = {
- .num_messages = 1
- };
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext my_ccc = {
- .pre_connect_task = &start_blacklist,
- .connect_continuation = &GNUNET_TRANSPORT_TESTING_simple_send,
- .connect_continuation_cls = &sc,
- .config_file = "test_transport_api_data.conf",
- .rec = ¬ify_receive,
- .nc = ¬ify_connect,
- .nd = &GNUNET_TRANSPORT_TESTING_log_disconnect,
- .shutdown_task = &custom_shutdown,
- .timeout = TIMEOUT,
- .bi_directional = GNUNET_YES
- };
-
- ccc = &my_ccc;
- if (GNUNET_OK !=
- GNUNET_TRANSPORT_TESTING_main (2,
- &GNUNET_TRANSPORT_TESTING_connect_check,
- ccc))
- return 1;
- return 0;
-}
-
-
-/* end of transport_api_blacklisting.c */
diff --git a/src/transport/test_transport_api_blacklisting_tcp_peer1.conf
b/src/transport/test_transport_api_blacklisting_tcp_peer1.conf
deleted file mode 100644
index eabd6b701..000000000
--- a/src/transport/test_transport_api_blacklisting_tcp_peer1.conf
+++ /dev/null
@@ -1,9 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport]
-PLUGINS = tcp
-
-#[transport]
-#PREFIX = valgrind
diff --git a/src/transport/test_transport_api_blacklisting_tcp_peer2.conf
b/src/transport/test_transport_api_blacklisting_tcp_peer2.conf
deleted file mode 100644
index 58ce0777f..000000000
--- a/src/transport/test_transport_api_blacklisting_tcp_peer2.conf
+++ /dev/null
@@ -1,9 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport]
-PLUGINS = tcp
-
-#[transport]
-#PREFIX = valgrind
diff --git a/src/transport/test_transport_api_bluetooth_peer1.conf
b/src/transport/test_transport_api_bluetooth_peer1.conf
deleted file mode 100644
index b1209e44b..000000000
--- a/src/transport/test_transport_api_bluetooth_peer1.conf
+++ /dev/null
@@ -1,10 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-bluetooth-p1/
-
-[transport-bluetooth]
-INTERFACE = hci0
-TESTMODE = 1
-
-[transport]
-PLUGINS = bluetooth
diff --git a/src/transport/test_transport_api_bluetooth_peer2.conf
b/src/transport/test_transport_api_bluetooth_peer2.conf
deleted file mode 100644
index 371a5d3b0..000000000
--- a/src/transport/test_transport_api_bluetooth_peer2.conf
+++ /dev/null
@@ -1,10 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-bluetooth-p2/
-
-[transport-bluetooth]
-INTERFACE = hci1
-TESTMODE = 2
-
-[transport]
-PLUGINS = bluetooth
diff --git a/src/transport/test_transport_api_disconnect.c
b/src/transport/test_transport_api_disconnect.c
deleted file mode 100644
index c469f28bc..000000000
--- a/src/transport/test_transport_api_disconnect.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009, 2010, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/test_transport_api_disconnect.c
- * @brief base test case for transport implementations
- *
- * This test case tests disconnect notifications in peer shutdown.
- * Starts two peers, has them connect, sends a message in between,
- * stops one peer, expects the others to send a disconnect notification.
- */
-#include "platform.h"
-#include "gnunet_transport_service.h"
-#include "transport-testing.h"
-
-/**
- * How long until we give up on transmitting the message?
- */
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 120)
-
-
-static struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc;
-
-static int shutdown_;
-
-
-static void
-notify_disconnect (void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *me,
- const struct GNUNET_PeerIdentity *other)
-{
- if (me != ccc->p[0])
- return;
- GNUNET_TRANSPORT_TESTING_log_disconnect (cls,
- me,
- other);
- if (GNUNET_YES == shutdown_)
- {
- ccc->global_ret = GNUNET_OK;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Test good, shutting down...\n");
- GNUNET_SCHEDULER_shutdown ();
- }
-}
-
-
-static void
-stop_peer (void *cls)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Shutting down peer %u (`%s')\n",
- ccc->p[1]->no,
- GNUNET_i2s (&ccc->p[1]->id));
- shutdown_ = GNUNET_YES;
- GNUNET_TRANSPORT_TESTING_stop_peer (ccc->p[1]);
- ccc->p[1] = NULL;
-}
-
-
-static void
-notify_receive (void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *receiver,
- const struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- {
- char *ps = GNUNET_strdup (GNUNET_i2s (&receiver->id));
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Peer %u (`%s') received message of type %d and size %u size
from peer %s!\n",
- receiver->no,
- ps,
- ntohs (message->header.type),
- ntohs (message->header.size),
- GNUNET_i2s (sender));
- GNUNET_free (ps);
- }
- if ((GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE == ntohs (message->header.type))
&&
- (sizeof(struct GNUNET_TRANSPORT_TESTING_TestMessage) == ntohs (
- message->header.size)))
- {
- GNUNET_SCHEDULER_add_now (&stop_peer,
- NULL);
- return;
- }
-}
-
-
-int
-main (int argc,
- char *argv[])
-{
- struct GNUNET_TRANSPORT_TESTING_SendClosure sc = {
- .num_messages = 1
- };
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext my_ccc = {
- .connect_continuation = &GNUNET_TRANSPORT_TESTING_simple_send,
- .connect_continuation_cls = &sc,
- .config_file = "test_transport_api_data.conf",
- .rec = ¬ify_receive,
- .nc = &GNUNET_TRANSPORT_TESTING_log_connect,
- .nd = ¬ify_disconnect,
- .timeout = TIMEOUT,
- .global_ret = GNUNET_SYSERR
- };
-
- ccc = &my_ccc;
- sc.ccc = ccc;
- if (GNUNET_OK !=
- GNUNET_TRANSPORT_TESTING_main (2,
- &GNUNET_TRANSPORT_TESTING_connect_check,
- ccc))
- return 1;
- return 0;
-}
-
-
-/* end of test_transport_api_disconnect.c */
diff --git a/src/transport/test_transport_api_disconnect_tcp_peer1.conf
b/src/transport/test_transport_api_disconnect_tcp_peer1.conf
deleted file mode 100644
index 8530ba310..000000000
--- a/src/transport/test_transport_api_disconnect_tcp_peer1.conf
+++ /dev/null
@@ -1,7 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport]
-PLUGINS = tcp
-
diff --git a/src/transport/test_transport_api_disconnect_tcp_peer2.conf
b/src/transport/test_transport_api_disconnect_tcp_peer2.conf
deleted file mode 100644
index ce9c2f885..000000000
--- a/src/transport/test_transport_api_disconnect_tcp_peer2.conf
+++ /dev/null
@@ -1,8 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport]
-PLUGINS = tcp
-
-
diff --git a/src/transport/test_transport_api_http_peer1.conf
b/src/transport/test_transport_api_http_peer1.conf
deleted file mode 100644
index 2a622ae02..000000000
--- a/src/transport/test_transport_api_http_peer1.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-http-p1/
-
-[transport]
-PLUGINS = http_client
diff --git a/src/transport/test_transport_api_http_peer2.conf
b/src/transport/test_transport_api_http_peer2.conf
deleted file mode 100644
index aca41804b..000000000
--- a/src/transport/test_transport_api_http_peer2.conf
+++ /dev/null
@@ -1,6 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-http-p2/
-
-[transport]
-PLUGINS = http_server
diff --git a/src/transport/test_transport_api_http_reverse_peer1.conf
b/src/transport/test_transport_api_http_reverse_peer1.conf
deleted file mode 100644
index 67640d7bb..000000000
--- a/src/transport/test_transport_api_http_reverse_peer1.conf
+++ /dev/null
@@ -1,11 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-http-p1/
-
-[transport]
-PLUGINS = http_client
-
-[ats]
-WAN_QUOTA_IN = unlimited
-WAN_QUOTA_OUT = unlimited
-
diff --git a/src/transport/test_transport_api_http_reverse_peer2.conf
b/src/transport/test_transport_api_http_reverse_peer2.conf
deleted file mode 100644
index 0e7a2ea05..000000000
--- a/src/transport/test_transport_api_http_reverse_peer2.conf
+++ /dev/null
@@ -1,12 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-http-p2/
-
-[transport-http_server]
-PORT = 8080
-EXTERNAL_HOSTNAME = fulcrum.net.in.tum.de/gnunet
-EXTERNAL_HOSTNAME_ONLY = YES
-
-[transport]
-PLUGINS = http_server
-
diff --git a/src/transport/test_transport_api_https_peer1.conf
b/src/transport/test_transport_api_https_peer1.conf
deleted file mode 100644
index 55d119259..000000000
--- a/src/transport/test_transport_api_https_peer1.conf
+++ /dev/null
@@ -1,26 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-https-p1/
-
-[arm]
-PORT = 12105
-
-[statistics]
-PORT = 12104
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12103
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12102
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12101
-PLUGINS = https_client
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-#PREFIX = valgrind
-
-
diff --git a/src/transport/test_transport_api_https_peer2.conf
b/src/transport/test_transport_api_https_peer2.conf
deleted file mode 100644
index 3b1d55b0a..000000000
--- a/src/transport/test_transport_api_https_peer2.conf
+++ /dev/null
@@ -1,32 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-https-p2/
-
-[transport-https_server]
-EXTERNAL_HOSTNAME = localhost
-EXTERNAL_HOSTNAME_ONLY = yes
-EXTERNAL_HOSTNAME_USE_PORT = YES
-
-[arm]
-PORT = 12115
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12114
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12113
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12112
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12111
-PLUGINS = https_server
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-#PREFIX = valgrind
-
-
diff --git a/src/transport/test_transport_api_limited_sockets.c
b/src/transport/test_transport_api_limited_sockets.c
deleted file mode 100644
index 0e47800e8..000000000
--- a/src/transport/test_transport_api_limited_sockets.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009, 2010 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/test_transport_api_limited_sockets.c
- * @brief base test case for transport implementations
- *
- * This test case serves as a base for tcp, udp, and udp-nat
- * transport test cases. Based on the executable being run
- * the correct test case will be performed. Conservation of
- * C code apparently.
- */
-#include "platform.h"
-#include "gnunet_transport_service.h"
-#include "transport-testing.h"
-
-/**
- * How long until we give up on transmitting the message?
- */
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 300)
-
-#define MAX_FILES 50
-
-
-#if HAVE_SETRLIMIT
-
-static struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc;
-
-
-static void
-notify_receive (void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *receiver,
- const struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received message of type %d from peer %s!\n",
- ntohs (message->header.type),
- GNUNET_i2s (sender));
- if ((GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE ==
- ntohs (message->header.type)) &&
- (sizeof(struct GNUNET_TRANSPORT_TESTING_TestMessage) ==
- ntohs (message->header.size)))
- {
- ccc->global_ret = GNUNET_OK;
- }
- else
- {
- GNUNET_break (0);
- }
- GNUNET_SCHEDULER_shutdown ();
-}
-
-
-int
-main (int argc, char *argv[])
-{
- struct GNUNET_TRANSPORT_TESTING_SendClosure sc = {
- .num_messages = 1
- };
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext my_ccc = {
- .connect_continuation = &GNUNET_TRANSPORT_TESTING_simple_send,
- .connect_continuation_cls = &sc,
- .config_file = "test_transport_api_data.conf",
- .rec = ¬ify_receive,
- .nc = &GNUNET_TRANSPORT_TESTING_log_connect,
- .nd = &GNUNET_TRANSPORT_TESTING_log_disconnect,
- .timeout = TIMEOUT,
- .global_ret = GNUNET_SYSERR
- };
- struct rlimit r_file_old;
- struct rlimit r_file_new;
- int res;
-
- sc.ccc = &my_ccc;
- res = getrlimit (RLIMIT_NOFILE,
- &r_file_old);
- r_file_new.rlim_cur = MAX_FILES;
- r_file_new.rlim_max = r_file_old.rlim_max;
- res = setrlimit (RLIMIT_NOFILE,
- &r_file_new);
- if (0 != res)
- {
- fprintf (stderr,
- "Setting limit failed: %s\n",
- strerror (errno));
- return 77;
- }
-
- ccc = &my_ccc;
- ccc->global_ret = GNUNET_SYSERR;
- if (GNUNET_OK !=
- GNUNET_TRANSPORT_TESTING_main (2,
- &GNUNET_TRANSPORT_TESTING_connect_check,
- ccc))
- return 1;
- return 0;
-}
-
-
-#else
-/* cannot setrlimit */
-
-
-int
-main (int argc, char *argv[])
-{
- fprintf (stderr,
- "Cannot run test on this system\n");
- return 77;
-}
-
-
-#endif
-
-/* end of test_transport_api_limited_sockets.c */
diff --git a/src/transport/test_transport_api_limited_sockets_tcp_peer1.conf
b/src/transport/test_transport_api_limited_sockets_tcp_peer1.conf
deleted file mode 100644
index e0ad5f847..000000000
--- a/src/transport/test_transport_api_limited_sockets_tcp_peer1.conf
+++ /dev/null
@@ -1,7 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport]
-PLUGINS = tcp
diff --git a/src/transport/test_transport_api_limited_sockets_tcp_peer2.conf
b/src/transport/test_transport_api_limited_sockets_tcp_peer2.conf
deleted file mode 100644
index bb466abba..000000000
--- a/src/transport/test_transport_api_limited_sockets_tcp_peer2.conf
+++ /dev/null
@@ -1,8 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-@INLINE@ ../../contrib/conf/gnunet/no_autostart_above_core.conf
-
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport]
-PLUGINS = tcp
diff --git a/src/transport/test_transport_api_manipulation_cfg.c
b/src/transport/test_transport_api_manipulation_cfg.c
deleted file mode 100644
index 73c81114e..000000000
--- a/src/transport/test_transport_api_manipulation_cfg.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009, 2010, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/test_transport_api_manipulation_cfg.c
- * @brief base test case for transport traffic manipulation implementation
- * based on cfg
- *
- * Peer 1 has inbound and outbound delay of 100ms
- * Peer 2 has no inbound and outbound delay
- *
- * We send a request from P1 to P2 and expect delay of >= TEST_DELAY us
- * Then we send response from P2 to P1 and expect delay of >= TEST_DELAY us
- */
-#include "platform.h"
-#include "gnunet_transport_service.h"
-#include "transport-testing.h"
-
-/**
- * How long until we give up on transmitting the message?
- */
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 120)
-
-
-#define TEST_MESSAGE_SIZE 2600
-
-#define TEST_RESPONSE_MESSAGE_TYPE
-
-/**
- * Test delay, in microseconds.
- */
-#define TEST_DELAY 100 * 1000LL
-
-
-static struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc;
-
-static struct GNUNET_TIME_Absolute start_request;
-
-static struct GNUNET_TIME_Absolute start_response;
-
-
-static void
-sendtask_response_task (void *cls)
-{
- int ret;
-
- start_response = GNUNET_TIME_absolute_get ();
- ret = GNUNET_TRANSPORT_TESTING_send (ccc->p[1],
- ccc->p[0],
- GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE2,
- TEST_MESSAGE_SIZE,
- 1,
- NULL,
- NULL);
- if (GNUNET_NO == ret)
- {
- GNUNET_break (0);
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
- GNUNET_assert (GNUNET_SYSERR != ret);
-}
-
-
-static void
-notify_receive (void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *receiver,
- const struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- struct GNUNET_TIME_Relative duration;
-
- {
- char *ps = GNUNET_strdup (GNUNET_i2s (&receiver->id));
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Peer %u (`%s') received message of type %d and size %u size
from peer %s)!\n",
- receiver->no,
- ps,
- ntohs (message->header.type),
- ntohs (message->header.size),
- GNUNET_i2s (sender));
- GNUNET_free (ps);
- }
-
- switch (ntohs (message->header.type))
- {
- case GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE:
- duration = GNUNET_TIME_absolute_get_difference (start_request,
- GNUNET_TIME_absolute_get
());
- if (duration.rel_value_us >= TEST_DELAY)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Request message was delayed for %s\n",
- GNUNET_STRINGS_relative_time_to_string (duration,
- GNUNET_YES));
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Request message was delayed for unexpected duration %s\n",
- GNUNET_STRINGS_relative_time_to_string (duration,
- GNUNET_YES));
- ccc->global_ret = GNUNET_SYSERR;
- GNUNET_SCHEDULER_shutdown ();
- }
- /* Send response */
- GNUNET_SCHEDULER_add_now (&sendtask_response_task,
- NULL);
- return;
-
- case GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE2:
- duration = GNUNET_TIME_absolute_get_difference (start_response,
- GNUNET_TIME_absolute_get
());
- if (duration.rel_value_us >= TEST_DELAY)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Response message was delayed for %s\n",
- GNUNET_STRINGS_relative_time_to_string (duration,
- GNUNET_YES));
- ccc->global_ret = GNUNET_OK;
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Response message was delayed for unexpected duration %s\n",
- GNUNET_STRINGS_relative_time_to_string (duration,
- GNUNET_YES));
- ccc->global_ret = GNUNET_SYSERR;
- }
- GNUNET_SCHEDULER_shutdown ();
- break;
-
- default:
- GNUNET_break (0);
- break;
- }
-}
-
-
-int
-main (int argc,
- char *argv[])
-{
- struct GNUNET_TRANSPORT_TESTING_SendClosure sc = {
- .num_messages = 1
- };
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext my_ccc = {
- .connect_continuation = &GNUNET_TRANSPORT_TESTING_large_send,
- .connect_continuation_cls = &sc,
- .config_file = "test_transport_api_data.conf",
- .rec = ¬ify_receive,
- .nc = &GNUNET_TRANSPORT_TESTING_log_connect,
- .nd = &GNUNET_TRANSPORT_TESTING_log_disconnect,
- .timeout = TIMEOUT
- };
-
- ccc = &my_ccc;
- sc.ccc = ccc;
- start_request = GNUNET_TIME_absolute_get ();
- if (GNUNET_OK !=
- GNUNET_TRANSPORT_TESTING_main (2,
- &GNUNET_TRANSPORT_TESTING_connect_check,
- ccc))
- return 1;
- return 0;
-}
-
-
-/* end of test_transport_api_manipulation_cfg.c */
diff --git a/src/transport/test_transport_api_manipulation_cfg_peer1.conf
b/src/transport/test_transport_api_manipulation_cfg_peer1.conf
deleted file mode 100644
index 77cdce2e2..000000000
--- a/src/transport/test_transport_api_manipulation_cfg_peer1.conf
+++ /dev/null
@@ -1,8 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport]
-PLUGINS = tcp
-MANIPULATE_DELAY_IN = 100 ms
-MANIPULATE_DELAY_OUT = 100 ms
diff --git a/src/transport/test_transport_api_manipulation_cfg_peer2.conf
b/src/transport/test_transport_api_manipulation_cfg_peer2.conf
deleted file mode 100644
index 9cbaaddef..000000000
--- a/src/transport/test_transport_api_manipulation_cfg_peer2.conf
+++ /dev/null
@@ -1,8 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport]
-PLUGINS = tcp
-#MANIPULATE_DELAY_IN = 0 ms
-#MANIPULATE_DELAY_OUT = 0 ms
diff --git a/src/transport/test_transport_api_manipulation_recv_tcp.c
b/src/transport/test_transport_api_manipulation_recv_tcp.c
deleted file mode 100644
index 207c4416f..000000000
--- a/src/transport/test_transport_api_manipulation_recv_tcp.c
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009, 2010, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/test_transport_api_manipulation_recv_tcp.c
- * @brief base test case for transport traffic manipulation implementation
- *
- * This test case will setup 2 peers and connect them, the first message
- * will be sent without manipulation, then a receive delay of 1 second will
- * be configured and 2 more message will be sent. Time will be measured
- *
- * In addition the distance on receiver side will be manipulated to be 10
- */
-#include "platform.h"
-#include "gnunet_transport_service.h"
-#include "transport-testing.h"
-
-/**
- * How long until we give up on transmitting the message?
- */
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 120)
-
-
-static struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc;
-
-static int messages_recv;
-
-static struct GNUNET_TIME_Absolute start_normal;
-
-static struct GNUNET_TIME_Relative dur_normal;
-
-static struct GNUNET_TIME_Absolute start_delayed;
-
-static struct GNUNET_TIME_Relative dur_delayed;
-
-
-static void
-do_free (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_SendClosure *sc = cls;
-
- GNUNET_free (sc);
-}
-
-
-static void
-delayed_transmit (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_SendClosure *sc = cls;
-
- start_delayed = GNUNET_TIME_absolute_get ();
- GNUNET_TRANSPORT_TESTING_large_send (sc);
-}
-
-
-static void
-sendtask (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_SendClosure *sc;
- struct GNUNET_ATS_Properties prop;
- struct GNUNET_TIME_Relative delay;
-
- sc = GNUNET_new (struct GNUNET_TRANSPORT_TESTING_SendClosure);
- sc->num_messages = 1;
- sc->ccc = ccc;
- sc->cont = &do_free;
- sc->cont_cls = sc;
- if (0 == messages_recv)
- {
- start_normal = GNUNET_TIME_absolute_get ();
- }
- if (0 < messages_recv)
- {
- memset (&prop,
- 0,
- sizeof(prop));
- delay = GNUNET_TIME_UNIT_SECONDS;
- GNUNET_TRANSPORT_manipulation_set (ccc->p[1]->tmh,
- &ccc->p[0]->id,
- &prop,
- delay,
- GNUNET_TIME_UNIT_ZERO);
- /* wait 1s to allow manipulation to go into effect */
- if (1 == messages_recv)
- {
- GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
- &delayed_transmit,
- sc);
- return;
- }
- }
- GNUNET_TRANSPORT_TESTING_large_send (sc);
-}
-
-
-static void
-notify_receive (void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *receiver,
- const struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- {
- char *ps = GNUNET_strdup (GNUNET_i2s (&receiver->id));
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Peer %u (`%s') received message of type %d and size %u size
from peer %s)!\n",
- receiver->no,
- ps,
- ntohs (message->header.type),
- ntohs (message->header.size),
- GNUNET_i2s (sender));
- GNUNET_free (ps);
- }
- if ((GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE != ntohs (message->header.type))
||
- (GNUNET_TRANSPORT_TESTING_LARGE_MESSAGE_SIZE != ntohs (
- message->header.size)))
- {
- GNUNET_break (0);
- ccc->global_ret = GNUNET_SYSERR;
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
-
- if (messages_recv <= 2)
- {
- /* Received non-delayed message */
- dur_normal = GNUNET_TIME_absolute_get_duration (start_normal);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received non-delayed message %u after %s\n",
- messages_recv,
- GNUNET_STRINGS_relative_time_to_string (dur_normal,
- GNUNET_YES));
- GNUNET_SCHEDULER_add_now (&sendtask,
- NULL);
- messages_recv++;
- return;
- }
- /* Received manipulated message */
- dur_delayed = GNUNET_TIME_absolute_get_duration (start_delayed);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received delayed message %u after %s\n",
- messages_recv,
- GNUNET_STRINGS_relative_time_to_string (dur_delayed,
- GNUNET_YES));
- if (dur_delayed.rel_value_us < GNUNET_TIME_UNIT_SECONDS.rel_value_us)
- {
- GNUNET_break (0);
- ccc->global_ret = GNUNET_SYSERR;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Delayed message was not delayed correctly: took only %s\n",
- GNUNET_STRINGS_relative_time_to_string (dur_delayed,
- GNUNET_YES));
- }
- else
- {
- ccc->global_ret = GNUNET_OK;
- }
- /* shutdown */
- GNUNET_SCHEDULER_shutdown ();
-}
-
-
-int
-main (int argc,
- char *argv[])
-{
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext my_ccc = {
- .connect_continuation = &sendtask,
- .config_file = "test_transport_api_data.conf",
- .rec = ¬ify_receive,
- .nc = &GNUNET_TRANSPORT_TESTING_log_connect,
- .nd = &GNUNET_TRANSPORT_TESTING_log_disconnect,
- .timeout = TIMEOUT,
- .global_ret = GNUNET_NO
- };
-
- ccc = &my_ccc;
- if (GNUNET_OK !=
- GNUNET_TRANSPORT_TESTING_main (2,
- &GNUNET_TRANSPORT_TESTING_connect_check,
- ccc))
- return 1;
- return 0;
-}
-
-
-/* end of test_transport_api_manipulation_recv_tcp.c */
diff --git a/src/transport/test_transport_api_manipulation_recv_tcp_peer1.conf
b/src/transport/test_transport_api_manipulation_recv_tcp_peer1.conf
deleted file mode 100644
index 9150c7faf..000000000
--- a/src/transport/test_transport_api_manipulation_recv_tcp_peer1.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport-tcp]
-PORT = 12000
-TIMEOUT = 5 s
-
-[arm]
-PORT = 12005
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12004
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12003
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12002
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12001
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-PLUGINS = tcp
-
diff --git a/src/transport/test_transport_api_manipulation_recv_tcp_peer2.conf
b/src/transport/test_transport_api_manipulation_recv_tcp_peer2.conf
deleted file mode 100644
index a7b2cf90b..000000000
--- a/src/transport/test_transport_api_manipulation_recv_tcp_peer2.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport-tcp]
-PORT = 12015
-TIMEOUT = 5 s
-
-[arm]
-PORT = 12014
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12013
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12012
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12011
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12010
-PLUGINS = tcp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
diff --git a/src/transport/test_transport_api_manipulation_send_tcp.c
b/src/transport/test_transport_api_manipulation_send_tcp.c
deleted file mode 100644
index ea735cfc6..000000000
--- a/src/transport/test_transport_api_manipulation_send_tcp.c
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009, 2010, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/test_transport_api_manipulation_send_tcp.c
- * @brief base test case for transport traffic manipulation implementation
- *
- * This test case will setup 2 peers and connect them, the first message
- * will be sent without manipulation, then a send delay of 1 second will
- * be configured and 1 more message will be sent. Time will be measured.
- *
- * In addition the distance on receiver side will be manipulated to be 10
- */
-#include "platform.h"
-#include "gnunet_transport_service.h"
-#include "transport-testing.h"
-
-/**
- * How long until we give up on transmitting the message?
- */
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
-
-static struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc;
-
-static int messages_recv;
-
-static struct GNUNET_TIME_Absolute start_normal;
-
-static struct GNUNET_TIME_Relative dur_normal;
-
-static struct GNUNET_TIME_Absolute start_delayed;
-
-static struct GNUNET_TIME_Relative dur_delayed;
-
-
-static void
-do_free (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_SendClosure *sc = cls;
-
- GNUNET_free (sc);
-}
-
-
-static void
-delayed_transmit (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_SendClosure *sc = cls;
-
- start_delayed = GNUNET_TIME_absolute_get ();
- GNUNET_TRANSPORT_TESTING_large_send (sc);
-}
-
-
-static void
-sendtask (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_SendClosure *sc;
- struct GNUNET_TIME_Relative delay;
- struct GNUNET_ATS_Properties prop;
-
- sc = GNUNET_new (struct GNUNET_TRANSPORT_TESTING_SendClosure);
- sc->num_messages = 1;
- sc->ccc = ccc;
- sc->cont = &do_free;
- sc->cont_cls = sc;
- if (0 == messages_recv)
- {
- start_normal = GNUNET_TIME_absolute_get ();
- }
- if (1 == messages_recv)
- {
- memset (&prop,
- 0,
- sizeof(prop));
- delay = GNUNET_TIME_UNIT_SECONDS;
- GNUNET_TRANSPORT_manipulation_set (ccc->p[0]->tmh,
- &ccc->p[1]->id,
- &prop,
- GNUNET_TIME_UNIT_ZERO,
- delay);
- /* wait 1s to allow manipulation to go into effect */
- GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
- &delayed_transmit,
- sc);
- return;
- }
- GNUNET_TRANSPORT_TESTING_large_send (sc);
-}
-
-
-static void
-notify_receive (void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *receiver,
- const struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- {
- char *ps = GNUNET_strdup (GNUNET_i2s (&receiver->id));
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Peer %u (`%s') received message of type %d and size %u size
from peer %s)!\n",
- receiver->no,
- ps,
- ntohs (message->header.type),
- ntohs (message->header.size),
- GNUNET_i2s (sender));
- GNUNET_free (ps);
- }
-
- if ((GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE != ntohs (message->header.type))
||
- (GNUNET_TRANSPORT_TESTING_LARGE_MESSAGE_SIZE != ntohs (
- message->header.size)))
- {
- GNUNET_break (0);
- ccc->global_ret = GNUNET_SYSERR;
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
-
- if (0 == messages_recv)
- {
- /* Received non-delayed message */
- dur_normal = GNUNET_TIME_absolute_get_duration (start_normal);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received non-delayed message %u after %s\n",
- messages_recv,
- GNUNET_STRINGS_relative_time_to_string (dur_normal,
- GNUNET_YES));
- GNUNET_SCHEDULER_add_now (&sendtask,
- NULL);
- messages_recv++;
- return;
- }
- /* Received manipulated message */
- dur_delayed = GNUNET_TIME_absolute_get_duration (start_delayed);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received delayed message %u after %s\n",
- messages_recv,
- GNUNET_STRINGS_relative_time_to_string (dur_delayed,
- GNUNET_YES));
- if (dur_delayed.rel_value_us < GNUNET_TIME_UNIT_SECONDS.rel_value_us)
- {
- GNUNET_break (0);
- ccc->global_ret = GNUNET_SYSERR;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Delayed message was not delayed correctly: took only %s\n",
- GNUNET_STRINGS_relative_time_to_string (dur_delayed,
- GNUNET_YES));
- }
- else
- {
- ccc->global_ret = GNUNET_OK;
- }
- GNUNET_SCHEDULER_shutdown ();
-}
-
-
-int
-main (int argc,
- char *argv[])
-{
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext my_ccc = {
- .connect_continuation = &sendtask,
- .config_file = "test_transport_api_data.conf",
- .rec = ¬ify_receive,
- .nc = &GNUNET_TRANSPORT_TESTING_log_connect,
- .nd = &GNUNET_TRANSPORT_TESTING_log_disconnect,
- .timeout = TIMEOUT,
- .global_ret = GNUNET_NO
- };
-
- ccc = &my_ccc;
- if (GNUNET_OK !=
- GNUNET_TRANSPORT_TESTING_main (2,
- &GNUNET_TRANSPORT_TESTING_connect_check,
- ccc))
- return 1;
- return 0;
-}
-
-
-/* end of test_transport_api_manipulation_send_tcp.c */
diff --git a/src/transport/test_transport_api_manipulation_send_tcp_peer1.conf
b/src/transport/test_transport_api_manipulation_send_tcp_peer1.conf
deleted file mode 100644
index 9150c7faf..000000000
--- a/src/transport/test_transport_api_manipulation_send_tcp_peer1.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport-tcp]
-PORT = 12000
-TIMEOUT = 5 s
-
-[arm]
-PORT = 12005
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12004
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12003
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12002
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12001
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-PLUGINS = tcp
-
diff --git a/src/transport/test_transport_api_manipulation_send_tcp_peer2.conf
b/src/transport/test_transport_api_manipulation_send_tcp_peer2.conf
deleted file mode 100644
index a7b2cf90b..000000000
--- a/src/transport/test_transport_api_manipulation_send_tcp_peer2.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport-tcp]
-PORT = 12015
-TIMEOUT = 5 s
-
-[arm]
-PORT = 12014
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12013
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12012
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12011
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12010
-PLUGINS = tcp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
diff --git a/src/transport/test_transport_api_reliability.c
b/src/transport/test_transport_api_reliability.c
deleted file mode 100644
index 508fed4f5..000000000
--- a/src/transport/test_transport_api_reliability.c
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009, 2010, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/test_transport_api_reliability.c
- * @brief base test case for transport implementations
- *
- * This test case serves ensures that messages are reliably sent between peers
- *
- * This test sends TOTAL_MSGS with message type MTYPE from peer 1 to peer 2
- * and ensures that all message were received.
- */
-#include "platform.h"
-#include "gnunet_transport_service.h"
-#include "gauger.h"
-#include "transport-testing.h"
-
-/**
- * Allow making the problem "bigger".
- */
-#define FACTOR 1
-
-/**
- * Total number of messages to send
- *
- * Note that this value must not significantly exceed
- * 'MAX_PENDING' in 'gnunet-service-transport_clients.c', otherwise
- * messages may be dropped even for a reliable transport.
- */
-#define TOTAL_MSGS (1024 * 3 * FACTOR)
-
-/**
- * Testcase timeout
- */
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 450 \
- * FACTOR)
-
-/**
- * If we are in an "xhdr" test, the factor by which we divide
- * #TOTAL_MSGS for a more sane test duration.
- */
-static unsigned int xhdr = 1;
-
-static struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc;
-
-/**
- * Total amount of bytes sent
- */
-static unsigned long long total_bytes;
-
-/**
- * Time of start
- */
-static struct GNUNET_TIME_Absolute start_time;
-
-/**
- * No. of last message received
- */
-static unsigned int msg_recv;
-
-/**
- * Bitmap storing which messages were received
- */
-static char bitmap[TOTAL_MSGS / 8];
-
-
-/**
- * Get the desired message size for message number @a iter.
- */
-static size_t
-get_size (unsigned int iter)
-{
- size_t ret;
-
- ret = (iter * iter * iter);
-#ifndef __linux__
- /* FreeBSD/OSX etc. Unix DGRAMs do not work
- * with large messages */
- if (0 == strcmp ("unix", ccc->test_plugin))
- return sizeof(struct GNUNET_TRANSPORT_TESTING_TestMessage) + (ret % 1024);
-#endif
- return sizeof(struct GNUNET_TRANSPORT_TESTING_TestMessage) + (ret % 60000);
-}
-
-
-/**
- * Implementation of the callback for obtaining the
- * size of messages for transmission. Counts the total
- * number of bytes sent as a side-effect.
- *
- * @param cnt_down count down from `TOTAL_MSGS - 1`
- * @return message size of the message
- */
-static size_t
-get_size_cnt (unsigned int cnt_down)
-{
- size_t ret = get_size (TOTAL_MSGS / xhdr - 1 - cnt_down);
-
- total_bytes += ret;
- return ret;
-}
-
-
-/**
- * Sets a bit active in the bitmap.
- *
- * @param bitIdx which bit to set
- * @return #GNUNET_SYSERR on error, #GNUNET_OK on success
- */
-static int
-set_bit (unsigned int bitIdx)
-{
- size_t arraySlot;
- unsigned int targetBit;
-
- if (bitIdx >= sizeof(bitmap) * 8)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "tried to set bit %u of %u(!?!?)\n",
- bitIdx,
- (unsigned int) sizeof(bitmap) * 8);
- return GNUNET_SYSERR;
- }
- arraySlot = bitIdx / 8;
- targetBit = (1L << (bitIdx % 8));
- bitmap[arraySlot] |= targetBit;
- return GNUNET_OK;
-}
-
-
-/**
- * Obtain a bit from bitmap.
- * @param map the bitmap
- * @param bit index from bitmap
- *
- * @return Bit @a bit from @a map
- */
-static int
-get_bit (const char *map,
- unsigned int bit)
-{
- if (bit > TOTAL_MSGS)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "get bit %u of %u(!?!?)\n",
- bit,
- (unsigned int) sizeof(bitmap) * 8);
- return 0;
- }
- return ((map)[bit >> 3] & (1 << (bit & 7))) > 0;
-}
-
-
-static void
-custom_shutdown (void *cls)
-{
- unsigned long long delta;
- unsigned long long rate;
- int ok;
-
- /* Calculate statistics */
- delta = GNUNET_TIME_absolute_get_duration (start_time).rel_value_us;
- if (0 == delta)
- delta = 1;
- rate = (1000LL * 1000ll * total_bytes) / (1024 * delta);
- fprintf (stderr,
- "\nThroughput was %llu KiBytes/s\n",
- rate);
- {
- char *value_name;
-
- GNUNET_asprintf (&value_name,
- "unreliable_%s",
- ccc->test_plugin);
- GAUGER ("TRANSPORT",
- value_name,
- (int) rate,
- "kb/s");
- GNUNET_free (value_name);
- }
-
- ok = 0;
- for (unsigned int i = 0; i < TOTAL_MSGS / xhdr; i++)
- {
- if (get_bit (bitmap, i) == 0)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Did not receive message %d\n",
- i);
- ok = -1;
- }
- }
- if (0 != ok)
- ccc->global_ret = GNUNET_SYSERR; /* fail: messages missing! */
-}
-
-
-static void
-notify_receive (void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *receiver,
- const struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *hdr)
-{
- static int n;
- unsigned int s;
- char cbuf[GNUNET_MAX_MESSAGE_SIZE - 1];
-
- if (GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE != ntohs (hdr->header.type))
- return;
- msg_recv = ntohl (hdr->num);
- s = get_size (ntohl (hdr->num));
-
- if (ntohs (hdr->header.size) != s)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Expected message %u of size %u, got %u bytes of message %u\n",
- (uint32_t) ntohl (hdr->num),
- s,
- ntohs (hdr->header.size),
- (uint32_t) ntohl (hdr->num));
- ccc->global_ret = GNUNET_SYSERR;
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
-
- memset (cbuf,
- ntohl (hdr->num),
- s - sizeof(struct GNUNET_TRANSPORT_TESTING_TestMessage));
- if (0 !=
- memcmp (cbuf,
- &hdr[1],
- s - sizeof(struct GNUNET_TRANSPORT_TESTING_TestMessage)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Expected message %u with bits %u, but body did not match\n",
- (uint32_t) ntohl (hdr->num),
- (unsigned char) ntohl (hdr->num));
- ccc->global_ret = GNUNET_SYSERR;
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
-#if VERBOSE
- if (0 == ntohl (hdr->num) % 5)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Got message %u of size %u\n",
- (uint32_t) ntohl (hdr->num),
- ntohs (hdr->header.size));
- }
-#endif
- n++;
- if (GNUNET_SYSERR == set_bit (ntohl (hdr->num)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Message id %u is bigger than maxmimum number of messages %u
expected\n",
- (uint32_t) ntohl (hdr->num),
- TOTAL_MSGS / xhdr);
- }
- if (0 == (n % (TOTAL_MSGS / xhdr / 100)))
- {
- fprintf (stderr, "%s", ".");
- }
- if (n == TOTAL_MSGS / xhdr)
- {
- /* end testcase with success */
- ccc->global_ret = GNUNET_OK;
- GNUNET_SCHEDULER_shutdown ();
- }
-}
-
-
-int
-main (int argc, char *argv[])
-{
- if (0 == strstr (argv[0], "xhdr"))
- xhdr = 30;
- struct GNUNET_TRANSPORT_TESTING_SendClosure sc = {
- .num_messages = TOTAL_MSGS / xhdr,
- .get_size_cb = &get_size_cnt
- };
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext my_ccc = {
- .connect_continuation = &GNUNET_TRANSPORT_TESTING_simple_send,
- .connect_continuation_cls = &sc,
- .config_file = "test_transport_api_data.conf",
- .rec = ¬ify_receive,
- .nc = &GNUNET_TRANSPORT_TESTING_log_connect,
- .nd = &GNUNET_TRANSPORT_TESTING_log_disconnect,
- .shutdown_task = &custom_shutdown,
- .timeout = TIMEOUT,
- .global_ret = GNUNET_SYSERR
- };
-
- ccc = &my_ccc;
- sc.ccc = ccc;
- start_time = GNUNET_TIME_absolute_get ();
- if (GNUNET_OK !=
- GNUNET_TRANSPORT_TESTING_main (2,
- &GNUNET_TRANSPORT_TESTING_connect_check,
- ccc))
- return 1;
- return 0;
-}
-
-
-/* end of test_transport_api_reliability.c */
diff --git a/src/transport/test_transport_api_reliability_bluetooth_peer1.conf
b/src/transport/test_transport_api_reliability_bluetooth_peer1.conf
deleted file mode 100644
index 738255235..000000000
--- a/src/transport/test_transport_api_reliability_bluetooth_peer1.conf
+++ /dev/null
@@ -1,33 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-bluetooth-p1/
-
-[transport-bluetooth]
-INTERFACE = hci0
-TESTMODE = 1
-
-[arm]
-PORT = 12164
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12163
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12162
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12161
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12160
-PLUGINS = bluetooth
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
-
-[ats]
-BLUETOOTH_QUOTA_IN = unlimited
-BLUETOOTH_QUOTA_OUT = unlimited
diff --git a/src/transport/test_transport_api_reliability_bluetooth_peer2.conf
b/src/transport/test_transport_api_reliability_bluetooth_peer2.conf
deleted file mode 100644
index 9c68b5fbc..000000000
--- a/src/transport/test_transport_api_reliability_bluetooth_peer2.conf
+++ /dev/null
@@ -1,32 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-bluetooth-p2/
-
-[transport-bluetooth]
-INTERFACE = hci1
-TESTMODE = 2
-
-[arm]
-PORT = 12174
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12173
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12172
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12171
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12170
-PLUGINS = bluetooth
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
-[ats]
-BLUETOOTH_QUOTA_IN = unlimited
-BLUETOOTH_QUOTA_OUT = unlimited
diff --git a/src/transport/test_transport_api_reliability_http_peer1.conf
b/src/transport/test_transport_api_reliability_http_peer1.conf
deleted file mode 100644
index a1e5c96ac..000000000
--- a/src/transport/test_transport_api_reliability_http_peer1.conf
+++ /dev/null
@@ -1,33 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-http-p1/
-
-[transport-http_client]
-
-[transport-tcp]
-TIMEOUT = 5 s
-
-[transport-http]
-PORT = 12180
-
-[arm]
-PORT = 12185
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12184
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12183
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12182
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12181
-PLUGINS = http_client
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
diff --git a/src/transport/test_transport_api_reliability_http_peer2.conf
b/src/transport/test_transport_api_reliability_http_peer2.conf
deleted file mode 100644
index 25a554f94..000000000
--- a/src/transport/test_transport_api_reliability_http_peer2.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-http-p2/
-
-[transport-http_server]
-PORT = 12090
-USE_IPv6 = NO
-BINDTO = 127.0.0.1
-
-[arm]
-PORT = 12195
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12194
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12193
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12192
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12191
-PLUGINS = http_server
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
diff --git a/src/transport/test_transport_api_reliability_http_xhr_peer1.conf
b/src/transport/test_transport_api_reliability_http_xhr_peer1.conf
deleted file mode 100644
index ba4101ebe..000000000
--- a/src/transport/test_transport_api_reliability_http_xhr_peer1.conf
+++ /dev/null
@@ -1,34 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-http-p1/
-
-[transport-http_client]
-EMULATE_XHR = YES
-
-[transport-tcp]
-TIMEOUT = 5 s
-
-[transport-http]
-PORT = 12180
-
-[arm]
-PORT = 12185
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12184
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12183
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12182
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12181
-PLUGINS = http_client
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
diff --git a/src/transport/test_transport_api_reliability_http_xhr_peer2.conf
b/src/transport/test_transport_api_reliability_http_xhr_peer2.conf
deleted file mode 100644
index 25a554f94..000000000
--- a/src/transport/test_transport_api_reliability_http_xhr_peer2.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-http-p2/
-
-[transport-http_server]
-PORT = 12090
-USE_IPv6 = NO
-BINDTO = 127.0.0.1
-
-[arm]
-PORT = 12195
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12194
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12193
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12192
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12191
-PLUGINS = http_server
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
diff --git a/src/transport/test_transport_api_reliability_https_peer1.conf
b/src/transport/test_transport_api_reliability_https_peer1.conf
deleted file mode 100644
index 1b51da130..000000000
--- a/src/transport/test_transport_api_reliability_https_peer1.conf
+++ /dev/null
@@ -1,27 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-https-p1/
-
-[transport-https_client]
-
-[arm]
-PORT = 12305
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12304
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12303
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12302
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12301
-PLUGINS = https_client
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
diff --git a/src/transport/test_transport_api_reliability_https_peer2.conf
b/src/transport/test_transport_api_reliability_https_peer2.conf
deleted file mode 100644
index 3dfb87a6d..000000000
--- a/src/transport/test_transport_api_reliability_https_peer2.conf
+++ /dev/null
@@ -1,31 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-https-p2/
-
-[transport-https_server]
-PORT = 12310
-KEY_FILE = $GNUNET_TEST_HOME/https_key_p2.key
-CERT_FILE = $GNUNET_TEST_HOME/https_cert_p2.crt
-
-[arm]
-PORT = 12315
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12314
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12313
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12312
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12311
-PLUGINS = https_server
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
-
diff --git a/src/transport/test_transport_api_reliability_https_xhr_peer1.conf
b/src/transport/test_transport_api_reliability_https_xhr_peer1.conf
deleted file mode 100644
index 5d042f2f9..000000000
--- a/src/transport/test_transport_api_reliability_https_xhr_peer1.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-https-p1/
-
-[transport-https_client]
-EMULATE_XHR = YES
-
-[arm]
-PORT = 12305
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12304
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12303
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12302
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12301
-PLUGINS = https_client
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
diff --git a/src/transport/test_transport_api_reliability_https_xhr_peer2.conf
b/src/transport/test_transport_api_reliability_https_xhr_peer2.conf
deleted file mode 100644
index 3dfb87a6d..000000000
--- a/src/transport/test_transport_api_reliability_https_xhr_peer2.conf
+++ /dev/null
@@ -1,31 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-https-p2/
-
-[transport-https_server]
-PORT = 12310
-KEY_FILE = $GNUNET_TEST_HOME/https_key_p2.key
-CERT_FILE = $GNUNET_TEST_HOME/https_cert_p2.crt
-
-[arm]
-PORT = 12315
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12314
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12313
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12312
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12311
-PLUGINS = https_server
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
-
diff --git a/src/transport/test_transport_api_reliability_tcp_nat_peer1.conf
b/src/transport/test_transport_api_reliability_tcp_nat_peer1.conf
deleted file mode 100644
index 6a2029b09..000000000
--- a/src/transport/test_transport_api_reliability_tcp_nat_peer1.conf
+++ /dev/null
@@ -1,35 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-reliability-tcp-nat-p1/
-
-[nat]
-BEHIND_NAT = YES
-ENABLE_NAT_SERVER = YES
-DISABLEV6 = YES
-
-[transport-tcp]
-PORT = 0
-TIMEOUT = 5 s
-
-[arm]
-PORT = 51204
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12023
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12022
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12021
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 29542
-PLUGINS = tcp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
-
diff --git a/src/transport/test_transport_api_reliability_tcp_nat_peer2.conf
b/src/transport/test_transport_api_reliability_tcp_nat_peer2.conf
deleted file mode 100644
index 2de9026f5..000000000
--- a/src/transport/test_transport_api_reliability_tcp_nat_peer2.conf
+++ /dev/null
@@ -1,34 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-reliability-tcp-nat-p2/
-
-[nat]
-DISABLEV6 = YES
-ENABLE_NAT_CLIENT = YES
-
-[transport-tcp]
-PORT = 12030
-TIMEOUT = 5 s
-
-[arm]
-PORT = 12034
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12033
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12032
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12031
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 45923
-PLUGINS = tcp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
-
diff --git a/src/transport/test_transport_api_reliability_tcp_peer1.conf
b/src/transport/test_transport_api_reliability_tcp_peer1.conf
deleted file mode 100644
index 305605d63..000000000
--- a/src/transport/test_transport_api_reliability_tcp_peer1.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport-tcp]
-PORT = 12000
-TIMEOUT = 5 s
-
-[arm]
-PORT = 12005
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12004
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12003
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12002
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12001
-PLUGINS = tcp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
diff --git a/src/transport/test_transport_api_reliability_tcp_peer2.conf
b/src/transport/test_transport_api_reliability_tcp_peer2.conf
deleted file mode 100644
index 43bb4ae37..000000000
--- a/src/transport/test_transport_api_reliability_tcp_peer2.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport-tcp]
-PORT = 12015
-TIMEOUT = 5 s
-
-[arm]
-PORT = 12014
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12013
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12012
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12011
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12010
-PLUGINS = tcp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
diff --git a/src/transport/test_transport_api_reliability_udp_peer1.conf
b/src/transport/test_transport_api_reliability_udp_peer1.conf
deleted file mode 100644
index 141fb0840..000000000
--- a/src/transport/test_transport_api_reliability_udp_peer1.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-udp-p1/
-
-[transport-udp]
-PORT = 12040
-# Override 1MB/s default limit.
-MAX_BPS = 500000000
-
-[arm]
-PORT = 12045
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12044
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12043
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12042
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12041
-PLUGINS = udp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
diff --git a/src/transport/test_transport_api_reliability_udp_peer2.conf
b/src/transport/test_transport_api_reliability_udp_peer2.conf
deleted file mode 100644
index 7523db854..000000000
--- a/src/transport/test_transport_api_reliability_udp_peer2.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-udp-p2/
-
-[transport-udp]
-PORT = 12050
-# Override 1MB/s default limit.
-MAX_BPS = 500000000
-
-[arm]
-PORT = 12055
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12054
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12053
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12052
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12051
-PLUGINS = udp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
diff --git a/src/transport/test_transport_api_reliability_unix_peer1.conf
b/src/transport/test_transport_api_reliability_unix_peer1.conf
deleted file mode 100644
index e253aad8c..000000000
--- a/src/transport/test_transport_api_reliability_unix_peer1.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-unix-p1/
-
-[arm]
-PORT = 12125
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12124
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12123
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12122
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12121
-PLUGINS = unix
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
-[transport-unix]
-PORT = 12120
-
diff --git a/src/transport/test_transport_api_reliability_unix_peer2.conf
b/src/transport/test_transport_api_reliability_unix_peer2.conf
deleted file mode 100644
index e0df47c07..000000000
--- a/src/transport/test_transport_api_reliability_unix_peer2.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-unix-p2/
-
-[arm]
-PORT = 12135
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12134
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12133
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12132
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12131
-PLUGINS = unix
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
-[transport-unix]
-PORT = 12131
-
diff --git a/src/transport/test_transport_api_reliability_wlan_peer1.conf
b/src/transport/test_transport_api_reliability_wlan_peer1.conf
deleted file mode 100644
index 19eb21456..000000000
--- a/src/transport/test_transport_api_reliability_wlan_peer1.conf
+++ /dev/null
@@ -1,31 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-wlan-p1/
-
-[transport-wlan]
-TESTMODE = 1
-
-[arm]
-PORT = 12164
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12163
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12162
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12161
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12160
-PLUGINS = wlan
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
-[ats]
-WLAN_QUOTA_IN = unlimited
-WLAN_QUOTA_OUT = unlimited
\ No newline at end of file
diff --git a/src/transport/test_transport_api_reliability_wlan_peer2.conf
b/src/transport/test_transport_api_reliability_wlan_peer2.conf
deleted file mode 100644
index d5c269b43..000000000
--- a/src/transport/test_transport_api_reliability_wlan_peer2.conf
+++ /dev/null
@@ -1,32 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-wlan-p2/
-
-[transport-wlan]
-INTERFACE = mon1
-TESTMODE = 2
-
-[arm]
-PORT = 12174
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12173
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12172
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12171
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12170
-PLUGINS = wlan
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
-[ats]
-WLAN_QUOTA_IN = unlimited
-WLAN_QUOTA_OUT = unlimited
diff --git a/src/transport/test_transport_api_restart_1peer_peer1.conf
b/src/transport/test_transport_api_restart_1peer_peer1.conf
deleted file mode 100644
index eabd6b701..000000000
--- a/src/transport/test_transport_api_restart_1peer_peer1.conf
+++ /dev/null
@@ -1,9 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport]
-PLUGINS = tcp
-
-#[transport]
-#PREFIX = valgrind
diff --git a/src/transport/test_transport_api_restart_1peer_peer2.conf
b/src/transport/test_transport_api_restart_1peer_peer2.conf
deleted file mode 100644
index 58ce0777f..000000000
--- a/src/transport/test_transport_api_restart_1peer_peer2.conf
+++ /dev/null
@@ -1,9 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport]
-PLUGINS = tcp
-
-#[transport]
-#PREFIX = valgrind
diff --git a/src/transport/test_transport_api_restart_2peers_peer1.conf
b/src/transport/test_transport_api_restart_2peers_peer1.conf
deleted file mode 100644
index eabd6b701..000000000
--- a/src/transport/test_transport_api_restart_2peers_peer1.conf
+++ /dev/null
@@ -1,9 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport]
-PLUGINS = tcp
-
-#[transport]
-#PREFIX = valgrind
diff --git a/src/transport/test_transport_api_restart_2peers_peer2.conf
b/src/transport/test_transport_api_restart_2peers_peer2.conf
deleted file mode 100644
index 58ce0777f..000000000
--- a/src/transport/test_transport_api_restart_2peers_peer2.conf
+++ /dev/null
@@ -1,9 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport]
-PLUGINS = tcp
-
-#[transport]
-#PREFIX = valgrind
diff --git a/src/transport/test_transport_api_restart_reconnect.c
b/src/transport/test_transport_api_restart_reconnect.c
deleted file mode 100644
index d58c1de54..000000000
--- a/src/transport/test_transport_api_restart_reconnect.c
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009, 2010, 2015, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/test_transport_api_restart_reconnect.c
- * @brief base test case for transport implementations
- *
- * This test case starts 2 peers, connects and exchanges a message.
- * Then, 1 or 2 peers are restarted and it is tested if peers reconnect.
- * How many peers are restarted is determined by the name of the binary.
- */
-#include "platform.h"
-#include "gnunet_transport_service.h"
-#include "transport-testing.h"
-
-/**
- * How long until we give up on transmitting the message?
- */
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
-
-
-static struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc;
-
-static struct GNUNET_ATS_ConnectivitySuggestHandle *ats_sh;
-
-static int p1_connected;
-
-static int p2_connected;
-
-static int restarted;
-
-
-static void
-custom_shutdown (void *cls)
-{
- if (NULL != ats_sh)
- {
- GNUNET_ATS_connectivity_suggest_cancel (ats_sh);
- ats_sh = NULL;
- }
-}
-
-
-static void
-restart_cb (void *cls)
-{
- static unsigned int c;
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p = cls;
-
- c++;
- if ((2 != c) &&
- (NULL != strstr (ccc->test_name,
- "2peers")))
- return;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Restarted peer %u (`%s'), issuing reconnect\n",
- p->no,
- GNUNET_i2s (&p->id));
- ats_sh = GNUNET_ATS_connectivity_suggest (p->ats,
- &ccc->p[1]->id,
- 1);
-}
-
-
-static void
-restart (struct GNUNET_TRANSPORT_TESTING_PeerContext *p)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Restarting peer %u (`%s')\n",
- p->no,
- GNUNET_i2s (&p->id));
- GNUNET_assert (GNUNET_OK ==
- GNUNET_TRANSPORT_TESTING_restart_peer (p,
- &restart_cb,
- p));
-}
-
-
-static void
-notify_receive (void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *receiver,
- const struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- {
- char *ps = GNUNET_strdup (GNUNET_i2s (&receiver->id));
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Peer %u (`%s') received message of type %d and size %u size
from peer %s!\n",
- receiver->no,
- ps,
- ntohs (message->header.type),
- ntohs (message->header.size),
- GNUNET_i2s (sender));
- GNUNET_free (ps);
- }
- if ((GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE == ntohs (message->header.type))
&&
- (sizeof(struct GNUNET_TRANSPORT_TESTING_TestMessage) == ntohs (
- message->header.size)))
- {
- if (GNUNET_NO == restarted)
- {
- restarted = GNUNET_YES;
- fprintf (stderr, "TN: %s\n", ccc->test_name);
- restart (ccc->p[0]);
- if (NULL != strstr (ccc->test_name,
- "2peers"))
- restart (ccc->p[1]);
- return;
- }
- else
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Restarted peers connected and message was sent, stopping
test...\n");
- ccc->global_ret = GNUNET_OK;
- GNUNET_SCHEDULER_shutdown ();
- }
- }
- else
- {
- GNUNET_break (0);
- ccc->global_ret = GNUNET_SYSERR;
- GNUNET_SCHEDULER_shutdown ();
- }
-}
-
-
-static void
-notify_connect (void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *me,
- const struct GNUNET_PeerIdentity *other)
-{
- static struct GNUNET_TRANSPORT_TESTING_SendClosure sc = {
- .num_messages = 1
- };
-
- sc.ccc = ccc;
- GNUNET_TRANSPORT_TESTING_log_connect (cls,
- me,
- other);
- if (me == ccc->p[0])
- p1_connected = GNUNET_YES;
- if (me == ccc->p[1])
- p2_connected = GNUNET_YES;
-
- if ((GNUNET_YES == restarted) &&
- (GNUNET_YES == p1_connected) &&
- (GNUNET_YES == p2_connected))
- {
- /* Peer was restarted and we received 3 connect messages (2 from first
connect, 1 from reconnect) */
- GNUNET_SCHEDULER_add_now (&GNUNET_TRANSPORT_TESTING_simple_send,
- &sc);
- }
-}
-
-
-static void
-notify_disconnect (void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *me,
- const struct GNUNET_PeerIdentity *other)
-{
- GNUNET_TRANSPORT_TESTING_log_disconnect (cls,
- me,
- other);
- if (me == ccc->p[0])
- p1_connected = GNUNET_NO;
- if (me == ccc->p[1])
- p2_connected = GNUNET_NO;
-}
-
-
-int
-main (int argc,
- char *argv[])
-{
- struct GNUNET_TRANSPORT_TESTING_SendClosure sc = {
- .num_messages = 1
- };
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext my_ccc = {
- .connect_continuation = &GNUNET_TRANSPORT_TESTING_simple_send,
- .connect_continuation_cls = &sc,
- .config_file = "test_transport_api_data.conf",
- .rec = ¬ify_receive,
- .nc = ¬ify_connect,
- .nd = ¬ify_disconnect,
- .shutdown_task = &custom_shutdown,
- .timeout = TIMEOUT
- };
-
- ccc = &my_ccc;
- sc.ccc = ccc;
- if (GNUNET_OK !=
- GNUNET_TRANSPORT_TESTING_main (2,
- &GNUNET_TRANSPORT_TESTING_connect_check,
- ccc))
- return 1;
- return 0;
-}
-
-
-/* end of test_transport_api_restart_1peer.c */
diff --git a/src/transport/test_transport_api_slow_ats_peer1.conf
b/src/transport/test_transport_api_slow_ats_peer1.conf
deleted file mode 100644
index a96f5e263..000000000
--- a/src/transport/test_transport_api_slow_ats_peer1.conf
+++ /dev/null
@@ -1,7 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-slow-ats-p1/
-
-[transport]
-PLUGINS = tcp
-
diff --git a/src/transport/test_transport_api_slow_ats_peer2.conf
b/src/transport/test_transport_api_slow_ats_peer2.conf
deleted file mode 100644
index 3a6ed05d3..000000000
--- a/src/transport/test_transport_api_slow_ats_peer2.conf
+++ /dev/null
@@ -1,9 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-slow-ats-p2/
-
-[transport]
-PLUGINS = tcp
-
-[ats]
-PREFIX = ./test_delay -t 10 --
diff --git a/src/transport/test_transport_api_timeout.c
b/src/transport/test_transport_api_timeout.c
deleted file mode 100644
index 9f8d3bb2b..000000000
--- a/src/transport/test_transport_api_timeout.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- This file is part of GNUnet.x
- Copyright (C) 2009, 2010, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/test_transport_api_timeout.c
- * @brief test case for transport plugin implementations complying timeout
- * settings
- *
- *
- * This test case serves ensures that no peer disconnect events occurs
- * while plugins are idle
- */
-
-#include "platform.h"
-#include "gnunet_transport_service.h"
-#include "transport-testing.h"
-
-/**
- * How long until we give up on transmitting the message?
- */
-#define WAIT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
-
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 90)
-
-#define MTYPE 12345
-
-static struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc;
-
-static struct GNUNET_TIME_Relative time_running;
-
-static struct GNUNET_SCHEDULER_Task *timer_task;
-
-static int shutdown_flag;
-
-static unsigned int disconnects;
-
-
-static void
-custom_shutdown (void *cls)
-{
- if (NULL != timer_task)
- {
- GNUNET_SCHEDULER_cancel (timer_task);
- timer_task = NULL;
- }
- if (0 == disconnects)
- {
- ccc->global_ret = GNUNET_OK;
- }
- else
- {
- ccc->global_ret = -GNUNET_SYSERR;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Fail! Had %u disconnects while waiting %s\n",
- disconnects,
- GNUNET_STRINGS_relative_time_to_string (WAIT,
- GNUNET_YES));
- }
-}
-
-
-static void
-notify_receive (void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *receiver,
- const struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received message of type %d from peer %s!\n",
- ntohs (message->header.type),
- GNUNET_i2s (sender));
-}
-
-
-static void
-notify_disconnect (void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *me,
- const struct GNUNET_PeerIdentity *other)
-{
- GNUNET_TRANSPORT_TESTING_log_disconnect (cls,
- me,
- other);
- if (shutdown_flag != GNUNET_YES)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "FAIL! Peer `%s' disconnected during waiting period!\n",
- GNUNET_i2s (other));
- disconnects++;
- }
-}
-
-
-static void
-timer (void *cls)
-{
- static unsigned int percentage;
-
- timer_task = NULL;
- percentage += 10;
- time_running = GNUNET_TIME_relative_add (time_running,
- GNUNET_TIME_relative_divide (WAIT,
- 10));
-
- if (time_running.rel_value_us ==
- GNUNET_TIME_relative_max (time_running, WAIT).rel_value_us)
- {
- fprintf (stderr, "%s", "100%%\n");
- shutdown_flag = GNUNET_YES;
- GNUNET_SCHEDULER_shutdown ();
- }
- else
- {
- fprintf (stderr,
- "%u%%..",
- percentage);
- timer_task =
- GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_divide (WAIT, 10),
- &timer,
- NULL);
- }
-}
-
-
-int
-main (int argc,
- char *argv[])
-{
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext my_ccc = {
- .connect_continuation = &timer,
- .config_file = "test_transport_api_data.conf",
- .rec = ¬ify_receive,
- .nc = &GNUNET_TRANSPORT_TESTING_log_connect,
- .nd = ¬ify_disconnect,
- .shutdown_task = &custom_shutdown,
- .timeout = TIMEOUT
- };
-
- ccc = &my_ccc;
- if (GNUNET_OK !=
- GNUNET_TRANSPORT_TESTING_main (2,
- &GNUNET_TRANSPORT_TESTING_connect_check,
- ccc))
- return 1;
- return 0;
-}
-
-
-/* end of test_transport_api_timeout.c*/
diff --git a/src/transport/test_transport_api_timeout_bluetooth_peer1.conf
b/src/transport/test_transport_api_timeout_bluetooth_peer1.conf
deleted file mode 100644
index dcc159e45..000000000
--- a/src/transport/test_transport_api_timeout_bluetooth_peer1.conf
+++ /dev/null
@@ -1,35 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-bluetooth-p1/
-
-[transport-bluetooth]
-INTERFACE = hci0
-TESTMODE = 1
-
-[arm]
-PORT = 12164
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12163
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12162
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12161
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12160
-PLUGINS = bluetooth
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-#PREFIX = xterm -T transport2 -e gdb --command=cmd --args
-#PREFIX = valgrind --leak-check=full --show-reachable=yes
--main-stacksize=104857600
-#PREFIX = valgrind --leak-check=full --show-reachable=yes
-#PREFIX = valgrind --leak-check=full
-#PREFIX = valgrind --tool=massif
-#PREFIX = gdbserver :2345
-
diff --git a/src/transport/test_transport_api_timeout_bluetooth_peer2.conf
b/src/transport/test_transport_api_timeout_bluetooth_peer2.conf
deleted file mode 100644
index 5cd550d0e..000000000
--- a/src/transport/test_transport_api_timeout_bluetooth_peer2.conf
+++ /dev/null
@@ -1,34 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-bluetooth-p2/
-
-[transport-bluetooth]
-INTERFACE = hci1
-TESTMODE = 2
-
-[arm]
-PORT = 12174
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12173
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12172
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12171
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12170
-PLUGINS = bluetooth
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-#PREFIX = xterm -T transport2 -e gdb --command=cmd --args
-#PREFIX = valgrind --leak-check=full --show-reachable=yes
--main-stacksize=104857600
-#PREFIX = valgrind --leak-check=full --show-reachable=yes
-#PREFIX = valgrind --leak-check=full
-#PREFIX = valgrind --tool=massif
-#PREFIX = gdbserver :2345
diff --git a/src/transport/test_transport_api_timeout_http_peer1.conf
b/src/transport/test_transport_api_timeout_http_peer1.conf
deleted file mode 100644
index d7bc59ea3..000000000
--- a/src/transport/test_transport_api_timeout_http_peer1.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-http-p1/
-
-[arm]
-PORT = 12085
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12084
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12083
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12082
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12081
-PLUGINS = http_client
-#BINARY = .libs/gnunet-service-transport
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-#PREFIX = valgrind --leak-check=full
-#PREFIX = xterm -geometry 100x85 -T peer1 -e gdb --args
-
diff --git a/src/transport/test_transport_api_timeout_http_peer2.conf
b/src/transport/test_transport_api_timeout_http_peer2.conf
deleted file mode 100644
index 453c6d0c5..000000000
--- a/src/transport/test_transport_api_timeout_http_peer2.conf
+++ /dev/null
@@ -1,31 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-http-p2/
-
-[transport-http_server]
-PORT = 12090
-USE_IPv6 = NO
-BINDTO = 127.0.0.1
-
-
-[arm]
-PORT = 12095
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12094
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12093
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12092
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12091
-PLUGINS = http_server
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-#PREFIX = valgrind --leak-check=full
diff --git a/src/transport/test_transport_api_timeout_https_peer1.conf
b/src/transport/test_transport_api_timeout_https_peer1.conf
deleted file mode 100644
index c4f96814c..000000000
--- a/src/transport/test_transport_api_timeout_https_peer1.conf
+++ /dev/null
@@ -1,25 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-https-p1/
-
-[arm]
-PORT = 12105
-
-[statistics]
-PORT = 12104
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12103
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12102
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12101
-PLUGINS = https_client
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
-
diff --git a/src/transport/test_transport_api_timeout_https_peer2.conf
b/src/transport/test_transport_api_timeout_https_peer2.conf
deleted file mode 100644
index bfdf0caec..000000000
--- a/src/transport/test_transport_api_timeout_https_peer2.conf
+++ /dev/null
@@ -1,31 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-https-p2/
-
-[transport-https_server]
-PORT = 12110
-KEY_FILE = $GNUNET_TEST_HOME/https_key_p2.key
-CERT_FILE = $GNUNET_TEST_HOME/https_cert_p2.crt
-
-[arm]
-PORT = 12115
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12114
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12113
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12112
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12111
-PLUGINS = https_server
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
-
diff --git a/src/transport/test_transport_api_timeout_tcp_peer1.conf
b/src/transport/test_transport_api_timeout_tcp_peer1.conf
deleted file mode 100644
index 389250bec..000000000
--- a/src/transport/test_transport_api_timeout_tcp_peer1.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport-tcp]
-PORT = 12000
-TIMEOUT = 5 s
-
-[arm]
-PORT = 12005
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12004
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12003
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12002
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12001
-PLUGINS = tcp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
-
diff --git a/src/transport/test_transport_api_timeout_tcp_peer2.conf
b/src/transport/test_transport_api_timeout_tcp_peer2.conf
deleted file mode 100644
index 225b8fac2..000000000
--- a/src/transport/test_transport_api_timeout_tcp_peer2.conf
+++ /dev/null
@@ -1,32 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[nat]
-ALLOW_NAT = NO
-
-[transport-tcp]
-PORT = 12100
-
-[arm]
-PORT = 12014
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12013
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12012
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12011
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12010
-PLUGINS = tcp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
-
diff --git a/src/transport/test_transport_api_timeout_udp_peer1.conf
b/src/transport/test_transport_api_timeout_udp_peer1.conf
deleted file mode 100644
index e28e3a2e0..000000000
--- a/src/transport/test_transport_api_timeout_udp_peer1.conf
+++ /dev/null
@@ -1,33 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-udp-p1/
-
-[transport-udp]
-PORT = 12040
-BROADCAST = NO
-BROADCAST_INTERVAL = 30000
-MAX_BPS = 50000000
-
-[arm]
-PORT = 12045
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12044
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12043
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12042
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-#PREFIX = valgrind --leak-check=full
-PORT = 12041
-PLUGINS = udp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
-
diff --git a/src/transport/test_transport_api_timeout_udp_peer2.conf
b/src/transport/test_transport_api_timeout_udp_peer2.conf
deleted file mode 100644
index 434ef4853..000000000
--- a/src/transport/test_transport_api_timeout_udp_peer2.conf
+++ /dev/null
@@ -1,31 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-udp-p2/
-
-[transport-udp]
-PORT = 12050
-BROADCAST = NO
-MAX_BPS = 50000000
-
-[arm]
-PORT = 12055
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12054
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12053
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12052
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12051
-PLUGINS = udp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
-
diff --git a/src/transport/test_transport_api_timeout_unix_peer1.conf
b/src/transport/test_transport_api_timeout_unix_peer1.conf
deleted file mode 100644
index e253aad8c..000000000
--- a/src/transport/test_transport_api_timeout_unix_peer1.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-unix-p1/
-
-[arm]
-PORT = 12125
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12124
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12123
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12122
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12121
-PLUGINS = unix
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
-[transport-unix]
-PORT = 12120
-
diff --git a/src/transport/test_transport_api_timeout_unix_peer2.conf
b/src/transport/test_transport_api_timeout_unix_peer2.conf
deleted file mode 100644
index bd3fccbb3..000000000
--- a/src/transport/test_transport_api_timeout_unix_peer2.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-unix-p2/
-
-[arm]
-PORT = 12135
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12134
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12133
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12132
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12131
-PLUGINS = unix
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
-[transport-unix]
-PORT = 12136
-
diff --git a/src/transport/test_transport_api_timeout_wlan_peer1.conf
b/src/transport/test_transport_api_timeout_wlan_peer1.conf
deleted file mode 100644
index 68716d287..000000000
--- a/src/transport/test_transport_api_timeout_wlan_peer1.conf
+++ /dev/null
@@ -1,35 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-wlan-p1/
-
-[transport-wlan]
-INTERFACE = mon0
-TESTMODE = 1
-
-[arm]
-PORT = 12164
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12163
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12162
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12161
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12160
-PLUGINS = wlan
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-#PREFIX = xterm -T transport2 -e gdb --command=cmd --args
-#PREFIX = valgrind --leak-check=full --show-reachable=yes
--main-stacksize=104857600
-#PREFIX = valgrind --leak-check=full --show-reachable=yes
-#PREFIX = valgrind --leak-check=full
-#PREFIX = valgrind --tool=massif
-#PREFIX = gdbserver :2345
-
diff --git a/src/transport/test_transport_api_timeout_wlan_peer2.conf
b/src/transport/test_transport_api_timeout_wlan_peer2.conf
deleted file mode 100644
index 98bbc6e2b..000000000
--- a/src/transport/test_transport_api_timeout_wlan_peer2.conf
+++ /dev/null
@@ -1,34 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-wlan-p2/
-
-[transport-wlan]
-INTERFACE = mon1
-TESTMODE = 2
-
-[arm]
-PORT = 12174
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12173
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12172
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12171
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12170
-PLUGINS = wlan
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-#PREFIX = xterm -T transport2 -e gdb --command=cmd --args
-#PREFIX = valgrind --leak-check=full --show-reachable=yes
--main-stacksize=104857600
-#PREFIX = valgrind --leak-check=full --show-reachable=yes
-#PREFIX = valgrind --leak-check=full
-#PREFIX = valgrind --tool=massif
-#PREFIX = gdbserver :2345
diff --git a/src/transport/test_transport_api_unix_abstract_peer1.conf
b/src/transport/test_transport_api_unix_abstract_peer1.conf
deleted file mode 100644
index 103a483b4..000000000
--- a/src/transport/test_transport_api_unix_abstract_peer1.conf
+++ /dev/null
@@ -1,31 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-unix-p1/
-
-[arm]
-PORT = 12125
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12124
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12123
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12122
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12121
-PLUGINS = unix
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
-[transport-unix]
-PORT = 12120
-
-[testing]
-USE_ABSTRACT_SOCKETS = YES
-
diff --git a/src/transport/test_transport_api_unix_abstract_peer2.conf
b/src/transport/test_transport_api_unix_abstract_peer2.conf
deleted file mode 100644
index c3a5525d9..000000000
--- a/src/transport/test_transport_api_unix_abstract_peer2.conf
+++ /dev/null
@@ -1,31 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-unix-p2/
-
-[arm]
-PORT = 12135
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12134
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12133
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12132
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12131
-PLUGINS = unix
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
-[transport-unix]
-PORT = 12136
-
-[testing]
-USE_ABSTRACT_SOCKETS = YES
-
diff --git
a/src/transport/test_transport_api_unreliability_bluetooth_peer1.conf
b/src/transport/test_transport_api_unreliability_bluetooth_peer1.conf
deleted file mode 100644
index 3f86ee940..000000000
--- a/src/transport/test_transport_api_unreliability_bluetooth_peer1.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-bluetooth-p1/
-
-[transport-bluetooth]
-INTERFACE = hci0
-TESTMODE = 1
-
-[arm]
-PORT = 12164
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12163
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12162
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12161
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12160
-PLUGINS = bluetooth
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
-
diff --git
a/src/transport/test_transport_api_unreliability_bluetooth_peer2.conf
b/src/transport/test_transport_api_unreliability_bluetooth_peer2.conf
deleted file mode 100644
index 5fc178395..000000000
--- a/src/transport/test_transport_api_unreliability_bluetooth_peer2.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-bluetooth-p2/
-
-[transport-bluetooth]
-INTERFACE = hci1
-TESTMODE = 2
-
-[arm]
-PORT = 12174
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12173
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12172
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12171
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12170
-PLUGINS = bluetooth
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
diff --git
a/src/transport/test_transport_api_unreliability_constant_udp_peer1.conf
b/src/transport/test_transport_api_unreliability_constant_udp_peer1.conf
deleted file mode 100644
index 9f63c0ced..000000000
--- a/src/transport/test_transport_api_unreliability_constant_udp_peer1.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-udp-p1/
-
-[transport-udp]
-PORT = 12040
-MAX_BPS = 1073741824
-
-[arm]
-PORT = 12045
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12044
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12043
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12042
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12041
-PLUGINS = udp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
-
diff --git
a/src/transport/test_transport_api_unreliability_constant_udp_peer2.conf
b/src/transport/test_transport_api_unreliability_constant_udp_peer2.conf
deleted file mode 100644
index cdf3d7bb4..000000000
--- a/src/transport/test_transport_api_unreliability_constant_udp_peer2.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-udp-p2/
-
-[transport-udp]
-PORT = 12050
-MAX_BPS = 1073741824
-
-[arm]
-PORT = 12055
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12054
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12053
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12052
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12051
-PLUGINS = udp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
-
diff --git a/src/transport/test_transport_api_unreliability_wlan_peer1.conf
b/src/transport/test_transport_api_unreliability_wlan_peer1.conf
deleted file mode 100644
index 78e280b68..000000000
--- a/src/transport/test_transport_api_unreliability_wlan_peer1.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-wlan-p1/
-
-[transport-wlan]
-TESTMODE = 1
-
-[arm]
-PORT = 12164
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12163
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12162
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12161
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12160
-PLUGINS = wlan
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-
-
diff --git a/src/transport/test_transport_api_unreliability_wlan_peer2.conf
b/src/transport/test_transport_api_unreliability_wlan_peer2.conf
deleted file mode 100644
index e97ab3f38..000000000
--- a/src/transport/test_transport_api_unreliability_wlan_peer2.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-wlan-p2/
-
-[transport-wlan]
-INTERFACE = mon1
-TESTMODE = 2
-
-[arm]
-PORT = 12174
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12173
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12172
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12171
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12170
-PLUGINS = wlan
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-
diff --git a/src/transport/test_transport_api_wlan_peer1.conf
b/src/transport/test_transport_api_wlan_peer1.conf
deleted file mode 100644
index 68716d287..000000000
--- a/src/transport/test_transport_api_wlan_peer1.conf
+++ /dev/null
@@ -1,35 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-wlan-p1/
-
-[transport-wlan]
-INTERFACE = mon0
-TESTMODE = 1
-
-[arm]
-PORT = 12164
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12163
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12162
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12161
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12160
-PLUGINS = wlan
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-#PREFIX = xterm -T transport2 -e gdb --command=cmd --args
-#PREFIX = valgrind --leak-check=full --show-reachable=yes
--main-stacksize=104857600
-#PREFIX = valgrind --leak-check=full --show-reachable=yes
-#PREFIX = valgrind --leak-check=full
-#PREFIX = valgrind --tool=massif
-#PREFIX = gdbserver :2345
-
diff --git a/src/transport/test_transport_api_wlan_peer2.conf
b/src/transport/test_transport_api_wlan_peer2.conf
deleted file mode 100644
index 98bbc6e2b..000000000
--- a/src/transport/test_transport_api_wlan_peer2.conf
+++ /dev/null
@@ -1,34 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-wlan-p2/
-
-[transport-wlan]
-INTERFACE = mon1
-TESTMODE = 2
-
-[arm]
-PORT = 12174
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12173
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12172
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12171
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12170
-PLUGINS = wlan
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
-#PREFIX = xterm -T transport2 -e gdb --command=cmd --args
-#PREFIX = valgrind --leak-check=full --show-reachable=yes
--main-stacksize=104857600
-#PREFIX = valgrind --leak-check=full --show-reachable=yes
-#PREFIX = valgrind --leak-check=full
-#PREFIX = valgrind --tool=massif
-#PREFIX = gdbserver :2345
diff --git a/src/transport/test_transport_blacklisting.c
b/src/transport/test_transport_blacklisting.c
deleted file mode 100644
index 204935dcb..000000000
--- a/src/transport/test_transport_blacklisting.c
+++ /dev/null
@@ -1,582 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009, 2010, 2011 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/transport_api_blacklisting.c
- * @brief test for the blacklisting with blacklistings defined in cfg
- *
- * this file contains multiple tests:
- *
- * test_transport_blacklisting_no_bl:
- * no blacklisting entries
- * peers are expected to connect
- * test_transport_blacklisting_outbound_bl_full:
- * both peers contain bl entries for full peer
- * test is expected to not connect
- * test_transport_blacklisting_outbound_bl_plugin:
- * both peers contain bl entries for plugin
- * test is expected to not connect
- * test_transport_blacklisting_inbound_bl_plugin:
- * peer 1 contains no bl entries
- * peer 2 contain bl entries for full peer
- * test is expected to not connect
- * test_transport_blacklisting_inbound_bl_full:
- * peer 1 contains no bl entries
- * peer 2 contain bl entries for plugin
- * test is expected to not connect
- * test_transport_blacklisting_multiple_plugins:
- * both peers contain bl entries for plugin
- * test is expected to connect with not bl'ed plugin
- *
- * @author Matthias Wachs
- *
- */
-#include "platform.h"
-#include "gnunet_transport_service.h"
-#include "transport-testing.h"
-
-char *test_name;
-
-struct GNUNET_TRANSPORT_TESTING_PeerContext *p1;
-
-struct GNUNET_TRANSPORT_TESTING_PeerContext *p2;
-
-static struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc;
-
-struct GNUNET_TRANSPORT_TESTING_Handle *tth;
-
-/**
- * How long until we give up on transmitting the message?
- */
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 20)
-
-#define CONNECT_TIMEOUT GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_SECONDS, \
- 10)
-
-static int stage;
-static int ok;
-static int connected;
-
-static struct GNUNET_SCHEDULER_Task *die_task;
-
-static struct GNUNET_SCHEDULER_Task *timeout_task;
-
-static struct GNUNET_SCHEDULER_Task *stage_task;
-
-#if VERBOSE
-#define OKPP do { ok++; fprintf (stderr, "Now at stage %u at %s:%u\n", ok, \
- __FILE__, __LINE__); } while (0)
-#else
-#define OKPP do { ok++; } while (0)
-#endif
-
-
-static void
-run_stage (void *cls);
-
-
-static void
-end (void *cls)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopping\n");
-
- if (die_task != NULL)
- {
- GNUNET_SCHEDULER_cancel (die_task);
- die_task = NULL;
- }
-
- if (timeout_task != NULL)
- {
- GNUNET_SCHEDULER_cancel (timeout_task);
- timeout_task = NULL;
- }
-
- if (stage_task != NULL)
- {
- GNUNET_SCHEDULER_cancel (stage_task);
- stage_task = NULL;
- }
-
- if (cc != NULL)
- {
- GNUNET_TRANSPORT_TESTING_connect_peers_cancel (cc);
- cc = NULL;
- }
-
- if (p1 != NULL)
- {
- GNUNET_TRANSPORT_TESTING_stop_peer (p1);
- p1 = NULL;
- }
- if (p2 != NULL)
- {
- GNUNET_TRANSPORT_TESTING_stop_peer (p2);
- p2 = NULL;
- }
-}
-
-
-static void
-end_badly (void *cls)
-{
- die_task = NULL;
-
- if (timeout_task != NULL)
- {
- GNUNET_SCHEDULER_cancel (timeout_task);
- timeout_task = NULL;
- }
-
- if (stage_task != NULL)
- {
- GNUNET_SCHEDULER_cancel (stage_task);
- stage_task = NULL;
- }
-
- if (cc != NULL)
- {
- GNUNET_TRANSPORT_TESTING_connect_peers_cancel (cc);
- cc = NULL;
- }
- if (p1 != NULL)
- GNUNET_TRANSPORT_TESTING_stop_peer (p1);
- if (p2 != NULL)
- GNUNET_TRANSPORT_TESTING_stop_peer (p2);
-
- ok = GNUNET_SYSERR;
-}
-
-
-static void
-testing_connect_cb (void *cls)
-{
- cc = NULL;
- char *p1_c = GNUNET_strdup (GNUNET_i2s (&p1->id));
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Peers connected: %u (%s) <-> %u (%s)\n",
- p1->no, p1_c, p2->no, GNUNET_i2s (&p2->id));
- GNUNET_free (p1_c);
- connected = GNUNET_YES;
- stage_task = GNUNET_SCHEDULER_add_now (&run_stage, NULL);
-}
-
-
-static void
-connect_timeout (void *cls)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Peers not connected, next stage\n");
- timeout_task = NULL;
- stage_task = GNUNET_SCHEDULER_add_now (&run_stage,
- NULL);
-}
-
-
-static int started;
-
-
-static void
-start_cb (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p = cls;
-
- started++;
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Peer %u (`%s') started\n",
- p->no,
- GNUNET_i2s_full (&p->id));
-
- if (started != 2)
- return;
-
- char *sender_c = GNUNET_strdup (GNUNET_i2s (&p1->id));
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Test tries to connect peer %u (`%s') -> peer %u (`%s')\n",
- p1->no,
- sender_c,
- p2->no,
- GNUNET_i2s (&p2->id));
- GNUNET_free (sender_c);
-
- cc = GNUNET_TRANSPORT_TESTING_connect_peers (p1,
- p2,
- &testing_connect_cb,
- NULL);
-}
-
-
-static int
-check_blacklist_config (const char *cfg_file,
- struct GNUNET_PeerIdentity *peer,
- struct GNUNET_PeerIdentity *bl_peer)
-{
- struct GNUNET_CONFIGURATION_Handle *cfg;
- char *section;
- char *peer_str;
-
- cfg = GNUNET_CONFIGURATION_create ();
- if (GNUNET_OK != GNUNET_CONFIGURATION_load (cfg, cfg_file))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Could not load configuration `%s'\n",
- cfg_file);
- GNUNET_CONFIGURATION_destroy (cfg);
- return GNUNET_SYSERR;
- }
-
- peer_str = GNUNET_strdup (GNUNET_i2s_full (peer));
- GNUNET_asprintf (§ion, "transport-blacklist-%s", peer_str);
-
- if (GNUNET_NO == GNUNET_CONFIGURATION_have_value (cfg, section,
- GNUNET_i2s_full (bl_peer)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Configuration `%s' does not have blacklisting section for
peer `%s' blacklisting `%s'\n",
- cfg_file, peer_str, GNUNET_i2s_full (bl_peer));
- GNUNET_CONFIGURATION_destroy (cfg);
- GNUNET_free (section);
- GNUNET_free (peer_str);
- return GNUNET_SYSERR;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Configuration `%s' does have blacklisting section for peer `%s'
blacklisting `%s'\n",
- cfg_file, peer_str, GNUNET_i2s_full (bl_peer));
-
- GNUNET_CONFIGURATION_destroy (cfg);
- GNUNET_free (section);
- GNUNET_free (peer_str);
- return GNUNET_OK;
-}
-
-
-static void
-run_stage (void *cls)
-{
- stage_task = NULL;
- if (NULL != die_task)
- GNUNET_SCHEDULER_cancel (die_task);
- die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_badly, NULL);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Running stage %u\n", stage);
-
- if (0 == stage)
- {
- started = GNUNET_NO;
- connected = GNUNET_NO;
- if (0 == strcmp (test_name, "test_transport_blacklisting_no_bl"))
- {
- /* Try to connect peers successfully */
- p1 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
-
"test_transport_blacklisting_cfg_peer1.conf",
- 1,
- NULL,
- NULL,
- NULL,
- NULL,
- &start_cb,
- NULL);
-
- p2 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
-
"test_transport_blacklisting_cfg_peer2.conf",
- 2,
- NULL,
- NULL,
- NULL,
- NULL,
- &start_cb,
- NULL);
- }
- else if (0 == strcmp (test_name,
- "test_transport_blacklisting_outbound_bl_full"))
- {
- const char *cfg_p1 =
- "test_transport_blacklisting_cfg_blp_peer1_full.conf";
- const char *cfg_p2 =
- "test_transport_blacklisting_cfg_blp_peer2_full.conf";
-
- p1 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
- cfg_p1,
- 1, NULL, NULL, NULL,
- NULL,
- &start_cb, NULL);
- p2 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
- cfg_p2, 2,
- NULL, NULL, NULL,
- NULL,
- &start_cb, NULL);
-
- /* check if configuration contain correct blacklist entries */
- if ((GNUNET_SYSERR ==
- check_blacklist_config (cfg_p1, &p1->id, &p2->id)) ||
- (GNUNET_SYSERR ==
- check_blacklist_config (cfg_p2, &p2->id, &p1->id)))
- {
- GNUNET_TRANSPORT_TESTING_stop_peer (p1);
- p1 = NULL;
- GNUNET_TRANSPORT_TESTING_stop_peer (p2);
- p2 = NULL;
- ok = 1;
- GNUNET_SCHEDULER_add_now (&end, NULL);
- }
- }
- else if (0
- == strcmp (test_name,
- "test_transport_blacklisting_outbound_bl_plugin"))
- {
- const char *cfg_p1 =
- "test_transport_blacklisting_cfg_blp_peer1_plugin.conf";
- const char *cfg_p2 =
- "test_transport_blacklisting_cfg_blp_peer2_plugin.conf";
-
- p1 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
- cfg_p1,
- 1,
- NULL,
- NULL,
- NULL,
- NULL,
- &start_cb,
- NULL);
-
- p2 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
- cfg_p2, 2,
- NULL,
- NULL,
- NULL,
- NULL,
- &start_cb,
- NULL);
-
- /* check if configuration contain correct blacklist entries */
- if ((GNUNET_SYSERR ==
- check_blacklist_config (cfg_p1, &p1->id, &p2->id)) ||
- (GNUNET_SYSERR ==
- check_blacklist_config (cfg_p2, &p2->id, &p1->id)))
- {
- GNUNET_TRANSPORT_TESTING_stop_peer (p1);
- p1 = NULL;
- GNUNET_TRANSPORT_TESTING_stop_peer (p2);
- p2 = NULL;
- ok = 1;
- GNUNET_SCHEDULER_add_now (&end, NULL);
- }
- }
- else if (0 == strcmp (test_name,
- "test_transport_blacklisting_inbound_bl_full"))
- {
- const char *cfg_p1 = "test_transport_blacklisting_cfg_peer1.conf";
- const char *cfg_p2 =
- "test_transport_blacklisting_cfg_blp_peer2_full.conf";
-
- p1 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
- cfg_p1, 1,
- NULL,
- NULL, NULL, NULL,
- &start_cb, NULL);
-
- p2 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
- cfg_p2, 2,
- NULL,
- NULL, NULL, NULL,
- &start_cb, NULL);
-
- /* check if configuration contain correct blacklist entries */
- if ((GNUNET_SYSERR ==
- check_blacklist_config (cfg_p2, &p2->id, &p1->id)))
- {
- GNUNET_TRANSPORT_TESTING_stop_peer (p1);
- p1 = NULL;
- GNUNET_TRANSPORT_TESTING_stop_peer (p2);
- p2 = NULL;
- ok = 1;
- GNUNET_SCHEDULER_add_now (&end, NULL);
- }
- }
- else if (0 == strcmp (test_name,
- "test_transport_blacklisting_inbound_bl_plugin"))
- {
- const char *cfg_p1 = "test_transport_blacklisting_cfg_peer1.conf";
- const char *cfg_p2 =
- "test_transport_blacklisting_cfg_blp_peer2_plugin.conf";
-
- p1 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
- cfg_p1, 1,
- NULL,
- NULL, NULL, NULL,
- &start_cb, NULL);
-
- p2 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
- cfg_p2, 2,
- NULL,
- NULL, NULL,
- NULL,
- &start_cb, NULL);
-
- /* check if configuration contain correct blacklist entries */
- if ((GNUNET_SYSERR ==
- check_blacklist_config (cfg_p2, &p2->id, &p1->id)))
- {
- GNUNET_TRANSPORT_TESTING_stop_peer (p1);
- p1 = NULL;
- GNUNET_TRANSPORT_TESTING_stop_peer (p2);
- p2 = NULL;
- ok = 1;
- GNUNET_SCHEDULER_add_now (&end, NULL);
- }
- }
- else if (0 == strcmp (test_name,
- "test_transport_blacklisting_multiple_plugins"))
- {
- const char *cfg_p1 =
- "test_transport_blacklisting_cfg_blp_peer1_multiple_plugins.conf";
- const char *cfg_p2 =
- "test_transport_blacklisting_cfg_blp_peer2_multiple_plugins.conf";
-
- p1 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
- cfg_p1, 1,
- NULL,
- NULL, NULL, NULL,
- &start_cb, NULL);
-
- p2 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
- cfg_p2, 2,
- NULL,
- NULL, NULL, NULL,
- &start_cb, NULL);
-
- /* check if configuration contain correct blacklist entries */
- if ((GNUNET_SYSERR ==
- check_blacklist_config (cfg_p1, &p1->id, &p2->id)) ||
- (GNUNET_SYSERR ==
- check_blacklist_config (cfg_p2, &p2->id, &p1->id)))
- {
- GNUNET_TRANSPORT_TESTING_stop_peer (p1);
- p1 = NULL;
- GNUNET_TRANSPORT_TESTING_stop_peer (p2);
- p2 = NULL;
- ok = 1;
- GNUNET_SCHEDULER_add_now (&end, NULL);
- }
- }
- else
- {
- GNUNET_break (0);
- GNUNET_SCHEDULER_add_now (&end, NULL);
- }
-
- if ((NULL == p1) || (NULL == p2))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to start peers\n");
- ok = 1;
- GNUNET_SCHEDULER_add_now (&end, NULL);
- }
-
- timeout_task = GNUNET_SCHEDULER_add_delayed (CONNECT_TIMEOUT,
- &connect_timeout,
- NULL);
- stage++;
- return;
- }
-
- if (cc != NULL)
- {
- GNUNET_TRANSPORT_TESTING_connect_peers_cancel (cc);
- cc = NULL;
- }
-
- if (p1 != NULL)
- {
- GNUNET_TRANSPORT_TESTING_stop_peer (p1);
- p1 = NULL;
- }
- if (p2 != NULL)
- {
- GNUNET_TRANSPORT_TESTING_stop_peer (p2);
- p2 = NULL;
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Done in stage %u: Peers %s and %s!\n",
- stage, (GNUNET_NO == started) ? "NOT STARTED" : "STARTED",
- (GNUNET_YES == connected) ? "CONNECTED" : "NOT CONNECTED");
-
- if ((0 == strcmp (test_name, "test_transport_blacklisting_no_bl"))
- || (0 == strcmp (test_name,
- "test_transport_blacklisting_multiple_plugins")))
- {
- if ((GNUNET_NO != started) && (GNUNET_YES == connected))
- ok = 0;
- else
- {
- GNUNET_break (0);
- ok = 1;
- }
- }
- else
- {
- if ((GNUNET_NO != started) && (GNUNET_YES != connected))
- ok = 0;
- else
- {
- ok = 1;
- }
- }
- GNUNET_SCHEDULER_add_now (&end, NULL);
-}
-
-
-static void
-run (void *cls, char *const *args, const char *cfgfile,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- connected = GNUNET_NO;
- stage = 0;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Running test `%s'!\n", test_name);
- stage_task = GNUNET_SCHEDULER_add_now (&run_stage, NULL);
-}
-
-
-int
-main (int argc, char *argv0[])
-{
- ok = 1;
-
- test_name = GNUNET_TRANSPORT_TESTING_get_test_name (argv0[0]);
-
- GNUNET_log_setup ("test-transport-api-blacklisting", "WARNING", NULL);
-
- static char *const argv[] =
- { "date", "-c", "test_transport_api_data.conf", NULL };
- static struct GNUNET_GETOPT_CommandLineOption options[] =
- { GNUNET_GETOPT_OPTION_END };
-
- tth = GNUNET_TRANSPORT_TESTING_init ();
-
- GNUNET_PROGRAM_run ((sizeof(argv) / sizeof(char *)) - 1, argv,
- "test-transport-api-blacklisting", "nohelp", options,
- &run, NULL);
-
- GNUNET_TRANSPORT_TESTING_done (tth);
-
- return ok;
-}
-
-
-/* end of transport_api_blacklisting.c */
diff --git a/src/transport/test_transport_blacklisting_cfg_blp_peer1_full.conf
b/src/transport/test_transport_blacklisting_cfg_blp_peer1_full.conf
deleted file mode 100644
index 19bff8fcc..000000000
--- a/src/transport/test_transport_blacklisting_cfg_blp_peer1_full.conf
+++ /dev/null
@@ -1,16 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport-tcp]
-PORT = 12000
-TIMEOUT = 5 s
-
-[transport]
-PLUGINS = tcp
-
-#Peer 1: 4TTC9WBSVP9RJT6DVEZ7E0TDW7TQXC11NR1EMR2F8ARS87WZ2730
-#Peer 2: F7B5NX6KCPG8SAKYSGV0E94Y5NXR9JE3HCGQ5YGH1H04WFQWMWT0
-
-[transport-blacklist-4TTC9WBSVP9RJT6DVEZ7E0TDW7TQXC11NR1EMR2F8ARS87WZ2730]
-F7B5NX6KCPG8SAKYSGV0E94Y5NXR9JE3HCGQ5YGH1H04WFQWMWT0 =
diff --git
a/src/transport/test_transport_blacklisting_cfg_blp_peer1_multiple_plugins.conf
b/src/transport/test_transport_blacklisting_cfg_blp_peer1_multiple_plugins.conf
deleted file mode 100644
index 79bc90469..000000000
---
a/src/transport/test_transport_blacklisting_cfg_blp_peer1_multiple_plugins.conf
+++ /dev/null
@@ -1,13 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport]
-PLUGINS = tcp unix
-
-#Peer 1: 4TTC9WBSVP9RJT6DVEZ7E0TDW7TQXC11NR1EMR2F8ARS87WZ2730
-#Peer 2: F7B5NX6KCPG8SAKYSGV0E94Y5NXR9JE3HCGQ5YGH1H04WFQWMWT0
-
-[transport-blacklist-4TTC9WBSVP9RJT6DVEZ7E0TDW7TQXC11NR1EMR2F8ARS87WZ2730]
-F7B5NX6KCPG8SAKYSGV0E94Y5NXR9JE3HCGQ5YGH1H04WFQWMWT0 = tcp
-
diff --git
a/src/transport/test_transport_blacklisting_cfg_blp_peer1_plugin.conf
b/src/transport/test_transport_blacklisting_cfg_blp_peer1_plugin.conf
deleted file mode 100644
index b328dd5cf..000000000
--- a/src/transport/test_transport_blacklisting_cfg_blp_peer1_plugin.conf
+++ /dev/null
@@ -1,13 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport]
-PLUGINS = tcp
-
-#Peer 1: 4TTC9WBSVP9RJT6DVEZ7E0TDW7TQXC11NR1EMR2F8ARS87WZ2730
-#Peer 2: F7B5NX6KCPG8SAKYSGV0E94Y5NXR9JE3HCGQ5YGH1H04WFQWMWT0
-
-[transport-blacklist-4TTC9WBSVP9RJT6DVEZ7E0TDW7TQXC11NR1EMR2F8ARS87WZ2730]
-F7B5NX6KCPG8SAKYSGV0E94Y5NXR9JE3HCGQ5YGH1H04WFQWMWT0 = tcp
-
diff --git a/src/transport/test_transport_blacklisting_cfg_blp_peer2_full.conf
b/src/transport/test_transport_blacklisting_cfg_blp_peer2_full.conf
deleted file mode 100644
index 862209d2c..000000000
--- a/src/transport/test_transport_blacklisting_cfg_blp_peer2_full.conf
+++ /dev/null
@@ -1,12 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport]
-PLUGINS = tcp
-
-#Peer 1: 4TTC9WBSVP9RJT6DVEZ7E0TDW7TQXC11NR1EMR2F8ARS87WZ2730
-#Peer 2: F7B5NX6KCPG8SAKYSGV0E94Y5NXR9JE3HCGQ5YGH1H04WFQWMWT0
-
-[transport-blacklist-F7B5NX6KCPG8SAKYSGV0E94Y5NXR9JE3HCGQ5YGH1H04WFQWMWT0]
-4TTC9WBSVP9RJT6DVEZ7E0TDW7TQXC11NR1EMR2F8ARS87WZ2730 =
diff --git
a/src/transport/test_transport_blacklisting_cfg_blp_peer2_multiple_plugins.conf
b/src/transport/test_transport_blacklisting_cfg_blp_peer2_multiple_plugins.conf
deleted file mode 100644
index 3134f9d81..000000000
---
a/src/transport/test_transport_blacklisting_cfg_blp_peer2_multiple_plugins.conf
+++ /dev/null
@@ -1,12 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport]
-PLUGINS = tcp unix
-
-#Peer 1: 4TTC9WBSVP9RJT6DVEZ7E0TDW7TQXC11NR1EMR2F8ARS87WZ2730
-#Peer 2: F7B5NX6KCPG8SAKYSGV0E94Y5NXR9JE3HCGQ5YGH1H04WFQWMWT0
-
-[transport-blacklist-F7B5NX6KCPG8SAKYSGV0E94Y5NXR9JE3HCGQ5YGH1H04WFQWMWT0]
-4TTC9WBSVP9RJT6DVEZ7E0TDW7TQXC11NR1EMR2F8ARS87WZ2730 = tcp
diff --git
a/src/transport/test_transport_blacklisting_cfg_blp_peer2_plugin.conf
b/src/transport/test_transport_blacklisting_cfg_blp_peer2_plugin.conf
deleted file mode 100644
index dd582125d..000000000
--- a/src/transport/test_transport_blacklisting_cfg_blp_peer2_plugin.conf
+++ /dev/null
@@ -1,12 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport]
-PLUGINS = tcp
-
-#Peer 1: 4TTC9WBSVP9RJT6DVEZ7E0TDW7TQXC11NR1EMR2F8ARS87WZ2730
-#Peer 2: F7B5NX6KCPG8SAKYSGV0E94Y5NXR9JE3HCGQ5YGH1H04WFQWMWT0
-
-[transport-blacklist-F7B5NX6KCPG8SAKYSGV0E94Y5NXR9JE3HCGQ5YGH1H04WFQWMWT0]
-4TTC9WBSVP9RJT6DVEZ7E0TDW7TQXC11NR1EMR2F8ARS87WZ2730 = tcp
diff --git a/src/transport/test_transport_blacklisting_cfg_peer1.conf
b/src/transport/test_transport_blacklisting_cfg_peer1.conf
deleted file mode 100644
index 9150c7faf..000000000
--- a/src/transport/test_transport_blacklisting_cfg_peer1.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-@INLINE@ template_cfg_peer1.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p1/
-
-[transport-tcp]
-PORT = 12000
-TIMEOUT = 5 s
-
-[arm]
-PORT = 12005
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-arm.sock
-
-[statistics]
-PORT = 12004
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-statistics.sock
-
-[resolver]
-PORT = 12003
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-resolver.sock
-
-[peerinfo]
-PORT = 12002
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-peerinfo.sock
-
-[transport]
-PORT = 12001
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p1-service-transport.sock
-PLUGINS = tcp
-
diff --git a/src/transport/test_transport_blacklisting_cfg_peer2.conf
b/src/transport/test_transport_blacklisting_cfg_peer2.conf
deleted file mode 100644
index 43bb4ae37..000000000
--- a/src/transport/test_transport_blacklisting_cfg_peer2.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-@INLINE@ template_cfg_peer2.conf
-[PATHS]
-GNUNET_TEST_HOME = $GNUNET_TMP/test-transport/api-tcp-p2/
-
-[transport-tcp]
-PORT = 12015
-TIMEOUT = 5 s
-
-[arm]
-PORT = 12014
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-arm.sock
-
-[statistics]
-PORT = 12013
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-statistics.sock
-
-[resolver]
-PORT = 12012
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-resolver.sock
-
-[peerinfo]
-PORT = 12011
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-peerinfo.sock
-
-[transport]
-PORT = 12010
-PLUGINS = tcp
-UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-p2-service-transport.sock
diff --git a/src/transport/test_transport_testing_restart.c
b/src/transport/test_transport_testing_restart.c
deleted file mode 100644
index f537af5fc..000000000
--- a/src/transport/test_transport_testing_restart.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009, 2010, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/test_transport_testing_restart.c
- * @brief test case for transport testing library:
- * start the peer, get the HELLO message, restart and stop the peer
- */
-#include "platform.h"
-#include "gnunet_transport_service.h"
-#include "transport-testing.h"
-
-#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
-
-
-static struct GNUNET_SCHEDULER_Task *timeout_task;
-
-static struct GNUNET_TRANSPORT_TESTING_PeerContext *p;
-
-static struct GNUNET_TRANSPORT_TESTING_Handle *tth;
-
-static int ret;
-
-
-static void
-end ()
-{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Stopping peers\n");
- if (NULL != timeout_task)
- GNUNET_SCHEDULER_cancel (timeout_task);
- if (NULL != p)
- GNUNET_TRANSPORT_TESTING_stop_peer (p);
- if (NULL != tth)
- GNUNET_TRANSPORT_TESTING_done (tth);
-}
-
-
-static void
-end_badly ()
-{
- timeout_task = NULL;
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Timeout!\n");
- end ();
- ret = GNUNET_SYSERR;
-}
-
-
-static void
-restart_cb (void *cls)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Peer %u (`%s') successfully restarted\n",
- p->no,
- GNUNET_i2s (&p->id));
- ret = 0;
- GNUNET_SCHEDULER_add_now (&end,
- NULL);
-}
-
-
-static void
-restart_task ()
-{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Peer %u (`%s') restarting\n",
- p->no,
- GNUNET_i2s (&p->id));
- GNUNET_TRANSPORT_TESTING_restart_peer (p,
- &restart_cb,
- p);
-}
-
-
-static void
-start_cb (void *cls)
-{
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Peer %u (`%s') successfully started\n",
- p->no,
- GNUNET_i2s (&p->id));
- GNUNET_SCHEDULER_add_now (&restart_task,
- NULL);
-}
-
-
-static void
-run (void *cls,
- char *const *args,
- const char *cfgfile,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- ret = 1;
- tth = GNUNET_TRANSPORT_TESTING_init ();
- GNUNET_assert (NULL != tth);
-
- timeout_task
- = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
- &end_badly,
- NULL);
- p = GNUNET_TRANSPORT_TESTING_start_peer (tth,
- cfgfile,
- 1,
- NULL, /* receive cb */
- NULL, /* connect cb */
- NULL, /* disconnect cb */
- NULL, /* nc/nd closure */
- start_cb, /* startup cb */
- NULL); /* closure */
- if (NULL == p)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to start peer\n");
- end ();
- ret = 1;
- }
-}
-
-
-int
-main (int argc,
- char *argv[])
-{
- char *const argv_1[] = { "test_transport_testing_restart",
- "-c",
- "test_transport_api_data.conf",
- NULL };
- struct GNUNET_GETOPT_CommandLineOption options[] = {
- GNUNET_GETOPT_OPTION_END
- };
-
- GNUNET_log_setup ("test_transport_testing_restart",
- "WARNING",
- NULL);
- GNUNET_PROGRAM_run ((sizeof(argv_1) / sizeof(char *)) - 1,
- argv_1,
- "test_transport_testing_restart",
- "nohelp",
- options,
- &run,
- NULL);
- return ret;
-}
-
-
-/* end of test_transport_testing_restart.c */
diff --git a/src/transport/transport-testing-filenames.c
b/src/transport/transport-testing-filenames.c
deleted file mode 100644
index ee7b0aacf..000000000
--- a/src/transport/transport-testing-filenames.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2006, 2009, 2015, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport-testing-filenames.c
- * @brief convenience string manipulation functions for tests
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "transport-testing.h"
-
-
-/**
- * Removes all directory separators from absolute filename
- *
- * @param file the absolute file name, e.g. as found in argv[0]
- * @return extracted file name, has to be freed by caller
- */
-static char *
-extract_filename (const char *file)
-{
- char *pch = GNUNET_strdup (file);
- char *backup = pch;
- char *filename = NULL;
- char *res;
-
- if (NULL != strstr (pch, "/"))
- {
- pch = strtok (pch, "/");
- while (pch != NULL)
- {
- pch = strtok (NULL, "/");
- if (pch != NULL)
- {
- filename = pch;
- }
- }
- }
- else
- filename = pch;
-
- res = GNUNET_strdup (filename);
- GNUNET_free (backup);
- return res;
-}
-
-
-char *
-GNUNET_TRANSPORT_TESTING_get_test_name (const char *file)
-{
- char *backup = extract_filename (file);
- char *filename = backup;
- char *dotexe;
- char *ret;
-
- if (NULL == filename)
- return NULL;
-
- /* remove "lt-" */
- filename = strstr (filename, "test");
- if (NULL == filename)
- {
- GNUNET_free (backup);
- return NULL;
- }
-
- /* remove ".exe" */
- if (NULL != (dotexe = strstr (filename, ".exe")))
- dotexe[0] = '\0';
- ret = GNUNET_strdup (filename);
- GNUNET_free (backup);
- return ret;
-}
-
-
-char *
-GNUNET_TRANSPORT_TESTING_get_test_source_name (const char *file)
-{
- char *src = extract_filename (file);
- char *split;
-
- split = strstr (src, ".");
- if (NULL != split)
- split[0] = '\0';
- return src;
-}
-
-
-char *
-GNUNET_TRANSPORT_TESTING_get_test_plugin_name (const char *file,
- const char *test)
-{
- char *filename;
- char *dotexe;
- char *e = extract_filename (file);
- char *t = extract_filename (test);
- char *ret;
-
- if (NULL == e)
- goto fail;
- /* remove "lt-" */
- filename = strstr (e, "tes");
- if (NULL == filename)
- goto fail;
- /* remove ".exe" */
- if (NULL != (dotexe = strstr (filename, ".exe")))
- dotexe[0] = '\0';
-
- /* find last _ */
- filename = strstr (filename, t);
- if (NULL == filename)
- goto fail;
- /* copy plugin */
- filename += strlen (t);
- if ('\0' != *filename)
- filename++;
- ret = GNUNET_strdup (filename);
- goto suc;
-fail:
- ret = NULL;
-suc:
- GNUNET_free (t);
- GNUNET_free (e);
- return ret;
-}
-
-
-char *
-GNUNET_TRANSPORT_TESTING_get_config_name (const char *file,
- int count)
-{
- char *filename = extract_filename (file);
- char *backup = filename;
- char *dotexe;
- char *ret;
-
- if (NULL == filename)
- return NULL;
- /* remove "lt-" */
- filename = strstr (filename, "test");
- if (NULL == filename)
- goto fail;
- /* remove ".exe" */
- if (NULL != (dotexe = strstr (filename, ".exe")))
- dotexe[0] = '\0';
- GNUNET_asprintf (&ret,
- "%s_peer%u.conf",
- filename,
- count);
- GNUNET_free (backup);
- return ret;
-fail:
- GNUNET_free (backup);
- return NULL;
-}
-
-
-/* end of transport-testing-filenames.c */
diff --git a/src/transport/transport-testing-loggers.c
b/src/transport/transport-testing-loggers.c
deleted file mode 100644
index 21ed0592a..000000000
--- a/src/transport/transport-testing-loggers.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport-testing-loggers.c
- * @brief convenience functions for logging common events in tests
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "transport-testing.h"
-
-
-/**
- * Log a connect event.
- *
- * @param cls NULL
- * @param me peer that had the event
- * @param other peer that connected.
- */
-void
-GNUNET_TRANSPORT_TESTING_log_connect (void *cls,
- struct
- GNUNET_TRANSPORT_TESTING_PeerContext *me,
- const struct GNUNET_PeerIdentity *other)
-{
- char *ps;
-
- ps = GNUNET_strdup (GNUNET_i2s (&me->id));
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Peer %s connected to %u (%s)!\n",
- GNUNET_i2s (other),
- me->no,
- ps);
- GNUNET_free (ps);
-}
-
-
-/**
- * Log a disconnect event.
- *
- * @param cls NULL
- * @param me peer that had the event
- * @param other peer that disconnected.
- */
-void
-GNUNET_TRANSPORT_TESTING_log_disconnect (void *cls,
- struct
- GNUNET_TRANSPORT_TESTING_PeerContext *
- me,
- const struct
- GNUNET_PeerIdentity *other)
-{
- char *ps;
-
- ps = GNUNET_strdup (GNUNET_i2s (&me->id));
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Peer `%s' disconnected from %u (%s)!\n",
- GNUNET_i2s (other),
- me->no,
- ps);
- GNUNET_free (ps);
-}
-
-
-/* end of transport-testing-loggers.c */
diff --git a/src/transport/transport-testing-main.c
b/src/transport/transport-testing-main.c
deleted file mode 100644
index 63b91713c..000000000
--- a/src/transport/transport-testing-main.c
+++ /dev/null
@@ -1,614 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport-testing-main.c
- * @brief convenience main function for tests
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "transport-testing.h"
-
-
-/**
- * Closure for #connect_cb.
- */
-struct GNUNET_TRANSPORT_TESTING_ConnectRequestList
-{
- /**
- * Stored in a DLL.
- */
- struct GNUNET_TRANSPORT_TESTING_ConnectRequestList *next;
-
- /**
- * Stored in a DLL.
- */
- struct GNUNET_TRANSPORT_TESTING_ConnectRequestList *prev;
-
- /**
- * Overall context we are in.
- */
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc;
-
- /**
- * Connect request this is about.
- */
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cr;
-
- /**
- * Peer being connected.
- */
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p1;
-
- /**
- * Peer being connected.
- */
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p2;
-};
-
-
-/**
- * Shutdown function for the test. Stops all peers.
- *
- * @param cls our `struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *`
- */
-static void
-do_shutdown (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = cls;
- struct GNUNET_TRANSPORT_TESTING_ConnectRequestList *crl;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Testcase shutting down\n");
- if (NULL != ccc->shutdown_task)
- ccc->shutdown_task (ccc->shutdown_task_cls);
- if (NULL != ccc->timeout_task)
- {
- GNUNET_SCHEDULER_cancel (ccc->timeout_task);
- ccc->timeout_task = NULL;
- }
- if (NULL != ccc->connect_task)
- {
- GNUNET_SCHEDULER_cancel (ccc->connect_task);
- ccc->connect_task = NULL;
- }
- while (NULL != (crl = ccc->crl_head))
- {
- GNUNET_CONTAINER_DLL_remove (ccc->crl_head,
- ccc->crl_tail,
- crl);
- GNUNET_TRANSPORT_TESTING_connect_peers_cancel (crl->cr);
- GNUNET_free (crl);
- }
- for (unsigned int i = 0; i < ccc->num_peers; i++)
- {
- if (NULL != ccc->p[i])
- {
- GNUNET_TRANSPORT_TESTING_stop_peer (ccc->p[i]);
- ccc->p[i] = NULL;
- }
- }
-}
-
-
-/**
- * Testcase hit timeout, shut it down with error.
- *
- * @param cls our `struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *`
- */
-static void
-do_timeout (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = cls;
-
- ccc->timeout_task = NULL;
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Testcase timed out\n");
- ccc->global_ret = GNUNET_SYSERR;
- GNUNET_SCHEDULER_shutdown ();
-}
-
-
-/**
- * Internal data structure. Closure for
- * #connect_cb, #disconnect_cb, #my_nc and #start_cb.
- * Allows us to identify which peer this is about.
- */
-struct GNUNET_TRANSPORT_TESTING_InternalPeerContext
-{
- /**
- * Overall context of the callback.
- */
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc;
-
- /**
- * Offset of the peer this is about.
- */
- unsigned int off;
-};
-
-
-/**
- * Information tracked per connected peer.
- */
-struct ConnectPairInfo
-{
- /**
- * Peer this is about.
- */
- const struct GNUNET_PeerIdentity *sender;
-
- /**
- * Information about the receiving peer.
- */
- struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *ipi;
-};
-
-
-/**
- * Function called when we connected two peers. Once we have gotten
- * to the clique, launch test-specific logic.
- *
- * @param cls our `struct GNUNET_TRANSPORT_TESTING_ConnectRequestList *`
- */
-static void
-connect_cb (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_ConnectRequestList *crl = cls;
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = crl->ccc;
-
- GNUNET_CONTAINER_DLL_remove (ccc->crl_head,
- ccc->crl_tail,
- crl);
- {
- char *p1_c = GNUNET_strdup (GNUNET_i2s (&crl->p1->id));
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Peers connected: %u (%s) <-> %u (%s)\n",
- crl->p1->no,
- p1_c,
- crl->p2->no,
- GNUNET_i2s (&crl->p2->id));
- GNUNET_free (p1_c);
- GNUNET_free (crl);
- }
- if (NULL == ccc->crl_head)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "All connections UP, launching custom test logic.\n");
- GNUNET_SCHEDULER_add_now (ccc->connect_continuation,
- ccc->connect_continuation_cls);
- }
-}
-
-
-/**
- * Find peer by peer ID.
- *
- * @param ccc context to search
- * @param peer peer to look for
- * @return NULL if @a peer was not found
- */
-struct GNUNET_TRANSPORT_TESTING_PeerContext *
-GNUNET_TRANSPORT_TESTING_find_peer (struct
-
GNUNET_TRANSPORT_TESTING_ConnectCheckContext
- *ccc,
- const struct GNUNET_PeerIdentity *peer)
-{
- for (unsigned int i = 0; i < ccc->num_peers; i++)
- if ((NULL != ccc->p[i]) &&
- (0 == memcmp (peer,
- &ccc->p[i]->id,
- sizeof(*peer))))
- return ccc->p[i];
- return NULL;
-}
-
-
-/**
- * Wrapper around peers connecting. Calls client's nc function.
- *
- * @param cls our `struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *`
- * @param peer peer we got connected to
- * @param mq message queue for transmissions to @a peer
- * @return closure for message handlers
- */
-static void *
-my_nc (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- struct GNUNET_MQ_Handle *mq)
-{
- struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *ipi = cls;
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = ipi->ccc;
- struct ConnectPairInfo *cpi;
-
- if (NULL != ccc->nc)
- ccc->nc (ccc->cls,
- ccc->p[ipi->off],
- peer);
- cpi = GNUNET_new (struct ConnectPairInfo);
- cpi->ipi = ipi;
- cpi->sender = peer; /* valid until disconnect */
- return cpi;
-}
-
-
-/**
- * Wrapper around peers disconnecting. Calls client's nd function.
- *
- * @param cls our `struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *`
- * @param peer peer we got disconnected from
- * @param custom_cls return value from @a my_nc
- */
-static void
-my_nd (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *custom_cls)
-{
- struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *ipi = cls;
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = ipi->ccc;
- struct ConnectPairInfo *cpi = custom_cls;
-
- if (NULL != ccc->nd)
- ccc->nd (ccc->cls,
- ccc->p[ipi->off],
- peer);
- GNUNET_free (cpi);
-}
-
-
-/**
- * Wrapper around receiving data. Calls client's rec function.
- *
- * @param cls our `struct ConnectPairInfo *`
- * @param message message we received
- * @return #GNUNET_OK (all messages are fine)
- */
-static int
-check_test (void *cls,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- return GNUNET_OK;
-}
-
-
-/**
- * Wrapper around receiving data. Calls client's rec function.
- *
- * @param cls our `struct ConnectPairInfo *`
- * @param message message we received
- */
-static void
-handle_test (void *cls,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- struct ConnectPairInfo *cpi = cls;
- struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *ipi = cpi->ipi;
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = ipi->ccc;
-
- if (NULL != ccc->rec)
- ccc->rec (ccc->cls,
- ccc->p[ipi->off],
- cpi->sender,
- message);
-}
-
-
-/**
- * Wrapper around receiving data. Calls client's rec function.
- *
- * @param cls our `struct ConnectPairInfo *`
- * @param message message we received
- * @return #GNUNET_OK (all messages are fine)
- */
-static int
-check_test2 (void *cls,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- return GNUNET_OK;
-}
-
-
-/**
- * Wrapper around receiving data. Calls client's rec function.
- *
- * @param cls our `struct ConnectPairInfo *`
- * @param message message we received
- */
-static void
-handle_test2 (void *cls,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
-{
- struct ConnectPairInfo *cpi = cls;
- struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *ipi = cpi->ipi;
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = ipi->ccc;
-
- if (NULL != ccc->rec)
- ccc->rec (ccc->cls,
- ccc->p[ipi->off],
- cpi->sender,
- message);
-}
-
-
-/**
- * Connect the peers as a clique.
- *
- * @param cls our `struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext`
- */
-static void
-do_connect (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = cls;
-
- ccc->connect_task = NULL;
- for (unsigned int i = 0; i < ccc->num_peers; i++)
- for (unsigned int j = (ccc->bi_directional ? 0 : i + 1); j <
ccc->num_peers;
- j++)
- {
- struct GNUNET_TRANSPORT_TESTING_ConnectRequestList *crl;
-
- if (i == j)
- continue;
- crl = GNUNET_new (struct GNUNET_TRANSPORT_TESTING_ConnectRequestList);
- GNUNET_CONTAINER_DLL_insert (ccc->crl_head,
- ccc->crl_tail,
- crl);
- crl->ccc = ccc;
- crl->p1 = ccc->p[i];
- crl->p2 = ccc->p[j];
- {
- char *sender_c = GNUNET_strdup (GNUNET_i2s (&ccc->p[0]->id));
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Test tries to connect peer %u (`%s') -> peer %u (`%s')\n",
- ccc->p[0]->no,
- sender_c,
- ccc->p[1]->no,
- GNUNET_i2s (&ccc->p[1]->id));
- GNUNET_free (sender_c);
- }
- crl->cr = GNUNET_TRANSPORT_TESTING_connect_peers (ccc->p[i],
- ccc->p[j],
- &connect_cb,
- crl);
- }
-}
-
-
-/**
- * Function called once we have successfully launched a peer.
- * Once all peers have been launched, we connect all of them
- * in a clique.
- *
- * @param cls our `struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *`
- */
-static void
-start_cb (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *ipi = cls;
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = ipi->ccc;
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p = ccc->p[ipi->off];
-
- ccc->started++;
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Peer %u (`%s') started\n",
- p->no,
- GNUNET_i2s (&p->id));
- if (ccc->started != ccc->num_peers)
- return;
- if (NULL != ccc->pre_connect_task)
- {
- /* Run the custom per-connect job, then give it a second to
- go into effect before we continue connecting peers. */
- ccc->pre_connect_task (ccc->pre_connect_task_cls);
- ccc->connect_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
- &do_connect,
- ccc);
- }
- else
- {
- do_connect (ccc);
- }
-}
-
-
-/**
- * Function run from #GNUNET_TRANSPORT_TESTING_connect_check
- * once the scheduler is up. Should launch the peers and
- * then in the continuations try to connect them.
- *
- * @param cls our `struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *`
- * @param args ignored
- * @param cfgfile ignored
- * @param cfg configuration
- */
-static void
-connect_check_run (void *cls,
- char *const *args,
- const char *cfgfile,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = cls;
- int ok;
-
- ccc->cfg = cfg;
- ccc->timeout_task = GNUNET_SCHEDULER_add_delayed (ccc->timeout,
- &do_timeout,
- ccc);
- GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
- ccc);
- ok = GNUNET_OK;
- for (unsigned int i = 0; i < ccc->num_peers; i++)
- {
- struct GNUNET_MQ_MessageHandler handlers[] = {
- GNUNET_MQ_hd_var_size (test,
- GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE,
- struct GNUNET_TRANSPORT_TESTING_TestMessage,
- NULL),
- GNUNET_MQ_hd_var_size (test2,
- GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE2,
- struct GNUNET_TRANSPORT_TESTING_TestMessage,
- NULL),
- GNUNET_MQ_handler_end ()
- };
- ccc->p[i] = GNUNET_TRANSPORT_TESTING_start_peer (ccc->tth,
- ccc->cfg_files[i],
- i + 1,
- handlers,
- &my_nc,
- &my_nd,
- &ccc->ip[i],
- &start_cb,
- &ccc->ip[i]);
- if (NULL == ccc->p[i])
- ok = GNUNET_SYSERR;
- }
- if (GNUNET_OK != ok)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Fail! Could not start peers!\n");
- GNUNET_SCHEDULER_shutdown ();
- }
-}
-
-
-/**
- * Common implementation of the #GNUNET_TRANSPORT_TESTING_CheckCallback.
- * Starts and connects the two peers, then invokes the
- * `connect_continuation` from @a cls. Sets up a timeout to
- * abort the test, and a shutdown handler to clean up properly
- * on exit.
- *
- * @param cls closure of type `struct
GNUNET_TRANSPORT_TESTING_ConnectCheckContext`
- * @param tth_ initialized testing handle
- * @param test_plugin_ name of the plugin
- * @param test_name_ name of the test
- * @param num_peers number of entries in the @a cfg_file array
- * @param cfg_files array of names of configuration files for the peers
- * @return #GNUNET_SYSERR on error
- */
-int
-GNUNET_TRANSPORT_TESTING_connect_check (void *cls,
- struct GNUNET_TRANSPORT_TESTING_Handle
*
- tth_,
- const char *test_plugin_,
- const char *test_name_,
- unsigned int num_peers,
- char *cfg_files[])
-{
- static struct GNUNET_GETOPT_CommandLineOption options[] = {
- GNUNET_GETOPT_OPTION_END
- };
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = cls;
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p[num_peers];
- struct GNUNET_TRANSPORT_TESTING_InternalPeerContext ip[num_peers];
- char *argv[] = {
- (char *) test_name_,
- "-c",
- (char *) ccc->config_file,
- NULL
- };
-
- ccc->num_peers = num_peers;
- ccc->cfg_files = cfg_files;
- ccc->test_plugin = test_plugin_;
- ccc->test_name = test_name_;
- ccc->tth = tth_;
- ccc->global_ret = GNUNET_OK;
- ccc->p = p;
- ccc->ip = ip;
- for (unsigned int i = 0; i < num_peers; i++)
- {
- ip[i].off = i;
- ip[i].ccc = ccc;
- }
- if (GNUNET_OK !=
- GNUNET_PROGRAM_run ((sizeof(argv) / sizeof(char *)) - 1,
- argv,
- test_name_,
- "nohelp",
- options,
- &connect_check_run,
- ccc))
- return GNUNET_SYSERR;
- return ccc->global_ret;
-}
-
-
-/**
- * Setup testcase. Calls @a check with the data the test needs.
- *
- * @param argv0 binary name (argv[0])
- * @param filename source file name (__FILE__)
- * @param num_peers number of peers to start
- * @param check main function to run
- * @param check_cls closure for @a check
- * @return #GNUNET_OK on success
- */
-int
-GNUNET_TRANSPORT_TESTING_main_ (const char *argv0,
- const char *filename,
- unsigned int num_peers,
- GNUNET_TRANSPORT_TESTING_CheckCallback check,
- void *check_cls)
-{
- struct GNUNET_TRANSPORT_TESTING_Handle *tth;
- char *test_name;
- char *test_source;
- char *test_plugin;
- char *cfg_names[num_peers];
- int ret;
-
- ret = GNUNET_OK;
- test_name = GNUNET_TRANSPORT_TESTING_get_test_name (argv0);
- GNUNET_log_setup (test_name,
- "WARNING",
- NULL);
- test_source = GNUNET_TRANSPORT_TESTING_get_test_source_name (filename);
- test_plugin = GNUNET_TRANSPORT_TESTING_get_test_plugin_name (argv0,
- test_source);
- for (unsigned int i = 0; i < num_peers; i++)
- cfg_names[i] = GNUNET_TRANSPORT_TESTING_get_config_name (argv0,
- i + 1);
- tth = GNUNET_TRANSPORT_TESTING_init ();
- if (NULL == tth)
- {
- ret = GNUNET_SYSERR;
- }
- else
- {
- ret = check (check_cls,
- tth,
- test_plugin,
- test_name,
- num_peers,
- cfg_names);
- GNUNET_TRANSPORT_TESTING_done (tth);
- }
- for (unsigned int i = 0; i < num_peers; i++)
- GNUNET_free (cfg_names[i]);
- GNUNET_free (test_source);
- GNUNET_free (test_plugin);
- GNUNET_free (test_name);
- return ret;
-}
-
-
-/* end of transport-testing-main.c */
diff --git a/src/transport/transport-testing-send.c
b/src/transport/transport-testing-send.c
deleted file mode 100644
index 9b017c563..000000000
--- a/src/transport/transport-testing-send.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport-testing-send.c
- * @brief convenience transmission function for tests
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "transport-testing.h"
-
-/**
- * Acceptable transmission delay.
- */
-#define TIMEOUT_TRANSMIT GNUNET_TIME_relative_multiply ( \
- GNUNET_TIME_UNIT_SECONDS, 30)
-
-
-/**
- * Return @a cx in @a cls.
- */
-static void
-find_cr (void *cls,
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cx)
-{
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest **cr = cls;
-
- if (GNUNET_NO == cx->connected)
- return;
- *cr = cx;
-}
-
-
-/**
- * Send a test message of type @a mtype and size @a msize from
- * peer @a sender to peer @a receiver. The peers should be
- * connected when this function is called.
- *
- * @param sender the sending peer
- * @param receiver the receiving peer
- * @param mtype message type to use
- * @param msize size of the message, at least `sizeof (struct
GNUNET_TRANSPORT_TESTING_TestMessage)`
- * @param num unique message number
- * @param cont continuation to call after transmission
- * @param cont_cls closure for @a cont
- * @return #GNUNET_OK if message was queued,
- * #GNUNET_NO if peers are not connected
- * #GNUNET_SYSERR if @a msize is illegal
- */
-int
-GNUNET_TRANSPORT_TESTING_send (struct
- GNUNET_TRANSPORT_TESTING_PeerContext *sender,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *
- receiver,
- uint16_t mtype,
- uint16_t msize,
- uint32_t num,
- GNUNET_SCHEDULER_TaskCallback cont,
- void *cont_cls)
-{
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cr;
- struct GNUNET_MQ_Envelope *env;
- struct GNUNET_TRANSPORT_TESTING_TestMessage *test;
-
- if (msize < sizeof(struct GNUNET_TRANSPORT_TESTING_TestMessage))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- cr = NULL;
- GNUNET_TRANSPORT_TESTING_find_connecting_context (sender,
- receiver,
- &find_cr,
- &cr);
- if (NULL == cr)
- GNUNET_TRANSPORT_TESTING_find_connecting_context (receiver,
- sender,
- &find_cr,
- &cr);
- if (NULL == cr)
- {
- GNUNET_break (0);
- return GNUNET_NO;
- }
- if (NULL == cr->mq)
- {
- GNUNET_break (0);
- return GNUNET_NO;
- }
- {
- char *receiver_s = GNUNET_strdup (GNUNET_i2s (&receiver->id));
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Sending message from peer %u (`%s') -> peer %u (`%s') !\n",
- sender->no,
- GNUNET_i2s (&sender->id),
- receiver->no,
- receiver_s);
- GNUNET_free (receiver_s);
- }
- env = GNUNET_MQ_msg_extra (test,
- msize - sizeof(*test),
- mtype);
- test->num = htonl (num);
- memset (&test[1],
- num,
- msize - sizeof(*test));
- GNUNET_MQ_notify_sent (env,
- cont,
- cont_cls);
- GNUNET_MQ_send (cr->mq,
- env);
- return GNUNET_OK;
-}
-
-
-/**
- * Task that sends a test message from the
- * first peer to the second peer.
- *
- * @param ccc context which should contain at least two peers, the
- * first two of which should be currently connected
- * @param size desired message size
- * @param cont continuation to call after transmission
- * @param cont_cls closure for @a cont
- */
-static void
-do_send (struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc,
- uint16_t size,
- GNUNET_SCHEDULER_TaskCallback cont,
- void *cont_cls)
-{
- int ret;
-
- ccc->global_ret = GNUNET_SYSERR;
- ret = GNUNET_TRANSPORT_TESTING_send (ccc->p[0],
- ccc->p[1],
- GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE,
- size,
- ccc->send_num_gen++,
- cont,
- cont_cls);
- GNUNET_assert (GNUNET_SYSERR != ret);
- if (GNUNET_NO == ret)
- {
- GNUNET_break (0);
- ccc->global_ret = GNUNET_SYSERR;
- GNUNET_SCHEDULER_shutdown ();
- }
-}
-
-
-/**
- * Task that sends a minimalistic test message from the
- * first peer to the second peer.
- *
- * @param cls the `struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext`
- * which should contain at least two peers, the first two
- * of which should be currently connected
- */
-void
-GNUNET_TRANSPORT_TESTING_simple_send (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_SendClosure *sc = cls;
- int done;
- size_t msize;
-
- if (0 < sc->num_messages)
- {
- sc->num_messages--;
- done = (0 == sc->num_messages);
- }
- else
- {
- done = 0; /* infinite loop */
- }
- msize = sizeof(struct GNUNET_TRANSPORT_TESTING_TestMessage);
- if (NULL != sc->get_size_cb)
- msize = sc->get_size_cb (sc->num_messages);
- /* if this was the last message, call the continuation,
- otherwise call this function again */
- do_send (sc->ccc,
- msize,
- done ? sc->cont : &GNUNET_TRANSPORT_TESTING_simple_send,
- done ? sc->cont_cls : sc);
-}
-
-
-/**
- * Task that sends a large test message from the
- * first peer to the second peer.
- *
- * @param cls the `struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext`
- * which should contain at least two peers, the first two
- * of which should be currently connected
- */
-void
-GNUNET_TRANSPORT_TESTING_large_send (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_SendClosure *sc = cls;
- int done;
- size_t msize;
-
- if (0 < sc->num_messages)
- {
- sc->num_messages--;
- done = (0 == sc->num_messages);
- }
- else
- {
- done = 0; /* infinite loop */
- }
- msize = 2600;
- if (NULL != sc->get_size_cb)
- msize = sc->get_size_cb (sc->num_messages);
- /* if this was the last message, call the continuation,
- otherwise call this function again */
- do_send (sc->ccc,
- msize,
- done ? sc->cont : &GNUNET_TRANSPORT_TESTING_large_send,
- done ? sc->cont_cls : sc);
-}
-
-
-/* end of transport-testing-send.c */
diff --git a/src/transport/transport-testing.c
b/src/transport/transport-testing.c
deleted file mode 100644
index baced62e3..000000000
--- a/src/transport/transport-testing.c
+++ /dev/null
@@ -1,932 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2006, 2009, 2015, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport-testing.c
- * @brief testing lib for transport service
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "transport-testing.h"
-
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "transport-testing", __VA_ARGS__)
-
-
-static struct GNUNET_TRANSPORT_TESTING_PeerContext *
-find_peer_context (struct GNUNET_TRANSPORT_TESTING_Handle *tth,
- const struct GNUNET_PeerIdentity *peer)
-{
- struct GNUNET_TRANSPORT_TESTING_PeerContext *t;
-
- for (t = tth->p_head; NULL != t; t = t->next)
- if (0 == memcmp (&t->id,
- peer,
- sizeof(struct GNUNET_PeerIdentity)))
- return t;
- return NULL;
-}
-
-
-/**
- * Find any connecting context matching the given pair of peers.
- *
- * @param p1 first peer
- * @param p2 second peer
- * @param cb function to call
- * @param cb_cls closure for @a cb
- */
-void
-GNUNET_TRANSPORT_TESTING_find_connecting_context (struct
-
GNUNET_TRANSPORT_TESTING_PeerContext
- *p1,
- struct
-
GNUNET_TRANSPORT_TESTING_PeerContext
- *p2,
-
GNUNET_TRANSPORT_TESTING_ConnectContextCallback
- cb,
- void *cb_cls)
-{
- struct GNUNET_TRANSPORT_TESTING_Handle *tth = p1->tth;
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc;
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *ccn;
-
- for (cc = tth->cc_head; NULL != cc; cc = ccn)
- {
- ccn = cc->next;
- if ((cc->p1 == p1) &&
- (cc->p2 == p2))
- cb (cb_cls,
- cc);
- }
-}
-
-
-static void
-set_p1c (void *cls,
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cx)
-{
- int *found = cls;
-
- if (NULL != found)
- *found = GNUNET_YES;
- cx->p1_c = GNUNET_YES;
-}
-
-
-static void
-set_mq (void *cls,
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cx)
-{
- struct GNUNET_MQ_Handle *mq = cls;
-
- cx->mq = mq;
-}
-
-
-static void
-set_p2c (void *cls,
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cx)
-{
- int *found = cls;
-
- if (NULL != found)
- *found = GNUNET_YES;
- cx->p2_c = GNUNET_YES;
-}
-
-
-static void
-clear_p1c (void *cls,
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cx)
-{
- int *found = cls;
-
- if (NULL != found)
- *found = GNUNET_YES;
- cx->p1_c = GNUNET_NO;
-}
-
-
-static void
-clear_p2c (void *cls,
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cx)
-{
- int *found = cls;
-
- if (NULL != found)
- *found = GNUNET_YES;
- cx->p2_c = GNUNET_NO;
-}
-
-
-static void *
-notify_connect (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- struct GNUNET_MQ_Handle *mq)
-{
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p = cls;
- struct GNUNET_TRANSPORT_TESTING_Handle *tth = p->tth;
- char *p2_s;
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p2;
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc;
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *ccn;
- int found;
- void *ret;
-
- p2 = find_peer_context (p->tth,
- peer);
- if (NULL != p->nc)
- ret = p->nc (p->cb_cls,
- peer,
- mq);
- else
- ret = NULL;
-
- if (NULL != p2)
- GNUNET_asprintf (&p2_s,
- "%u (`%s')",
- p2->no,
- GNUNET_i2s (&p2->id));
- else
- GNUNET_asprintf (&p2_s,
- "`%s'",
- GNUNET_i2s (peer));
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Peers %s connected to peer %u (`%s')\n",
- p2_s,
- p->no,
- GNUNET_i2s (&p->id));
- GNUNET_free (p2_s);
- /* update flags in connecting contexts */
- found = GNUNET_NO;
- GNUNET_TRANSPORT_TESTING_find_connecting_context (p,
- p2,
- &set_p1c,
- &found);
- if (GNUNET_NO == found)
- {
- cc = GNUNET_new (struct GNUNET_TRANSPORT_TESTING_ConnectRequest);
- cc->p1 = p;
- cc->p2 = p2;
- cc->p1_c = GNUNET_YES;
- GNUNET_CONTAINER_DLL_insert (tth->cc_head,
- tth->cc_tail,
- cc);
- }
- found = GNUNET_NO;
- GNUNET_TRANSPORT_TESTING_find_connecting_context (p2,
- p,
- &set_p2c,
- &found);
- if (GNUNET_NO == found)
- {
- cc = GNUNET_new (struct GNUNET_TRANSPORT_TESTING_ConnectRequest);
- cc->p1 = p2;
- cc->p2 = p;
- cc->p1_c = GNUNET_YES;
- GNUNET_CONTAINER_DLL_insert (tth->cc_head,
- tth->cc_tail,
- cc);
- }
- GNUNET_TRANSPORT_TESTING_find_connecting_context (p,
- p2,
- &set_mq,
- mq);
- /* update set connected flag for all requests */
- for (cc = tth->cc_head; NULL != cc; cc = cc->next)
- {
- if (GNUNET_YES == cc->connected)
- continue;
- if ((GNUNET_YES == cc->p1_c) &&
- (GNUNET_YES == cc->p2_c))
- {
- cc->connected = GNUNET_YES;
- /* stop trying to connect */
- if (NULL != cc->tct)
- {
- GNUNET_SCHEDULER_cancel (cc->tct);
- cc->tct = NULL;
- }
- if (NULL != cc->oh)
- {
- GNUNET_TRANSPORT_offer_hello_cancel (cc->oh);
- cc->oh = NULL;
- }
- if (NULL != cc->ats_sh)
- {
- GNUNET_ATS_connectivity_suggest_cancel (cc->ats_sh);
- cc->ats_sh = NULL;
- }
- }
- }
- /* then notify application */
- for (cc = tth->cc_head; NULL != cc; cc = ccn)
- {
- ccn = cc->next;
- if ((GNUNET_YES == cc->connected) &&
- (NULL != cc->cb))
- {
- cc->cb (cc->cb_cls);
- cc->cb = NULL; /* only notify once! */
- }
- }
- return ret;
-}
-
-
-/**
- * Offer the current HELLO of P2 to P1.
- *
- * @param cls our `struct GNUNET_TRANSPORT_TESTING_ConnectRequest`
- */
-static void
-offer_hello (void *cls);
-
-
-static void
-notify_disconnect (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- void *handler_cls)
-{
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p = cls;
- struct GNUNET_TRANSPORT_TESTING_Handle *tth = p->tth;
- char *p2_s;
- /* Find PeerContext */
- int no = 0;
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p2 = NULL;
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc;
-
- p2 = find_peer_context (p->tth,
- peer);
- no = p->no;
- if (NULL != p2)
- GNUNET_asprintf (&p2_s,
- "%u (`%s')",
- p2->no,
- GNUNET_i2s (&p2->id));
- else
- GNUNET_asprintf (&p2_s,
- "`%s'",
- GNUNET_i2s (peer));
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Peers %s disconnected from peer %u (`%s')\n",
- p2_s,
- no,
- GNUNET_i2s (&p->id));
- GNUNET_free (p2_s);
- /* notify about disconnect */
- if (NULL != p->nd)
- p->nd (p->cb_cls,
- peer,
- handler_cls);
- if (NULL == p2)
- return;
- /* clear MQ, it is now invalid */
- GNUNET_TRANSPORT_TESTING_find_connecting_context (p,
- p2,
- &set_mq,
- NULL);
- /* update set connected flags for all requests */
- GNUNET_TRANSPORT_TESTING_find_connecting_context (p,
- p2,
- &clear_p1c,
- NULL);
- GNUNET_TRANSPORT_TESTING_find_connecting_context (p2,
- p,
- &clear_p2c,
- NULL);
- /* resume connectivity requests as necessary */
- for (cc = tth->cc_head; NULL != cc; cc = cc->next)
- {
- if (GNUNET_NO == cc->connected)
- continue;
- if ((GNUNET_YES != cc->p1_c) ||
- (GNUNET_YES != cc->p2_c))
- {
- cc->connected = GNUNET_NO;
- /* start trying to connect */
- if ((NULL == cc->tct) &&
- (NULL == cc->oh))
- cc->tct = GNUNET_SCHEDULER_add_now (&offer_hello,
- cc);
- if (NULL == cc->ats_sh)
- cc->ats_sh = GNUNET_ATS_connectivity_suggest (cc->p1->ats,
- &p2->id,
- 1);
- }
- }
-}
-
-
-static void
-get_hello (void *cb_cls,
- const struct GNUNET_MessageHeader *message)
-{
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p = cb_cls;
- struct GNUNET_PeerIdentity hello_id;
-
- GNUNET_assert (GNUNET_OK ==
- GNUNET_HELLO_get_id ((const struct
- GNUNET_HELLO_Message *) message,
- &hello_id));
- GNUNET_assert (0 == memcmp (&hello_id,
- &p->id,
- sizeof(hello_id)));
- GNUNET_free (p->hello);
- p->hello = (struct GNUNET_HELLO_Message *) GNUNET_copy_message (message);
-
- if (NULL != p->start_cb)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Peer %u (`%s') successfully started\n",
- p->no,
- GNUNET_i2s (&p->id));
- p->start_cb (p->start_cb_cls);
- p->start_cb = NULL;
- }
-}
-
-
-/**
- * Start a peer with the given configuration
- * @param tth the testing handle
- * @param cfgname configuration file
- * @param peer_id a unique number to identify the peer
- * @param handlers functions for receiving messages
- * @param nc connect callback
- * @param nd disconnect callback
- * @param cb_cls closure for callback
- * @param start_cb start callback
- * @param start_cb_cls closure for callback
- * @return the peer context
- */
-struct GNUNET_TRANSPORT_TESTING_PeerContext *
-GNUNET_TRANSPORT_TESTING_start_peer (struct
- GNUNET_TRANSPORT_TESTING_Handle *tth,
- const char *cfgname,
- int peer_id,
- const struct
- GNUNET_MQ_MessageHandler *handlers,
- GNUNET_TRANSPORT_NotifyConnect nc,
- GNUNET_TRANSPORT_NotifyDisconnect nd,
- void *cb_cls,
- GNUNET_SCHEDULER_TaskCallback start_cb,
- void *start_cb_cls)
-{
- char *emsg = NULL;
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p;
- struct GNUNET_PeerIdentity dummy;
- unsigned int i;
-
- if (GNUNET_NO == GNUNET_DISK_file_test (cfgname))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "File not found: `%s'\n",
- cfgname);
- return NULL;
- }
-
- p = GNUNET_new (struct GNUNET_TRANSPORT_TESTING_PeerContext);
- p->tth = tth;
- p->nc = nc;
- p->nd = nd;
- if (NULL != handlers)
- {
- for (i = 0; NULL != handlers[i].cb; i++)
- ;
- p->handlers = GNUNET_new_array (i + 1,
- struct GNUNET_MQ_MessageHandler);
- GNUNET_memcpy (p->handlers,
- handlers,
- i * sizeof(struct GNUNET_MQ_MessageHandler));
- }
- if (NULL != cb_cls)
- p->cb_cls = cb_cls;
- else
- p->cb_cls = p;
- p->start_cb = start_cb;
- if (NULL != start_cb_cls)
- p->start_cb_cls = start_cb_cls;
- else
- p->start_cb_cls = p;
- GNUNET_CONTAINER_DLL_insert (tth->p_head,
- tth->p_tail,
- p);
-
- /* Create configuration and call testing lib to modify it */
- p->cfg = GNUNET_CONFIGURATION_create ();
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONFIGURATION_load (p->cfg, cfgname));
- if (GNUNET_SYSERR ==
- GNUNET_TESTING_configuration_create (tth->tl_system,
- p->cfg))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Testing library failed to create unique configuration based on
`%s'\n",
- cfgname);
- GNUNET_CONFIGURATION_destroy (p->cfg);
- GNUNET_free (p);
- return NULL;
- }
-
- p->no = peer_id;
- /* Configure peer with configuration */
- p->peer = GNUNET_TESTING_peer_configure (tth->tl_system,
- p->cfg,
- p->no,
- NULL,
- &emsg);
- if (NULL == p->peer)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Testing library failed to create unique configuration based on `%s':
`%s'\n",
- cfgname,
- emsg);
- GNUNET_TRANSPORT_TESTING_stop_peer (p);
- GNUNET_free (emsg);
- return NULL;
- }
-
- if (GNUNET_OK != GNUNET_TESTING_peer_start (p->peer))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Testing library failed to create unique configuration based on
`%s'\n",
- cfgname);
- GNUNET_TRANSPORT_TESTING_stop_peer (p);
- return NULL;
- }
-
- memset (&dummy,
- '\0',
- sizeof(dummy));
- GNUNET_TESTING_peer_get_identity (p->peer,
- &p->id);
- if (0 == memcmp (&dummy,
- &p->id,
- sizeof(struct GNUNET_PeerIdentity)))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Testing library failed to obtain peer identity for peer %u\n",
- p->no);
- GNUNET_TRANSPORT_TESTING_stop_peer (p);
- return NULL;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Peer %u configured with identity `%s'\n",
- p->no,
- GNUNET_i2s_full (&p->id));
- p->tmh = GNUNET_TRANSPORT_manipulation_connect (p->cfg);
- p->th = GNUNET_TRANSPORT_core_connect (p->cfg,
- NULL,
- handlers,
- p,
- ¬ify_connect,
- ¬ify_disconnect,
- NULL);
- if ((NULL == p->th) ||
- (NULL == p->tmh))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Failed to connect to transport service for peer `%s': `%s'\n",
- cfgname,
- emsg);
- GNUNET_TRANSPORT_TESTING_stop_peer (p);
- GNUNET_free (emsg);
- return NULL;
- }
- p->ats = GNUNET_ATS_connectivity_init (p->cfg);
- if (NULL == p->ats)
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Failed to connect to ATS service for peer `%s': `%s'\n",
- cfgname,
- emsg);
- GNUNET_TRANSPORT_TESTING_stop_peer (p);
- GNUNET_free (emsg);
- return NULL;
- }
- p->ghh = GNUNET_TRANSPORT_hello_get (p->cfg,
- GNUNET_TRANSPORT_AC_ANY,
- &get_hello,
- p);
- GNUNET_assert (NULL != p->ghh);
- return p;
-}
-
-
-/**
- * Stops and restarts the given peer, sleeping (!) for 5s in between.
- *
- * @param p the peer
- * @param restart_cb callback to call when restarted
- * @param restart_cb_cls callback closure
- * @return #GNUNET_OK in success otherwise #GNUNET_SYSERR
- */
-int
-GNUNET_TRANSPORT_TESTING_restart_peer (struct
- GNUNET_TRANSPORT_TESTING_PeerContext *p,
- GNUNET_SCHEDULER_TaskCallback
restart_cb,
- void *restart_cb_cls)
-{
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc;
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *ccn;
-
- /* shutdown */
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Stopping peer %u (`%s')\n",
- p->no,
- GNUNET_i2s (&p->id));
- if (NULL != p->ghh)
- {
- GNUNET_TRANSPORT_hello_get_cancel (p->ghh);
- p->ghh = NULL;
- }
- if (NULL != p->th)
- {
- GNUNET_TRANSPORT_core_disconnect (p->th);
- p->th = NULL;
- }
- if (NULL != p->tmh)
- {
- GNUNET_TRANSPORT_manipulation_disconnect (p->tmh);
- p->tmh = NULL;
- }
- for (cc = p->tth->cc_head; NULL != cc; cc = ccn)
- {
- ccn = cc->next;
- if ((cc->p1 == p) ||
- (cc->p2 == p))
- GNUNET_TRANSPORT_TESTING_connect_peers_cancel (cc);
- }
- if (NULL != p->ats)
- {
- GNUNET_ATS_connectivity_done (p->ats);
- p->ats = NULL;
- }
- if (GNUNET_SYSERR ==
- GNUNET_TESTING_peer_stop (p->peer))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Failed to stop peer %u (`%s')\n",
- p->no,
- GNUNET_i2s (&p->id));
- return GNUNET_SYSERR;
- }
-
- sleep (5); // YUCK!
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Restarting peer %u (`%s')\n",
- p->no,
- GNUNET_i2s (&p->id));
- /* restart */
- if (GNUNET_SYSERR == GNUNET_TESTING_peer_start (p->peer))
- {
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Failed to restart peer %u (`%s')\n",
- p->no,
- GNUNET_i2s (&p->id));
- return GNUNET_SYSERR;
- }
-
- GNUNET_assert (NULL == p->start_cb);
- p->start_cb = restart_cb;
- p->start_cb_cls = restart_cb_cls;
-
- p->th = GNUNET_TRANSPORT_core_connect (p->cfg,
- NULL,
- p->handlers,
- p,
- ¬ify_connect,
- ¬ify_disconnect,
- NULL);
- GNUNET_assert (NULL != p->th);
- p->ats = GNUNET_ATS_connectivity_init (p->cfg);
- p->ghh = GNUNET_TRANSPORT_hello_get (p->cfg,
- GNUNET_TRANSPORT_AC_ANY,
- &get_hello,
- p);
- GNUNET_assert (NULL != p->ghh);
- return GNUNET_OK;
-}
-
-
-/**
- * Shutdown the given peer
- *
- * @param p the peer
- */
-void
-GNUNET_TRANSPORT_TESTING_stop_peer (struct
- GNUNET_TRANSPORT_TESTING_PeerContext *p)
-{
- struct GNUNET_TRANSPORT_TESTING_Handle *tth = p->tth;
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc;
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *ccn;
-
- for (cc = tth->cc_head; NULL != cc; cc = ccn)
- {
- ccn = cc->next;
- if ((cc->p1 == p) ||
- (cc->p2 == p))
- GNUNET_TRANSPORT_TESTING_connect_peers_cancel (cc);
- }
- if (NULL != p->ghh)
- {
- GNUNET_TRANSPORT_hello_get_cancel (p->ghh);
- p->ghh = NULL;
- }
- if (NULL != p->tmh)
- {
- GNUNET_TRANSPORT_manipulation_disconnect (p->tmh);
- p->tmh = NULL;
- }
- if (NULL != p->th)
- {
- GNUNET_TRANSPORT_core_disconnect (p->th);
- p->th = NULL;
- }
- if (NULL != p->peer)
- {
- if (GNUNET_OK !=
- GNUNET_TESTING_peer_stop (p->peer))
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Testing lib failed to stop peer %u (`%s')\n",
- p->no,
- GNUNET_i2s (&p->id));
- }
- GNUNET_TESTING_peer_destroy (p->peer);
- p->peer = NULL;
- }
- if (NULL != p->ats)
- {
- GNUNET_ATS_connectivity_done (p->ats);
- p->ats = NULL;
- }
- if (NULL != p->hello)
- {
- GNUNET_free (p->hello);
- p->hello = NULL;
- }
- if (NULL != p->cfg)
- {
- GNUNET_CONFIGURATION_destroy (p->cfg);
- p->cfg = NULL;
- }
- if (NULL != p->handlers)
- {
- GNUNET_free (p->handlers);
- p->handlers = NULL;
- }
- GNUNET_CONTAINER_DLL_remove (tth->p_head,
- tth->p_tail,
- p);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Peer %u (`%s') stopped\n",
- p->no,
- GNUNET_i2s (&p->id));
- GNUNET_free (p);
-}
-
-
-/**
- * Function called after the HELLO was passed to the
- * transport service.
- */
-static void
-hello_offered (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc = cls;
-
- cc->oh = NULL;
- cc->tct = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
- &offer_hello,
- cc);
-}
-
-
-/**
- * Offer the current HELLO of P2 to P1.
- *
- * @param cls our `struct GNUNET_TRANSPORT_TESTING_ConnectRequest`
- */
-static void
-offer_hello (void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc = cls;
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p1 = cc->p1;
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p2 = cc->p2;
-
- cc->tct = NULL;
- {
- char *p2_s = GNUNET_strdup (GNUNET_i2s (&p2->id));
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Asking peer %u (`%s') to connect peer %u (`%s'), providing HELLO
with %u bytes\n",
- p1->no,
- GNUNET_i2s (&p1->id),
- p2->no,
- p2_s,
- GNUNET_HELLO_size (cc->p2->hello));
- GNUNET_free (p2_s);
- }
-
- if (NULL != cc->oh)
- GNUNET_TRANSPORT_offer_hello_cancel (cc->oh);
- cc->oh =
- GNUNET_TRANSPORT_offer_hello (cc->p1->cfg,
- (const struct
- GNUNET_MessageHeader *) cc->p2->hello,
- &hello_offered,
- cc);
-}
-
-
-/**
- * Initiate a connection from p1 to p2 by offering p1 p2's HELLO message
- *
- * Remarks: start_peer's notify_connect callback can be called before.
- *
- * @param tth transport testing handle
- * @param p1 peer 1
- * @param p2 peer 2
- * @param cb the callback to call when both peers notified that they are
connected
- * @param cls callback cls
- * @return a connect request handle
- */
-struct GNUNET_TRANSPORT_TESTING_ConnectRequest *
-GNUNET_TRANSPORT_TESTING_connect_peers (struct
- GNUNET_TRANSPORT_TESTING_PeerContext
*p1,
- struct
- GNUNET_TRANSPORT_TESTING_PeerContext
*p2,
- GNUNET_SCHEDULER_TaskCallback cb,
- void *cls)
-{
- struct GNUNET_TRANSPORT_TESTING_Handle *tth = p1->tth;
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc;
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *ccn;
-
- ccn = NULL;
- for (cc = tth->cc_head; NULL != cc; cc = cc->next)
- {
- if ((cc->p1 == p1) &&
- (cc->p2 == p2))
- {
- ccn = cc;
- break;
- }
- }
-
- cc = GNUNET_new (struct GNUNET_TRANSPORT_TESTING_ConnectRequest);
- cc->p1 = p1;
- cc->p2 = p2;
- cc->cb = cb;
- if (NULL != cls)
- cc->cb_cls = cls;
- else
- cc->cb_cls = cc;
- if (NULL != ccn)
- {
- cc->p1_c = ccn->p1_c;
- cc->p2_c = ccn->p2_c;
- cc->connected = ccn->connected;
- }
- GNUNET_CONTAINER_DLL_insert (tth->cc_head,
- tth->cc_tail,
- cc);
- cc->tct = GNUNET_SCHEDULER_add_now (&offer_hello,
- cc);
- cc->ats_sh = GNUNET_ATS_connectivity_suggest (cc->p1->ats,
- &p2->id,
- 1);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "New connect request %p\n",
- cc);
- return cc;
-}
-
-
-/**
- * Cancel the request to connect two peers
- * Tou MUST cancel the request if you stop the peers before the peers
connected successfully
- *
- * @param tth transport testing handle
- * @param cc a connect request handle
- */
-void
-GNUNET_TRANSPORT_TESTING_connect_peers_cancel (struct
-
GNUNET_TRANSPORT_TESTING_ConnectRequest
- *cc)
-{
- struct GNUNET_TRANSPORT_TESTING_Handle *tth = cc->p1->tth;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Canceling connect request!\n");
- if (NULL != cc->tct)
- {
- GNUNET_SCHEDULER_cancel (cc->tct);
- cc->tct = NULL;
- }
- if (NULL != cc->oh)
- {
- GNUNET_TRANSPORT_offer_hello_cancel (cc->oh);
- cc->oh = NULL;
- }
- if (NULL != cc->ats_sh)
- {
- GNUNET_ATS_connectivity_suggest_cancel (cc->ats_sh);
- cc->ats_sh = NULL;
- }
- GNUNET_CONTAINER_DLL_remove (tth->cc_head,
- tth->cc_tail,
- cc);
- GNUNET_free (cc);
-}
-
-
-/**
- * Clean up the transport testing
- *
- * @param tth transport testing handle
- */
-void
-GNUNET_TRANSPORT_TESTING_done (struct GNUNET_TRANSPORT_TESTING_Handle *tth)
-{
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc;
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *ct;
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p;
- struct GNUNET_TRANSPORT_TESTING_PeerContext *t;
-
- if (NULL == tth)
- return;
- cc = tth->cc_head;
- while (NULL != cc)
- {
- ct = cc->next;
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Developer forgot to cancel connect request!\n");
- GNUNET_TRANSPORT_TESTING_connect_peers_cancel (cc);
- cc = ct;
- }
- p = tth->p_head;
- while (NULL != p)
- {
- t = p->next;
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Developer forgot to stop peer!\n");
- GNUNET_TRANSPORT_TESTING_stop_peer (p);
- p = t;
- }
- GNUNET_TESTING_system_destroy (tth->tl_system,
- GNUNET_YES);
-
- GNUNET_free (tth);
-}
-
-
-/**
- * Initialize the transport testing
- *
- * @return transport testing handle
- */
-struct GNUNET_TRANSPORT_TESTING_Handle *
-GNUNET_TRANSPORT_TESTING_init ()
-{
- struct GNUNET_TRANSPORT_TESTING_Handle *tth;
-
- tth = GNUNET_new (struct GNUNET_TRANSPORT_TESTING_Handle);
- tth->tl_system = GNUNET_TESTING_system_create ("transport-testing",
- NULL,
- NULL,
- NULL);
- if (NULL == tth->tl_system)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to initialize testing library!\n");
- GNUNET_free (tth);
- return NULL;
- }
- return tth;
-}
-
-
-/* end of transport-testing.c */
diff --git a/src/transport/transport-testing.h
b/src/transport/transport-testing.h
deleted file mode 100644
index c548e59c1..000000000
--- a/src/transport/transport-testing.h
+++ /dev/null
@@ -1,914 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2006, 2009, 2015, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport-testing.h
- * @brief testing lib for transport service
- * @author Matthias Wachs
- * @author Christian Grothoff
- */
-#ifndef TRANSPORT_TESTING_H
-#define TRANSPORT_TESTING_H
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_transport_service.h"
-#include "gnunet_transport_hello_service.h"
-#include "gnunet_transport_manipulation_service.h"
-#include "gnunet_testing_lib.h"
-
-
-/* ************* Basic functions for starting/stopping/connecting ***********
*/
-
-/**
- * Context for a single peer
- */
-struct GNUNET_TRANSPORT_TESTING_PeerContext;
-
-/**
- * Definition for a transport testing handle
- */
-struct GNUNET_TRANSPORT_TESTING_Handle;
-
-
-/**
- * Context for a single peer
- */
-struct GNUNET_TRANSPORT_TESTING_PeerContext
-{
- /**
- * Next element in the DLL
- */
- struct GNUNET_TRANSPORT_TESTING_PeerContext *next;
-
- /**
- * Previous element in the DLL
- */
- struct GNUNET_TRANSPORT_TESTING_PeerContext *prev;
-
- /**
- * Transport testing handle this peer belongs to
- */
- struct GNUNET_TRANSPORT_TESTING_Handle *tth;
-
- /**
- * Peer's configuration
- */
- struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * Peer's transport service handle
- */
- struct GNUNET_TRANSPORT_CoreHandle *th;
-
- /**
- * Peer's transport service manipulation handle
- */
- struct GNUNET_TRANSPORT_ManipulationHandle *tmh;
-
- /**
- * Peer's ATS handle.
- */
- struct GNUNET_ATS_ConnectivityHandle *ats;
-
- /**
- * Peer's transport get hello handle to retrieve peer's HELLO message
- */
- struct GNUNET_TRANSPORT_HelloGetHandle *ghh;
-
- /**
- * Peer's testing handle
- */
- struct GNUNET_TESTING_Peer *peer;
-
- /**
- * Peer identity
- */
- struct GNUNET_PeerIdentity id;
-
- /**
- * Handle for the peer's ARM process
- */
- struct GNUNET_OS_Process *arm_proc;
-
- /**
- * Receive callback
- */
- struct GNUNET_MQ_MessageHandler *handlers;
-
- /**
- * Notify connect callback
- */
- GNUNET_TRANSPORT_NotifyConnect nc;
-
- /**
- * Notify disconnect callback
- */
- GNUNET_TRANSPORT_NotifyDisconnect nd;
-
- /**
- * Startup completed callback
- */
- GNUNET_SCHEDULER_TaskCallback start_cb;
-
- /**
- * Peers HELLO Message
- */
- struct GNUNET_HELLO_Message *hello;
-
- /**
- * Closure for the @a nc and @a nd callbacks
- */
- void *cb_cls;
-
- /**
- * Closure for @e start_cb.
- */
- void *start_cb_cls;
-
- /**
- * An unique number to identify the peer
- */
- unsigned int no;
-};
-
-
-/**
- * Handle for a request to connect two peers.
- */
-struct GNUNET_TRANSPORT_TESTING_ConnectRequest
-{
- /**
- * Kept in a DLL.
- */
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *next;
-
- /**
- * Kept in a DLL.
- */
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *prev;
-
- /**
- * Peer we want to connect.
- */
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p1;
-
- /**
- * Peer we want to connect.
- */
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p2;
-
- /**
- * Task by which we accomplish the connection.
- */
- struct GNUNET_SCHEDULER_Task *tct;
-
- /**
- * Handle by which we ask ATS to facilitate the connection.
- */
- struct GNUNET_ATS_ConnectivitySuggestHandle *ats_sh;
-
- /**
- * Handle by which we inform the peer about the HELLO of
- * the other peer.
- */
- struct GNUNET_TRANSPORT_OfferHelloHandle *oh;
-
- /**
- * Function to call upon completion.
- */
- GNUNET_SCHEDULER_TaskCallback cb;
-
- /**
- * Closure for @e cb.
- */
- void *cb_cls;
-
- /**
- * Message queue for sending from @a p1 to @a p2.
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * Set if peer1 says the connection is up to peer2.
- */
- int p1_c;
-
- /**
- * Set if peer2 says the connection is up to peer1.
- */
- int p2_c;
-
- /**
- * #GNUNET_YES if both @e p1_c and @e p2_c are #GNUNET_YES.
- */
- int connected;
-};
-
-
-/**
- * Handle for a test run.
- */
-struct GNUNET_TRANSPORT_TESTING_Handle
-{
- /**
- * Testing library system handle
- */
- struct GNUNET_TESTING_System *tl_system;
-
- /**
- * head DLL of connect contexts
- */
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc_head;
-
- /**
- * head DLL of connect contexts
- */
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc_tail;
-
- /**
- * head DLL of peers
- */
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p_head;
-
- /**
- * tail DLL of peers
- */
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p_tail;
-};
-
-
-/**
- * Initialize the transport testing
- *
- * @return transport testing handle
- */
-struct GNUNET_TRANSPORT_TESTING_Handle *
-GNUNET_TRANSPORT_TESTING_init (void);
-
-
-/**
- * Clean up the transport testing
- *
- * @param tth transport testing handle
- */
-void
-GNUNET_TRANSPORT_TESTING_done (struct GNUNET_TRANSPORT_TESTING_Handle *tth);
-
-
-/**
- * Start a peer with the given configuration
- *
- * @param tth the testing handle
- * @param cfgname configuration file
- * @param peer_id the peer_id
- * @param handlers functions for receiving messages
- * @param nc connect callback
- * @param nd disconnect callback
- * @param cb_cls closure for @a nc and @a nd callback
- * @param start_cb start callback
- * @param start_cb_cls closure for @a start_cb
- * @return the peer context
- */
-struct GNUNET_TRANSPORT_TESTING_PeerContext *
-GNUNET_TRANSPORT_TESTING_start_peer (
- struct GNUNET_TRANSPORT_TESTING_Handle *tth,
- const char *cfgname,
- int peer_id,
- const struct GNUNET_MQ_MessageHandler *handlers,
- GNUNET_TRANSPORT_NotifyConnect nc,
- GNUNET_TRANSPORT_NotifyDisconnect nd,
- void *cb_cls,
- GNUNET_SCHEDULER_TaskCallback start_cb,
- void *start_cb_cls);
-
-
-/**
- * Shutdown the given peer
- *
- * @param p the peer
- */
-void
-GNUNET_TRANSPORT_TESTING_stop_peer (
- struct GNUNET_TRANSPORT_TESTING_PeerContext *pc);
-
-
-/**
- * Stops and restarts the given peer, sleeping (!) for 5s in between.
- *
- * @param p the peer
- * @param restart_cb restart callback
- * @param restart_cb_cls callback closure
- * @return #GNUNET_OK in success otherwise #GNUNET_SYSERR
- */
-int
-GNUNET_TRANSPORT_TESTING_restart_peer (
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p,
- GNUNET_SCHEDULER_TaskCallback restart_cb,
- void *restart_cb_cls);
-
-
-/**
- * Connect the given peers and call the callback when both peers
- * report the inbound connection. Remarks: start_peer's notify_connect
- * callback can be called before.
- *
- * @param p1 peer 1
- * @param p2 peer 2
- * @param cb the callback to call when both peers notified that they are
- * connected
- * @param cls callback cls
- * @return a connect request handle
- */
-struct GNUNET_TRANSPORT_TESTING_ConnectRequest *
-GNUNET_TRANSPORT_TESTING_connect_peers (
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p1,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p2,
- GNUNET_SCHEDULER_TaskCallback cb,
- void *cls);
-
-
-/**
- * Cancel the request to connect two peers. You MUST cancel the
- * request if you stop the peers before the peers connected
- * successfully.
- *
- * @param cc a connect request handle
- */
-void
-GNUNET_TRANSPORT_TESTING_connect_peers_cancel (
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc);
-
-
-/**
- * Function called on matching connect requests.
- *
- * @param cls closure
- * @param cc request matching the query
- */
-typedef void (*GNUNET_TRANSPORT_TESTING_ConnectContextCallback) (
- void *cls,
- struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc);
-
-
-/**
- * Find any connecting context matching the given pair of peers.
- *
- * @param p1 first peer
- * @param p2 second peer
- * @param cb function to call
- * @param cb_cls closure for @a cb
- */
-void
-GNUNET_TRANSPORT_TESTING_find_connecting_context (
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p1,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p2,
- GNUNET_TRANSPORT_TESTING_ConnectContextCallback cb,
- void *cb_cls);
-
-
-/* ********************** high-level process functions *************** */
-
-
-/**
- * Function called once the peers have been launched and
- * connected by #GNUNET_TRANSPORT_TESTING_connect_check().
- *
- * @param cls closure
- * @param num_peers size of the @a p array
- * @param p the peers that were launched
- */
-typedef void (*GNUNET_TRANSPORT_TESTING_ConnectContinuation) (
- void *cls,
- unsigned int num_peers,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *p[]);
-
-
-/**
- * Internal data structure.
- */
-struct GNUNET_TRANSPORT_TESTING_ConnectRequestList;
-
-/**
- * Internal data structure.
- */
-struct GNUNET_TRANSPORT_TESTING_InternalPeerContext;
-
-
-GNUNET_NETWORK_STRUCT_BEGIN
-struct GNUNET_TRANSPORT_TESTING_TestMessage
-{
- /**
- * Type is (usually) #GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE.
- */
- struct GNUNET_MessageHeader header;
-
- /**
- * Monotonically increasing counter throughout the test.
- */
- uint32_t num GNUNET_PACKED;
-};
-GNUNET_NETWORK_STRUCT_END
-
-
-/**
- * Function called by the transport for each received message.
- *
- * @param cls closure
- * @param receiver receiver of the message
- * @param sender sender of the message
- * @param message the message
- */
-typedef void (*GNUNET_TRANSPORT_TESTING_ReceiveCallback) (
- void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *receiver,
- const struct GNUNET_PeerIdentity *sender,
- const struct GNUNET_TRANSPORT_TESTING_TestMessage *message);
-
-
-/**
- * Function called to notify transport users that another
- * peer connected to us.
- *
- * @param cls closure
- * @param me peer experiencing the event
- * @param other peer that connected to @a me
- */
-typedef void (*GNUNET_TRANSPORT_TESTING_NotifyConnect) (
- void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *me,
- const struct GNUNET_PeerIdentity *other);
-
-
-/**
- * Function called to notify transport users that another
- * peer disconnected from us.
- *
- * @param cls closure
- * @param me peer experiencing the event
- * @param other peer that disconnected from @a me
- */
-typedef void (*GNUNET_TRANSPORT_TESTING_NotifyDisconnect) (
- void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *me,
- const struct GNUNET_PeerIdentity *other);
-
-
-/**
- * Closure that must be passed to
- * #GNUNET_TRANSPORT_TESTING_connect_check.
- */
-struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext
-{
- /**
- * How should we continue after the connect?
- */
- GNUNET_SCHEDULER_TaskCallback connect_continuation;
-
- /**
- * Closure for @e connect_continuation.
- */
- void *connect_continuation_cls;
-
- /**
- * Which configuration file should we pass to the
- * #GNUNET_PROGRAM_run() of the testcase?
- */
- const char *config_file;
-
- /**
- * Receiver argument to give for peers we start.
- */
- GNUNET_TRANSPORT_TESTING_ReceiveCallback rec;
-
- /**
- * Notify connect argument to give for peers we start.
- */
- GNUNET_TRANSPORT_TESTING_NotifyConnect nc;
-
- /**
- * Notify disconnect argument to give for peers we start.
- */
- GNUNET_TRANSPORT_TESTING_NotifyDisconnect nd;
-
- /**
- * Closure for @e rec, @e nc and @e nd.
- */
- void *cls;
-
- /**
- * Custom task to run on shutdown.
- */
- GNUNET_SCHEDULER_TaskCallback shutdown_task;
-
- /**
- * Closure for @e shutdown_task.
- */
- void *shutdown_task_cls;
-
- /**
- * Custom task to run after peers were started but before we try to
- * connect them. If this function is set, we wait ONE second after
- * running this function until we continue with connecting the
- * peers.
- */
- GNUNET_SCHEDULER_TaskCallback pre_connect_task;
-
- /**
- * Closure for @e shutdown_task.
- */
- void *pre_connect_task_cls;
-
- /**
- * When should the testcase time out?
- */
- struct GNUNET_TIME_Relative timeout;
-
- /**
- * Should we try to create connections in both directions?
- */
- int bi_directional;
-
- /* ******* fields set by #GNUNET_TRANSPORT_TESTING_connect_check **** */
-
- /**
- * Number of peers involved in the test.
- */
- unsigned int num_peers;
-
- /**
- * Configuration files we have, array with @e num_peers entries.
- */
- char **cfg_files;
-
- /**
- * Array with @e num_peers entries.
- */
- struct GNUNET_TRANSPORT_TESTING_PeerContext **p;
-
- /**
- * Name of the plugin.
- */
- const char *test_plugin;
-
- /**
- * Name of the testcase.
- */
- const char *test_name;
-
- /**
- * Configuration object for the testcase.
- */
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * Main testing handle.
- */
- struct GNUNET_TRANSPORT_TESTING_Handle *tth;
-
- /**
- * Result from the main function, set to #GNUNET_OK on success.
- * Clients should set to #GNUNET_SYSERR to indicate test failure.
- */
- int global_ret;
-
- /**
- * Generator for the `num` field in test messages. Incremented each
- * time #GNUNET_TRANSPORT_TESTING_simple_send or
- * #GNUNET_TRANSPORT_TESTING_large_send are used to transmit a
- * message.
- */
- uint32_t send_num_gen;
-
- /* ******* internal state, clients should not mess with this **** */
-
- /**
- * Task run on timeout.
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * Task run to connect peers.
- */
- struct GNUNET_SCHEDULER_Task *connect_task;
-
- /**
- * Number of peers that have been started.
- */
- unsigned int started;
-
- /**
- * DLL of active connect requests.
- */
- struct GNUNET_TRANSPORT_TESTING_ConnectRequestList *crl_head;
-
- /**
- * DLL of active connect requests.
- */
- struct GNUNET_TRANSPORT_TESTING_ConnectRequestList *crl_tail;
-
- /**
- * Array with @e num_peers entries.
- */
- struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *ip;
-};
-
-
-/**
- * Find peer by peer ID.
- *
- * @param ccc context to search
- * @param peer peer to look for
- * @return NULL if @a peer was not found
- */
-struct GNUNET_TRANSPORT_TESTING_PeerContext *
-GNUNET_TRANSPORT_TESTING_find_peer (
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc,
- const struct GNUNET_PeerIdentity *peer);
-
-
-/**
- * Common implementation of the #GNUNET_TRANSPORT_TESTING_CheckCallback.
- * Starts and connects the two peers, then invokes the
- * `connect_continuation` from @a cls. Sets up a timeout to
- * abort the test, and a shutdown handler to clean up properly
- * on exit.
- *
- * @param cls closure of type `struct
- * GNUNET_TRANSPORT_TESTING_ConnectCheckContext`
- * @param tth_ initialized testing handle
- * @param test_plugin_ name of the plugin
- * @param test_name_ name of the test
- * @param num_peers number of entries in the @a cfg_file array
- * @param cfg_files array of names of configuration files for the peers
- * @return #GNUNET_SYSERR on error
- */
-int
-GNUNET_TRANSPORT_TESTING_connect_check (
- void *cls,
- struct GNUNET_TRANSPORT_TESTING_Handle *tth_,
- const char *test_plugin_,
- const char *test_name_,
- unsigned int num_peers,
- char *cfg_files[]);
-
-
-/**
- * Main function of a testcase. Called with the initial setup data
- * for the test as derived from the source name and the binary name.
- *
- * @param cls closure
- * @param tth_ initialized testing handle
- * @param test_plugin_ name of the plugin
- * @param test_name_ name of the test
- * @param num_peers number of entries in the @a cfg_file array
- * @param cfg_files array of names of configuration files for the peers
- * @return #GNUNET_SYSERR on error
- */
-typedef int (*GNUNET_TRANSPORT_TESTING_CheckCallback) (
- void *cls,
- struct GNUNET_TRANSPORT_TESTING_Handle *tth_,
- const char *test_plugin_,
- const char *test_name_,
- unsigned int num_peers,
- char *cfg_files[]);
-
-
-/**
- * Setup testcase. Calls @a check with the data the test needs.
- *
- * @param argv0 binary name (argv[0])
- * @param filename source file name (__FILE__)
- * @param num_peers number of peers to start
- * @param check main function to run
- * @param check_cls closure for @a check
- * @return #GNUNET_OK on success
- */
-int
-GNUNET_TRANSPORT_TESTING_main_ (const char *argv0,
- const char *filename,
- unsigned int num_peers,
- GNUNET_TRANSPORT_TESTING_CheckCallback check,
- void *check_cls);
-
-
-/**
- * Setup testcase. Calls @a check with the data the test needs.
- *
- * @param num_peers number of peers to start
- * @param check main function to run
- * @param check_cls closure for @a check
- * @return #GNUNET_OK on success
- */
-#define GNUNET_TRANSPORT_TESTING_main(num_peers, check, check_cls) \
- GNUNET_TRANSPORT_TESTING_main_ (argv[0], \
- __FILE__, \
- num_peers, \
- check, \
- check_cls)
-
-/* ***************** Convenience functions for sending ********* */
-
-/**
- * Send a test message of type @a mtype and size @a msize from
- * peer @a sender to peer @a receiver. The peers should be
- * connected when this function is called.
- *
- * @param sender the sending peer
- * @param receiver the receiving peer
- * @param mtype message type to use
- * @param msize size of the message, at least `sizeof (struct
- * GNUNET_TRANSPORT_TESTING_TestMessage)`
- * @param num unique message number
- * @param cont continuation to call after transmission
- * @param cont_cls closure for @a cont
- * @return #GNUNET_OK if message was queued,
- * #GNUNET_NO if peers are not connected
- * #GNUNET_SYSERR if @a msize is illegal
- */
-int
-GNUNET_TRANSPORT_TESTING_send (
- struct GNUNET_TRANSPORT_TESTING_PeerContext *sender,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *receiver,
- uint16_t mtype,
- uint16_t msize,
- uint32_t num,
- GNUNET_SCHEDULER_TaskCallback cont,
- void *cont_cls);
-
-
-/**
- * Message type used by #GNUNET_TRANSPORT_TESTING_simple_send().
- */
-#define GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE 12345
-
-/**
- * Alternative message type for tests.
- */
-#define GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE2 12346
-
-
-/**
- * Type of the closure argument to pass to
- * #GNUNET_TRANSPORT_TESTING_simple_send() and
- * #GNUNET_TRANSPORT_TESTING_large_send().
- */
-struct GNUNET_TRANSPORT_TESTING_SendClosure
-{
- /**
- * Context for the transmission.
- */
- struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc;
-
- /**
- * Function that returns the desired message size. Overrides
- * the message size, can be NULL in which case the message
- * size is the default.
- */
- size_t (*get_size_cb) (unsigned int n);
-
- /**
- * Number of messages to be transmitted in a loop.
- * Use zero for "forever" (until external shutdown).
- */
- unsigned int num_messages;
-
- /**
- * Function to call after all transmissions, can be NULL.
- */
- GNUNET_SCHEDULER_TaskCallback cont;
-
- /**
- * Closure for @e cont.
- */
- void *cont_cls;
-};
-
-
-/**
- * Task that sends a minimalistic test message from the
- * first peer to the second peer.
- *
- * @param cls the `struct GNUNET_TRANSPORT_TESTING_SendClosure`
- * which should contain at least two peers, the first two
- * of which should be currently connected
- */
-void
-GNUNET_TRANSPORT_TESTING_simple_send (void *cls);
-
-/**
- * Size of a message sent with
- * #GNUNET_TRANSPORT_TESTING_large_send(). Big enough
- * to usually force defragmentation.
- */
-#define GNUNET_TRANSPORT_TESTING_LARGE_MESSAGE_SIZE 2600
-
-/**
- * Task that sends a large test message from the
- * first peer to the second peer.
- *
- * @param cls the `struct GNUNET_TRANSPORT_TESTING_SendClosure`
- * which should contain at least two peers, the first two
- * of which should be currently connected
- */
-void
-GNUNET_TRANSPORT_TESTING_large_send (void *cls);
-
-
-/* ********************** log-only convenience functions ************* */
-
-
-/**
- * Log a connect event.
- *
- * @param cls NULL
- * @param me peer that had the event
- * @param other peer that connected.
- */
-void
-GNUNET_TRANSPORT_TESTING_log_connect (
- void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *me,
- const struct GNUNET_PeerIdentity *other);
-
-
-/**
- * Log a disconnect event.
- *
- * @param cls NULL
- * @param me peer that had the event
- * @param other peer that disconnected.
- */
-void
-GNUNET_TRANSPORT_TESTING_log_disconnect (
- void *cls,
- struct GNUNET_TRANSPORT_TESTING_PeerContext *me,
- const struct GNUNET_PeerIdentity *other);
-
-
-/* ********************** low-level filename functions *************** */
-
-
-/**
- * Extracts the test filename from an absolute file name and removes
- * the extension.
- *
- * @param file absolute file name
- * @return resulting test name
- */
-char *
-GNUNET_TRANSPORT_TESTING_get_test_name (const char *file);
-
-
-/**
- * This function takes the filename (e.g. argv[0), removes a "lt-"-prefix and
- * if existing ".exe"-prefix and adds the peer-number
- *
- * @param file filename of the test, e.g. argv[0]
- * @param count peer number
- * @return configuration name to use
- */
-char *
-GNUNET_TRANSPORT_TESTING_get_config_name (const char *file, int count);
-
-
-/**
- * Extracts the plugin anme from an absolute file name and the test name
- * @param file absolute file name
- * @param test test name
- * @return the plugin name
- */
-char *
-GNUNET_TRANSPORT_TESTING_get_test_plugin_name (const char *executable,
- const char *testname);
-
-
-/**
- * Extracts the filename from an absolute file name and removes the
- * extension
- *
- * @param file absolute file name
- * @return the source name
- */
-char *
-GNUNET_TRANSPORT_TESTING_get_test_source_name (const char *file);
-
-#endif
-/* end of transport_testing.h */
diff --git a/src/transport/transport-testing2.c
b/src/transport/transport-testing2.c
index ec27ac8ba..11bb6c7d1 100644
--- a/src/transport/transport-testing2.c
+++ b/src/transport/transport-testing2.c
@@ -225,10 +225,10 @@ notify_connect (void *cls,
GNUNET_SCHEDULER_cancel (cc->tct);
cc->tct = NULL;
}
- if (NULL != cc->ats_sh)
+ if (NULL != cc->ah_sh)
{
- GNUNET_ATS_connectivity_suggest_cancel (cc->ats_sh);
- cc->ats_sh = NULL;
+ GNUNET_TRANSPORT_application_suggest_cancel (cc->ah_sh);
+ cc->ah_sh = NULL;
}
}
}
@@ -268,6 +268,7 @@ notify_disconnect (void *cls,
int no = 0;
struct GNUNET_TRANSPORT_TESTING_PeerContext *p2 = NULL;
struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc;
+ struct GNUNET_BANDWIDTH_Value32NBO bw;
p2 = find_peer_context (p->tth,
peer);
@@ -321,10 +322,11 @@ notify_disconnect (void *cls,
if (NULL == cc->tct)
cc->tct = GNUNET_SCHEDULER_add_now (&offer_hello,
cc);
- if (NULL == cc->ats_sh)
- cc->ats_sh = GNUNET_ATS_connectivity_suggest (cc->p1->ats,
+ if (NULL == cc->ah_sh)
+ cc->ah_sh = GNUNET_TRANSPORT_application_suggest (cc->p1->ah,
&p2->id,
- 1);
+
GNUNET_MQ_PRIO_BEST_EFFORT,
+ bw);
}
}
}
@@ -512,11 +514,11 @@ GNUNET_TRANSPORT_TESTING_start_peer (struct
GNUNET_free (emsg);
return NULL;
}
- p->ats = GNUNET_ATS_connectivity_init (p->cfg);
- if (NULL == p->ats)
+ p->ah = GNUNET_TRANSPORT_application_init (p->cfg);
+ if (NULL == p->ah)
{
LOG (GNUNET_ERROR_TYPE_ERROR,
- "Failed to connect to ATS service for peer `%s': `%s'\n",
+ "Failed to connect to TNG service for peer `%s': `%s'\n",
cfgname,
emsg);
GNUNET_TRANSPORT_TESTING_stop_peer (p);
@@ -525,9 +527,6 @@ GNUNET_TRANSPORT_TESTING_start_peer (struct
}
p->ph = GNUNET_PEERSTORE_connect (p->cfg);
// FIXME Error handling
- p->ah = GNUNET_TRANSPORT_application_init (p->cfg);
- GNUNET_assert (NULL != p->ah);
- // FIXME Error handling
p->rh_task = GNUNET_SCHEDULER_add_now (retrieve_hello, p);
return p;
@@ -565,10 +564,10 @@ GNUNET_TRANSPORT_TESTING_restart_peer (struct
(cc->p2 == p))
GNUNET_TRANSPORT_TESTING_connect_peers_cancel (cc);
}
- if (NULL != p->ats)
+ if (NULL != p->ah)
{
- GNUNET_ATS_connectivity_done (p->ats);
- p->ats = NULL;
+ GNUNET_TRANSPORT_application_done (p->ah);
+ p->ah = NULL;
}
if (GNUNET_SYSERR ==
GNUNET_TESTING_peer_stop (p->peer))
@@ -607,7 +606,7 @@ GNUNET_TRANSPORT_TESTING_restart_peer (struct
¬ify_connect,
¬ify_disconnect);
GNUNET_assert (NULL != p->th);
- p->ats = GNUNET_ATS_connectivity_init (p->cfg);
+ p->ah = GNUNET_TRANSPORT_application_init (p->cfg);
p->pic = GNUNET_PEERSTORE_iterate (p->ph,
"transport",
&p->id,
@@ -654,11 +653,6 @@ GNUNET_TRANSPORT_TESTING_stop_peer (struct
GNUNET_TRANSPORT_core_disconnect (p->th);
p->th = NULL;
}
- if (NULL != p->ats)
- {
- GNUNET_ATS_connectivity_done (p->ats);
- p->ats = NULL;
- }
if (NULL != p->ah)
{
GNUNET_TRANSPORT_application_done (p->ah);
@@ -794,6 +788,7 @@ GNUNET_TRANSPORT_TESTING_connect_peers (struct
struct GNUNET_TRANSPORT_TESTING_Handle *tth = p1->tth;
struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cc;
struct GNUNET_TRANSPORT_TESTING_ConnectRequest *ccn;
+ struct GNUNET_BANDWIDTH_Value32NBO bw;
ccn = NULL;
for (cc = tth->cc_head; NULL != cc; cc = cc->next)
@@ -825,9 +820,10 @@ GNUNET_TRANSPORT_TESTING_connect_peers (struct
cc);
cc->tct = GNUNET_SCHEDULER_add_now (&offer_hello,
cc);
- cc->ats_sh = GNUNET_ATS_connectivity_suggest (cc->p1->ats,
- &p2->id,
- 1);
+ cc->ah_sh = GNUNET_TRANSPORT_application_suggest (cc->p1->ah,
+ &p2->id,
+
GNUNET_MQ_PRIO_BEST_EFFORT,
+ bw);
LOG (GNUNET_ERROR_TYPE_DEBUG,
"New connect request %p\n",
cc);
@@ -849,10 +845,10 @@ GNUNET_TRANSPORT_TESTING_connect_peers_cancel (struct
GNUNET_SCHEDULER_cancel (cc->tct);
cc->tct = NULL;
}
- if (NULL != cc->ats_sh)
+ if (NULL != cc->ah_sh)
{
- GNUNET_ATS_connectivity_suggest_cancel (cc->ats_sh);
- cc->ats_sh = NULL;
+ GNUNET_TRANSPORT_application_suggest_cancel (cc->ah_sh);
+ cc->ah_sh = NULL;
}
GNUNET_CONTAINER_DLL_remove (tth->cc_head,
tth->cc_tail,
diff --git a/src/transport/transport-testing2.h
b/src/transport/transport-testing2.h
index b9e492219..bfd9f3d33 100644
--- a/src/transport/transport-testing2.h
+++ b/src/transport/transport-testing2.h
@@ -84,11 +84,6 @@ struct GNUNET_TRANSPORT_TESTING_PeerContext
*/
struct GNUNET_TRANSPORT_CoreHandle *th;
- /**
- * Peer's ATS handle.
- */
- struct GNUNET_ATS_ConnectivityHandle *ats;
-
/**
* Peer's PEERSTORE Handle
*/
@@ -197,9 +192,9 @@ struct GNUNET_TRANSPORT_TESTING_ConnectRequest
struct GNUNET_SCHEDULER_Task *tct;
/**
- * Handle by which we ask ATS to facilitate the connection.
+ * Handle by which we ask TNG to facilitate the connection.
*/
- struct GNUNET_ATS_ConnectivitySuggestHandle *ats_sh;
+ struct GNUNET_TRANSPORT_ApplicationSuggestHandle *ah_sh;
/**
* Function to call upon completion.
@@ -447,7 +442,7 @@ struct GNUNET_TRANSPORT_TESTING_PerformanceTestMessage
* Time this message was send via transport api.
*/
struct GNUNET_TIME_AbsoluteNBO time_send;
-
+
/**
* Monotonically increasing counter throughout the test.
*/
diff --git a/src/transport/transport_api_address_to_string.c
b/src/transport/transport_api_address_to_string.c
deleted file mode 100644
index 5b234f802..000000000
--- a/src/transport/transport_api_address_to_string.c
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009-2014, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-/**
- * @file transport/transport_api_address_to_string.c
- * @author Christian Grothoff
- * @brief enable clients to convert addresses to human readable strings
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_arm_service.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_transport_service.h"
-#include "transport.h"
-
-/**
- * Context for the address lookup.
- */
-struct GNUNET_TRANSPORT_AddressToStringContext
-{
- /**
- * Function to call with the human-readable address.
- */
- GNUNET_TRANSPORT_AddressToStringCallback cb;
-
- /**
- * Closure for @e cb.
- */
- void *cb_cls;
-
- /**
- * Connection to the service.
- */
- struct GNUNET_MQ_Handle *mq;
-};
-
-
-/**
- * Function called with responses from the service.
- *
- * @param cls our `struct GNUNET_TRANSPORT_AddressToStringContext *`
- * @param atsm message with the human-readable address
- * @return #GNUNET_OK if message is well-formed
- */
-static int
-check_reply (void *cls,
- const struct AddressToStringResultMessage *atsm)
-{
- uint16_t size = ntohs (atsm->header.size) - sizeof(*atsm);
- const char *address;
- int result;
- uint32_t addr_len;
-
- result = (int) ntohl (atsm->res);
- addr_len = ntohl (atsm->addr_len);
- if (GNUNET_SYSERR == result)
- return GNUNET_OK;
- if (0 == size)
- {
- if (GNUNET_OK != result)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
- }
- address = (const char *) &atsm[1];
- if ((addr_len > size) ||
- (address[addr_len - 1] != '\0'))
- {
- /* invalid reply */
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Function called with responses from the service.
- *
- * @param cls our `struct GNUNET_TRANSPORT_AddressToStringContext *`
- * @param atsm message with the human-readable address
- */
-static void
-handle_reply (void *cls,
- const struct AddressToStringResultMessage *atsm)
-{
- struct GNUNET_TRANSPORT_AddressToStringContext *alucb = cls;
- uint16_t size = ntohs (atsm->header.size) - sizeof(*atsm);
- const char *address;
- int result;
-
- result = (int) ntohl (atsm->res);
- if (GNUNET_SYSERR == result)
- {
- /* expect more replies; as this is not the last
- call, we must pass the empty string for the address */
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Address resolution failed\n");
- alucb->cb (alucb->cb_cls,
- "",
- GNUNET_NO);
- return;
- }
- if (0 == size)
- {
- /* we are done (successfully, without communication errors) */
- alucb->cb (alucb->cb_cls,
- NULL,
- GNUNET_OK);
- GNUNET_TRANSPORT_address_to_string_cancel (alucb);
- return;
- }
- address = (const char *) &atsm[1];
- /* return normal reply to caller, also expect more replies */
- alucb->cb (alucb->cb_cls,
- address,
- GNUNET_OK);
-}
-
-
-/**
- * Generic error handler, called with the appropriate
- * error code and the same closure specified at the creation of
- * the message queue.
- * Not every message queue implementation supports an error handler.
- *
- * @param cls the `struct GNUNET_TRANSPORT_AddressToStringContext *`
- * @param error error code
- */
-static void
-mq_error_handler (void *cls,
- enum GNUNET_MQ_Error error)
-{
- struct GNUNET_TRANSPORT_AddressToStringContext *alucb = cls;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Disconnected from transport, address resolution failed\n");
- alucb->cb (alucb->cb_cls,
- NULL,
- GNUNET_SYSERR);
- GNUNET_TRANSPORT_address_to_string_cancel (alucb);
-}
-
-
-/**
- * Convert a binary address into a human readable address.
- *
- * @param cfg configuration to use
- * @param address address to convert (binary format)
- * @param numeric should (IP) addresses be displayed in numeric form
- * (otherwise do reverse DNS lookup)
- * @param timeout how long is the lookup allowed to take at most
- * @param aluc function to call with the results
- * @param aluc_cls closure for @a aluc
- * @return handle to cancel the operation, NULL on error
- */
-struct GNUNET_TRANSPORT_AddressToStringContext *
-GNUNET_TRANSPORT_address_to_string (const struct
- GNUNET_CONFIGURATION_Handle *cfg,
- const struct GNUNET_HELLO_Address *address,
- int numeric,
- struct GNUNET_TIME_Relative timeout,
- GNUNET_TRANSPORT_AddressToStringCallback
- aluc,
- void *aluc_cls)
-{
- struct GNUNET_TRANSPORT_AddressToStringContext *alc
- = GNUNET_new (struct GNUNET_TRANSPORT_AddressToStringContext);
- struct GNUNET_MQ_MessageHandler handlers[] = {
- GNUNET_MQ_hd_var_size (reply,
-
GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING_REPLY,
- struct AddressToStringResultMessage,
- alc),
- GNUNET_MQ_handler_end ()
- };
- size_t alen;
- size_t slen;
- struct AddressLookupMessage *msg;
- struct GNUNET_MQ_Envelope *env;
- char *addrbuf;
-
- alen = address->address_length;
- slen = strlen (address->transport_name) + 1;
- if ((alen + slen >= GNUNET_MAX_MESSAGE_SIZE
- - sizeof(struct AddressLookupMessage)) ||
- (alen >= GNUNET_MAX_MESSAGE_SIZE) ||
- (slen >= GNUNET_MAX_MESSAGE_SIZE))
- {
- GNUNET_break (0);
- GNUNET_free (alc);
- return NULL;
- }
- alc->cb = aluc;
- alc->cb_cls = aluc_cls;
- alc->mq = GNUNET_CLIENT_connect (cfg,
- "transport",
- handlers,
- &mq_error_handler,
- alc);
- if (NULL == alc->mq)
- {
- GNUNET_break (0);
- GNUNET_free (alc);
- return NULL;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Client tries to resolve for peer `%s' address plugin %s len
%u\n",
- GNUNET_i2s (&address->peer),
- address->transport_name,
- (unsigned int) address->address_length);
- env = GNUNET_MQ_msg_extra (msg,
- alen + slen,
- GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING);
- msg->numeric_only = htons ((int16_t) numeric);
- msg->addrlen = htons ((uint16_t) alen);
- msg->timeout = GNUNET_TIME_relative_hton (timeout);
- addrbuf = (char *) &msg[1];
- GNUNET_memcpy (addrbuf,
- address->address,
- alen);
- GNUNET_memcpy (&addrbuf[alen],
- address->transport_name,
- slen);
- GNUNET_MQ_send (alc->mq,
- env);
- return alc;
-}
-
-
-/**
- * Cancel request for address conversion.
- *
- * @param alc the context handle
- */
-void
-GNUNET_TRANSPORT_address_to_string_cancel (struct
-
GNUNET_TRANSPORT_AddressToStringContext
- *alc)
-{
- GNUNET_MQ_destroy (alc->mq);
- GNUNET_free (alc);
-}
-
-
-/* end of transport_api_address_to_string.c */
diff --git a/src/transport/transport_api_blacklist.c
b/src/transport/transport_api_blacklist.c
deleted file mode 100644
index b195a7fc7..000000000
--- a/src/transport/transport_api_blacklist.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010-2014, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/transport_api_blacklist.c
- * @brief library to access the blacklisting functions of the transport service
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_arm_service.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_transport_service.h"
-#include "transport.h"
-
-/**
- * Handle for blacklisting requests.
- */
-struct GNUNET_TRANSPORT_Blacklist
-{
- /**
- * Connection to transport service.
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * Configuration to use.
- */
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * Function to call for determining if a peer is allowed
- * to communicate with us.
- */
- GNUNET_TRANSPORT_BlacklistCallback cb;
-
- /**
- * Closure for @e cb.
- */
- void *cb_cls;
-};
-
-
-/**
- * Establish blacklist connection to transport service.
- *
- * @param br overall handle
- */
-static void
-reconnect (struct GNUNET_TRANSPORT_Blacklist *br);
-
-
-/**
- * Handle blacklist queries.
- *
- * @param cls our overall handle
- * @param bm query
- */
-static void
-handle_query (void *cls,
- const struct BlacklistMessage *bm)
-{
- struct GNUNET_TRANSPORT_Blacklist *br = cls;
- struct GNUNET_MQ_Envelope *env;
- struct BlacklistMessage *res;
-
- GNUNET_break (0 == ntohl (bm->is_allowed));
- env = GNUNET_MQ_msg (res,
- GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST_REPLY);
- res->is_allowed = htonl (br->cb (br->cb_cls,
- &bm->peer));
- res->peer = bm->peer;
- GNUNET_MQ_send (br->mq,
- env);
-}
-
-
-/**
- * Generic error handler, called with the appropriate error code and
- * the same closure specified at the creation of the message queue.
- * Not every message queue implementation supports an error handler.
- *
- * @param cls closure with the `struct GNUNET_TRANSPORT_Blacklist *`
- * @param error error code
- */
-static void
-mq_error_handler (void *cls,
- enum GNUNET_MQ_Error error)
-{
- struct GNUNET_TRANSPORT_Blacklist *br = cls;
-
- reconnect (br);
-}
-
-
-/**
- * Establish blacklist connection to transport service.
- *
- * @param br overall handle
- */
-static void
-reconnect (struct GNUNET_TRANSPORT_Blacklist *br)
-{
- struct GNUNET_MQ_MessageHandler handlers[] = {
- GNUNET_MQ_hd_fixed_size (query,
- GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST_QUERY,
- struct BlacklistMessage,
- br),
- GNUNET_MQ_handler_end ()
- };
- struct GNUNET_MQ_Envelope *env;
- struct GNUNET_MessageHeader *req;
-
- if (NULL != br->mq)
- GNUNET_MQ_destroy (br->mq);
- br->mq = GNUNET_CLIENT_connect (br->cfg,
- "transport",
- handlers,
- &mq_error_handler,
- br);
- if (NULL == br->mq)
- return;
- env = GNUNET_MQ_msg (req,
- GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST_INIT);
- GNUNET_MQ_send (br->mq,
- env);
-}
-
-
-/**
- * Install a blacklist callback. The service will be queried for all
- * existing connections as well as any fresh connections to check if
- * they are permitted. If the blacklisting callback is unregistered,
- * all hosts that were denied in the past will automatically be
- * whitelisted again. Cancelling the blacklist handle is also the
- * only way to re-enable connections from peers that were previously
- * blacklisted.
- *
- * @param cfg configuration to use
- * @param cb callback to invoke to check if connections are allowed
- * @param cb_cls closure for @a cb
- * @return NULL on error, otherwise handle for cancellation
- */
-struct GNUNET_TRANSPORT_Blacklist *
-GNUNET_TRANSPORT_blacklist (const struct GNUNET_CONFIGURATION_Handle *cfg,
- GNUNET_TRANSPORT_BlacklistCallback cb,
- void *cb_cls)
-{
- struct GNUNET_TRANSPORT_Blacklist *br;
-
- br = GNUNET_new (struct GNUNET_TRANSPORT_Blacklist);
- br->cfg = cfg;
- br->cb = cb;
- br->cb_cls = cb_cls;
- reconnect (br);
- if (NULL == br->mq)
- {
- GNUNET_free (br);
- return NULL;
- }
- return br;
-}
-
-
-/**
- * Abort the blacklist. Note that this function is the only way for
- * removing a peer from the blacklist.
- *
- * @param br handle of the request that is to be cancelled
- */
-void
-GNUNET_TRANSPORT_blacklist_cancel (struct GNUNET_TRANSPORT_Blacklist *br)
-{
- GNUNET_MQ_destroy (br->mq);
- GNUNET_free (br);
-}
-
-
-/* end of transport_api_blacklist.c */
diff --git a/src/transport/transport_api_core.c
b/src/transport/transport_api_core.c
deleted file mode 100644
index 12612de09..000000000
--- a/src/transport/transport_api_core.c
+++ /dev/null
@@ -1,968 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009-2013, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/transport_api_core.c
- * @brief library to access the transport service for message exchange
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_constants.h"
-#include "gnunet_arm_service.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_transport_service.h"
-#include "transport.h"
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "transport-api-core",
__VA_ARGS__)
-
-/**
- * If we could not send any payload to a peer for this amount of
- * time, we print a warning.
- */
-#define UNREADY_WARN_TIME GNUNET_TIME_UNIT_MINUTES
-
-/**
- * How large to start with for the hashmap of neighbours.
- */
-#define STARTING_NEIGHBOURS_SIZE 16
-
-
-/**
- * Entry in hash table of all of our current (connected) neighbours.
- */
-struct Neighbour
-{
- /**
- * Overall transport handle.
- */
- struct GNUNET_TRANSPORT_CoreHandle *h;
-
- /**
- * Active message queue for the peer.
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * Envelope with the message we are currently transmitting (or NULL).
- */
- struct GNUNET_MQ_Envelope *env;
-
- /**
- * Closure for @e mq handlers.
- */
- void *handlers_cls;
-
- /**
- * Identity of this neighbour.
- */
- struct GNUNET_PeerIdentity id;
-
- /**
- * Outbound bandwidh tracker.
- */
- struct GNUNET_BANDWIDTH_Tracker out_tracker;
-
- /**
- * Entry in our readiness heap (which is sorted by @e next_ready
- * value). NULL if there is no pending transmission request for
- * this neighbour or if we're waiting for @e is_ready to become
- * true AFTER the @e out_tracker suggested that this peer's quota
- * has been satisfied (so once @e is_ready goes to #GNUNET_YES,
- * we should immediately go back into the heap).
- */
- struct GNUNET_CONTAINER_HeapNode *hn;
-
- /**
- * Task to trigger MQ when we have enough bandwidth for the
- * next transmission.
- */
- struct GNUNET_SCHEDULER_Task *timeout_task;
-
- /**
- * Sending consumed more bytes on wire than payload was announced
- * This overhead is added to the delay of next sending operation
- */
- unsigned long long traffic_overhead;
-
- /**
- * Is this peer currently ready to receive a message?
- */
- int is_ready;
-
- /**
- * Size of the message in @e env.
- */
- uint16_t env_size;
-};
-
-
-/**
- * Handle for the transport service (includes all of the
- * state for the transport service).
- */
-struct GNUNET_TRANSPORT_CoreHandle
-{
- /**
- * Closure for the callbacks.
- */
- void *cls;
-
- /**
- * Functions to call for received data (template for
- * new message queues).
- */
- struct GNUNET_MQ_MessageHandler *handlers;
-
- /**
- * function to call on connect events
- */
- GNUNET_TRANSPORT_NotifyConnect nc_cb;
-
- /**
- * function to call on disconnect events
- */
- GNUNET_TRANSPORT_NotifyDisconnect nd_cb;
-
- /**
- * function to call on excess bandwidth events
- */
- GNUNET_TRANSPORT_NotifyExcessBandwidth neb_cb;
-
- /**
- * My client connection to the transport service.
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * My configuration.
- */
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * Hash map of the current connected neighbours of this peer.
- * Maps peer identities to `struct Neighbour` entries.
- */
- struct GNUNET_CONTAINER_MultiPeerMap *neighbours;
-
- /**
- * Peer identity as assumed by this process, or all zeros.
- */
- struct GNUNET_PeerIdentity self;
-
- /**
- * ID of the task trying to reconnect to the service.
- */
- struct GNUNET_SCHEDULER_Task *reconnect_task;
-
- /**
- * Delay until we try to reconnect.
- */
- struct GNUNET_TIME_Relative reconnect_delay;
-
- /**
- * Internal counter to check how many more receive OK messages this
- * CORE service is allowed to send in total. Just to detect easy
- * cases of protocol violations by the CORE implementation.
- * NOTE: we may want to make this stronger by counting per peer
- * instead of globally.
- */
- unsigned int rom_pending;
-
- /**
- * Should we check that @e self matches what the service thinks?
- * (if #GNUNET_NO, then @e self is all zeros!).
- */
- int check_self;
-};
-
-
-/**
- * Function that will schedule the job that will try
- * to connect us again to the client.
- *
- * @param h transport service to reconnect
- */
-static void
-disconnect_and_schedule_reconnect (struct GNUNET_TRANSPORT_CoreHandle *h);
-
-
-/**
- * Get the neighbour list entry for the given peer
- *
- * @param h our context
- * @param peer peer to look up
- * @return NULL if no such peer entry exists
- */
-static struct Neighbour *
-neighbour_find (struct GNUNET_TRANSPORT_CoreHandle *h,
- const struct GNUNET_PeerIdentity *peer)
-{
- return GNUNET_CONTAINER_multipeermap_get (h->neighbours, peer);
-}
-
-
-/**
- * Function called by the bandwidth tracker if we have excess
- * bandwidth.
- *
- * @param cls the `struct Neighbour` that has excess bandwidth
- */
-static void
-notify_excess_cb (void *cls)
-{
- struct Neighbour *n = cls;
- struct GNUNET_TRANSPORT_CoreHandle *h = n->h;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Notifying CORE that more bandwidth is available for %s\n",
- GNUNET_i2s (&n->id));
-
- if (NULL != h->neb_cb)
- h->neb_cb (h->cls, &n->id, n->handlers_cls);
-}
-
-
-/**
- * Iterator over hash map entries, for deleting state of a neighbour.
- *
- * @param cls the `struct GNUNET_TRANSPORT_CoreHandle *`
- * @param key peer identity
- * @param value value in the hash map, the neighbour entry to delete
- * @return #GNUNET_YES if we should continue to
- * iterate,
- * #GNUNET_NO if not.
- */
-static int
-neighbour_delete (void *cls, const struct GNUNET_PeerIdentity *key, void
*value)
-{
- struct GNUNET_TRANSPORT_CoreHandle *handle = cls;
- struct Neighbour *n = value;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Dropping entry for neighbour `%s'.\n",
- GNUNET_i2s (key));
- GNUNET_BANDWIDTH_tracker_notification_stop (&n->out_tracker);
- if (NULL != handle->nd_cb)
- handle->nd_cb (handle->cls, &n->id, n->handlers_cls);
- if (NULL != n->timeout_task)
- {
- GNUNET_SCHEDULER_cancel (n->timeout_task);
- n->timeout_task = NULL;
- }
- if (NULL != n->env)
- {
- GNUNET_MQ_send_cancel (n->env);
- n->env = NULL;
- }
- GNUNET_MQ_destroy (n->mq);
- GNUNET_assert (NULL == n->mq);
- GNUNET_assert (
- GNUNET_YES ==
- GNUNET_CONTAINER_multipeermap_remove (handle->neighbours, key, n));
- GNUNET_free (n);
- return GNUNET_YES;
-}
-
-
-/**
- * Generic error handler, called with the appropriate
- * error code and the same closure specified at the creation of
- * the message queue.
- * Not every message queue implementation supports an error handler.
- *
- * @param cls closure with the `struct GNUNET_TRANSPORT_CoreHandle *`
- * @param error error code
- */
-static void
-mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
-{
- struct GNUNET_TRANSPORT_CoreHandle *h = cls;
-
- LOG (GNUNET_ERROR_TYPE_ERROR,
- "Error receiving from transport service (%d), disconnecting
temporarily.\n",
- error);
- disconnect_and_schedule_reconnect (h);
-}
-
-
-/**
- * Function we use for checking incoming HELLO messages.
- *
- * @param cls closure, a `struct GNUNET_TRANSPORT_CoreHandle *`
- * @param msg message received
- * @return #GNUNET_OK if message is well-formed
- */
-static int
-check_hello (void *cls, const struct GNUNET_MessageHeader *msg)
-{
- struct GNUNET_PeerIdentity me;
-
- if (GNUNET_OK !=
- GNUNET_HELLO_get_id ((const struct GNUNET_HELLO_Message *) msg, &me))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Function we use for handling incoming HELLO messages.
- *
- * @param cls closure, a `struct GNUNET_TRANSPORT_CoreHandle *`
- * @param msg message received
- */
-static void
-handle_hello (void *cls, const struct GNUNET_MessageHeader *msg)
-{
- /* we do not care => FIXME: signal in options to NEVER send HELLOs! */
-}
-
-
-/**
- * A message from the handler's message queue to a neighbour was
- * transmitted. Now trigger (possibly delayed) notification of the
- * neighbour's message queue that we are done and thus ready for
- * the next message.
- *
- * @param cls the `struct Neighbour` where the message was sent
- */
-static void
-notify_send_done_fin (void *cls)
-{
- struct Neighbour *n = cls;
-
- n->timeout_task = NULL;
- n->is_ready = GNUNET_YES;
- GNUNET_MQ_impl_send_continue (n->mq);
-}
-
-
-/**
- * A message from the handler's message queue to a neighbour was
- * transmitted. Now trigger (possibly delayed) notification of the
- * neighbour's message queue that we are done and thus ready for
- * the next message.
- *
- * @param cls the `struct Neighbour` where the message was sent
- */
-static void
-notify_send_done (void *cls)
-{
- struct Neighbour *n = cls;
- struct GNUNET_TIME_Relative delay;
-
- n->timeout_task = NULL;
- if (NULL != n->env)
- {
- GNUNET_BANDWIDTH_tracker_consume (&n->out_tracker,
- n->env_size + n->traffic_overhead);
- n->env = NULL;
- n->traffic_overhead = 0;
- }
- delay = GNUNET_BANDWIDTH_tracker_get_delay (&n->out_tracker, 128);
- if (0 == delay.rel_value_us)
- {
- n->is_ready = GNUNET_YES;
- GNUNET_MQ_impl_send_continue (n->mq);
- return;
- }
- GNUNET_MQ_impl_send_in_flight (n->mq);
- /* cannot send even a small message without violating
- quota, wait a before allowing MQ to send next message */
- n->timeout_task =
- GNUNET_SCHEDULER_add_delayed (delay, ¬ify_send_done_fin, n);
-}
-
-
-/**
- * Implement sending functionality of a message queue.
- * Called one message at a time. Should send the @a msg
- * to the transport service and then notify the queue
- * once we are ready for the next one.
- *
- * @param mq the message queue
- * @param msg the message to send
- * @param impl_state state of the implementation
- */
-static void
-mq_send_impl (struct GNUNET_MQ_Handle *mq,
- const struct GNUNET_MessageHeader *msg,
- void *impl_state)
-{
- struct Neighbour *n = impl_state;
- struct GNUNET_TRANSPORT_CoreHandle *h = n->h;
- struct OutboundMessage *obm;
- uint16_t msize;
-
- GNUNET_assert (GNUNET_YES == n->is_ready);
- msize = ntohs (msg->size);
- if (msize >= GNUNET_MAX_MESSAGE_SIZE - sizeof(*obm))
- {
- GNUNET_break (0);
- GNUNET_MQ_impl_send_continue (mq);
- return;
- }
- GNUNET_assert (NULL == n->env);
- n->env =
- GNUNET_MQ_msg_nested_mh (obm, GNUNET_MESSAGE_TYPE_TRANSPORT_SEND, msg);
- {
- struct GNUNET_MQ_Envelope *env;
-
- env = GNUNET_MQ_get_current_envelope (mq);
- obm->priority = htonl ((uint32_t) GNUNET_MQ_env_get_options (env));
- }
- obm->timeout = GNUNET_TIME_relative_hton (
- GNUNET_TIME_UNIT_MINUTES); /* FIXME: to be removed */
- obm->peer = n->id;
- GNUNET_assert (NULL == n->timeout_task);
- n->is_ready = GNUNET_NO;
- n->env_size = ntohs (msg->size);
- GNUNET_MQ_notify_sent (n->env, ¬ify_send_done, n);
- GNUNET_MQ_send (h->mq, n->env);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Queued message of type %u for neighbour `%s'.\n",
- ntohs (msg->type),
- GNUNET_i2s (&n->id));
-}
-
-
-/**
- * Handle destruction of a message queue. Implementations must not
- * free @a mq, but should take care of @a impl_state.
- *
- * @param mq the message queue to destroy
- * @param impl_state state of the implementation
- */
-static void
-mq_destroy_impl (struct GNUNET_MQ_Handle *mq, void *impl_state)
-{
- struct Neighbour *n = impl_state;
-
- GNUNET_assert (mq == n->mq);
- n->mq = NULL;
-}
-
-
-/**
- * Implementation function that cancels the currently sent message.
- * Should basically undo whatever #mq_send_impl() did.
- *
- * @param mq message queue
- * @param impl_state state specific to the implementation
- */
-static void
-mq_cancel_impl (struct GNUNET_MQ_Handle *mq, void *impl_state)
-{
- struct Neighbour *n = impl_state;
-
- GNUNET_assert (GNUNET_NO == n->is_ready);
- if (NULL != n->env)
- {
- GNUNET_MQ_send_cancel (n->env);
- n->env = NULL;
- }
-
- n->is_ready = GNUNET_YES;
-}
-
-
-/**
- * We had an error processing a message we forwarded from a peer to
- * the CORE service. We should just complain about it but otherwise
- * continue processing.
- *
- * @param cls closure
- * @param error error code
- */
-static void
-peer_mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
-{
- /* struct Neighbour *n = cls; */
-
- GNUNET_break_op (0);
-}
-
-
-/**
- * The outbound quota has changed in a way that may require
- * us to reset the timeout. Update the timeout.
- *
- * @param cls the `struct Neighbour` for which the timeout changed
- */
-static void
-outbound_bw_tracker_update (void *cls)
-{
- struct Neighbour *n = cls;
- struct GNUNET_TIME_Relative delay;
-
- if (NULL == n->timeout_task)
- return;
- delay = GNUNET_BANDWIDTH_tracker_get_delay (&n->out_tracker, 128);
- GNUNET_SCHEDULER_cancel (n->timeout_task);
- n->timeout_task = GNUNET_SCHEDULER_add_delayed (delay, ¬ify_send_done, n);
-}
-
-
-/**
- * Function we use for handling incoming connect messages.
- *
- * @param cls closure, a `struct GNUNET_TRANSPORT_Handle *`
- * @param cim message received
- */
-static void
-handle_connect (void *cls, const struct ConnectInfoMessage *cim)
-{
- struct GNUNET_TRANSPORT_CoreHandle *h = cls;
- struct Neighbour *n;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Receiving CONNECT message for `%s' with quota %u\n",
- GNUNET_i2s (&cim->id),
- ntohl (cim->quota_out.value__));
- n = neighbour_find (h, &cim->id);
- if (NULL != n)
- {
- GNUNET_break (0); /* FIXME: this assertion seems to fail sometimes!? */
- disconnect_and_schedule_reconnect (h);
- return;
- }
- n = GNUNET_new (struct Neighbour);
- n->id = cim->id;
- n->h = h;
- n->is_ready = GNUNET_YES;
- n->traffic_overhead = 0;
- GNUNET_BANDWIDTH_tracker_init2 (&n->out_tracker,
- &outbound_bw_tracker_update,
- n,
- GNUNET_CONSTANTS_DEFAULT_BW_IN_OUT,
- MAX_BANDWIDTH_CARRY_S,
- ¬ify_excess_cb,
- n);
- GNUNET_assert (GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_put (
- h->neighbours,
- &n->id,
- n,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
-
- GNUNET_BANDWIDTH_tracker_update_quota (&n->out_tracker, cim->quota_out);
- n->mq = GNUNET_MQ_queue_for_callbacks (&mq_send_impl,
- &mq_destroy_impl,
- &mq_cancel_impl,
- n,
- h->handlers,
- &peer_mq_error_handler,
- n);
- if (NULL != h->nc_cb)
- {
- n->handlers_cls = h->nc_cb (h->cls, &n->id, n->mq);
- GNUNET_MQ_set_handlers_closure (n->mq, n->handlers_cls);
- }
-}
-
-
-/**
- * Function we use for handling incoming disconnect messages.
- *
- * @param cls closure, a `struct GNUNET_TRANSPORT_CoreHandle *`
- * @param dim message received
- */
-static void
-handle_disconnect (void *cls, const struct DisconnectInfoMessage *dim)
-{
- struct GNUNET_TRANSPORT_CoreHandle *h = cls;
- struct Neighbour *n;
-
- GNUNET_break (ntohl (dim->reserved) == 0);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Receiving DISCONNECT message for `%s'.\n",
- GNUNET_i2s (&dim->peer));
- n = neighbour_find (h, &dim->peer);
- if (NULL == n)
- {
- GNUNET_break (0);
- disconnect_and_schedule_reconnect (h);
- return;
- }
- GNUNET_assert (GNUNET_YES == neighbour_delete (h, &dim->peer, n));
-}
-
-
-/**
- * Function we use for handling incoming send-ok messages.
- *
- * @param cls closure, a `struct GNUNET_TRANSPORT_CoreHandle *`
- * @param okm message received
- */
-static void
-handle_send_ok (void *cls, const struct SendOkMessage *okm)
-{
- struct GNUNET_TRANSPORT_CoreHandle *h = cls;
- struct Neighbour *n;
- uint32_t bytes_msg;
- uint32_t bytes_physical;
- uint16_t success = ntohs (okm->success);
-
- bytes_msg = ntohs (okm->bytes_msg);
- bytes_physical = ntohl (okm->bytes_physical);
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Receiving SEND_OK message, transmission to %s %s.\n",
- GNUNET_i2s (&okm->peer),
- success == GNUNET_OK ? "succeeded" : "failed");
- n = neighbour_find (h, &okm->peer);
- if (NULL == n)
- {
- /* We should never get a 'SEND_OK' for a peer that we are not
- connected to */
- GNUNET_break (0);
- disconnect_and_schedule_reconnect (h);
- return;
- }
- if (bytes_physical > bytes_msg)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Overhead for %u byte message was %u\n",
- bytes_msg,
- bytes_physical - bytes_msg);
- n->traffic_overhead += bytes_physical - bytes_msg;
- }
-}
-
-
-/**
- * Function we use for checking incoming "inbound" messages.
- *
- * @param cls closure, a `struct GNUNET_TRANSPORT_CoreHandle *`
- * @param im message received
- */
-static int
-check_recv (void *cls, const struct InboundMessage *im)
-{
- const struct GNUNET_MessageHeader *imm;
- uint16_t size;
-
- size = ntohs (im->header.size) - sizeof(*im);
- if (size < sizeof(struct GNUNET_MessageHeader))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- imm = (const struct GNUNET_MessageHeader *) &im[1];
- if (ntohs (imm->size) != size)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Function we use for handling incoming messages.
- *
- * @param cls closure, a `struct GNUNET_TRANSPORT_CoreHandle *`
- * @param im message received
- */
-static void
-handle_recv (void *cls, const struct InboundMessage *im)
-{
- struct GNUNET_TRANSPORT_CoreHandle *h = cls;
- const struct GNUNET_MessageHeader *imm =
- (const struct GNUNET_MessageHeader *) &im[1];
- struct Neighbour *n;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Received message of type %u with %u bytes from `%s'.\n",
- (unsigned int) ntohs (imm->type),
- (unsigned int) ntohs (imm->size),
- GNUNET_i2s (&im->peer));
- n = neighbour_find (h, &im->peer);
- if (NULL == n)
- {
- GNUNET_break (0);
- disconnect_and_schedule_reconnect (h);
- return;
- }
- h->rom_pending++;
- GNUNET_MQ_inject_message (n->mq, imm);
-}
-
-
-/**
- * Function we use for handling incoming set quota messages.
- *
- * @param cls closure, a `struct GNUNET_TRANSPORT_CoreHandle *`
- * @param qm message received
- */
-static void
-handle_set_quota (void *cls, const struct QuotaSetMessage *qm)
-{
- struct GNUNET_TRANSPORT_CoreHandle *h = cls;
- struct Neighbour *n;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Receiving SET_QUOTA message for `%s' with quota %u\n",
- GNUNET_i2s (&qm->peer),
- ntohl (qm->quota.value__));
- n = neighbour_find (h, &qm->peer);
- if (NULL == n)
- {
- GNUNET_break (
- 0); /* FIXME: julius reports this assertion fails sometimes? */
- disconnect_and_schedule_reconnect (h);
- return;
- }
- GNUNET_BANDWIDTH_tracker_update_quota (&n->out_tracker, qm->quota);
-}
-
-
-/**
- * Try again to connect to transport service.
- *
- * @param cls the handle to the transport service
- */
-static void
-reconnect (void *cls)
-{
- struct GNUNET_TRANSPORT_CoreHandle *h = cls;
- struct GNUNET_MQ_MessageHandler handlers[] =
- { GNUNET_MQ_hd_var_size (hello,
- GNUNET_MESSAGE_TYPE_HELLO,
- struct GNUNET_MessageHeader,
- h),
- GNUNET_MQ_hd_fixed_size (connect,
- GNUNET_MESSAGE_TYPE_TRANSPORT_CONNECT,
- struct ConnectInfoMessage,
- h),
- GNUNET_MQ_hd_fixed_size (disconnect,
- GNUNET_MESSAGE_TYPE_TRANSPORT_DISCONNECT,
- struct DisconnectInfoMessage,
- h),
- GNUNET_MQ_hd_fixed_size (send_ok,
- GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK,
- struct SendOkMessage,
- h),
- GNUNET_MQ_hd_var_size (recv,
- GNUNET_MESSAGE_TYPE_TRANSPORT_RECV,
- struct InboundMessage,
- h),
- GNUNET_MQ_hd_fixed_size (set_quota,
- GNUNET_MESSAGE_TYPE_TRANSPORT_SET_QUOTA,
- struct QuotaSetMessage,
- h),
- GNUNET_MQ_handler_end () };
- struct GNUNET_MQ_Envelope *env;
- struct StartMessage *s;
- uint32_t options;
-
- h->reconnect_task = NULL;
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Connecting to transport service.\n");
- GNUNET_assert (NULL == h->mq);
- h->mq =
- GNUNET_CLIENT_connect (h->cfg, "transport", handlers, &mq_error_handler,
h);
- if (NULL == h->mq)
- return;
- env = GNUNET_MQ_msg (s, GNUNET_MESSAGE_TYPE_TRANSPORT_START);
- options = 0;
- if (h->check_self)
- options |= 1;
- if (NULL != h->handlers)
- options |= 2;
- s->options = htonl (options);
- s->self = h->self;
- GNUNET_MQ_send (h->mq, env);
-}
-
-
-/**
- * Function that will schedule the job that will try
- * to connect us again to the client.
- *
- * @param h transport service to reconnect
- */
-static void
-disconnect_and_schedule_reconnect (struct GNUNET_TRANSPORT_CoreHandle *h)
-{
- GNUNET_assert (NULL == h->reconnect_task);
- /* Forget about all neighbours that we used to be connected to */
- GNUNET_CONTAINER_multipeermap_iterate (h->neighbours, &neighbour_delete, h);
- if (NULL != h->mq)
- {
- GNUNET_MQ_destroy (h->mq);
- h->mq = NULL;
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Scheduling task to reconnect to transport service in %s.\n",
- GNUNET_STRINGS_relative_time_to_string (h->reconnect_delay,
GNUNET_YES));
- h->reconnect_task =
- GNUNET_SCHEDULER_add_delayed (h->reconnect_delay, &reconnect, h);
- h->reconnect_delay = GNUNET_TIME_STD_BACKOFF (h->reconnect_delay);
-}
-
-
-/**
- * Checks if a given peer is connected to us and get the message queue.
- *
- * @param handle connection to transport service
- * @param peer the peer to check
- * @return NULL if disconnected, otherwise message queue for @a peer
- */
-struct GNUNET_MQ_Handle *
-GNUNET_TRANSPORT_core_get_mq (struct GNUNET_TRANSPORT_CoreHandle *handle,
- const struct GNUNET_PeerIdentity *peer)
-{
- struct Neighbour *n;
-
- n = neighbour_find (handle, peer);
- if (NULL == n)
- return NULL;
- return n->mq;
-}
-
-
-/**
- * Connect to the transport service. Note that the connection may
- * complete (or fail) asynchronously.
- *
- * @param cfg configuration to use
- * @param self our own identity (API should check that it matches
- * the identity found by transport), or NULL (no check)
- * @param cls closure for the callbacks
- * @param rec receive function to call
- * @param nc function to call on connect events
- * @param nd function to call on disconnect events
- * @param neb function to call if we have excess bandwidth to a peer
- * @return NULL on error
- */
-struct GNUNET_TRANSPORT_CoreHandle *
-GNUNET_TRANSPORT_core_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
- const struct GNUNET_PeerIdentity *self,
- const struct GNUNET_MQ_MessageHandler *handlers,
- void *cls,
- GNUNET_TRANSPORT_NotifyConnect nc,
- GNUNET_TRANSPORT_NotifyDisconnect nd,
- GNUNET_TRANSPORT_NotifyExcessBandwidth neb)
-{
- struct GNUNET_TRANSPORT_CoreHandle *h;
- unsigned int i;
-
- h = GNUNET_new (struct GNUNET_TRANSPORT_CoreHandle);
- if (NULL != self)
- {
- h->self = *self;
- h->check_self = GNUNET_YES;
- }
- h->cfg = cfg;
- h->cls = cls;
- h->nc_cb = nc;
- h->nd_cb = nd;
- h->neb_cb = neb;
- h->reconnect_delay = GNUNET_TIME_UNIT_ZERO;
- if (NULL != handlers)
- {
- for (i = 0; NULL != handlers[i].cb; i++)
- ;
- h->handlers = GNUNET_new_array (i + 1, struct GNUNET_MQ_MessageHandler);
- GNUNET_memcpy (h->handlers,
- handlers,
- i * sizeof(struct GNUNET_MQ_MessageHandler));
- }
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Connecting to transport service\n");
- reconnect (h);
- if (NULL == h->mq)
- {
- GNUNET_free (h->handlers);
- GNUNET_free (h);
- return NULL;
- }
- h->neighbours =
- GNUNET_CONTAINER_multipeermap_create (STARTING_NEIGHBOURS_SIZE,
GNUNET_YES);
- return h;
-}
-
-
-/**
- * Disconnect from the transport service.
- *
- * @param handle handle to the service as returned from
- * #GNUNET_TRANSPORT_core_connect()
- */
-void
-GNUNET_TRANSPORT_core_disconnect (struct GNUNET_TRANSPORT_CoreHandle *handle)
-{
- LOG (GNUNET_ERROR_TYPE_DEBUG, "Transport disconnect called!\n");
- /* this disconnects all neighbours... */
- if (NULL == handle->reconnect_task)
- disconnect_and_schedule_reconnect (handle);
- /* and now we stop trying to connect again... */
- if (NULL != handle->reconnect_task)
- {
- GNUNET_SCHEDULER_cancel (handle->reconnect_task);
- handle->reconnect_task = NULL;
- }
- GNUNET_CONTAINER_multipeermap_destroy (handle->neighbours);
- handle->neighbours = NULL;
- GNUNET_free (handle->handlers);
- handle->handlers = NULL;
- GNUNET_free (handle);
-}
-
-
-/**
- * Notification from the CORE service to the TRANSPORT service
- * that the CORE service has finished processing a message from
- * TRANSPORT (via the @code{handlers} of #GNUNET_TRANSPORT_core_connect())
- * and that it is thus now OK for TRANSPORT to send more messages
- * for @a pid.
- *
- * Used to provide flow control, this is our equivalent to
- * #GNUNET_SERVICE_client_continue() of an ordinary service.
- *
- * Note that due to the use of a window, TRANSPORT may send multiple
- * messages destined for the same peer even without an intermediate
- * call to this function. However, CORE must still call this function
- * once per message received, as otherwise eventually the window will
- * be full and TRANSPORT will stop providing messages to CORE for @a
- * pid.
- *
- * @param ch core handle
- * @param pid which peer was the message from that was fully processed by CORE
- */
-void
-GNUNET_TRANSPORT_core_receive_continue (struct GNUNET_TRANSPORT_CoreHandle *ch,
- const struct GNUNET_PeerIdentity *pid)
-{
- struct RecvOkMessage *rom;
- struct GNUNET_MQ_Envelope *env;
-
- GNUNET_assert (ch->rom_pending > 0);
- ch->rom_pending--;
- env = GNUNET_MQ_msg (rom, GNUNET_MESSAGE_TYPE_TRANSPORT_RECV_OK);
- rom->increase_window_delta = htonl (1);
- rom->peer = *pid;
- GNUNET_MQ_send (ch->mq, env);
-}
-
-
-/* end of transport_api_core.c */
diff --git a/src/transport/transport_api_hello_get.c
b/src/transport/transport_api_hello_get.c
deleted file mode 100644
index f8bcc5f07..000000000
--- a/src/transport/transport_api_hello_get.c
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009-2013, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/transport_api_hello_get.c
- * @brief library to obtain our HELLO from our transport service
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_constants.h"
-#include "gnunet_arm_service.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_transport_hello_service.h"
-#include "transport.h"
-
-
-/**
- * Functions to call with this peer's HELLO.
- */
-struct GNUNET_TRANSPORT_HelloGetHandle
-{
- /**
- * Our configuration.
- */
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * Transport handle.
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * Callback to call once we got our HELLO.
- */
- GNUNET_TRANSPORT_HelloUpdateCallback rec;
-
- /**
- * Closure for @e rec.
- */
- void *rec_cls;
-
- /**
- * Task for calling the HelloUpdateCallback when we already have a HELLO
- */
- struct GNUNET_SCHEDULER_Task *notify_task;
-
- /**
- * ID of the task trying to reconnect to the service.
- */
- struct GNUNET_SCHEDULER_Task *reconnect_task;
-
- /**
- * Delay until we try to reconnect.
- */
- struct GNUNET_TIME_Relative reconnect_delay;
-
- /**
- * Type of HELLOs client cares about.
- */
- enum GNUNET_TRANSPORT_AddressClass ac;
-};
-
-
-/**
- * Function we use for checking incoming HELLO messages.
- *
- * @param cls closure, a `struct GNUNET_TRANSPORT_Handle *`
- * @param msg message received
- * @return #GNUNET_OK if message is well-formed
- */
-static int
-check_hello (void *cls,
- const struct GNUNET_MessageHeader *msg)
-{
- struct GNUNET_PeerIdentity me;
-
- if (GNUNET_OK !=
- GNUNET_HELLO_get_id ((const struct GNUNET_HELLO_Message *) msg,
- &me))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Receiving (my own) HELLO message (%u bytes), I am `%s'.\n",
- (unsigned int) ntohs (msg->size),
- GNUNET_i2s (&me));
- return GNUNET_OK;
-}
-
-
-/**
- * Function we use for handling incoming HELLO messages.
- *
- * @param cls closure, a `struct GNUNET_TRANSPORT_HelloGetHandle *`
- * @param msg message received
- */
-static void
-handle_hello (void *cls,
- const struct GNUNET_MessageHeader *msg)
-{
- struct GNUNET_TRANSPORT_HelloGetHandle *ghh = cls;
-
- ghh->rec (ghh->rec_cls,
- msg);
-}
-
-
-/**
- * Function that will schedule the job that will try
- * to connect us again to the client.
- *
- * @param ghh transport service to reconnect
- */
-static void
-schedule_reconnect (struct GNUNET_TRANSPORT_HelloGetHandle *ghh);
-
-
-/**
- * Generic error handler, called with the appropriate
- * error code and the same closure specified at the creation of
- * the message queue.
- * Not every message queue implementation supports an error handler.
- *
- * @param cls closure with the `struct GNUNET_TRANSPORT_Handle *`
- * @param error error code
- */
-static void
-mq_error_handler (void *cls,
- enum GNUNET_MQ_Error error)
-{
- struct GNUNET_TRANSPORT_HelloGetHandle *ghh = cls;
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Error receiving from transport service, disconnecting
temporarily.\n");
- GNUNET_MQ_destroy (ghh->mq);
- ghh->mq = NULL;
- schedule_reconnect (ghh);
-}
-
-
-/**
- * Try again to connect to transport service.
- *
- * @param cls the handle to the transport service
- */
-static void
-reconnect (void *cls)
-{
- struct GNUNET_TRANSPORT_HelloGetHandle *ghh = cls;
- struct GNUNET_MQ_MessageHandler handlers[] = {
- GNUNET_MQ_hd_var_size (hello,
- GNUNET_MESSAGE_TYPE_HELLO,
- struct GNUNET_MessageHeader,
- ghh),
- GNUNET_MQ_handler_end ()
- };
- struct GNUNET_MQ_Envelope *env;
- struct StartMessage *s;
-
- ghh->reconnect_task = NULL;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Connecting to transport service.\n");
- GNUNET_assert (NULL == ghh->mq);
- ghh->mq = GNUNET_CLIENT_connect (ghh->cfg,
- "transport",
- handlers,
- &mq_error_handler,
- ghh);
- if (NULL == ghh->mq)
- return;
- env = GNUNET_MQ_msg (s,
- GNUNET_MESSAGE_TYPE_TRANSPORT_START);
- s->options = htonl (0);
- GNUNET_MQ_send (ghh->mq,
- env);
-}
-
-
-/**
- * Function that will schedule the job that will try
- * to connect us again to the client.
- *
- * @param ghh transport service to reconnect
- */
-static void
-schedule_reconnect (struct GNUNET_TRANSPORT_HelloGetHandle *ghh)
-{
- ghh->reconnect_task =
- GNUNET_SCHEDULER_add_delayed (ghh->reconnect_delay,
- &reconnect,
- ghh);
- ghh->reconnect_delay = GNUNET_TIME_STD_BACKOFF (ghh->reconnect_delay);
-}
-
-
-/**
- * Obtain the HELLO message for this peer. The callback given in this function
- * is never called synchronously.
- *
- * @param cfg configuration
- * @param ac which network type should the addresses from the HELLO belong to?
- * @param rec function to call with the HELLO, sender will be our peer
- * identity; message and sender will be NULL on timeout
- * (handshake with transport service pending/failed).
- * cost estimate will be 0.
- * @param rec_cls closure for @a rec
- * @return handle to cancel the operation
- */
-struct GNUNET_TRANSPORT_HelloGetHandle *
-GNUNET_TRANSPORT_hello_get (const struct GNUNET_CONFIGURATION_Handle *cfg,
- enum GNUNET_TRANSPORT_AddressClass ac,
- GNUNET_TRANSPORT_HelloUpdateCallback rec,
- void *rec_cls)
-{
- struct GNUNET_TRANSPORT_HelloGetHandle *ghh;
-
- ghh = GNUNET_new (struct GNUNET_TRANSPORT_HelloGetHandle);
- ghh->rec = rec;
- ghh->rec_cls = rec_cls;
- ghh->cfg = cfg;
- ghh->ac = ac;
- reconnect (ghh);
- if (NULL == ghh->mq)
- {
- GNUNET_free (ghh);
- return NULL;
- }
- return ghh;
-}
-
-
-/**
- * Stop receiving updates about changes to our HELLO message.
- *
- * @param ghh handle to cancel
- */
-void
-GNUNET_TRANSPORT_hello_get_cancel (struct GNUNET_TRANSPORT_HelloGetHandle *ghh)
-{
- if (NULL != ghh->reconnect_task)
- {
- GNUNET_SCHEDULER_cancel (ghh->reconnect_task);
- ghh->reconnect_task = NULL;
- }
- if (NULL != ghh->mq)
- {
- GNUNET_MQ_destroy (ghh->mq);
- ghh->mq = NULL;
- }
- GNUNET_free (ghh);
-}
-
-
-/* end of transport_api_hello_get.c */
diff --git a/src/transport/transport_api_manipulation.c
b/src/transport/transport_api_manipulation.c
deleted file mode 100644
index 4f4ccc4a0..000000000
--- a/src/transport/transport_api_manipulation.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009-2013, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/transport_api_manipulation.c
- * @brief library to access the low-level P2P IO service
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_constants.h"
-#include "gnunet_arm_service.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_transport_service.h"
-#include "transport.h"
-
-#define LOG(kind, ...) GNUNET_log_from (kind, "transport-api", __VA_ARGS__)
-
-
-/**
- * Handle for the transport service (includes all of the
- * state for the transport service).
- */
-struct GNUNET_TRANSPORT_ManipulationHandle
-{
- /**
- * My client connection to the transport service.
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * My configuration.
- */
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * ID of the task trying to reconnect to the service.
- */
- struct GNUNET_SCHEDULER_Task *reconnect_task;
-
- /**
- * Delay until we try to reconnect.
- */
- struct GNUNET_TIME_Relative reconnect_delay;
-
- /**
- * Reconnect in progress
- */
- int reconnecting;
-};
-
-
-/**
- * Function that will schedule the job that will try
- * to connect us again to the client.
- *
- * @param h transport service to reconnect
- */
-static void
-disconnect_and_schedule_reconnect (struct
- GNUNET_TRANSPORT_ManipulationHandle *h);
-
-
-/**
- * Generic error handler, called with the appropriate
- * error code and the same closure specified at the creation of
- * the message queue.
- * Not every message queue implementation supports an error handler.
- *
- * @param cls closure with the `struct GNUNET_TRANSPORT_ManipulationHandle *`
- * @param error error code
- */
-static void
-mq_error_handler (void *cls,
- enum GNUNET_MQ_Error error)
-{
- struct GNUNET_TRANSPORT_ManipulationHandle *h = cls;
-
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Error receiving from transport service, disconnecting temporarily.\n");
- h->reconnecting = GNUNET_YES;
- disconnect_and_schedule_reconnect (h);
-}
-
-
-/**
- * Try again to connect to transport service.
- *
- * @param cls the handle to the transport service
- */
-static void
-reconnect (void *cls)
-{
- struct GNUNET_TRANSPORT_ManipulationHandle *h = cls;
- struct GNUNET_MQ_MessageHandler handlers[] = {
- GNUNET_MQ_handler_end ()
- };
- struct GNUNET_MQ_Envelope *env;
- struct StartMessage *s;
-
- h->reconnect_task = NULL;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Connecting to transport service.\n");
- GNUNET_assert (NULL == h->mq);
- h->reconnecting = GNUNET_NO;
- h->mq = GNUNET_CLIENT_connect (h->cfg,
- "transport",
- handlers,
- &mq_error_handler,
- h);
- if (NULL == h->mq)
- return;
- env = GNUNET_MQ_msg (s,
- GNUNET_MESSAGE_TYPE_TRANSPORT_START);
- GNUNET_MQ_send (h->mq,
- env);
-}
-
-
-/**
- * Function that will schedule the job that will try
- * to connect us again to the client.
- *
- * @param h transport service to reconnect
- */
-static void
-disconnect_and_schedule_reconnect (struct
- GNUNET_TRANSPORT_ManipulationHandle *h)
-{
- GNUNET_assert (NULL == h->reconnect_task);
- if (NULL != h->mq)
- {
- GNUNET_MQ_destroy (h->mq);
- h->mq = NULL;
- }
- h->reconnect_task =
- GNUNET_SCHEDULER_add_delayed (h->reconnect_delay,
- &reconnect,
- h);
- h->reconnect_delay = GNUNET_TIME_STD_BACKOFF (h->reconnect_delay);
-}
-
-
-/**
- * Set transport metrics for a peer and a direction.
- *
- * @param handle transport handle
- * @param peer the peer to set the metric for
- * @param prop the performance metrics to set
- * @param delay_in inbound delay to introduce
- * @param delay_out outbound delay to introduce
- *
- * Note: Delay restrictions in receiving direction will be enforced
- * with one message delay.
- */
-void
-GNUNET_TRANSPORT_manipulation_set (struct
- GNUNET_TRANSPORT_ManipulationHandle *handle,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_ATS_Properties *prop,
- struct GNUNET_TIME_Relative delay_in,
- struct GNUNET_TIME_Relative delay_out)
-{
- struct GNUNET_MQ_Envelope *env;
- struct TrafficMetricMessage *msg;
-
- if (NULL == handle->mq)
- return;
- env = GNUNET_MQ_msg (msg,
- GNUNET_MESSAGE_TYPE_TRANSPORT_TRAFFIC_METRIC);
- msg->reserved = htonl (0);
- msg->peer = *peer;
- GNUNET_ATS_properties_hton (&msg->properties,
- prop);
- msg->delay_in = GNUNET_TIME_relative_hton (delay_in);
- msg->delay_out = GNUNET_TIME_relative_hton (delay_out);
- GNUNET_MQ_send (handle->mq,
- env);
-}
-
-
-/**
- * Connect to the transport service. Note that the connection may
- * complete (or fail) asynchronously.
- *
- * @param cfg configuration to use
- * @return NULL on error
- */
-struct GNUNET_TRANSPORT_ManipulationHandle *
-GNUNET_TRANSPORT_manipulation_connect (const struct
- GNUNET_CONFIGURATION_Handle *cfg)
-{
- struct GNUNET_TRANSPORT_ManipulationHandle *h;
-
- h = GNUNET_new (struct GNUNET_TRANSPORT_ManipulationHandle);
- h->cfg = cfg;
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Connecting to transport service.\n");
- reconnect (h);
- if (NULL == h->mq)
- {
- GNUNET_free (h);
- return NULL;
- }
- return h;
-}
-
-
-/**
- * Disconnect from the transport service.
- *
- * @param handle handle to the service as returned from
#GNUNET_TRANSPORT_manipulation_connect()
- */
-void
-GNUNET_TRANSPORT_manipulation_disconnect (struct
- GNUNET_TRANSPORT_ManipulationHandle *
- handle)
-{
- if (NULL == handle->reconnect_task)
- disconnect_and_schedule_reconnect (handle);
- /* and now we stop trying to connect again... */
- if (NULL != handle->reconnect_task)
- {
- GNUNET_SCHEDULER_cancel (handle->reconnect_task);
- handle->reconnect_task = NULL;
- }
- GNUNET_free (handle);
-}
-
-
-/* end of transport_api_manipulation.c */
diff --git a/src/transport/transport_api_monitor_peers.c
b/src/transport/transport_api_monitor_peers.c
deleted file mode 100644
index ef1dc6087..000000000
--- a/src/transport/transport_api_monitor_peers.c
+++ /dev/null
@@ -1,443 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009-2014, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/transport_api_monitor_peers.c
- * @brief montoring api for transport peer status
- *
- * This api provides the ability to query the transport service about
- * the connection status of a specific or all peers.
- *
- * Calls back with information about peer(s) including address used, state and
- * state timeout for peer requests.
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_arm_service.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_transport_service.h"
-#include "transport.h"
-
-/**
- * Context for iterating validation entries.
- */
-struct GNUNET_TRANSPORT_PeerMonitoringContext
-{
- /**
- * Function to call with the binary address.
- */
- GNUNET_TRANSPORT_PeerIterateCallback cb;
-
- /**
- * Closure for @e cb.
- */
- void *cb_cls;
-
- /**
- * Connection to the service.
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * Configuration we use.
- */
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * Backoff for reconnect.
- */
- struct GNUNET_TIME_Relative backoff;
-
- /**
- * Task ID for reconnect.
- */
- struct GNUNET_SCHEDULER_Task *reconnect_task;
-
- /**
- * Identity of the peer to monitor.
- */
- struct GNUNET_PeerIdentity peer;
-
- /**
- * Was this a one-shot request?
- */
- int one_shot;
-};
-
-
-/**
- * Check if a state is defined as connected
- *
- * @param state the state value
- * @return #GNUNET_YES or #GNUNET_NO
- */
-int
-GNUNET_TRANSPORT_is_connected (enum GNUNET_TRANSPORT_PeerState state)
-{
- switch (state)
- {
- case GNUNET_TRANSPORT_PS_NOT_CONNECTED:
- case GNUNET_TRANSPORT_PS_INIT_ATS:
- case GNUNET_TRANSPORT_PS_SYN_SENT:
- case GNUNET_TRANSPORT_PS_SYN_RECV_ATS:
- case GNUNET_TRANSPORT_PS_SYN_RECV_ACK:
- return GNUNET_NO;
-
- case GNUNET_TRANSPORT_PS_CONNECTED:
- case GNUNET_TRANSPORT_PS_RECONNECT_ATS:
- case GNUNET_TRANSPORT_PS_RECONNECT_SENT:
- case GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT:
- return GNUNET_YES;
-
- case GNUNET_TRANSPORT_PS_DISCONNECT:
- case GNUNET_TRANSPORT_PS_DISCONNECT_FINISHED:
- return GNUNET_NO;
-
- default:
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unhandled state `%s'\n",
- GNUNET_TRANSPORT_ps2s (state));
- GNUNET_break (0);
- break;
- }
- return GNUNET_SYSERR;
-}
-
-
-/**
- * Convert peer state to human-readable string.
- *
- * @param state the state value
- * @return corresponding string
- */
-const char *
-GNUNET_TRANSPORT_ps2s (enum GNUNET_TRANSPORT_PeerState state)
-{
- switch (state)
- {
- case GNUNET_TRANSPORT_PS_NOT_CONNECTED:
- return "S_NOT_CONNECTED";
-
- case GNUNET_TRANSPORT_PS_INIT_ATS:
- return "S_INIT_ATS";
-
- case GNUNET_TRANSPORT_PS_SYN_SENT:
- return "S_SYN_SENT";
-
- case GNUNET_TRANSPORT_PS_SYN_RECV_ATS:
- return "S_SYN_RECV_ATS";
-
- case GNUNET_TRANSPORT_PS_SYN_RECV_ACK:
- return "S_SYN_RECV_ACK";
-
- case GNUNET_TRANSPORT_PS_CONNECTED:
- return "S_CONNECTED";
-
- case GNUNET_TRANSPORT_PS_RECONNECT_ATS:
- return "S_RECONNECT_ATS";
-
- case GNUNET_TRANSPORT_PS_RECONNECT_SENT:
- return "S_RECONNECT_SENT";
-
- case GNUNET_TRANSPORT_PS_SWITCH_SYN_SENT:
- return "S_SWITCH_SYN_SENT";
-
- case GNUNET_TRANSPORT_PS_DISCONNECT:
- return "S_DISCONNECT";
-
- case GNUNET_TRANSPORT_PS_DISCONNECT_FINISHED:
- return "S_DISCONNECT_FINISHED";
-
- default:
- GNUNET_break (0);
- return "UNDEFINED";
- }
-}
-
-
-/**
- * Task run to re-establish the connection.
- *
- * @param cls our `struct GNUNET_TRANSPORT_PeerMonitoringContext *`
- */
-static void
-do_peer_connect (void *cls);
-
-
-/**
- * Cut the existing connection and reconnect.
- *
- * @param pal_ctx our context
- */
-static void
-reconnect_peer_ctx (struct GNUNET_TRANSPORT_PeerMonitoringContext *pal_ctx)
-{
- GNUNET_assert (GNUNET_NO == pal_ctx->one_shot);
- GNUNET_MQ_destroy (pal_ctx->mq);
- pal_ctx->mq = NULL;
- pal_ctx->cb (pal_ctx->cb_cls,
- NULL,
- NULL,
- GNUNET_TRANSPORT_PS_NOT_CONNECTED,
- GNUNET_TIME_UNIT_ZERO_ABS);
- pal_ctx->backoff = GNUNET_TIME_STD_BACKOFF (pal_ctx->backoff);
- pal_ctx->reconnect_task = GNUNET_SCHEDULER_add_delayed (pal_ctx->backoff,
- &do_peer_connect,
- pal_ctx);
-}
-
-
-/**
- * Function called with responses from the service.
- *
- * @param cls our `struct GNUNET_TRANSPORT_PeerMonitoringContext *`
- * @param msg message from service
- */
-static void
-handle_response_end (void *cls,
- const struct GNUNET_MessageHeader *msg)
-{
- struct GNUNET_TRANSPORT_PeerMonitoringContext *pal_ctx = cls;
-
- if (pal_ctx->one_shot)
- {
- /* iteration finished */
- pal_ctx->cb (pal_ctx->cb_cls,
- NULL,
- NULL,
- GNUNET_TRANSPORT_PS_NOT_CONNECTED,
- GNUNET_TIME_UNIT_ZERO_ABS);
- GNUNET_TRANSPORT_monitor_peers_cancel (pal_ctx);
- return;
- }
- /* not quite what we expected, reconnect */
- GNUNET_break (0);
- reconnect_peer_ctx (pal_ctx);
-}
-
-
-/**
- * Function called to check responses from the service.
- *
- * @param cls our `struct GNUNET_TRANSPORT_PeerMonitoringContext *`
- * @param pir_msg message with the human-readable address
- * @return #GNUNET_OK if @a pir_msg is well-formed
- */
-static int
-check_response (void *cls,
- const struct PeerIterateResponseMessage *pir_msg)
-{
- uint16_t size = ntohs (pir_msg->header.size) - sizeof(*pir_msg);
- size_t alen = ntohl (pir_msg->addrlen);
- size_t tlen = ntohl (pir_msg->pluginlen);
- const char *addr;
- const char *transport_name;
-
- if (size != tlen + alen)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- if ((0 == tlen) && (0 == alen))
- return GNUNET_OK;
- if (0 == tlen)
- {
- GNUNET_break (0); /* This must not happen: address without plugin */
- return GNUNET_SYSERR;
- }
- addr = (const char *) &pir_msg[1];
- transport_name = &addr[alen];
- if (transport_name[tlen - 1] != '\0')
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Function called with responses from the service.
- *
- * @param cls our `struct GNUNET_TRANSPORT_PeerMonitoringContext *`
- * @param msg message with the human-readable address
- */
-static void
-handle_response (void *cls,
- const struct PeerIterateResponseMessage *pir_msg)
-{
- struct GNUNET_TRANSPORT_PeerMonitoringContext *pal_ctx = cls;
- struct GNUNET_HELLO_Address *address;
- size_t alen = ntohl (pir_msg->addrlen);
- size_t tlen = ntohl (pir_msg->pluginlen);
- const char *addr;
- const char *transport_name;
-
- if ((0 == tlen) &&
- (0 == alen))
- {
- /* No address available */
- pal_ctx->cb (pal_ctx->cb_cls,
- &pir_msg->peer,
- NULL,
- ntohl (pir_msg->state),
- GNUNET_TIME_absolute_ntoh (pir_msg->state_timeout));
- return;
- }
- addr = (const char *) &pir_msg[1];
- transport_name = &addr[alen];
-
- /* notify client */
- address = GNUNET_HELLO_address_allocate (&pir_msg->peer,
- transport_name,
- addr,
- alen,
- ntohl
(pir_msg->local_address_info));
- pal_ctx->cb (pal_ctx->cb_cls,
- &pir_msg->peer,
- address,
- ntohl (pir_msg->state),
- GNUNET_TIME_absolute_ntoh (pir_msg->state_timeout));
- GNUNET_HELLO_address_free (address);
-}
-
-
-/**
- * Generic error handler, called with the appropriate error code and
- * the same closure specified at the creation of the message queue.
- * Not every message queue implementation supports an error handler.
- *
- * @param cls closure with the `struct GNUNET_TRANSPORT_PeerMonitoringContext
*`
- * @param error error code
- */
-static void
-mq_error_handler (void *cls,
- enum GNUNET_MQ_Error error)
-{
- struct GNUNET_TRANSPORT_PeerMonitoringContext *pal_ctx = cls;
-
- if (pal_ctx->one_shot)
- {
- /* Disconnect */
- pal_ctx->cb (pal_ctx->cb_cls,
- NULL,
- NULL,
- GNUNET_TRANSPORT_PS_NOT_CONNECTED,
- GNUNET_TIME_UNIT_ZERO_ABS);
- GNUNET_TRANSPORT_monitor_peers_cancel (pal_ctx);
- return;
- }
- reconnect_peer_ctx (pal_ctx);
-}
-
-
-/**
- * Task run to re-establish the connection.
- *
- * @param cls our `struct GNUNET_TRANSPORT_PeerMonitoringContext *`
- */
-static void
-do_peer_connect (void *cls)
-{
- struct GNUNET_TRANSPORT_PeerMonitoringContext *pal_ctx = cls;
- struct GNUNET_MQ_MessageHandler handlers[] = {
- GNUNET_MQ_hd_var_size (response,
- GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PEER_RESPONSE,
- struct PeerIterateResponseMessage,
- pal_ctx),
- GNUNET_MQ_hd_fixed_size (response_end,
-
GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PEER_RESPONSE_END,
- struct GNUNET_MessageHeader,
- pal_ctx),
- GNUNET_MQ_handler_end ()
- };
- struct PeerMonitorMessage *msg;
- struct GNUNET_MQ_Envelope *env;
-
- pal_ctx->reconnect_task = NULL;
- pal_ctx->mq = GNUNET_CLIENT_connect (pal_ctx->cfg,
- "transport",
- handlers,
- &mq_error_handler,
- pal_ctx);
- if (NULL == pal_ctx->mq)
- return;
- env = GNUNET_MQ_msg (msg,
- GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PEER_REQUEST);
- msg->one_shot = htonl (pal_ctx->one_shot);
- msg->peer = pal_ctx->peer;
- GNUNET_MQ_send (pal_ctx->mq,
- env);
-}
-
-
-struct GNUNET_TRANSPORT_PeerMonitoringContext *
-GNUNET_TRANSPORT_monitor_peers (const struct GNUNET_CONFIGURATION_Handle *cfg,
- const struct GNUNET_PeerIdentity *peer,
- int one_shot,
- GNUNET_TRANSPORT_PeerIterateCallback
- peer_callback,
- void *peer_callback_cls)
-{
- struct GNUNET_TRANSPORT_PeerMonitoringContext *pal_ctx
- = GNUNET_new (struct GNUNET_TRANSPORT_PeerMonitoringContext);
-
- pal_ctx->cb = peer_callback;
- pal_ctx->cb_cls = peer_callback_cls;
- pal_ctx->cfg = cfg;
- if (NULL != peer)
- pal_ctx->peer = *peer;
- pal_ctx->one_shot = one_shot;
- do_peer_connect (pal_ctx);
- if (NULL == pal_ctx->mq)
- {
- GNUNET_free (pal_ctx);
- return NULL;
- }
- return pal_ctx;
-}
-
-
-/**
- * Cancel request to monitor peers
- *
- * @param pic handle for the request to cancel
- */
-void
-GNUNET_TRANSPORT_monitor_peers_cancel (struct
- GNUNET_TRANSPORT_PeerMonitoringContext *
- pic)
-{
- if (NULL != pic->mq)
- {
- GNUNET_MQ_destroy (pic->mq);
- pic->mq = NULL;
- }
- if (NULL != pic->reconnect_task)
- {
- GNUNET_SCHEDULER_cancel (pic->reconnect_task);
- pic->reconnect_task = NULL;
- }
- GNUNET_free (pic);
-}
-
-
-/* end of transport_api_monitor_peers.c */
diff --git a/src/transport/transport_api_monitor_plugins.c
b/src/transport/transport_api_monitor_plugins.c
deleted file mode 100644
index 43a11442b..000000000
--- a/src/transport/transport_api_monitor_plugins.c
+++ /dev/null
@@ -1,463 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2014, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/transport_api_monitor_plugins.c
- * @brief montoring api for transport plugin session status
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_arm_service.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_transport_service.h"
-#include "transport.h"
-
-
-/**
- * Handle for a plugin session state monitor.
- */
-struct GNUNET_TRANSPORT_PluginMonitor
-{
- /**
- * Connection to the service.
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * Our configuration.
- */
- const struct GNUNET_CONFIGURATION_Handle *cfg;
-
- /**
- * Callback to call.
- */
- GNUNET_TRANSPORT_SessionMonitorCallback cb;
-
- /**
- * Closure for @e cb
- */
- void *cb_cls;
-
- /**
- * Map of session_ids (reduced to 32-bits) to
- * `struct GNUNET_TRANSPORT_PluginSession` objects.
- */
- struct GNUNET_CONTAINER_MultiHashMap32 *sessions;
-
- /**
- * Backoff for reconnect.
- */
- struct GNUNET_TIME_Relative backoff;
-
- /**
- * Task ID for reconnect.
- */
- struct GNUNET_SCHEDULER_Task *reconnect_task;
-};
-
-
-/**
- * Abstract representation of a plugin's session.
- * Corresponds to the `struct GNUNET_ATS_Session` within the TRANSPORT service.
- */
-struct GNUNET_TRANSPORT_PluginSession
-{
- /**
- * Unique session identifier.
- */
- uint64_t session_id;
-
- /**
- * Location for the client to store "data".
- */
- void *client_ctx;
-};
-
-
-/**
- * Task run to re-establish the connection.
- *
- * @param cls our `struct GNUNET_TRANSPORT_PluginMonitor *`
- */
-static void
-do_plugin_connect (void *cls);
-
-
-/**
- * Free the session entry and notify the callback about its demise.
- *
- * @param cls our `struct GNUNET_TRANSPORT_PluginMonitor`
- * @param key key of the session in the map
- * @param value the session to free
- * @return #GNUNET_OK (continue to iterate)
- */
-static int
-free_entry (void *cls,
- uint32_t key,
- void *value)
-{
- struct GNUNET_TRANSPORT_PluginMonitor *pm = cls;
- struct GNUNET_TRANSPORT_PluginSession *ps = value;
-
- pm->cb (pm->cb_cls,
- ps,
- &ps->client_ctx,
- NULL);
- GNUNET_break (GNUNET_YES ==
- GNUNET_CONTAINER_multihashmap32_remove (pm->sessions,
- key,
- ps));
- GNUNET_break (NULL == ps->client_ctx);
- GNUNET_free (ps);
- return GNUNET_OK;
-}
-
-
-/**
- * Cut the existing connection and reconnect.
- *
- * @param pm our context
- */
-static void
-reconnect_plugin_ctx (struct GNUNET_TRANSPORT_PluginMonitor *pm)
-{
- GNUNET_MQ_destroy (pm->mq);
- pm->mq = NULL;
- GNUNET_CONTAINER_multihashmap32_iterate (pm->sessions,
- &free_entry,
- pm);
- pm->backoff = GNUNET_TIME_STD_BACKOFF (pm->backoff);
- pm->reconnect_task = GNUNET_SCHEDULER_add_delayed (pm->backoff,
- &do_plugin_connect,
- pm);
-}
-
-
-/**
- * Convert 64-bit session ID to 32-bit index for hash map.
- *
- * @param id 64-bit session ID
- * @return 32-bit hash map index
- */
-static uint32_t
-wrap_id (uint64_t id)
-{
- return ((uint32_t) id) ^ ((uint32_t) (id >> 32));
-}
-
-
-/**
- * Context for #locate_by_id().
- */
-struct SearchContext
-{
- /**
- * Result.
- */
- struct GNUNET_TRANSPORT_PluginSession *ps;
-
- /**
- * ID to locate.
- */
- uint64_t session_id;
-};
-
-
-/**
- * Locate a session entry.
- *
- * @param cls our `struct SearchContext`
- * @param key key of the session in the map
- * @param value a session
- * @return #GNUNET_OK (continue to iterate), or #GNUNET_SYSERR (match found)
- */
-static int
-locate_by_id (void *cls,
- uint32_t key,
- void *value)
-{
- struct SearchContext *sc = cls;
- struct GNUNET_TRANSPORT_PluginSession *ps = value;
-
- if (sc->session_id == ps->session_id)
- {
- sc->ps = ps;
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Function called with responses from the service.
- *
- * @param cls our `struct GNUNET_TRANSPORT_PluginMonitor *`
- * @param tpmm message with event data
- * @return #GNUNET_Ok if message is well-formed
- */
-static int
-check_event (void *cls,
- const struct TransportPluginMonitorMessage *tpmm)
-{
- const char *pname;
- size_t pname_len;
- size_t paddr_len;
-
- pname = (const char *) &tpmm[1];
- pname_len = ntohs (tpmm->plugin_name_len);
- paddr_len = ntohs (tpmm->plugin_address_len);
- if ((pname_len
- + paddr_len
- + sizeof(struct TransportPluginMonitorMessage) != ntohs (
- tpmm->header.size)) ||
- ((0 != pname_len) &&
- ('\0' != pname[pname_len - 1])))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Function called with responses from the service.
- *
- * @param cls our `struct GNUNET_TRANSPORT_PluginMonitor *`
- * @param tpmm message with event data
- */
-static void
-handle_event (void *cls,
- const struct TransportPluginMonitorMessage *tpmm)
-{
- struct GNUNET_TRANSPORT_PluginMonitor *pm = cls;
- struct GNUNET_TRANSPORT_PluginSession *ps;
- const char *pname;
- const void *paddr;
- enum GNUNET_TRANSPORT_SessionState ss;
- size_t pname_len;
- size_t paddr_len;
- struct GNUNET_TRANSPORT_SessionInfo info;
- struct GNUNET_HELLO_Address addr;
- struct SearchContext rv;
-
- pname = (const char *) &tpmm[1];
- pname_len = ntohs (tpmm->plugin_name_len);
- paddr_len = ntohs (tpmm->plugin_address_len);
- paddr = &pname[pname_len];
- ps = NULL;
- ss = (enum GNUNET_TRANSPORT_SessionState) ntohs (tpmm->session_state);
- if (GNUNET_TRANSPORT_SS_INIT == ss)
- {
- ps = GNUNET_new (struct GNUNET_TRANSPORT_PluginSession);
- ps->session_id = tpmm->session_id;
- (void) GNUNET_CONTAINER_multihashmap32_put (pm->sessions,
- wrap_id (tpmm->session_id),
- ps,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
- }
- else
- {
- rv.session_id = tpmm->session_id;
- rv.ps = NULL;
- (void) GNUNET_CONTAINER_multihashmap32_get_multiple (pm->sessions,
- wrap_id (
- tpmm->session_id),
- &locate_by_id,
- &rv);
- ps = rv.ps;
- if (NULL == ps)
- {
- GNUNET_break (0);
- reconnect_plugin_ctx (pm);
- return;
- }
- }
- info.state = ss;
- info.is_inbound = (int16_t) ntohs (tpmm->is_inbound);
- info.num_msg_pending = ntohl (tpmm->msgs_pending);
- info.num_bytes_pending = ntohl (tpmm->bytes_pending);
- info.receive_delay = GNUNET_TIME_absolute_ntoh (tpmm->delay);
- info.session_timeout = GNUNET_TIME_absolute_ntoh (tpmm->timeout);
- info.address = &addr;
- addr.peer = tpmm->peer;
- addr.address = (0 == paddr_len) ? NULL : paddr;
- addr.address_length = paddr_len;
- addr.transport_name = (0 == pname_len) ? NULL : pname;
- addr.local_info = GNUNET_HELLO_ADDRESS_INFO_NONE;
- pm->cb (pm->cb_cls,
- ps,
- &ps->client_ctx,
- &info);
-
- if (GNUNET_TRANSPORT_SS_DONE == ss)
- {
- GNUNET_break (NULL == ps->client_ctx);
- GNUNET_assert (GNUNET_YES ==
- GNUNET_CONTAINER_multihashmap32_remove (pm->sessions,
- wrap_id (
- tpmm->session_id),
- ps));
- GNUNET_free (ps);
- }
-}
-
-
-/**
- * Function called with sync responses from the service.
- *
- * @param cls our `struct GNUNET_TRANSPORT_PluginMonitor *`
- * @param msg message from the service
- */
-static void
-handle_sync (void *cls,
- const struct GNUNET_MessageHeader *msg)
-{
- struct GNUNET_TRANSPORT_PluginMonitor *pm = cls;
-
- /* we are in sync, notify callback */
- pm->cb (pm->cb_cls,
- NULL,
- NULL,
- NULL);
-}
-
-
-/**
- * Generic error handler, called with the appropriate
- * error code and the same closure specified at the creation of
- * the message queue.
- * Not every message queue implementation supports an error handler.
- *
- * @param cls closure with the `struct GNUNET_NSE_Handle *`
- * @param error error code
- */
-static void
-mq_error_handler (void *cls,
- enum GNUNET_MQ_Error error)
-{
- struct GNUNET_TRANSPORT_PluginMonitor *pm = cls;
-
- reconnect_plugin_ctx (pm);
-}
-
-
-/**
- * Task run to re-establish the connection.
- *
- * @param cls our `struct GNUNET_TRANSPORT_PluginMonitor *`
- */
-static void
-do_plugin_connect (void *cls)
-{
- struct GNUNET_TRANSPORT_PluginMonitor *pm = cls;
- struct GNUNET_MQ_MessageHandler handlers[] = {
- GNUNET_MQ_hd_var_size (event,
- GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PLUGIN_EVENT,
- struct TransportPluginMonitorMessage,
- pm),
- GNUNET_MQ_hd_fixed_size (sync,
- GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PLUGIN_SYNC,
- struct GNUNET_MessageHeader,
- pm),
- GNUNET_MQ_handler_end ()
- };
- struct GNUNET_MessageHeader *msg;
- struct GNUNET_MQ_Envelope *env;
-
- pm->reconnect_task = NULL;
- pm->mq = GNUNET_CLIENT_connect (pm->cfg,
- "transport",
- handlers,
- &mq_error_handler,
- pm);
- if (NULL == pm->mq)
- return;
- env = GNUNET_MQ_msg (msg,
- GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PLUGIN_START);
- GNUNET_MQ_send (pm->mq,
- env);
-}
-
-
-/**
- * Install a plugin session state monitor callback. The callback
- * will be notified whenever the session changes.
- *
- * @param cfg configuration to use
- * @param cb callback to invoke on events
- * @param cb_cls closure for @a cb
- * @return NULL on error, otherwise handle for cancellation
- */
-struct GNUNET_TRANSPORT_PluginMonitor *
-GNUNET_TRANSPORT_monitor_plugins (const struct GNUNET_CONFIGURATION_Handle
*cfg,
- GNUNET_TRANSPORT_SessionMonitorCallback cb,
- void *cb_cls)
-{
- struct GNUNET_TRANSPORT_PluginMonitor *pm;
-
- pm = GNUNET_new (struct GNUNET_TRANSPORT_PluginMonitor);
- pm->cb = cb;
- pm->cb_cls = cb_cls;
- pm->cfg = cfg;
- do_plugin_connect (pm);
- if (NULL == pm->mq)
- {
- GNUNET_free (pm);
- return NULL;
- }
- pm->sessions = GNUNET_CONTAINER_multihashmap32_create (128);
- return pm;
-}
-
-
-/**
- * Cancel monitoring the plugin session state. The callback will
- * be called once for each session that is up with the information
- * #GNUNET_TRANSPORT_SS_FINI (even though the session may stay up;
- * this is just to enable client-side cleanup).
- *
- * @param pm handle of the request that is to be cancelled
- */
-void
-GNUNET_TRANSPORT_monitor_plugins_cancel (struct
- GNUNET_TRANSPORT_PluginMonitor *pm)
-{
- if (NULL != pm->mq)
- {
- GNUNET_MQ_destroy (pm->mq);
- pm->mq = NULL;
- }
- if (NULL != pm->reconnect_task)
- {
- GNUNET_SCHEDULER_cancel (pm->reconnect_task);
- pm->reconnect_task = NULL;
- }
- GNUNET_CONTAINER_multihashmap32_iterate (pm->sessions,
- &free_entry,
- pm);
- GNUNET_CONTAINER_multihashmap32_destroy (pm->sessions);
- GNUNET_free (pm);
-}
-
-
-/* end of transport_api_monitor_plugins.c */
diff --git a/src/transport/transport_api_offer_hello.c
b/src/transport/transport_api_offer_hello.c
deleted file mode 100644
index 1b611aa6b..000000000
--- a/src/transport/transport_api_offer_hello.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2009-2013, 2016 GNUnet e.V.
-
- GNUnet is free software: you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
- SPDX-License-Identifier: AGPL3.0-or-later
- */
-
-/**
- * @file transport/transport_api_offer_hello.c
- * @brief library to offer HELLOs to transport service
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "gnunet_util_lib.h"
-#include "gnunet_hello_lib.h"
-#include "gnunet_protocols.h"
-#include "gnunet_transport_service.h"
-
-
-/**
- * Entry in linked list for all offer-HELLO requests.
- */
-struct GNUNET_TRANSPORT_OfferHelloHandle
-{
- /**
- * Transport service handle we use for transmission.
- */
- struct GNUNET_MQ_Handle *mq;
-
- /**
- * Function to call once we are done.
- */
- GNUNET_SCHEDULER_TaskCallback cont;
-
- /**
- * Closure for @e cont
- */
- void *cls;
-};
-
-
-/**
- * Done sending HELLO message to the service, notify application.
- *
- * @param cls the handle for the operation
- */
-static void
-finished_hello (void *cls)
-{
- struct GNUNET_TRANSPORT_OfferHelloHandle *ohh = cls;
-
- if (NULL != ohh->cont)
- ohh->cont (ohh->cls);
- GNUNET_TRANSPORT_offer_hello_cancel (ohh);
-}
-
-
-/**
- * Offer the transport service the HELLO of another peer. Note that
- * the transport service may just ignore this message if the HELLO is
- * malformed or useless due to our local configuration.
- *
- * @param cfg configuration
- * @param hello the hello message
- * @param cont continuation to call when HELLO has been sent,
- * tc reason #GNUNET_SCHEDULER_REASON_TIMEOUT for fail
- * tc reasong #GNUNET_SCHEDULER_REASON_READ_READY for success
- * @param cont_cls closure for @a cont
- * @return a `struct GNUNET_TRANSPORT_OfferHelloHandle` handle or NULL on
failure,
- * in case of failure @a cont will not be called
- *
- */
-struct GNUNET_TRANSPORT_OfferHelloHandle *
-GNUNET_TRANSPORT_offer_hello (const struct GNUNET_CONFIGURATION_Handle *cfg,
- const struct GNUNET_MessageHeader *hello,
- GNUNET_SCHEDULER_TaskCallback cont,
- void *cont_cls)
-{
- struct GNUNET_TRANSPORT_OfferHelloHandle *ohh
- = GNUNET_new (struct GNUNET_TRANSPORT_OfferHelloHandle);
- struct GNUNET_MQ_Envelope *env;
- struct GNUNET_PeerIdentity peer;
-
- if (GNUNET_OK !=
- GNUNET_HELLO_get_id ((const struct GNUNET_HELLO_Message *) hello,
- &peer))
- {
- GNUNET_break (0);
- GNUNET_free (ohh);
- return NULL;
- }
- ohh->mq = GNUNET_CLIENT_connect (cfg,
- "transport",
- NULL,
- NULL,
- ohh);
- if (NULL == ohh->mq)
- {
- GNUNET_free (ohh);
- return NULL;
- }
- ohh->cont = cont;
- ohh->cls = cont_cls;
- GNUNET_break (ntohs (hello->type) == GNUNET_MESSAGE_TYPE_HELLO);
- env = GNUNET_MQ_msg_copy (hello);
- GNUNET_MQ_notify_sent (env,
- &finished_hello,
- ohh);
- GNUNET_MQ_send (ohh->mq,
- env);
- return ohh;
-}
-
-
-void
-GNUNET_TRANSPORT_offer_hello_cancel (struct
- GNUNET_TRANSPORT_OfferHelloHandle *ohh)
-{
- GNUNET_MQ_destroy (ohh->mq);
- GNUNET_free (ohh);
-}
-
-
-/* end of transport_api_offer_hello.c */
diff --git a/src/util/container_multihashmap32.c
b/src/util/container_multihashmap32.c
index 698e08e3a..3b4c92426 100644
--- a/src/util/container_multihashmap32.c
+++ b/src/util/container_multihashmap32.c
@@ -26,7 +26,6 @@
*/
-#include "gnunet_common.h"
#include "platform.h"
#include "gnunet_util_lib.h"
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [gnunet] 28/40: DHT: Fixed wrong group name, (continued)
- [gnunet] 28/40: DHT: Fixed wrong group name, gnunet, 2023/10/05
- [gnunet] 11/40: CORE: Fixed bug that core is not calling GNUNET_TRANSPORT_core_receive_continue, gnunet, 2023/10/05
- [gnunet] 15/40: NEWS: Added api to get notified when hellos are stored with peerstore service., gnunet, 2023/10/05
- [gnunet] 08/40: TNG: Added generic start script for test cases., gnunet, 2023/10/05
- [gnunet] 21/40: NEWS: Moved code to testing to have more generic test setup, which can be used not only from within transport., gnunet, 2023/10/05
- [gnunet] 23/40: NEWS: Changed method GNUNET_HELLO_builder_get_expiration_time to not need parameter GNUNET_HELLO_Builder., gnunet, 2023/10/05
- [gnunet] 24/40: Peerstore: Changed the behavior of GNUNET_PEERSTORE_watch to also return the values allready stored for the key., gnunet, 2023/10/05
- [gnunet] 27/40: TNG: Fixed validation bug., gnunet, 2023/10/05
- [gnunet] 35/40: Remove old transport struct definitions, gnunet, 2023/10/05
- [gnunet] 04/40: NEWS: Removed all usage of old transport api, beside peerinfo tool, gnunet-transport cli and usage in transport layer itself., gnunet, 2023/10/05
- [gnunet] 34/40: Remove most of old transport, ATS and PEERINFO. Disable TESTBED and related tests,
gnunet <=