aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-12-23 18:19:17 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-12-25 21:39:04 +0100
commitd3baf415b1d73ccd84ed0c76ebb50b46540f00cd (patch)
tree78b37e09498f90455cfeedbcff3d0d1e63091673
parentee139e725386b1df7e482ea76b143fc931a48470 (diff)
paging: Introduce a GSM_PAGING_BUSY event for a special timeout
Start counting the attempts of each paging request and call the callback with the PAGING_BUSY type when the paging request timed out but the subscriber was not paged at all. This can only happen with a huge paging backlog. In case the system has so many pending paging
-rw-r--r--openbsc/include/openbsc/gsm_data.h1
-rw-r--r--openbsc/include/openbsc/paging.h3
-rw-r--r--openbsc/include/openbsc/signal.h2
-rw-r--r--openbsc/src/gsm_04_08.c1
-rw-r--r--openbsc/src/gsm_04_11.c1
-rw-r--r--openbsc/src/gsm_subscriber.c3
-rw-r--r--openbsc/src/paging.c9
-rw-r--r--openbsc/src/silent_call.c1
8 files changed, 19 insertions, 2 deletions
diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h
index f42ae1b4a..5badde260 100644
--- a/openbsc/include/openbsc/gsm_data.h
+++ b/openbsc/include/openbsc/gsm_data.h
@@ -83,6 +83,7 @@ enum gsm_paging_event {
GSM_PAGING_SUCCEEDED,
GSM_PAGING_EXPIRED,
GSM_PAGING_OOM,
+ GSM_PAGING_BUSY,
};
enum bts_gprs_mode {
diff --git a/openbsc/include/openbsc/paging.h b/openbsc/include/openbsc/paging.h
index 68d8a6a95..a78eb8e9d 100644
--- a/openbsc/include/openbsc/paging.h
+++ b/openbsc/include/openbsc/paging.h
@@ -46,6 +46,9 @@ struct gsm_paging_request {
/* Timer 3113: how long do we try to page? */
struct timer_list T3113;
+ /* How often did we ask the BTS to page? */
+ int attempts;
+
/* callback to be called in case paging completes */
gsm_cbfn *cbfn;
void *cbfn_param;
diff --git a/openbsc/include/openbsc/signal.h b/openbsc/include/openbsc/signal.h
index 40766dbf2..fd95c1e82 100644
--- a/openbsc/include/openbsc/signal.h
+++ b/openbsc/include/openbsc/signal.h
@@ -140,6 +140,8 @@ struct paging_signal_data {
struct gsm_subscriber *subscr;
struct gsm_bts *bts;
+ int paging_result;
+
/* NULL in case the paging didn't work */
struct gsm_subscriber_connection *conn;
};
diff --git a/openbsc/src/gsm_04_08.c b/openbsc/src/gsm_04_08.c
index 42dd1b70e..92da6ccef 100644
--- a/openbsc/src/gsm_04_08.c
+++ b/openbsc/src/gsm_04_08.c
@@ -1409,6 +1409,7 @@ static int setup_trig_pag_evt(unsigned int hooknum, unsigned int event,
gsm48_cc_tx_setup(transt, &transt->cc.msg);
break;
case GSM_PAGING_EXPIRED:
+ case GSM_PAGING_BUSY:
DEBUGP(DCC, "Paging subscr %s expired!\n",
subscr->extension);
/* Temporarily out of order */
diff --git a/openbsc/src/gsm_04_11.c b/openbsc/src/gsm_04_11.c
index c46f7728e..4ef9ee764 100644
--- a/openbsc/src/gsm_04_11.c
+++ b/openbsc/src/gsm_04_11.c
@@ -1126,6 +1126,7 @@ static int paging_cb_send_sms(unsigned int hooknum, unsigned int event,
break;
case GSM_PAGING_EXPIRED:
case GSM_PAGING_OOM:
+ case GSM_PAGING_BUSY:
sms_free(sms);
rc = -ETIMEDOUT;
break;
diff --git a/openbsc/src/gsm_subscriber.c b/openbsc/src/gsm_subscriber.c
index f066eca67..5dd680fce 100644
--- a/openbsc/src/gsm_subscriber.c
+++ b/openbsc/src/gsm_subscriber.c
@@ -84,6 +84,7 @@ static int subscr_paging_dispatch(unsigned int hooknum, unsigned int event,
sig_data.subscr = subscr;
sig_data.bts = conn ? conn->bts : NULL;
sig_data.conn = conn;
+ sig_data.paging_result = event;
dispatch_signal(
SS_PAGING,
event == GSM_PAGING_SUCCEEDED ?
@@ -169,7 +170,7 @@ static void subscr_send_paging_request(struct gsm_subscriber *subscr)
/* paging failed, quit now */
if (rc <= 0) {
- subscr_paging_cb(GSM_HOOK_RR_PAGING, GSM_PAGING_EXPIRED,
+ subscr_paging_cb(GSM_HOOK_RR_PAGING, GSM_PAGING_BUSY,
NULL, NULL, subscr);
}
}
diff --git a/openbsc/src/paging.c b/openbsc/src/paging.c
index 06e6860f8..bfe302020 100644
--- a/openbsc/src/paging.c
+++ b/openbsc/src/paging.c
@@ -209,6 +209,7 @@ static void paging_handle_pending_requests(struct gsm_bts_paging_state *paging_b
/* handle the paging request now */
page_ms(request);
paging_bts->available_slots--;
+ request->attempts++;
/* take the current and add it to the back */
llist_del(&request->entry);
@@ -253,6 +254,7 @@ static void paging_T3113_expired(void *data)
struct gsm_paging_request *req = (struct gsm_paging_request *)data;
void *cbfn_param;
gsm_cbfn *cbfn;
+ int msg;
LOGP(DPAG, LOGL_INFO, "T3113 expired for request %p (%s)\n",
req, req->subscr->imsi);
@@ -261,10 +263,15 @@ static void paging_T3113_expired(void *data)
counter_inc(req->bts->network->stats.paging.expired);
cbfn_param = req->cbfn_param;
cbfn = req->cbfn;
+
+ /* did we ever manage to page the subscriber */
+ msg = req->attempts > 0 ? GSM_PAGING_EXPIRED : GSM_PAGING_BUSY;
+
+ /* destroy it now. Do not access req afterwards */
paging_remove_request(&req->bts->paging, req);
if (cbfn)
- cbfn(GSM_HOOK_RR_PAGING, GSM_PAGING_EXPIRED, NULL, NULL,
+ cbfn(GSM_HOOK_RR_PAGING, msg, NULL, NULL,
cbfn_param);
}
diff --git a/openbsc/src/silent_call.c b/openbsc/src/silent_call.c
index 29ade00cc..2eb37bace 100644
--- a/openbsc/src/silent_call.c
+++ b/openbsc/src/silent_call.c
@@ -60,6 +60,7 @@ static int paging_cb_silent(unsigned int hooknum, unsigned int event,
dispatch_signal(SS_SCALL, S_SCALL_SUCCESS, &sigdata);
break;
case GSM_PAGING_EXPIRED:
+ case GSM_PAGING_BUSY:
DEBUGP(DSMS, "expired\n");
dispatch_signal(SS_SCALL, S_SCALL_EXPIRED, &sigdata);
break;