[PATCH 07/10] osmo_bsc: Use libctrl, handle ctrl cmds on port 4249 or from the nat

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/OpenBSC@lists.osmocom.org/.

Daniel Willmann daniel at totalueberwachung.de
Fri May 20 17:06:24 UTC 2011


This patch initializes libctrl to listen for connections on port 4249.
Additionally, control messages arriving from the nat will also be
processed.
---
 openbsc/src/osmo-bsc/Makefile.am     |    1 +
 openbsc/src/osmo-bsc/osmo_bsc_main.c |    3 +++
 openbsc/src/osmo-bsc/osmo_bsc_msc.c  |   34 ++++++++++++++++++++++++++++++++++
 3 files changed, 38 insertions(+), 0 deletions(-)

diff --git a/openbsc/src/osmo-bsc/Makefile.am b/openbsc/src/osmo-bsc/Makefile.am
index 9a7619b..f32705c 100644
--- a/openbsc/src/osmo-bsc/Makefile.am
+++ b/openbsc/src/osmo-bsc/Makefile.am
@@ -15,4 +15,5 @@ osmo_bsc_LDADD = $(top_builddir)/src/libbsc/libbsc.a \
 		 $(top_builddir)/src/libabis/libabis.a \
 		 $(top_builddir)/src/libtrau/libtrau.a \
 		 $(top_builddir)/src/libcommon/libcommon.a \
+		 $(top_builddir)/src/libctrl/libctrl.a \
 		 $(LIBOSMOSCCP_LIBS)
diff --git a/openbsc/src/osmo-bsc/osmo_bsc_main.c b/openbsc/src/osmo-bsc/osmo_bsc_main.c
index 16495d8..64daaf4 100644
--- a/openbsc/src/osmo-bsc/osmo_bsc_main.c
+++ b/openbsc/src/osmo-bsc/osmo_bsc_main.c
@@ -51,6 +51,7 @@ extern const char *openbsc_copyright;
 static int daemonize = 0;
 
 extern int bsc_bootstrap_network(int (*layer4)(struct gsm_network *, struct msgb *), const char *cfg_file);
+extern void controlif_setup(struct gsm_network *gsmnet, uint16_t port);
 
 static void print_usage()
 {
@@ -211,6 +212,8 @@ int main(int argc, char **argv)
 	}
 	bsc_api_init(bsc_gsmnet, osmo_bsc_api());
 
+	controlif_setup(bsc_gsmnet, 4249);
+
 	data = bsc_gsmnet->msc_data;
 	if (rf_ctl)
 		bsc_replace_string(data, &data->rf_ctrl_name, rf_ctl);
diff --git a/openbsc/src/osmo-bsc/osmo_bsc_msc.c b/openbsc/src/osmo-bsc/osmo_bsc_msc.c
index 2a32227..7b94af2 100644
--- a/openbsc/src/osmo-bsc/osmo_bsc_msc.c
+++ b/openbsc/src/osmo-bsc/osmo_bsc_msc.c
@@ -21,12 +21,15 @@
  */
 
 #include <openbsc/bsc_nat.h>
+#include <openbsc/control_cmd.h>
 #include <openbsc/debug.h>
 #include <openbsc/gsm_data.h>
 #include <openbsc/ipaccess.h>
 #include <openbsc/osmo_msc_data.h>
 #include <openbsc/signal.h>
 
+#include <osmocom/core/talloc.h>
+
 #include <osmocom/gsm/gsm0808.h>
 
 #include <osmocom/sccp/sccp.h>
@@ -189,6 +192,35 @@ static int msc_alink_do_write(struct osmo_fd *fd, struct msgb *msg)
 	return ret;
 }
 
+static void handle_ctrl(struct osmo_msc_data *msc, struct msgb *msg)
+{
+	int ret;
+	struct ctrl_cmd *cmd;
+
+	cmd = ctrl_cmd_parse(msc->msc_con, msg);
+	if (!cmd) {
+		LOGP(DMSC, LOGL_ERROR, "Failed to parse control message.\n");
+		cmd = talloc_zero(msc->msc_con, struct ctrl_cmd);
+		if (!cmd) {
+			LOGP(DMSC, LOGL_ERROR, "OOM!\n");
+			return;
+		}
+		cmd->type = CTRL_TYPE_ERROR;
+		cmd->id = "err";
+		cmd->reply = "Failed to parse control message.";
+
+		ctrl_cmd_send(&msc->msc_con->write_queue, cmd);
+		talloc_free(cmd);
+
+		return;
+	}
+
+	ret = ctrl_cmd_handle(cmd, msc->network);
+	if (ret != CTRL_CMD_HANDLED)
+		ctrl_cmd_send(&msc->msc_con->write_queue, cmd);
+	talloc_free(cmd);
+}
+
 static void osmo_ext_handle(struct osmo_msc_data *msc, struct msgb *msg)
 {
 	struct ipaccess_head *hh;
@@ -206,6 +238,8 @@ static void osmo_ext_handle(struct osmo_msc_data *msc, struct msgb *msg)
 		mgcp_forward(msc, msg);
 	else if (hh_ext->proto == IPAC_PROTO_EXT_LAC)
 		send_lacs(msc->network, msc->msc_con);
+	else if (hh_ext->proto == IPAC_PROTO_EXT_CTRL)
+		handle_ctrl(msc, msg);
 }
 
 static int ipaccess_a_fd_cb(struct osmo_fd *bfd)
-- 
1.7.5.rc3





More information about the OpenBSC mailing list