summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <grothoff@gnunet.org>2021-09-22 08:49:48 +0200
committerChristian Grothoff <grothoff@gnunet.org>2021-09-22 08:49:48 +0200
commitc221e30ea67751237058b6a5aa7b46e12fca5395 (patch)
tree0bfecab095d69ee4bdd0cac76692e9e72a1640d4
parent33d31c58c1036acdef9f7d6cb3bb27881e6e26cb (diff)
-work on dhtu
-rw-r--r--src/dhtu/Makefile.am1
-rw-r--r--src/dhtu/plugin_dhtu_gnunet.c137
-rw-r--r--src/include/gnunet_mq_lib.h18
-rw-r--r--src/include/gnunet_protocols.h5
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;
+
};
@@ -90,6 +103,11 @@ struct GNUNET_DHTU_Target
void *app_ctx;
/**
+ * Our plugin with its environment.
+ */
+ struct Plugin *plugin;
+
+ /**
* CORE MQ to send messages to this peer.
*/
struct GNUNET_MQ_Handle *mq;
@@ -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
@@ -660,6 +660,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
*/