MNCC: do not send REL_IND twice

Add trans.cc.mncc_release_sent and skip MNCC_REL_IND if already true.

Related: SYS#5066
Change-Id: I449e1e4139af5f41da08ba9f6815ef74d8e13897
diff --git a/include/osmocom/msc/transaction.h b/include/osmocom/msc/transaction.h
index 8fae86a..e422c11 100644
--- a/include/osmocom/msc/transaction.h
+++ b/include/osmocom/msc/transaction.h
@@ -107,6 +107,7 @@
 			struct osmo_lcls *lcls;
 			/* Track codec choices from BSS and remote call leg */
 			struct codec_filter codecs;
+			bool mncc_release_sent; /* Mark when special error handling already did MNCC rel */
 		} cc;
 		struct {
 			struct gsm411_smc_inst smc_inst;
diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c
index b206a8c..b3415f6 100644
--- a/src/libmsc/gsm_04_08_cc.c
+++ b/src/libmsc/gsm_04_08_cc.c
@@ -237,6 +237,22 @@
 	struct msgb *msg;
 	unsigned char *data;
 
+	switch (msg_type) {
+	case MNCC_DISC_IND:
+	case MNCC_REL_IND:
+		if (trans) {
+			if (trans->cc.mncc_release_sent) {
+				LOG_TRANS_CAT_SRC(trans, DMNCC, file, line, LOGL_DEBUG,
+						  "Already released, skipping tx %s\n", get_mncc_name(msg_type));
+				return 0;
+			}
+			trans->cc.mncc_release_sent = true;
+		}
+		break;
+	default:
+		break;
+	}
+
 	LOG_TRANS_CAT_SRC(trans, DMNCC, file, line, LOGL_DEBUG, "tx %s\n", get_mncc_name(msg_type));
 
 	mncc->msg_type = msg_type;
diff --git a/src/libmsc/msc_a.c b/src/libmsc/msc_a.c
index 7c1af43..26e561d 100644
--- a/src/libmsc/msc_a.c
+++ b/src/libmsc/msc_a.c
@@ -1847,6 +1847,8 @@
 	OSMO_ASSERT(!msc_a->cc.active_trans);
 	msc_a->cc.active_trans = cc_trans;
 
+	cc_trans->cc.mncc_release_sent = false;
+
 	OSMO_ASSERT(cc_trans && cc_trans->type == TRANS_CC);
 	cl = msc_a_ensure_call_leg(msc_a, cc_trans);
 	if (!cl)