msc: Add Emergency call to f_mo_call() and use it from TC_emerg_call_imsi

This fixes TC_emerg_call_imsi with current osmo-msc master. The old
implementation was broken as it didn't deal with MGCP yet.

Change-Id: Ic35797931387b078205269365421ad730db7af15
diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn
index 1d39ab4..403064b 100644
--- a/msc/BSC_ConnectionHandler.ttcn
+++ b/msc/BSC_ConnectionHandler.ttcn
@@ -188,6 +188,7 @@
 
 type enumerated EstablishType {
 	EST_TYPE_MO_CALL,
+	EST_TYPE_EMERG_CALL,
 	EST_TYPE_PAG_RESP
 };
 
@@ -199,6 +200,9 @@
 	case (EST_TYPE_MO_CALL) {
 		l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_CALL, mi));
 		}
+	case (EST_TYPE_EMERG_CALL) {
+		l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_EMERG_CALL, mi));
+		}
 	case (EST_TYPE_PAG_RESP) {
 		l3_info := valueof(ts_PAG_RESP(mi));
 		}
@@ -211,7 +215,7 @@
 	if (g_pars.net.expect_ciph) {
 		/* implicit CM SERVICE ACCEPT? */
 	} else {
-		if (etype == EST_TYPE_MO_CALL) {
+		if (etype != EST_TYPE_PAG_RESP) {
 			/* explicit CM SERVICE ACCEPT */
 			BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_ACC));
 		}
@@ -373,6 +377,7 @@
 	hexstring called_party,				/* whom are we calling */
 	integer transaction_id optional,		/* which TS 04.08 CC transaction ID to use */
 	BearerCapability_TLV bearer_cap,		/* which bearer capabilities to claim */
+	boolean emergency,				/* is this an emergency call? */
 
 	/* MNCC related parameters */
 	uint32_t mncc_callref optional,			/* call reference on the MNCC side */
@@ -400,6 +405,7 @@
 	called_party := called,
 	transaction_id := tid,
 	bearer_cap := valueof(ts_Bcap_voice),
+	emergency := false,
 	mncc_callref := omit,
 	mncc_bearer_cap := valueof(ts_MNCC_bcap_voice),
 	bss_rtp_ip := "9.8.7.6",
@@ -432,13 +438,21 @@
 	} else {
 		mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
 	}
-	f_establish_fully(mi);
+	if (cpars.emergency) {
+		f_establish_fully(mi, EST_TYPE_EMERG_CALL);
+	} else {
+		f_establish_fully(mi, EST_TYPE_MO_CALL);
+	}
 
 	/* Create MNCC and MGCP expect */
 	f_create_mncc_expect(hex2str(cpars.called_party));
 	f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
 
-	BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(cpars.transaction_id, cpars.called_party)));
+	if (cpars.emergency) {
+		BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_EMERG_SETUP(cpars.transaction_id)));
+	} else {
+		BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(cpars.transaction_id, cpars.called_party)));
+	}
 	interleave {
 	[] MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(cpars.called_party)))) -> value mncc {
 		cpars.mncc_callref := mncc.u.signal.callref;