<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19215">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">propagate RSL error cause codes to RR Channel Release cause<br><br>In various places that receive an error cause from RSL and place it in<br>lchan.release.rsl_error_cause, translate it to an RR cause and place that in<br>the recently added lchan.release.rr_cause. Hence the RR Channel Release message<br>now reflects more specific error causes when the reason for the error was<br>received in an RSL message's cause value.<br><br>Change-Id: I46eb12c91a8c08162b43dd22c7ba825ef3bbc6ac<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/bsc_subscr_conn_fsm.c<br>M src/osmo-bsc/gsm_data.c<br>M src/osmo-bsc/lchan_fsm.c<br>4 files changed, 34 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/15/19215/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index a2e4e2f..74e41df 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1899,5 +1899,6 @@</span><br><span> bool trx_has_valid_pchan_config(const struct gsm_bts_trx *trx);</span><br><span> </span><br><span> enum gsm48_rr_cause bsc_gsm48_rr_cause_from_gsm0808_cause(enum gsm0808_cause c);</span><br><span style="color: hsl(120, 100%, 40%);">+enum gsm48_rr_cause bsc_gsm48_rr_cause_from_rsl_cause(uint8_t c);</span><br><span> </span><br><span> #endif /* _GSM_DATA_H */</span><br><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 0ed6715..72f2474 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>@@ -783,6 +783,8 @@</span><br><span>                 if (conn->lchan) {</span><br><span>                        conn->lchan->release.in_error = true;</span><br><span>                  conn->lchan->release.rsl_error_cause = data ? *(uint8_t*)data : RSL_ERR_IE_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+                       conn->lchan->release.rr_cause =</span><br><span style="color: hsl(120, 100%, 40%);">+                         bsc_gsm48_rr_cause_from_rsl_cause(conn->lchan->release.rsl_error_cause);</span><br><span>               }</span><br><span>            gscon_bssmap_clear(conn, GSM0808_CAUSE_RADIO_INTERFACE_FAILURE);</span><br><span>             break;</span><br><span>diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>index 860e236..a4f6b7f 100644</span><br><span>--- a/src/osmo-bsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -1867,3 +1867,29 @@</span><br><span>             return GSM48_RR_CAUSE_ABNORMAL_UNSPEC;</span><br><span>       }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Map RSL_ERR_* cause codes to gsm48_rr_cause codes.</span><br><span style="color: hsl(120, 100%, 40%);">+ * The mappings were chosen by naive guessing without a proper specification available. */</span><br><span style="color: hsl(120, 100%, 40%);">+enum gsm48_rr_cause bsc_gsm48_rr_cause_from_rsl_cause(uint8_t c)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (c) {</span><br><span style="color: hsl(120, 100%, 40%);">+  case RSL_ERR_NORMAL_UNSPEC:</span><br><span style="color: hsl(120, 100%, 40%);">+           return GSM48_RR_CAUSE_NORMAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ case RSL_ERR_MAND_IE_ERROR:</span><br><span style="color: hsl(120, 100%, 40%);">+           return GSM48_RR_CAUSE_INVALID_MAND_INF;</span><br><span style="color: hsl(120, 100%, 40%);">+       case RSL_ERR_OPT_IE_ERROR:</span><br><span style="color: hsl(120, 100%, 40%);">+            return GSM48_RR_CAUSE_COND_IE_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+  case RSL_ERR_INVALID_MESSAGE:</span><br><span style="color: hsl(120, 100%, 40%);">+ case RSL_ERR_MSG_DISCR:</span><br><span style="color: hsl(120, 100%, 40%);">+       case RSL_ERR_MSG_TYPE:</span><br><span style="color: hsl(120, 100%, 40%);">+        case RSL_ERR_MSG_SEQ:</span><br><span style="color: hsl(120, 100%, 40%);">+ case RSL_ERR_IE_ERROR:</span><br><span style="color: hsl(120, 100%, 40%);">+        case RSL_ERR_IE_NONEXIST:</span><br><span style="color: hsl(120, 100%, 40%);">+     case RSL_ERR_IE_LENGTH:</span><br><span style="color: hsl(120, 100%, 40%);">+       case RSL_ERR_IE_CONTENT:</span><br><span style="color: hsl(120, 100%, 40%);">+      case RSL_ERR_PROTO:</span><br><span style="color: hsl(120, 100%, 40%);">+           return GSM48_RR_CAUSE_PROT_ERROR_UNSPC;</span><br><span style="color: hsl(120, 100%, 40%);">+       default:</span><br><span style="color: hsl(120, 100%, 40%);">+              return GSM48_RR_CAUSE_ABNORMAL_UNSPEC;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c</span><br><span>index fbda1ac..14c1942 100644</span><br><span>--- a/src/osmo-bsc/lchan_fsm.c</span><br><span>+++ b/src/osmo-bsc/lchan_fsm.c</span><br><span>@@ -681,6 +681,7 @@</span><br><span>              if (data) {</span><br><span>                  uint32_t next_state;</span><br><span>                         lchan->release.rsl_error_cause = *(uint8_t*)data;</span><br><span style="color: hsl(120, 100%, 40%);">+                  lchan->release.rr_cause = bsc_gsm48_rr_cause_from_rsl_cause(lchan->release.rsl_error_cause);</span><br><span>                   lchan->release.in_error = true;</span><br><span>                   if (lchan->release.rsl_error_cause != RSL_ERR_RCH_ALR_ACTV_ALLOC)</span><br><span>                                 next_state = LCHAN_ST_BORKEN;</span><br><span>@@ -693,6 +694,7 @@</span><br><span>                                rsl_err_name(lchan->release.rsl_error_cause), lchan->release.rsl_error_cause);</span><br><span>           } else {</span><br><span>                     lchan->release.rsl_error_cause = RSL_ERR_IE_NONEXIST;</span><br><span style="color: hsl(120, 100%, 40%);">+                      lchan->release.rr_cause = bsc_gsm48_rr_cause_from_rsl_cause(lchan->release.rsl_error_cause);</span><br><span>                   lchan->release.in_error = true;</span><br><span>                   lchan_fail_to(LCHAN_ST_BORKEN, "Chan Activ NACK without cause IE");</span><br><span>                }</span><br><span>@@ -1109,6 +1111,7 @@</span><br><span>            osmo_stat_item_dec(lchan->ts->trx->bts->bts_statg->items[BTS_STAT_LCHAN_BORKEN], 1);</span><br><span>          lchan->release.in_error = true;</span><br><span>           lchan->release.rsl_error_cause = RSL_ERR_INTERWORKING;</span><br><span style="color: hsl(120, 100%, 40%);">+             lchan->release.rr_cause = bsc_gsm48_rr_cause_from_rsl_cause(lchan->release.rsl_error_cause);</span><br><span>           lchan_fsm_state_chg(LCHAN_ST_WAIT_RF_RELEASE_ACK);</span><br><span>           return;</span><br><span> </span><br><span>@@ -1125,6 +1128,7 @@</span><br><span>          osmo_stat_item_dec(lchan->ts->trx->bts->bts_statg->items[BTS_STAT_LCHAN_BORKEN], 1);</span><br><span>          lchan->release.in_error = true;</span><br><span>           lchan->release.rsl_error_cause = RSL_ERR_INTERWORKING;</span><br><span style="color: hsl(120, 100%, 40%);">+             lchan->release.rr_cause = bsc_gsm48_rr_cause_from_rsl_cause(lchan->release.rsl_error_cause);</span><br><span>           lchan_fsm_state_chg(LCHAN_ST_WAIT_AFTER_ERROR);</span><br><span>              /* TODO: we used to do this only for sysmobts:</span><br><span>                       int do_free = is_sysmobts_v2(ts->trx->bts);</span><br><span>@@ -1353,6 +1357,7 @@</span><br><span>    default:</span><br><span>             lchan->release.in_error = true;</span><br><span>           lchan->release.rsl_error_cause = RSL_ERR_INTERWORKING;</span><br><span style="color: hsl(120, 100%, 40%);">+             lchan->release.rr_cause = bsc_gsm48_rr_cause_from_rsl_cause(lchan->release.rsl_error_cause);</span><br><span>           lchan_fail("Timeout");</span><br><span>             return 0;</span><br><span>    }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19215">change 19215</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-bsc/+/19215"/><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-Change-Id: I46eb12c91a8c08162b43dd22c7ba825ef3bbc6ac </div>
<div style="display:none"> Gerrit-Change-Number: 19215 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>