aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeith Whyte <keith@rhizomatica.org>2022-10-15 01:18:43 +0100
committerKeith Whyte <keith@rhizomatica.org>2023-11-23 22:05:41 +0000
commitfcc6d2540bbe9c9c8861a39fb4821f1cb679fa12 (patch)
tree41d657f30cbe0ba154dd31d778fe03a6dad7a473
parent19c3532f21e0dc05215601edb7d852824c56992c (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.c30
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,