diff options
author | Oliver Smith <osmith@sysmocom.de> | 2023-08-23 14:26:23 +0200 |
---|---|---|
committer | Oliver Smith <osmith@sysmocom.de> | 2023-08-23 17:16:02 +0200 |
commit | 92caa1cd6d57fd05f2bb224286f09f8e1174c15d (patch) | |
tree | dce1688fb90e36981a5970633c5d31b503fe2bc9 | |
parent | f3941518dcb6f9d76e3c45b7992cc91397cf6baf (diff) |
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
-rw-r--r-- | src/libmsc/gsm_04_08_cc.c | 8 |
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)); } |