aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeith Whyte <keith@rhizomatica.org>2022-10-15 01:32:02 +0100
committerKeith Whyte <keith@rhizomatica.org>2022-10-15 01:55:55 +0100
commit24e5dc698c30f3c6932081f014d18dceb71b7685 (patch)
tree7b4ba8b8427c86128ca87be01572273166adc9a7
parent8792e04ef194779a90be71627cacf8c87efb5846 (diff)
send lcls conn-ctrl according to SDP media addresseskeith/LCLS_SIP
Detect if a SIP UE (probably a pbx) is re-INVITING itself out of the audio loop by checking the media endpoint ip/port. If thr PBX is going out of the Loop, send LCLS CONNECT, otherwise, RELEASE Change-Id: I83e1ff7c1523b6c6e53ee37a1b3967cd0dc194e1
-rw-r--r--src/libmsc/gsm_04_08_cc.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c
index 2d3139a29..3e9ceee6e 100644
--- a/src/libmsc/gsm_04_08_cc.c
+++ b/src/libmsc/gsm_04_08_cc.c
@@ -184,6 +184,19 @@ static void count_statistics(struct gsm_trans *trans, int new_state)
}
}
+void update_lcls(struct gsm_trans *trans) {
+ struct ran_msg msg;
+
+ if (!trans->cc.lcls)
+ return;
+ msg = (struct ran_msg){
+ .msg_type = RAN_MSG_LCLS_CONNECT_CTRL,
+ .lcls_config_ctrl.config = trans->cc.lcls->config,
+ .lcls_config_ctrl.control = trans->cc.lcls->control,
+ };
+ msc_a_ran_down(trans->msc_a, MSC_ROLE_I, &msg);
+}
+
static void new_cc_state(struct gsm_trans *trans, int state)
{
if (state > 31 || state < 0)
@@ -2013,7 +2026,8 @@ int gsm48_tch_rtp_create(struct gsm_trans *trans)
static int tch_rtp_connect(struct gsm_network *net, const struct gsm_mncc_rtp *rtp)
{
struct gsm_trans *trans;
- struct call_leg *cl;
+ struct gsm_trans *trans_other;
+ struct call_leg *cl, *ol;
struct rtp_stream *rtps;
char ipbuf[INET6_ADDRSTRLEN];
@@ -2054,11 +2068,32 @@ static int tch_rtp_connect(struct gsm_network *net, const struct gsm_mncc_rtp *r
return -EINVAL;
}
+ trans_other = trans_find_by_same_gcr(net, trans);
+
+ if (trans_other) {
+ ol = trans_other->msc_a->cc.call_leg;
+ }
+
if (rtp->sdp[0]) {
sdp_msg_from_sdp_str(&trans->cc.codecs.remote, rtp->sdp);
LOG_TRANS(trans, LOGL_DEBUG, "%s contained SDP %s\n",
get_mncc_name(rtp->msg_type),
sdp_msg_to_str(&trans->cc.codecs.remote));
+
+ if(trans_other) {
+ if (!strcmp(ol->rtp[RTP_TO_CN]->local.ip, trans->cc.codecs.remote.rtp.ip) &&
+ ol->rtp[RTP_TO_CN]->local.port == trans->cc.codecs.remote.rtp.port)
+ {
+ LOG_TRANS_CAT(trans, DMNCC, LOGL_DEBUG, "MNCC Wants out of the Loop.\n");
+ trans->cc.lcls->control = GSM0808_LCLS_CSC_CONNECT;
+ update_lcls(trans);
+ } else {
+ LOG_TRANS_CAT(trans, DMNCC, LOGL_DEBUG, "MNCC Wants into the Loop.\n");
+ trans->cc.lcls->control = GSM0808_LCLS_CSC_RELEASE_LCLS;
+ update_lcls(trans);
+ }
+ }
+
}
rtp_stream_set_remote_addr_and_codecs(rtps, &trans->cc.codecs.remote);