summaryrefslogtreecommitdiffstats
path: root/openbsc/src/osmo-bsc
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2017-02-18 22:20:46 +0100
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2017-03-08 01:01:43 +0100
commit6d804b1a7e375213cb4b3e437c2b9b8c68872164 (patch)
tree226c66c67e1d2181e545cb21f83234b90b051a99 /openbsc/src/osmo-bsc
parentabf53d87b6648f2d42562c5699e9035afd92e608 (diff)
add struct bsc_subscr, separating libbsc from gsm_subscriber
In a future commit, gsm_subscriber will be replaced by vlr_subscr, and it will not make sense to use vlr_subscr in libbsc. Thus we need a dedicated BSC subscriber: struct bsc_subscr. Add rf_policy arg to bsc_grace_paging_request() because the bsc_subscr will no longer have a backpointer to gsm_network (used to be via subscr->group). Create a separate logging filter for the new BSC subscriber. The implementation of adjusting the filter context is added in libbsc to not introduce bsc_subscr_get/_put() dependencies to libcommon. During Paging Response, fetch a bsc_subscr from the mobile identity, like we do for the gsm_subscriber. It looks like a duplication now, but will make sense for the VLR as well as for future MSC split patches. Naming: it was requested to not name the new struct bsc_sub, because 'sub' is too ambiguous. At the same time it would be fine to have 'bsc_sub_' as function prefix. Instead of struct bsc_subscriber and bsc_sub_ prefix, I decided to match both up as struct bsc_subscr and bsc_subscr_ function prefix. It's fast to type, relatively short, unambiguous, and the naming is consistent. Add bsc_subscr unit test. Related: OS#1592, OS#1594 Change-Id: Ia61cc00e8bb186b976939a4fc8f7cf9ce6aa3d8e
Diffstat (limited to 'openbsc/src/osmo-bsc')
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_bssap.c11
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_filter.c26
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_grace.c21
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_vty.c15
4 files changed, 39 insertions, 34 deletions
diff --git a/openbsc/src/osmo-bsc/osmo_bsc_bssap.c b/openbsc/src/osmo-bsc/osmo_bsc_bssap.c
index dcfef40..100f664 100644
--- a/openbsc/src/osmo-bsc/osmo_bsc_bssap.c
+++ b/openbsc/src/osmo-bsc/osmo_bsc_bssap.c
@@ -20,9 +20,10 @@
#include <openbsc/osmo_bsc.h>
#include <openbsc/osmo_bsc_grace.h>
+#include <openbsc/osmo_bsc_rf.h>
#include <openbsc/bsc_msc_data.h>
#include <openbsc/debug.h>
-#include <openbsc/gsm_subscriber.h>
+#include <openbsc/bsc_subscriber.h>
#include <openbsc/mgcp.h>
#include <openbsc/paging.h>
@@ -99,7 +100,7 @@ static int bssmap_handle_reset_ack(struct bsc_msc_data *msc,
static int bssmap_handle_paging(struct bsc_msc_data *msc,
struct msgb *msg, unsigned int payload_length)
{
- struct gsm_subscriber *subscr;
+ struct bsc_subscr *subscr;
struct tlv_parsed tp;
char mi_string[GSM48_MI_SIZE];
uint32_t tmsi = GSM_RESERVED_TMSI;
@@ -157,7 +158,8 @@ static int bssmap_handle_paging(struct bsc_msc_data *msc,
LOGP(DMSC, LOGL_ERROR, "eMLPP is not handled\n");
}
- subscr = subscr_get_or_create(msc->network->subscr_group, mi_string);
+ subscr = bsc_subscr_find_or_create_by_imsi(msc->network->bsc_subscribers,
+ mi_string);
if (!subscr) {
LOGP(DMSC, LOGL_ERROR, "Failed to allocate a subscriber for %s\n", mi_string);
return -1;
@@ -167,7 +169,8 @@ static int bssmap_handle_paging(struct bsc_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);
- bsc_grace_paging_request(subscr, chan_needed, msc);
+ bsc_grace_paging_request(msc->network->bsc_data->rf_ctrl->policy,
+ subscr, chan_needed, msc);
return 0;
}
diff --git a/openbsc/src/osmo-bsc/osmo_bsc_filter.c b/openbsc/src/osmo-bsc/osmo_bsc_filter.c
index 3443bbe..2c84b16 100644
--- a/openbsc/src/osmo-bsc/osmo_bsc_filter.c
+++ b/openbsc/src/osmo-bsc/osmo_bsc_filter.c
@@ -21,6 +21,7 @@
#include <openbsc/bsc_msc_data.h>
#include <openbsc/gsm_04_80.h>
#include <openbsc/gsm_subscriber.h>
+#include <openbsc/bsc_subscriber.h>
#include <openbsc/debug.h>
#include <openbsc/paging.h>
@@ -54,14 +55,14 @@ static void handle_lu_request(struct gsm_subscriber_connection *conn,
}
/* extract a subscriber from the paging response */
-static struct gsm_subscriber *extract_sub(struct gsm_subscriber_connection *conn,
- struct msgb *msg)
+static struct bsc_subscr *extract_sub(struct gsm_subscriber_connection *conn,
+ struct msgb *msg)
{
uint8_t mi_type;
char mi_string[GSM48_MI_SIZE];
struct gsm48_hdr *gh;
struct gsm48_pag_resp *resp;
- struct gsm_subscriber *subscr;
+ struct bsc_subscr *subscr;
if (msgb_l3len(msg) < sizeof(*gh) + sizeof(*resp)) {
LOGP(DMSC, LOGL_ERROR, "PagingResponse too small: %u\n", msgb_l3len(msg));
@@ -78,12 +79,12 @@ static struct gsm_subscriber *extract_sub(struct gsm_subscriber_connection *conn
switch (mi_type) {
case GSM_MI_TYPE_TMSI:
- subscr = subscr_active_by_tmsi(conn->bts->network->subscr_group,
- tmsi_from_string(mi_string));
+ subscr = bsc_subscr_find_by_tmsi(conn->network->bsc_subscribers,
+ tmsi_from_string(mi_string));
break;
case GSM_MI_TYPE_IMSI:
- subscr = subscr_active_by_imsi(conn->bts->network->subscr_group,
- mi_string);
+ subscr = bsc_subscr_find_by_imsi(conn->network->bsc_subscribers,
+ mi_string);
break;
default:
subscr = NULL;
@@ -96,15 +97,16 @@ static struct gsm_subscriber *extract_sub(struct gsm_subscriber_connection *conn
/* we will need to stop the paging request */
static int handle_page_resp(struct gsm_subscriber_connection *conn, struct msgb *msg)
{
- struct gsm_subscriber *subscr = extract_sub(conn, msg);
+ struct bsc_subscr *subscr = extract_sub(conn, msg);
if (!subscr) {
LOGP(DMSC, LOGL_ERROR, "Non active subscriber got paged.\n");
return -1;
}
- paging_request_stop(conn->bts, subscr, conn, msg);
- subscr_put(subscr);
+ paging_request_stop(&conn->network->bts_list, conn->bts, subscr, conn,
+ msg);
+ bsc_subscr_put(subscr);
return 0;
}
@@ -130,7 +132,7 @@ struct bsc_msc_data *bsc_find_msc(struct gsm_subscriber_connection *conn,
uint8_t mtype;
struct osmo_bsc_data *bsc;
struct bsc_msc_data *msc, *pag_msc;
- struct gsm_subscriber *subscr;
+ struct bsc_subscr *subscr;
int is_emerg = 0;
bsc = conn->bts->network->bsc_data;
@@ -183,7 +185,7 @@ paging:
}
pag_msc = paging_get_data(conn->bts, subscr);
- subscr_put(subscr);
+ bsc_subscr_put(subscr);
llist_for_each_entry(msc, &bsc->mscs, entry) {
if (msc != pag_msc)
diff --git a/openbsc/src/osmo-bsc/osmo_bsc_grace.c b/openbsc/src/osmo-bsc/osmo_bsc_grace.c
index 5709eea..63afa20 100644
--- a/openbsc/src/osmo-bsc/osmo_bsc_grace.c
+++ b/openbsc/src/osmo-bsc/osmo_bsc_grace.c
@@ -22,7 +22,7 @@
#include <openbsc/osmo_bsc_rf.h>
#include <openbsc/bsc_msc_data.h>
#include <openbsc/gsm_04_80.h>
-#include <openbsc/gsm_subscriber.h>
+#include <openbsc/bsc_subscriber.h>
#include <openbsc/paging.h>
#include <openbsc/signal.h>
@@ -34,8 +34,8 @@ int bsc_grace_allow_new_connection(struct gsm_network *network, struct gsm_bts *
}
-static int normal_paging(struct gsm_subscriber *subscr, int chan_needed,
- struct bsc_msc_data *msc)
+static int normal_paging(struct bsc_subscr *subscr, int chan_needed,
+ struct bsc_msc_data *msc)
{
/* we can't page by lac.. we need to page everything */
if (msc->core_lac != -1) {
@@ -47,12 +47,11 @@ static int normal_paging(struct gsm_subscriber *subscr, int chan_needed,
return 0;
}
- return paging_request(subscr->group->net, subscr, chan_needed, NULL,
- msc);
+ return paging_request(msc->network, subscr, chan_needed, NULL, msc);
}
-static int locked_paging(struct gsm_subscriber *subscr, int chan_needed,
- struct bsc_msc_data *msc)
+static int locked_paging(struct bsc_subscr *subscr, int chan_needed,
+ struct bsc_msc_data *msc)
{
struct gsm_bts *bts = NULL;
@@ -84,10 +83,12 @@ static int locked_paging(struct gsm_subscriber *subscr, int chan_needed,
/**
* Try to not page if everything the cell is not on.
*/
-int bsc_grace_paging_request(struct gsm_subscriber *subscr, int chan_needed,
- struct bsc_msc_data *msc)
+int bsc_grace_paging_request(enum signal_rf rf_policy,
+ struct bsc_subscr *subscr,
+ int chan_needed,
+ struct bsc_msc_data *msc)
{
- if (subscr->group->net->bsc_data->rf_ctrl->policy == S_RF_ON)
+ if (rf_policy == S_RF_ON)
return normal_paging(subscr, chan_needed, msc);
return locked_paging(subscr, chan_needed, msc);
}
diff --git a/openbsc/src/osmo-bsc/osmo_bsc_vty.c b/openbsc/src/osmo-bsc/osmo_bsc_vty.c
index d59c515..2336669 100644
--- a/openbsc/src/osmo-bsc/osmo_bsc_vty.c
+++ b/openbsc/src/osmo-bsc/osmo_bsc_vty.c
@@ -22,7 +22,7 @@
#include <openbsc/osmo_bsc.h>
#include <openbsc/bsc_msc_data.h>
#include <openbsc/vty.h>
-#include <openbsc/gsm_subscriber.h>
+#include <openbsc/bsc_subscriber.h>
#include <openbsc/debug.h>
#include <openbsc/bsc_msg_filter.h>
@@ -861,20 +861,19 @@ DEFUN(logging_fltr_imsi,
LOGGING_STR FILTER_STR
"Filter log messages by IMSI\n" "IMSI to be used as filter\n")
{
- struct gsm_subscriber *subscr;
+ struct bsc_subscr *bsc_subscr;
struct log_target *tgt = osmo_log_vty2tgt(vty);
+ const char *imsi = argv[0];
- if (!tgt)
- return CMD_WARNING;
+ bsc_subscr = bsc_subscr_find_by_imsi(bsc_gsmnet->bsc_subscribers, imsi);
- subscr = subscr_get_or_create(bsc_gsmnet->subscr_group, argv[0]);
- if (!subscr) {
+ if (!bsc_subscr) {
vty_out(vty, "%%no subscriber with IMSI(%s)%s",
- argv[0], VTY_NEWLINE);
+ imsi, VTY_NEWLINE);
return CMD_WARNING;
}
- log_set_imsi_filter(tgt, subscr);
+ log_set_filter_bsc_subscr(tgt, bsc_subscr);
return CMD_SUCCESS;
}