ASCI: Receive messages from MSC-A role related to VGCS/VBS

Voice group call and voice broadcast call messages as well as assignment
result are forwarded to VGCS/VBS call control.

Change-Id: Ie68eedb8fcb064a55cd71b58630d7a8c8b5f29ad
Related: OS#4854
This commit is contained in:
Andreas Eversberg 2023-06-21 13:30:58 +02:00 committed by laforge
parent 57b36e58cb
commit 23b53e544f
1 changed files with 29 additions and 1 deletions

View File

@ -1386,6 +1386,10 @@ int msc_a_up_l3(struct msc_a *msc_a, struct msgb *msg)
#endif
switch (pdisc) {
case GSM48_PDISC_GROUP_CC:
case GSM48_PDISC_BCAST_CC:
rc = gsm44068_rcv_bcc_gcc(msc_a, NULL, msg);
break;
case GSM48_PDISC_CC:
rc = gsm0408_rcv_cc(msc_a, msg);
break;
@ -1422,11 +1426,23 @@ int msc_a_up_l3(struct msc_a *msc_a, struct msgb *msg)
static void msc_a_up_call_assignment_complete(struct msc_a *msc_a, const struct ran_msg *ac)
{
struct gsm_trans *cc_trans = msc_a->cc.active_trans;
struct gsm_trans *cc_trans = msc_a->cc.active_trans, *gcc_trans;
struct rtp_stream *rtps_to_ran = msc_a->cc.call_leg ? msc_a->cc.call_leg->rtp[RTP_TO_RAN] : NULL;
const struct gsm0808_speech_codec *codec_if_known = ac->assignment_complete.codec_present ?
&ac->assignment_complete.codec : NULL;
/* For a voice group call, handling is performed by VGCS FSM */
gcc_trans = trans_find_by_type(msc_a, TRANS_GCC);
if (gcc_trans) {
vgcs_vbs_caller_assign_cpl(gcc_trans);
return;
}
gcc_trans = trans_find_by_type(msc_a, TRANS_BCC);
if (gcc_trans) {
vgcs_vbs_caller_assign_cpl(gcc_trans);
return;
}
if (!rtps_to_ran) {
LOG_MSC_A(msc_a, LOGL_ERROR, "Rx Assignment Complete, but no RTP stream is set up\n");
return;
@ -1513,6 +1529,18 @@ static void msc_a_up_call_assignment_failure(struct msc_a *msc_a, const struct r
return;
}
/* For a voice group call, release is performed by VGCS FSM */
trans = trans_find_by_type(msc_a, TRANS_GCC);
if (trans) {
vgcs_vbs_caller_assign_fail(trans);
return;
}
trans = trans_find_by_type(msc_a, TRANS_BCC);
if (trans) {
vgcs_vbs_caller_assign_fail(trans);
return;
}
/* Otherwise, a silent call might be active */
trans = trans_find_by_type(msc_a, TRANS_SILENT_CALL);
if (trans) {