int backoff;
int max_backoff;
time_t backoff_deadline;
- time_t last_received;
time_t last_connected;
time_t last_disconnected;
unsigned int packets_sent;
time_t creation_time;
unsigned long int total_time_connected;
- /* Throughout this file, "probe" is shorthand for "inactivity probe".
- * When nothing has been received from the peer for a while, we send out
- * an echo request as an inactivity probe packet. We should receive back
- * a response. */
+ /* Throughout this file, "probe" is shorthand for "inactivity probe". When
+ * no activity has been observed from the peer for a while, we send out an
+ * echo request as an inactivity probe packet. We should receive back a
+ * response.
+ *
+ * "Activity" is defined as either receiving an OpenFlow message from the
+ * peer or successfully sending a message that had been in 'txq'. */
int probe_interval; /* Secs of inactivity before sending probe. */
+ time_t last_activity; /* Last time we saw some activity. */
/* When we create a vconn we obtain these values, to save them past the end
* of the vconn's lifetime. Otherwise, in-band control will only allow
rc->backoff = 0;
rc->max_backoff = max_backoff ? max_backoff : 8;
rc->backoff_deadline = TIME_MIN;
- rc->last_received = time_now();
rc->last_connected = TIME_MIN;
rc->last_disconnected = TIME_MIN;
rc->seqno = 0;
rc->creation_time = time_now();
rc->total_time_connected = 0;
+ rc->last_activity = time_now();
+
rconn_set_probe_interval(rc, probe_interval);
rconn_set_dscp(rc, dscp);
if (error) {
break;
}
+ rc->last_activity = time_now();
}
if (list_is_empty(&rc->txq)) {
poll_immediate_wake();
timeout_ACTIVE(const struct rconn *rc)
{
if (rc->probe_interval) {
- unsigned int base = MAX(rc->last_received, rc->state_entered);
+ unsigned int base = MAX(rc->last_activity, rc->state_entered);
unsigned int arg = base + rc->probe_interval - rc->state_entered;
return arg;
}
run_ACTIVE(struct rconn *rc)
{
if (timed_out(rc)) {
- unsigned int base = MAX(rc->last_received, rc->state_entered);
+ unsigned int base = MAX(rc->last_activity, rc->state_entered);
VLOG_DBG("%s: idle %u seconds, sending inactivity probe",
rc->name, (unsigned int) (time_now() - base));
rc->probably_admitted = true;
rc->last_admitted = time_now();
}
- rc->last_received = time_now();
+ rc->last_activity = time_now();
rc->packets_received++;
if (rc->state == S_IDLE) {
state_transition(rc, S_ACTIVE);