aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/include/openbsc/paging.h4
-rw-r--r--openbsc/src/gsm_04_11.c7
-rw-r--r--openbsc/src/paging.c19
3 files changed, 20 insertions, 10 deletions
diff --git a/openbsc/include/openbsc/paging.h b/openbsc/include/openbsc/paging.h
index 2f17e243e..ab6a27494 100644
--- a/openbsc/include/openbsc/paging.h
+++ b/openbsc/include/openbsc/paging.h
@@ -33,8 +33,8 @@
void paging_init(struct gsm_bts *bts);
/* schedule paging request */
-void paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
- int type, gsm_cbfn *cbfn, void *data);
+int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
+ int type, gsm_cbfn *cbfn, void *data);
/* stop paging requests */
void paging_request_stop(struct gsm_bts *bts, struct gsm_subscriber *subscr,
diff --git a/openbsc/src/gsm_04_11.c b/openbsc/src/gsm_04_11.c
index 7a3065359..a7f69d105 100644
--- a/openbsc/src/gsm_04_11.c
+++ b/openbsc/src/gsm_04_11.c
@@ -1034,6 +1034,7 @@ int gsm411_send_sms_subscr(struct gsm_subscriber *subscr,
struct gsm_sms *sms)
{
struct gsm_lchan *lchan;
+ int rc;
/* check if we already have an open lchan to the subscriber.
* if yes, send the SMS this way */
@@ -1043,8 +1044,10 @@ int gsm411_send_sms_subscr(struct gsm_subscriber *subscr,
rll_ind_cb, sms);
/* if not, we have to start paging */
- paging_request(subscr->net, subscr, RSL_CHANNEED_SDCCH,
- paging_cb_send_sms, sms);
+ rc = paging_request(subscr->net, subscr, RSL_CHANNEED_SDCCH,
+ paging_cb_send_sms, sms);
+ if (rc < 0)
+ sms_free(sms);
return 0;
}
diff --git a/openbsc/src/paging.c b/openbsc/src/paging.c
index 802024a5b..f7ee81d24 100644
--- a/openbsc/src/paging.c
+++ b/openbsc/src/paging.c
@@ -213,7 +213,7 @@ static void paging_T3113_expired(void *data)
paging_remove_request(&req->bts->paging, req);
}
-static void _paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr,
+static int _paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr,
int type, gsm_cbfn *cbfn, void *data)
{
struct gsm_bts_paging_state *bts_entry = &bts->paging;
@@ -221,7 +221,7 @@ static void _paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr,
if (paging_pending_request(bts_entry, subscr)) {
DEBUGP(DPAG, "Paging request already pending\n");
- return;
+ return -EEXIST;
}
DEBUGP(DPAG, "Start paging of subscriber %llu on bts %d.\n",
@@ -239,12 +239,15 @@ static void _paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr,
if (!bsc_timer_pending(&bts_entry->work_timer))
bsc_schedule_timer(&bts_entry->work_timer, 1, 0);
+
+ return 0;
}
-void paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
- int type, gsm_cbfn *cbfn, void *data)
+int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
+ int type, gsm_cbfn *cbfn, void *data)
{
struct gsm_bts *bts = NULL;
+ int rc;
/* start paging subscriber on all BTS within Location Area */
do {
@@ -252,9 +255,13 @@ void paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
if (!bts)
break;
- /* Trigger paging */
- _paging_request(bts, subscr, type, cbfn, data);
+ /* Trigger paging, pass any error to caller */
+ rc = _paging_request(bts, subscr, type, cbfn, data);
+ if (rc < 0)
+ return rc;
} while (1);
+
+ return 0;
}