<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-remsim/+/16499">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
laforge: Looks good to me, approved
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">rspro_client_fsm: Disable automatic connect on FSM allocation<br><br>So far, the rspor_client_fsm immediately attempted to establish a<br>TCP connection to the RSPRO server when calling server_conn_fsm_alloc().<br><br>Let's make this implicit auto-connect an explicit request to connect<br>using the newly-introduced SRVC_E_ESTABLISH.<br><br>Let's also change all three existing users of server_conn_fsm_alloc()<br>to send SRVC_E_ESTABLISH after calling it.<br><br>The rationale of this change is to use the same rspro_client_fsm also<br>for the client->bankd RSPRO connection, where we don't want to<br>automatically connect at startup, but connect only at a later point, after the<br>server a has told us to do so.<br><br>Change-Id: Icd882405f2ef54e10a66054829c089e4985f1d1f<br>---<br>M src/bankd/bankd_main.c<br>M src/remsim_client.c<br>M src/rspro_client_fsm.c<br>M src/rspro_client_fsm.h<br>M src/simtrace2-remsim_client.c<br>5 files changed, 52 insertions(+), 51 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/bankd/bankd_main.c b/src/bankd/bankd_main.c</span><br><span>index a204be5..194baef 100644</span><br><span>--- a/src/bankd/bankd_main.c</span><br><span>+++ b/src/bankd/bankd_main.c</span><br><span>@@ -363,6 +363,7 @@</span><br><span> fprintf(stderr, "Unable to create Server conn FSM: %s\n", strerror(errno));</span><br><span> exit(1);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(srvc->fi, SRVC_E_ESTABLISH, NULL);</span><br><span> </span><br><span> /* create listening socket for inbound client connections */</span><br><span> rc = osmo_sock_init(AF_INET, SOCK_STREAM, IPPROTO_TCP, g_bind_ip, g_bind_port, OSMO_SOCK_F_BIND);</span><br><span>diff --git a/src/remsim_client.c b/src/remsim_client.c</span><br><span>index 0bfc0a4..ca6143e 100644</span><br><span>--- a/src/remsim_client.c</span><br><span>+++ b/src/remsim_client.c</span><br><span>@@ -255,6 +255,7 @@</span><br><span> fprintf(stderr, "Unable to create Server conn FSM: %s\n", strerror(errno));</span><br><span> exit(1);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(srvc->fi, SRVC_E_ESTABLISH, NULL);</span><br><span> </span><br><span> asn_debug = 0;</span><br><span> </span><br><span>diff --git a/src/rspro_client_fsm.c b/src/rspro_client_fsm.c</span><br><span>index 7045778..9f2d7c0 100644</span><br><span>--- a/src/rspro_client_fsm.c</span><br><span>+++ b/src/rspro_client_fsm.c</span><br><span>@@ -100,6 +100,7 @@</span><br><span> };</span><br><span> </span><br><span> static const struct value_string server_conn_fsm_event_names[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_VALUE_STRING(SRVC_E_ESTABLISH),</span><br><span> OSMO_VALUE_STRING(SRVC_E_TCP_UP),</span><br><span> OSMO_VALUE_STRING(SRVC_E_TCP_DOWN),</span><br><span> OSMO_VALUE_STRING(SRVC_E_KA_TIMEOUT),</span><br><span>@@ -180,52 +181,10 @@</span><br><span> .wait_for_resp = 10,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void srvc_st_init_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct rspro_server_conn *srvc = (struct rspro_server_conn *) fi->priv;</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- srvc->conn = ipa_client_conn_create(fi, NULL, 0, srvc->server_host, srvc->server_port,</span><br><span style="color: hsl(0, 100%, 40%);">- srvc_updown_cb, srvc_read_cb, NULL, srvc);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!srvc->conn) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPFSM(fi, "Unable to create socket: %s\n", strerror(errno));</span><br><span style="color: hsl(0, 100%, 40%);">- goto out_fi;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- srvc->keepalive_fi = ipa_client_conn_alloc_keepalive_fsm(srvc->conn, &ka_params, fi->id);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!srvc->keepalive_fi) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPFSM(fi, "Unable to create keepalive FSM\n");</span><br><span style="color: hsl(0, 100%, 40%);">- goto out_conn;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- /* ensure parent is notified once keepalive FSM instance is dying */</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_inst_change_parent(srvc->keepalive_fi, srvc->fi, SRVC_E_KA_TIMEOUT);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Attempt to connect TCP socket */</span><br><span style="color: hsl(0, 100%, 40%);">- rc = ipa_client_conn_open(srvc->conn);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPFSML(fi, LOGL_NOTICE, "Unable to connect: %s\n", strerror(errno));</span><br><span style="color: hsl(0, 100%, 40%);">- goto out_ka;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-out_ka:</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_inst_term(srvc->keepalive_fi, OSMO_FSM_TERM_ERROR, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-out_conn:</span><br><span style="color: hsl(0, 100%, 40%);">- ipa_client_conn_destroy(srvc->conn);</span><br><span style="color: hsl(0, 100%, 40%);">-out_fi:</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_inst_term(fi, OSMO_FSM_TERM_ERROR, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void srvc_st_init(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span> switch (event) {</span><br><span style="color: hsl(0, 100%, 40%);">- case SRVC_E_TCP_UP:</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_inst_state_chg(fi, SRVC_ST_ESTABLISHED, T1_WAIT_CLIENT_CONN_RES, 1);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case SRVC_E_TCP_DOWN:</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_inst_state_chg(fi, SRVC_ST_REESTABLISH, T2_RECONNECT, 2);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case SRVC_E_ESTABLISH:</span><br><span> default:</span><br><span> OSMO_ASSERT(0);</span><br><span> }</span><br><span>@@ -290,12 +249,39 @@</span><br><span> struct rspro_server_conn *srvc = (struct rspro_server_conn *) fi->priv;</span><br><span> int rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ipa_keepalive_fsm_stop(srvc->keepalive_fi);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (srvc->keepalive_fi) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_keepalive_fsm_stop(srvc->keepalive_fi);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_term(srvc->keepalive_fi, OSMO_FSM_TERM_REGULAR, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ srvc->keepalive_fi = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (srvc->conn) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSML(fi, LOGL_INFO, "Destroying existing connection to server\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_client_conn_close(srvc->conn);</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_client_conn_destroy(srvc->conn);</span><br><span style="color: hsl(120, 100%, 40%);">+ srvc->conn = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSML(fi, LOGL_INFO, "Creating TCP connection to server at %s:%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ srvc->server_host, srvc->server_port);</span><br><span style="color: hsl(120, 100%, 40%);">+ srvc->conn = ipa_client_conn_create(fi, NULL, 0, srvc->server_host, srvc->server_port,</span><br><span style="color: hsl(120, 100%, 40%);">+ srvc_updown_cb, srvc_read_cb, NULL, srvc);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!srvc->conn) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSML(fi, LOGL_FATAL, "Unable to create socket: %s\n", strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+ exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ srvc->keepalive_fi = ipa_client_conn_alloc_keepalive_fsm(srvc->conn, &ka_params, fi->id);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!srvc->keepalive_fi) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSM(fi, "Unable to create keepalive FSM\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* ensure parent is notified once keepalive FSM instance is dying */</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_change_parent(srvc->keepalive_fi, srvc->fi, SRVC_E_KA_TIMEOUT);</span><br><span> </span><br><span> /* Attempt to connect TCP socket */</span><br><span> rc = ipa_client_conn_open(srvc->conn);</span><br><span> if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPFSM(fi, "Unable to connect RSPRO to %s:%d - %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSML(fi, LOGL_FATAL, "Unable to connect RSPRO to %s:%u - %s\n",</span><br><span> srvc->server_host, srvc->server_port, strerror(errno));</span><br><span> /* FIXME: retry? Timer? Abort? */</span><br><span> OSMO_ASSERT(0);</span><br><span>@@ -316,16 +302,28 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void srvc_allstate_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case SRVC_E_ESTABLISH:</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_state_chg(fi, SRVC_ST_REESTABLISH, T2_RECONNECT, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(0);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int server_conn_fsm_timer_cb(struct osmo_fsm_inst *fi)</span><br><span> {</span><br><span> struct rspro_server_conn *srvc = (struct rspro_server_conn *) fi->priv;</span><br><span> </span><br><span> switch (fi->T) {</span><br><span> case 2:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TCP reconnect failed: retry */</span><br><span> osmo_fsm_inst_state_chg(fi, SRVC_ST_REESTABLISH, T2_RECONNECT, 2);</span><br><span> break;</span><br><span> case 1:</span><br><span style="color: hsl(0, 100%, 40%);">- /* close connection and re-start connection attempt */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* no ClientConnectRes received: disconnect + reconnect */</span><br><span> ipa_client_conn_close(srvc->conn);</span><br><span> osmo_fsm_inst_dispatch(fi, SRVC_E_TCP_DOWN, NULL);</span><br><span> break;</span><br><span>@@ -339,10 +337,9 @@</span><br><span> static const struct osmo_fsm_state server_conn_fsm_states[] = {</span><br><span> [SRVC_ST_INIT] = {</span><br><span> .name = "INIT",</span><br><span style="color: hsl(0, 100%, 40%);">- .in_event_mask = S(SRVC_E_TCP_UP) | S(SRVC_E_TCP_DOWN),</span><br><span style="color: hsl(0, 100%, 40%);">- .out_state_mask = S(SRVC_ST_ESTABLISHED) | S(SRVC_ST_REESTABLISH),</span><br><span style="color: hsl(120, 100%, 40%);">+ .in_event_mask = 0, /* S(SRVC_E_ESTABLISH) via allstate */</span><br><span style="color: hsl(120, 100%, 40%);">+ .out_state_mask = S(SRVC_ST_REESTABLISH),</span><br><span> .action = srvc_st_init,</span><br><span style="color: hsl(0, 100%, 40%);">- .onenter = srvc_st_init_onenter,</span><br><span> },</span><br><span> [SRVC_ST_ESTABLISHED] = {</span><br><span> .name = "ESTABLISHED",</span><br><span>@@ -370,6 +367,8 @@</span><br><span> .name = "RSPRO_CLIENT",</span><br><span> .states = server_conn_fsm_states,</span><br><span> .num_states = ARRAY_SIZE(server_conn_fsm_states),</span><br><span style="color: hsl(120, 100%, 40%);">+ .allstate_event_mask = S(SRVC_E_ESTABLISH),</span><br><span style="color: hsl(120, 100%, 40%);">+ .allstate_action = srvc_allstate_action,</span><br><span> .timer_cb = server_conn_fsm_timer_cb,</span><br><span> .log_subsys = DMAIN,</span><br><span> .event_names = server_conn_fsm_event_names,</span><br><span>@@ -384,8 +383,6 @@</span><br><span> return -1;</span><br><span> </span><br><span> srvc->fi = fi;</span><br><span style="color: hsl(0, 100%, 40%);">- /* onenter of the initial state is not automatically executed by osmo_fsm :( */</span><br><span style="color: hsl(0, 100%, 40%);">- srvc_st_init_onenter(fi, 0);</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/rspro_client_fsm.h b/src/rspro_client_fsm.h</span><br><span>index 8e7f58c..c11e260 100644</span><br><span>--- a/src/rspro_client_fsm.h</span><br><span>+++ b/src/rspro_client_fsm.h</span><br><span>@@ -5,6 +5,7 @@</span><br><span> #include <osmocom/rspro/RsproPDU.h></span><br><span> </span><br><span> enum server_conn_fsm_event {</span><br><span style="color: hsl(120, 100%, 40%);">+ SRVC_E_ESTABLISH, /* instruct SRVC to (re)etablish TCP connection to bankd */</span><br><span> SRVC_E_TCP_UP,</span><br><span> SRVC_E_TCP_DOWN,</span><br><span> SRVC_E_KA_TIMEOUT,</span><br><span>diff --git a/src/simtrace2-remsim_client.c b/src/simtrace2-remsim_client.c</span><br><span>index 69d6a04..19f84a3 100644</span><br><span>--- a/src/simtrace2-remsim_client.c</span><br><span>+++ b/src/simtrace2-remsim_client.c</span><br><span>@@ -868,6 +868,7 @@</span><br><span> fprintf(stderr, "Unable to create Server conn FSM: %s\n", strerror(errno));</span><br><span> exit(1);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(srvc->fi, SRVC_E_ESTABLISH, NULL);</span><br><span> </span><br><span> asn_debug = 0;</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-remsim/+/16499">change 16499</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-remsim/+/16499"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-remsim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Icd882405f2ef54e10a66054829c089e4985f1d1f </div>
<div style="display:none"> Gerrit-Change-Number: 16499 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>