From be1431076d9397f009dc2596bd2320b346dcd163 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Wed, 10 Jun 2009 11:21:55 +0800 Subject: use gsm_bts_by_lac() function to start paging of all bts with same lac when paging is successfull, the paging_request_stop() function is called with the current lchan, so the callback function will be called. for all other bts', the paging_request_stop() function is called without lchan, so the paging is stopped, but the callback function is not called. this ensures that only one paging result is received when paging multiple BTS. (Andreas Eversberg) --- openbsc/src/gsm_04_08.c | 33 +++++++++++++++++++++++++++------ openbsc/src/paging.c | 2 +- 2 files changed, 28 insertions(+), 7 deletions(-) (limited to 'openbsc') 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); -- cgit v1.2.3