make sure subscr->net is always set

since a subscriber is an element of the gsm_network, we have to ensure
subscr->net is always set correctly.  We do this by using gsm_network
as an argument to all functions that resolve or create a subscriber.
This commit is contained in:
Harald Welte 2009-07-23 18:46:00 +02:00
parent 9f93c7d61b
commit 9176bd46e3
7 changed files with 54 additions and 31 deletions

View File

@ -31,14 +31,17 @@ int db_prepare();
int db_fini(); int db_fini();
/* subscriber management */ /* subscriber management */
struct gsm_subscriber* db_create_subscriber(char *imsi); struct gsm_subscriber* db_create_subscriber(struct gsm_network *net,
struct gsm_subscriber* db_get_subscriber(enum gsm_subscriber_field field, const char *subscr); char *imsi);
struct gsm_subscriber* db_get_subscriber(struct gsm_network *net,
enum gsm_subscriber_field field,
const char *subscr);
int db_sync_subscriber(struct gsm_subscriber* subscriber); int db_sync_subscriber(struct gsm_subscriber* subscriber);
int db_subscriber_alloc_tmsi(struct gsm_subscriber* subscriber); int db_subscriber_alloc_tmsi(struct gsm_subscriber* subscriber);
int db_subscriber_assoc_imei(struct gsm_subscriber* subscriber, char *imei); int db_subscriber_assoc_imei(struct gsm_subscriber* subscriber, char *imei);
/* SMS store-and-forward */ /* SMS store-and-forward */
int db_sms_store(struct gsm_sms *sms); int db_sms_store(struct gsm_sms *sms);
struct gsm_sms *db_sms_get_unsent(int min_id); struct gsm_sms *db_sms_get_unsent(struct gsm_network *net, int min_id);
int db_sms_mark_sent(struct gsm_sms *sms); int db_sms_mark_sent(struct gsm_sms *sms);
#endif /* _DB_H */ #endif /* _DB_H */

View File

@ -61,9 +61,12 @@ enum gsm_subscriber_update_reason {
struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr); struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr);
struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr); struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr);
struct gsm_subscriber *subscr_get_by_tmsi(const char *tmsi); struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
struct gsm_subscriber *subscr_get_by_imsi(const char *imsi); const char *tmsi);
struct gsm_subscriber *subscr_get_by_extension(const char *ext); struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
const char *imsi);
struct gsm_subscriber *subscr_get_by_extension(struct gsm_network *net,
const char *ext);
int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason); int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason);
void subscr_put_channel(struct gsm_lchan *lchan); void subscr_put_channel(struct gsm_lchan *lchan);
void subscr_get_channel(struct gsm_subscriber *subscr, void subscr_get_channel(struct gsm_subscriber *subscr,

View File

@ -158,12 +158,13 @@ int db_fini() {
return 0; return 0;
} }
struct gsm_subscriber* db_create_subscriber(char *imsi) { struct gsm_subscriber* db_create_subscriber(struct gsm_network *net, char *imsi)
{
dbi_result result; dbi_result result;
struct gsm_subscriber* subscr; struct gsm_subscriber* subscr;
/* Is this subscriber known in the db? */ /* Is this subscriber known in the db? */
subscr = db_get_subscriber(GSM_SUBSCRIBER_IMSI, imsi); subscr = db_get_subscriber(net, GSM_SUBSCRIBER_IMSI, imsi);
if (subscr) { if (subscr) {
result = dbi_conn_queryf(conn, result = dbi_conn_queryf(conn,
"UPDATE Subscriber set updated = datetime('now') " "UPDATE Subscriber set updated = datetime('now') "
@ -189,6 +190,7 @@ struct gsm_subscriber* db_create_subscriber(char *imsi) {
if (result==NULL) { if (result==NULL) {
printf("DB: Failed to create Subscriber by IMSI.\n"); printf("DB: Failed to create Subscriber by IMSI.\n");
} }
subscr->net = net;
subscr->id = dbi_conn_sequence_last(conn, NULL); subscr->id = dbi_conn_sequence_last(conn, NULL);
strncpy(subscr->imsi, imsi, GSM_IMSI_LENGTH-1); strncpy(subscr->imsi, imsi, GSM_IMSI_LENGTH-1);
dbi_result_free(result); dbi_result_free(result);
@ -196,7 +198,10 @@ struct gsm_subscriber* db_create_subscriber(char *imsi) {
return subscr; return subscr;
} }
struct gsm_subscriber *db_get_subscriber(enum gsm_subscriber_field field, const char *id) { struct gsm_subscriber *db_get_subscriber(struct gsm_network *net,
enum gsm_subscriber_field field,
const char *id)
{
dbi_result result; dbi_result result;
const char *string; const char *string;
char *quoted; char *quoted;
@ -253,6 +258,7 @@ struct gsm_subscriber *db_get_subscriber(enum gsm_subscriber_field field, const
} }
subscr = subscr_alloc(); subscr = subscr_alloc();
subscr->net = net;
subscr->id = dbi_result_get_ulonglong(result, "id"); subscr->id = dbi_result_get_ulonglong(result, "id");
string = dbi_result_get_string(result, "imsi"); string = dbi_result_get_string(result, "imsi");
if (string) if (string)
@ -470,7 +476,7 @@ int db_sms_store(struct gsm_sms *sms)
} }
/* retrieve the next unsent SMS with ID >= min_id */ /* retrieve the next unsent SMS with ID >= min_id */
struct gsm_sms *db_sms_get_unsent(int min_id) struct gsm_sms *db_sms_get_unsent(struct gsm_network *net, int min_id)
{ {
dbi_result result; dbi_result result;
long long unsigned int sender_id, receiver_id; long long unsigned int sender_id, receiver_id;
@ -494,11 +500,11 @@ struct gsm_sms *db_sms_get_unsent(int min_id)
sender_id = dbi_result_get_ulonglong(result, "sender_id"); sender_id = dbi_result_get_ulonglong(result, "sender_id");
sprintf(buf, "%llu", sender_id); sprintf(buf, "%llu", sender_id);
sms->sender = db_get_subscriber(GSM_SUBSCRIBER_ID, buf); sms->sender = db_get_subscriber(net, GSM_SUBSCRIBER_ID, buf);
receiver_id = dbi_result_get_ulonglong(result, "receiver_id"); receiver_id = dbi_result_get_ulonglong(result, "receiver_id");
sprintf(buf, "%llu", receiver_id); sprintf(buf, "%llu", receiver_id);
sms->receiver = db_get_subscriber(GSM_SUBSCRIBER_ID, buf); sms->receiver = db_get_subscriber(net, GSM_SUBSCRIBER_ID, buf);
/* FIXME: fill header */ /* FIXME: fill header */

View File

@ -1129,6 +1129,8 @@ static int mm_rx_id_resp(struct msgb *msg)
{ {
struct gsm48_hdr *gh = msgb_l3(msg); struct gsm48_hdr *gh = msgb_l3(msg);
struct gsm_lchan *lchan = msg->lchan; struct gsm_lchan *lchan = msg->lchan;
struct gsm_bts *bts = lchan->ts->trx->bts;
struct gsm_network *net = bts->network;
u_int8_t mi_type = gh->data[1] & GSM_MI_TYPE_MASK; u_int8_t mi_type = gh->data[1] & GSM_MI_TYPE_MASK;
char mi_string[MI_SIZE]; char mi_string[MI_SIZE];
@ -1139,7 +1141,7 @@ static int mm_rx_id_resp(struct msgb *msg)
switch (mi_type) { switch (mi_type) {
case GSM_MI_TYPE_IMSI: case GSM_MI_TYPE_IMSI:
if (!lchan->subscr) if (!lchan->subscr)
lchan->subscr = db_create_subscriber(mi_string); lchan->subscr = db_create_subscriber(net, mi_string);
if (lchan->loc_operation) if (lchan->loc_operation)
lchan->loc_operation->waiting_for_imsi = 0; lchan->loc_operation->waiting_for_imsi = 0;
break; break;
@ -1196,6 +1198,7 @@ static int mm_rx_loc_upd_req(struct msgb *msg)
struct gsm48_loc_upd_req *lu; struct gsm48_loc_upd_req *lu;
struct gsm_subscriber *subscr = NULL; struct gsm_subscriber *subscr = NULL;
struct gsm_lchan *lchan = msg->lchan; struct gsm_lchan *lchan = msg->lchan;
struct gsm_bts *bts = lchan->ts->trx->bts;
u_int8_t mi_type; u_int8_t mi_type;
char mi_string[MI_SIZE]; char mi_string[MI_SIZE];
int rc; int rc;
@ -1230,7 +1233,7 @@ static int mm_rx_loc_upd_req(struct msgb *msg)
lchan->loc_operation->waiting_for_imei = 1; lchan->loc_operation->waiting_for_imei = 1;
/* look up subscriber based on IMSI */ /* look up subscriber based on IMSI */
subscr = db_create_subscriber(mi_string); subscr = db_create_subscriber(bts->network, mi_string);
break; break;
case GSM_MI_TYPE_TMSI: case GSM_MI_TYPE_TMSI:
DEBUGPC(DMM, "\n"); DEBUGPC(DMM, "\n");
@ -1239,7 +1242,7 @@ static int mm_rx_loc_upd_req(struct msgb *msg)
lchan->loc_operation->waiting_for_imei = 1; lchan->loc_operation->waiting_for_imei = 1;
/* look up the subscriber based on TMSI, request IMSI if it fails */ /* look up the subscriber based on TMSI, request IMSI if it fails */
subscr = subscr_get_by_tmsi(mi_string); subscr = subscr_get_by_tmsi(bts->network, mi_string);
if (!subscr) { if (!subscr) {
/* send IDENTITY REQUEST message to get IMSI */ /* send IDENTITY REQUEST message to get IMSI */
rc = mm_tx_identity_req(lchan, GSM_MI_TYPE_IMSI); rc = mm_tx_identity_req(lchan, GSM_MI_TYPE_IMSI);
@ -1421,6 +1424,7 @@ static int gsm48_rx_mm_serv_req(struct msgb *msg)
u_int8_t mi_type; u_int8_t mi_type;
char mi_string[MI_SIZE]; char mi_string[MI_SIZE];
struct gsm_bts *bts = msg->lchan->ts->trx->bts;
struct gsm_subscriber *subscr; struct gsm_subscriber *subscr;
struct gsm48_hdr *gh = msgb_l3(msg); struct gsm48_hdr *gh = msgb_l3(msg);
struct gsm48_service_request *req = struct gsm48_service_request *req =
@ -1455,7 +1459,7 @@ static int gsm48_rx_mm_serv_req(struct msgb *msg)
DEBUGPC(DMM, "serv_type=0x%02x mi_type=0x%02x M(%s)\n", DEBUGPC(DMM, "serv_type=0x%02x mi_type=0x%02x M(%s)\n",
req->cm_service_type, mi_type, mi_string); req->cm_service_type, mi_type, mi_string);
subscr = subscr_get_by_tmsi(mi_string); subscr = subscr_get_by_tmsi(bts->network, mi_string);
/* FIXME: if we don't know the TMSI, inquire abit IMSI and allocate new TMSI */ /* FIXME: if we don't know the TMSI, inquire abit IMSI and allocate new TMSI */
if (!subscr) if (!subscr)
@ -1478,6 +1482,7 @@ static int gsm48_rx_mm_serv_req(struct msgb *msg)
static int gsm48_rx_mm_imsi_detach_ind(struct msgb *msg) static int gsm48_rx_mm_imsi_detach_ind(struct msgb *msg)
{ {
struct gsm_bts *bts = msg->lchan->ts->trx->bts;
struct gsm48_hdr *gh = msgb_l3(msg); struct gsm48_hdr *gh = msgb_l3(msg);
struct gsm48_imsi_detach_ind *idi = struct gsm48_imsi_detach_ind *idi =
(struct gsm48_imsi_detach_ind *) gh->data; (struct gsm48_imsi_detach_ind *) gh->data;
@ -1491,10 +1496,10 @@ static int gsm48_rx_mm_imsi_detach_ind(struct msgb *msg)
switch (mi_type) { switch (mi_type) {
case GSM_MI_TYPE_TMSI: case GSM_MI_TYPE_TMSI:
subscr = subscr_get_by_tmsi(mi_string); subscr = subscr_get_by_tmsi(bts->network, mi_string);
break; break;
case GSM_MI_TYPE_IMSI: case GSM_MI_TYPE_IMSI:
subscr = subscr_get_by_imsi(mi_string); subscr = subscr_get_by_imsi(bts->network, mi_string);
break; break;
case GSM_MI_TYPE_IMEI: case GSM_MI_TYPE_IMEI:
case GSM_MI_TYPE_IMEISV: case GSM_MI_TYPE_IMEISV:
@ -1574,6 +1579,7 @@ static int gsm0408_rcv_mm(struct msgb *msg)
/* Receive a PAGING RESPONSE message from the MS */ /* Receive a PAGING RESPONSE message from the MS */
static int gsm48_rr_rx_pag_resp(struct msgb *msg) static int gsm48_rr_rx_pag_resp(struct msgb *msg)
{ {
struct gsm_bts *bts = msg->lchan->ts->trx->bts;
struct gsm48_hdr *gh = msgb_l3(msg); struct gsm48_hdr *gh = msgb_l3(msg);
u_int8_t *classmark2_lv = gh->data + 1; u_int8_t *classmark2_lv = gh->data + 1;
u_int8_t *mi_lv = gh->data + 2 + *classmark2_lv; u_int8_t *mi_lv = gh->data + 2 + *classmark2_lv;
@ -1588,10 +1594,10 @@ static int gsm48_rr_rx_pag_resp(struct msgb *msg)
mi_type, mi_string); mi_type, mi_string);
switch (mi_type) { switch (mi_type) {
case GSM_MI_TYPE_TMSI: case GSM_MI_TYPE_TMSI:
subscr = subscr_get_by_tmsi(mi_string); subscr = subscr_get_by_tmsi(bts->network, mi_string);
break; break;
case GSM_MI_TYPE_IMSI: case GSM_MI_TYPE_IMSI:
subscr = subscr_get_by_imsi(mi_string); subscr = subscr_get_by_imsi(bts->network, mi_string);
break; break;
} }
@ -3410,9 +3416,10 @@ int mncc_send(struct gsm_network *net, int msg_type, void *arg)
} }
/* New transaction due to setup, find subscriber */ /* New transaction due to setup, find subscriber */
if (data->called.number[0]) if (data->called.number[0])
subscr = subscr_get_by_extension(data->called.number); subscr = subscr_get_by_extension(net,
data->called.number);
else else
subscr = subscr_get_by_imsi(data->imsi); subscr = subscr_get_by_imsi(net, data->imsi);
/* If subscriber is not found */ /* If subscriber is not found */
if (!subscr) { if (!subscr) {
DEBUGP(DCC, "(bts - trx - ts - ti -- sub %s) " DEBUGP(DCC, "(bts - trx - ts - ti -- sub %s) "

View File

@ -182,6 +182,7 @@ static int gsm340_rx_sms_submit(struct msgb *msg, struct sms_submit *sms,
* return value > 0: RP CAUSE for ERROR; < 0: silent error; 0 = success */ * return value > 0: RP CAUSE for ERROR; < 0: silent error; 0 = success */
static int gsm340_rx_tpdu(struct msgb *msg) static int gsm340_rx_tpdu(struct msgb *msg)
{ {
struct gsm_bts *bts = msg->lchan->ts->trx->bts;
u_int8_t *smsp = msgb_sms(msg); u_int8_t *smsp = msgb_sms(msg);
struct sms_submit *sms; struct sms_submit *sms;
struct gsm_sms *gsms; struct gsm_sms *gsms;
@ -291,7 +292,7 @@ static int gsm340_rx_tpdu(struct msgb *msg)
gsms->validity_minutes = gsm340_validity_period(sms); gsms->validity_minutes = gsm340_validity_period(sms);
/* determine gsms->receiver based on dialled number */ /* determine gsms->receiver based on dialled number */
gsms->receiver = subscr_get_by_extension(sms->dest_addr); gsms->receiver = subscr_get_by_extension(bts->network, sms->dest_addr);
if (sms->user_data) if (sms->user_data)
memcpy(gsms->header, sms->user_data, sms->ud_len); memcpy(gsms->header, sms->user_data, sms->ud_len);

View File

@ -126,7 +126,8 @@ static void subscr_free(struct gsm_subscriber *subscr)
talloc_free(subscr); talloc_free(subscr);
} }
struct gsm_subscriber *subscr_get_by_tmsi(const char *tmsi) struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
const char *tmsi)
{ {
struct gsm_subscriber *subscr; struct gsm_subscriber *subscr;
@ -136,10 +137,11 @@ struct gsm_subscriber *subscr_get_by_tmsi(const char *tmsi)
return subscr_get(subscr); return subscr_get(subscr);
} }
return db_get_subscriber(GSM_SUBSCRIBER_TMSI, tmsi); return db_get_subscriber(net, GSM_SUBSCRIBER_TMSI, tmsi);
} }
struct gsm_subscriber *subscr_get_by_imsi(const char *imsi) struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
const char *imsi)
{ {
struct gsm_subscriber *subscr; struct gsm_subscriber *subscr;
@ -148,10 +150,11 @@ struct gsm_subscriber *subscr_get_by_imsi(const char *imsi)
return subscr_get(subscr); return subscr_get(subscr);
} }
return db_get_subscriber(GSM_SUBSCRIBER_IMSI, imsi); return db_get_subscriber(net, GSM_SUBSCRIBER_IMSI, imsi);
} }
struct gsm_subscriber *subscr_get_by_extension(const char *ext) struct gsm_subscriber *subscr_get_by_extension(struct gsm_network *net,
const char *ext)
{ {
struct gsm_subscriber *subscr; struct gsm_subscriber *subscr;
@ -160,7 +163,7 @@ struct gsm_subscriber *subscr_get_by_extension(const char *ext)
return subscr_get(subscr); return subscr_get(subscr);
} }
return db_get_subscriber(GSM_SUBSCRIBER_EXTENSION, ext); return db_get_subscriber(net, GSM_SUBSCRIBER_EXTENSION, ext);
} }
int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason) int subscr_update(struct gsm_subscriber *s, struct gsm_bts *bts, int reason)

View File

@ -589,7 +589,7 @@ DEFUN(cfg_subscr,
const char *imsi = argv[0]; const char *imsi = argv[0];
struct gsm_subscriber *subscr; struct gsm_subscriber *subscr;
subscr = subscr_get_by_imsi(imsi); subscr = subscr_get_by_imsi(gsmnet, imsi);
if (!subscr) { if (!subscr) {
vty_out(vty, "%% No subscriber for IMSI %s%s", vty_out(vty, "%% No subscriber for IMSI %s%s",
imsi, VTY_NEWLINE); imsi, VTY_NEWLINE);
@ -855,7 +855,7 @@ DEFUN(show_subscr,
if (argc >= 1) { if (argc >= 1) {
imsi = argv[0]; imsi = argv[0];
subscr = subscr_get_by_imsi(imsi); subscr = subscr_get_by_imsi(gsmnet, imsi);
if (!subscr) { if (!subscr) {
vty_out(vty, "%% unknown subscriber%s", vty_out(vty, "%% unknown subscriber%s",
VTY_NEWLINE); VTY_NEWLINE);