<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10367">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;">mgcp: use codec information returned with ASSIGNMENT COMPL.<br><br>When the assignment completes a choosen codec is returned. At the<br>moment we do not use this information.<br><br>- add struct members for codec info (both, RAN and CN)<br>- parse codec info in BSSMAP ASSIGNMENT COMPLETE<br>- use codec info on mgcp<br><br>Since the MNCC API is not complete yet, we currently only use the<br>codec info only on the internal MNCC yet.<br><br>Change-Id: I9d5b1cd016d9a058b22a367d0e5e9f2ef447931a<br>Related: OS#2728<br>---<br>M include/osmocom/msc/gsm_data.h<br>M src/libmsc/a_iface_bssap.c<br>M src/libmsc/gsm_04_08_cc.c<br>M src/libmsc/msc_mgcp.c<br>4 files changed, 76 insertions(+), 14 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/msc/gsm_data.h b/include/osmocom/msc/gsm_data.h</span><br><span>index c79adde..27f7fc5 100644</span><br><span>--- a/include/osmocom/msc/gsm_data.h</span><br><span>+++ b/include/osmocom/msc/gsm_data.h</span><br><span>@@ -143,10 +143,13 @@</span><br><span> char local_addr_ran[INET_ADDRSTRLEN];</span><br><span> uint16_t remote_port_ran;</span><br><span> char remote_addr_ran[INET_ADDRSTRLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+ enum mgcp_codecs codec_ran;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> uint16_t local_port_cn;</span><br><span> char local_addr_cn[INET_ADDRSTRLEN];</span><br><span> uint16_t remote_port_cn;</span><br><span> char remote_addr_cn[INET_ADDRSTRLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+ enum mgcp_codecs codec_cn;</span><br><span> } rtp;</span><br><span> </span><br><span> /* which Iu-CS connection, if any. */</span><br><span>diff --git a/src/libmsc/a_iface_bssap.c b/src/libmsc/a_iface_bssap.c</span><br><span>index 1ace43d..11d3673 100644</span><br><span>--- a/src/libmsc/a_iface_bssap.c</span><br><span>+++ b/src/libmsc/a_iface_bssap.c</span><br><span>@@ -502,11 +502,50 @@</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Use the speech codec info we go with the assignment complete to dtermine</span><br><span style="color: hsl(120, 100%, 40%);">+ * which codec we will signal to the MGW */</span><br><span style="color: hsl(120, 100%, 40%);">+static enum mgcp_codecs mgcp_codec_from_sc(struct gsm0808_speech_codec *sc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (sc->type) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM0808_SCT_FR1:</span><br><span style="color: hsl(120, 100%, 40%);">+ return CODEC_GSM_8000_1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM0808_SCT_FR2:</span><br><span style="color: hsl(120, 100%, 40%);">+ return CODEC_GSMEFR_8000_1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM0808_SCT_FR3:</span><br><span style="color: hsl(120, 100%, 40%);">+ return CODEC_AMR_8000_1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM0808_SCT_FR4:</span><br><span style="color: hsl(120, 100%, 40%);">+ return CODEC_AMRWB_16000_1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM0808_SCT_FR5:</span><br><span style="color: hsl(120, 100%, 40%);">+ return CODEC_AMRWB_16000_1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM0808_SCT_HR1:</span><br><span style="color: hsl(120, 100%, 40%);">+ return CODEC_GSMHR_8000_1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM0808_SCT_HR3:</span><br><span style="color: hsl(120, 100%, 40%);">+ return CODEC_AMR_8000_1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM0808_SCT_HR4:</span><br><span style="color: hsl(120, 100%, 40%);">+ return CODEC_AMRWB_16000_1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM0808_SCT_HR6:</span><br><span style="color: hsl(120, 100%, 40%);">+ return CODEC_AMRWB_16000_1;</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%);">+ return CODEC_PCMU_8000_1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</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> /* Endpoint to handle assignment complete */</span><br><span> static int bssmap_rx_ass_compl(struct gsm_subscriber_connection *conn, struct msgb *msg,</span><br><span> struct tlv_parsed *tp)</span><br><span> {</span><br><span> struct sockaddr_storage rtp_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm0808_speech_codec sc;</span><br><span> struct sockaddr_in *rtp_addr_in;</span><br><span> int rc;</span><br><span> </span><br><span>@@ -525,6 +564,15 @@</span><br><span> return -EINVAL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Decode speech codec (choosen) element */</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = gsm0808_dec_speech_codec(&sc, TLVP_VAL(tp, GSM0808_IE_SPEECH_CODEC),</span><br><span style="color: hsl(120, 100%, 40%);">+ TLVP_LEN(tp, GSM0808_IE_SPEECH_CODEC));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPCONN(conn, LOGL_ERROR, "Unable to decode speech codec (choosen).\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ conn->rtp.codec_ran = mgcp_codec_from_sc(&sc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* use address / port supplied with the AoIP</span><br><span> * transport address element */</span><br><span> if (rtp_addr.ss_family == AF_INET) {</span><br><span>diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c</span><br><span>index 8becd05..2c17e22 100644</span><br><span>--- a/src/libmsc/gsm_04_08_cc.c</span><br><span>+++ b/src/libmsc/gsm_04_08_cc.c</span><br><span>@@ -319,6 +319,15 @@</span><br><span> /* Which subscriber do we want to track trans1 or trans2? */</span><br><span> log_set_context(LOG_CTX_VLR_SUBSCR, trans1->vsub);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* This call briding mechanism is only used with the internal MNCC.</span><br><span style="color: hsl(120, 100%, 40%);">+ * functionality (with external MNCC briding would be done by the PBX)</span><br><span style="color: hsl(120, 100%, 40%);">+ * This means we may just copy the codec info we have for the RAN side</span><br><span style="color: hsl(120, 100%, 40%);">+ * of the first leg to the CN side of both legs. This also means that</span><br><span style="color: hsl(120, 100%, 40%);">+ * if both legs use different codecs the MGW must perform transcoding</span><br><span style="color: hsl(120, 100%, 40%);">+ * on the second leg. */</span><br><span style="color: hsl(120, 100%, 40%);">+ trans1->conn->rtp.codec_cn = trans1->conn->rtp.codec_ran;</span><br><span style="color: hsl(120, 100%, 40%);">+ trans2->conn->rtp.codec_cn = trans1->conn->rtp.codec_ran;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Bridge RTP streams */</span><br><span> rc = msc_mgcp_call_complete(trans1, trans2->conn->rtp.local_port_cn,</span><br><span> trans2->conn->rtp.local_addr_cn);</span><br><span>@@ -1716,6 +1725,16 @@</span><br><span> struct gsm_mncc_rtp *rtp = arg;</span><br><span> struct in_addr addr;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: in *rtp we should get the codec information of the remote</span><br><span style="color: hsl(120, 100%, 40%);">+ * leg. We will have to populate trans->conn->rtp.codec_cn with a</span><br><span style="color: hsl(120, 100%, 40%);">+ * meaningful value based on this information but unfortunately we</span><br><span style="color: hsl(120, 100%, 40%);">+ * can't do that yet because the mncc API can not signal dynamic</span><br><span style="color: hsl(120, 100%, 40%);">+ * payload types yet. This must be fixed first. Also there may be</span><br><span style="color: hsl(120, 100%, 40%);">+ * additional members necessary in trans->conn->rtp because we</span><br><span style="color: hsl(120, 100%, 40%);">+ * somehow need to deal with dynamic payload types that do not</span><br><span style="color: hsl(120, 100%, 40%);">+ * comply to 3gpp's assumptions of payload type numbers on the A</span><br><span style="color: hsl(120, 100%, 40%);">+ * interface. See also related tickets: OS#3399 and OS1683 */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Find callref */</span><br><span> trans = trans_find_by_callref(net, rtp->callref);</span><br><span> if (!trans) {</span><br><span>diff --git a/src/libmsc/msc_mgcp.c b/src/libmsc/msc_mgcp.c</span><br><span>index f5bdeb7..e58b249 100644</span><br><span>--- a/src/libmsc/msc_mgcp.c</span><br><span>+++ b/src/libmsc/msc_mgcp.c</span><br><span>@@ -277,22 +277,16 @@</span><br><span> struct mgcp_msg mgcp_msg;</span><br><span> struct msgb *msg;</span><br><span> int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BUILD_IU</span><br><span> struct gsm_trans *trans;</span><br><span> struct gsm_subscriber_connection *conn;</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span> </span><br><span> OSMO_ASSERT(mgcp_ctx);</span><br><span> mgcp = mgcp_ctx->mgcp;</span><br><span> OSMO_ASSERT(mgcp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BUILD_IU</span><br><span> trans = mgcp_ctx->trans;</span><br><span> OSMO_ASSERT(trans);</span><br><span> conn = trans->conn;</span><br><span> OSMO_ASSERT(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span> </span><br><span> /* NOTE: In case of error, we will not be able to perform any DLCX</span><br><span> * operation because until this point we do not have requested any</span><br><span>@@ -396,22 +390,16 @@</span><br><span> struct mgcp_msg mgcp_msg;</span><br><span> struct msgb *msg;</span><br><span> int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BUILD_IU</span><br><span> struct gsm_trans *trans;</span><br><span> struct gsm_subscriber_connection *conn;</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span> </span><br><span> OSMO_ASSERT(mgcp_ctx);</span><br><span> mgcp = mgcp_ctx->mgcp;</span><br><span> OSMO_ASSERT(mgcp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef BUILD_IU</span><br><span> trans = mgcp_ctx->trans;</span><br><span> OSMO_ASSERT(trans);</span><br><span> conn = trans->conn;</span><br><span> OSMO_ASSERT(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span> </span><br><span> switch (event) {</span><br><span> case EV_CRCX_RAN_RESP:</span><br><span>@@ -593,7 +581,9 @@</span><br><span> .conn_id = mgcp_ctx->conn_id_cn,</span><br><span> .conn_mode = MGCP_CONN_RECV_SEND,</span><br><span> .audio_ip = conn->rtp.remote_addr_cn,</span><br><span style="color: hsl(0, 100%, 40%);">- .audio_port = conn->rtp.remote_port_cn</span><br><span style="color: hsl(120, 100%, 40%);">+ .audio_port = conn->rtp.remote_port_cn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .codecs[0] = conn->rtp.codec_cn,</span><br><span style="color: hsl(120, 100%, 40%);">+ .codecs_len = 1</span><br><span> };</span><br><span> if (osmo_strlcpy(mgcp_msg.endpoint, mgcp_ctx->rtp_endpoint, sizeof(mgcp_msg.endpoint)) >=</span><br><span> MGCP_ENDPOINT_MAXLEN) {</span><br><span>@@ -710,7 +700,9 @@</span><br><span> .conn_id = mgcp_ctx->conn_id_ran,</span><br><span> .conn_mode = MGCP_CONN_RECV_SEND,</span><br><span> .audio_ip = conn->rtp.remote_addr_ran,</span><br><span style="color: hsl(0, 100%, 40%);">- .audio_port = conn->rtp.remote_port_ran</span><br><span style="color: hsl(120, 100%, 40%);">+ .audio_port = conn->rtp.remote_port_ran,</span><br><span style="color: hsl(120, 100%, 40%);">+ .codecs[0] = conn->rtp.codec_ran,</span><br><span style="color: hsl(120, 100%, 40%);">+ .codecs_len = 1</span><br><span> };</span><br><span> if (osmo_strlcpy(mgcp_msg.endpoint, mgcp_ctx->rtp_endpoint, sizeof(mgcp_msg.endpoint)) >=</span><br><span> MGCP_ENDPOINT_MAXLEN) {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10367">change 10367</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/10367"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-msc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I9d5b1cd016d9a058b22a367d0e5e9f2ef447931a </div>
<div style="display:none"> Gerrit-Change-Number: 10367 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>