aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libmsc
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
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')
-rw-r--r--openbsc/src/libmsc/ctrl_commands.c6
-rw-r--r--openbsc/src/libmsc/db.c4
-rw-r--r--openbsc/src/libmsc/gsm_04_08.c37
-rw-r--r--openbsc/src/libmsc/gsm_04_11.c3
-rw-r--r--openbsc/src/libmsc/gsm_subscriber.c35
-rw-r--r--openbsc/src/libmsc/silent_call.c2
-rw-r--r--openbsc/src/libmsc/smpp_openbsc.c4
-rw-r--r--openbsc/src/libmsc/sms_queue.c8
-rw-r--r--openbsc/src/libmsc/token_auth.c6
-rw-r--r--openbsc/src/libmsc/transaction.c2
-rw-r--r--openbsc/src/libmsc/vty_interface_layer3.c14
11 files changed, 65 insertions, 56 deletions
diff --git a/openbsc/src/libmsc/ctrl_commands.c b/openbsc/src/libmsc/ctrl_commands.c
index 702a7ae21..e48c6a3e1 100644
--- a/openbsc/src/libmsc/ctrl_commands.c
+++ b/openbsc/src/libmsc/ctrl_commands.c
@@ -67,9 +67,9 @@ static int set_subscriber_modify(struct ctrl_cmd *cmd, void *data)
imsi = strtok_r(tmp, ",", &saveptr);
msisdn = strtok_r(NULL, ",", &saveptr);
- subscr = subscr_get_by_imsi(net, imsi);
+ subscr = subscr_get_by_imsi(net->subscr_group, imsi);
if (!subscr)
- subscr = subscr_create_subscriber(net, imsi);
+ subscr = subscr_create_subscriber(net->subscr_group, imsi);
if (!subscr)
goto fail;
@@ -118,7 +118,7 @@ static int set_subscriber_delete(struct ctrl_cmd *cmd, void *data)
struct gsm_subscriber *subscr;
struct gsm_network *net = cmd->node;
- subscr = subscr_get_by_imsi(net, cmd->value);
+ subscr = subscr_get_by_imsi(net->subscr_group, cmd->value);
if (!subscr) {
cmd->reply = "Failed to find subscriber";
return CTRL_CMD_ERROR;
diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c
index 656c661b7..bdecbb436 100644
--- a/openbsc/src/libmsc/db.c
+++ b/openbsc/src/libmsc/db.c
@@ -1470,7 +1470,7 @@ static struct gsm_sms *sms_from_result(struct gsm_network *net, dbi_result resul
strncpy(sms->dst.addr, daddr, sizeof(sms->dst.addr));
sms->dst.addr[sizeof(sms->dst.addr)-1] = '\0';
}
- sms->receiver = subscr_get_by_extension(net, sms->dst.addr);
+ sms->receiver = subscr_get_by_extension(net->subscr_group, sms->dst.addr);
sms->src.npi = dbi_result_get_ulonglong(result, "src_npi");
sms->src.ton = dbi_result_get_ulonglong(result, "src_ton");
@@ -1597,7 +1597,7 @@ struct gsm_sms *db_sms_get_unsent_for_subscr(struct gsm_subscriber *subscr)
return NULL;
}
- sms = sms_from_result(subscr->net, result);
+ sms = sms_from_result(subscr->group->net, result);
dbi_result_free(result);
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);
diff --git a/openbsc/src/libmsc/gsm_04_11.c b/openbsc/src/libmsc/gsm_04_11.c
index 1c46b96b0..bc9d59e71 100644
--- a/openbsc/src/libmsc/gsm_04_11.c
+++ b/openbsc/src/libmsc/gsm_04_11.c
@@ -392,7 +392,8 @@ static int gsm340_rx_tpdu(struct gsm_subscriber_connection *conn, struct msgb *m
send_signal(0, NULL, gsms, 0);
/* determine gsms->receiver based on dialled number */
- gsms->receiver = subscr_get_by_extension(conn->bts->network, gsms->dst.addr);
+ gsms->receiver = subscr_get_by_extension(conn->bts->network->subscr_group,
+ gsms->dst.addr);
if (!gsms->receiver) {
#ifdef BUILD_SMPP
rc = smpp_try_deliver(gsms, conn);
diff --git a/openbsc/src/libmsc/gsm_subscriber.c b/openbsc/src/libmsc/gsm_subscriber.c
index bc6f3cf55..c444fe058 100644
--- a/openbsc/src/libmsc/gsm_subscriber.c
+++ b/openbsc/src/libmsc/gsm_subscriber.c
@@ -78,12 +78,12 @@ enum {
REQ_STATE_DISPATCHED,
};
-static struct gsm_subscriber *get_subscriber(struct gsm_network *net,
+static struct gsm_subscriber *get_subscriber(struct gsm_subscriber_group *sgrp,
int type, const char *ident)
{
struct gsm_subscriber *subscr = db_get_subscriber(type, ident);
if (subscr)
- subscr->net = net;
+ subscr->group = sgrp;
return subscr;
}
@@ -199,12 +199,13 @@ static void subscr_send_paging_request(struct gsm_subscriber *subscr)
{
struct subscr_request *request;
int rc;
+ struct gsm_network *net = subscr->group->net;
assert(!llist_empty(&subscr->requests));
request = (struct subscr_request *)subscr->requests.next;
request->state = REQ_STATE_PAGED;
- rc = paging_request(subscr->net, subscr, request->channel_type,
+ rc = paging_request(net, subscr, request->channel_type,
subscr_paging_cb, subscr);
/* paging failed, quit now */
@@ -275,16 +276,16 @@ void subscr_put_channel(struct gsm_subscriber *subscr)
subscr_send_paging_request(subscr);
}
-struct gsm_subscriber *subscr_create_subscriber(struct gsm_network *net,
+struct gsm_subscriber *subscr_create_subscriber(struct gsm_subscriber_group *sgrp,
const char *imsi)
{
struct gsm_subscriber *subscr = db_create_subscriber(imsi);
if (subscr)
- subscr->net = net;
+ subscr->group = sgrp;
return subscr;
}
-struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
+struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_subscriber_group *sgrp,
uint32_t tmsi)
{
char tmsi_string[14];
@@ -297,10 +298,10 @@ struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
}
sprintf(tmsi_string, "%u", tmsi);
- return get_subscriber(net, GSM_SUBSCRIBER_TMSI, tmsi_string);
+ return get_subscriber(sgrp, GSM_SUBSCRIBER_TMSI, tmsi_string);
}
-struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
+struct gsm_subscriber *subscr_get_by_imsi(struct gsm_subscriber_group *sgrp,
const char *imsi)
{
struct gsm_subscriber *subscr;
@@ -310,10 +311,10 @@ struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
return subscr_get(subscr);
}
- return get_subscriber(net, GSM_SUBSCRIBER_IMSI, imsi);
+ return get_subscriber(sgrp, GSM_SUBSCRIBER_IMSI, imsi);
}
-struct gsm_subscriber *subscr_get_by_extension(struct gsm_network *net,
+struct gsm_subscriber *subscr_get_by_extension(struct gsm_subscriber_group *sgrp,
const char *ext)
{
struct gsm_subscriber *subscr;
@@ -323,10 +324,10 @@ struct gsm_subscriber *subscr_get_by_extension(struct gsm_network *net,
return subscr_get(subscr);
}
- return get_subscriber(net, GSM_SUBSCRIBER_EXTENSION, ext);
+ return get_subscriber(sgrp, GSM_SUBSCRIBER_EXTENSION, ext);
}
-struct gsm_subscriber *subscr_get_by_id(struct gsm_network *net,
+struct gsm_subscriber *subscr_get_by_id(struct gsm_subscriber_group *sgrp,
unsigned long long id)
{
struct gsm_subscriber *subscr;
@@ -338,7 +339,7 @@ struct gsm_subscriber *subscr_get_by_id(struct gsm_network *net,
return subscr_get(subscr);
}
- return get_subscriber(net, GSM_SUBSCRIBER_ID, buf);
+ return get_subscriber(sgrp, GSM_SUBSCRIBER_ID, buf);
}
int subscr_update_expire_lu(struct gsm_subscriber *s, struct gsm_bts *bts)
@@ -370,7 +371,7 @@ int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason)
/* FIXME: Migrate pending requests from one BSC to another */
switch (reason) {
case GSM_SUBSCRIBER_UPDATE_ATTACHED:
- s->net = bts->network;
+ s->group = bts->network->subscr_group;
/* Indicate "attached to LAC" */
s->lac = bts->location_area_code;
@@ -412,7 +413,7 @@ void subscr_update_from_db(struct gsm_subscriber *sub)
static void subscr_expire_callback(void *data, long long unsigned int id)
{
struct gsm_network *net = data;
- struct gsm_subscriber *s = subscr_get_by_id(net, id);
+ struct gsm_subscriber *s = subscr_get_by_id(net->subscr_group, id);
struct gsm_subscriber_connection *conn = connection_for_subscr(s);
/*
@@ -438,9 +439,9 @@ static void subscr_expire_callback(void *data, long long unsigned int id)
subscr_put(s);
}
-void subscr_expire(struct gsm_network *net)
+void subscr_expire(struct gsm_subscriber_group *sgrp)
{
- db_subscriber_expire(net, subscr_expire_callback);
+ db_subscriber_expire(sgrp->net, subscr_expire_callback);
}
int subscr_pending_requests(struct gsm_subscriber *sub)
diff --git a/openbsc/src/libmsc/silent_call.c b/openbsc/src/libmsc/silent_call.c
index 4462dfcba..010c2b4d2 100644
--- a/openbsc/src/libmsc/silent_call.c
+++ b/openbsc/src/libmsc/silent_call.c
@@ -120,7 +120,7 @@ int gsm_silent_call_start(struct gsm_subscriber *subscr, void *data, int type)
{
int rc;
- rc = paging_request(subscr->net, subscr, type,
+ rc = paging_request(subscr->group->net, subscr, type,
paging_cb_silent, data);
return rc;
}
diff --git a/openbsc/src/libmsc/smpp_openbsc.c b/openbsc/src/libmsc/smpp_openbsc.c
index 7e14c74bb..686131762 100644
--- a/openbsc/src/libmsc/smpp_openbsc.c
+++ b/openbsc/src/libmsc/smpp_openbsc.c
@@ -55,11 +55,11 @@ static struct gsm_subscriber *subscr_by_dst(struct gsm_network *net,
switch (npi) {
case NPI_Land_Mobile_E212:
- subscr = subscr_get_by_imsi(net, addr);
+ subscr = subscr_get_by_imsi(net->subscr_group, addr);
break;
case NPI_ISDN_E163_E164:
case NPI_Private:
- subscr = subscr_get_by_extension(net, addr);
+ subscr = subscr_get_by_extension(net->subscr_group, addr);
break;
default:
LOGP(DSMPP, LOGL_NOTICE, "Unsupported NPI: %u\n", npi);
diff --git a/openbsc/src/libmsc/sms_queue.c b/openbsc/src/libmsc/sms_queue.c
index 536bfdd14..3ed8b562a 100644
--- a/openbsc/src/libmsc/sms_queue.c
+++ b/openbsc/src/libmsc/sms_queue.c
@@ -135,7 +135,7 @@ static void sms_pending_resend(struct gsm_sms_pending *pending)
pending->resend = 1;
- smsq = pending->subscr->net->sms_queue;
+ smsq = pending->subscr->group->net->sms_queue;
if (osmo_timer_pending(&smsq->resend_pending))
return;
@@ -149,7 +149,7 @@ static void sms_pending_failed(struct gsm_sms_pending *pending, int paging_error
LOGP(DLSMS, LOGL_NOTICE, "Sending SMS %llu failed %d times.\n",
pending->sms_id, pending->failed_attempts);
- smsq = pending->subscr->net->sms_queue;
+ smsq = pending->subscr->group->net->sms_queue;
if (++pending->failed_attempts < smsq->max_fail)
return sms_pending_resend(pending);
@@ -285,7 +285,7 @@ static void sms_submit_pending(void *_data)
*/
static void sms_send_next(struct gsm_subscriber *subscr)
{
- struct gsm_sms_queue *smsq = subscr->net->sms_queue;
+ struct gsm_sms_queue *smsq = subscr->group->net->sms_queue;
struct gsm_sms_pending *pending;
struct gsm_sms *sms;
@@ -316,7 +316,7 @@ static void sms_send_next(struct gsm_subscriber *subscr)
no_pending_sms:
/* Try to send the SMS to avoid the queue being stuck */
- sms_submit_pending(subscr->net->sms_queue);
+ sms_submit_pending(subscr->group->net->sms_queue);
}
/*
diff --git a/openbsc/src/libmsc/token_auth.c b/openbsc/src/libmsc/token_auth.c
index 45b5a8eab..95fd9b345 100644
--- a/openbsc/src/libmsc/token_auth.c
+++ b/openbsc/src/libmsc/token_auth.c
@@ -59,7 +59,7 @@ static int token_subscr_cb(unsigned int subsys, unsigned int signal,
if (signal != S_SUBSCR_ATTACHED)
return 0;
- if (subscr->net->auth_policy != GSM_AUTH_POLICY_TOKEN)
+ if (subscr->group->net->auth_policy != GSM_AUTH_POLICY_TOKEN)
return 0;
if (subscr->flags & GSM_SUBSCRIBER_FIRST_CONTACT) {
@@ -82,7 +82,7 @@ static int token_subscr_cb(unsigned int subsys, unsigned int signal,
/* FIXME: don't use ID 1 static */
- sender = subscr_get_by_id(subscr->net, 1);
+ sender = subscr_get_by_id(subscr->group, 1);
sms = sms_from_text(subscr, sender, 0, sms_str);
@@ -136,7 +136,7 @@ static int token_sms_cb(unsigned int subsys, unsigned int signal,
return 0;
- if (sms->receiver->net->auth_policy != GSM_AUTH_POLICY_TOKEN)
+ if (sms->receiver->group->net->auth_policy != GSM_AUTH_POLICY_TOKEN)
return 0;
diff --git a/openbsc/src/libmsc/transaction.c b/openbsc/src/libmsc/transaction.c
index 4d3aeacf1..5621067c0 100644
--- a/openbsc/src/libmsc/transaction.c
+++ b/openbsc/src/libmsc/transaction.c
@@ -66,7 +66,7 @@ struct gsm_trans *trans_alloc(struct gsm_subscriber *subscr,
uint32_t callref)
{
struct gsm_trans *trans;
- struct gsm_network *net = subscr->net;
+ struct gsm_network *net = subscr->group->net;
DEBUGP(DCC, "subscr=%p, net=%p\n", subscr, net);
diff --git a/openbsc/src/libmsc/vty_interface_layer3.c b/openbsc/src/libmsc/vty_interface_layer3.c
index 8890099c6..f9213f542 100644
--- a/openbsc/src/libmsc/vty_interface_layer3.c
+++ b/openbsc/src/libmsc/vty_interface_layer3.c
@@ -169,7 +169,7 @@ static int _send_sms_str(struct gsm_subscriber *receiver,
}
sms_free(sms);
- sms_queue_trigger(receiver->net->sms_queue);
+ sms_queue_trigger(receiver->group->net->sms_queue);
return CMD_SUCCESS;
}
@@ -178,13 +178,13 @@ static struct gsm_subscriber *get_subscr_by_argv(struct gsm_network *gsmnet,
const char *id)
{
if (!strcmp(type, "extension"))
- return subscr_get_by_extension(gsmnet, id);
+ return subscr_get_by_extension(gsmnet->subscr_group, id);
else if (!strcmp(type, "imsi"))
- return subscr_get_by_imsi(gsmnet, id);
+ return subscr_get_by_imsi(gsmnet->subscr_group, id);
else if (!strcmp(type, "tmsi"))
- return subscr_get_by_tmsi(gsmnet, atoi(id));
+ return subscr_get_by_tmsi(gsmnet->subscr_group, atoi(id));
else if (!strcmp(type, "id"))
- return subscr_get_by_id(gsmnet, atoi(id));
+ return subscr_get_by_id(gsmnet->subscr_group, atoi(id));
return NULL;
}
@@ -229,7 +229,7 @@ DEFUN(subscriber_create,
struct gsm_network *gsmnet = gsmnet_from_vty(vty);
struct gsm_subscriber *subscr;
- subscr = subscr_create_subscriber(gsmnet, argv[0]);
+ subscr = subscr_create_subscriber(gsmnet->subscr_group, argv[0]);
if (!subscr) {
vty_out(vty, "%% No subscriber created for IMSI %s%s",
argv[0], VTY_NEWLINE);
@@ -779,7 +779,7 @@ DEFUN(subscriber_purge,
struct gsm_network *net = gsmnet_from_vty(vty);
int purged;
- purged = subscr_purge_inactive(net);
+ purged = subscr_purge_inactive(net->subscr_group);
vty_out(vty, "%d subscriber(s) were purged.%s", purged, VTY_NEWLINE);
return CMD_SUCCESS;
}