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