From 270b5b2ad07eb6c419078e4b7ceea9791c5625f6 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 11 Feb 2019 21:38:36 +0100 Subject: [PATCH] add API for address injection --- src/include/Makefile.am | 1 + src/include/gnunet_sensor_service.h | 199 ------- src/include/gnunet_sensor_util_lib.h | 520 ------------------ src/include/gnunet_sensordashboard_service.h | 55 -- .../gnunet_transport_address_service.h | 114 ++++ src/include/gnunet_transport_hello_service.h | 4 +- 6 files changed, 117 insertions(+), 776 deletions(-) delete mode 100644 src/include/gnunet_sensor_service.h delete mode 100644 src/include/gnunet_sensor_util_lib.h delete mode 100644 src/include/gnunet_sensordashboard_service.h create mode 100644 src/include/gnunet_transport_address_service.h diff --git a/src/include/Makefile.am b/src/include/Makefile.am index 69ea7c83e..acff7ef3a 100644 --- a/src/include/Makefile.am +++ b/src/include/Makefile.am @@ -124,6 +124,7 @@ gnunetinclude_HEADERS = \ gnunet_testing_lib.h \ gnunet_time_lib.h \ gnunet_transport_service.h \ + gnunet_transport_address_service.h \ gnunet_transport_communication_service.h \ gnunet_transport_core_service.h \ gnunet_transport_hello_service.h \ diff --git a/src/include/gnunet_sensor_service.h b/src/include/gnunet_sensor_service.h deleted file mode 100644 index 391db58bf..000000000 --- a/src/include/gnunet_sensor_service.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - This file is part of GNUnet - Copyright (C) - - 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 . - - SPDX-License-Identifier: AGPL3.0-or-later - */ - -/** - * @author Omar Tarabai - * - * @file - * API to the sensor service - * - * @defgroup sensor Sensor service - * - * @{ - */ - -#ifndef GNUNET_SENSOR_SERVICE_H -#define GNUNET_SENSOR_SERVICE_H - -#include "gnunet_common.h" -#include "gnunet_util_lib.h" - -#ifdef __cplusplus -extern "C" -{ -#if 0 /* keep Emacsens' auto-indent happy */ -} -#endif -#endif - - -/** - * Handle to the sensor service. - */ -struct GNUNET_SENSOR_Handle; - -/** - * Context for an iteration request. - */ -struct GNUNET_SENSOR_IterateContext; - -/** - * Context of a force anomaly request - */ -struct GNUNET_SENSOR_ForceAnomalyContext; - -/** - * Structure containing brief info about sensor - */ -struct SensorInfoShort -{ - - /* - * Sensor name - */ - char *name; - - /* - * First part of version number - */ - uint16_t version_major; - - /* - * Second part of version number - */ - uint16_t version_minor; - - /* - * Sensor description - */ - char *description; - -}; - -/** - * Sensor iterate request callback. - * - * @param cls closure - * @param sensor Brief sensor information - * @param error message - */ -typedef void (*GNUNET_SENSOR_SensorIterateCB) (void *cls, - const struct SensorInfoShort * - sensor, const char *err_msg); - - -/** - * Continuation called with a status result. - * - * @param cls closure - * @param emsg error message, NULL on success - */ -typedef void (*GNUNET_SENSOR_Continuation) (void *cls, const char *emsg); - - -/** - * Disconnect from the sensor service - * - * @param h handle to disconnect - */ -void -GNUNET_SENSOR_disconnect (struct GNUNET_SENSOR_Handle *h); - - -/** - * Connect to the sensor service. - * - * @return NULL on error - */ -struct GNUNET_SENSOR_Handle * -GNUNET_SENSOR_connect (const struct GNUNET_CONFIGURATION_Handle *cfg); - - -/** - * Cancel an iteration request. - * This should be called before the iterate callback is called with a NULL value. - * - * @param ic context of the iterator to cancel - */ -void -GNUNET_SENSOR_iterate_cancel (struct GNUNET_SENSOR_IterateContext - *ic); - - -/** - * Get one or all sensors loaded by the sensor service. - * The callback will be called with each sensor received and once with a NULL - * value to signal end of iteration. - * - * @param h Handle to SENSOR service - * @param timeout how long to wait until timing out - * @param sensorname Name of the required sensor, NULL to get all - * @param callback the function to call for each sensor - * @param callback_cls closure for callback - * @return iterator context - */ -struct GNUNET_SENSOR_IterateContext * -GNUNET_SENSOR_iterate (struct GNUNET_SENSOR_Handle *h, - struct GNUNET_TIME_Relative timeout, - const char *sensor_name, - GNUNET_SENSOR_SensorIterateCB callback, - void *callback_cls); - - -/** - * Cancel a force anomaly request. - * - * @param fa Force anomaly context returned by GNUNET_SENSOR_force_anomaly() - */ -void -GNUNET_SENSOR_force_anomaly_cancel (struct GNUNET_SENSOR_ForceAnomalyContext - *fa); - - -/** - * Force an anomaly status change on a given sensor. If the sensor reporting - * module is running, this will trigger the usual reporting logic, therefore, - * please only use this in a test environment. - * - * Also, if the sensor analysis module is running, it might conflict and cause - * undefined behaviour if it detects a real anomaly. - * - * @param h Service handle - * @param sensor_name Sensor name to set the anomaly status - * @param anomalous The desired status: #GNUNET_YES / #GNUNET_NO - * @param cont Continuation function to be called after the request is sent - * @param cont_cls Closure for cont - */ -struct GNUNET_SENSOR_ForceAnomalyContext * -GNUNET_SENSOR_force_anomaly (struct GNUNET_SENSOR_Handle *h, char *sensor_name, - int anomalous, GNUNET_SENSOR_Continuation cont, - void *cont_cls); - - -#if 0 /* keep Emacsens' auto-indent happy */ -{ -#endif -#ifdef __cplusplus -} -#endif - -#endif - -/** @} */ /* end of group */ diff --git a/src/include/gnunet_sensor_util_lib.h b/src/include/gnunet_sensor_util_lib.h deleted file mode 100644 index f4eaad9e8..000000000 --- a/src/include/gnunet_sensor_util_lib.h +++ /dev/null @@ -1,520 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) - - 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 . - - SPDX-License-Identifier: AGPL3.0-or-later -*/ - -/** - * @author Omar Tarabai - * - * @file - * Sensor utilities - * - * @defgroup sensor Sensor Utilities library - * - * @{ - */ - -#ifndef GNUNET_SENSOR_UTIL_LIB_H -#define GNUNET_SENSOR_UTIL_LIB_H - -#ifdef __cplusplus -extern "C" -{ -#if 0 /* keep Emacsens' auto-indent happy */ -} -#endif -#endif - -/** - * Structure containing sensor definition - */ -struct GNUNET_SENSOR_SensorInfo -{ - - /** - * The configuration handle - * carrying sensor information - */ - struct GNUNET_CONFIGURATION_Handle *cfg; - - /** - * Sensor name - */ - char *name; - - /** - * Path to definition file - */ - char *def_file; - - /** - * First part of version number - */ - uint16_t version_major; - - /** - * Second part of version number - */ - uint16_t version_minor; - - /** - * Sensor description - */ - char *description; - - /** - * Sensor currently enabled - */ - int enabled; - - /** - * Category under which the sensor falls (e.g. tcp, datastore) - */ - char *category; - - /** - * When does the sensor become active - */ - struct GNUNET_TIME_Absolute *start_time; - - /** - * When does the sensor expire - */ - struct GNUNET_TIME_Absolute *end_time; - - /** - * Time interval to collect sensor information (e.g. every 1 min) - */ - struct GNUNET_TIME_Relative interval; - - /** - * Lifetime of an information sample after which it is deleted from storage - * If not supplied, will default to the interval value - */ - struct GNUNET_TIME_Relative lifetime; - - /** - * A set of required peer capabilities for the sensor to collect meaningful information (e.g. ipv6) - */ - char *capabilities; - - /** - * Either "gnunet-statistics" or external "process" - */ - char *source; - - /** - * Name of the GNUnet service that is the source for the gnunet-statistics entry - */ - char *gnunet_stat_service; - - /** - * Name of the gnunet-statistics entry - */ - char *gnunet_stat_name; - - /** - * Handle to statistics get request (OR NULL) - */ - struct GNUNET_STATISTICS_GetHandle *gnunet_stat_get_handle; - - /** - * Name of the external process to be executed - */ - char *ext_process; - - /** - * Arguments to be passed to the external process - */ - char *ext_args; - - /** - * Handle to the external process - */ - struct GNUNET_OS_CommandHandle *ext_cmd; - - /** - * Did we already receive a value - * from the currently running external - * proccess ? #GNUNET_YES / #GNUNET_NO - */ - int ext_cmd_value_received; - - /** - * The output datatype to be expected - */ - char *expected_datatype; - - /** - * Peer-identity of peer running collection point - */ - struct GNUNET_PeerIdentity *collection_point; - - /** - * Do we report received sensor values to collection point? - * #GNUNET_YES / #GNUNET_NO - */ - int report_values; - - /** - * Time interval to send sensor values to collection point (e.g. every 30 mins) - */ - struct GNUNET_TIME_Relative value_reporting_interval; - - /** - * Do we report anomalies to collection point? - * #GNUNET_YES / #GNUNET_NO - */ - int report_anomalies; - - /** - * Execution task (OR NULL) - */ - struct GNUNET_SCHEDULER_Task * execution_task; - - /** - * Is the sensor being executed - */ - int running; - -}; - -/** - * Anomaly report received and stored by sensor dashboard. - * Sensor name and peer id are not included because they are part of the - * peerstore key. - */ -struct GNUNET_SENSOR_DashboardAnomalyEntry -{ - - /** - * New anomaly status - */ - uint16_t anomalous; - - /** - * Percentage of neighbors reported the same anomaly - */ - float anomalous_neighbors; - -}; - -GNUNET_NETWORK_STRUCT_BEGIN -/** - * Used to communicate brief information about a sensor. - */ - struct GNUNET_SENSOR_SensorBriefMessage -{ - - /** - * GNUNET general message header. - */ - struct GNUNET_MessageHeader header; - - /** - * Size of sensor name string, allocated at position 0 after this struct. - */ - uint16_t name_size; - - /** - * First part of sensor version number - */ - uint16_t version_major; - - /** - * Second part of sensor version number - */ - uint16_t version_minor; - -}; - -/** - * Used to communicate full information about a sensor. - */ -struct GNUNET_SENSOR_SensorFullMessage -{ - - /** - * GNUNET general message header. - */ - struct GNUNET_MessageHeader header; - - /** - * Size of sensor name. - * Name allocated at position 0 after this struct. - */ - uint16_t sensorname_size; - - /** - * Size of the sensor definition file carrying full sensor information. - * The file content allocated at position 1 after this struct. - */ - uint16_t sensorfile_size; - - /** - * Name of the file (usually script) associated with this sensor. - * At the moment we only support having one file per sensor. - * The file name is allocated at position 2 after this struct. - */ - uint16_t scriptname_size; - - /** - * Size of the file (usually script) associated with this sensor. - * The file content is allocated at position 3 after this struct. - */ - uint16_t scriptfile_size; - -}; - -/** - * Used to communicate sensor values to - * collection points (SENSORDASHBAORD service) - */ -struct GNUNET_SENSOR_ValueMessage -{ - - /** - * GNUNET general message header - */ - struct GNUNET_MessageHeader header; - - /** - * Hash of sensor name - */ - struct GNUNET_HashCode sensorname_hash; - - /** - * First part of sensor version number - */ - uint16_t sensorversion_major; - - /** - * Second part of sensor version number - */ - uint16_t sensorversion_minor; - - /** - * Timestamp of recorded reading - */ - struct GNUNET_TIME_Absolute timestamp; - - /** - * Size of sensor value, allocated at poistion 0 after this struct - */ - uint16_t value_size; - -}; - -/** - * Message carrying an anomaly status change report - */ -struct GNUNET_SENSOR_AnomalyReportMessage -{ - - /** - * Hash of sensor name - */ - struct GNUNET_HashCode sensorname_hash; - - /** - * First part of sensor version number - */ - uint16_t sensorversion_major; - - /** - * Second part of sensor version name - */ - uint16_t sensorversion_minor; - - /** - * New anomaly status - */ - uint16_t anomalous; - - /** - * Percentage of neighbors reported the same anomaly - */ - float anomalous_neighbors; - -}; - -GNUNET_NETWORK_STRUCT_END -/** - * Given two version numbers as major and minor, compare them. - * - * @param v1_major First part of first version number - * @param v1_minor Second part of first version number - * @param v2_major First part of second version number - * @param v2_minor Second part of second version number - */ - int -GNUNET_SENSOR_version_compare (uint16_t v1_major, uint16_t v1_minor, - uint16_t v2_major, uint16_t v2_minor); - - -/** - * Reads sensor definitions from given sensor directory. - * - * @param sensordir Path to sensor directory. - * @return a multihashmap of loaded sensors - */ -struct GNUNET_CONTAINER_MultiHashMap * -GNUNET_SENSOR_load_all_sensors (char *sensor_dir); - - -/** - * Get path to the default directory containing the sensor definition files with - * a trailing directory separator. - * - * @return Default sensor files directory full path - */ -char * -GNUNET_SENSOR_get_default_sensor_dir (); - - -/** - * Destroys a group of sensors in a hashmap and the hashmap itself - * - * @param sensors hashmap containing the sensors - */ -void -GNUNET_SENSOR_destroy_sensors (struct GNUNET_CONTAINER_MultiHashMap *sensors); - - -struct GNUNET_SENSOR_crypto_pow_context; - -/** - * Block carrying arbitrary data + its proof-of-work + signature - */ -struct GNUNET_SENSOR_crypto_pow_block -{ - - /** - * Proof-of-work value - */ - uint64_t pow; - - /** - * Data signature - */ - struct GNUNET_CRYPTO_EddsaSignature signature; - - /** - * Size of the msg component (allocated after this struct) - */ - size_t msg_size; - - /** - * Purpose of signing. - * Data is allocated after this (timestamp, public_key, msg). - */ - struct GNUNET_CRYPTO_EccSignaturePurpose purpose; - - /** - * First part of data - timestamp - */ - struct GNUNET_TIME_Absolute timestamp; - - /** - * Second part of data - Public key - */ - struct GNUNET_CRYPTO_EddsaPublicKey public_key; - -}; - - -/** - * Continuation called with a status result. - * - * @param cls closure - * @param pow Proof-of-work value - * @param purpose Signed block (size, purpose, data) - * @param signature Signature, NULL on error - */ -typedef void (*GNUNET_SENSOR_UTIL_pow_callback) (void *cls, - struct - GNUNET_SENSOR_crypto_pow_block - * block); - - -/** - * Cancel an operation started by #GNUNET_SENSOR_crypto_pow_sign(). - * Call only before callback function passed to #GNUNET_SENSOR_crypto_pow_sign() - * is called with the result. - */ -void -GNUNET_SENSOR_crypto_pow_sign_cancel (struct GNUNET_SENSOR_crypto_pow_context - *cx); - - -/** - * Calculate proof-of-work and sign a message. - * - * @param msg Message to calculate pow and sign - * @param msg_size size of msg - * @param timestamp Timestamp to add to the message to protect against replay attacks - * @param public_key Public key of the origin peer, to protect against redirect attacks - * @param private_key Private key of the origin peer to sign the result - * @param matching_bits Number of leading zeros required in the result hash - * @param callback Callback function to call with the result - * @param callback_cls Closure for callback - * @return Operation context - */ -struct GNUNET_SENSOR_crypto_pow_context * -GNUNET_SENSOR_crypto_pow_sign (void *msg, size_t msg_size, - struct GNUNET_TIME_Absolute *timestamp, - struct GNUNET_CRYPTO_EddsaPublicKey *public_key, - struct GNUNET_CRYPTO_EddsaPrivateKey - *private_key, int matching_bits, - GNUNET_SENSOR_UTIL_pow_callback callback, - void *callback_cls); - - -/** - * Verify that proof-of-work and signature in the given block are valid. - * If all valid, a pointer to the payload within the block is set and the size - * of the payload is returned. - * - * **VERY IMPORTANT** : You will still need to verify the timestamp yourself. - * - * @param block The block received and needs to be verified - * @param matching_bits Number of leading zeros in the hash used to verify pow - * @param public_key Public key of the peer that sent this block - * @param payload Where to store the pointer to the payload - * @return Size of the payload - */ -size_t -GNUNET_SENSOR_crypto_verify_pow_sign (struct GNUNET_SENSOR_crypto_pow_block * - block, int matching_bits, - struct GNUNET_CRYPTO_EddsaPublicKey * - public_key, void **payload); - - -#if 0 /* keep Emacsens' auto-indent happy */ -{ -#endif -#ifdef __cplusplus -} -#endif - -/* ifndef GNUNET_SENSOR_UTIL_LIB_H */ -#endif - -/** @} */ /* end of group */ - -/* end of gnunet_sensor_util_lib.h */ diff --git a/src/include/gnunet_sensordashboard_service.h b/src/include/gnunet_sensordashboard_service.h deleted file mode 100644 index ffa24e3b7..000000000 --- a/src/include/gnunet_sensordashboard_service.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is part of GNUnet - Copyright (C) - - 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 . - - SPDX-License-Identifier: AGPL3.0-or-later - */ - -/** - * @author Omar Tarabai - * - * @file - * API to the sensordashboard service - * - * @defgroup sensordashboard Sensor Dashboard service - * - * @{ - */ -#ifndef GNUNET_SENSORDASHBOARD_SERVICE_H -#define GNUNET_SENSORDASHBOARD_SERVICE_H - -#include "gnunet_common.h" -#include "gnunet_util_lib.h" - -#ifdef __cplusplus -extern "C" -{ -#if 0 /* keep Emacsens' auto-indent happy */ -} -#endif -#endif - - -#if 0 /* keep Emacsens' auto-indent happy */ -{ -#endif -#ifdef __cplusplus -} -#endif - -#endif - -/** @} */ /* end of group */ diff --git a/src/include/gnunet_transport_address_service.h b/src/include/gnunet_transport_address_service.h new file mode 100644 index 000000000..86d0a423e --- /dev/null +++ b/src/include/gnunet_transport_address_service.h @@ -0,0 +1,114 @@ +/* + 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 . + + SPDX-License-Identifier: AGPL3.0-or-later +*/ + +/** + * @author Christian Grothoff + * + * @file + * Provide addresses to transport for validation + * + * @defgroup transport TRANSPORT service + * Low-level communication with other peers + * + * @see [Documentation](https://gnunet.org/transport-service) + * + * @{ + */ + +#ifndef GNUNET_TRANSPORT_ADDRESS_SERVICE_H +#define GNUNET_TRANSPORT_ADDRESS_SERVICE_H + +#ifdef __cplusplus +extern "C" +{ +#if 0 /* keep Emacsens' auto-indent happy */ +} +#endif +#endif + +#include "gnunet_util_lib.h" +#include "gnunet_nt_lib.h" + +/** + * Version number of the transport address API. + */ +#define GNUNET_TRANSPORT_ADDRESS_VERSION 0x00000000 + + +/** + * Opaque handle to the transport service for communicators. + */ +struct GNUNET_TRANSPORT_AddressHandle; + + +/** + * Connect to the transport service. + * + * @param cfg configuration to use + * @return NULL on error + */ +struct GNUNET_TRANSPORT_AddressHandle * +GNUNET_TRANSPORT_address_connect (const struct GNUNET_CONFIGURATION_Handle *cfg); + + +/** + * Disconnect from the transport service. + * + * @param ch handle returned from connect + */ +void +GNUNET_TRANSPORT_address_disconnect (struct GNUNET_TRANSPORT_AddressHandle *ch); + + +/** + * The client has learned about a possible address for peer @a pid + * (i.e. via broadcast, multicast, DHT, ...). The transport service + * should consider validating it. Note that the plugin is NOT expected + * to have verified the signature, the transport service must decide + * whether to check the signature. + * + * While the notification is sent to @a ch asynchronously, this API + * does not return a handle as the delivery of addresses is simply + * unreliable, and if @a ch is down, the data provided will simply be + * lost. + * + * @param ch communicator handle + * @param raw raw address data + * @param raw_size number of bytes in @a raw + */ +void +GNUNET_TRANSPORT_address_try (struct GNUNET_TRANSPORT_CommunicatorHandle *ch, + const void *raw, + const size_t raw_size); + + +#if 0 /* keep Emacsens' auto-indent happy */ +{ +#endif +#ifdef __cplusplus +} +#endif + +/* ifndef GNUNET_TRANSPORT_ADDRESS_SERVICE_H */ +#endif + +/** @} */ /* end of group */ + +/* end of gnunet_transport_address_service.h */ diff --git a/src/include/gnunet_transport_hello_service.h b/src/include/gnunet_transport_hello_service.h index d568c621e..58a1e9979 100644 --- a/src/include/gnunet_transport_hello_service.h +++ b/src/include/gnunet_transport_hello_service.h @@ -11,7 +11,7 @@ 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 . @@ -107,7 +107,7 @@ enum GNUNET_TRANSPORT_AddressClass * Bitmask for "any" address. */ GNUNET_TRANSPORT_AC_ANY = 65535 - + }; -- 2.25.1