wlan receive implemented
[oweals/gnunet.git] / src / hostlist / hostlist-server.c
index 1f8a7af7fe00eb1cad48b7d8a542ef55344a50dd..95272a555697f28a9b4c247a7340abc36ea572a6 100644 (file)
@@ -4,7 +4,7 @@
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
@@ -49,11 +49,6 @@ static struct MHD_Daemon *daemon_handle_v4;
  */
 static const struct GNUNET_CONFIGURATION_Handle *cfg;
 
  */
 static const struct GNUNET_CONFIGURATION_Handle *cfg;
 
-/**
- * Our scheduler.
- */
-static struct GNUNET_SCHEDULER_Handle *sched;
-
 /**
  * For keeping statistics.
  */ 
 /**
  * For keeping statistics.
  */ 
@@ -62,12 +57,12 @@ static struct GNUNET_STATISTICS_Handle *stats;
 /**
  * Handle to the core service (NULL until we've connected to it).
  */
 /**
  * Handle to the core service (NULL until we've connected to it).
  */
-struct GNUNET_CORE_Handle *core;
+static struct GNUNET_CORE_Handle *core;
 
 /**
  * Handle to the peerinfo notify service (NULL until we've connected to it).
  */
 
 /**
  * Handle to the peerinfo notify service (NULL until we've connected to it).
  */
-struct GNUNET_PEERINFO_NotifyContext *notify;
+static struct GNUNET_PEERINFO_NotifyContext *notify;
 
 /**
  * Our primary task for IPv4.
 
 /**
  * Our primary task for IPv4.
@@ -109,11 +104,6 @@ struct HostSet
  */
 static int advertising;
 
  */
 static int advertising;
 
-/**
- * How many times was the hostlist advertised?
- */
-static uint64_t hostlist_adv_count;
-
 /**
  * Buffer for the hostlist address
  */
 /**
  * Buffer for the hostlist address
  */
@@ -163,11 +153,12 @@ static int
 check_has_addr (void *cls,
                const char *tname,
                struct GNUNET_TIME_Absolute expiration,
 check_has_addr (void *cls,
                const char *tname,
                struct GNUNET_TIME_Absolute expiration,
-               const void *addr, size_t addrlen)
+               const void *addr,
+               uint16_t addrlen)
 {
   int *arg = cls;
 
 {
   int *arg = cls;
 
-  if (GNUNET_TIME_absolute_get_remaining (expiration).value == 0)
+  if (GNUNET_TIME_absolute_get_remaining (expiration).rel_value == 0)
     {
       GNUNET_STATISTICS_update (stats,
                                gettext_noop("expired addresses encountered"),
     {
       GNUNET_STATISTICS_update (stats,
                                gettext_noop("expired addresses encountered"),
@@ -187,8 +178,7 @@ check_has_addr (void *cls,
 static void
 host_processor (void *cls,
                const struct GNUNET_PeerIdentity * peer,
 static void
 host_processor (void *cls,
                const struct GNUNET_PeerIdentity * peer,
-                const struct GNUNET_HELLO_Message *hello,
-               uint32_t trust)
+                const struct GNUNET_HELLO_Message *hello)
 {
   struct HostSet *results = cls;
   size_t old;
 {
   struct HostSet *results = cls;
   size_t old;
@@ -228,7 +218,7 @@ host_processor (void *cls,
              "HELLO",
              GNUNET_i2s (peer));
 #endif
              "HELLO",
              GNUNET_i2s (peer));
 #endif
-  if (old + s >= GNUNET_MAX_MALLOC_CHECKED)
+  if ( (old + s >= GNUNET_MAX_MALLOC_CHECKED) || (old + s >= MAX_BYTES_PER_HOSTLISTS) )
     {
       GNUNET_STATISTICS_update (stats,
                                gettext_noop("bytes not included in hostlist (size limit)"),
     {
       GNUNET_STATISTICS_update (stats,
                                gettext_noop("bytes not included in hostlist (size limit)"),
@@ -236,10 +226,12 @@ host_processor (void *cls,
                                GNUNET_NO);
       return; /* too large, skip! */
     }
                                GNUNET_NO);
       return; /* too large, skip! */
     }
+#if DEBUG_HOSTLIST_SERVER
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
              "Adding peer `%s' to hostlist (%u bytes)\n",
              GNUNET_i2s (peer),
              (unsigned int) s);
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
              "Adding peer `%s' to hostlist (%u bytes)\n",
              GNUNET_i2s (peer),
              (unsigned int) s);
+#endif
   GNUNET_array_grow (results->data,
                      results->size,
                      old + s);
   GNUNET_array_grow (results->data,
                      results->size,
                      old + s);
@@ -342,6 +334,8 @@ access_handler_callback (void *cls,
 static size_t
 adv_transmit_ready ( void *cls, size_t size, void *buf)
 {
 static size_t
 adv_transmit_ready ( void *cls, size_t size, void *buf)
 {
+  static uint64_t hostlist_adv_count;
+
   size_t transmission_size;
   size_t uri_size; /* Including \0 termination! */
   struct GNUNET_MessageHeader header;
   size_t transmission_size;
   size_t uri_size; /* Including \0 termination! */
   struct GNUNET_MessageHeader header;
@@ -366,10 +360,13 @@ adv_transmit_ready ( void *cls, size_t size, void *buf)
              "Sent advertisement message: Copied %u bytes into buffer!\n", 
              (unsigned int) transmission_size);
   hostlist_adv_count++;
              "Sent advertisement message: Copied %u bytes into buffer!\n", 
              (unsigned int) transmission_size);
   hostlist_adv_count++;
-  GNUNET_STATISTICS_set (stats,
-                         gettext_noop("# hostlist advertisements send"),
-                         hostlist_adv_count,
-                         GNUNET_NO);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              " # Sent advertisement message: %u\n",
+              hostlist_adv_count);
+  GNUNET_STATISTICS_update (stats,
+                           gettext_noop("# hostlist advertisements send"),
+                           1,
+                           GNUNET_NO);
   return transmission_size;
 }
 
   return transmission_size;
 }
 
@@ -379,15 +376,13 @@ adv_transmit_ready ( void *cls, size_t size, void *buf)
  *
  * @param cls closure
  * @param peer peer identity this notification is about
  *
  * @param cls closure
  * @param peer peer identity this notification is about
- * @param latency reported latency of the connection with 'other'
- * @param distance reported distance (DV) to 'other'
+ * @param atsi performance data
  */
 static void
 connect_handler (void *cls,
                  const struct
                  GNUNET_PeerIdentity * peer,
  */
 static void
 connect_handler (void *cls,
                  const struct
                  GNUNET_PeerIdentity * peer,
-                 struct GNUNET_TIME_Relative latency,
-                 uint32_t distance)
+                const struct GNUNET_TRANSPORT_ATS_Information *atsi)
 {
   size_t size;
 
 {
   size_t size;
 
@@ -396,7 +391,7 @@ connect_handler (void *cls,
   if (hostlist_uri == NULL)
     return;
   size = strlen (hostlist_uri) + 1;
   if (hostlist_uri == NULL)
     return;
   size = strlen (hostlist_uri) + 1;
-  if (size + sizeof (struct GNUNET_MessageHeader) > GNUNET_SERVER_MAX_MESSAGE_SIZE)
+  if (size + sizeof (struct GNUNET_MessageHeader) >= GNUNET_SERVER_MAX_MESSAGE_SIZE)
     {
       GNUNET_break (0);
       return;
     {
       GNUNET_break (0);
       return;
@@ -444,23 +439,21 @@ disconnect_handler (void *cls,
  * @param cls closure (not used)
  * @param peer potential peer to connect to
  * @param hello HELLO for this peer (or NULL)
  * @param cls closure (not used)
  * @param peer potential peer to connect to
  * @param hello HELLO for this peer (or NULL)
- * @param trust how much we trust the peer (not used)
  */
 static void
 process_notify (void *cls,
                 const struct GNUNET_PeerIdentity *peer,
  */
 static void
 process_notify (void *cls,
                 const struct GNUNET_PeerIdentity *peer,
-                const struct GNUNET_HELLO_Message *hello,
-                uint32_t trust)
+                const struct GNUNET_HELLO_Message *hello)
 {
   struct HostSet *results;
 {
   struct HostSet *results;
-
+#if DEBUG_HOSTLIST_SERVER
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
             "Peerinfo is notifying us to rebuild our hostlist\n");
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
             "Peerinfo is notifying us to rebuild our hostlist\n");
+#endif
   results = GNUNET_malloc(sizeof(struct HostSet));
   GNUNET_assert (peerinfo != NULL);
   pitr = GNUNET_PEERINFO_iterate (peerinfo,
                                   NULL,
   results = GNUNET_malloc(sizeof(struct HostSet));
   GNUNET_assert (peerinfo != NULL);
   pitr = GNUNET_PEERINFO_iterate (peerinfo,
                                   NULL,
-                                  0,
                                   GNUNET_TIME_UNIT_MINUTES,
                                   &host_processor,
                                   results);
                                   GNUNET_TIME_UNIT_MINUTES,
                                   &host_processor,
                                   results);
@@ -533,14 +526,13 @@ prepare_daemon (struct MHD_Daemon *daemon_handle)
                                &max));
   haveto = MHD_get_timeout (daemon_handle, &timeout);
   if (haveto == MHD_YES)
                                &max));
   haveto = MHD_get_timeout (daemon_handle, &timeout);
   if (haveto == MHD_YES)
-    tv.value = (uint64_t) timeout;
+    tv.rel_value = (uint64_t) timeout;
   else
     tv = GNUNET_TIME_UNIT_FOREVER_REL;
   else
     tv = GNUNET_TIME_UNIT_FOREVER_REL;
-  GNUNET_NETWORK_fdset_copy_native (wrs, &rs, max);
-  GNUNET_NETWORK_fdset_copy_native (wws, &ws, max);
-  GNUNET_NETWORK_fdset_copy_native (wes, &es, max);
-  ret = GNUNET_SCHEDULER_add_select (sched,
-                                    GNUNET_SCHEDULER_PRIORITY_HIGH,
+  GNUNET_NETWORK_fdset_copy_native (wrs, &rs, max + 1);
+  GNUNET_NETWORK_fdset_copy_native (wws, &ws, max + 1);
+  GNUNET_NETWORK_fdset_copy_native (wes, &es, max + 1);
+  ret = GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_HIGH,
                                     GNUNET_SCHEDULER_NO_TASK,
                                     tv,
                                     wrs,
                                     GNUNET_SCHEDULER_NO_TASK,
                                     tv,
                                     wrs,
@@ -562,7 +554,6 @@ prepare_daemon (struct MHD_Daemon *daemon_handle)
  */
 int
 GNUNET_HOSTLIST_server_start (const struct GNUNET_CONFIGURATION_Handle *c,
  */
 int
 GNUNET_HOSTLIST_server_start (const struct GNUNET_CONFIGURATION_Handle *c,
-                             struct GNUNET_SCHEDULER_Handle *s,
                              struct GNUNET_STATISTICS_Handle *st,
                              struct GNUNET_CORE_Handle *co,
                              GNUNET_CORE_ConnectEventHandler *server_ch,
                              struct GNUNET_STATISTICS_Handle *st,
                              struct GNUNET_CORE_Handle *co,
                              GNUNET_CORE_ConnectEventHandler *server_ch,
@@ -580,25 +571,38 @@ GNUNET_HOSTLIST_server_start (const struct GNUNET_CONFIGURATION_Handle *c,
   else
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Advertising enabled on this hostlist server\n");
   else
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Advertising enabled on this hostlist server\n");
-  sched = s;
   cfg = c;
   stats = st;
   cfg = c;
   stats = st;
-  peerinfo = GNUNET_PEERINFO_connect (sched, cfg);
+  peerinfo = GNUNET_PEERINFO_connect (cfg);
   if (peerinfo == NULL)
     {
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                  _("Could not access PEERINFO service.  Exiting.\n"));     
       return GNUNET_SYSERR;
     }
   if (peerinfo == NULL)
     {
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                  _("Could not access PEERINFO service.  Exiting.\n"));     
       return GNUNET_SYSERR;
     }
-  if (-1 == GNUNET_CONFIGURATION_get_value_number (cfg,
-                                                  "HOSTLIST",
-                                                  "HTTPPORT", 
-                                                  &port))
+  if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (cfg,
+                                                         "HOSTLIST",
+                                                         "HTTPPORT", 
+                                                         &port))
     return GNUNET_SYSERR;
     return GNUNET_SYSERR;
+  if ( (port == 0) ||
+       (port > UINT16_MAX) )
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                 _("Invalid port number %llu.  Exiting.\n"),
+                 port);            
+      return GNUNET_SYSERR;
+    }
+
+  if ( GNUNET_SYSERR  == GNUNET_CONFIGURATION_get_value_string (cfg,
+                                                   "HOSTLIST",
+                                                   "EXTERNAL_DNS_NAME",
+                                                   &hostname))
+    hostname = GNUNET_RESOLVER_local_fqdn_get ();
+
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-             _("Hostlist service starts on port %llu\n"),
-             port);
-  hostname = GNUNET_RESOLVER_local_fqdn_get ();
+              _("Hostlist service starts on %s:%llu\n"),
+              hostname, port);
   if (NULL != hostname)
     {
       size = strlen (hostname);
   if (NULL != hostname)
     {
       size = strlen (hostname);
@@ -668,7 +672,7 @@ GNUNET_HOSTLIST_server_start (const struct GNUNET_CONFIGURATION_Handle *c,
   if (daemon_handle_v6 != NULL)
     hostlist_task_v6 = prepare_daemon (daemon_handle_v6);
 
   if (daemon_handle_v6 != NULL)
     hostlist_task_v6 = prepare_daemon (daemon_handle_v6);
 
-  notify = GNUNET_PEERINFO_notify ( cfg, sched, process_notify, NULL);
+  notify = GNUNET_PEERINFO_notify ( cfg, process_notify, NULL);
 
   return GNUNET_OK;
 }
 
   return GNUNET_OK;
 }
@@ -690,12 +694,12 @@ GNUNET_HOSTLIST_server_stop ()
     }
   if (GNUNET_SCHEDULER_NO_TASK != hostlist_task_v6)
     {
     }
   if (GNUNET_SCHEDULER_NO_TASK != hostlist_task_v6)
     {
-      GNUNET_SCHEDULER_cancel (sched, hostlist_task_v6);
+      GNUNET_SCHEDULER_cancel (hostlist_task_v6);
       hostlist_task_v6 = GNUNET_SCHEDULER_NO_TASK;
     }
   if (GNUNET_SCHEDULER_NO_TASK != hostlist_task_v4)
     {
       hostlist_task_v6 = GNUNET_SCHEDULER_NO_TASK;
     }
   if (GNUNET_SCHEDULER_NO_TASK != hostlist_task_v4)
     {
-      GNUNET_SCHEDULER_cancel (sched, hostlist_task_v4);
+      GNUNET_SCHEDULER_cancel (hostlist_task_v4);
       hostlist_task_v4 = GNUNET_SCHEDULER_NO_TASK;
     }
   if (pitr != NULL)
       hostlist_task_v4 = GNUNET_SCHEDULER_NO_TASK;
     }
   if (pitr != NULL)
@@ -723,6 +727,9 @@ GNUNET_HOSTLIST_server_stop ()
       GNUNET_PEERINFO_disconnect (peerinfo);
       peerinfo = NULL;
     }
       GNUNET_PEERINFO_disconnect (peerinfo);
       peerinfo = NULL;
     }
+  cfg = NULL;
+  stats = NULL;
+  core = NULL;
 }
 
 /* end of hostlist-server.c */
 }
 
 /* end of hostlist-server.c */