diff options
-rw-r--r-- | openbsc/src/gsm_04_08.c | 33 | ||||
-rw-r--r-- | openbsc/src/paging.c | 2 |
2 files changed, 28 insertions, 7 deletions
diff --git a/openbsc/src/gsm_04_08.c b/openbsc/src/gsm_04_08.c index 274d3b6bf..0630764a2 100644 --- a/openbsc/src/gsm_04_08.c +++ b/openbsc/src/gsm_04_08.c @@ -1016,6 +1016,7 @@ static int gsm48_rr_rx_pag_resp(struct msgb *msg) u_int8_t mi_type = mi_lv[1] & GSM_MI_TYPE_MASK; char mi_string[MI_SIZE]; struct gsm_subscriber *subscr; + struct gsm_bts *bts; struct paging_signal_data sig_data; int rc = 0; @@ -1059,8 +1060,22 @@ static int gsm48_rr_rx_pag_resp(struct msgb *msg) sig_data.lchan = msg->lchan; dispatch_signal(SS_PAGING, S_PAGING_COMPLETED, &sig_data); + + /* Stop paging on the bts we received the paging response */ paging_request_stop(msg->trx->bts, subscr, msg->lchan); + /* Stop paging on all other bts' */ + bts = NULL; + do { + bts = gsm_bts_by_lac(msg->trx->bts->network, subscr->lac, bts); + if (!bts) + break; + if (bts == msg->trx->bts) + continue; + /* Stop paging */ + paging_request_stop(bts, subscr, NULL); + } while (1); + /* FIXME: somehow signal the completion of the PAGING to * the entity that requested the paging */ @@ -1295,6 +1310,7 @@ static int gsm48_cc_rx_setup(struct msgb *msg) struct gsm48_hdr *gh = msgb_l3(msg); unsigned int payload_len = msgb_l3len(msg) - sizeof(*gh); struct gsm_subscriber *called_subscr; + struct gsm_bts *bts; char called_number[(43-2)*2 + 1] = "\0"; struct tlv_parsed tp; u_int8_t num_type; @@ -1338,12 +1354,17 @@ static int gsm48_cc_rx_setup(struct msgb *msg) subscr_get(msg->lchan->subscr); call->called_subscr = called_subscr; - /* start paging of the receiving end of the call */ - /* FIXME: we're assuming that the receiver is at the same BTS - * than we are, which is obviously a wrong assumption in multi-BTS - * case */ - paging_request(msg->trx->bts, called_subscr, RSL_CHANNEED_TCH_F, - setup_trig_pag_evt, call); + /* Start paging subscriber on all BTS in LAC of subscriber */ + bts = NULL; + do { + bts = gsm_bts_by_lac(msg->trx->bts->network, + msg->lchan->subscr->lac, bts); + if (!bts) + break; + /* Trigger paging */ + paging_request(bts, called_subscr, RSL_CHANNEED_TCH_F, + setup_trig_pag_evt, call); + } while (1); /* send a CALL PROCEEDING message to the MO */ ret = gsm48_tx_simple(msg->lchan, GSM48_PDISC_CC, diff --git a/openbsc/src/paging.c b/openbsc/src/paging.c index d777d6642..f3bdf6973 100644 --- a/openbsc/src/paging.c +++ b/openbsc/src/paging.c @@ -247,7 +247,7 @@ void paging_request_stop(struct gsm_bts *bts, struct gsm_subscriber *subscr, llist_for_each_entry_safe(req, req2, &bts_entry->pending_requests, entry) { if (req->subscr == subscr) { - if (req->cbfn) + if (lchan && req->cbfn) req->cbfn(GSM_HOOK_RR_PAGING, GSM_PAGING_SUCCEEDED, NULL, lchan, req->cbfn_param); paging_remove_request(&bts->paging, req); |