[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r18562 - in gnunet/src: ats include
From: |
gnunet |
Subject: |
[GNUnet-SVN] r18562 - in gnunet/src: ats include |
Date: |
Mon, 12 Dec 2011 18:11:37 +0100 |
Author: wachs
Date: 2011-12-12 18:11:37 +0100 (Mon, 12 Dec 2011)
New Revision: 18562
Modified:
gnunet/src/ats/gnunet-service-ats_addresses.c
gnunet/src/include/gnunet_ats_service.h
Log:
WAN/LAN detection
Mantis 1991
Modified: gnunet/src/ats/gnunet-service-ats_addresses.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.c 2011-12-12 15:35:53 UTC
(rev 18561)
+++ gnunet/src/ats/gnunet-service-ats_addresses.c 2011-12-12 17:11:37 UTC
(rev 18562)
@@ -487,12 +487,29 @@
{
struct GNUNET_ATS_Information ats;
struct ATS_Network * cur = net_head;
- int is_lan = GNUNET_NO;
+ int type = GNUNET_ATS_NET_UNSPECIFIED;
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Checking type of address `%s'\n",
GNUNET_a2s(addr, addrlen));
- while (cur != NULL)
+ /* IPv4 loopback 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)) ==
htonl (0x7f000000))
+ type = GNUNET_ATS_NET_LOOPBACK;
+ }
+ /* IPv6 loopback check */
+ if (addr->sa_family == AF_INET6)
+ {
+ struct sockaddr_in6 * a6 = (struct sockaddr_in6 *) addr;
+ if (IN6_IS_ADDR_LOOPBACK (&a6->sin6_addr))
+ type = GNUNET_ATS_NET_LOOPBACK;
+ }
+
+ /* Check local networks */
+ while ((cur != NULL) && (type == GNUNET_ATS_NET_UNSPECIFIED))
+ {
if (addrlen != cur->length)
{
cur = cur->next;
@@ -508,42 +525,46 @@
if (((a4->sin_addr.s_addr & mask4->sin_addr.s_addr) &
net4->sin_addr.s_addr) == net4->sin_addr.s_addr)
{
char * net = strdup (GNUNET_a2s ((const struct sockaddr *) net4,
addrlen));
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "`%s' in network `%s': YES \n",
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "`%s' is in network `%s'\n",
GNUNET_a2s ((const struct sockaddr *)a4, addrlen),
net);
GNUNET_free (net);
- is_lan = GNUNET_YES;
+ type = GNUNET_ATS_NET_LAN;
}
- else
- {
- char * net = strdup (GNUNET_a2s ((const struct sockaddr *) net4,
addrlen));
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "`%s' in network `%s': NO \n",
- GNUNET_a2s ((const struct sockaddr *)a4, addrlen),
- net);
- GNUNET_free (net);
- is_lan = GNUNET_YES;
- }
}
if (addr->sa_family == AF_INET6)
{
+ struct sockaddr_in6 * a6 = (struct sockaddr_in6 *) addr;
+ struct sockaddr_in6 * net6 = (struct sockaddr_in6 *) cur->network;
+ struct sockaddr_in6 * mask6 = (struct sockaddr_in6 *) cur->netmask;
+ int res = GNUNET_YES;
+ int c = 0;
+ for (c = 0; c < 4; c++)
+ {
+ if (((a6->sin6_addr.__in6_u.__u6_addr32[c] &
mask6->sin6_addr.__in6_u.__u6_addr32[c]) |
net6->sin6_addr.__in6_u.__u6_addr32[c]) !=
net6->sin6_addr.__in6_u.__u6_addr32[c])
+ res = GNUNET_NO;
+ }
+
+ if (res == GNUNET_YES)
+ {
+ char * net = 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);
+ GNUNET_free (net);
+ type = GNUNET_ATS_NET_LAN;
+ }
}
-
- if (is_lan == GNUNET_YES)
- break;
cur = cur->next;
}
- if (is_lan == GNUNET_NO)
- {
- ats.type = ntohl(GNUNET_ATS_ARRAY_TERMINATOR);
- ats.value = ntohl(GNUNET_ATS_ARRAY_TERMINATOR);
- }
- else
- {
- ats.type = ntohl(GNUNET_ATS_ARRAY_TERMINATOR);
- ats.value = ntohl(GNUNET_ATS_ARRAY_TERMINATOR);
- }
+ /* local network found for this address, default: WAN */
+ if (type == GNUNET_ATS_NET_UNSPECIFIED)
+ type = GNUNET_ATS_NET_WAN;
+
+ ats.type = htonl (GNUNET_ATS_NETWORK_TYPE);
+ ats.value = htonl (type);
return ats;
}
@@ -561,21 +582,19 @@
struct ATS_Network *net = NULL;
if (addr->sa_family == AF_INET)
{
- struct ATS_Network *net = NULL;
struct sockaddr_in *addr4 = (struct sockaddr_in *) addr;
struct sockaddr_in *netmask4 = (struct sockaddr_in *) netmask;
- struct sockaddr * tmp = NULL;
+ struct sockaddr_in *tmp = NULL;
struct sockaddr_in network4;
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding %s address: %s\n",
(addr->sa_family == AF_INET) ? "IPv4" : "IPv6" ,GNUNET_a2s(addr, addrlen));
-
net = GNUNET_malloc(sizeof (struct ATS_Network) + 2 * sizeof (struct
sockaddr_in));
- tmp = (struct sockaddr *) &net[1];
- net->network = &tmp[0];
- net->netmask = &tmp[1];
+ tmp = (struct sockaddr_in *) &net[1];
+ net->network = (struct sockaddr *) &tmp[0];
+ net->netmask = (struct sockaddr *) &tmp[1];
net->length = addrlen;
network4.sin_family = AF_INET;
+ network4.sin_port = htons (0);
#if HAVE_SOCKADDR_IN_SIN_LEN
network4.sin_len = sizeof (network4);
#endif
@@ -591,17 +610,45 @@
GNUNET_free (netmask);
}
+
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;
+
+ network6.sin6_family = AF_INET6;
+ network6.sin6_port = htons (0);
+#if HAVE_SOCKADDR_IN_SIN_LEN
+ network6.sin6_len = sizeof (network6);
+#endif
+ int c = 0;
+ for (c = 0; c < 4; c++)
+ {
+ network6.sin6_addr.__in6_u.__u6_addr32[c] =
addr6->sin6_addr.__in6_u.__u6_addr32[c] &
netmask6->sin6_addr.__in6_u.__u6_addr32[c];
+ }
+
+ memcpy (net->netmask, netmask6, sizeof (struct sockaddr_in6));
+ memcpy (net->network, &network6, sizeof (struct sockaddr_in6));
+
+ char * netmask = 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);
}
/* Store in list */
if (net != NULL)
GNUNET_CONTAINER_DLL_insert(net_head, net_tail, net);
- //GAS_addresses_type (addr, addrlen);
-
return GNUNET_OK;
}
Modified: gnunet/src/include/gnunet_ats_service.h
===================================================================
--- gnunet/src/include/gnunet_ats_service.h 2011-12-12 15:35:53 UTC (rev
18561)
+++ gnunet/src/include/gnunet_ats_service.h 2011-12-12 17:11:37 UTC (rev
18562)
@@ -31,6 +31,14 @@
#include "gnunet_hello_lib.h"
+enum GNUNET_ATS_Network_Type
+{
+ GNUNET_ATS_NET_UNSPECIFIED,
+ GNUNET_ATS_NET_LOOPBACK,
+ GNUNET_ATS_NET_LAN,
+ GNUNET_ATS_NET_WAN
+};
+
/**
* Enum defining all known property types for ATS Enum values are used
* in the GNUNET_ATS_Information struct as
@@ -63,6 +71,12 @@
GNUNET_ATS_UTILIZATION_DOWN,
/**
+ * Is this address located in WAN, LAN or a loopback address
+ * Value is element of GNUNET_ATS_Network_Type
+ */
+ GNUNET_ATS_NETWORK_TYPE,
+
+ /**
* Delay
* Time between when the time packet is sent and the packet arrives
*
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r18562 - in gnunet/src: ats include,
gnunet <=