/*
- * Copyright (c) 2008, 2009 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#define STATES \
STATE(VOID, 1 << 0) \
STATE(BACKOFF, 1 << 1) \
- STATE(CONNECTING, 1 << 2) \
- STATE(ACTIVE, 1 << 3) \
- STATE(IDLE, 1 << 4) \
- STATE(RECONNECT, 1 << 5)
+ STATE(START_CONNECT, 1 << 2) \
+ STATE(CONNECT_IN_PROGRESS, 1 << 3) \
+ STATE(ACTIVE, 1 << 4) \
+ STATE(IDLE, 1 << 5) \
+ STATE(RECONNECT, 1 << 6)
enum state {
#define STATE(NAME, VALUE) S_##NAME = VALUE,
STATES
void
reconnect_force_reconnect(struct reconnect *fsm, long long int now)
{
- if (fsm->state & (S_CONNECTING | S_ACTIVE | S_IDLE)) {
+ if (fsm->state & (S_START_CONNECT | S_CONNECT_IN_PROGRESS
+ | S_ACTIVE | S_IDLE)) {
reconnect_transition__(fsm, now, S_RECONNECT);
}
}
void
reconnect_connecting(struct reconnect *fsm, long long int now)
{
- if (fsm->state != S_CONNECTING) {
+ if (fsm->state != S_CONNECT_IN_PROGRESS) {
VLOG_INFO("%s: connecting...", fsm->name);
- reconnect_transition__(fsm, now, S_CONNECTING);
+ reconnect_transition__(fsm, now, S_CONNECT_IN_PROGRESS);
}
}
reconnect_transition__(struct reconnect *fsm, long long int now,
enum state state)
{
- if (fsm->state == S_CONNECTING) {
+ if (fsm->state == S_CONNECT_IN_PROGRESS) {
fsm->n_attempted_connections++;
if (state == S_ACTIVE) {
fsm->n_successful_connections++;
case S_BACKOFF:
return fsm->state_entered + fsm->backoff;
- case S_CONNECTING:
+ case S_START_CONNECT:
+ case S_CONNECT_IN_PROGRESS:
return fsm->state_entered + MAX(1000, fsm->backoff);
case S_ACTIVE:
case S_BACKOFF:
return RECONNECT_CONNECT;
- case S_CONNECTING:
+ case S_START_CONNECT:
+ case S_CONNECT_IN_PROGRESS:
return RECONNECT_DISCONNECT;
case S_ACTIVE:
NOT_REACHED();
} else {
- return fsm->state == S_CONNECTING ? RECONNECT_CONNECT : 0;
+ return fsm->state == S_START_CONNECT ? RECONNECT_CONNECT : 0;
}
}
run
should connect
connecting
- in CONNECTING for 0 ms (0 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (0 ms backoff)
# Connect after 500 ms.
advance 500
### t=1500 ###
- in CONNECTING for 500 ms (0 ms backoff)
+ in CONNECT_IN_PROGRESS for 500 ms (0 ms backoff)
run
- should connect
connected
in ACTIVE for 0 ms (0 ms backoff)
created 1000, last received 1000, last connected 1500
run
should connect
connecting
- in CONNECTING for 0 ms (0 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (0 ms backoff)
run
- should connect
timeout
advance 1000 ms
### t=2000 ###
- in CONNECTING for 1000 ms (0 ms backoff)
+ in CONNECT_IN_PROGRESS for 1000 ms (0 ms backoff)
run
should disconnect
connect-failed
# Second connection attempt fails after 1000 ms.
connecting
- in CONNECTING for 0 ms (1000 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (1000 ms backoff)
timeout
advance 1000 ms
### t=4000 ###
- in CONNECTING for 1000 ms (1000 ms backoff)
+ in CONNECT_IN_PROGRESS for 1000 ms (1000 ms backoff)
run
should disconnect
connect-failed
# Third connection attempt fails after 2000 ms.
connecting
- in CONNECTING for 0 ms (2000 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (2000 ms backoff)
timeout
advance 2000 ms
### t=8000 ###
- in CONNECTING for 2000 ms (2000 ms backoff)
+ in CONNECT_IN_PROGRESS for 2000 ms (2000 ms backoff)
run
should disconnect
connect-failed
# Third connection attempt fails after 4000 ms.
connecting
- in CONNECTING for 0 ms (4000 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (4000 ms backoff)
timeout
advance 4000 ms
### t=16000 ###
- in CONNECTING for 4000 ms (4000 ms backoff)
+ in CONNECT_IN_PROGRESS for 4000 ms (4000 ms backoff)
run
should disconnect
connect-failed
# Third connection attempt fails after 8000 ms.
connecting
- in CONNECTING for 0 ms (8000 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (8000 ms backoff)
timeout
advance 8000 ms
### t=32000 ###
- in CONNECTING for 8000 ms (8000 ms backoff)
+ in CONNECT_IN_PROGRESS for 8000 ms (8000 ms backoff)
run
should disconnect
connect-failed
# Fourth connection attempt fails after 8000 ms.
connecting
- in CONNECTING for 0 ms (8000 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (8000 ms backoff)
timeout
advance 8000 ms
### t=48000 ###
- in CONNECTING for 8000 ms (8000 ms backoff)
+ in CONNECT_IN_PROGRESS for 8000 ms (8000 ms backoff)
run
should disconnect
connect-failed
run
should connect
connecting
- in CONNECTING for 0 ms (0 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (0 ms backoff)
run
- should connect
timeout
advance 1000 ms
### t=2000 ###
- in CONNECTING for 1000 ms (0 ms backoff)
+ in CONNECT_IN_PROGRESS for 1000 ms (0 ms backoff)
run
should disconnect
connect-failed
# Second connection attempt fails after 1000 ms.
connecting
- in CONNECTING for 0 ms (1000 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (1000 ms backoff)
timeout
advance 1000 ms
### t=4000 ###
- in CONNECTING for 1000 ms (1000 ms backoff)
+ in CONNECT_IN_PROGRESS for 1000 ms (1000 ms backoff)
run
should disconnect
connect-failed
# Third connection attempt succeeds after 500 ms.
connecting
- in CONNECTING for 0 ms (2000 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (2000 ms backoff)
advance 500
### t=6500 ###
- in CONNECTING for 500 ms (2000 ms backoff)
+ in CONNECT_IN_PROGRESS for 500 ms (2000 ms backoff)
run
- should connect
connected
in ACTIVE for 0 ms (2000 ms backoff)
created 1000, last received 1000, last connected 6500
run
should connect
connecting
- in CONNECTING for 0 ms (0 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (0 ms backoff)
run
- should connect
timeout
advance 1000 ms
### t=2000 ###
- in CONNECTING for 1000 ms (0 ms backoff)
+ in CONNECT_IN_PROGRESS for 1000 ms (0 ms backoff)
run
should disconnect
connect-failed
# Second connection attempt fails after 1000 ms.
connecting
- in CONNECTING for 0 ms (1000 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (1000 ms backoff)
timeout
advance 1000 ms
### t=4000 ###
- in CONNECTING for 1000 ms (1000 ms backoff)
+ in CONNECT_IN_PROGRESS for 1000 ms (1000 ms backoff)
run
should disconnect
connect-failed
# Third connection attempt succeeds after 500 ms.
connecting
- in CONNECTING for 0 ms (2000 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (2000 ms backoff)
advance 500
### t=6500 ###
- in CONNECTING for 500 ms (2000 ms backoff)
+ in CONNECT_IN_PROGRESS for 500 ms (2000 ms backoff)
run
- should connect
connected
in ACTIVE for 0 ms (2000 ms backoff)
created 1000, last received 1000, last connected 6500
run
should connect
connecting
- in CONNECTING for 0 ms (0 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (0 ms backoff)
run
- should connect
timeout
advance 1000 ms
### t=2000 ###
- in CONNECTING for 1000 ms (0 ms backoff)
+ in CONNECT_IN_PROGRESS for 1000 ms (0 ms backoff)
run
should disconnect
connect-failed
# Second connection attempt fails after 1000 ms.
connecting
- in CONNECTING for 0 ms (1000 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (1000 ms backoff)
timeout
advance 1000 ms
### t=4000 ###
- in CONNECTING for 1000 ms (1000 ms backoff)
+ in CONNECT_IN_PROGRESS for 1000 ms (1000 ms backoff)
run
should disconnect
connect-failed
# Third connection attempt succeeds after 500 ms.
connecting
- in CONNECTING for 0 ms (2000 ms backoff)
+ in CONNECT_IN_PROGRESS for 0 ms (2000 ms backoff)
advance 500
### t=6500 ###
- in CONNECTING for 500 ms (2000 ms backoff)
+ in CONNECT_IN_PROGRESS for 500 ms (2000 ms backoff)
run
- should connect
connected
in ACTIVE for 0 ms (2000 ms backoff)
created 1000, last received 1000, last connected 6500