- LRN's patch
[oweals/gnunet.git] / src / ats / ats_api_scheduling.c
index c5a9c623fce07e895258ec9902535369189313da..78e8d61ccef75f1dbf6a546c8eacce195808c20d 100644 (file)
@@ -29,6 +29,8 @@
 
 #define DEBUG_ATS GNUNET_EXTRA_LOGGING
 
+#define INTERFACE_PROCESSING_INTERVALL GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1)
+
 /**
  * Message in linked list we should send to the ATS service.  The
  * actual binary message follows this struct.
@@ -676,8 +678,8 @@ interface_proc (void *cls, const char *name,
     net->netmask = (struct sockaddr *) &tmp[1];
     net->length = addrlen;
 
+    memset (&network4, 0, sizeof (network4));
     network4.sin_family = AF_INET;
-    network4.sin_port = htons (0);
 #if HAVE_SOCKADDR_IN_SIN_LEN
     network4.sin_len = sizeof (network4);
 #endif
@@ -700,8 +702,8 @@ interface_proc (void *cls, const char *name,
     net->netmask = (struct sockaddr *) &tmp[1];
     net->length = addrlen;
 
+    memset (&network6, 0, sizeof (network6));
     network6.sin6_family = AF_INET6;
-    network6.sin6_port = htons (0);
 #if HAVE_SOCKADDR_IN_SIN_LEN
     network6.sin6_len = sizeof (network6);
 #endif
@@ -719,11 +721,13 @@ interface_proc (void *cls, const char *name,
   /* Store in list */
   if (net != NULL)
   {
-    char * netmask = strdup (GNUNET_a2s((struct sockaddr *) net->netmask, addrlen));
+#if VERBOSE_ATS
+    char * netmask = GNUNET_strdup (GNUNET_a2s((struct sockaddr *) net->netmask, addrlen));
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding network `%s', netmask `%s'\n",
         GNUNET_a2s((struct sockaddr *) net->network, addrlen),
         netmask);
     GNUNET_free (netmask);
+# endif
     GNUNET_CONTAINER_DLL_insert(sh->net_head, sh->net_tail, net);
   }
   return GNUNET_OK;
@@ -743,24 +747,32 @@ get_addresses (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   sh->interface_task = GNUNET_SCHEDULER_NO_TASK;
   delete_networks (sh);
   GNUNET_OS_network_interfaces_list(interface_proc, sh);
-
-  sh->interface_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES, get_addresses, NULL);
+  sh->interface_task = GNUNET_SCHEDULER_add_delayed (INTERFACE_PROCESSING_INTERVALL,
+                                                     get_addresses,
+                                                     sh);
 }
 
 /**
  * Returns where the address is located: LAN or WAN or ...
+ * @param sh the scheduling handle
  * @param addr address
  * @param addrlen address length
  * @return location as GNUNET_ATS_Information
  */
 
-struct GNUNET_ATS_Information
+const struct GNUNET_ATS_Information
 GNUNET_ATS_address_get_type (struct GNUNET_ATS_SchedulingHandle * sh, const struct sockaddr * addr, socklen_t addrlen)
 {
+  GNUNET_assert (sh != NULL);
   struct GNUNET_ATS_Information ats;
   struct ATS_Network * cur = sh->net_head;
   int type = GNUNET_ATS_NET_UNSPECIFIED;
 
+  if  (addr->sa_family == AF_UNIX)
+  {
+    type = GNUNET_ATS_NET_LOOPBACK;
+  }
+
   /* IPv4 loopback check */
   if  (addr->sa_family == AF_INET)
   {
@@ -794,7 +806,7 @@ GNUNET_ATS_address_get_type (struct GNUNET_ATS_SchedulingHandle * sh, const stru
 
       if (((a4->sin_addr.s_addr & mask4->sin_addr.s_addr)) == net4->sin_addr.s_addr)
       {
-        char * net = strdup (GNUNET_a2s ((const struct sockaddr *) net4, addrlen));
+        char * net = GNUNET_strdup (GNUNET_a2s ((const struct sockaddr *) net4, addrlen));
         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "`%s' is in network `%s'\n",
             GNUNET_a2s ((const struct sockaddr *)a4, addrlen),
             net);
@@ -819,7 +831,7 @@ GNUNET_ATS_address_get_type (struct GNUNET_ATS_SchedulingHandle * sh, const stru
 
       if (res == GNUNET_YES)
       {
-        char * net = strdup (GNUNET_a2s ((const struct sockaddr *) net6, addrlen));
+        char * net = GNUNET_strdup (GNUNET_a2s ((const struct sockaddr *) net6, addrlen));
         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "`%s' is in network `%s'\n",
               GNUNET_a2s ((const struct sockaddr *) a6, addrlen),
               net);
@@ -830,13 +842,34 @@ GNUNET_ATS_address_get_type (struct GNUNET_ATS_SchedulingHandle * sh, const stru
     cur = cur->next;
   }
 
-  /* local network found for this address, default: WAN */
+  /* no local network found for this address, default: WAN */
   if (type == GNUNET_ATS_NET_UNSPECIFIED)
     type = GNUNET_ATS_NET_WAN;
 
+#if VERBOSE
+  const char * range;
+  switch (type) {
+    case GNUNET_ATS_NET_WAN:
+        range = "WAN";
+      break;
+    case GNUNET_ATS_NET_LAN:
+        range = "LAN";
+      break;
+    case GNUNET_ATS_NET_LOOPBACK:
+        range = "LOOPBACK";
+      break;
+    default:
+
+      break;
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "`%s' is in network `%s'\n",
+        GNUNET_a2s ((const struct sockaddr *) addr, addrlen),
+        range);
+#endif
+
   ats.type = htonl (GNUNET_ATS_NETWORK_TYPE);
   ats.value = htonl (type);
-  return ats;
+  return (const struct GNUNET_ATS_Information) ats;
 }
 
 /**
@@ -860,7 +893,9 @@ GNUNET_ATS_scheduling_init (const struct GNUNET_CONFIGURATION_Handle *cfg,
   sh->suggest_cb_cls = suggest_cb_cls;
   GNUNET_array_grow (sh->session_array, sh->session_array_size, 4);
   GNUNET_OS_network_interfaces_list(interface_proc, sh);
-  sh->interface_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES, get_addresses, NULL);
+  sh->interface_task = GNUNET_SCHEDULER_add_delayed (INTERFACE_PROCESSING_INTERVALL,
+      get_addresses,
+      sh);
   reconnect (sh);
   return sh;
 }
@@ -898,9 +933,9 @@ GNUNET_ATS_scheduling_done (struct GNUNET_ATS_SchedulingHandle *sh)
     GNUNET_SCHEDULER_cancel(sh->interface_task);
     sh->interface_task = GNUNET_SCHEDULER_NO_TASK;
   }
-
   GNUNET_array_grow (sh->session_array, sh->session_array_size, 0);
   GNUNET_free (sh);
+  sh = NULL;
 }
 
 
@@ -986,6 +1021,17 @@ GNUNET_ATS_address_update (struct GNUNET_ATS_SchedulingHandle *sh,
   size_t namelen;
   size_t msize;
 
+  if (address == NULL)
+  {
+    GNUNET_break (0);
+    return;
+  }
+  if ((address == NULL) && (session == NULL))
+  {
+    GNUNET_break (0);
+    return;
+  }
+
   namelen =
       (address->transport_name ==
        NULL) ? 0 : strlen (address->transport_name) + 1;