gsm48_cc_tx_call_proc_…: verify bcap.transfer

Fail if MNCC tries to switch the Information Transfer Capability from
CSD to speech, so it is obvious that something is wrong here. I ran into
this while writing a test.

Related: OS#4394
Change-Id: Ibb76d08cad1ac3bc3320391c89766150a2e605c3
diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c
index 4162944..5908db9 100644
--- a/src/libmsc/gsm_04_08_cc.c
+++ b/src/libmsc/gsm_04_08_cc.c
@@ -1047,6 +1047,14 @@
 
 	/* bearer capability */
 	if (proceeding->fields & MNCC_F_BEARER_CAP) {
+		/* MNCC should not switch from e.g. CSD to speech */
+		if (proceeding->bearer_cap.transfer != trans->bearer_cap.transfer) {
+			LOG_TRANS(trans, LOGL_ERROR, "Unexpected Information Transfer Capability %d from MNCC,"
+				  " transaction has %d\n",
+				  proceeding->bearer_cap.transfer,
+				  trans->bearer_cap.transfer);
+			return -EINVAL;
+		}
 		gsm48_encode_bearer_cap(msg, 0, &proceeding->bearer_cap);
 		memcpy(&trans->bearer_cap, &proceeding->bearer_cap, sizeof(trans->bearer_cap));
 	}