diff options
Diffstat (limited to 'src/libmsc/gsm_04_08_cc.c')
-rw-r--r-- | src/libmsc/gsm_04_08_cc.c | 22 |
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) { |