---
 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

Reply via email to