gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r18560 - gnunet/src/ats


From: gnunet
Subject: [GNUnet-SVN] r18560 - gnunet/src/ats
Date: Mon, 12 Dec 2011 14:58:33 +0100

Author: wachs
Date: 2011-12-12 14:58:33 +0100 (Mon, 12 Dec 2011)
New Revision: 18560

Modified:
   gnunet/src/ats/gnunet-service-ats_addresses.c
   gnunet/src/ats/gnunet-service-ats_addresses.h
Log:
IPv4 check implemented
TODO: IPv6


Modified: gnunet/src/ats/gnunet-service-ats_addresses.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.c       2011-12-12 12:52:42 UTC 
(rev 18559)
+++ gnunet/src/ats/gnunet-service-ats_addresses.c       2011-12-12 13:58:33 UTC 
(rev 18560)
@@ -79,7 +79,8 @@
 
   struct ATS_Network * prev;
 
-  void *network;
+  struct sockaddr *network;
+  struct sockaddr *netmask;
   socklen_t length;
 };
 
@@ -482,12 +483,67 @@
  */
 
 struct GNUNET_ATS_Information
-GAS_addresses_type (struct sockaddr * addr, socklen_t addrlen)
+GAS_addresses_type (const struct sockaddr * addr, socklen_t addrlen)
 {
   struct GNUNET_ATS_Information ats;
-  /* FIXME */
-  ats.type = ntohl(GNUNET_ATS_ARRAY_TERMINATOR);
-  ats.value = ntohl(GNUNET_ATS_ARRAY_TERMINATOR);
+  struct ATS_Network * cur = net_head;
+  int is_lan = GNUNET_NO;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Checking type of address `%s'\n", 
GNUNET_a2s(addr, addrlen));
+
+  while (cur != NULL)
+  {
+    if (addrlen != cur->length)
+    {
+      cur = cur->next;
+      continue;
+    }
+
+    if (addr->sa_family == AF_INET)
+    {
+      struct sockaddr_in * a4 = (struct sockaddr_in *) addr;
+      struct sockaddr_in * net4 = (struct sockaddr_in *) cur->network;
+      struct sockaddr_in * mask4 = (struct sockaddr_in *) cur->netmask;
+
+      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_a2s ((const struct sockaddr *)a4, addrlen),
+            net);
+        GNUNET_free (net);
+        is_lan = GNUNET_YES;
+      }
+      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)
+    {
+
+    }
+
+    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);
+  }
   return ats;
 }
 
@@ -501,15 +557,51 @@
                 const struct sockaddr *
                 netmask, socklen_t addrlen)
 {
- // GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Address: %s\n", GNUNET_a2s(addr, 
addrlen));
-
-  struct ATS_Network *net = GNUNET_malloc(sizeof (struct ATS_Network) + 
addrlen);
   /* Calculate network */
-  net->length = addrlen;
+  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 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];
+    net->length = addrlen;
+
+    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));
+
+    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);
+
+  }
+  if (addr->sa_family == AF_INET6)
+  {
+
+  }
+
   /* Store in list */
-  GNUNET_CONTAINER_DLL_insert(net_head, net_tail, net);
+  if (net != NULL)
+    GNUNET_CONTAINER_DLL_insert(net_head, net_tail, net);
 
+  //GAS_addresses_type (addr, addrlen);
+
   return GNUNET_OK;
 }
 

Modified: gnunet/src/ats/gnunet-service-ats_addresses.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.h       2011-12-12 12:52:42 UTC 
(rev 18559)
+++ gnunet/src/ats/gnunet-service-ats_addresses.h       2011-12-12 13:58:33 UTC 
(rev 18560)
@@ -53,7 +53,7 @@
  */
 
 struct GNUNET_ATS_Information
-GAS_addresses_type (struct sockaddr * addr, socklen_t addrlen);
+GAS_addresses_type (const struct sockaddr * addr, socklen_t addrlen);
 
 /**
  * This address is now used or not used anymore




reply via email to

[Prev in Thread] Current Thread [Next in Thread]