[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r10126 - in gnunet: . src/include src/topology
From: |
gnunet |
Subject: |
[GNUnet-SVN] r10126 - in gnunet: . src/include src/topology |
Date: |
Fri, 22 Jan 2010 18:54:18 +0100 |
Author: grothoff
Date: 2010-01-22 18:54:18 +0100 (Fri, 22 Jan 2010)
New Revision: 10126
Modified:
gnunet/BUGS
gnunet/TODO
gnunet/src/include/gnunet_core_service.h
gnunet/src/topology/gnunet-daemon-topology.c
Log:
stuff
Modified: gnunet/BUGS
===================================================================
--- gnunet/BUGS 2010-01-22 17:30:57 UTC (rev 10125)
+++ gnunet/BUGS 2010-01-22 17:54:18 UTC (rev 10126)
@@ -8,10 +8,6 @@
[On W32, we need to select after calling socket before
doing connect etc.]
* TRANSPORT:
- - transport_api: support forcing disconnects through low quotas!
- (required for working F2F support!)
- - API: consider having core provide deadline information for each message
- (likely important for DV plugin which wants to loop back!)
- implement transport API to pretty-print transport address
+ transport_api extension (API extension!)
+ service-transport extension (protocol extension)
@@ -51,15 +47,8 @@
+ How necessary is ACKing in the first place? (alternatives?)
+ Should we transmit ACKs in response to every HELLO? (would that
fully address the problem?)
- - latency measurements implemented in the transport
- plugins makes it only work for bi-di transports
- and results in code replication
- - should latency be included in the ReceiveCallback and
- NotifyConnect or passed on request?
- - FIXME's with latency being simply set to 0 in a few places
- [./transport/gnunet-service-transport.c:173]: (style) struct or union
member 'TransportPlugin::rebuild' is never used
- [./transport/plugin_transport_tcp.c:391]: (style) struct or union member
'Plugin::address_update_task' is never used
-
* FS:
- [./fs/gnunet-service-fs.c:208]: (style) struct or union member
'LocalGetContext::results_bf_size' is never used
- [./fs/gnunet-service-fs.c:501]: (style) struct or union member
'PendingRequest::used_pids_size' is never used
@@ -69,10 +58,27 @@
- [./fs/gnunet-service-fs.c:688]: (style) struct or union member
'ConnectedPeer::pending_requests' is never used
- [./fs/gnunet-service-fs.c:694]: (style) struct or union member
'ConnectedPeer::last_p2p_replies_woff' is never used
- [./fs/gnunet-service-fs.c:700]: (style) struct or union member
'ConnectedPeer::last_client_replies_woff' is never used
-
* TOPOLOGY:
- - [./topology/gnunet-daemon-topology.c:94]: (style) struct or union member
'PeerList::last_hello_sent' is never used
-
+ - If the topology daemon crashes, peers that were put on the
+ blacklist with transport will never be removed from it (until
+ transport service dies); we should use the blacklist notification
+ API to learn about the exact set of blacklisted peers at all times
+ (FIXME: the transport_api implementation of blacklisting
+ also does not work nicely for this since it won't let us know about
+ disconnect-reconnect events and the implicit whitelisting
+ that might happen here; that's not so bad since we will
+ re-blacklist on pre-connect attempts anyway, so this is
+ a minor issue).
+ - the code uses the term 'blacklist' for both peers that are forbidden
+ to connect (i.e. F2F mode) as well as peers that we currently
+ won't try to actively connect to ourselves (since we just tried);
+ This is confusing. We need two distinct terms.
+ - move code to use hash table instead of linked list
+ - instead of periodically discarding blacklisted entries,
+ simply add task that is triggered at the right time (earlier free,
+ more balanced load)
+ - check if new HELLO learned is different from old HELLO
+ before resetting entire state!
* SETUP:
- auto-generate "defaults.conf" using gnunet-setup from "config.scm"
- integrate all options into "config.scm"
Modified: gnunet/TODO
===================================================================
--- gnunet/TODO 2010-01-22 17:30:57 UTC (rev 10125)
+++ gnunet/TODO 2010-01-22 17:54:18 UTC (rev 10126)
@@ -21,8 +21,6 @@
- main service not implemented [Nate]
- testcases crash & burn (no surprise)
* CORE:
- - request disconnect not implemented [Christian]
- - various notification options not implemented [Christian]
- outbound message monitoring not supported [Christian]
- test currently fails spectacularly [segv of transport service]
=> need transport to work first!
@@ -30,9 +28,7 @@
* TOPOLOGY:
- needs testing [need transport first]
* HOSTLIST:
- - test fails (looks like it works, but that's because of a bad
- connectivity notification; somehow core is unable to send
- messages successfully via transport) [need transport first]
+ - needs testing [need transport first]
* FS (basic anonymous FS only)
- implement FS service (P2P operations)
+ how to send queries (soliciting is not there in core; do we
Modified: gnunet/src/include/gnunet_core_service.h
===================================================================
--- gnunet/src/include/gnunet_core_service.h 2010-01-22 17:30:57 UTC (rev
10125)
+++ gnunet/src/include/gnunet_core_service.h 2010-01-22 17:54:18 UTC (rev
10126)
@@ -269,6 +269,7 @@
*/
struct GNUNET_CORE_InformationRequestContext;
+
/**
* Obtain statistics and/or change preferences for the given peer.
*
Modified: gnunet/src/topology/gnunet-daemon-topology.c
===================================================================
--- gnunet/src/topology/gnunet-daemon-topology.c 2010-01-22 17:30:57 UTC
(rev 10125)
+++ gnunet/src/topology/gnunet-daemon-topology.c 2010-01-22 17:54:18 UTC
(rev 10126)
@@ -22,14 +22,6 @@
* @file topology/gnunet-daemon-topology.c
* @brief code for maintaining the mesh topology
* @author Christian Grothoff
- *
- * OPTIMIZATIONS:
- * - move code to use hash table instead of linked list
- * - instead of periodically discarding blacklisted entries,
- * simply add task that is triggered at the right time (earlier free,
- * more balanced load)
- * - check if new HELLO learned is different from old HELLO
- * before resetting entire state!
*/
#include <stdlib.h>
@@ -101,6 +93,12 @@
struct GNUNET_CONTAINER_BloomFilter *filter;
/**
+ * Our request handle for *whitelisting* this peer (NULL if
+ * no whitelisting request is pending).
+ */
+ struct GNUNET_TRANSPORT_BlacklistRequest *wh;
+
+ /**
* Is this peer listed here because he is a friend?
*/
int is_friend;
@@ -111,6 +109,11 @@
int is_connected;
/**
+ * Are we currently blocking this peer (via blacklist)?
+ */
+ int is_blocked;
+
+ /**
* Until what time should we not try to connect again
* to this peer?
*/
@@ -269,13 +272,19 @@
/**
* Force a disconnect from the specified peer.
- * FIXME: this policy change is never undone; how do we reconnect ever?
*/
static void
-force_disconnect (const struct GNUNET_PeerIdentity *peer)
+force_disconnect (struct PeerList *pl)
{
+ const struct GNUNET_PeerIdentity *peer = &pl->id;
struct DisconnectList *dl;
+ if (NULL != dl->wh)
+ {
+ GNUNET_TRANSPORT_blacklist_cancel (dl->wh);
+ dl->wh = NULL;
+ }
+ pl->is_blocked = GNUNET_YES;
dl = GNUNET_malloc (sizeof (struct DisconnectList));
dl->peer = *peer;
GNUNET_CONTAINER_DLL_insert (disconnect_head,
@@ -290,7 +299,64 @@
}
+
/**
+ * Function called once our request to 'whitelist' a peer
+ * has completed.
+ *
+ * @param cls our 'struct PeerList'
+ * @param tc unused
+ */
+static void
+whitelist_done (void *cls,
+ const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ struct PeerList *pl = cls;
+
+ pl->wh = NULL;
+}
+
+
+/**
+ * Whitelist all peers that we blacklisted; we've passed
+ * the minimum number of friends.
+ */
+static void
+whitelist_peers ()
+{
+ struct PeerList *pl;
+ struct DisconnectList *dl;
+
+ /* first, cancel all blacklisting requests */
+ while (NULL != (dl = disconnect_head))
+ {
+ GNUNET_CONTAINER_DLL_remove (disconnect_head,
+ disconnect_tail,
+ dl);
+ GNUNET_TRANSPORT_blacklist_cancel (dl->rh);
+ GNUNET_free (dl);
+ }
+ /* then, specifically whitelist all peers that we
+ know to have blacklisted */
+ pl = peers;
+ while (pl != NULL)
+ {
+ if (pl->is_blocked)
+ {
+ pl->wh = GNUNET_TRANSPORT_blacklist (sched, cfg,
+ peer,
+ GNUNET_TIME_UNIT_FOREVER_ZERO,
+ GNUNET_TIME_UNIT_FOREVER_REL,
+ &whitelist_done,
+ pl);
+ pl->is_blocked = GNUNET_NO;
+ }
+ pl = pl->next;
+ }
+}
+
+
+/**
* Function called by core when our attempt to connect succeeded.
*/
static void
@@ -434,6 +500,8 @@
prev->next = pos->next;
if (pos->hello_req != NULL)
GNUNET_CORE_notify_transmit_ready_cancel (pos->hello_req);
+ if (pos->wh != NULL)
+ GNUNET_TRANSPORT_blacklist_cancel (pos->wh);
if (pos->connect_req != NULL)
GNUNET_CORE_peer_request_connect_cancel (pos->connect_req);
if (pos->hello_delay_task != GNUNET_SCHEDULER_NO_TASK)
@@ -611,7 +679,7 @@
"Connection to `%s' is forbidden, forcing disconnect!\n",
GNUNET_i2s (peer));
#endif
- force_disconnect (&pos->id);
+ force_disconnect (pos);
return;
}
}
@@ -622,7 +690,12 @@
}
pos->is_connected = GNUNET_YES;
if (pos->is_friend)
- friend_count++;
+ {
+ if ( (friend_count == minimum_friend_count - 1) &&
+ (GNUNET_YES != friends_only) )
+ whitelist_peers ();
+ friend_count++;
+ }
reschedule_hellos (pos);
}
@@ -646,7 +719,7 @@
"Connection to `%s' is not from a friend, forcing
disconnect!\n",
GNUNET_i2s (&pos->id));
#endif
- force_disconnect (&pos->id);
+ force_disconnect (pos);
}
pos = pos->next;
}
@@ -884,6 +957,7 @@
next = pos->next;
if ( (GNUNET_NO == pos->is_friend) &&
(GNUNET_NO == pos->is_connected) &&
+ (GNUNET_NO == pos->is_blocked) &&
(0 == GNUNET_TIME_absolute_get_remaining
(pos->blacklisted_until).value) )
free_peer (pos);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r10126 - in gnunet: . src/include src/topology,
gnunet <=