From dc030960fc729c3124c40838a733eab1bc9394b0 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Mon, 7 Jan 2013 17:30:13 +0100 Subject: bsc: Allow to page a BTS that is excluded from the RF lock The RF lock excluded BTS was not paged at all. Now forward the paging message to the handler and call a function that will check if this LAC can be paged right now. Introduce a new paging method that allows to page on a dedicated bts, refactor the code to use this method for paging. --- openbsc/src/libbsc/paging.c | 35 ++++++++++++++++--------- openbsc/src/osmo-bsc/osmo_bsc_bssap.c | 5 ++-- openbsc/src/osmo-bsc/osmo_bsc_grace.c | 48 ++++++++++++++++++++++++++++++++--- 3 files changed, 70 insertions(+), 18 deletions(-) (limited to 'openbsc/src') diff --git a/openbsc/src/libbsc/paging.c b/openbsc/src/libbsc/paging.c index b731dbcfa..286c57ba9 100644 --- a/openbsc/src/libbsc/paging.c +++ b/openbsc/src/libbsc/paging.c @@ -1,5 +1,5 @@ /* Paging helper and manager.... */ -/* (C) 2009 by Holger Hans Peter Freyther +/* (C) 2009,2013 by Holger Hans Peter Freyther * All Rights Reserved * * This program is free software; you can redistribute it and/or modify @@ -298,6 +298,26 @@ static int _paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr, return 0; } +int paging_request_bts(struct gsm_bts *bts, struct gsm_subscriber *subscr, + int type, gsm_cbfn *cbfn, void *data) +{ + int rc; + + /* skip all currently inactive TRX */ + if (!trx_is_usable(bts->c0)) + return 0; + + /* maybe it is the first time we use it */ + paging_init_if_needed(bts); + + + /* Trigger paging, pass any error to the caller */ + rc = _paging_request(bts, subscr, type, cbfn, data); + if (rc < 0) + return rc; + return 1; +} + int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr, int type, gsm_cbfn *cbfn, void *data) { @@ -314,19 +334,10 @@ int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr, if (!bts) break; - /* skip all currently inactive TRX */ - if (!trx_is_usable(bts->c0)) - continue; - - /* maybe it is the first time we use it */ - paging_init_if_needed(bts); - - num_pages++; - - /* Trigger paging, pass any error to caller */ - rc = _paging_request(bts, subscr, type, cbfn, data); + rc = paging_request_bts(bts, subscr, type, cbfn, data); if (rc < 0) return rc; + num_pages += rc; } while (1); if (num_pages == 0) diff --git a/openbsc/src/osmo-bsc/osmo_bsc_bssap.c b/openbsc/src/osmo-bsc/osmo_bsc_bssap.c index 8ea5a65ef..c2c241732 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_bssap.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_bssap.c @@ -177,7 +177,7 @@ static int bssmap_handle_paging(struct osmo_msc_data *msc, subscr->tmsi = tmsi; LOGP(DMSC, LOGL_INFO, "Paging request from MSC IMSI: '%s' TMSI: '0x%x/%u' LAC: 0x%x\n", mi_string, tmsi, tmsi, lac); - paging_request(msc->network, subscr, chan_needed, NULL, msc); + bsc_grace_paging_request(subscr, chan_needed, msc); return 0; } @@ -413,8 +413,7 @@ static int bssmap_rcvmsg_udt(struct osmo_msc_data *msc, ret = bssmap_handle_reset_ack(msc, msg, length); break; case BSS_MAP_MSG_PAGING: - if (bsc_grace_allow_new_connection(msc->network, NULL)) - ret = bssmap_handle_paging(msc, msg, length); + ret = bssmap_handle_paging(msc, msg, length); break; } diff --git a/openbsc/src/osmo-bsc/osmo_bsc_grace.c b/openbsc/src/osmo-bsc/osmo_bsc_grace.c index ad0a37e9c..341971ef2 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_grace.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_grace.c @@ -1,6 +1,6 @@ /* - * (C) 2010 by Holger Hans Peter Freyther - * (C) 2010 by On-Waves + * (C) 2010-2013 by Holger Hans Peter Freyther + * (C) 2010-2013 by On-Waves * All Rights Reserved * * This program is free software; you can redistribute it and/or modify @@ -22,17 +22,59 @@ #include #include #include +#include +#include #include int bsc_grace_allow_new_connection(struct gsm_network *network, struct gsm_bts *bts) { if (!network->bsc_data->rf_ctrl) return 1; - if (bts && bts->excl_from_rf_lock) + if (bts->excl_from_rf_lock) return 1; return network->bsc_data->rf_ctrl->policy == S_RF_ON; } +/** + * Try to not page if everything the cell is not on. + */ +int bsc_grace_paging_request(struct gsm_subscriber *subscr, int chan_needed, + struct osmo_msc_data *msc) +{ + struct gsm_bts *bts = NULL; + + if (!subscr->net->bsc_data->rf_ctrl) + goto page; + if (subscr->net->bsc_data->rf_ctrl->policy == S_RF_ON) + goto page; + + /* + * Check if there is any BTS that is on for the given lac. Start + * with NULL and iterate through all bts. + */ + do { + bts = gsm_bts_by_lac(subscr->net, subscr->lac, bts); + if (!bts) + break; + + /* + * continue if the BTS is not excluded from the lock + */ + if (!bts->excl_from_rf_lock) + continue; + + /* + * now page on this bts + */ + paging_request_bts(bts, subscr, chan_needed, NULL, msc); + } while (1); + + /* All bts are either off or in the grace period */ + return 0; +page: + return paging_request(subscr->net, subscr, chan_needed, NULL, msc); +} + static int handle_sub(struct gsm_lchan *lchan, const char *text) { struct gsm_subscriber_connection *conn; -- cgit v1.2.3