X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fats%2Fats_api_scheduling.c;h=78e8d61ccef75f1dbf6a546c8eacce195808c20d;hb=82c4c89493dcbfc6ee7fd1232a9088d02e2cd0a2;hp=03b8e3411c8c028244a3a1c5d02936a9c8a0e401;hpb=5838db58281b2f734b29a7801d70f42fda9310cd;p=oweals%2Fgnunet.git diff --git a/src/ats/ats_api_scheduling.c b/src/ats/ats_api_scheduling.c index 03b8e3411..78e8d61cc 100644 --- a/src/ats/ats_api_scheduling.c +++ b/src/ats/ats_api_scheduling.c @@ -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, sh); + 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;