aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/src/gsm_04_08.c33
-rw-r--r--openbsc/src/paging.c2
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);