/**
* Identity of the peer.
*/
- const struct GNUNET_PeerIdentity *peer;
+ struct GNUNET_PeerIdentity peer;
/**
* Session ID we use whenever we create a set union with
* Hopefully this client will never change, although if the plugin
* dies and returns for some reason it may happen.
*/
-static struct GNUNET_SERVER_NotificationContext *nc;
+static struct GNUNET_NotificationContext *nc;
/**
* Handle for the statistics service.
received_msg->distance = htonl (distance);
received_msg->sender = *origin;
GNUNET_memcpy (&received_msg[1], message, ntohs (message->size));
- GNUNET_SERVER_notification_context_broadcast (nc,
- &received_msg->header,
- GNUNET_YES);
+ GNUNET_notification_context_broadcast (nc,
+ &received_msg->header,
+ GNUNET_YES);
GNUNET_free (received_msg);
}
static void
send_control_to_plugin (const struct GNUNET_MessageHeader *message)
{
- GNUNET_SERVER_notification_context_broadcast (nc,
- message,
- GNUNET_NO);
+ GNUNET_notification_context_broadcast (nc,
+ message,
+ GNUNET_NO);
}
/* we have added all elements to the set, run the operation */
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Finished building my SET for peer `%s' with %u elements, committing\n",
- GNUNET_i2s (neighbor->peer),
+ GNUNET_i2s (&neighbor->peer),
neighbor->consensus_elements);
GNUNET_SET_commit (neighbor->set_op,
neighbor->my_set);
&my_identity,
sizeof (my_identity))) &&
(0 != memcmp (&target->peer,
- neighbor->peer,
+ &neighbor->peer,
sizeof (struct GNUNET_PeerIdentity))) )
{
/* Add target if it is not the neighbor or this peer */
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Direct connection to %s established, routing table exchange begins.\n",
- GNUNET_i2s (neighbor->peer));
+ GNUNET_i2s (&neighbor->peer));
GNUNET_STATISTICS_update (stats,
"# peers connected (1-hop)",
1, GNUNET_NO);
route = GNUNET_CONTAINER_multipeermap_get (all_routes,
- neighbor->peer);
+ &neighbor->peer);
if (NULL != route)
{
GNUNET_assert (GNUNET_YES ==
GNUNET_CONTAINER_multipeermap_remove (all_routes,
- neighbor->peer,
+ &neighbor->peer,
route));
- send_disconnect_to_plugin (neighbor->peer);
+ send_disconnect_to_plugin (&neighbor->peer);
release_route (route);
GNUNET_free (route);
}
neighbor->direct_route = GNUNET_new (struct Route);
neighbor->direct_route->next_hop = neighbor;
- neighbor->direct_route->target.peer = *neighbor->peer;
+ neighbor->direct_route->target.peer = neighbor->peer;
allocate_route (neighbor->direct_route, DIRECT_NEIGHBOR_COST);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
GNUNET_CRYPTO_hash (&my_identity,
sizeof (my_identity),
&h1);
- GNUNET_CRYPTO_hash (neighbor->peer,
+ GNUNET_CRYPTO_hash (&neighbor->peer,
sizeof (struct GNUNET_PeerIdentity),
&h2);
GNUNET_CRYPTO_hash_xor (&h1,
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Starting SET listen operation with peer `%s'\n",
- GNUNET_i2s(&neighbor->peer));
+ GNUNET_i2s (&neighbor->peer));
neighbor->listen_handle = GNUNET_SET_listen (cfg,
GNUNET_SET_OPERATION_UNION,
&neighbor->real_session_id,
"Core connected to %s (distance unknown)\n",
GNUNET_i2s (peer));
neighbor = GNUNET_new (struct DirectNeighbor);
- neighbor->peer = peer;
+ neighbor->peer = *peer;
GNUNET_assert (GNUNET_YES ==
GNUNET_CONTAINER_multipeermap_put (direct_neighbors,
- neighbor->peer,
+ &neighbor->peer,
neighbor,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
neighbor->connected = GNUNET_YES;
GNUNET_CONTAINER_multipeermap_iterate (all_routes,
&cull_routes,
neighbor);
- if (NULL != neighbor->cth)
- {
- GNUNET_CORE_notify_transmit_ready_cancel (neighbor->cth);
- neighbor->cth = NULL;
- }
-
if (NULL != neighbor->direct_route)
{
release_route (neighbor->direct_route);
GNUNET_free (neighbor->direct_route);
neighbor->direct_route = NULL;
}
-
if (NULL != neighbor->neighbor_table_consensus)
{
GNUNET_CONTAINER_multipeermap_iterate (neighbor->neighbor_table_consensus,
neighbor->peer = address->peer;
GNUNET_assert (GNUNET_YES ==
GNUNET_CONTAINER_multipeermap_put (direct_neighbors,
- &address->peer,
+ &neighbor->peer,
neighbor,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
neighbor->connected = GNUNET_NO; /* not yet */
*
* @param cls the `struct DirectNeighbor` we're building the consensus with
* @param element a result element, only valid if status is #GNUNET_SET_STATUS_OK
+ * @param current_size current set size
* @param status see `enum GNUNET_SET_Status`
*/
static void
handle_set_union_result (void *cls,
const struct GNUNET_SET_Element *element,
+ uint64_t current_size,
enum GNUNET_SET_Status status)
{
struct DirectNeighbor *neighbor = cls;
struct DirectNeighbor *dn;
struct Target *target;
+ const struct Target *ctarget;
char *status_str;
switch (status)
GNUNET_break_op (0);
return;
}
- if ( (NULL != (dn = GNUNET_CONTAINER_multipeermap_get (direct_neighbors, &((struct Target *) element->data)->peer))) && (DIRECT_NEIGHBOR_COST == dn->distance) )
+ ctarget = element->data;
+ if ( (NULL !=
+ (dn = GNUNET_CONTAINER_multipeermap_get (direct_neighbors,
+ &ctarget->peer))) &&
+ (DIRECT_NEIGHBOR_COST == dn->distance) )
{
/* this is a direct neighbor of ours, we do not care about routes
to this peer */
return; /* why??? */
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Starting to create consensus with %s\n",
- GNUNET_i2s (neighbor->peer));
+ GNUNET_i2s (&neighbor->peer));
if (NULL != neighbor->set_op)
{
GNUNET_SET_operation_cancel (neighbor->set_op);
GNUNET_SET_OPERATION_UNION);
neighbor->set_op = GNUNET_SET_accept (request,
GNUNET_SET_RESULT_ADDED,
+ (struct GNUNET_SET_Option[]) {{ 0 }},
&handle_set_union_result,
neighbor);
neighbor->consensus_insertion_offset = 0;
&neighbor->real_session_id,
NULL,
GNUNET_SET_RESULT_ADDED,
+ (struct GNUNET_SET_Option[]) {{ 0 }},
&handle_set_union_result,
neighbor);
neighbor->consensus_insertion_offset = 0;
const struct RouteMessage *rm)
{
const struct GNUNET_MessageHeader *payload;
-
+
if (ntohs (rm->header.size) < sizeof (struct RouteMessage) + sizeof (struct GNUNET_MessageHeader))
{
GNUNET_break_op (0);
}
return GNUNET_OK;
}
-
+
/**
* Core handler for DV data messages. Whatever this message
handle_dv_route_message (void *cls,
const struct RouteMessage *rm)
{
+ struct DirectNeighbor *neighbor = cls;
const struct GNUNET_MessageHeader *payload;
struct Route *route;
- struct DirectNeighbor *neighbor;
+ struct DirectNeighbor *nneighbor;
struct DirectNeighbor *dn;
struct Target *target;
uint32_t distance;
distance = ntohl (rm->distance);
payload = (const struct GNUNET_MessageHeader *) &rm[1];
- strncpy (prev, GNUNET_i2s (peer), 4);
+ strncpy (prev, GNUNET_i2s (&neighbor->peer), 4);
strncpy (me, GNUNET_i2s (&my_identity), 4);
strncpy (src, GNUNET_i2s (&rm->sender), 4);
strncpy (dst, GNUNET_i2s (&rm->target), 4);
(distance < DEFAULT_FISHEYE_DEPTH) )
{
/* don't have reverse route yet, learn it! */
- neighbor = GNUNET_CONTAINER_multipeermap_get (direct_neighbors,
- peer);
- if (NULL == neighbor)
- {
- GNUNET_break (0);
- return;
- }
target = GNUNET_new (struct Target);
target->peer = rm->sender;
target->distance = htonl (distance);
"Learning sender %s at distance %u from forwarding!\n",
GNUNET_i2s (&rm->sender),
1 + distance);
- neighbor = GNUNET_CONTAINER_multipeermap_get (direct_neighbors,
- peer);
- if (NULL == neighbor)
- {
- GNUNET_break (0);
- return;
- }
target = GNUNET_new (struct Target);
target->peer = rm->sender;
target->distance = htonl (distance);
&rm->target);
if (NULL == route)
{
- neighbor = GNUNET_CONTAINER_multipeermap_get (direct_neighbors,
+ nneighbor = GNUNET_CONTAINER_multipeermap_get (direct_neighbors,
&rm->target);
- if (NULL == neighbor)
+ if (NULL == nneighbor)
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"No route to %s, not routing %u bytes!\n",
}
else
{
- neighbor = route->next_hop;
+ nneighbor = route->next_hop;
}
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Forwarding message to %s\n",
- GNUNET_i2s (neighbor->peer));
- forward_payload (neighbor,
+ GNUNET_i2s (&nneighbor->peer));
+ forward_payload (nneighbor,
distance + 1,
&rm->sender,
&rm->target,
/**
- * Service server's handler for message send requests (which come
- * bubbling up to us through the DV plugin).
+ * Check that @a msg is well-formed
*
- * @param cls closure
- * @param client identification of the client
+ * @param cls identification of the client
* @param message the actual message
+ * @return #GNUNET_OK if @a msg is well-formed
*/
-static void
-handle_dv_send_message (void *cls,
- struct GNUNET_SERVER_Client *client,
- const struct GNUNET_MessageHeader *message)
+static int
+check_dv_send_message (void *cls,
+ const struct GNUNET_DV_SendMessage *msg)
{
- struct Route *route;
- const struct GNUNET_DV_SendMessage *msg;
const struct GNUNET_MessageHeader *payload;
- if (ntohs (message->size) < sizeof (struct GNUNET_DV_SendMessage) + sizeof (struct GNUNET_MessageHeader))
+ if (ntohs (msg->header.size) < sizeof (struct GNUNET_DV_SendMessage) +
+ sizeof (struct GNUNET_MessageHeader))
{
GNUNET_break (0);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
+ return GNUNET_SYSERR;
}
- msg = (const struct GNUNET_DV_SendMessage *) message;
payload = (const struct GNUNET_MessageHeader *) &msg[1];
- if (ntohs (message->size) != sizeof (struct GNUNET_DV_SendMessage) + ntohs (payload->size))
+ if (ntohs (msg->header.size) != sizeof (struct GNUNET_DV_SendMessage) + ntohs (payload->size))
{
GNUNET_break (0);
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
- return;
+ return GNUNET_SYSERR;
}
+ return GNUNET_OK;
+}
+
+
+/**
+ * Service server's handler for message send requests (which come
+ * bubbling up to us through the DV plugin).
+ *
+ * @param cls identification of the client
+ * @param message the actual message
+ */
+static void
+handle_dv_send_message (void *cls,
+ const struct GNUNET_DV_SendMessage *msg)
+{
+ struct GNUNET_SERVICE_Client *client = cls;
+ struct Route *route;
+ const struct GNUNET_MessageHeader *payload;
+
+ payload = (const struct GNUNET_MessageHeader *) &msg[1];
route = GNUNET_CONTAINER_multipeermap_get (all_routes,
&msg->target);
if (NULL == route)
GNUNET_STATISTICS_update (stats,
"# local messages discarded (no route)",
1, GNUNET_NO);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
+ GNUNET_SERVICE_client_continue (client);
return;
}
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
&my_identity,
&msg->target,
payload);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
+ GNUNET_SERVICE_client_continue (client);
}
handle_direct_disconnect (neighbor);
GNUNET_assert (GNUNET_YES ==
GNUNET_CONTAINER_multipeermap_remove (direct_neighbors,
- neighbor->peer,
+ &neighbor->peer,
neighbor));
GNUNET_free (neighbor);
}
in_shutdown = GNUNET_YES;
GNUNET_assert (NULL != core_api);
- GNUNET_CORE_disconnecT (core_api);
+ GNUNET_CORE_disconnect (core_api);
core_api = NULL;
GNUNET_ATS_performance_done (ats);
ats = NULL;
GNUNET_CONTAINER_multipeermap_destroy (all_routes);
GNUNET_STATISTICS_destroy (stats, GNUNET_NO);
stats = NULL;
- GNUNET_SERVER_notification_context_destroy (nc);
+ GNUNET_notification_context_destroy (nc);
nc = NULL;
for (i=0;i<DEFAULT_FISHEYE_DEPTH;i++)
{
/**
* Notify newly connected client about an existing route.
*
- * @param cls the `struct GNUNET_SERVER_Client *`
+ * @param cls the `struct GNUNET_SERVICE_Client *`
* @param key peer identity
* @param value the `struct Route *`
* @return #GNUNET_OK (continue to iterate)
const struct GNUNET_PeerIdentity *key,
void *value)
{
- struct GNUNET_SERVER_Client *client = cls;
+ struct GNUNET_SERVICE_Client *client = cls;
struct Route *route = value;
- struct GNUNET_DV_ConnectMessage cm;
-
- memset (&cm, 0, sizeof (cm));
- cm.header.size = htons (sizeof (cm));
- cm.header.type = htons (GNUNET_MESSAGE_TYPE_DV_CONNECT);
- cm.distance = htonl (route->target.distance);
- cm.peer = route->target.peer;
-
- GNUNET_SERVER_notification_context_unicast (nc,
- client,
- &cm.header,
- GNUNET_NO);
+ struct GNUNET_MQ_Envelope *env;
+ struct GNUNET_DV_ConnectMessage *cm;
+
+ env = GNUNET_MQ_msg (cm,
+ GNUNET_MESSAGE_TYPE_DV_CONNECT);
+ cm->distance = htonl (route->target.distance);
+ cm->peer = route->target.peer;
+ GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client),
+ env);
return GNUNET_OK;
}
*/
static void
handle_start (void *cls,
- struct GNUNET_SERVER_Client *client,
const struct GNUNET_MessageHeader *message)
{
- GNUNET_SERVER_notification_context_add (nc, client);
- GNUNET_SERVER_receive_done (client, GNUNET_OK);
+ struct GNUNET_SERVICE_Client *client = cls;
+
+ GNUNET_notification_context_add (nc,
+ GNUNET_SERVICE_client_get_mq (client));
+ GNUNET_SERVICE_client_continue (client);
GNUNET_CONTAINER_multipeermap_iterate (all_routes,
¬ify_client_about_route,
client);
* Process dv requests.
*
* @param cls closure
- * @param server the initialized server
* @param c configuration to use
+ * @param service the initialized service
*/
static void
run (void *cls,
- struct GNUNET_SERVER_Handle *server,
- const struct GNUNET_CONFIGURATION_Handle *c)
+ const struct GNUNET_CONFIGURATION_Handle *c,
+ struct GNUNET_SERVICE_Handle *service)
{
- GNUNET_MQ_hd_var_size (dv_route_message,
- GNUNET_MESSAGE_TYPE_DV_ROUTE,
- struct RouteMessage);
struct GNUNET_MQ_MessageHandler core_handlers[] = {
- make_dv_route_message_handler (NULL),
+ GNUNET_MQ_hd_var_size (dv_route_message,
+ GNUNET_MESSAGE_TYPE_DV_ROUTE,
+ struct RouteMessage,
+ NULL),
GNUNET_MQ_handler_end ()
};
- static struct GNUNET_SERVER_MessageHandler plugin_handlers[] = {
- {&handle_start, NULL,
- GNUNET_MESSAGE_TYPE_DV_START,
- sizeof (struct GNUNET_MessageHeader) },
- { &handle_dv_send_message, NULL,
- GNUNET_MESSAGE_TYPE_DV_SEND,
- 0},
- {NULL, NULL, 0, 0}
- };
in_shutdown = GNUNET_NO;
cfg = c;
direct_neighbors = GNUNET_CONTAINER_multipeermap_create (128,
GNUNET_NO);
all_routes = GNUNET_CONTAINER_multipeermap_create (65536,
GNUNET_NO);
- core_api = GNUNET_CORE_connecT (cfg,
+ core_api = GNUNET_CORE_connect (cfg,
NULL,
&core_init,
&handle_core_connect,
NULL);
if (NULL == ats)
{
- GNUNET_CORE_disconnecT (core_api);
+ GNUNET_CORE_disconnect (core_api);
core_api = NULL;
return;
}
- nc = GNUNET_SERVER_notification_context_create (server,
- MAX_QUEUE_SIZE_PLUGIN);
+ nc = GNUNET_notification_context_create (MAX_QUEUE_SIZE_PLUGIN);
stats = GNUNET_STATISTICS_create ("dv",
cfg);
- GNUNET_SERVER_add_handlers (server,
- plugin_handlers);
GNUNET_SCHEDULER_add_shutdown (&shutdown_task,
NULL);
}
/**
- * The main function for the dv service.
+ * Callback called when a client connects to the service.
*
- * @param argc number of arguments from the command line
- * @param argv command line arguments
- * @return 0 ok, 1 on error
+ * @param cls closure for the service
+ * @param c the new client that connected to the service
+ * @param mq the message queue used to send messages to the client
+ * @return @a c
*/
-int
-main (int argc,
- char *const *argv)
+static void *
+client_connect_cb (void *cls,
+ struct GNUNET_SERVICE_Client *c,
+ struct GNUNET_MQ_Handle *mq)
{
- return (GNUNET_OK ==
- GNUNET_SERVICE_run (argc,
- argv,
- "dv",
- GNUNET_SERVICE_OPTION_NONE,
- &run,
- NULL)) ? 0 : 1;
+ return c;
}
+
+/**
+ * Callback called when a client disconnected from the service
+ *
+ * @param cls closure for the service
+ * @param c the client that disconnected
+ * @param internal_cls should be equal to @a c
+ */
+static void
+client_disconnect_cb (void *cls,
+ struct GNUNET_SERVICE_Client *c,
+ void *internal_cls)
+{
+ GNUNET_assert (c == internal_cls);
+}
+
+
+/**
+ * Define "main" method using service macro.
+ */
+GNUNET_SERVICE_MAIN
+("dv",
+ GNUNET_SERVICE_OPTION_NONE,
+ &run,
+ &client_connect_cb,
+ &client_disconnect_cb,
+ NULL,
+ GNUNET_MQ_hd_fixed_size (start,
+ GNUNET_MESSAGE_TYPE_DV_START,
+ struct GNUNET_MessageHeader,
+ NULL),
+ GNUNET_MQ_hd_var_size (dv_send_message,
+ GNUNET_MESSAGE_TYPE_DV_SEND,
+ struct GNUNET_DV_SendMessage,
+ NULL),
+ GNUNET_MQ_handler_end ());
+
+
/* end of gnunet-service-dv.c */