- * delete the current network list
- */
-static void
-delete_networks (struct GNUNET_ATS_SchedulingHandle *sh)
-{
- struct ATS_Network * cur = sh->net_head;
- while (cur != NULL)
- {
- GNUNET_CONTAINER_DLL_remove(sh->net_head, sh->net_tail, cur);
- GNUNET_free (cur);
- cur = sh->net_head;
- }
-}
-
-
-static int
-interface_proc (void *cls, const char *name,
- int isDefault,
- const struct sockaddr *
- addr,
- const struct sockaddr *
- broadcast_addr,
- const struct sockaddr *
- netmask, socklen_t addrlen)
-{
- struct GNUNET_ATS_SchedulingHandle * sh = cls;
- /* Calculate network */
- struct ATS_Network *net = NULL;
-
- /* Skipping IPv4 loopback addresses since we have special check */
- if (addr->sa_family == AF_INET)
- {
- struct sockaddr_in * a4 = (struct sockaddr_in *) addr;
-
- if ((a4->sin_addr.s_addr & htonl(0xff000000)) == htonl (0x7f000000))
- return GNUNET_OK;
- }
- /* Skipping IPv6 loopback addresses since we have special check */
- if (addr->sa_family == AF_INET6)
- {
- struct sockaddr_in6 * a6 = (struct sockaddr_in6 *) addr;
- if (IN6_IS_ADDR_LOOPBACK (&a6->sin6_addr))
- return GNUNET_OK;
- }
-
- if (addr->sa_family == AF_INET)
- {
- struct sockaddr_in *addr4 = (struct sockaddr_in *) addr;
- struct sockaddr_in *netmask4 = (struct sockaddr_in *) netmask;
- struct sockaddr_in *tmp = NULL;
- struct sockaddr_in network4;
-
- net = GNUNET_malloc(sizeof (struct ATS_Network) + 2 * sizeof (struct sockaddr_in));
- tmp = (struct sockaddr_in *) &net[1];
- net->network = (struct sockaddr *) &tmp[0];
- net->netmask = (struct sockaddr *) &tmp[1];
- net->length = addrlen;
-
- memset (&network4, 0, sizeof (network4));
- network4.sin_family = AF_INET;
-#if HAVE_SOCKADDR_IN_SIN_LEN
- network4.sin_len = sizeof (network4);
-#endif
- network4.sin_addr.s_addr = (addr4->sin_addr.s_addr & netmask4->sin_addr.s_addr);
-
- memcpy (net->netmask, netmask4, sizeof (struct sockaddr_in));
- memcpy (net->network, &network4, sizeof (struct sockaddr_in));
- }
-
- if (addr->sa_family == AF_INET6)
- {
- struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) addr;
- struct sockaddr_in6 *netmask6 = (struct sockaddr_in6 *) netmask;
- struct sockaddr_in6 * tmp = NULL;
- struct sockaddr_in6 network6;
-
- net = GNUNET_malloc(sizeof (struct ATS_Network) + 2 * sizeof (struct sockaddr_in6));
- tmp = (struct sockaddr_in6 *) &net[1];
- net->network = (struct sockaddr *) &tmp[0];
- net->netmask = (struct sockaddr *) &tmp[1];
- net->length = addrlen;
-
- memset (&network6, 0, sizeof (network6));
- network6.sin6_family = AF_INET6;
-#if HAVE_SOCKADDR_IN_SIN_LEN
- network6.sin6_len = sizeof (network6);
-#endif
- int c = 0;
- uint32_t *addr_elem = (uint32_t *) &addr6->sin6_addr;
- uint32_t *mask_elem = (uint32_t *) &netmask6->sin6_addr;
- uint32_t *net_elem = (uint32_t *) &network6.sin6_addr;
- for (c = 0; c < 4; c++)
- net_elem[c] = addr_elem[c] & mask_elem[c];
-
- memcpy (net->netmask, netmask6, sizeof (struct sockaddr_in6));
- memcpy (net->network, &network6, sizeof (struct sockaddr_in6));
- }
-
- /* Store in list */
- if (net != NULL)
- {
-#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;
-}
-
-
-/**
- * Periodically get list of addresses
- * @param cls closure
- * @param tc Task context
- */
-static void
-get_addresses (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
-{
- struct GNUNET_ATS_SchedulingHandle * sh = cls;
- 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 (INTERFACE_PROCESSING_INTERVALL,
- get_addresses,
- sh);
-}
-
-/**
- * Convert a GNUNET_ATS_NetworkType to a string