<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12201">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">move ASS-COMPL MGCP handling out of a_iface_bssap.c<br><br>BSSMAP Assignment Complete: sort MGCP handling upon Assignment Complete to the<br>proper locations. a_iface_bssap.c is not the right place to invoke the MGCP<br>related procedures.<br><br>- in a_iface_bssap.c only decode the IEs.<br>- call ran_conn_assign_compl() and pass decoded values.<br>- drop msc_assign_compl(), it was dead code; instead:<br>- add ran_conn_assign_compl()<br>- pass on all MGCP related info to msc_mgcp_ass_complete()<br>- move all MGCP ctx related handling from a_iface_bssap.c to msc_mgcp.c.<br><br>I'm dropping some comments to save some time, because if I adjust them IMHO<br>they would still anyway restate the obvious.<br><br>ran_conn_assign_compl() is now quite a thin shim, but it makes sense to have<br>it:<br><br>- This is the place that should tear down the ran_conn in case assignment<br>  failed, left for a future patch.<br><br>- In the light of upcoming inter-MSC handover, ran_conn_assign_compl() will be<br>  the place where the Assignment Complete message might be relayed to a remote<br>  MSC.<br><br>Change-Id: I8137215c443239bddf3e69b5715839a365b73b6c<br>---<br>M include/osmocom/msc/msc_mgcp.h<br>M include/osmocom/msc/ran_conn.h<br>M src/libmsc/a_iface_bssap.c<br>M src/libmsc/msc_mgcp.c<br>M src/libmsc/osmo_msc.c<br>5 files changed, 81 insertions(+), 88 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/01/12201/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/msc/msc_mgcp.h b/include/osmocom/msc/msc_mgcp.h</span><br><span>index 9d8b01d..f405f45 100644</span><br><span>--- a/include/osmocom/msc/msc_mgcp.h</span><br><span>+++ b/include/osmocom/msc/msc_mgcp.h</span><br><span>@@ -58,6 +58,7 @@</span><br><span> };</span><br><span> </span><br><span> int msc_mgcp_call_assignment(struct gsm_trans *trans);</span><br><span style="color: hsl(0, 100%, 40%);">-int msc_mgcp_ass_complete(struct ran_conn *conn, uint16_t port, char *addr);</span><br><span style="color: hsl(120, 100%, 40%);">+int msc_mgcp_ass_complete(struct ran_conn *conn, const struct gsm0808_speech_codec *speech_codec_chosen,</span><br><span style="color: hsl(120, 100%, 40%);">+                          const struct sockaddr_storage *aoip_transport_addr);</span><br><span> int msc_mgcp_call_complete(struct gsm_trans *trans, uint16_t port, char *addr);</span><br><span> int msc_mgcp_call_release(struct gsm_trans *trans);</span><br><span>diff --git a/include/osmocom/msc/ran_conn.h b/include/osmocom/msc/ran_conn.h</span><br><span>index d71872e..228d595 100644</span><br><span>--- a/include/osmocom/msc/ran_conn.h</span><br><span>+++ b/include/osmocom/msc/ran_conn.h</span><br><span>@@ -197,6 +197,8 @@</span><br><span> void ran_conn_classmark_chg(struct ran_conn *conn,</span><br><span>                        const uint8_t *cm2, uint8_t cm2_len,</span><br><span>                         const uint8_t *cm3, uint8_t cm3_len);</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_assign_compl(struct ran_conn *conn, const struct gsm0808_speech_codec *speech_codec_chosen,</span><br><span style="color: hsl(120, 100%, 40%);">+                     const struct sockaddr_storage *aoip_transport_addr);</span><br><span> void ran_conn_assign_fail(struct ran_conn *conn, uint8_t cause, uint8_t *rr_cause);</span><br><span> </span><br><span> void ran_conn_init(void);</span><br><span>diff --git a/src/libmsc/a_iface_bssap.c b/src/libmsc/a_iface_bssap.c</span><br><span>index d84a234..4e8b146 100644</span><br><span>--- a/src/libmsc/a_iface_bssap.c</span><br><span>+++ b/src/libmsc/a_iface_bssap.c</span><br><span>@@ -34,7 +34,6 @@</span><br><span> #include <osmocom/core/byteswap.h></span><br><span> #include <osmocom/msc/a_reset.h></span><br><span> #include <osmocom/msc/transaction.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/msc/msc_mgcp.h></span><br><span> </span><br><span> #include <errno.h></span><br><span> </span><br><span>@@ -498,51 +497,12 @@</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Use the speech codec info we go with the assignment complete to dtermine</span><br><span style="color: hsl(0, 100%, 40%);">- * which codec we will signal to the MGW */</span><br><span style="color: hsl(0, 100%, 40%);">-static enum mgcp_codecs mgcp_codec_from_sc(struct gsm0808_speech_codec *sc)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    switch (sc->type) {</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM0808_SCT_FR1:</span><br><span style="color: hsl(0, 100%, 40%);">-           return CODEC_GSM_8000_1;</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM0808_SCT_FR2:</span><br><span style="color: hsl(0, 100%, 40%);">-           return CODEC_GSMEFR_8000_1;</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM0808_SCT_FR3:</span><br><span style="color: hsl(0, 100%, 40%);">-           return CODEC_AMR_8000_1;</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM0808_SCT_FR4:</span><br><span style="color: hsl(0, 100%, 40%);">-           return CODEC_AMRWB_16000_1;</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM0808_SCT_FR5:</span><br><span style="color: hsl(0, 100%, 40%);">-           return CODEC_AMRWB_16000_1;</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM0808_SCT_HR1:</span><br><span style="color: hsl(0, 100%, 40%);">-           return CODEC_GSMHR_8000_1;</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM0808_SCT_HR3:</span><br><span style="color: hsl(0, 100%, 40%);">-           return CODEC_AMR_8000_1;</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM0808_SCT_HR4:</span><br><span style="color: hsl(0, 100%, 40%);">-           return CODEC_AMRWB_16000_1;</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM0808_SCT_HR6:</span><br><span style="color: hsl(0, 100%, 40%);">-           return CODEC_AMRWB_16000_1;</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 CODEC_PCMU_8000_1;</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%);">-</span><br><span> /* Endpoint to handle assignment complete */</span><br><span> static int bssmap_rx_ass_compl(struct ran_conn *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>    struct gsm0808_speech_codec sc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct sockaddr_in *rtp_addr_in;</span><br><span>     int rc;</span><br><span> </span><br><span>  LOGPCONN(conn, LOGL_INFO, "Rx BSSMAP ASSIGNMENT COMPLETE message\n");</span><br><span>@@ -567,18 +527,8 @@</span><br><span>               LOGPCONN(conn, LOGL_ERROR, "Unable to decode speech codec (choosen).\n");</span><br><span>          return -EINVAL;</span><br><span>      }</span><br><span style="color: hsl(0, 100%, 40%);">-       conn->rtp.codec_ran = mgcp_codec_from_sc(&sc);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* use address / port supplied with the AoIP</span><br><span style="color: hsl(0, 100%, 40%);">-     * transport address element */</span><br><span style="color: hsl(0, 100%, 40%);">- if (rtp_addr.ss_family == AF_INET) {</span><br><span style="color: hsl(0, 100%, 40%);">-            rtp_addr_in = (struct sockaddr_in *)&rtp_addr;</span><br><span style="color: hsl(0, 100%, 40%);">-              msc_mgcp_ass_complete(conn, osmo_ntohs(rtp_addr_in->sin_port), inet_ntoa(rtp_addr_in->sin_addr));</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPCONN(conn, LOGL_ERROR, "Unsopported addressing scheme. (supports only IPV4)\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+     ran_conn_assign_compl(conn, &sc, &rtp_addr);</span><br><span>         return 0;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/libmsc/msc_mgcp.c b/src/libmsc/msc_mgcp.c</span><br><span>index 1ddec08..e85254e 100644</span><br><span>--- a/src/libmsc/msc_mgcp.c</span><br><span>+++ b/src/libmsc/msc_mgcp.c</span><br><span>@@ -1025,51 +1025,89 @@</span><br><span>        return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Inform the FSM that the assignment (RAN connection) is now complete.</span><br><span style="color: hsl(0, 100%, 40%);">- * Parameter:</span><br><span style="color: hsl(0, 100%, 40%);">- * conn: RAN connection context.</span><br><span style="color: hsl(0, 100%, 40%);">- * port: port number of the remote leg.</span><br><span style="color: hsl(0, 100%, 40%);">- * addr: IP-address of the remote leg.</span><br><span style="color: hsl(0, 100%, 40%);">- * Returns -EINVAL on error, 0 on success. */</span><br><span style="color: hsl(0, 100%, 40%);">-int msc_mgcp_ass_complete(struct ran_conn *conn, uint16_t port, char *addr)</span><br><span style="color: hsl(120, 100%, 40%);">+static enum mgcp_codecs mgcp_codec_from_sc(const struct gsm0808_speech_codec *sc)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct mgcp_ctx *mgcp_ctx;</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> </span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+int msc_mgcp_ass_complete(struct ran_conn *conn, const struct gsm0808_speech_codec *speech_codec_chosen,</span><br><span style="color: hsl(120, 100%, 40%);">+                    const struct sockaddr_storage *aoip_transport_addr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct sockaddr_in *rtp_addr_in;</span><br><span style="color: hsl(120, 100%, 40%);">+      const char *addr;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint16_t port;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct mgcp_ctx *mgcp_ctx = conn->rtp.mgcp_ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct osmo_fsm_inst *fi;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!mgcp_ctx || !mgcp_ctx->fsm) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGPCONN(conn, LOGL_ERROR, "Invalid MGCP context, Assignment Complete failed.\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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   fi = mgcp_ctx->fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (fi->state != ST_MDCX_RAN) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPFSML(fi, LOGL_ERROR, "Assignment Complete not allowed in this state\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                return -ENOTSUP;</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%);">+   /* use address / port supplied with the AoIP transport address element */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (aoip_transport_addr->ss_family != AF_INET) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPCONN(conn, LOGL_ERROR, "Assignment Complete: Unsupported addressing scheme (only IPV4 supported)\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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   rtp_addr_in = (struct sockaddr_in *)&aoip_transport_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+ addr = inet_ntoa(rtp_addr_in->sin_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+   port = osmo_ntohs(rtp_addr_in->sin_port);</span><br><span> </span><br><span>     if (port == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DMGCP, LOGL_ERROR, "(subscriber:%s) invalid remote call leg port, assignment completion failed\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                    vlr_subscr_name(conn->vsub));</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGPCONN(conn, LOGL_ERROR, "Assignment Complete: invalid remote call leg port (0)\n");</span><br><span>             return -EINVAL;</span><br><span>      }</span><br><span>    if (!addr || strlen(addr) <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGP(DMGCP, LOGL_ERROR, "(subscriber:%s) missing remote call leg address, assignment completion failed\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                 vlr_subscr_name(conn->vsub));</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGPCONN(conn, LOGL_ERROR, "Assignment Complete: invalid remote call leg address (empty)\n");</span><br><span>              return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   mgcp_ctx = conn->rtp.mgcp_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!mgcp_ctx) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DMGCP, LOGL_ERROR, "(subscriber:%s) invalid mgcp context, assignment completion failed.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                   vlr_subscr_name(conn->vsub));</span><br><span style="color: hsl(0, 100%, 40%);">-           return -EINVAL;</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%);">-       /* Memorize port and IP-Address of the remote RAN call leg. We need this</span><br><span style="color: hsl(0, 100%, 40%);">-         * information at latest when we enter the MDCX phase for the RAN side. */</span><br><span style="color: hsl(0, 100%, 40%);">-      conn->rtp.remote_port_ran = port;</span><br><span style="color: hsl(120, 100%, 40%);">+  conn->rtp.codec_ran = mgcp_codec_from_sc(speech_codec_chosen);</span><br><span>    osmo_strlcpy(conn->rtp.remote_addr_ran, addr, sizeof(conn->rtp.remote_addr_ran));</span><br><span style="color: hsl(120, 100%, 40%);">+       conn->rtp.remote_port_ran = port;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        LOGP(DMGCP, LOGL_DEBUG, "(subscriber:%s) assignment completed, rtp %s:%d.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-      vlr_subscr_name(conn->vsub), conn->rtp.remote_addr_ran, port);</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGPCONN(conn, LOGL_DEBUG, "Assignment Complete: rtp %s:%u\n", addr, port);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* Note: We only dispatch the event if we are really waiting for the</span><br><span style="color: hsl(0, 100%, 40%);">-     * assignment, if we are not yet waiting, there is no need to loudly</span><br><span style="color: hsl(0, 100%, 40%);">-     * broadcast an event that the all other states do not understand anyway */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (mgcp_ctx->fsm->state == ST_MDCX_RAN)</span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_fsm_inst_dispatch(mgcp_ctx->fsm, EV_ASSIGN, mgcp_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     return osmo_fsm_inst_dispatch(fi, EV_ASSIGN, mgcp_ctx);</span><br><span> }</span><br><span> </span><br><span> /* Make the connection of a previously assigned call complete</span><br><span>diff --git a/src/libmsc/osmo_msc.c b/src/libmsc/osmo_msc.c</span><br><span>index 37c1d15..8cc5ee7 100644</span><br><span>--- a/src/libmsc/osmo_msc.c</span><br><span>+++ b/src/libmsc/osmo_msc.c</span><br><span>@@ -28,6 +28,7 @@</span><br><span> #include <osmocom/msc/a_iface.h></span><br><span> #include <osmocom/msc/gsm_04_08.h></span><br><span> #include <osmocom/msc/gsm_04_11.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/msc/msc_mgcp.h></span><br><span> </span><br><span> #include "../../bscconfig.h"</span><br><span> #ifdef BUILD_IU</span><br><span>@@ -113,17 +114,18 @@</span><br><span> }</span><br><span> </span><br><span> /* Receive an ASSIGNMENT COMPLETE from BSC */</span><br><span style="color: hsl(0, 100%, 40%);">-void msc_assign_compl(struct ran_conn *conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                      uint8_t rr_cause, uint8_t chosen_channel,</span><br><span style="color: hsl(0, 100%, 40%);">-               uint8_t encr_alg_id, uint8_t speec)</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_assign_compl(struct ran_conn *conn, const struct gsm0808_speech_codec *speech_codec_chosen,</span><br><span style="color: hsl(120, 100%, 40%);">+                     const struct sockaddr_storage *aoip_transport_addr)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     LOGP(DRR, LOGL_DEBUG, "MSC assign complete (do nothing).\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       msc_mgcp_ass_complete(conn, speech_codec_chosen, aoip_transport_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* FIXME: tear down conn upon failure */</span><br><span> }</span><br><span> </span><br><span> /* Receive an ASSIGNMENT FAILURE from BSC */</span><br><span> void ran_conn_assign_fail(struct ran_conn *conn, uint8_t cause, uint8_t *rr_cause)</span><br><span> {</span><br><span>         LOGP(DRR, LOGL_DEBUG, "MSC assign failure (do nothing).\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        /* FIXME: tear down conn upon failure */</span><br><span> }</span><br><span> </span><br><span> /* Receive a CLASSMARK CHANGE from BSC */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12201">change 12201</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/12201"/><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: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I8137215c443239bddf3e69b5715839a365b73b6c </div>
<div style="display:none"> Gerrit-Change-Number: 12201 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>