Merge branch 'master' of ssh://gnunet.org/gnunet
[oweals/gnunet.git] / src / dv / gnunet-service-dv.c
index 3b79b474f9004d20aa9b708a2773f78eaa5f48ac..3fbd0cc030459710be5c81784a1197997342156d 100644 (file)
@@ -134,7 +134,7 @@ struct DirectNeighbor
   /**
    * Identity of the peer.
    */
-  const struct GNUNET_PeerIdentity *peer;
+  struct GNUNET_PeerIdentity peer;
 
   /**
    * Session ID we use whenever we create a set union with
@@ -323,7 +323,7 @@ static const struct GNUNET_CONFIGURATION_Handle *cfg;
  * 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.
@@ -410,9 +410,9 @@ send_data_to_plugin (const struct GNUNET_MessageHeader *message,
   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);
 }
 
@@ -425,9 +425,9 @@ send_data_to_plugin (const struct GNUNET_MessageHeader *message,
 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);
 }
 
 
@@ -678,7 +678,7 @@ build_set (void *cls)
     /* 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);
@@ -701,7 +701,7 @@ build_set (void *cls)
                     &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 */
@@ -734,26 +734,26 @@ handle_direct_connect (struct DirectNeighbor *neighbor)
 
   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,
@@ -765,7 +765,7 @@ handle_direct_connect (struct DirectNeighbor *neighbor)
   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,
@@ -799,7 +799,7 @@ handle_direct_connect (struct DirectNeighbor *neighbor)
     {
       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,
@@ -851,10 +851,10 @@ handle_core_connect (void *cls,
              "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;
@@ -1056,19 +1056,12 @@ handle_direct_disconnect (struct DirectNeighbor *neighbor)
   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,
@@ -1189,7 +1182,7 @@ handle_ats_update (void *cls,
   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 */
@@ -1353,16 +1346,19 @@ check_target_added (void *cls,
  *
  * @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)
@@ -1395,7 +1391,11 @@ handle_set_union_result (void *cls,
       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 */
@@ -1515,7 +1515,7 @@ listen_set_union (void *cls,
     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);
@@ -1530,6 +1530,7 @@ listen_set_union (void *cls,
                                        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;
@@ -1560,6 +1561,7 @@ initiate_set_union (void *cls)
                                          &neighbor->real_session_id,
                                          NULL,
                                          GNUNET_SET_RESULT_ADDED,
+                                         (struct GNUNET_SET_Option[]) {{ 0 }},
                                          &handle_set_union_result,
                                          neighbor);
   neighbor->consensus_insertion_offset = 0;
@@ -1581,7 +1583,7 @@ check_dv_route_message (void *cls,
                        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);
@@ -1595,7 +1597,7 @@ check_dv_route_message (void *cls,
   }
   return GNUNET_OK;
 }
-  
+
 
 /**
  * Core handler for DV data messages.  Whatever this message
@@ -1610,9 +1612,10 @@ static void
 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;
@@ -1623,7 +1626,7 @@ handle_dv_route_message (void *cls,
 
   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);
@@ -1662,13 +1665,6 @@ handle_dv_route_message (void *cls,
          (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);
@@ -1708,13 +1704,6 @@ handle_dv_route_message (void *cls,
                 "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);
@@ -1737,9 +1726,9 @@ handle_dv_route_message (void *cls,
                                             &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",
@@ -1753,12 +1742,12 @@ handle_dv_route_message (void *cls,
   }
   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,
@@ -1767,36 +1756,50 @@ handle_dv_route_message (void *cls,
 
 
 /**
- * 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)
@@ -1809,7 +1812,7 @@ handle_dv_send_message (void *cls,
     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,
@@ -1823,7 +1826,7 @@ handle_dv_send_message (void *cls,
                   &my_identity,
                   &msg->target,
                   payload);
-  GNUNET_SERVER_receive_done (client, GNUNET_OK);
+  GNUNET_SERVICE_client_continue (client);
 }
 
 
@@ -1838,7 +1841,7 @@ cleanup_neighbor (struct DirectNeighbor *neighbor)
   handle_direct_disconnect (neighbor);
   GNUNET_assert (GNUNET_YES ==
                 GNUNET_CONTAINER_multipeermap_remove (direct_neighbors,
-                                                      neighbor->peer,
+                                                      &neighbor->peer,
                                                       neighbor));
   GNUNET_free (neighbor);
 }
@@ -1937,7 +1940,7 @@ shutdown_task (void *cls)
 
   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;
@@ -1951,7 +1954,7 @@ shutdown_task (void *cls)
   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++)
   {
@@ -1970,7 +1973,7 @@ shutdown_task (void *cls)
 /**
  * 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)
@@ -1980,20 +1983,17 @@ notify_client_about_route (void *cls,
                            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;
 }
 
@@ -2008,11 +2008,13 @@ notify_client_about_route (void *cls,
  */
 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,
                                         &notify_client_about_route,
                                         client);
@@ -2040,37 +2042,28 @@ core_init (void *cls,
  * 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,
@@ -2084,39 +2077,70 @@ run (void *cls,
                                     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 */