<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>