aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libmsc/gsm_04_08.c
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2014-12-03 09:28:24 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-12-05 14:59:02 +0100
commit1e30a28e51b5e8a14b977233858f267f839197d5 (patch)
tree07f0a3f2fc5cf316b40d55cae5f40243b419e5ca /openbsc/src/libmsc/gsm_04_08.c
parentdae1f64ba688eaa24aad6ce15a8529bdef788146 (diff)
msc: Add and use gsm_subscriber_group
Currently every subcriber object directly refers to the gsm_network which contains a flag shared by every related subscriber (keep_subscr). This adds a dependency on gsm_network even if only the function defined in gsm_subscriber_base.c are used. This patch adds a new struct gsm_subscriber_group which contains the keep_subscr flag and a back reference to the network object. The latter is not dereferenced in gsm_subscriber_base.c, so it can safely be set to NULL when only that part of the gsm_subscriber API is being used. It also changes that API to use gsm_subscriber_group instead of gsm_network parameters. Since there are some places where a pointer to the gsm_network is needed but where only a gsm_subscriber is available, a 'net' back pointer is added to the group struct, too. Nevertheless subscr group and network could be separated completely, but this is not the topic of this commit. Sponsored-by: On-Waves ehf
Diffstat (limited to 'openbsc/src/libmsc/gsm_04_08.c')
-rw-r--r--openbsc/src/libmsc/gsm_04_08.c37
1 files changed, 22 insertions, 15 deletions
diff --git a/openbsc/src/libmsc/gsm_04_08.c b/openbsc/src/libmsc/gsm_04_08.c
index 8916fe638..ede6db389 100644
--- a/openbsc/src/libmsc/gsm_04_08.c
+++ b/openbsc/src/libmsc/gsm_04_08.c
@@ -255,7 +255,7 @@ static int authorize_subscriber(struct gsm_loc_updating_operation *loc,
if (loc && (loc->waiting_for_imsi || loc->waiting_for_imei))
return 0;
- switch (subscriber->net->auth_policy) {
+ switch (subscriber->group->net->auth_policy) {
case GSM_AUTH_POLICY_CLOSED:
return subscriber->authorized;
case GSM_AUTH_POLICY_TOKEN:
@@ -498,9 +498,11 @@ static int mm_rx_id_resp(struct gsm_subscriber_connection *conn, struct msgb *ms
case GSM_MI_TYPE_IMSI:
/* look up subscriber based on IMSI, create if not found */
if (!conn->subscr) {
- conn->subscr = subscr_get_by_imsi(net, mi_string);
+ conn->subscr = subscr_get_by_imsi(net->subscr_group,
+ mi_string);
if (!conn->subscr)
- conn->subscr = subscr_create_subscriber(net, mi_string);
+ conn->subscr = subscr_create_subscriber(
+ net->subscr_group, mi_string);
}
if (conn->loc_operation)
conn->loc_operation->waiting_for_imsi = 0;
@@ -610,15 +612,16 @@ static int mm_rx_loc_upd_req(struct gsm_subscriber_connection *conn, struct msgb
conn->loc_operation->waiting_for_imei = 1;
/* look up subscriber based on IMSI, create if not found */
- subscr = subscr_get_by_imsi(bts->network, mi_string);
+ subscr = subscr_get_by_imsi(bts->network->subscr_group, mi_string);
if (!subscr) {
- subscr = subscr_create_subscriber(bts->network, mi_string);
+ subscr = subscr_create_subscriber(
+ bts->network->subscr_group, mi_string);
}
break;
case GSM_MI_TYPE_TMSI:
DEBUGPC(DMM, "\n");
/* look up the subscriber based on TMSI, request IMSI if it fails */
- subscr = subscr_get_by_tmsi(bts->network,
+ subscr = subscr_get_by_tmsi(bts->network->subscr_group,
tmsi_from_string(mi_string));
if (!subscr) {
/* send IDENTITY REQUEST message to get IMSI */
@@ -948,7 +951,7 @@ static int gsm48_rx_mm_serv_req(struct gsm_subscriber_connection *conn, struct m
if (is_siemens_bts(bts))
send_siemens_mrpci(msg->lchan, classmark2-1);
- subscr = subscr_get_by_tmsi(bts->network,
+ subscr = subscr_get_by_tmsi(bts->network->subscr_group,
tmsi_from_string(mi_string));
/* FIXME: if we don't know the TMSI, inquire abit IMSI and allocate new TMSI */
@@ -995,12 +998,13 @@ static int gsm48_rx_mm_imsi_detach_ind(struct gsm_subscriber_connection *conn, s
switch (mi_type) {
case GSM_MI_TYPE_TMSI:
DEBUGPC(DMM, "\n");
- subscr = subscr_get_by_tmsi(bts->network,
+ subscr = subscr_get_by_tmsi(bts->network->subscr_group,
tmsi_from_string(mi_string));
break;
case GSM_MI_TYPE_IMSI:
DEBUGPC(DMM, "\n");
- subscr = subscr_get_by_imsi(bts->network, mi_string);
+ subscr = subscr_get_by_imsi(bts->network->subscr_group,
+ mi_string);
break;
case GSM_MI_TYPE_IMEI:
case GSM_MI_TYPE_IMEISV:
@@ -1145,11 +1149,12 @@ static int gsm48_rx_rr_pag_resp(struct gsm_subscriber_connection *conn, struct m
switch (mi_type) {
case GSM_MI_TYPE_TMSI:
- subscr = subscr_get_by_tmsi(bts->network,
+ subscr = subscr_get_by_tmsi(bts->network->subscr_group,
tmsi_from_string(mi_string));
break;
case GSM_MI_TYPE_IMSI:
- subscr = subscr_get_by_imsi(bts->network, mi_string);
+ subscr = subscr_get_by_imsi(bts->network->subscr_group,
+ mi_string);
break;
}
@@ -3040,10 +3045,11 @@ int mncc_tx_to_cc(struct gsm_network *net, int msg_type, void *arg)
}
/* New transaction due to setup, find subscriber */
if (data->called.number[0])
- subscr = subscr_get_by_extension(net,
+ subscr = subscr_get_by_extension(net->subscr_group,
data->called.number);
else
- subscr = subscr_get_by_imsi(net, data->imsi);
+ subscr = subscr_get_by_imsi(net->subscr_group,
+ data->imsi);
/* update the subscriber we deal with */
log_set_context(BSC_CTX_SUBSCR, subscr);
@@ -3107,7 +3113,8 @@ int mncc_tx_to_cc(struct gsm_network *net, int msg_type, void *arg)
memcpy(&trans->cc.msg, data, sizeof(struct gsm_mncc));
/* Get a channel */
- trans->paging_request = talloc_zero(subscr->net, struct gsm_network*);
+ trans->paging_request = talloc_zero(subscr->group->net,
+ struct gsm_network*);
if (!trans->paging_request) {
LOGP(DCC, LOGL_ERROR, "Failed to allocate paging token.\n");
subscr_put(subscr);
@@ -3115,7 +3122,7 @@ int mncc_tx_to_cc(struct gsm_network *net, int msg_type, void *arg)
return 0;
}
- *trans->paging_request = subscr->net;
+ *trans->paging_request = subscr->group->net;
subscr_get_channel(subscr, RSL_CHANNEED_TCH_F, setup_trig_pag_evt, trans->paging_request);
subscr_put(subscr);