GNUnet 0.21.1
nse_api.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2009, 2010, 2011, 2016 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20
26#include "platform.h"
27#include "gnunet_constants.h"
28#include "gnunet_arm_service.h"
29#include "gnunet_protocols.h"
30#include "gnunet_util_lib.h"
31#include "gnunet_nse_service.h"
32#include "nse.h"
33
34#define LOG(kind, ...) GNUNET_log_from (kind, "nse-api", __VA_ARGS__)
35
40{
45
50
55
60
65
70};
71
72
78static void
79reconnect (void *cls);
80
81
91static void
92mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
93{
94 struct GNUNET_NSE_Handle *h = cls;
95
96 (void) error;
98 h->mq = NULL;
100 GNUNET_SCHEDULER_add_delayed (h->reconnect_delay, &reconnect, h);
101 h->reconnect_delay = GNUNET_TIME_STD_BACKOFF (h->reconnect_delay);
102}
103
104
112static void
113handle_estimate (void *cls, const struct GNUNET_NSE_ClientMessage *client_msg)
114{
115 struct GNUNET_NSE_Handle *h = cls;
116
117 h->reconnect_delay = GNUNET_TIME_UNIT_ZERO;
118 h->recv_cb (h->recv_cb_cls,
120 GNUNET_ntoh_double (client_msg->size_estimate),
121 GNUNET_ntoh_double (client_msg->std_deviation));
122}
123
124
130static void
131reconnect (void *cls)
132{
133 struct GNUNET_NSE_Handle *h = cls;
135 { GNUNET_MQ_hd_fixed_size (estimate,
138 h),
141 struct GNUNET_MQ_Envelope *env;
142
143 h->reconnect_task = NULL;
145 "Connecting to network size estimation service.\n");
146 GNUNET_assert (NULL == h->mq);
148 if (NULL == h->mq)
149 return;
152}
153
154
163struct GNUNET_NSE_Handle *
166 void *func_cls)
167{
168 struct GNUNET_NSE_Handle *h;
169
170 GNUNET_assert (NULL != func);
171 h = GNUNET_new (struct GNUNET_NSE_Handle);
172 h->cfg = cfg;
173 h->recv_cb = func;
174 h->recv_cb_cls = func_cls;
175 h->reconnect_delay = GNUNET_TIME_UNIT_ZERO;
176 reconnect (h);
177 if (NULL == h->mq)
178 {
179 GNUNET_free (h);
180 return NULL;
181 }
182 return h;
183}
184
185
191void
193{
194 if (NULL != h->reconnect_task)
195 {
197 h->reconnect_task = NULL;
198 }
199 if (NULL != h->mq)
200 {
202 h->mq = NULL;
203 }
204 GNUNET_free (h);
205}
206
207
208/* end of nse_api.c */
struct GNUNET_MQ_MessageHandlers handlers[]
Definition: 003.c:1
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:109
API to retrieve the current network size estimate.
Constants for network protocols.
struct GNUNET_MQ_Handle * GNUNET_CLIENT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name, const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_ErrorHandler error_handler, void *error_handler_cls)
Create a message queue to connect to a GNUnet service.
Definition: client.c:1057
double GNUNET_ntoh_double(double d)
Convert double to host byte order.
Definition: common_endian.c:83
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
GNUNET_MQ_Error
Error codes for the queue.
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:304
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:78
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:683
void GNUNET_NSE_disconnect(struct GNUNET_NSE_Handle *h)
Disconnect from network size estimation service.
Definition: nse_api.c:192
void(* GNUNET_NSE_Callback)(void *cls, struct GNUNET_TIME_Absolute timestamp, double logestimate, double std_dev)
Callback to call when network size estimate is updated.
struct GNUNET_NSE_Handle * GNUNET_NSE_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_NSE_Callback func, void *func_cls)
Connect to the network size estimation service.
Definition: nse_api.c:164
#define GNUNET_MESSAGE_TYPE_NSE_START
client->service message indicating start
#define GNUNET_MESSAGE_TYPE_NSE_ESTIMATE
service->client message indicating
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:981
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1278
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:737
#define GNUNET_TIME_UNIT_ZERO
Relative time zero.
#define GNUNET_TIME_STD_BACKOFF(r)
Perform our standard exponential back-off calculation, starting at 1 ms and then going by a factor of...
Common type definitions for the network size estimation service and API.
static void handle_estimate(void *cls, const struct GNUNET_NSE_ClientMessage *client_msg)
Type of a function to call when we receive a message from the service.
Definition: nse_api.c:113
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
Generic error handler, called with the appropriate error code and the same closure specified at the c...
Definition: nse_api.c:92
static void reconnect(void *cls)
Try again to connect to network size estimation service.
Definition: nse_api.c:131
#define LOG(kind,...)
Definition: nse_api.c:34
struct GNUNET_MQ_Handle * mq
Our connection to the ARM service.
Definition: arm_api.c:107
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration that we are using.
Definition: arm_api.c:112
struct GNUNET_SCHEDULER_Task * reconnect_task
ID of the reconnect task (if any).
Definition: arm_api.c:147
Handle to a message queue.
Definition: mq.c:87
Message handler for a specific message type.
Header for all communications.
Network size estimate sent from the service to clients.
Definition: nse.h:43
double size_estimate
The current estimated network size.
Definition: nse.h:62
struct GNUNET_TIME_AbsoluteNBO timestamp
Timestamp at which the server received the message.
Definition: nse.h:57
double std_deviation
The standard deviation (rounded down to the nearest integer) of size estimations.
Definition: nse.h:69
Handle for talking with the NSE service.
Definition: nse_api.c:40
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration to use.
Definition: nse_api.c:44
struct GNUNET_TIME_Relative reconnect_delay
Time for next connect retry.
Definition: nse_api.c:59
struct GNUNET_MQ_Handle * mq
Message queue (if available).
Definition: nse_api.c:49
void * recv_cb_cls
Closure to pass to recv_cb callback.
Definition: nse_api.c:69
struct GNUNET_SCHEDULER_Task * reconnect_task
Task doing exponential back-off trying to reconnect.
Definition: nse_api.c:54
GNUNET_NSE_Callback recv_cb
Callback function to call when message is received.
Definition: nse_api.c:64
Entry in list of pending tasks.
Definition: scheduler.c:136
Time for relative time used by GNUnet, in microseconds.