<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-remsim/+/16499">View Change</a></p><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;">git pull ssh://gerrit.osmocom.org:29418/osmo-remsim refs/changes/99/16499/1</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-MessageType: newchange </div>