---
lib/reconnect.c | 18 ++++++++++++++++++
lib/reconnect.h | 4 ++++
2 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/lib/reconnect.c b/lib/reconnect.c
index d7357c2..c39c330 100644
--- a/lib/reconnect.c
+++ b/lib/reconnect.c
@@ -60,6 +60,7 @@ struct reconnect {
int backoff;
long long int last_received;
long long int last_connected;
+ long long int last_disconnected;
unsigned int max_tries;
/* These values are simply for statistics reporting, not otherwise used
@@ -106,6 +107,7 @@ reconnect_create(long long int now)
fsm->backoff = 0;
fsm->last_received = now;
fsm->last_connected = now;
+ fsm->last_disconnected = 0;
fsm->max_tries = UINT_MAX;
fsm->creation_time = now;
@@ -353,6 +355,9 @@ reconnect_disconnected(struct reconnect *fsm, long long int
now, int error)
}
}
+ if (fsm->state & (S_ACTIVE | S_IDLE)) {
+ fsm->last_disconnected = now;
+ }
/* Back off. */
if (fsm->state & (S_ACTIVE | S_IDLE)
&& (fsm->last_received - fsm->last_connected >= fsm->backoff
@@ -646,6 +651,16 @@ reconnect_get_connection_duration(const struct reconnect
*fsm,
return reconnect_is_connected(fsm) ? now - fsm->last_connected : 0;
}
+/* Returns the number of milliseconds for which 'fsm' has been continuously
+ * disconnected from its peer. (If 'fsm' is not currently connected,
+ * this is 0.) */
+unsigned int
+reconnect_get_disconnect_duration(const struct reconnect *fsm,
+ long long int now)
+{
+ return reconnect_is_connected(fsm) ? 0 : now - fsm->last_disconnected;
+}
+
/* Copies various statistics for 'fsm' into '*stats'. */
void
reconnect_get_stats(const struct reconnect *fsm, long long int now,
@@ -654,11 +669,14 @@ reconnect_get_stats(const struct reconnect *fsm, long
long int now,
stats->creation_time = fsm->creation_time;
stats->last_received = fsm->last_received;
stats->last_connected = fsm->last_connected;
+ stats->last_disconnected = fsm->last_disconnected;
stats->backoff = fsm->backoff;
stats->seqno = fsm->seqno;
stats->is_connected = reconnect_is_connected(fsm);
stats->current_connection_duration
= reconnect_get_connection_duration(fsm, now);
+ stats->current_disconnect_duration
+ = reconnect_get_disconnect_duration(fsm, now);
stats->total_connected_duration = (stats->current_connection_duration
+ fsm->total_connected_duration);
stats->n_attempted_connections = fsm->n_attempted_connections;
diff --git a/lib/reconnect.h b/lib/reconnect.h
index d316448..52f1001 100644
--- a/lib/reconnect.h
+++ b/lib/reconnect.h
@@ -69,6 +69,8 @@ void reconnect_force_reconnect(struct reconnect *, long long
int now);
bool reconnect_is_connected(const struct reconnect *);
unsigned int reconnect_get_connection_duration(const struct reconnect *,
long long int now);
+unsigned int reconnect_get_disconnect_duration(const struct reconnect *,
+ long long int now);
void reconnect_disconnected(struct reconnect *, long long int now, int error);
void reconnect_connecting(struct reconnect *, long long int now);
@@ -93,12 +95,14 @@ struct reconnect_stats {
long long int creation_time; /* Time reconnect_create() called. */
long long int last_received; /* Last call to reconnect_received(). */
long long int last_connected; /* Last call to reconnect_connected(). */
+ long long int last_disconnected; /* Last call to reconnect_disconnected().
*/
int backoff; /* Current backoff duration. */
unsigned int seqno; /* # of connections + # of disconnections. */
bool is_connected; /* Currently connected? */
unsigned int current_connection_duration; /* Time of current connection. */
+ unsigned int current_disconnect_duration; /* Time disconnected (if
disconnected). */
unsigned int total_connected_duration; /* Sum of all connections. */
unsigned int n_attempted_connections;
unsigned int n_successful_connections;
--
1.7.2.3
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev