aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2015-08-08 20:44:42 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2015-08-08 20:44:42 +0200
commite019b564eccaf63ca372db6811dfa3dd6c4d9084 (patch)
treee5c1d729eb01e90f38f4a193e63602717595156b /openbsc
parentdaaea0c84fee46d9b63b746d5ed2cdf66f990352 (diff)
parenteb48cafac9af84586679a4ce4caeb985ef0b1eb1 (diff)
Merge branch 'zecke/changes/paging-order'
Various paging clean-ups. I couldn't re-produce the assert that was hit by Rhizomatica in the subscriber code. Let's clean things up a bit to avoid some of the potential issues this code had. Always stop paging regardless of where the subscriber is at the time of the cancellation.
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/src/libbsc/paging.c29
-rw-r--r--openbsc/src/libmsc/gsm_subscriber.c18
-rw-r--r--openbsc/src/libmsc/silent_call.c7
3 files changed, 24 insertions, 30 deletions
diff --git a/openbsc/src/libbsc/paging.c b/openbsc/src/libbsc/paging.c
index 8bc10e670..9ae28e0c4 100644
--- a/openbsc/src/libbsc/paging.c
+++ b/openbsc/src/libbsc/paging.c
@@ -341,8 +341,10 @@ int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
break;
rc = paging_request_bts(bts, subscr, type, cbfn, data);
- if (rc < 0)
+ if (rc < 0) {
+ paging_request_stop(NULL, subscr, NULL, NULL);
return rc;
+ }
num_pages += rc;
} while (1);
@@ -389,28 +391,21 @@ void paging_request_stop(struct gsm_bts *_bts, struct gsm_subscriber *subscr,
struct gsm_subscriber_connection *conn,
struct msgb *msg)
{
- struct gsm_bts *bts = NULL;
+ struct gsm_bts *bts;
log_set_context(BSC_CTX_SUBSCR, subscr);
+ /* Stop this first and dispatch the request */
if (_bts)
_paging_request_stop(_bts, subscr, conn, msg);
- do {
- /*
- * FIXME: Don't use the lac of the subscriber...
- * as it might have magically changed the lac.. use the
- * location area of the _bts as reconfiguration of the
- * network is probably happening less often.
- */
- bts = gsm_bts_by_lac(subscr->group->net, subscr->lac, bts);
- if (!bts)
- break;
-
- /* Stop paging */
- if (bts != _bts)
- _paging_request_stop(bts, subscr, NULL, NULL);
- } while (1);
+ /* Make sure to cancel this everywhere else */
+ llist_for_each_entry(bts, &subscr->group->net->bts_list, list) {
+ /* Sort of an optimization. */
+ if (bts == _bts)
+ continue;
+ _paging_request_stop(bts, subscr, NULL, NULL);
+ }
}
void paging_update_buffer_space(struct gsm_bts *bts, uint16_t free_slots)
diff --git a/openbsc/src/libmsc/gsm_subscriber.c b/openbsc/src/libmsc/gsm_subscriber.c
index 4559de581..442e84c4c 100644
--- a/openbsc/src/libmsc/gsm_subscriber.c
+++ b/openbsc/src/libmsc/gsm_subscriber.c
@@ -84,6 +84,14 @@ static int subscr_paging_dispatch(unsigned int hooknum, unsigned int event,
OSMO_ASSERT(subscr->is_paging);
+ /*
+ * Stop paging on all other BTS. E.g. if this is
+ * the first timeout on a BTS then the others will
+ * timeout soon as well. Let's just stop everything
+ * and forget we wanted to page.
+ */
+ paging_request_stop(NULL, subscr, NULL, NULL);
+
/* Inform parts of the system we don't know */
sig_data.subscr = subscr;
sig_data.bts = conn ? conn->bts : NULL;
@@ -96,15 +104,6 @@ static int subscr_paging_dispatch(unsigned int hooknum, unsigned int event,
&sig_data
);
- /*
- * Stop paging on all other BTS. E.g. if this is
- * the first timeout on a BTS then the others will
- * timeout soon as well. Let's just stop everything
- * and forget we wanted to page.
- */
- paging_request_stop(NULL, subscr, NULL, NULL);
- subscr->is_paging = 0;
-
llist_for_each_entry_safe(request, tmp, &subscr->requests, entry) {
llist_del(&request->entry);
request->cbfn(hooknum, event, msg, data, request->param);
@@ -112,6 +111,7 @@ static int subscr_paging_dispatch(unsigned int hooknum, unsigned int event,
}
/* balanced with the moment we start paging */
+ subscr->is_paging = 0;
subscr_put(subscr);
return 0;
}
diff --git a/openbsc/src/libmsc/silent_call.c b/openbsc/src/libmsc/silent_call.c
index 010c2b4d2..e9ece1835 100644
--- a/openbsc/src/libmsc/silent_call.c
+++ b/openbsc/src/libmsc/silent_call.c
@@ -118,11 +118,10 @@ int silent_call_reroute(struct gsm_subscriber_connection *conn, struct msgb *msg
/* initiate a silent call with a given subscriber */
int gsm_silent_call_start(struct gsm_subscriber *subscr, void *data, int type)
{
- int rc;
+ struct subscr_request *req;
- rc = paging_request(subscr->group->net, subscr, type,
- paging_cb_silent, data);
- return rc;
+ req = subscr_request_channel(subscr, type, paging_cb_silent, data);
+ return req != NULL;
}
/* end a silent call with a given subscriber */