<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/11552">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;">LCLS: add bts-loop variant<br><br>Add LCLS variant where the loop is closed on BTS level instead of<br>MGW. The main difference is the handling of connection-related<br>messages (we use IPA RSL instead of MGCP), the configuration and<br>correlation logic remains the same.<br><br>Change-Id: I7e8379f31037f2c48da69a01919701919a3066a2<br>Related: OS#3659<br>---<br>M include/osmocom/bsc/bsc_msc_data.h<br>M src/osmo-bsc/gsm_data.c<br>M src/osmo-bsc/osmo_bsc_lcls.c<br>M src/osmo-bsc/osmo_bsc_vty.c<br>4 files changed, 54 insertions(+), 9 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/bsc_msc_data.h b/include/osmocom/bsc/bsc_msc_data.h</span><br><span>index 32b161e..0c2094e 100644</span><br><span>--- a/include/osmocom/bsc/bsc_msc_data.h</span><br><span>+++ b/include/osmocom/bsc/bsc_msc_data.h</span><br><span>@@ -56,7 +56,7 @@</span><br><span> enum bsc_lcls_mode {</span><br><span>   BSC_LCLS_MODE_DISABLED,</span><br><span>      BSC_LCLS_MODE_MGW_LOOP,</span><br><span style="color: hsl(0, 100%, 40%);">- /* we may later introduce BTS_LOOP here: direct RTP between BTSs */</span><br><span style="color: hsl(120, 100%, 40%);">+   BSC_LCLS_MODE_BTS_LOOP,</span><br><span> };</span><br><span> </span><br><span> extern const struct value_string bsc_lcls_mode_names[];</span><br><span>diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>index 774238b..6d39642 100644</span><br><span>--- a/src/osmo-bsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -50,6 +50,7 @@</span><br><span> const struct value_string bsc_lcls_mode_names[] = {</span><br><span>     { BSC_LCLS_MODE_DISABLED,       "disabled" },</span><br><span>      { BSC_LCLS_MODE_MGW_LOOP,       "mgw-loop" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { BSC_LCLS_MODE_BTS_LOOP,       "bts-loop" },</span><br><span>      { 0, NULL }</span><br><span> };</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_lcls.c b/src/osmo-bsc/osmo_bsc_lcls.c</span><br><span>index 81daaf0..cdd6557 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_lcls.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_lcls.c</span><br><span>@@ -22,6 +22,7 @@</span><br><span> #include <osmocom/core/linuxlist.h></span><br><span> #include <osmocom/gsm/gsm0808.h></span><br><span> #include <osmocom/core/msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/abis_rsl.h></span><br><span> #include <osmocom/bsc/bsc_msc_data.h></span><br><span> #include <osmocom/bsc/debug.h></span><br><span> #include <osmocom/bsc/osmo_bsc.h></span><br><span>@@ -227,6 +228,26 @@</span><br><span>      osmo_fsm_inst_dispatch(conn->lcls.fi, LCLS_EV_APPLY_CFG_CSC, NULL);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Redirect BTS's RTP traffic via RSL MDCX command:</span><br><span style="color: hsl(120, 100%, 40%);">+ * when enable == true, redirect to remote BTS's IP:port</span><br><span style="color: hsl(120, 100%, 40%);">+ * when enable == false, redirect back to the MGW's IP:port</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static inline void lcls_rsl(const struct gsm_subscriber_connection *conn, bool enable)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       const struct gsm_lchan *lchan = conn->lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* RSL_IE_IPAC_REMOTE_IP */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint32_t ip = enable ? conn->lcls.other->lchan->abis_ip.bound_ip : lchan->abis_ip.connect_ip;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* RSL_IE_IPAC_REMOTE_PORT */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t port = enable ? conn->lcls.other->lchan->abis_ip.bound_port : lchan->abis_ip.connect_port;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!conn->lcls.other) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPFSM(conn->lcls.fi, "%s LCLS: other conn is not available!\n", enable ? "enable" : "disable");</span><br><span style="color: hsl(120, 100%, 40%);">+               return;</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%);">+       abis_rsl_sendmsg(rsl_make_ipacc_mdcx(lchan, ip, port));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static inline bool lcls_check_toggle_allowed(const struct gsm_subscriber_connection *conn, bool enable)</span><br><span> {</span><br><span>   if (conn->lcls.other &&</span><br><span>@@ -258,6 +279,7 @@</span><br><span> </span><br><span> static void lcls_break_local_switching(struct gsm_subscriber_connection *conn)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   struct mgcp_conn_peer mdcx_info;</span><br><span> </span><br><span>         LOGPFSM(conn->lcls.fi, "=== HERE IS WHERE WE DISABLE LCLS(%s)\n",</span><br><span>               bsc_lcls_mode_name(conn->sccp.msc->lcls_mode));</span><br><span>@@ -265,12 +287,21 @@</span><br><span>        if (!lcls_check_toggle_allowed(conn, false))</span><br><span>                 return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     if (conn->sccp.msc->lcls_mode == BSC_LCLS_MODE_MGW_LOOP) {</span><br><span style="color: hsl(0, 100%, 40%);">-                struct mgcp_conn_peer mdcx_info = (struct mgcp_conn_peer){</span><br><span style="color: hsl(0, 100%, 40%);">-                      .port = conn->user_plane.msc_assigned_rtp_port,</span><br><span style="color: hsl(0, 100%, 40%);">-              };</span><br><span style="color: hsl(120, 100%, 40%);">+    switch(conn->sccp.msc->lcls_mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case BSC_LCLS_MODE_MGW_LOOP:</span><br><span style="color: hsl(120, 100%, 40%);">+          mdcx_info.port = conn->user_plane.msc_assigned_rtp_port;</span><br><span>          osmo_strlcpy(mdcx_info.addr, conn->user_plane.msc_assigned_rtp_addr, sizeof(mdcx_info.addr));</span><br><span>             lcls_mdcx(conn, &mdcx_info);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case BSC_LCLS_MODE_BTS_LOOP:</span><br><span style="color: hsl(120, 100%, 40%);">+          lcls_rsl(conn, false);</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case BSC_LCLS_MODE_DISABLED:</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPFSM(conn->lcls.fi, "FIXME: attempt to break LCLS loop while LCLS is disabled?!\n");</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%);">+              LOGPFSM(conn->lcls.fi, "FIXME: unknown LCLS mode %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  bsc_lcls_mode_name(conn->sccp.msc->lcls_mode));</span><br><span>        }</span><br><span> }</span><br><span> </span><br><span>@@ -597,6 +628,7 @@</span><br><span>     struct gsm_subscriber_connection *conn = fi->priv;</span><br><span>        struct gsm_subscriber_connection *conn_other = conn->lcls.other;</span><br><span>  const struct mgcp_conn_peer *other_mgw_info;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_conn_peer mdcx_info;</span><br><span> </span><br><span>         OSMO_ASSERT(conn_other);</span><br><span> </span><br><span>@@ -618,11 +650,22 @@</span><br><span>                 return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (conn->sccp.msc->lcls_mode == BSC_LCLS_MODE_MGW_LOOP) {</span><br><span style="color: hsl(0, 100%, 40%);">-                struct mgcp_conn_peer mdcx_info = *other_mgw_info;</span><br><span style="color: hsl(120, 100%, 40%);">+    switch(conn->sccp.msc->lcls_mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case BSC_LCLS_MODE_MGW_LOOP:</span><br><span style="color: hsl(120, 100%, 40%);">+          mdcx_info = *other_mgw_info;</span><br><span>                 /* Make sure the request doesn't want to use the other side's endpoint string. */</span><br><span>            mdcx_info.endpoint[0] = 0;</span><br><span>           lcls_mdcx(conn, &mdcx_info);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case BSC_LCLS_MODE_BTS_LOOP:</span><br><span style="color: hsl(120, 100%, 40%);">+          lcls_rsl(conn, true);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case BSC_LCLS_MODE_DISABLED:</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPFSM(conn->lcls.fi, "FIXME: attempt to close LCLS loop while LCLS is disabled?!\n");</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%);">+              LOGPFSM(conn->lcls.fi, "FIXME: unknown LCLS mode %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  bsc_lcls_mode_name(conn->sccp.msc->lcls_mode));</span><br><span>        }</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_vty.c b/src/osmo-bsc/osmo_bsc_vty.c</span><br><span>index 14fd274..a32f580 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_vty.c</span><br><span>@@ -646,10 +646,11 @@</span><br><span> </span><br><span> DEFUN(cfg_net_msc_lcls_mode,</span><br><span>       cfg_net_msc_lcls_mode_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-      "lcls-mode (disabled|mgw-loop)",</span><br><span style="color: hsl(120, 100%, 40%);">+      "lcls-mode (disabled|mgw-loop|bts-loop)",</span><br><span>       "Configure 3GPP LCLS (Local Call, Local Switch)\n"</span><br><span>       "Disable LCLS for all calls of this MSC\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "Enable LCLS with loopping traffic in MGW\n")</span><br><span style="color: hsl(120, 100%, 40%);">+      "Enable LCLS with looping traffic in MGW\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Enable LCLS with looping traffic between BTS\n")</span><br><span> {</span><br><span>         struct bsc_msc_data *data = bsc_msc_data(vty);</span><br><span>       data->lcls_mode = get_string_value(bsc_lcls_mode_names, argv[0]);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11552">change 11552</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/11552"/><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: I7e8379f31037f2c48da69a01919701919a3066a2 </div>
<div style="display:none"> Gerrit-Change-Number: 11552 </div>
<div style="display:none"> Gerrit-PatchSet: 9 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>