void subscr_get_channel(struct gsm_subscriber *subscr, int type, gsm_cbfn *cbfn, void *param) { struct subscr_request *request; request = talloc(tall_sub_req_ctx, struct subscr_request); if (!request) { if (cbfn) cbfn(GSM_HOOK_RR_PAGING, GSM_PAGING_OOM, NULL, NULL, param); return; } memset(request, 0, sizeof(*request)); request->subscr = subscr_get(subscr); request->channel_type = type; request->cbfn = cbfn; request->param = param; /* * FIXME: We might be able to assign more than one * channel, e.g. voice and SMS submit at the same * time. */ if (!subscr->in_callback && llist_empty(&subscr->requests)) { /* add to the list, send a request */ llist_add_tail(&request->entry, &subscr->requests); subscr_send_paging_request(subscr); } else { /* this will be picked up later, from subscr_put_channel */ llist_add_tail(&request->entry, &subscr->requests); } }
struct gsm_subscriber *subscr_active_by_imsi(struct gsm_network *net, const char *imsi) { struct gsm_subscriber *subscr; llist_for_each_entry(subscr, subscr_bsc_active_subscribers(), entry) { if (strcmp(subscr->imsi, imsi) == 0 && subscr->net == net) return subscr_get(subscr); } return NULL; }
struct gsm_subscriber *subscr_active_by_tmsi(struct gsm_network *net, uint32_t tmsi) { struct gsm_subscriber *subscr; llist_for_each_entry(subscr, subscr_bsc_active_subscribers(), entry) { if (subscr->tmsi == tmsi && subscr->net == net) return subscr_get(subscr); } return NULL; }
struct gsm_subscriber *subscr_active_by_imsi(struct gsm_subscriber_group *sgrp, const char *imsi) { struct gsm_subscriber *subscr; llist_for_each_entry(subscr, subscr_bsc_active_subscribers(), entry) { if (strcmp(subscr->imsi, imsi) == 0 && subscr->group == sgrp) return subscr_get(subscr); } return NULL; }
struct gsm_subscriber *subscr_active_by_tmsi(struct gsm_subscriber_group *sgrp, uint32_t tmsi) { struct gsm_subscriber *subscr; llist_for_each_entry(subscr, subscr_bsc_active_subscribers(), entry) { if (subscr->tmsi == tmsi && subscr->group == sgrp) return subscr_get(subscr); } return NULL; }
struct gsm_subscriber *subscr_get_or_create(struct gsm_subscriber_group *sgrp, const char *imsi) { struct gsm_subscriber *subscr; llist_for_each_entry(subscr, subscr_bsc_active_subscribers(), entry) { if (strcmp(subscr->imsi, imsi) == 0 && subscr->group == sgrp) return subscr_get(subscr); } subscr = subscr_alloc(); if (!subscr) return NULL; osmo_strlcpy(subscr->imsi, imsi, sizeof(subscr->imsi)); subscr->group = sgrp; return subscr; }
struct gsm_subscriber *subscr_get_or_create(struct gsm_network *net, const char *imsi) { struct gsm_subscriber *subscr; llist_for_each_entry(subscr, subscr_bsc_active_subscribers(), entry) { if (strcmp(subscr->imsi, imsi) == 0 && subscr->net == net) return subscr_get(subscr); } subscr = subscr_alloc(); if (!subscr) return NULL; strcpy(subscr->imsi, imsi); subscr->net = net; return subscr; }
/* * Create/Store a SMS and then try to load it. */ static void test_sms(void) { int rc; struct gsm_sms *sms; struct gsm_subscriber *subscr; subscr = db_get_subscriber(GSM_SUBSCRIBER_IMSI, "9993245423445"); OSMO_ASSERT(subscr); subscr->group = &dummy_sgrp; sms = sms_alloc(); sms->receiver = subscr_get(subscr); sms->src.ton = 0x23; sms->src.npi = 0x24; memcpy(sms->src.addr, "1234", strlen("1234") + 1); sms->dst.ton = 0x32; sms->dst.npi = 0x42; memcpy(sms->dst.addr, subscr->extension, sizeof(subscr->extension)); memcpy(sms->text, "Text123", strlen("Text123") + 1); memcpy(sms->user_data, "UserData123", strlen("UserData123") + 1); sms->user_data_len = strlen("UserData123"); /* random values */ sms->reply_path_req = 1; sms->status_rep_req = 2; sms->ud_hdr_ind = 3; sms->protocol_id = 4; sms->data_coding_scheme = 5; rc = db_sms_store(sms); sms_free(sms); OSMO_ASSERT(rc == 0); /* now query */ sms = db_sms_get_unsent_for_subscr(subscr); OSMO_ASSERT(sms); OSMO_ASSERT(sms->receiver == subscr); OSMO_ASSERT(sms->reply_path_req == 1); OSMO_ASSERT(sms->status_rep_req == 2); OSMO_ASSERT(sms->ud_hdr_ind == 3); OSMO_ASSERT(sms->protocol_id == 4); OSMO_ASSERT(sms->data_coding_scheme == 5); OSMO_ASSERT(sms->src.ton == 0x23); OSMO_ASSERT(sms->src.npi == 0x24); OSMO_ASSERT(sms->dst.ton == 0x32); OSMO_ASSERT(sms->dst.npi == 0x42); OSMO_ASSERT(strcmp((char *) sms->text, "Text123") == 0); OSMO_ASSERT(sms->user_data_len == strlen("UserData123")); OSMO_ASSERT(strcmp((char *) sms->user_data, "UserData123") == 0); /* Mark the SMS as delivered */ db_sms_mark_delivered(sms); sms_free(sms); sms = db_sms_get_unsent_for_subscr(subscr); OSMO_ASSERT(!sms); subscr_put(subscr); }