<p>Neels Hofmeyr <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/9280">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">cosmetic: gscon: undup code: add common assignment_failed()<br><br>Call one common function to signal Assignment Failure and transition back to<br>ST_ACTIVE.<br><br>Change-Id: I1ce10a3ead286cdb6ad529fc293b6cecd151cc9a<br>---<br>M src/osmo-bsc/bsc_subscr_conn_fsm.c<br>1 file changed, 33 insertions(+), 36 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>index bafe145..1172a78 100644</span><br><span>--- a/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>+++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>@@ -448,6 +448,22 @@</span><br><span>   return ep_name;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define assignment_failed(fi, cause) \</span><br><span style="color: hsl(120, 100%, 40%);">+      _assignment_failed(fi, cause, __FILE__, __LINE__)</span><br><span style="color: hsl(120, 100%, 40%);">+static void _assignment_failed(struct osmo_fsm_inst *fi, enum gsm0808_cause cause,</span><br><span style="color: hsl(120, 100%, 40%);">+                        const char *file, int line)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_subscriber_connection *conn = fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msgb *resp = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGPFSMLSRC(fi, LOGL_ERROR, file, line, "Assignment failed: %s\n", gsm0808_cause_name(cause));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    resp = gsm0808_create_assignment_failure(cause, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+        sigtran_send(conn, resp, fi);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (fi->state != ST_ACTIVE)</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_fsm_inst_state_chg(fi, ST_ACTIVE, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* We're on an active subscriber connection, passing DTAP back and forth */</span><br><span> static void gscon_fsm_active(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>@@ -486,8 +502,7 @@</span><br><span>                           mgcp_conn_create(conn->network->mgw.client, fi, GSCON_EV_MGW_FAIL_BTS,</span><br><span>                                          GSCON_EV_MGW_CRCX_RESP_BTS, &conn_peer);</span><br><span>                    if (!conn->user_plane.fi_bts) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              resp = gsm0808_create_assignment_failure(GSM0808_CAUSE_EQUIPMENT_FAILURE, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                                sigtran_send(conn, resp, fi);</span><br><span style="color: hsl(120, 100%, 40%);">+                         assignment_failed(fi, GSM0808_CAUSE_EQUIPMENT_FAILURE);</span><br><span>                              return;</span><br><span>                      }</span><br><span>                    break;</span><br><span>@@ -505,8 +520,7 @@</span><br><span>                                 send_ass_compl(conn->lchan, fi, false);</span><br><span>                           return;</span><br><span>                      } else if (rc != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           resp = gsm0808_create_assignment_failure(GSM0808_CAUSE_EQUIPMENT_FAILURE, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                                sigtran_send(conn, resp, fi);</span><br><span style="color: hsl(120, 100%, 40%);">+                         assignment_failed(fi, GSM0808_CAUSE_EQUIPMENT_FAILURE);</span><br><span>                              return;</span><br><span>                      }</span><br><span> </span><br><span>@@ -521,8 +535,7 @@</span><br><span>                           conn->user_plane.full_rate);</span><br><span> </span><br><span>                         /* The requested channel mode is not supported  */</span><br><span style="color: hsl(0, 100%, 40%);">-                      resp = gsm0808_create_assignment_failure(GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_NOT_SUPP, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                        sigtran_send(conn, resp, fi);</span><br><span style="color: hsl(120, 100%, 40%);">+                 assignment_failed(fi, GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_NOT_SUPP);</span><br><span>                      break;</span><br><span>               }</span><br><span>            break;</span><br><span>@@ -566,7 +579,6 @@</span><br><span> {</span><br><span>    struct gsm_subscriber_connection *conn = fi->priv;</span><br><span>        struct mgcp_conn_peer *conn_peer = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct msgb *resp = NULL;</span><br><span>    int rc;</span><br><span> </span><br><span>  switch (event) {</span><br><span>@@ -576,9 +588,7 @@</span><br><span>               /* Check if the MGW has assigned an enpoint to us, otherwise we</span><br><span>               * can not proceed. */</span><br><span>               if (strlen(conn_peer->endpoint) <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   resp = gsm0808_create_assignment_failure(GSM0808_CAUSE_EQUIPMENT_FAILURE, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                        sigtran_send(conn, resp, fi);</span><br><span style="color: hsl(0, 100%, 40%);">-                   osmo_fsm_inst_state_chg(fi, ST_ACTIVE, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                 assignment_failed(fi, GSM0808_CAUSE_EQUIPMENT_FAILURE);</span><br><span>                      return;</span><br><span>              }</span><br><span> </span><br><span>@@ -597,9 +607,7 @@</span><br><span>          conn->user_plane.rtp_ip = osmo_ntohl(inet_addr(conn_peer->addr));</span><br><span>              rc = gsm0808_assign_req(conn, conn->user_plane.chan_mode, conn->user_plane.full_rate);</span><br><span>                 if (rc != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  resp = gsm0808_create_assignment_failure(GSM0808_CAUSE_RQSTED_SPEECH_VERSION_UNAVAILABLE, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                        sigtran_send(conn, resp, fi);</span><br><span style="color: hsl(0, 100%, 40%);">-                   osmo_fsm_inst_state_chg(fi, ST_ACTIVE, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                 assignment_failed(fi, GSM0808_CAUSE_RQSTED_SPEECH_VERSION_UNAVAILABLE);</span><br><span>                      return;</span><br><span>              }</span><br><span> </span><br><span>@@ -627,7 +635,6 @@</span><br><span>  struct gsm_lchan *lchan = conn->lchan;</span><br><span>    struct mgcp_conn_peer conn_peer;</span><br><span>     struct in_addr addr;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct msgb *resp = NULL;</span><br><span>    int rc;</span><br><span> </span><br><span>  switch (event) {</span><br><span>@@ -652,9 +659,7 @@</span><br><span>                       osmo_fsm_inst_state_chg(fi, ST_WAIT_MDCX_BTS, MGCP_MGW_TIMEOUT, MGCP_MGW_TIMEOUT_TIMER_NR);</span><br><span>                  rc = mgcp_conn_modify(conn->user_plane.fi_bts, GSCON_EV_MGW_MDCX_RESP_BTS, &conn_peer);</span><br><span>                       if (rc != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          resp = gsm0808_create_assignment_failure(GSM0808_CAUSE_EQUIPMENT_FAILURE, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                                sigtran_send(conn, resp, fi);</span><br><span style="color: hsl(0, 100%, 40%);">-                           osmo_fsm_inst_state_chg(fi, ST_ACTIVE, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                         assignment_failed(fi, GSM0808_CAUSE_EQUIPMENT_FAILURE);</span><br><span>                              return;</span><br><span>                      }</span><br><span>                    break;</span><br><span>@@ -676,9 +681,12 @@</span><br><span> </span><br><span>            break;</span><br><span>       case GSCON_EV_RR_ASS_FAIL:</span><br><span style="color: hsl(0, 100%, 40%);">-              resp = gsm0808_create_assignment_failure(GSM0808_CAUSE_RQSTED_TERRESTRIAL_RESOURCE_UNAVAILABLE, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-          sigtran_send(conn, resp, fi);</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_fsm_inst_state_chg(fi, ST_ACTIVE, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+         {</span><br><span style="color: hsl(120, 100%, 40%);">+                     enum gsm0808_cause cause = GSM0808_CAUSE_RQSTED_TERRESTRIAL_RESOURCE_UNAVAILABLE;</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (data)</span><br><span style="color: hsl(120, 100%, 40%);">+                             cause = *((enum gsm0808_cause*)data);</span><br><span style="color: hsl(120, 100%, 40%);">+                 assignment_failed(fi, cause);</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span>            break;</span><br><span>       case GSCON_EV_MO_DTAP:</span><br><span>               forward_dtap(conn, (struct msgb *)data, fi);</span><br><span>@@ -701,7 +709,6 @@</span><br><span>   struct gsm_subscriber_connection *conn = fi->priv;</span><br><span>        struct mgcp_conn_peer conn_peer;</span><br><span>     struct sockaddr_in *sin = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *resp = NULL;</span><br><span> </span><br><span>        switch (event) {</span><br><span>     case GSCON_EV_MGW_MDCX_RESP_BTS:</span><br><span>@@ -732,9 +739,7 @@</span><br><span>                                                                 GSCON_EV_MGW_FAIL_MSC,</span><br><span>                                                               GSCON_EV_MGW_CRCX_RESP_MSC, &conn_peer);</span><br><span>                       if (!conn->user_plane.fi_msc) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              resp = gsm0808_create_assignment_failure(GSM0808_CAUSE_EQUIPMENT_FAILURE, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                                sigtran_send(conn, resp, fi);</span><br><span style="color: hsl(0, 100%, 40%);">-                           osmo_fsm_inst_state_chg(fi, ST_ACTIVE, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                         assignment_failed(fi, GSM0808_CAUSE_EQUIPMENT_FAILURE);</span><br><span>                              return;</span><br><span>                      }</span><br><span>                    break;</span><br><span>@@ -997,11 +1002,8 @@</span><br><span>                * with an assignment failure */</span><br><span>             OSMO_ASSERT(fi->state != ST_INIT && fi->state != ST_WAIT_CC);</span><br><span>          if (fi->state == ST_WAIT_CRCX_BTS || fi->state == ST_WAIT_ASS_CMPL || fi->state == ST_WAIT_MDCX_BTS</span><br><span style="color: hsl(0, 100%, 40%);">-                || fi->state == ST_WAIT_CRCX_MSC) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      resp = gsm0808_create_assignment_failure(GSM0808_CAUSE_EQUIPMENT_FAILURE, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                        sigtran_send(conn, resp, fi);</span><br><span style="color: hsl(0, 100%, 40%);">-                   osmo_fsm_inst_state_chg(fi, ST_ACTIVE, 0, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(120, 100%, 40%);">+                 || fi->state == ST_WAIT_CRCX_MSC)</span><br><span style="color: hsl(120, 100%, 40%);">+                      assignment_failed(fi, GSM0808_CAUSE_EQUIPMENT_FAILURE);</span><br><span>              break;</span><br><span>       case GSCON_EV_A_CLEAR_CMD:</span><br><span>           /* MSC tells us to cleanly shut down */</span><br><span>@@ -1111,7 +1113,6 @@</span><br><span> static int gscon_timer_cb(struct osmo_fsm_inst *fi)</span><br><span> {</span><br><span>  struct gsm_subscriber_connection *conn = fi->priv;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct msgb *resp = NULL;</span><br><span> </span><br><span>        switch (fi->T) {</span><br><span>  case 993210:</span><br><span>@@ -1127,14 +1128,10 @@</span><br><span>               osmo_fsm_inst_term(fi, OSMO_FSM_TERM_REGULAR, NULL);</span><br><span>                 break;</span><br><span>       case GSM0808_T10_TIMER_NR:      /* Assignment Failed */</span><br><span style="color: hsl(0, 100%, 40%);">-         resp = gsm0808_create_assignment_failure(GSM0808_CAUSE_RADIO_INTERFACE_FAILURE, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-          sigtran_send(conn, resp, fi);</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_fsm_inst_state_chg(fi, ST_ACTIVE, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+         assignment_failed(fi, GSM0808_CAUSE_RADIO_INTERFACE_FAILURE);</span><br><span>                break;</span><br><span>       case MGCP_MGW_TIMEOUT_TIMER_NR: /* Assignment failed (no response from MGW) */</span><br><span style="color: hsl(0, 100%, 40%);">-          resp = gsm0808_create_assignment_failure(GSM0808_CAUSE_EQUIPMENT_FAILURE, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-                sigtran_send(conn, resp, fi);</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_fsm_inst_state_chg(fi, ST_ACTIVE, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+         assignment_failed(fi, GSM0808_CAUSE_EQUIPMENT_FAILURE);</span><br><span>              break;</span><br><span>       case MGCP_MGW_HO_TIMEOUT_TIMER_NR:      /* Handover failed (no response from MGW) */</span><br><span>                 osmo_fsm_inst_state_chg(fi, ST_ACTIVE, 0, 0);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9280">change 9280</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/9280"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I1ce10a3ead286cdb6ad529fc293b6cecd151cc9a </div>
<div style="display:none"> Gerrit-Change-Number: 9280 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>