client: transmit RSPRO via bankd_conn_fsm

This fixes a crash where the modem/phone would sent APDUs at a time
when there is no connection to the bankd yet.  If we transmit the
RSPRO PDUs via the FSM, this cannot happen.

Change-Id: I965666ae4622c403e63c060deaa4d80e9249d155
diff --git a/src/bankd_client_fsm.c b/src/bankd_client_fsm.c
index bba5128..0e17b10 100644
--- a/src/bankd_client_fsm.c
+++ b/src/bankd_client_fsm.c
@@ -47,11 +47,21 @@
 	osmo_fsm_inst_dispatch(bc->bankd_fi, up ? BDC_E_TCP_UP: BDC_E_TCP_DOWN, 0);
 }
 
-int bankd_conn_send_rspro(struct bankd_client *bc, RsproPDU_t *rspro)
+/* internal function, bypassing FSM state */
+static int _bankd_conn_send_rspro(struct bankd_client *bc, RsproPDU_t *rspro)
 {
 	return ipa_client_conn_send_rspro(bc->bankd_conn, rspro);
 }
 
+int bankd_conn_send_rspro(struct bankd_client *bc, RsproPDU_t *rspro)
+{
+	if (osmo_fsm_inst_dispatch(bc->bankd_fi, BDC_E_RSPRO_TX, rspro) < 0) {
+		ASN_STRUCT_FREE(asn_DEF_RsproPDU, rspro);
+		return -1;
+	}
+	return 0;
+}
+
 /***********************************************************************
  * bankd connection FSM: Remsim Client connection to Bankd
  ***********************************************************************/
@@ -72,6 +82,7 @@
 	OSMO_VALUE_STRING(BDC_E_TCP_UP),
 	OSMO_VALUE_STRING(BDC_E_TCP_DOWN),
 	OSMO_VALUE_STRING(BDC_E_CLIENT_CONN_RES),
+	OSMO_VALUE_STRING(BDC_E_RSPRO_TX),
 	{ 0, NULL }
 };
 
@@ -97,7 +108,7 @@
 
 	/* FIXME: Send ClientConnReq */
 	pdu = rspro_gen_ConnectClientReq(&bc->srv_conn.own_comp_id, bc->srv_conn.clslot);
-	bankd_conn_send_rspro(bc, pdu);
+	_bankd_conn_send_rspro(bc, pdu);
 }
 
 static void bdc_st_established(struct osmo_fsm_inst *fi, uint32_t event, void *data)
@@ -117,10 +128,17 @@
 
 static void bdc_st_connected(struct osmo_fsm_inst *fi, uint32_t event, void *data)
 {
+	struct bankd_client *bc = (struct bankd_client *) fi->priv;
+	RsproPDU_t *pdu = NULL;
+
 	switch (event) {
 	case BDC_E_TCP_DOWN:
 		osmo_fsm_inst_state_chg(fi, BDC_ST_REESTABLISH, T2_RECONNECT, 2);
 		break;
+	case BDC_E_RSPRO_TX:
+		pdu = data;
+		_bankd_conn_send_rspro(bc, pdu);
+		break;
 	default:
 		OSMO_ASSERT(0);
 	}
@@ -214,7 +232,7 @@
 	},
 	[BDC_ST_CONNECTED] = {
 		.name = "CONNECTED",
-		.in_event_mask = S(BDC_E_TCP_DOWN),
+		.in_event_mask = S(BDC_E_TCP_DOWN) | S(BDC_E_RSPRO_TX),
 		.out_state_mask = S(BDC_ST_REESTABLISH),
 		.action = bdc_st_connected,
 	},