jolly has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/osmo-msc/+/34830?usp=email )


Change subject: ASCI: Reject TERMINATION, if MS is not the originator
......................................................................

ASCI: Reject TERMINATION, if MS is not the originator

Only the originator may terminate the VGCS/VBS call. This will not
happen in real life, because the UI of the MS should not allow
termination of a recevied VGCS call.

Change-Id: Ibe289920fa3ea50dd3e7d5c1371456dca9b72604
Related: OS#4854
---
M src/libmsc/msc_vgcs.c
1 file changed, 34 insertions(+), 0 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/30/34830/1

diff --git a/src/libmsc/msc_vgcs.c b/src/libmsc/msc_vgcs.c
index 772a9e3..d3f2e0e 100644
--- a/src/libmsc/msc_vgcs.c
+++ b/src/libmsc/msc_vgcs.c
@@ -859,6 +859,21 @@
        trans_free(trans);
 }

+/* Send TERMINATION REJECT to the calling/talking subscriber. */
+static void gcc_termination_reject(struct gsm_trans *trans, enum 
osmo_gsm44068_cause cause)
+{
+       uint8_t pdisc = (trans->type == TRANS_GCC) ? GSM48_PDISC_GROUP_CC : 
GSM48_PDISC_BCAST_CC;
+       int rc;
+
+       /* Send TERMINATION towards MS. */
+       rc = gsm44068_tx_termination(trans->msc_a, trans->gcc.uplink_bss,
+                                    pdisc | (trans->transaction_id << 4),
+                                    OSMO_GSM44068_MSGT_TERMINATION_REJECT,
+                                    cause,  NULL, 0);
+       if (rc < 0)
+               LOG_GCC(trans, LOGL_ERROR, "Failed to send TERMINATION REJECT 
towards MS.\n");
+}
+
 /* Start inactivity timer.
  * This timer is used to terminate the call, if the radio connection to the 
caller gets lost. */
 static void start_inactivity_timer(struct gsm_trans *trans)
@@ -1112,6 +1127,11 @@
                gcc_terminate_and_destroy(trans, 
OSMO_GSM44068_CAUSE_NORMAL_CALL_CLEARING);
                break;
        case VGCS_GCC_EV_USER_TERM:
+               if (!trans->gcc.uplink_originator) {
+                       LOG_GCC(trans, LOGL_ERROR, "Termination by user, but it 
is not the originator.\n");
+                       gcc_termination_reject(trans, 
OSMO_GSM44068_CAUSE_USER_NOT_ORIGINATOR);
+                       break;
+               }
                LOG_GCC(trans, LOGL_DEBUG, "Termination by user, destroying 
call.\n");
                /* Send TERMINATE to the calling subscriber and destroy group 
call in all cells. */
                gcc_terminate_and_destroy(trans, 
OSMO_GSM44068_CAUSE_NORMAL_CALL_CLEARING);

--
To view, visit https://gerrit.osmocom.org/c/osmo-msc/+/34830?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-msc
Gerrit-Branch: master
Gerrit-Change-Id: Ibe289920fa3ea50dd3e7d5c1371456dca9b72604
Gerrit-Change-Number: 34830
Gerrit-PatchSet: 1
Gerrit-Owner: jolly <andr...@eversberg.eu>
Gerrit-MessageType: newchange

Reply via email to