remsim_client_fsm: Handle re-connect timeout and initial connection failure
Change-Id: Id229459a8fa484276c0ca0413356c16930269c36
diff --git a/src/remsim_client_fsm.c b/src/remsim_client_fsm.c
index fc776ed..2459a14 100644
--- a/src/remsim_client_fsm.c
+++ b/src/remsim_client_fsm.c
@@ -78,6 +78,9 @@
case BDC_E_TCP_UP:
osmo_fsm_inst_state_chg(fi, BDC_ST_ESTABLISHED, T1_WAIT_CLIENT_CONN_RES, 1);
break;
+ case BDC_E_TCP_DOWN:
+ osmo_fsm_inst_state_chg(fi, BDC_ST_REESTABLISH, T2_RECONNECT, 2);
+ break;
default:
OSMO_ASSERT(0);
}
@@ -141,6 +144,9 @@
case BDC_E_TCP_UP:
osmo_fsm_inst_state_chg(fi, BDC_ST_ESTABLISHED, T1_WAIT_CLIENT_CONN_RES, 1);
break;
+ case BDC_E_TCP_DOWN:
+ /* wait for normal T2 timeout */
+ break;
default:
OSMO_ASSERT(0);
}
@@ -148,14 +154,24 @@
static int remsim_client_bankd_fsm_timer_cb(struct osmo_fsm_inst *fi)
{
+ switch (fi->T) {
+ case 2:
+ osmo_fsm_inst_state_chg(fi, BDC_ST_REESTABLISH, T2_RECONNECT, 2);
+ break;
+ case 1:
+ /* FIXME: close connection and re-start */
+ break;
+ default:
+ OSMO_ASSERT(0);
+ }
return 0;
}
static const struct osmo_fsm_state bankd_conn_fsm_states[] = {
[BDC_ST_INIT] = {
.name = "INIT",
- .in_event_mask = S(BDC_E_TCP_UP),
- .out_state_mask = S(BDC_ST_ESTABLISHED),
+ .in_event_mask = S(BDC_E_TCP_UP) | S(BDC_E_TCP_DOWN),
+ .out_state_mask = S(BDC_ST_ESTABLISHED) | S(BDC_ST_REESTABLISH),
.action = bdc_st_init,
},
[BDC_ST_ESTABLISHED] = {
@@ -173,8 +189,8 @@
},
[BDC_ST_REESTABLISH] = {
.name = "REESTABLISH",
- .in_event_mask = S(BDC_E_TCP_UP),
- .out_state_mask = S(BDC_ST_ESTABLISHED),
+ .in_event_mask = S(BDC_E_TCP_UP) | S(BDC_E_TCP_DOWN),
+ .out_state_mask = S(BDC_ST_ESTABLISHED) | S(BDC_ST_REESTABLISH),
.action = bdc_st_reestablish,
.onenter = bdc_st_reestablish_onenter,
},
@@ -306,6 +322,9 @@
case SRVC_E_TCP_UP:
osmo_fsm_inst_state_chg(fi, SRVC_ST_ESTABLISHED, T1_WAIT_CLIENT_CONN_RES, 1);
break;
+ case SRVC_E_TCP_DOWN:
+ osmo_fsm_inst_state_chg(fi, SRVC_ST_REESTABLISH, T2_RECONNECT, 2);
+ break;
default:
OSMO_ASSERT(0);
}
@@ -365,9 +384,12 @@
static void srvc_st_reestablish(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
switch (event) {
- case BDC_E_TCP_UP:
+ case SRVC_E_TCP_UP:
osmo_fsm_inst_state_chg(fi, SRVC_ST_ESTABLISHED, T1_WAIT_CLIENT_CONN_RES, 1);
break;
+ case SRVC_E_TCP_DOWN:
+ /* wait for normal T2 call-back */
+ break;
default:
OSMO_ASSERT(0);
}
@@ -375,14 +397,25 @@
static int server_conn_fsm_timer_cb(struct osmo_fsm_inst *fi)
{
+ switch (fi->T) {
+ case 2:
+ osmo_fsm_inst_state_chg(fi, SRVC_ST_REESTABLISH, T2_RECONNECT, 2);
+ break;
+ case 1:
+ /* FIXME: close connection and re-start connection attempt */
+ break;
+ default:
+ OSMO_ASSERT(0);
+ }
+
return 0;
}
static const struct osmo_fsm_state server_conn_fsm_states[] = {
[SRVC_ST_INIT] = {
.name = "INIT",
- .in_event_mask = S(SRVC_E_TCP_UP),
- .out_state_mask = S(SRVC_ST_ESTABLISHED),
+ .in_event_mask = S(SRVC_E_TCP_UP) | S(SRVC_E_TCP_DOWN),
+ .out_state_mask = S(SRVC_ST_ESTABLISHED) | S(SRVC_ST_REESTABLISH),
.action = srvc_st_init,
.onenter = srvc_st_init_onenter,
},
@@ -401,8 +434,8 @@
},
[SRVC_ST_REESTABLISH] = {
.name = "REESTABLISH",
- .in_event_mask = S(SRVC_E_TCP_UP),
- .out_state_mask = S(SRVC_ST_ESTABLISHED),
+ .in_event_mask = S(SRVC_E_TCP_UP) | S(SRVC_E_TCP_DOWN),
+ .out_state_mask = S(SRVC_ST_ESTABLISHED) | S(SRVC_ST_REESTABLISH),
.action = srvc_st_reestablish,
.onenter = srvc_st_reestablish_onenter,
},