From c221e30ea67751237058b6a5aa7b46e12fca5395 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 22 Sep 2021 08:49:48 +0200 Subject: -work on dhtu --- src/dhtu/Makefile.am | 1 + src/dhtu/plugin_dhtu_gnunet.c | 137 ++++++++++++++++++++++++++++++++++++++++- src/include/gnunet_mq_lib.h | 18 ++++-- src/include/gnunet_protocols.h | 5 ++ 4 files changed, 154 insertions(+), 7 deletions(-) diff --git a/src/dhtu/Makefile.am b/src/dhtu/Makefile.am index f4b968526..601f31bf5 100644 --- a/src/dhtu/Makefile.am +++ b/src/dhtu/Makefile.am @@ -29,6 +29,7 @@ libgnunet_plugin_dhtu_gnunet_la_SOURCES = \ plugin_dhtu_gnunet.c libgnunet_plugin_dhtu_gnunet_la_LIBADD = \ $(top_builddir)/src/core/libgnunetcore.la \ + $(top_builddir)/src/nse/libgnunetnse.la \ $(top_builddir)/src/util/libgnunetutil.la \ $(XLIBS) \ $(LTLIBINTL) diff --git a/src/dhtu/plugin_dhtu_gnunet.c b/src/dhtu/plugin_dhtu_gnunet.c index e01f90bde..b57c65e44 100644 --- a/src/dhtu/plugin_dhtu_gnunet.c +++ b/src/dhtu/plugin_dhtu_gnunet.c @@ -27,6 +27,8 @@ #include "platform.h" #include "gnunet_dhtu_plugin.h" #include "gnunet_core_service.h" +#include "gnunet_nse_service.h" + /** * Handle for a private key used by this underlay. @@ -74,6 +76,17 @@ struct GNUNET_DHTU_Source * Application context for this source. */ void *app_ctx; + + /** + * Hash position of this peer in the DHT. + */ + struct GNUNET_DHTU_Hash my_id; + + /** + * Private key of this peer. + */ + struct GNUNET_DHTU_PrivateKey pk; + }; @@ -89,6 +102,11 @@ struct GNUNET_DHTU_Target */ void *app_ctx; + /** + * Our plugin with its environment. + */ + struct Plugin *plugin; + /** * CORE MQ to send messages to this peer. */ @@ -159,6 +177,17 @@ struct Plugin * Handle to the CORE service. */ struct GNUNET_CORE_Handle *core; + + /** + * Our "source" address. Traditional CORE API does not tell us which source + * it is, so they are all identical. + */ + struct GNUNET_DHTU_Source src; + + /** + * Handle to the NSE service. + */ + struct GNUNET_NSE_Handle *nse; }; @@ -242,6 +271,9 @@ static void ip_try_connect (void *cls, const char *address) { + struct Plugin *plugin = cls; + + // FIXME: ask ATS/TRANSPORT to 'connect' GNUNET_break (0); } @@ -258,6 +290,7 @@ static struct GNUNET_DHTU_PreferenceHandle * ip_hold (void *cls, struct GNUNET_DHTU_Target *target) { + struct Plugin *plugin = cls; struct GNUNET_DHTU_PreferenceHandle *ph; ph = GNUNET_new (struct GNUNET_DHTU_PreferenceHandle); @@ -266,6 +299,7 @@ ip_hold (void *cls, target->ph_tail, ph); target->ph_count++; + // FIXME: update ATS about 'hold' return ph; } @@ -286,6 +320,7 @@ ip_drop (struct GNUNET_DHTU_PreferenceHandle *ph) ph); target->ph_count--; GNUNET_free (ph); + // FIXME: update ATS about 'drop' } @@ -312,7 +347,20 @@ ip_send (void *cls, GNUNET_SCHEDULER_TaskCallback finished_cb, void *finished_cb_cls) { - GNUNET_break (0); + struct GNUNET_MQ_Envelope *env; + struct GNUNET_MessageHeader *cmsg; + + env = GNUNET_MQ_msg_extra (cmsg, + msg_size, + GNUNET_MESSAGE_TYPE_DHT_CORE); + GNUNET_MQ_notify_sent (env, + finished_cb, + finished_cb_cls); + memcpy (&cmsg[1], + msg, + msg_size); + GNUNET_MQ_send (target->mq, + env); } @@ -334,6 +382,7 @@ core_connect_cb (void *cls, struct GNUNET_DHTU_Target *target; target = GNUNET_new (struct GNUNET_DHTU_Target); + target->plugin = plugin; target->mq = mq; target->pk.header.size = htons (sizeof (struct PublicKey)); target->pk.peer_pub = *peer; @@ -362,6 +411,11 @@ core_disconnect_cb (void *cls, const struct GNUNET_PeerIdentity *peer, void *peer_cls) { + struct Plugin *plugin = cls; + struct GNUNET_DHTU_Target *target = peer_cls; + + plugin->env->disconnect_cb (target->app_ctx); + GNUNET_free (target); } @@ -382,6 +436,79 @@ core_init_cb (void *cls, const struct GNUNET_PeerIdentity *my_identity) { struct Plugin *plugin = cls; + char *addr = NULL; + + // FIXME: initialize src.my_id and src.pk and addr! + // (note: with legacy CORE, we only have one addr) + plugin->env->address_add_cb (plugin->env->cls, + &plugin->src.my_id, + &plugin->src.pk, + addr, + &plugin->src, + &plugin->src.app_ctx); + GNUNET_free (addr); +} + + +/** + * Anything goes, always return #GNUNET_OK. + * + * @param cls unused + * @param msg message to check + * @return #GNUNET_OK if all is fine + */ +static int +check_core_message (void *cls, + const struct GNUNET_MessageHeader *msg) +{ + (void) cls; + (void) msg; + return GNUNET_OK; +} + + +/** + * Handle message from CORE for the DHT. Passes it to the + * DHT logic. + * + * @param cls a `struct GNUNET_DHTU_Target` of the sender + * @param msg the message we received + */ +static void +handle_core_message (void *cls, + const struct GNUNET_MessageHeader *msg) +{ + struct GNUNET_DHTU_Target *origin = cls; + struct Plugin *plugin = origin->plugin; + + plugin->env->receive_cb (plugin->env->cls, + &origin->app_ctx, + &plugin->src.app_ctx, + &msg[1], + ntohs (msg->size) - sizeof (*msg)); +} + + +/** + * Callback to call when network size estimate is updated. + * + * @param cls closure + * @param timestamp time when the estimate was received from the server (or created by the server) + * @param logestimate the log(Base 2) value of the current network size estimate + * @param std_dev standard deviation for the estimate + */ +static void +nse_cb (void *cls, + struct GNUNET_TIME_Absolute timestamp, + double logestimate, + double std_dev) +{ + struct Plugin *plugin = cls; + + plugin->env->network_size_cb (plugin->env->cls, + timestamp, + logestimate, + std_dev); } @@ -398,6 +525,10 @@ libgnunet_plugin_dhtu_ip_init (void *cls) struct GNUNET_DHTU_PluginFunctions *api; struct Plugin *plugin; struct GNUNET_MQ_MessageHandler handlers[] = { + GNUNET_MQ_hd_var_size (core_message, + GNUNET_MESSAGE_TYPE_DHT_CORE, + struct GNUNET_MessageHeader, + NULL), GNUNET_MQ_handler_end () }; @@ -417,6 +548,9 @@ libgnunet_plugin_dhtu_ip_init (void *cls) &core_connect_cb, &core_disconnect_cb, handlers); + plugin->nse = GNUNET_NSE_connect (env->cfg, + &nse_cb, + plugin); return api; } @@ -433,6 +567,7 @@ libgnunet_plugin_dhtu_gnunet_done (void *cls) struct GNUNET_DHTU_PluginFunctions *api = cls; struct Plugin *plugin = api->cls; + GNUNET_NSE_disconnect (plugin->nse); GNUNET_CORE_disconnect (plugin->core); GNUNET_free (plugin); GNUNET_free (api); diff --git a/src/include/gnunet_mq_lib.h b/src/include/gnunet_mq_lib.h index 765647a98..a1c5c4957 100644 --- a/src/include/gnunet_mq_lib.h +++ b/src/include/gnunet_mq_lib.h @@ -305,7 +305,8 @@ enum GNUNET_MQ_PriorityPreferences * @param cls closure * @param msg the received message */ -typedef void (*GNUNET_MQ_MessageCallback) ( +typedef void +(*GNUNET_MQ_MessageCallback) ( void *cls, const struct GNUNET_MessageHeader *msg); @@ -318,7 +319,8 @@ typedef void (*GNUNET_MQ_MessageCallback) ( * @return #GNUNET_OK if the message is well-formed, * #GNUNET_SYSERR if not */ -typedef int (*GNUNET_MQ_MessageValidationCallback) ( +typedef int +(*GNUNET_MQ_MessageValidationCallback) ( void *cls, const struct GNUNET_MessageHeader *msg); @@ -826,7 +828,8 @@ GNUNET_MQ_get_length (struct GNUNET_MQ_Handle *mq); * @param ev the envelope with the message to send. */ void -GNUNET_MQ_send (struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev); +GNUNET_MQ_send (struct GNUNET_MQ_Handle *mq, + struct GNUNET_MQ_Envelope *ev); /** @@ -859,7 +862,8 @@ GNUNET_MQ_send_cancel (struct GNUNET_MQ_Envelope *ev); * @param assoc_data to associate */ uint32_t -GNUNET_MQ_assoc_add (struct GNUNET_MQ_Handle *mq, void *assoc_data); +GNUNET_MQ_assoc_add (struct GNUNET_MQ_Handle *mq, + void *assoc_data); /** @@ -870,7 +874,8 @@ GNUNET_MQ_assoc_add (struct GNUNET_MQ_Handle *mq, void *assoc_data); * @return the associated data */ void * -GNUNET_MQ_assoc_get (struct GNUNET_MQ_Handle *mq, uint32_t request_id); +GNUNET_MQ_assoc_get (struct GNUNET_MQ_Handle *mq, + uint32_t request_id); /** @@ -881,7 +886,8 @@ GNUNET_MQ_assoc_get (struct GNUNET_MQ_Handle *mq, uint32_t request_id); * @return the associated data */ void * -GNUNET_MQ_assoc_remove (struct GNUNET_MQ_Handle *mq, uint32_t request_id); +GNUNET_MQ_assoc_remove (struct GNUNET_MQ_Handle *mq, + uint32_t request_id); /** diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h index 6b61dfc72..41f2876e6 100644 --- a/src/include/gnunet_protocols.h +++ b/src/include/gnunet_protocols.h @@ -659,6 +659,11 @@ extern "C" { */ #define GNUNET_MESSAGE_TYPE_DHT_CLIENT_GET_RESULTS_KNOWN 156 +/** + * DHT wants to use CORE to transmit data. + */ +#define GNUNET_MESSAGE_TYPE_DHT_CORE 143 + /** * Further X-VINE DHT messages continued from 880 */ -- cgit v1.2.3