Split "RSPRO client FSM" from "BANKD client FSM"
This allows the RSPRO client FSM to be used by both remsim-client
as well as remsim-bankd -- both of which connect as RSPRO client to
remsim-server.
Change-Id: I57b5f8dc9de522b6ae8ceb030e639b5b8001b55a
diff --git a/src/remsim_client_fsm.c b/src/remsim_client_fsm.c
index f1af705..4675113 100644
--- a/src/remsim_client_fsm.c
+++ b/src/remsim_client_fsm.c
@@ -17,6 +17,13 @@
#define S(x) (1 << (x))
+#define T1_WAIT_CLIENT_CONN_RES 10
+#define T2_RECONNECT 10
+
+/***********************************************************************
+ * server connection FSM: remsim-{client,bankd} to remsim-server
+ ***********************************************************************/
+
static void push_and_send(struct ipa_client_conn *ipa, struct msgb *msg_tx)
{
ipa_prepend_header_ext(msg_tx, IPAC_PROTO_EXT_RSPRO);
@@ -32,217 +39,6 @@
push_and_send(ipa, msg);
}
-static void bankd_updown_cb(struct ipa_client_conn *conn, int up)
-{
- struct bankd_client *bc = conn->data;
-
- printf("RSPRO link to %s:%d %s\n", conn->addr, conn->port, up ? "UP" : "DOWN");
-
- osmo_fsm_inst_dispatch(bc->bankd_fi, up ? BDC_E_TCP_UP: BDC_E_TCP_DOWN, 0);
-}
-
-/***********************************************************************
- * bankd connection FSM
- ***********************************************************************/
-
-enum bankd_conn_fsm_state {
- /* waiting for initial connectiong to remsim-bankd */
- BDC_ST_INIT,
- /* bankd connection established, waiting for ClientConnectRes */
- BDC_ST_ESTABLISHED,
- /* bankd connection etsablished, ClientConnect succeeded */
- BDC_ST_CONNECTED,
- /* connection lost, we're waiting for a re-establish */
- BDC_ST_REESTABLISH,
-};
-
-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),
- { 0, NULL }
-};
-
-#define T1_WAIT_CLIENT_CONN_RES 10
-#define T2_RECONNECT 10
-
-
-static void bdc_st_init(struct osmo_fsm_inst *fi, uint32_t event, void *data)
-{
- switch (event) {
- case BDC_E_ESTABLISH:
- osmo_fsm_inst_state_chg(fi, BDC_ST_REESTABLISH, T2_RECONNECT, 2);
- break;
- default:
- OSMO_ASSERT(0);
- }
-}
-
-static void bdc_st_established_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)
-{
- struct bankd_client *bc = (struct bankd_client *) fi->priv;
- RsproPDU_t *pdu;
-
- /* FIXME: Send ClientConnReq */
- pdu = rspro_gen_ConnectClientReq(&bc->srv_conn.own_comp_id, bc->srv_conn.clslot);
- ipa_client_conn_send_rspro(bc->bankd_conn, pdu);
-}
-
-static void bdc_st_established(struct osmo_fsm_inst *fi, uint32_t event, void *data)
-{
- switch (event) {
- case BDC_E_TCP_DOWN:
- osmo_fsm_inst_state_chg(fi, BDC_ST_REESTABLISH, T2_RECONNECT, 2);
- break;
- case BDC_E_CLIENT_CONN_RES:
- /* somehow notify the main code? */
- osmo_fsm_inst_state_chg(fi, BDC_ST_CONNECTED, 0, 0);
- break;
- default:
- OSMO_ASSERT(0);
- }
-}
-
-static void bdc_st_connected(struct osmo_fsm_inst *fi, uint32_t event, void *data)
-{
- switch (event) {
- case BDC_E_TCP_DOWN:
- osmo_fsm_inst_state_chg(fi, BDC_ST_REESTABLISH, T2_RECONNECT, 2);
- break;
- default:
- OSMO_ASSERT(0);
- }
-}
-
-static void bdc_st_reestablish_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)
-{
- 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) {
- fprintf(stderr, "Unable to connect RSPRO to %s:%d - %s\n",
- bc->bankd_conn->addr, bc->bankd_conn->port, strerror(errno));
- /* FIXME: retry? Timer? Abort? */
- OSMO_ASSERT(0);
- }
-}
-
-static void bdc_st_reestablish(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:
- /* wait for normal T2 timeout */
- break;
- default:
- OSMO_ASSERT(0);
- }
-}
-
-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:
- /* no ClientConnectRes received: disconnect + reconnect */
- osmo_fsm_inst_state_chg(fi, BDC_ST_REESTABLISH, T2_RECONNECT, 2);
- 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 = 0, /* S(BDC_E_ESTABLISH) via allstate */
- .out_state_mask = S(BDC_ST_REESTABLISH),
- .action = bdc_st_init,
- },
- [BDC_ST_ESTABLISHED] = {
- .name = "ESTABLISHED",
- .in_event_mask = S(BDC_E_TCP_DOWN) | S(BDC_E_CLIENT_CONN_RES),
- .out_state_mask = S(BDC_ST_CONNECTED) | S(BDC_ST_REESTABLISH),
- .action = bdc_st_established,
- .onenter = bdc_st_established_onenter,
- },
- [BDC_ST_CONNECTED] = {
- .name = "CONNECTED",
- .in_event_mask = S(BDC_E_TCP_DOWN),
- .out_state_mask = S(BDC_ST_REESTABLISH),
- .action = bdc_st_connected,
- },
- [BDC_ST_REESTABLISH] = {
- .name = "REESTABLISH",
- .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,
- },
-};
-
-struct osmo_fsm remsim_client_bankd_fsm = {
- .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,
-};
-
-int bankd_conn_fsm_alloc(struct bankd_client *bc)
-{
- struct osmo_fsm_inst *fi;
-
- fi = osmo_fsm_inst_alloc(&remsim_client_bankd_fsm, bc, bc, LOGL_DEBUG, "bankd");
- if (!fi)
- return -1;
-
- bc->bankd_fi = fi;
- return 0;
-}
-
-/***********************************************************************
- * server connection FSM
- ***********************************************************************/
-
enum server_conn_fsm_state {
/* waiting for initial connectiong to remsim-server */
SRVC_ST_INIT,
@@ -387,7 +183,10 @@
ipa_keepalive_fsm_start(srvc->keepalive_fi);
- pdu = rspro_gen_ConnectClientReq(&srvc->own_comp_id, srvc->clslot);
+ if (srvc->own_comp_id.type == ComponentType_remsimClient)
+ pdu = rspro_gen_ConnectClientReq(&srvc->own_comp_id, srvc->clslot);
+ else
+ pdu = rspro_gen_ConnectBankReq(&srvc->own_comp_id, 1, 8 /* FIXME */);
ipa_client_conn_send_rspro(srvc->conn, pdu);
}
@@ -521,6 +320,5 @@
static __attribute__((constructor)) void on_dso_load(void)
{
- osmo_fsm_register(&remsim_client_bankd_fsm);
osmo_fsm_register(&remsim_client_server_fsm);
}