<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/9284">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;">use libosmocore's gsm0808_permitted_speech(), gsm0808_chosen_channel()<br><br>The guts of bssap_speech_from_lchan() and lchan_to_chosen_channel() have been<br>moved to libosmocore; call those instead.<br><br>The return value of bssap_speech_from_lchan() used to be -1 on error, now the<br>error value is 0. The only caller did not handle -1 properly, but fed it<br>directly to a uint8_t.<br><br>On gsm0808_chosen_channel() error, log the error. Proper handling is missing.<br><br>Fixing the error handling in send_ass_compl() is a separate issue: currently it<br>is limited to logging, there is no way to return an error yet, nor any actions<br>to take on error.<br><br>Depends: Icca23940791f97fa64dbc3f2734270b99f9550c1 (libosmocore)<br>Change-Id: Ib5c940a9dae11c5e26d4b47fa9d95fef889ad2f6<br>---<br>M src/osmo-bsc/bsc_subscr_conn_fsm.c<br>1 file changed, 7 insertions(+), 84 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 1172a78..b46eb94 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>@@ -143,88 +143,6 @@</span><br><span>                 LOGPFSML(fi, LOGL_ERROR, "Unable to deliver SCCP message!\n");</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* See TS 48.008 3.2.2.11 Channel Type Octet 5 */</span><br><span style="color: hsl(0, 100%, 40%);">-static int bssap_speech_from_lchan(const struct gsm_lchan *lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    switch (lchan->type) {</span><br><span style="color: hsl(0, 100%, 40%);">-       case GSM_LCHAN_TCH_H:</span><br><span style="color: hsl(0, 100%, 40%);">-           switch (lchan->tch_mode) {</span><br><span style="color: hsl(0, 100%, 40%);">-           case GSM48_CMODE_SPEECH_V1:</span><br><span style="color: hsl(0, 100%, 40%);">-                     return 0x05;</span><br><span style="color: hsl(0, 100%, 40%);">-            case GSM48_CMODE_SPEECH_AMR:</span><br><span style="color: hsl(0, 100%, 40%);">-                    return 0x25;</span><br><span style="color: hsl(0, 100%, 40%);">-            default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_LCHAN_TCH_F:</span><br><span style="color: hsl(0, 100%, 40%);">-           switch (lchan->tch_mode) {</span><br><span style="color: hsl(0, 100%, 40%);">-           case GSM48_CMODE_SPEECH_V1:</span><br><span style="color: hsl(0, 100%, 40%);">-                     return 0x01;</span><br><span style="color: hsl(0, 100%, 40%);">-            case GSM48_CMODE_SPEECH_EFR:</span><br><span style="color: hsl(0, 100%, 40%);">-                    return 0x11;</span><br><span style="color: hsl(0, 100%, 40%);">-            case GSM48_CMODE_SPEECH_AMR:</span><br><span style="color: hsl(0, 100%, 40%);">-                    return 0x21;</span><br><span style="color: hsl(0, 100%, 40%);">-            default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                return -1;</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* GSM 08.08 3.2.2.33 */</span><br><span style="color: hsl(0, 100%, 40%);">-static uint8_t lchan_to_chosen_channel(struct gsm_lchan *lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      uint8_t channel_mode = 0, channel = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  switch (lchan->tch_mode) {</span><br><span style="color: hsl(0, 100%, 40%);">-   case GSM48_CMODE_SPEECH_V1:</span><br><span style="color: hsl(0, 100%, 40%);">-     case GSM48_CMODE_SPEECH_EFR:</span><br><span style="color: hsl(0, 100%, 40%);">-    case GSM48_CMODE_SPEECH_AMR:</span><br><span style="color: hsl(0, 100%, 40%);">-            channel_mode = 0x9;</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_CMODE_SIGN:</span><br><span style="color: hsl(0, 100%, 40%);">-          channel_mode = 0x8;</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_CMODE_DATA_14k5:</span><br><span style="color: hsl(0, 100%, 40%);">-             channel_mode = 0xe;</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_CMODE_DATA_12k0:</span><br><span style="color: hsl(0, 100%, 40%);">-             channel_mode = 0xb;</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_CMODE_DATA_6k0:</span><br><span style="color: hsl(0, 100%, 40%);">-              channel_mode = 0xc;</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM48_CMODE_DATA_3k6:</span><br><span style="color: hsl(0, 100%, 40%);">-              channel_mode = 0xd;</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</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%);">-       switch (lchan->type) {</span><br><span style="color: hsl(0, 100%, 40%);">-       case GSM_LCHAN_NONE:</span><br><span style="color: hsl(0, 100%, 40%);">-            channel = 0x0;</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_LCHAN_SDCCH:</span><br><span style="color: hsl(0, 100%, 40%);">-           channel = 0x1;</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_LCHAN_TCH_F:</span><br><span style="color: hsl(0, 100%, 40%);">-           channel = 0x8;</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_LCHAN_TCH_H:</span><br><span style="color: hsl(0, 100%, 40%);">-           channel = 0x9;</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_LCHAN_UNKNOWN:</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DMSC, LOGL_ERROR, "Unknown lchan type: %p\n", lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</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 channel_mode << 4 | channel;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Add the LCLS BSS Status IE to a BSSMAP message. We assume this is</span><br><span>  * called on a msgb that was returned by gsm0808_create_ass_compl() */</span><br><span> static void bssmap_add_lcls_status(struct msgb *msg, enum gsm0808_lcls_status status)</span><br><span>@@ -265,6 +183,7 @@</span><br><span>  struct gsm_subscriber_connection *conn;</span><br><span>      struct sockaddr_storage *addr_local = NULL;</span><br><span>  int perm_spch = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t chosen_channel;</span><br><span> </span><br><span>  conn = lchan->conn;</span><br><span>       OSMO_ASSERT(conn);</span><br><span>@@ -276,7 +195,7 @@</span><br><span> </span><br><span>         /* Generate voice related fields */</span><br><span>  if (voice) {</span><br><span style="color: hsl(0, 100%, 40%);">-            perm_spch = bssap_speech_from_lchan(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+           perm_spch = gsm0808_permitted_speech(lchan->type, lchan->tch_mode);</span><br><span>            switch (conn->sccp.msc->a.asp_proto) {</span><br><span>                 case OSMO_SS7_ASP_PROT_IPA:</span><br><span>                  /* don't add any AoIP specific fields. CIC allocated by MSC */</span><br><span>@@ -293,9 +212,13 @@</span><br><span>            /* FIXME: AMR codec configuration must be derived from lchan1! */</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ chosen_channel = gsm0808_chosen_channel(lchan->tch_mode, lchan->type);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!chosen_channel)</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DMSC, LOGL_ERROR, "Unknown lchan type or TCH mode: %s\n", gsm_lchan_name(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   /* Generate message */</span><br><span>       resp = gsm0808_create_ass_compl(lchan->abis_ip.ass_compl.rr_cause,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   lchan_to_chosen_channel(lchan),</span><br><span style="color: hsl(120, 100%, 40%);">+                                       chosen_channel,</span><br><span>                                      lchan->encr.alg_id, perm_spch,</span><br><span>                                    addr_local, sc_ptr, NULL);</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9284">change 9284</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/9284"/><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: Ib5c940a9dae11c5e26d4b47fa9d95fef889ad2f6 </div>
<div style="display:none"> Gerrit-Change-Number: 9284 </div>
<div style="display:none"> Gerrit-PatchSet: 8 </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>