gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r10117 - gnunet/src/transport
Date: Fri, 22 Jan 2010 15:47:45 +0100

Author: grothoff
Date: 2010-01-22 15:47:45 +0100 (Fri, 22 Jan 2010)
New Revision: 10117

Modified:
   gnunet/src/transport/gnunet-service-transport_blacklist.c
   gnunet/src/transport/gnunet-service-transport_blacklist.h
Log:
finishing blacklist implementation

Modified: gnunet/src/transport/gnunet-service-transport_blacklist.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport_blacklist.c   2010-01-22 
14:27:22 UTC (rev 10116)
+++ gnunet/src/transport/gnunet-service-transport_blacklist.c   2010-01-22 
14:47:45 UTC (rev 10117)
@@ -37,6 +37,12 @@
 struct BlacklistEntry
 {
   /**
+   * Identity of the peer being blacklisted by this entry.
+   * (also equivalent to the key)  
+   */
+  struct GNUNET_PeerIdentity peer;
+
+  /**
    * How long until this entry times out?
    */
   struct GNUNET_TIME_Absolute until;
@@ -49,64 +55,15 @@
 
 
 /**
- * Entry in list of notifications still to transmit to
- * a client.
- */
-struct PendingNotificationList 
-{
-
-  /**
-   * This is a linked list.
-   */
-  struct PendingNotificationList *next;
-
-  /**
-   * Identity of the peer to send notification about.
-   */
-  struct GNUNET_PeerIdentity peer;
-
-};
-
-
-/**
- * List of clients to notify whenever the blacklist changes.
- */
-struct BlacklistNotificationList
-{
-
-  /**
-   * This is a linked list.
-   */
-  struct BlacklistNotificationList *next;
-
-  /**
-   * Client to notify.
-   */
-  struct GNUNET_SERVER_Client *client;
-
-  /**
-   * Pending request for transmission to client, or NULL.
-   */ 
-  struct GNUNET_CONNECTION_TransmitHandle *req;
-
-  /**
-   * Blacklist entries that still need to be submitted.
-   */
-  struct PendingNotificationList *pending;
-  
-};
-
-
-/**
  * Map of blacklisted peers (maps from peer identities
  * to 'struct BlacklistEntry*' values).
  */
 static struct GNUNET_CONTAINER_MultiHashMap *blacklist;
 
 /**
- * Linked list of clients to notify whenever the blacklist changes.
+ * Notifications for blacklisting.
  */
-static struct BlacklistNotificationList *blacklist_notifiers;
+static struct GNUNET_SERVER_NotificationContext *blacklist_notifiers;
 
 /**
  * Our scheduler.
@@ -120,9 +77,7 @@
  * @param cls closure, unused
  * @param key current key code
  * @param value value in the hash map
- * @return GNUNET_YES if we should continue to
- *         iterate,
- *         GNUNET_NO if not.
+ * @return GNUNET_YES (continue to iterate)
  */
 static int
 free_blacklist_entry (void *cls,
@@ -152,10 +107,42 @@
                                         &free_blacklist_entry,
                                         NULL);
   GNUNET_CONTAINER_multihashmap_destroy (blacklist);
+  blacklist = NULL;
+  GNUNET_SERVER_notification_context_destroy (blacklist_notifiers);
+  blacklist_notifiers = NULL;
 }
 
 
 /**
+ * Task run when a blacklist entry times out.
+ *
+ * @param cls closure (the 'struct BlacklistEntry*')
+ * @param tc scheduler context (unused)
+ */
+static void
+timeout_task (void *cls,
+             const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  struct BlacklistEntry *be = cls;
+  struct BlacklistMessage msg;
+  
+  be->timeout_task = GNUNET_SCHEDULER_NO_TASK; 
+  msg.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST);
+  msg.header.size = htons (sizeof (struct BlacklistMessage));
+  msg.reserved = htonl (0);
+  msg.peer = be->peer;
+  msg.until = GNUNET_TIME_absolute_hton (GNUNET_TIME_UNIT_ZERO_ABS);
+  GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (blacklist,
+                                                                    
&be->peer.hashPubKey,
+                                                                    be));
+  GNUNET_free (be);
+  GNUNET_SERVER_notification_context_broadcast (blacklist_notifiers,
+                                               &msg.header,
+                                               GNUNET_NO);
+}
+
+
+/**
  * Handle a request to blacklist a peer.
  *
  * @param cls closure (always NULL)
@@ -167,12 +154,68 @@
                                   struct GNUNET_SERVER_Client *client,
                                   const struct GNUNET_MessageHeader *message)
 {
-  /* FIXME */
+  struct BlacklistEntry *be;
+  const struct BlacklistMessage *msg = (const struct BlacklistMessage*) 
message;
+
+  be = GNUNET_CONTAINER_multihashmap_get (blacklist,
+                                         &be->peer.hashPubKey);
+  if (be != NULL)
+    {
+      GNUNET_SCHEDULER_cancel (sched,
+                              be->timeout_task);
+    }
+  else
+    {
+      be = GNUNET_malloc (sizeof (struct BlacklistEntry));
+      be->peer = msg->peer;
+      GNUNET_CONTAINER_multihashmap_put (blacklist,
+                                        &be->peer.hashPubKey,
+                                        be,
+                                        
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
+    }
+  be->until = GNUNET_TIME_absolute_ntoh (msg->until);
+  be->timeout_task = GNUNET_SCHEDULER_add_delayed (sched,
+                                                  
GNUNET_TIME_absolute_get_remaining (be->until),
+                                                  &timeout_task,
+                                                  be);
+  GNUNET_SERVER_notification_context_broadcast (blacklist_notifiers,
+                                               &msg->header,
+                                               GNUNET_NO);
   GNUNET_SERVER_receive_done (client, GNUNET_OK);
 }
 
 
 /**
+ * Notify the given client about all entries in the blacklist.
+ *
+ * @param cls closure, refers to the 'struct GNUNET_SERVER_Client' to notify
+ * @param key current key code (peer identity, not used)
+ * @param value value in the hash map, the 'struct BlacklistEntry*'
+ * @return GNUNET_YES (continue to iterate)
+ */
+static int
+notify_blacklist_entry (void *cls,
+                       const GNUNET_HashCode *key,
+                       void *value)
+{
+  struct GNUNET_SERVER_Client *client = cls;
+  struct BlacklistEntry *be = value;
+  struct BlacklistMessage msg;
+
+  msg.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST);
+  msg.header.size = htons (sizeof (struct BlacklistMessage));
+  msg.reserved = htonl (0);
+  msg.peer = be->peer;
+  msg.until = GNUNET_TIME_absolute_hton (be->until);
+  GNUNET_SERVER_notification_context_unicast (blacklist_notifiers,
+                                             client,
+                                             &msg.header,
+                                             GNUNET_NO);
+  return GNUNET_YES;
+}
+
+
+/**
  * Handle a request for notification of blacklist changes.
  *
  * @param cls closure (always NULL)
@@ -184,13 +227,10 @@
                                          struct GNUNET_SERVER_Client *client,
                                          const struct GNUNET_MessageHeader 
*message)
 {
-  struct BlacklistNotificationList *bnl;
-
-  bnl = GNUNET_malloc (sizeof (struct BlacklistNotificationList));
-  bnl->next = blacklist_notifiers;
-  blacklist_notifiers = bnl;
-  /* FIXME */
-  GNUNET_SERVER_receive_done (client, GNUNET_OK);
+  GNUNET_SERVER_notification_context_add (blacklist_notifiers, client);
+  GNUNET_CONTAINER_multihashmap_iterate (blacklist,
+                                        &notify_blacklist_entry,
+                                        client);
 }
 
 
@@ -213,7 +253,8 @@
  * @param s scheduler to use
  */
 void 
-GNUNET_TRANSPORT_blacklist_init (struct GNUNET_SCHEDULER_Handle *s)
+GNUNET_TRANSPORT_blacklist_init (struct GNUNET_SERVER_Handle *server,
+                                struct GNUNET_SCHEDULER_Handle *s)
 {
   sched = s;
   blacklist = GNUNET_CONTAINER_multihashmap_create (4);
@@ -221,6 +262,8 @@
                                GNUNET_TIME_UNIT_FOREVER_REL,
                                &shutdown_task,
                                NULL);
+  blacklist_notifiers = GNUNET_SERVER_notification_context_create (server, 0);
 }
 
+
 /* end of gnunet-service-transport_blacklist.c */

Modified: gnunet/src/transport/gnunet-service-transport_blacklist.h
===================================================================
--- gnunet/src/transport/gnunet-service-transport_blacklist.h   2010-01-22 
14:27:22 UTC (rev 10116)
+++ gnunet/src/transport/gnunet-service-transport_blacklist.h   2010-01-22 
14:47:45 UTC (rev 10117)
@@ -69,10 +69,12 @@
 /**
  * Initialize the blacklisting subsystem.
  *
+ * @param server server we handle requests from (transport service server)
  * @param s scheduler to use
  */
 void 
-GNUNET_TRANSPORT_blacklist_init (struct GNUNET_SCHEDULER_Handle *s);
+GNUNET_TRANSPORT_blacklist_init (struct GNUNET_SERVER_Handle *server,
+                                struct GNUNET_SCHEDULER_Handle *s);
 
 
 #endif





reply via email to

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