gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r16494 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r16494 - gnunet/src/transport
Date: Sun, 14 Aug 2011 16:26:34 +0200

Author: grothoff
Date: 2011-08-14 16:26:33 +0200 (Sun, 14 Aug 2011)
New Revision: 16494

Modified:
   gnunet/src/transport/Makefile.am
   gnunet/src/transport/gnunet-service-transport-new.c
   gnunet/src/transport/gnunet-service-transport_blacklist.c
   gnunet/src/transport/gnunet-service-transport_blacklist.h
   gnunet/src/transport/gnunet-service-transport_clients.c
   gnunet/src/transport/gnunet-service-transport_validation.c
Log:
LRN: Fix deps in transport

Modified: gnunet/src/transport/Makefile.am
===================================================================
--- gnunet/src/transport/Makefile.am    2011-08-14 11:12:46 UTC (rev 16493)
+++ gnunet/src/transport/Makefile.am    2011-08-14 14:26:33 UTC (rev 16494)
@@ -71,6 +71,13 @@
  
 libgnunettransporttesting_la_SOURCES = \
        transport-testing.c
+libgnunettransporttesting_la_LIBADD = \
+  $(top_builddir)/src/transport/libgnunettransport.la \
+  $(top_builddir)/src/hello/libgnunethello.la \
+  $(top_builddir)/src/util/libgnunetutil.la \
+  $(GN_LIBINTL) 
+libgnunettransporttesting_la_DEPENDS = \
+  libgnunettransport.la
 
 libgnunettransport_la_SOURCES = \
   transport_api.c transport.h \

Modified: gnunet/src/transport/gnunet-service-transport-new.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport-new.c 2011-08-14 11:12:46 UTC 
(rev 16493)
+++ gnunet/src/transport/gnunet-service-transport-new.c 2011-08-14 14:26:33 UTC 
(rev 16494)
@@ -150,7 +150,8 @@
                             uint16_t sender_address_len)
 {
   const char *plugin_name = cls;
-                              
+
+  
   if (NULL != message)
     GST_clients_broadcast (message, GNUNET_YES);
   GNUNET_ATS_address_update (GST_ats,

Modified: gnunet/src/transport/gnunet-service-transport_blacklist.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport_blacklist.c   2011-08-14 
11:12:46 UTC (rev 16493)
+++ gnunet/src/transport/gnunet-service-transport_blacklist.c   2011-08-14 
14:26:33 UTC (rev 16494)
@@ -39,7 +39,7 @@
 /**
  * Context we use when performing a blacklist check.
  */
-struct BlacklistCheck;
+struct GST_BlacklistCheck;
 
 
 /**
@@ -64,10 +64,16 @@
   struct GNUNET_SERVER_Client *client;
 
   /**
-   * Blacklist check that we're currently performing.
+   * Blacklist check that we're currently performing (or NULL
+   * if we're performing one that has been cancelled).
    */
-  struct BlacklistCheck *bc;
+  struct GST_BlacklistCheck *bc;
 
+  /**
+   * Set to GNUNET_YES if we're currently waiting for a reply.
+   */
+  int waiting_for_reply;
+
 };
 
 
@@ -75,18 +81,18 @@
 /**
  * Context we use when performing a blacklist check.
  */
-struct BlacklistCheck
+struct GST_BlacklistCheck
 {
 
   /**
    * This is a linked list.
    */
-  struct BlacklistCheck *next;
+  struct GST_BlacklistCheck *next;
 
   /**
    * This is a linked list.
    */
-  struct BlacklistCheck *prev;
+  struct GST_BlacklistCheck *prev;
 
   /**
    * Peer being checked.
@@ -125,12 +131,12 @@
 /**
  * Head of DLL of active blacklisting queries.
  */
-static struct BlacklistCheck *bc_head;
+static struct GST_BlacklistCheck *bc_head;
 
 /**
  * Tail of DLL of active blacklisting queries.
  */
-static struct BlacklistCheck *bc_tail;
+static struct GST_BlacklistCheck *bc_tail;
 
 /**
  * Head of DLL of blacklisting clients.
@@ -172,7 +178,7 @@
                                 struct GNUNET_SERVER_Client *client)
 {
   struct Blacklisters *bl;
-  struct BlacklistCheck *bc;
+  struct GST_BlacklistCheck *bc;
 
   if (client == NULL)
     return;
@@ -435,7 +441,7 @@
 /**
  * Transmit blacklist query to the client.
  *
- * @param cls the 'struct BlacklistCheck'
+ * @param cls the 'struct GST_BlacklistCheck'
  * @param size number of bytes allowed
  * @param buf where to copy the message
  * @return number of bytes copied to buf
@@ -445,7 +451,7 @@
                            size_t size,
                            void *buf)
 {
-  struct BlacklistCheck *bc = cls;
+  struct GST_BlacklistCheck *bc = cls;
   struct Blacklisters *bl;
   struct BlacklistMessage bm;
 
@@ -472,6 +478,7 @@
   bm.peer = bc->peer;
   memcpy (buf, &bm, sizeof (bm));
   GNUNET_SERVER_receive_done (bl->client, GNUNET_OK);
+  bl->waiting_for_reply = GNUNET_YES;
   return sizeof (bm);
 }
 
@@ -479,14 +486,14 @@
 /**
  * Perform next action in the blacklist check.
  *
- * @param cls the 'struct BlacklistCheck*'
+ * @param cls the 'struct GST_BlacklistCheck*'
  * @param tc unused
  */
 static void
 do_blacklist_check (void *cls,
                    const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
-  struct BlacklistCheck *bc = cls;
+  struct GST_BlacklistCheck *bc = cls;
   struct Blacklisters *bl;
 
   bc->task = GNUNET_SCHEDULER_NO_TASK;
@@ -504,7 +511,8 @@
       GNUNET_free (bc);
       return;
     }
-  if (bl->bc != NULL)
+  if ( (bl->bc != NULL) ||
+       (bl->waiting_for_reply != GNUNET_NO) )
     return; /* someone else busy with this client */
   bl->bc = bc;
   bc->th = GNUNET_SERVER_notify_transmit_ready (bl->client,
@@ -572,9 +580,9 @@
                    uint32_t ats_count)
 {
   struct TestConnectionContext *tcc = cls;
-  struct BlacklistCheck *bc;
+  struct GST_BlacklistCheck *bc;
 
-  bc = GNUNET_malloc (sizeof (struct BlacklistCheck));
+  bc = GNUNET_malloc (sizeof (struct GST_BlacklistCheck));
   GNUNET_CONTAINER_DLL_insert (bc_head, bc_tail, bc);
   bc->peer = *neighbour;
   bc->cont = &confirm_or_drop_neighbour;
@@ -647,7 +655,7 @@
 {
   const struct BlacklistMessage *msg = (const struct BlacklistMessage*) 
message;
   struct Blacklisters *bl;
-  struct BlacklistCheck *bc;
+  struct GST_BlacklistCheck *bc;
 
   bl = bl_head;
   while ( (bl != NULL) &&
@@ -665,36 +673,42 @@
     }
   bc = bl->bc;
   bl->bc = NULL;
-  if (ntohl (msg->is_allowed) == GNUNET_SYSERR)
+  bl->waiting_for_reply = GNUNET_NO;
+  if (NULL != bc)
     {
+      /* only run this if the blacklist check has not been 
+        cancelled in the meantime... */
+      if (ntohl (msg->is_allowed) == GNUNET_SYSERR)
+       {
 #if DEBUG_TRANSPORT
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                 "Blacklist check failed, peer not allowed\n");
+         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                     "Blacklist check failed, peer not allowed\n");
 #endif
-      bc->cont (bc->cont_cls, &bc->peer, GNUNET_NO);
-      GNUNET_CONTAINER_DLL_remove (bc_head, bc_tail, bc);
-      GNUNET_free (bc);
-    }
-  else
-    {
+         bc->cont (bc->cont_cls, &bc->peer, GNUNET_NO);
+         GNUNET_CONTAINER_DLL_remove (bc_head, bc_tail, bc);
+         GNUNET_free (bc);
+       }
+      else
+       {
 #if DEBUG_TRANSPORT
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                 "Blacklist check succeeded, continuing with checks\n");
+         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                     "Blacklist check succeeded, continuing with checks\n");
 #endif
-      bc->bl_pos = bc->bl_pos->next;
-      bc->task = GNUNET_SCHEDULER_add_now (&do_blacklist_check,
-                                          bc);
+         bc->bl_pos = bc->bl_pos->next;
+         bc->task = GNUNET_SCHEDULER_add_now (&do_blacklist_check,
+                                              bc);
+       }
     }
   /* check if any other bc's are waiting for this blacklister */
   bc = bc_head;
-  while (bc != NULL)
-    {
-      if ( (bc->bl_pos == bl) &&
-          (GNUNET_SCHEDULER_NO_TASK == bc->task) )
+  for (bc = bc_head; bc != NULL; bc = bc->next)
+    if ( (bc->bl_pos == bl) &&
+        (GNUNET_SCHEDULER_NO_TASK == bc->task) )
+      {
        bc->task = GNUNET_SCHEDULER_add_now (&do_blacklist_check,
                                             bc);
-      bc = bc->next;
-    }
+       break;
+      }
 }
 
 
@@ -754,14 +768,15 @@
  * @param transport_name name of the transport to test, never NULL
  * @param cont function to call with result
  * @param cont_cls closure for 'cont'
+ * @return handle to the blacklist check
  */
-void
+struct GST_BlacklistCheck *
 GST_blacklist_test_allowed (const struct GNUNET_PeerIdentity *peer,
                            const char *transport_name,
                            GST_BlacklistTestContinuation cont,
                            void *cont_cls)
 {
-  struct BlacklistCheck *bc;
+  struct GST_BlacklistCheck *bc;
   
   if ( (blacklist != NULL) &&
        (GNUNET_SYSERR ==
@@ -789,7 +804,7 @@
     }
 
   /* need to query blacklist clients */
-  bc = GNUNET_malloc (sizeof (struct BlacklistCheck));
+  bc = GNUNET_malloc (sizeof (struct GST_BlacklistCheck));
   GNUNET_CONTAINER_DLL_insert (bc_head, bc_tail, bc);
   bc->peer = *peer;
   bc->cont = cont;
@@ -797,8 +812,39 @@
   bc->bl_pos = bl_head;
   bc->task = GNUNET_SCHEDULER_add_now (&do_blacklist_check,
                                       bc);
+  return bc;
 }
-                                                
+                                        
 
+/**
+ * Cancel a blacklist check.
+ * 
+ * @param bc check to cancel
+ */
+void
+GST_blacklist_test_cancel (struct GST_BlacklistCheck *bc)
+{
+  GNUNET_CONTAINER_DLL_remove (bc_head, bc_tail, bc);
+  if (bc->bl_pos != NULL)
+    {
+      if (bc->bl_pos->bc == bc)
+       {
+         /* we're at the head of the queue, remove us! */
+         bc->bl_pos->bc = NULL;
+       }
+    }
+  if (GNUNET_SCHEDULER_NO_TASK != bc->task)
+    {
+      GNUNET_SCHEDULER_cancel (bc->task);
+      bc->task = GNUNET_SCHEDULER_NO_TASK;
+    }
+  if (NULL != bc->th)
+    {
+      GNUNET_CONNECTION_notify_transmit_ready_cancel (bc->th);
+      bc->th = NULL;
+    }
+  GNUNET_free (bc);
+}                                       
 
+
 /* end of file gnunet-service-transport_blacklist.c */

Modified: gnunet/src/transport/gnunet-service-transport_blacklist.h
===================================================================
--- gnunet/src/transport/gnunet-service-transport_blacklist.h   2011-08-14 
11:12:46 UTC (rev 16493)
+++ gnunet/src/transport/gnunet-service-transport_blacklist.h   2011-08-14 
14:26:33 UTC (rev 16494)
@@ -80,9 +80,15 @@
 void
 GST_blacklist_add_peer (const struct GNUNET_PeerIdentity *peer,
                        const char *transport_name);
-                                                       
 
+
 /**
+ * Handle to an active blacklist check.
+ */
+struct GST_BlacklistCheck;     
+                                               
+
+/**
  * Continuation called from a blacklist test.
  *
  * @param cls closure
@@ -102,14 +108,22 @@
  * @param transport_name name of the transport to test, never NULL
  * @param cont function to call with result
  * @param cont_cls closure for 'cont'
+ * @return handle to the blacklist check
  */
-void
+struct GST_BlacklistCheck *
 GST_blacklist_test_allowed (const struct GNUNET_PeerIdentity *peer,
                            const char *transport_name,
                            GST_BlacklistTestContinuation cont,
                            void *cont_cls);
                                                 
 
+/**
+ * Cancel a blacklist check.
+ * 
+ * @param bc check to cancel
+ */
+void
+GST_blacklist_test_cancel (struct GST_BlacklistCheck *bc);
 
 #endif
 /* end of file gnunet-service-transport_blacklist.h */

Modified: gnunet/src/transport/gnunet-service-transport_clients.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport_clients.c     2011-08-14 
11:12:46 UTC (rev 16493)
+++ gnunet/src/transport/gnunet-service-transport_clients.c     2011-08-14 
14:26:33 UTC (rev 16494)
@@ -24,6 +24,7 @@
  * @author Christian Grothoff
  */
 #include "platform.h"
+#include "gnunet-service-transport_blacklist.h"
 #include "gnunet-service-transport_clients.h"
 #include "gnunet-service-transport_hello.h"
 #include "gnunet-service-transport_neighbours.h"
@@ -801,6 +802,8 @@
     { &clients_handle_address_lookup, NULL, 0},
     { &clients_handle_peer_address_lookup, NULL, sizeof (struct 
PeerAddressLookupMessage)},
     { &clients_handle_address_iterate, NULL, sizeof (struct 
GNUNET_MessageHeader)},
+    { &GST_blacklist_handle_init, NULL, sizeof (struct GNUNET_MessageHeader)},
+    { &GST_blacklist_handle_reply, NULL, sizeof (struct BlacklistMessage)},
     {NULL, NULL, 0, 0}
   };
   GNUNET_SERVER_add_handlers (server, handlers);

Modified: gnunet/src/transport/gnunet-service-transport_validation.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport_validation.c  2011-08-14 
11:12:46 UTC (rev 16493)
+++ gnunet/src/transport/gnunet-service-transport_validation.c  2011-08-14 
14:26:33 UTC (rev 16494)
@@ -178,6 +178,11 @@
   const void *addr;
 
   /**
+   * Handle to the blacklist check (if we're currently in it).
+   */
+  struct GST_BlacklistCheck *bc;
+
+  /**
    * Public key of the peer.
    */
   struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded public_key;                   
                             
@@ -483,6 +488,15 @@
 {
   struct ValidationEntry *ve = value;
     
+  if (NULL != ve->bc)
+    {
+      GST_blacklist_test_cancel (ve->bc);
+      ve->bc = NULL;
+    }
+  GNUNET_break (GNUNET_OK ==
+                GNUNET_CONTAINER_multihashmap_remove (validation_map,
+                                                     &va->pid.hashPubKey,
+                                                     va));
   GNUNET_free (ve->transport_name);
   if (GNUNET_SCHEDULER_NO_TASK != ve->timeout_task)
     {
@@ -528,19 +542,14 @@
 timeout_hello_validation (void *cls, 
                          const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
-  struct ValidationEntry *va = cls;
+  struct ValidationEntry *ve = cls;
 
-  va->timeout_task = GNUNET_SCHEDULER_NO_TASK;
+  ve->timeout_task = GNUNET_SCHEDULER_NO_TASK;
   GNUNET_STATISTICS_update (GST_stats,
                            gettext_noop ("# address records discarded"),
                            1,
                            GNUNET_NO);
-  GNUNET_break (GNUNET_OK ==
-                GNUNET_CONTAINER_multihashmap_remove (validation_map,
-                                                     &va->pid.hashPubKey,
-                                                     va));
-  GNUNET_free (va->transport_name);
-  GNUNET_free (va);
+  cleanup_validation_entry (NULL, &ve->pid.hashPubKey, ve);
 }
 
 
@@ -772,26 +781,19 @@
 
 
 /**
- * Iterator callback to go over all addresses and try to validate them
- * (unless blocked or already validated).
+ * Function called with the result from blacklisting.
+ * Send a PING to the other peer if a communication is allowed.
  *
- * @param cls pointer to a 'struct ValidateAddressContext'
- * @param tname name of the transport
- * @param expiration expiration time
- * @param addr the address
- * @param addrlen length of the address
- * @return GNUNET_OK (keep the address)
+ * @param cls ou r'struct ValidationEntry'
+ * @param pid identity of the other peer
+ * @param result GNUNET_OK if the connection is allowed, GNUNET_NO if not
  */
-static int
-validate_address (void *cls,
-                 const char *tname,
-                 struct GNUNET_TIME_Absolute expiration,
-                 const void *addr, 
-                 uint16_t addrlen)
+static void
+transmit_ping_if_allowed (void *cls,
+                         const struct GNUNET_PeerIdentity *pid,
+                         int result)
 {
-  const struct ValidateAddressContext *vac = cls;
-  const struct GNUNET_PeerIdentity *pid = &vac->pid;
-  struct ValidationEntry *ve;
+  struct ValidationEntry *ve = cls;
   struct TransportPingMessage ping;
   struct GNUNET_TRANSPORT_PluginFunctions *papi;
   const struct GNUNET_MessageHeader *hello;
@@ -800,20 +802,7 @@
   size_t slen;
   uint16_t hsize;
 
-  if (GNUNET_TIME_absolute_get_remaining (expiration).rel_value == 0)
-    return GNUNET_OK; /* expired */
-  ve = find_validation_entry (&vac->public_key, pid, tname, addr, addrlen);
-  if (GNUNET_TIME_absolute_get_remaining (ve->validation_block).rel_value > 0)
-    return GNUNET_OK; /* blocked */
-  if ( (GNUNET_SCHEDULER_NO_TASK != ve->timeout_task) &&
-       (GNUNET_TIME_absolute_get_remaining (ve->valid_until).rel_value > 0) )
-    return GNUNET_OK; /* revalidation task already scheduled & still  valid */
-  ve->validation_block = GNUNET_TIME_relative_to_absolute 
(HELLO_REVALIDATION_START_TIME);
-  if (GNUNET_SCHEDULER_NO_TASK != ve->timeout_task)
-    GNUNET_SCHEDULER_cancel (ve->timeout_task);
-  ve->timeout_task = GNUNET_SCHEDULER_add_delayed 
(HELLO_REVALIDATION_START_TIME,
-                                                  &timeout_hello_validation,
-                                                  ve);
+  ve->bc = NULL;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Transmitting plain PING to `%s'\n",
              GNUNET_i2s (pid));  
@@ -872,6 +861,49 @@
                                1,
                                GNUNET_NO);
     }
+}
+
+
+/**
+ * Iterator callback to go over all addresses and try to validate them
+ * (unless blocked or already validated).
+ *
+ * @param cls pointer to a 'struct ValidateAddressContext'
+ * @param tname name of the transport
+ * @param expiration expiration time
+ * @param addr the address
+ * @param addrlen length of the address
+ * @return GNUNET_OK (keep the address)
+ */
+static int
+validate_address (void *cls,
+                 const char *tname,
+                 struct GNUNET_TIME_Absolute expiration,
+                 const void *addr, 
+                 uint16_t addrlen)
+{
+  const struct ValidateAddressContext *vac = cls;
+  const struct GNUNET_PeerIdentity *pid = &vac->pid;
+  struct ValidationEntry *ve;
+
+  if (GNUNET_TIME_absolute_get_remaining (expiration).rel_value == 0)
+    return GNUNET_OK; /* expired */
+  ve = find_validation_entry (&vac->public_key, pid, tname, addr, addrlen);
+  if (GNUNET_TIME_absolute_get_remaining (ve->validation_block).rel_value > 0)
+    return GNUNET_OK; /* blocked */
+  if ( (GNUNET_SCHEDULER_NO_TASK != ve->timeout_task) &&
+       (GNUNET_TIME_absolute_get_remaining (ve->valid_until).rel_value > 0) )
+    return GNUNET_OK; /* revalidation task already scheduled & still  valid */ 
 
+  ve->validation_block = GNUNET_TIME_relative_to_absolute 
(HELLO_REVALIDATION_START_TIME);
+  if (GNUNET_SCHEDULER_NO_TASK != ve->timeout_task)
+    GNUNET_SCHEDULER_cancel (ve->timeout_task);
+  ve->timeout_task = GNUNET_SCHEDULER_add_delayed 
(HELLO_REVALIDATION_START_TIME,
+                                                  &timeout_hello_validation,
+                                                  ve);
+  ve->bc = GST_blacklist_test_allowed (pid,
+                                      tname,
+                                      &transmit_ping_if_allowed,
+                                      ve);
   return GNUNET_OK;
 }
 




reply via email to

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