osmo_bsc: Use libctrl, handle ctrl cmds on port 4249 or from the nat

This patch initializes libctrl to listen for connections on port 4249.
Additionally, control messages arriving from the nat will also be
processed.
diff --git a/openbsc/src/osmo-bsc/osmo_bsc_msc.c b/openbsc/src/osmo-bsc/osmo_bsc_msc.c
index 445ce12..f4d6cf2 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 @@
 	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 @@
 		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)