Change in osmo-bsc[master]: LCLS: add bts-loop variant

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Thu Nov 22 12:53:07 UTC 2018


Harald Welte has submitted this change and it was merged. ( https://gerrit.osmocom.org/11552 )

Change subject: LCLS: add bts-loop variant
......................................................................

LCLS: add bts-loop variant

Add LCLS variant where the loop is closed on BTS level instead of
MGW. The main difference is the handling of connection-related
messages (we use IPA RSL instead of MGCP), the configuration and
correlation logic remains the same.

Change-Id: I7e8379f31037f2c48da69a01919701919a3066a2
Related: OS#3659
---
M include/osmocom/bsc/bsc_msc_data.h
M src/osmo-bsc/gsm_data.c
M src/osmo-bsc/osmo_bsc_lcls.c
M src/osmo-bsc/osmo_bsc_vty.c
4 files changed, 54 insertions(+), 9 deletions(-)

Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/include/osmocom/bsc/bsc_msc_data.h b/include/osmocom/bsc/bsc_msc_data.h
index 32b161e..0c2094e 100644
--- a/include/osmocom/bsc/bsc_msc_data.h
+++ b/include/osmocom/bsc/bsc_msc_data.h
@@ -56,7 +56,7 @@
 enum bsc_lcls_mode {
 	BSC_LCLS_MODE_DISABLED,
 	BSC_LCLS_MODE_MGW_LOOP,
-	/* we may later introduce BTS_LOOP here: direct RTP between BTSs */
+	BSC_LCLS_MODE_BTS_LOOP,
 };
 
 extern const struct value_string bsc_lcls_mode_names[];
diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c
index 774238b..6d39642 100644
--- a/src/osmo-bsc/gsm_data.c
+++ b/src/osmo-bsc/gsm_data.c
@@ -50,6 +50,7 @@
 const struct value_string bsc_lcls_mode_names[] = {
 	{ BSC_LCLS_MODE_DISABLED,	"disabled" },
 	{ BSC_LCLS_MODE_MGW_LOOP,	"mgw-loop" },
+	{ BSC_LCLS_MODE_BTS_LOOP,	"bts-loop" },
 	{ 0, NULL }
 };
 
diff --git a/src/osmo-bsc/osmo_bsc_lcls.c b/src/osmo-bsc/osmo_bsc_lcls.c
index 81daaf0..cdd6557 100644
--- a/src/osmo-bsc/osmo_bsc_lcls.c
+++ b/src/osmo-bsc/osmo_bsc_lcls.c
@@ -22,6 +22,7 @@
 #include <osmocom/core/linuxlist.h>
 #include <osmocom/gsm/gsm0808.h>
 #include <osmocom/core/msgb.h>
+#include <osmocom/bsc/abis_rsl.h>
 #include <osmocom/bsc/bsc_msc_data.h>
 #include <osmocom/bsc/debug.h>
 #include <osmocom/bsc/osmo_bsc.h>
@@ -227,6 +228,26 @@
 	osmo_fsm_inst_dispatch(conn->lcls.fi, LCLS_EV_APPLY_CFG_CSC, NULL);
 }
 
+/* Redirect BTS's RTP traffic via RSL MDCX command:
+ * when enable == true, redirect to remote BTS's IP:port
+ * when enable == false, redirect back to the MGW's IP:port
+ */
+static inline void lcls_rsl(const struct gsm_subscriber_connection *conn, bool enable)
+{
+       const struct gsm_lchan *lchan = conn->lchan;
+       /* RSL_IE_IPAC_REMOTE_IP */
+       uint32_t ip = enable ? conn->lcls.other->lchan->abis_ip.bound_ip : lchan->abis_ip.connect_ip;
+       /* RSL_IE_IPAC_REMOTE_PORT */
+       uint16_t port = enable ? conn->lcls.other->lchan->abis_ip.bound_port : lchan->abis_ip.connect_port;
+
+       if (!conn->lcls.other) {
+	       LOGPFSM(conn->lcls.fi, "%s LCLS: other conn is not available!\n", enable ? "enable" : "disable");
+               return;
+       }
+
+       abis_rsl_sendmsg(rsl_make_ipacc_mdcx(lchan, ip, port));
+}
+
 static inline bool lcls_check_toggle_allowed(const struct gsm_subscriber_connection *conn, bool enable)
 {
 	if (conn->lcls.other &&
@@ -258,6 +279,7 @@
 
 static void lcls_break_local_switching(struct gsm_subscriber_connection *conn)
 {
+	struct mgcp_conn_peer mdcx_info;
 
 	LOGPFSM(conn->lcls.fi, "=== HERE IS WHERE WE DISABLE LCLS(%s)\n",
 		bsc_lcls_mode_name(conn->sccp.msc->lcls_mode));
@@ -265,12 +287,21 @@
 	if (!lcls_check_toggle_allowed(conn, false))
 		return;
 
-	if (conn->sccp.msc->lcls_mode == BSC_LCLS_MODE_MGW_LOOP) {
-		struct mgcp_conn_peer mdcx_info = (struct mgcp_conn_peer){
-			.port = conn->user_plane.msc_assigned_rtp_port,
-		};
+	switch(conn->sccp.msc->lcls_mode) {
+	case BSC_LCLS_MODE_MGW_LOOP:
+		mdcx_info.port = conn->user_plane.msc_assigned_rtp_port;
 		osmo_strlcpy(mdcx_info.addr, conn->user_plane.msc_assigned_rtp_addr, sizeof(mdcx_info.addr));
 		lcls_mdcx(conn, &mdcx_info);
+		break;
+	case BSC_LCLS_MODE_BTS_LOOP:
+		lcls_rsl(conn, false);
+		break;
+	case BSC_LCLS_MODE_DISABLED:
+		LOGPFSM(conn->lcls.fi, "FIXME: attempt to break LCLS loop while LCLS is disabled?!\n");
+		break;
+	default:
+		LOGPFSM(conn->lcls.fi, "FIXME: unknown LCLS mode %s\n",
+			bsc_lcls_mode_name(conn->sccp.msc->lcls_mode));
 	}
 }
 
@@ -597,6 +628,7 @@
 	struct gsm_subscriber_connection *conn = fi->priv;
 	struct gsm_subscriber_connection *conn_other = conn->lcls.other;
 	const struct mgcp_conn_peer *other_mgw_info;
+	struct mgcp_conn_peer mdcx_info;
 
 	OSMO_ASSERT(conn_other);
 
@@ -618,11 +650,22 @@
 		return;
 	}
 
-	if (conn->sccp.msc->lcls_mode == BSC_LCLS_MODE_MGW_LOOP) {
-		struct mgcp_conn_peer mdcx_info = *other_mgw_info;
+	switch(conn->sccp.msc->lcls_mode) {
+	case BSC_LCLS_MODE_MGW_LOOP:
+		mdcx_info = *other_mgw_info;
 		/* Make sure the request doesn't want to use the other side's endpoint string. */
 		mdcx_info.endpoint[0] = 0;
 		lcls_mdcx(conn, &mdcx_info);
+		break;
+	case BSC_LCLS_MODE_BTS_LOOP:
+		lcls_rsl(conn, true);
+		break;
+	case BSC_LCLS_MODE_DISABLED:
+		LOGPFSM(conn->lcls.fi, "FIXME: attempt to close LCLS loop while LCLS is disabled?!\n");
+		break;
+	default:
+		LOGPFSM(conn->lcls.fi, "FIXME: unknown LCLS mode %s\n",
+			bsc_lcls_mode_name(conn->sccp.msc->lcls_mode));
 	}
 }
 
diff --git a/src/osmo-bsc/osmo_bsc_vty.c b/src/osmo-bsc/osmo_bsc_vty.c
index 14fd274..a32f580 100644
--- a/src/osmo-bsc/osmo_bsc_vty.c
+++ b/src/osmo-bsc/osmo_bsc_vty.c
@@ -646,10 +646,11 @@
 
 DEFUN(cfg_net_msc_lcls_mode,
       cfg_net_msc_lcls_mode_cmd,
-      "lcls-mode (disabled|mgw-loop)",
+      "lcls-mode (disabled|mgw-loop|bts-loop)",
       "Configure 3GPP LCLS (Local Call, Local Switch)\n"
       "Disable LCLS for all calls of this MSC\n"
-      "Enable LCLS with loopping traffic in MGW\n")
+      "Enable LCLS with looping traffic in MGW\n"
+      "Enable LCLS with looping traffic between BTS\n")
 {
 	struct bsc_msc_data *data = bsc_msc_data(vty);
 	data->lcls_mode = get_string_value(bsc_lcls_mode_names, argv[0]);

-- 
To view, visit https://gerrit.osmocom.org/11552
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I7e8379f31037f2c48da69a01919701919a3066a2
Gerrit-Change-Number: 11552
Gerrit-PatchSet: 9
Gerrit-Owner: Max <msuraev at sysmocom.de>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder (1000002)
Gerrit-Reviewer: Max <msuraev at sysmocom.de>
Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: Pau Espin Pedrol <pespin at sysmocom.de>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20181122/42dfcbed/attachment.htm>


More information about the gerrit-log mailing list