diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2013-01-07 17:30:13 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2013-01-28 15:41:27 +0100 |
commit | dc030960fc729c3124c40838a733eab1bc9394b0 (patch) | |
tree | f9d4d99821a356169af7d2b8674cabcfd384dc56 /openbsc/src/osmo-bsc/osmo_bsc_grace.c | |
parent | 3d119f1de474340bdfb98e237735e1a3170252cb (diff) |
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.
Diffstat (limited to 'openbsc/src/osmo-bsc/osmo_bsc_grace.c')
-rw-r--r-- | openbsc/src/osmo-bsc/osmo_bsc_grace.c | 48 |
1 files changed, 45 insertions, 3 deletions
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 <zecke@selfish.org> - * (C) 2010 by On-Waves + * (C) 2010-2013 by Holger Hans Peter Freyther <zecke@selfish.org> + * (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 <openbsc/osmo_bsc_rf.h> #include <openbsc/osmo_msc_data.h> #include <openbsc/gsm_04_80.h> +#include <openbsc/gsm_subscriber.h> +#include <openbsc/paging.h> #include <openbsc/signal.h> 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; |