Add support for MSC initiated LCLS-CONNECT-CTRL

Change-Id: Ib30ee53ded8f09e819eae770489a92cc60b2c9a3
diff --git a/include/osmocom/msc/ran_msg.h b/include/osmocom/msc/ran_msg.h
index 86bf63a..2b026a0 100644
--- a/include/osmocom/msc/ran_msg.h
+++ b/include/osmocom/msc/ran_msg.h
@@ -69,6 +69,7 @@
 	RAN_MSG_HANDOVER_SUCCEEDED,
 	RAN_MSG_HANDOVER_COMPLETE,
 	RAN_MSG_HANDOVER_FAILURE,
+	RAN_MSG_LCLS_CONNECT_CTRL,
 };
 
 extern const struct value_string ran_msg_type_names[];
@@ -268,6 +269,10 @@
 		} handover_failure;
 		struct ran_handover_request handover_request;
 		struct ran_handover_request_ack handover_request_ack;
+		struct {
+			enum gsm0808_lcls_config config;
+			enum gsm0808_lcls_control control;
+		} lcls_config_ctrl;
 	};
 };
 
diff --git a/src/libmsc/ran_msg.c b/src/libmsc/ran_msg.c
index e050303..f4cacb0 100644
--- a/src/libmsc/ran_msg.c
+++ b/src/libmsc/ran_msg.c
@@ -51,6 +51,7 @@
 	{ RAN_MSG_HANDOVER_DETECT, "HANDOVER_DETECT" },
 	{ RAN_MSG_HANDOVER_COMPLETE, "HANDOVER_COMPLETE" },
 	{ RAN_MSG_HANDOVER_FAILURE, "HANDOVER_FAILURE" },
+	{ RAN_MSG_LCLS_CONNECT_CTRL, "LCLS_CONNECT_CTRL" },
 	{}
 };
 
diff --git a/src/libmsc/ran_msg_a.c b/src/libmsc/ran_msg_a.c
index 6af2290..aadc011 100644
--- a/src/libmsc/ran_msg_a.c
+++ b/src/libmsc/ran_msg_a.c
@@ -388,6 +388,11 @@
 	return ran_decoded(ran_dec, &ran_dec_msg);
 }
 
+static int ran_a_decode_lcls_connect_ctrl_ack(struct ran_dec *ran_dec, const struct msgb *msg, const struct tlv_parsed *tp)
+{
+	return 0;
+}
+
 static int ran_a_decode_lcls_notification(struct ran_dec *ran_dec, const struct msgb *msg, const struct tlv_parsed *tp)
 {
 	const struct tlv_p_entry *ie_lcls_bss_status = TLVP_GET(tp, GSM0808_IE_LCLS_BSS_STATUS);
@@ -816,6 +821,8 @@
 		return ran_a_decode_sapi_n_reject(ran_dec, bssmap, tp);
 	case BSS_MAP_MSG_LCLS_NOTIFICATION:
 		return ran_a_decode_lcls_notification(ran_dec, bssmap, tp);
+	case BSS_MAP_MSG_LCLS_CONNECT_CTRL_ACK:
+		return ran_a_decode_lcls_connect_ctrl_ack(ran_dec, bssmap, tp);
 
 	/* From current RAN peer, the Handover origin: */
 	case BSS_MAP_MSG_HANDOVER_REQUIRED:
@@ -921,6 +928,15 @@
 	msg->l3h[1] = msgb_l3len(msg) - 2;
 }
 
+static struct msgb *ran_a_make_lcls_conn_ctrl_command(enum gsm0808_lcls_config config,
+						      enum gsm0808_lcls_control control)
+{
+	struct msgb *msg;
+
+	msg = gsm0808_create_lcls_conn_ctrl(config, control);
+	return msg;
+}
+
 /* Compose a BSSAP Assignment Command.
  * Passing an RTP address is optional.
  * The msub is passed merely for error logging. */
@@ -1278,6 +1294,10 @@
 	case RAN_MSG_HANDOVER_FAILURE:
 		return ran_a_make_handover_failure(caller_fi, ran_enc_msg);
 
+	case RAN_MSG_LCLS_CONNECT_CTRL:
+		return ran_a_make_lcls_conn_ctrl_command(ran_enc_msg->lcls_config_ctrl.config,
+							 ran_enc_msg->lcls_config_ctrl.control);
+
 	default:
 		LOG_RAN_A_ENC(caller_fi, LOGL_ERROR, "Unimplemented RAN-encode message type: %s\n",
 			       ran_msg_type_name(ran_enc_msg->msg_type));