[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r17844 - gnunet/src/transport
From: |
gnunet |
Subject: |
[GNUnet-SVN] r17844 - gnunet/src/transport |
Date: |
Fri, 28 Oct 2011 17:13:19 +0200 |
Author: wachs
Date: 2011-10-28 17:13:19 +0200 (Fri, 28 Oct 2011)
New Revision: 17844
Modified:
gnunet/src/transport/gnunet-service-transport.c
gnunet/src/transport/gnunet-service-transport_neighbours_3way.c
Log:
complete state reset functionality
Modified: gnunet/src/transport/gnunet-service-transport.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport.c 2011-10-28 12:23:52 UTC
(rev 17843)
+++ gnunet/src/transport/gnunet-service-transport.c 2011-10-28 15:13:19 UTC
(rev 17844)
@@ -181,7 +181,7 @@
GST_clients_broadcast (&im->header, GNUNET_YES);
break;
case GNUNET_NO:
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
_("Discarded %u bytes of type %u from %s: quota violated or no
neighbour record!\n"),
ntohs (message->size),
ntohs (message->type),
@@ -285,6 +285,7 @@
GST_neighbours_keepalive (peer);
break;
default:
+
/* should be payload */
ret = process_payload (peer,
message,
Modified: gnunet/src/transport/gnunet-service-transport_neighbours_3way.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport_neighbours_3way.c
2011-10-28 12:23:52 UTC (rev 17843)
+++ gnunet/src/transport/gnunet-service-transport_neighbours_3way.c
2011-10-28 15:13:19 UTC (rev 17844)
@@ -58,6 +58,10 @@
#define ATS_RESPONSE_TIMEOUT GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_SECONDS, 3)
+
+#define SETUP_CONNECTION_TIMEOUT GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_SECONDS, 5)
+
+
/**
* Entry in neighbours.
*/
@@ -286,27 +290,30 @@
*/
struct GNUNET_TIME_Absolute connect_ts;
+ /**
+ * Timeout for ATS
+ * We asked ATS for a new address for this peer
+ */
GNUNET_SCHEDULER_TaskIdentifier ats_suggest;
/**
+ * Task the resets the peer state after due to an pending
+ * unsuccessful connection setup
+ */
+ GNUNET_SCHEDULER_TaskIdentifier state_reset;
+
+ /**
* How often has the other peer (recently) violated the inbound
* traffic limit? Incremented by 10 per violation, decremented by 1
* per non-violation (for each time interval).
*/
unsigned int quota_violation_count;
- /**
- * Number of values in 'ats' array.
- */
- //unsigned int ats_count;
-
/**
- * Do we currently consider this neighbour connected? (as far as
- * the connect/disconnect callbacks are concerned)?
+ * The current state of the peer
+ * Element of enum State
*/
- //int is_connected;
-
int state;
};
@@ -405,6 +412,49 @@
}
static int
+change (struct NeighbourMapEntry * n, int state, int line);
+
+static void
+ats_suggest_cancel (void *cls,
+ const struct GNUNET_SCHEDULER_TaskContext *tc);
+
+static void
+reset_task (void *cls,
+ const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ struct NeighbourMapEntry * n = cls;
+
+ n->state_reset = GNUNET_SCHEDULER_NO_TASK;
+
+#if DEBUG_TRANSPORT
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Connection to peer `%s' %s failed in state `%s', resetting connection
attempt \n",
+ GNUNET_i2s (&n->id), GST_plugins_a2s(n->plugin_name, n->addr,
n->addrlen), print_state(n->state));
+#endif
+ GNUNET_STATISTICS_update (GST_stats,
+ gettext_noop ("# failed connection attempts due to
timeout"),
+ 1,
+ GNUNET_NO);
+
+ /* resetting state */
+ n->state = S_NOT_CONNECTED;
+
+ /* destroying address */
+ GNUNET_ATS_address_destroyed (GST_ats,
+ &n->id,
+ n->plugin_name,
+ n->addr,
+ n->addrlen,
+ NULL);
+
+ /* request new address */
+ if (n->ats_suggest != GNUNET_SCHEDULER_NO_TASK)
+ GNUNET_SCHEDULER_cancel(n->ats_suggest);
+ n->ats_suggest = GNUNET_SCHEDULER_add_delayed (ATS_RESPONSE_TIMEOUT,
ats_suggest_cancel, n);
+ GNUNET_ATS_suggest_address(GST_ats, &n->id);
+}
+
+static int
change (struct NeighbourMapEntry * n, int state, int line)
{
char * old = strdup(print_state(n->state));
@@ -418,6 +468,14 @@
(state == S_DISCONNECT))
{
allowed = GNUNET_YES;
+
+ /* Schedule reset task */
+ if ((state == S_CONNECT_RECV) || (state == S_CONNECT_SENT) )
+ {
+ GNUNET_assert (n->state_reset == GNUNET_SCHEDULER_NO_TASK);
+ n->state_reset = GNUNET_SCHEDULER_add_delayed
(SETUP_CONNECTION_TIMEOUT, &reset_task, n);
+ }
+
break;
}
break;
@@ -425,6 +483,18 @@
if ((state == S_NOT_CONNECTED) || (state == S_DISCONNECT) ||
(state == S_CONNECTED) || /* FIXME SENT -> RECV ISSUE!*/ (state ==
S_CONNECT_SENT))
{
+ if ((state == S_CONNECTED) || (state == S_DISCONNECT) || (state ==
S_NOT_CONNECTED))
+ {
+#if DEBUG_TRANSPORT
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Removed reset task for peer `%s' %s failed in state transition
`%s' -> `%s' \n",
+ GNUNET_i2s (&n->id), GST_plugins_a2s(n->plugin_name, n->addr,
n->addrlen), print_state(n->state), print_state(state));
+#endif
+ GNUNET_assert (n->state_reset != GNUNET_SCHEDULER_NO_TASK);
+ GNUNET_SCHEDULER_cancel (n->state_reset);
+ n->state_reset = GNUNET_SCHEDULER_NO_TASK;
+ }
+
allowed = GNUNET_YES;
break;
}
@@ -433,6 +503,18 @@
if ((state == S_NOT_CONNECTED) || (state == S_CONNECTED) ||
(state == S_DISCONNECT) || /* FIXME SENT -> RECV ISSUE!*/ (state ==
S_CONNECT_RECV))
{
+ if ((state == S_CONNECTED) || (state == S_DISCONNECT) || (state ==
S_NOT_CONNECTED))
+ {
+#if DEBUG_TRANSPORT
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Removed reset task for peer `%s' %s failed in state transition
`%s' -> `%s' \n",
+ GNUNET_i2s (&n->id), GST_plugins_a2s(n->plugin_name, n->addr,
n->addrlen), print_state(n->state), print_state(state));
+#endif
+ GNUNET_assert (n->state_reset != GNUNET_SCHEDULER_NO_TASK);
+ GNUNET_SCHEDULER_cancel (n->state_reset);
+ n->state_reset = GNUNET_SCHEDULER_NO_TASK;
+ }
+
allowed = GNUNET_YES;
break;
}
@@ -470,8 +552,10 @@
}
n->state = state;
+#if DEBUG_TRANSPORT
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "State for neighbour `%s' %X changed
from `%s' to `%s' in line %u\n",
GNUNET_i2s (&n->id), n, old, new, line);
+#endif
GNUNET_free (old);
GNUNET_free (new);
return GNUNET_OK;
@@ -736,9 +820,6 @@
struct MessageQueue *mq;
int was_connected = is_connected(n);
- if (is_disconnecting(n) == GNUNET_YES)
- return;
-
/* send DISCONNECT MESSAGE */
if (is_connected(n) || is_connecting(n))
{
@@ -900,7 +981,7 @@
n->ats_suggest = GNUNET_SCHEDULER_NO_TASK;
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
" ATS did not suggested address to connect to peer `%s'\n",
GNUNET_i2s (&n->id));
@@ -1210,7 +1291,11 @@
}
return GNUNET_NO;
}
-
+ else if (n->state == S_CONNECT_SENT)
+ {
+ //FIXME
+ return GNUNET_NO;
+ }
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Invalid connection state to switch
addresses %u \n", n->state);
GNUNET_break_op (0);
return GNUNET_NO;
@@ -1477,9 +1562,6 @@
}
if (!is_connected(n))
{
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- _("Plugin gave us %d bytes of data but somehow the session is
not marked as UP yet!\n"),
- (int) size);
*do_forward = GNUNET_SYSERR;
return GNUNET_TIME_UNIT_ZERO;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r17844 - gnunet/src/transport,
gnunet <=