client: Connect to server before connecting to bankd
So far we skipped the client->server connection and related
configuration transfer from server to client. Now, the server
instructs the client to which bankd ip/port to connect.
Change-Id: I76c9498089515d1a6190f3e79e143b7df3a531bd
diff --git a/src/remsim_client_fsm.c b/src/remsim_client_fsm.c
index d361659..06df4e0 100644
--- a/src/remsim_client_fsm.c
+++ b/src/remsim_client_fsm.c
@@ -57,6 +57,7 @@
};
static const struct value_string remsim_client_bankd_fsm_event_names[] = {
+ OSMO_VALUE_STRING(BDC_E_ESTABLISH),
OSMO_VALUE_STRING(BDC_E_TCP_UP),
OSMO_VALUE_STRING(BDC_E_TCP_DOWN),
OSMO_VALUE_STRING(BDC_E_CLIENT_CONN_RES),
@@ -67,33 +68,10 @@
#define T2_RECONNECT 10
-static void bdc_st_init_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)
-{
- struct bankd_client *bc = (struct bankd_client *) fi->priv;
- int rc;
-
- printf("onenter\n");
- bc->bankd_conn = ipa_client_conn_create(bc, NULL, 0, bc->bankd_host, bc->bankd_port,
- bankd_updown_cb, bankd_read_cb, NULL, bc);
- if (!bc->bankd_conn) {
- fprintf(stderr, "Unable to create socket: %s\n", strerror(errno));
- exit(1);
- }
- /* Attempt to connect TCP socket */
- rc = ipa_client_conn_open(bc->bankd_conn);
- if (rc < 0) {
- fprintf(stderr, "Unable to connect: %s\n", strerror(errno));
- exit(1);
- }
-}
-
static void bdc_st_init(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
switch (event) {
- 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:
+ case BDC_E_ESTABLISH:
osmo_fsm_inst_state_chg(fi, BDC_ST_REESTABLISH, T2_RECONNECT, 2);
break;
default:
@@ -107,7 +85,7 @@
RsproPDU_t *pdu;
/* FIXME: Send ClientConnReq */
- pdu = rspro_gen_ConnectClientReq(&bc->own_comp_id, bc->clslot);
+ pdu = rspro_gen_ConnectClientReq(&bc->srv_conn.own_comp_id, bc->clslot);
ipa_client_conn_send_rspro(bc->bankd_conn, pdu);
}
@@ -142,6 +120,21 @@
struct bankd_client *bc = (struct bankd_client *) fi->priv;
int rc;
+ /* re-create bankd_conn */
+ if (bc->bankd_conn) {
+ LOGPFSML(fi, LOGL_INFO, "Destroying existing connection to bankd\n");
+ ipa_client_conn_destroy(bc->bankd_conn);
+ bc->bankd_conn = NULL;
+ }
+ LOGPFSML(fi, LOGL_INFO, "Creating TCP connection to bankd at %s:%u\n",
+ bc->bankd_host, bc->bankd_port);
+ bc->bankd_conn = ipa_client_conn_create(bc, NULL, 0, bc->bankd_host, bc->bankd_port,
+ bankd_updown_cb, bankd_read_cb, NULL, bc);
+ if (!bc->bankd_conn) {
+ fprintf(stderr, "Unable to create socket: %s\n", strerror(errno));
+ exit(1);
+ }
+
/* Attempt to connect TCP socket */
rc = ipa_client_conn_open(bc->bankd_conn);
if (rc < 0) {
@@ -166,14 +159,27 @@
}
}
+static void bdc_allstate_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)
+{
+ switch (event) {
+ case BDC_ST_REESTABLISH:
+ osmo_fsm_inst_state_chg(fi, BDC_ST_REESTABLISH, T2_RECONNECT, 2);
+ break;
+ default:
+ OSMO_ASSERT(0);
+ }
+}
+
static int remsim_client_bankd_fsm_timer_cb(struct osmo_fsm_inst *fi)
{
switch (fi->T) {
case 2:
+ /* TCP reconnect failed: retry */
osmo_fsm_inst_state_chg(fi, BDC_ST_REESTABLISH, T2_RECONNECT, 2);
break;
case 1:
- /* FIXME: close connection and re-start */
+ /* no ClientConnectRes received: disconnect + reconnect */
+ osmo_fsm_inst_state_chg(fi, BDC_ST_REESTABLISH, T2_RECONNECT, 2);
break;
default:
OSMO_ASSERT(0);
@@ -184,8 +190,8 @@
static const struct osmo_fsm_state bankd_conn_fsm_states[] = {
[BDC_ST_INIT] = {
.name = "INIT",
- .in_event_mask = S(BDC_E_TCP_UP) | S(BDC_E_TCP_DOWN),
- .out_state_mask = S(BDC_ST_ESTABLISHED) | S(BDC_ST_REESTABLISH),
+ .in_event_mask = 0, /* S(BDC_E_ESTABLISH) via allstate */
+ .out_state_mask = S(BDC_ST_REESTABLISH),
.action = bdc_st_init,
},
[BDC_ST_ESTABLISHED] = {
@@ -214,6 +220,8 @@
.name = "BANKD_CONN",
.states = bankd_conn_fsm_states,
.num_states = ARRAY_SIZE(bankd_conn_fsm_states),
+ .allstate_event_mask = S(BDC_E_ESTABLISH),
+ .allstate_action = bdc_allstate_action,
.timer_cb = remsim_client_bankd_fsm_timer_cb,
.log_subsys = DMAIN,
.event_names = remsim_client_bankd_fsm_event_names,
@@ -228,8 +236,6 @@
return -1;
bc->bankd_fi = fi;
- /* onenter of the initial state is not automatically executed by osmo_fsm :( */
- bdc_st_init_onenter(fi, 0);
return 0;
}