aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Smith <osmith@sysmocom.de>2023-08-23 14:26:23 +0200
committerOliver Smith <osmith@sysmocom.de>2023-08-23 16:42:24 +0200
commit9734430dc7c7a2e26aa59c53ab788aa2fa1ce0a0 (patch)
tree8bdd080c6c6b6f3397b0be5ae639a118a808ca32
parent59efa6dde355e4675f55b16a4d6968e3470b5fde (diff)
gsm48_cc_tx_call_proc_…: verify bcap.transferosmith/wip
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
-rw-r--r--src/libmsc/gsm_04_08_cc.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c
index 4162944fc..5908db9d1 100644
--- a/src/libmsc/gsm_04_08_cc.c
+++ b/src/libmsc/gsm_04_08_cc.c
@@ -1047,6 +1047,14 @@ static int gsm48_cc_tx_call_proc_and_assign(struct gsm_trans *trans, void *arg)
/* 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));
}