diff options
author | Keith Whyte <keith@rhizomatica.org> | 2022-10-15 01:18:43 +0100 |
---|---|---|
committer | Keith Whyte <keith@rhizomatica.org> | 2023-11-23 22:05:41 +0000 |
commit | fcc6d2540bbe9c9c8861a39fb4821f1cb679fa12 (patch) | |
tree | 41d657f30cbe0ba154dd31d778fe03a6dad7a473 | |
parent | 19c3532f21e0dc05215601edb7d852824c56992c (diff) |
Store GCR when we get the SETUP, don't wait till paging cb
I originally placed this code in the paging callback,
probably only because trans_lcls_compose() wants
to check the msc_a for OSMO_RAT_GERAN_A and get LAC/CI
etc for GCR generation. but we don't need any of that
here.
Change-Id: I32ac4e3da8bb6d44c4aa69fe8a67eedbe20a1c25
-rw-r--r-- | src/libmsc/gsm_04_08_cc.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c index 31fcb23f7..481a66cd3 100644 --- a/src/libmsc/gsm_04_08_cc.c +++ b/src/libmsc/gsm_04_08_cc.c @@ -382,18 +382,6 @@ static void cc_paging_cb(struct msc_a *msc_a, struct gsm_trans *trans) trans->msc_a = msc_a; trans->paging_request = NULL; - /* Get the GCR from the MO call leg (if any). */ - if (!trans->cc.lcls) - trans->cc.lcls = trans_lcls_compose(trans, true); - if (trans->cc.lcls && trans->cc.msg.fields & MNCC_F_GCR) { - int rc = osmo_dec_gcr(&trans->cc.lcls->gcr, - &trans->cc.msg.gcr[0], - sizeof(trans->cc.msg.gcr)); - if (rc < 0) - LOG_TRANS(trans, LOGL_ERROR, "Failed to parse GCR\n"); - else - trans->cc.lcls->gcr_available = true; - } osmo_fsm_inst_dispatch(msc_a->c.fi, MSC_A_EV_TRANSACTION_ACCEPTED, trans); /* send SETUP request to called party */ @@ -2363,6 +2351,24 @@ static int mncc_tx_to_gsm_cc(struct gsm_network *net, const union mncc_msg *msg) /* store setup information until paging succeeds */ memcpy(&trans->cc.msg, data, sizeof(struct gsm_mncc)); + /* Store the Global Call Reference in the transaction if MNCC sent it */ + if (data->fields & MNCC_F_GCR) { + /* The trans has no msc_a yet so compose will return NULL + // trans->cc.lcls = trans_lcls_compose(trans, true); */ + trans->cc.lcls = talloc_zero(trans, struct osmo_lcls); + int rc = osmo_dec_gcr(&trans->cc.lcls->gcr, + &data->gcr[0], + sizeof(data->gcr)); + if (rc < 0) { + LOG_TRANS_CAT(trans, DCC, LOGL_ERROR, "Failed to parse GCR\n"); + } else { + trans->cc.lcls->config = GSM0808_LCLS_CFG_BOTH_WAY; + trans->cc.lcls->control = GSM0808_LCLS_CSC_DO_NOT_CONNECT; + trans->cc.lcls->corr_needed = true; + trans->cc.lcls->gcr_available = true; + } + } + /* Request a channel. If Paging already started, paging_request_start() will append the new * trans to the already ongoing Paging. */ trans->paging_request = paging_request_start(vsub, PAGING_CAUSE_CALL_CONVERSATIONAL, |