aboutsummaryrefslogtreecommitdiffstats
path: root/src/libmsc/gsm_04_08_cc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libmsc/gsm_04_08_cc.c')
-rw-r--r--src/libmsc/gsm_04_08_cc.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c
index c941a7a29..71871bfaa 100644
--- a/src/libmsc/gsm_04_08_cc.c
+++ b/src/libmsc/gsm_04_08_cc.c
@@ -1904,6 +1904,25 @@ static int mncc_tx_to_gsm_cc(struct gsm_network *net, const union mncc_msg *msg)
GSM48_CAUSE_LOC_PRN_S_LU,
GSM48_CC_CAUSE_DEST_OOO);
}
+
+ /* Find valid conn */
+ msc_a = msc_a_for_vsub(vsub, true);
+
+ /* If subscriber is BUSY and we do not DO call in call aka "call-waiting" */
+ if (!net->call_waiting && msc_a) {
+ struct gsm_trans *existing_cc_trans = trans_find_by_type(msc_a, TRANS_CC);
+ if (existing_cc_trans && existing_cc_trans->cc.state != GSM_CSTATE_NULL) {
+ LOG_TRANS_CAT(existing_cc_trans, DCC, LOGL_NOTICE,
+ "rx '%s' for subscriber %s with trans state (%s)"
+ " rejecting with USER_BUSY\n",
+ get_mncc_name(msg->msg_type), data->called.number,
+ gsm48_cc_state_name(existing_cc_trans->cc.state));
+ return mncc_release_ind(net, NULL, data->callref,
+ GSM48_CAUSE_LOC_PRN_S_LU,
+ GSM48_CC_CAUSE_USER_BUSY);
+ }
+ }
+
/* Create transaction */
trans = trans_alloc(net, vsub, TRANS_CC,
TRANS_ID_UNASSIGNED, data->callref);
@@ -1917,9 +1936,6 @@ static int mncc_tx_to_gsm_cc(struct gsm_network *net, const union mncc_msg *msg)
return -ENOMEM;
}
- /* Find valid conn */
- msc_a = msc_a_for_vsub(vsub, true);
-
/* If subscriber has no conn */
if (!msc_a) {